# givemeanode On-demand GPU nodes and asynchronous GPU jobs for AI agents, over MCP at https://mcp.givemeanode.com. A node is a container on an H100 with a persistent, encrypted disk, billed per minute; stop it and it parks: files intact, billing stopped. The next command wakes it. ## MCP quickstart https://mcp.givemeanode.com Streamable HTTP with OAuth 2.1; MCP clients discover auth automatically (RFC 9728); a human approves once. Example: claude mcp add --transport http givemeanode https://mcp.givemeanode.com The agent acts as the signed-in customer. Exec runs over MCP: if you can run commands at all, you use run_command; logs are the interface. Access is scoped. Authorizing the server is a consent checklist (OAuth scopes); the tool list a connection sees is exactly its grant, and every account operation lives in some scope; only the ceremonies (signup, card entry, ToS) need the browser. Each scope comes in two strengths: the bare word grants read AND write, a `:read` suffix grants only the read-only slice (write implies read). A token that names no scopes acts with the customer's full authority (infra + org). The scopes: - infra: your infrastructure. Nodes (lifecycle, exec, files) and batch jobs - org: your organization. Spend and billing, members, invites, roles, caps, referrals - operator: givemeanode staff only (fleet operations) Tools, by scope. infra (nodes): - list_nodes(): your nodes: name, gpu_type, state - get_node(name): status, rate, queue position; the poll target while a node is queued, provisioning, or waking - create_node(name?, gpu_type, image?, max_wait?): never blocks: returns "provisioning" (with the locked rate) or "queued" (with a live position; the scheduler provisions it the moment a slot frees, and the place lapses at the shape's expires_at; a re-call with max_wait extends it forward-only — a shorter re-ask never cuts a hold — ceiling 1h; after a lapse, re-call create_node with the same name to re-queue) - stop_node(name): stop paying now; the disk parks with files intact, and the next run_command wakes it - delete_node(name): destroy the disk (crypto-erase, irreversible); stopped/queued/lost nodes only; stop_node first - run_command(node, command, env?, timeout?, detach?): run a shell command in the node's container; sync returns {exit_code, stdout, stderr, truncated}; detach:true returns {command_id, log_path} immediately for long-running work; secrets go in env, never the command string (command lines are recorded) - get_command(node, command_id, offset?): status + incremental output of a detached command; never wakes a stopped node - list_commands(node): a node's detached commands, newest first - kill_command(node, command_id): TERM the command's process group, KILL after 10s; idempotent - write_file(node, path, content, encoding?, executable?): write a small file onto a node (configs, entry scripts) without a command line; not for secrets (run_command's env) or datasets (pull from inside the node) - export_file(node, path): export a file or directory to a download URL; the way to get results out infra (asynchronous jobs): - submit_job(gpu_model, idempotency_key, ...): an asynchronous GPU job: builds your image, queues fairly, runs your command, bills only the running attempt - submit_jobs(shared, variants, label, idempotency_key): a sweep — up to 256 variants of one job in one call; vary env/command for one build + N runs; all-or-nothing validation - get_job(job_id, stream?, offset?, tail?): job status + build/run logs; the poll target after submit_job - list_jobs(limit?, label?, summary?): your jobs, newest first; label filters one sweep, summary:true is the rollup with every terminal job's declared result - cancel_job(job_id): immediate; a queued or building job stops for free - create_context(sha256, size_bytes) / finalize_context(context_id): presigned upload for a build context over the 4 MiB inline limit, then submit_job with context_id org (money, read-only; with list_team and list_referrals, this is the org:read slice): - get_usage(month?): spend per node in USD ("YYYY-MM", default current) - get_billing(org?): dunning state, MTD spend, caps; admin/billing roles also see payment status, credits, and per-member spend org (administration; role-gated exactly like /team): - list_team(org?): memberships (with the ACTIVE org), roster, live invites, org nodes; looking also accepts invites addressed to you - invite_member(email, role?, org?) / revoke_invite(invite_id, org?) - set_member_role(member, role, org?) / set_workspace_cap(workspace, cap_usd?, org?) - remove_member(member, org?) - switch_active_org(org): where your next node bills - stop_org_node(node_id, org?): the runaway-student-node stop - list_referrals(org?) / claim_referral_code(code, org?) operator (givemeanode staff: a verified @sfcompute.com login, or a gmn_ admin token): the `givemeanode admin` surface as tools. Status, workers, nodes, jobs, builds, market, pins, doctor, audit search; mutations only when the server has writes enabled AND the identity is write-scoped. ## Pricing Per-minute rates. A node bills while running or idling in its grace window; stopped nodes cost nothing. The current effective rate (with any active discount) rides every create_node/get_node response as `rate`: the price in the response is the price you pay. Billing portal: https://givemeanode.com/billing. ## From inside a node (metadata service) Code running ON a node can introspect and stop itself with no credential: identity is placement. Fixed address http://169.254.42.1 (also `metadata.givemeanode.internal`); every request needs the header `Metadata-Flavor: givemeanode`: curl -s -H 'Metadata-Flavor: givemeanode' http://169.254.42.1/v1/node curl -s -H 'Metadata-Flavor: givemeanode' http://169.254.42.1/v1/events curl -s -X POST -H 'Metadata-Flavor: givemeanode' http://169.254.42.1/v1/stop /v1/node is the identity + money clause (name, gpu_type, state, rate, grace window, session minimum); /v1/events carries structured notices with deadlines (machine retirement, spend-cap warnings and stop countdowns); a checkpoint-aware training script polls it like cloud spot metadata. POST /v1/stop ends the node from inside with stop_node semantics: files park intact, billing stops at the stop, the grace tail is skipped; a training run's last line can be that curl. ## Status Service status and incident history: https://status.givemeanode.com Report abuse: abuse@givemeanode.com