Every change Wellknown observed on this agent, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "order_vps" and "pay_invoice"
⟨259 unchanged words⟩ unpaid `invoice` is returned. Call `pay_invoice` with `invoice.id`:toitgetpays from the balance if the balance now covers it, otherwise it returns a crypto`checkout_url`,`checkout_url`.OROr `topup_balance` and thenre-order.`pay_invoice` (or re-order). Several servers in one order: `quantity` 2–50 ⟨252 unchanged words⟩
Initiate payment forPay an owned, unpaid invoice.ReturnsSPENDSaMONEYPayRam—`checkout_url`;confirm with the human first. If the prepaid balance covers the whole invoice,settlesit is paid from the balance right away (`paid_from_balance: true`, `status: paid`, new `balance`; ordered servers are then created automatically — poll list_vps). Otherwise nothing is charged andtheaVPSPayRamprovisionscrypto `checkout_url` is returned (`paid_from_balance: false`
Added "reveal_password"; changed the definition of "accept_delegation", "cancel_service", "change_plan" and 43 more (46 tools before, 47 now)
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"token":{"description":"Required. Invitation token from the accept link in the invitation email — the long random string after `token=` in the URL, e.g. \"9f3c…e1a7\".","minLength":1,"type":"string"}}," ⟨4 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Accept delegated access"}Changed the definition of "change_plan", "get_order_limits", "get_upgrade_options" and 1 more
⟨65 unchanged words⟩ price. Same function as the cabinet's Upgrade panel. If the server's host has no free room (or no free IPv4 for NAT → IP) right now, the response is 202 with `queued: true`: the difference is charged now and the upgrade is applied automatically from the queue, usually within 24 hours — the server reboots once at that moment and keeps running on the current plan until then; a second change_plan meanwhile returns 409 `upgrade_queued`. The response shows charged, unused_credit (unused time of the old plan, counted) and new_cost. Set `confirm: true`. Requires: token + balance for the prorated difference + confirm: true. No room on the server's host → 202 queued (paid, applied automatically, usually within 24 hours). Typical errors: 402 (top up), 409 upgrade_queued (one upgrade is already paid and waiting), 422 not an upgrade (pick from get_upgrade_options).
Added "get_order_limits"; changed the definition of "order_vps" (45 tools before, 46 now)
⟨188 unchanged words⟩ get a crypto `checkout_url`, OR `topup_balance` then re-order. Several servers in one order: `quantity` 2–10 → one invoice, N separate services (each with its own renewal), names <hostname>-1…<hostname>-N, created one after another after payment (`service_ids` in the response). The maximum depends on free capacity in the location (and free IPv4 for IP plans); an account without any payment yet can order up to 3 per order — call `get_order_limits` first; a too-large `quantity` fails with 409 `quantity_unavailable` and `max_quantity` (nothing is charged). An unpaid multi-server order keeps its invoice and capacity reservation for 24 hours, and an account can have only one: a second one fails with 409 `unpaid_group_exists` and the existing `invoice_id`. Promo codes apply to single-server orders only. Optional `addons`: "backups" (Managed Backups, monthly plans only — annual plans include them) and "extra_ipv4" (a second public IPv4, dedicated-IP plans only); the first month of each add-on is added to the invoice, see `get_order_limits` for availability and price. Send the same `idempotency_key` when you retry the same order — a repeated call returns the existing order instead of creating a second one. PROMO until 2026-10-31 23:59 Europe/Kyiv: -25% on ⟨44 unchanged words⟩ ). Typical errors: 409 location_unavailable (see `available`), 409 quantity_unavailable (see `max_quantity`), 409 unpaid_group_exists (pay that `invoice_id` first
Changed the definition of "create_sandbox"
⟨280 unchanged words⟩ first sandbox gets a free $1 trial creditautomaticallyonce the account email is confirmed with a 6-digit code — 402 with trial=email_unverified until then: the human confirms it in the dashboard, or POST /auth/email/verification/send, then /confirm {code}; no top-up needed; until the first real top-up ⟨42 unchanged words⟩
Changed the definition of "create_sandbox"
⟨301 unchanged words⟩ , ephemeral, up to 2 at once,1eachhdeletedeachafter 20 min (the $1 credit itself lasts 14 days) → 403 trial_tariff / trial_persistent, 429 trial_limit) ⟨14 unchanged words⟩
Changed the definition of "create_sandbox"
⟨269 unchanged words⟩ Always kill_sandbox when done. Requires: token +balance.balance (a new account's first sandbox gets a free $1 trial credit automatically — no top-up needed; until the first real top-up: micro or small, ephemeral, up to 2 at once, 1 h each → 403 trial_tariff / trial_persistent, 429 trial_limit). Typical errors: 402 insufficient_balance → topup_balance; 503 ⟨6 unchanged words⟩
Changed the definition of "create_sandbox", "exec_command" and "run_code"
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"env":{"additionalProperties":{"maxLength":32768,"type":"string"},"description":"Environment variables for every command and code run in this sandbox, e.g. {\"OPENAI_API_KEY\": \"sk-...\"}. Stored encrypted; responses show only the names (env_keys). Up to 64 variables, 64 KB in total.","propertyNames":{"pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$"},"type":"object"},"idle_timeout":{"description":"Seconds of inactivity before ⟨73 unchanged words⟩
⟨14 unchanged words⟩ ,"cwd":{"type":"string"},"env":{"additionalProperties":{"maxLength":32768,"type":"string"},"description":"Environment variables for this command only (override the ones set at create_sandbox).","propertyNames":{"pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$"},"type":"object"},"
Changed the definition of "sandbox_pricing"
⟨85 unchanged words⟩ bash, git, curl). No authentication needed. Writing code instead of calling MCP? Official SDKs on the same REST API and token: Python `pip install eqvps`, TypeScript/JavaScript `npm i @eqvps/sdk` (docs: https://eqvps.com/en/docs/sandboxes). Requires: nothing.
Added "change_plan", "get_download_url", "get_started" and 4 more; changed the definition of "accept_delegation", "cancel_service", "close_ticket" and 35 more (38 tools before, 45 now)
⟨29 unchanged words⟩ new token is returned — keep using yours. Requires: token of the invited email.
⟨75 unchanged words⟩ account balance (see `refund_amount` in the response). Already scheduled end_of_period? Call `undo_cancel` to keep the server, or call cancel_service again with type=immediate + confirm to switch to immediate destruction (refund as above). get_vps_status shows `cancellation` {type, cancel_at, can_undo}. Requires: token + reason; immediate also needs confirm=hostname. Typical: 409 cancellation_already_scheduled → undo_cancel, or repeat with type=immediate.
Added "get_task" and "kill_task"; changed the definition of "create_sandbox", "exec_command", "get_vps_status" and 4 more (36 tools before, 38 now)
⟨6 unchanged words⟩ (ready in about 1 s; Linux withpython3.12Pythonand3.12 + pip, Node.js 22 + npm, bash, git and curl; internet egress allowed,so pip/npm install and git clone work; no inbound ports, SMTP blocked). `mode`: ⟨40 unchanged words⟩ host maintenance; max `ttl` 30 days). `tariff` (vCPU / RAM / disk, $/hour): micro|0.25/512 MB/3 GB $0.0165 · small (default)|0.5/1
Added "create_sandbox", "download_file", "exec_command" and 6 more (27 tools before, 36 now)
Create a code sandbox — Start an isolated Firecracker microVM sandbox (ready in about 1 s; Linux with python3.12 and bash, internet egress allowed, no inbound ports, SMTP blocked). `mode`: "ephemeral" (default — billed per second, minimum 60 s, auto-deleted after `idle_timeout` s of inactivity, default 300, max lifetime `ttl` up to 24 h) or "persistent" (billed per started hour, a month costs at most 730 h minus 25%; survives host maintenance; max `ttl` 30 days). `tariff`: micro | small (default) | std — see sandbox_pricing. Charged from the same prepaid balance as VPS (no subscription). Empty balance → 402 insuffic…
Download a file from a sandbox — Read a file from the sandbox (absolute `path`, max 5 MB). Returns `content` as UTF-8 text by default; set `as_text: false` to get `content_base64` for binary files.
Execute a shell command in a sandbox — Execute a shell command (bash -lc) in a sandbox as root and return {exit_code, stdout, stderr, timed_out, truncated, duration_ms}. Optional `cwd` (default /root) and `timeout` (default 30 s, max 55 per call; run long jobs in the background with nohup … & and poll).
Changed the definition of "set_hostname"
Set the VPS hostname (valid DNSlabel;name).appliedAppliedonimmediatelynextinsidereboot/rebuildthe running server via the guest agent (Linux: hostnamectl + the 127.0.1.1 line in /etc/hosts; Windows: renamed, takes effect after a reboot — the response then has `reboot_required: true`). The server must be running with its guest agent active; otherwise the call fails with 409 `agent_unavailable` and nothing is changed. Your password, SSH host keys and files are not touched.
Changed the definition of "order_vps"
⟨27 unchanged words⟩ so you get key-based root login). Optional `location`: "de" (Germany) or "fi" (Finland) — omit it and we pick the location automatically; if the chosen country has no free capacity for that plan the call fails with 409 `location_unavailable` (nothing is charged) and `available` lists the countries that can take it. Optional `period` ("month" by default, or "year ⟨151 unchanged words⟩
⟨6 unchanged words⟩ {"hostname":{"type":"string"},"location":{"description":"Optional server country: \"de\" (Germany) or \"fi\" (Finland). Omit for automatic placement.","enum":["de","fi"],"type":"string"},"os_id":{"exclusiveMinimum":0,"type":"integer ⟨24 unchanged words⟩
Changed the definition of "list_plans" and "order_vps"
⟨56 unchanged words⟩ a `product` slug and an `os_id` for `order_vps`. Each plan lists `plans[]` (monthly and annual `plan_id`); an active automatic offer shows up as `plans[].promo` and in `meta.promotions`. PROMO until 2026-10-31 23:59 Europe/Kyiv: -25% on ANNUAL billing, first year only, applied automatically (no code) to windows-medium ($171/yr), windows-small-ip ($252/yr) and windows-medium-ip ($324/yr); renewal at the regular annual price; windows-small not included — order with period="year".
⟨26 unchanged words⟩ recommended so you get key-based root login). Optional `period` ("month" by default, or "year" for annual billing) or an explicit `plan_id` from list_plans `plans[]`; an active automatic offer (`plans[].promo`) is applied to the first invoice and the response then carries `promo`.
Certificate changed, valid to 2026-12-21
Changed the definition of "list_plans" and "order_vps"
⟨8 unchanged words⟩ specs and the OS images each plan canboot.boot: Linux plans (NAT or dedicated IPv4, from $3/mo) and Windows Server 2022 plans (slug windows-*, BYOL — the customer activates their own licence; RDP access, 150 Mbit/s port, from $11/mo). No authentication needed. Use this first to pick ⟨8 unchanged words⟩
⟨26 unchanged words⟩ recommended so you get key-based root login). Windows plans (windows-*) accept only the Windows Server 2022 image, ignore `ssh_key`, and are reached over RDP as Administrator (see get_vps_status → access); the licence is BYOL. Branching on the response: • `paid_from_balance: true`
Changed the definition of "get_vps_status"
⟨6 unchanged words⟩ status, specs, live VM state/uptime, andSSHaccess info (host, port, ready-to-paste`command``command`; `access.method` = ssh for Linux, rdp for Windows — port follows the plan: dedicated IP 22/3389, NAT 20000+vmid). ROOT PASSWORD (keyless VPS): call ⟨193 unchanged words⟩
Changed the definition of "accept_delegation", "cancel_service", "create_ticket" and 7 more
Accept a delegation invitation using the `token` from the invite link.Creates/linksRequiresyourbeingaccountsignedandin as the invited email address: it grants operatoraccess.accessReturnstoayourbearerown account. No new
Certificate recorded, valid to 2026-10-23
Authorization not required
First tool surface recorded: 27 tools (server version 1.0.1)
Showing the latest 22 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":false,"readOnlyHint" ⟨5 unchanged words⟩
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"confirm":{"description":"Optional. Needed only with type \"immediate\": the server's exact hostname (from get_vps_status). Ask the human first.","type":"string"},"reason":{"description":"REQUIRED:Required.whyWhy this VPS is being cancelled (e.g. project ⟨12 unchanged words⟩ :"string"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨10 unchanged words⟩ 1,"type":"string"},"type":{"description":"Optional. \"end_of_period\" (default: runs until the paid period ends, undoable) or \"immediate\" (destroys the server and all data now).","enum":["end_of_period","immediate"],"type ⟨5 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Cancel a VPS"}⟨5 unchanged words⟩ ,"properties":{"confirm":{"description":"Required. Must be true — you agree to the ⟨5 unchanged words⟩ :"boolean"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨12 unchanged words⟩ :"string"},"target_plan":{"description":"product_idRequired. Target plan `product_id` from get_upgrade_options `options[]`, integer, e.g. 11.","exclusiveMinimum":0,"type":"integer"} ⟨5 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Change VPS plan (resize / convert)"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"comment":{"description":"Optional. Comment for the rating, up to 2000 characters. Default: none.","type":"string"},"rating":{"description":"Optional. Support rating, integer 1–5 (5 = excellent). Default: no rating.","maximum":5,"minimum":1,"type":"integer"},"ticket_code":{"description":"Required. Ticket code from create_ticket / list_tickets, e.g. \"K7Q2M9X\".","minLength":1,"type":"string"}}, ⟨4 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Close a support ticket"}⟨9 unchanged words⟩ 32768,"type":"string"},"description":"Optional. Environment variables for every command and code run ⟨35 unchanged words⟩ :"object"},"idle_timeout":{"description":"Optional. Seconds of inactivity before an ephemeral sandbox is ⟨14 unchanged words⟩ ,"type":"integer"},"mode":{"description":"Optional. \"ephemeral\" (default: billed per second, minimum 60 s, auto-deleted when idle) or \"persistent\" (billed per started hour, kept up to 30 days).","enum":["ephemeral","persistent"],"type":"string"},"tariff":{"description":"Optional. Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing). Default \"small\"; e.g. \"plus\" for heavy pip installs.","enum":["micro","small","standard ⟨4 unchanged words⟩ :"string"},"ttl":{"description":"Optional. Maximum lifetime in seconds (ephemeral up to 86400 ⟨11 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create a code sandbox"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"message":{"description":"Required. Problem description, up to 5000 characters: what you did, what you expected, what happened.","minLength":1,"type":"string"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨10 unchanged words⟩ 1,"type":"string"},"subject":{"description":"Required. Short ticket subject, up to 255 characters, e.g. \"SSH refused after reboot\".","minLength":1,"type":"string"}}, ⟨5 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Open a support ticket"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"email":{"description":"Required. Email of the person who gets operator access, e.g. \"admin@partner.org\". They receive an invitation link.","format":"email","type":"string"},"expires_days":{"description":"Optional. Access lifetime in days, integer 1–365. Default: no expiry (until revoked).","exclusiveMinimum":0,"maximum":365,"type":"integer"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨17 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delegate service access"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"as_text":{"description":"Optional. True (default) = return `content` as UTF-8 text; false = return `content_base64` (for binary files).","type":"boolean"},"path":{"description":"Required. Absolute path inside the sandbox to read (max 5 MB), e.g. \"/root/app/main.py\". Must start with \"/\".","pattern":"^\\/","type":"string"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨16 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Download a file from a sandbox"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"background":{"description":"Optional. True = run as a background task and return `task_id` at once (poll get_task). Default false (wait up to `timeout`, max 55 s).","type":"boolean"},"command":{"description":"Required. Shell command run as root via bash -lc; operators like &&, | and > are allowed, e.g. \"pip install requests && python app.py\".","minLength":1,"type":"string"},"cwd":{"description":"Optional. Working directory, absolute path, e.g. \"/root/app\". Default \"/root\".","type":"string"},"env":{"additionalProperties":{"maxLength":32768,"type":"string"},"description":"Optional. Environment variables for this command only (override the ones set at create_sandbox). Example: {\"DEBUG\": \"1\"}.","propertyNames":{"pattern":"^[A-Za-z_][ ⟨5 unchanged words⟩ :"object"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨10 unchanged words⟩ :"string"},"timeout":{"description":"Optional. Seconds. Synchronous: max 55. With background: true: ⟨17 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Execute a shell command in a sandbox"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Get prepaid balance"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"path":{"description":"Required. Absolute path inside the sandbox of the file to download, e.g. \"/root/app/main.py\". Must start with \"/\".","pattern":"^\\/","type":"string"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨9 unchanged words⟩ ","type":"string"},"ttl":{"description":"Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min).","maximum":3600,"minimum":60,"type": ⟨6 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Download link for a sandbox file"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"addons":{"description":"Optional. Add-ons to price: array of \"backups\" and/or \"extra_ipv4\", e.g. [\"backups\"]. Default: none.","items":{"enum":["backups","extra_ipv4" ⟨4 unchanged words⟩ ,"type":"array"},"location":{"description":"Optional. Server country to check: \"de\" (Germany) or \"fi\" (Finland). Default: automatic placement.","enum":["de","fi"],"type":"string"},"months":{"description":"Optional. Billing term in months, integer 1–36 (default 1); 12 = the annual plan. Takes precedence over period/plan_id.","maximum":36,"minimum":1,"type":"integer"},"period":{"description":"Optional. Billing period to price: \"month\" (default) or \"year\". Ignored when `months` or `plan_id` is given.","enum":["month","year"],"type":"string"},"plan_id":{"description":"Optional. Billing plan id from list_plans `plans[].plan_id`, integer, e.g. 24. Ignored when `months` is given.","exclusiveMinimum":0,"type":"integer"},"product":{"description":"Required. Plan slug from list_plans, e.g. \"nano-ip\".","minLength":1,"type":"string"}}, ⟨4 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Order limits & add-ons"}⟨5 unchanged words⟩ ,"properties":{"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨15 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Sandbox status & cost"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Start here — full guide"}⟨5 unchanged words⟩ ,"properties":{"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨9 unchanged words⟩ ,"type":"string"},"stderr_offset":{"description":"Optional. Byte offset in stderr to read from, integer ≥ 0 (default 0); pass `stderr_next_offset` from the previous response.","minimum":0,"type":"integer"},"stdout_offset":{"description":"Optional. Byte offset in stdout to read from, integer ≥ 0 (default 0); pass `stdout_next_offset` from the previous response.","minimum":0,"type":"integer"},"task_id":{"description":"Required. Task id returned by run_code / exec_command with ⟨14 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Poll a background task"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"ticket_code":{"description":"Required. Ticket code from create_ticket / list_tickets (field `id`/`code`), e.g. \"K7Q2M9X\".","minLength":1,"type":"string"}}," ⟨4 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Read a support ticket"}⟨5 unchanged words⟩ ,"properties":{"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨15 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Plan change options"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"max_bytes":{"description":"Optional. Maximum size of the uploaded file in bytes, integer 1–2147483648 (2 GB). Default: the server limit (2 GB).","maximum":2147483648,"minimum":1,"type":"integer"},"path":{"description":"Required. Absolute path inside the sandbox to write the uploaded file to (overwritten at offset 0), e.g. \"/root/app/main.py\". Must start with \"/\".","pattern":"^\\/","type":"string"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨9 unchanged words⟩ ","type":"string"},"ttl":{"description":"Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min).","maximum":3600,"minimum":60,"type": ⟨6 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Upload link into a sandbox"}⟨5 unchanged words⟩ ,"properties":{"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨10 unchanged words⟩ 1,"type":"string"},"timeframe":{"description":"Optional. Time window: \"hour\" (default), \"day\", \"week\" or \"month\".","enum":["hour","day","week" ⟨5 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Get VPS metrics"}⟨30 unchanged words⟩ plan: dedicated IP 22/3389, NAT 20000+vmid).ROOT PASSWORD (keyless VPS): callREAD-ONLYwithsince`reveal1.9.1:true` to retrieve it. It is shown ONCE, and only after the VM has finished booting — at that moment the password isitappliednevertorevealstheorlivechangesVManything, so it isguaranteedsafe towork. While the VM is still bootingpoll.theROOTresponsePASSWORDcarries(keyless`password_pendingVPS):true` and NO password; just call again with `reveal`password_available: true`in ~30-60s (the one-time reveal is NOT spent untilmeans a password isactually returnedwaiting —noreadresetitorONCErebootwithneeded).`reveal_password`Without(the`reveal`,old`password_available`reveal: true`meansargumentaispasswordstillisacceptedwaitingbuttoonlybepointsrevealed.you there). If you supplied an SSH key at order ⟨73 unchanged words⟩ ONLY if the password is lost. Poll this(without `reveal`)after `order_vps` to watch provisioning reach `active`. NAT ⟨72 unchanged words⟩
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"reveal":{"description":"Optional. Ignored since MCP 1.9.1 (kept so existing calls still validate): get_vps_status never reveals the password — call reveal_password. Default false.","type":"boolean"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨15 unchanged words⟩
before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Get VPS status & access"}⟨5 unchanged words⟩ ,"properties":{"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨15 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Delete a sandbox"}⟨5 unchanged words⟩ ,"properties":{"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨10 unchanged words⟩ :"string"},"task_id":{"description":"Required. Task id returned by run_code / exec_command with ⟨14 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Stop a background task"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List services delegated to me"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List delegations I granted"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List VPS plans"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List my sandboxes"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List support tickets"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"List my VPS"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"email":{"description":"Required. Email of an existing account, e.g. \"ops@yourcompany.com\".","format":"email","type":"string"},"password":{"description":"Required. Account password set earlier with set_password (accounts from register_account have none by default).","minLength":1,"type":"string"},"token_ttl_days":{"description":"Optional. Token lifetime in days (default 365).", ⟨11 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Log in"}⟨5 unchanged words⟩ ,"properties":{"addons":{"description":"OptionalOptional.add-onsAdd-ons created automatically with each server: \"backups\" ⟨11 unchanged words⟩ ,"type":"array"},"hostname":{"description":"Optional. Server hostname, a valid DNS name up to 128 characters (letters, digits, dots, hyphens), e.g. \"web-1\". Default: generated.","type":"string"},"idempotency_key":{"description":"OptionalOptional. Retry key(of 1–64 letters, digits,-\"-\"andor_)\"_\", e.g. \"web1-2026-10-20\".RepeatSenditthe same key when retrying the same orderso—nothesecondexisting order iscreated.returned instead of creating a second one. Default: none.","pattern":"^[A-Za-z0-9_-]{1,64}$","type":"string"},"location":{"description":"OptionalOptional.serverServer country: \"de\" (Germany) or \ ⟨11 unchanged words⟩ :"string"},"months":{"description":"Optional. Billing term in months, 1–36 (default 1) ⟨28 unchanged words⟩ ,"type":"integer"},"os_id":{"description":"Required. OS image id from the chosen plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04).","exclusiveMinimum":0,"type":"integer"},"period":{"description":"Optional. Billing period: \"month\" (default) or \"year\" (annual plan). Ignored when `months` or `plan_id` is given.","enum":["month","year"],"type":"string"},"plan_id":{"description":"Optional. Explicit billing plan id from list_plans `plans[].plan_id`, integer, e.g. 12. Ignored when `months` is given.","exclusiveMinimum":0,"type":"integer"},"product":{"description":"Required. Plan slug from list_plans, e.g. \"nano-ip\", \"small\" or \"windows-medium-ip\".","minLength":1,"type":"string"},"quantity":{"description":"Optional. How many identical servers to order in one ⟨20 unchanged words⟩ 1,"type":"integer"},"ssh_key":{"description":"Optional. OpenSSH public key for root login, one line, e.g. \"ssh-ed25519 AAAAC3Nza… you@laptop\". Strongly recommended for Linux; ignored on Windows plans. Default: none (a root password is generated).","type":"string"}},"required":[" ⟨4 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Order a VPS"}⟨5 unchanged words⟩ ,"properties":{"invoice_id":{"description":"Optional. Invoice id exactly as returned by order_vps / ⟨17 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Pay an invoice"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"action":{"description":"Required. Power action: \"start\", \"stop\" or \"reboot\". stop/reboot interrupt everything running on the server.","enum":["start","stop","reboot"],"type":"string"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨17 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Power control"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"expires_in_days":{"description":"Optional. Lifetime of the NEW token in days, integer 1–1825 (default 365).","maximum":1825,"minimum":1,"type":" ⟨3 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Refresh the API token"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"email":{"description":"Required. Real email address you control (login, recovery and service emails), e.g. \"ops@yourcompany.com\". Reserved/test domains such as example.com are rejected in practice.","format":"email","type":"string"},"first_name":{"description":"Required. Account holder's first name, 1+ characters, e.g. \"Alex\".","minLength":1,"type":"string"},"last_name":{"description":"Required. Account holder's last name, 1+ characters, e.g. \"Smith\".","minLength":1,"type":"string"},"token_ttl_days":{"description":"Optional. Token lifetime in days (default 365).", ⟨12 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Register a new account"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"confirm":{"description":"Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal \"DELETE\". ALL data is erased — ask the human first.","type":"string"},"os_id":{"description":"Required. OS image id from this plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04).","exclusiveMinimum":0,"type":"integer"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨18 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Reinstall OS"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"message":{"description":"Required. Reply text, up to 5000 characters.","minLength":1,"type":"string"},"ticket_code":{"description":"Required. Ticket code from create_ticket / list_tickets, e.g. \"K7Q2M9X\".","minLength":1,"type":"string"}}, ⟨5 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Reply to a support ticket"}⟨65 unchanged words⟩ new VM needs ~60s to boot; poll get_vps_statuswith,reveal:truetheninsteadreveal_password). New password is NOT in this response — read it ONCE viaget_vps_status (reveal:true);reveal_password; also emailed. Requires: token + confirm (hostname ⟨9 unchanged words⟩
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"confirm":{"description":"Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal \"DELETE\". Ask the human first.","type":"string"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨17 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Reset root password"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"delegation_id":{"description":"Required. Delegation id from list_delegations or list_delegated_to_me, integer, e.g. 31.","exclusiveMinimum":0,"type":"integer"}}," ⟨4 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Revoke a delegation"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"background":{"description":"Optional. True = run as a background task and return `task_id` at once (poll get_task). Default false (wait up to `timeout`, max 55 s).","type":"boolean"},"code":{"description":"Required. Source code to run, passed to the interpreter on stdin, e.g. \"print(2+2)\".","minLength":1,"type":"string"},"env ⟨2 unchanged words⟩ 32768,"type":"string"},"description":"Optional. Environment variables for this run only (override the ones set at create_sandbox). Example: {\"DEBUG\": \"1\"}.","propertyNames":{"pattern":"^[A-Za-z_][ ⟨4 unchanged words⟩ ,"type":"object"},"language":{"description":"Required. Interpreter: \"python\" (Python 3.12), \"node\" (Node.js 22) or \"bash\".","enum":["python","node","bash"],"type":"string"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨10 unchanged words⟩ :"string"},"timeout":{"description":"Optional. Seconds. Synchronous: max 55. With background: true: ⟨18 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Run code in a sandbox"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Sandbox pricing & limits"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"hostname":{"description":"Required. New hostname, a valid DNS name up to 128 characters (letters, digits, dots, hyphens; no leading/trailing dot or hyphen), e.g. \"db-2.example.org\".","minLength":1,"type":"string"},"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨17 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Set hostname"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"password":{"description":"Required. New account password: at least 8 characters with letters and numbers, e.g. \"Rainy-Harbor-2026\".","minLength":8,"type":"string"}}," ⟨4 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Set account password"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"amount":{"description":"Required. Top-up amount in USD (account currency), number 3–10000, e.g. 25. The checkout shows the crypto amount.","exclusiveMinimum":0,"type":"number"}}," ⟨4 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Top up balance"}⟨5 unchanged words⟩ ,"properties":{"service_id":{"description":"Optional. Service code as returned by list_vps/order_vps, e.g. \ ⟨15 unchanged words⟩
before
—after
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Undo a scheduled cancellation"}⟨3 unchanged words⟩ additionalProperties":false,"properties":{"content":{"description":"Optional. File content as UTF-8 text. Give either `content` or `content_base64` (default: empty file).","type":"string"},"content_base64":{"description":"Optional. File content as base64 for binary files, up to 5 MB decoded. Use instead of `content`.","type":"string"},"mode":{"description":"Optional. File permissions in octal, 3–4 digits, e.g. \"644\" or \"755\". Default: the sandbox default.","pattern":"^[0-7]{3,4}$","type":"string"},"path":{"description":"Required. Absolute path inside the sandbox to write; parent directories are created, e.g. \"/root/app/main.py\". Must start with \"/\".","pattern":"^\\/","type":"string"},"sandbox_id":{"description":"Required. Sandbox id as returned by create_sandbox / list_sandboxes, ⟨16 unchanged words⟩
before
—after
{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Upload a file into a sandbox"}before
—after
{"openWorldHint":false,"readOnlyHint":true,"title":"Current account"}Reveal root password (once) — Read the root (Windows: Administrator) password of a keyless VPS — shown ONCE. It is returned only after the VM has finished booting: at that moment the password is applied to the live VM, so it is guaranteed to work. While the VM is still booting the response carries `password_pending: true` and NO password — call again in ~30-60 s (the one-time reveal is NOT spent until a password is actually returned; no reset or reboot needed). After it has been shown once, later calls return no password: save it right away. Lost it? `reset_password` (needs confirm = hostname), then reveal_password again …
Before order_vps:howthemanyper-orderserversmaximumof(`max_quantity` = 50, aplantypocanguard;be`limit_reason`orderedmax_per_order)inandonewhichorderadd-onsrightanowplan has with their monthly price (`max_quantity``addons.backups`,`limit_reason`:`addons.extra_ipv4`).max_per_orderOrders|arenew_accountnever|refused for capacity|—capacity_or_ipv4)serversandwithoutwhichfreeadd-onsroom areavailablequeued forit withcreationtheir(usuallymonthlywithinprice24(`addons.backups`hours,`addons.extra_ipv4`see `queue_note`). Pass the same `product` and `months` (or `period`/`plan_id`) you will order;includethe`addons:response["extra_ipv4"]`carriesto`months`,see`term_price` (plan price for themaximumterm,withoneaserver,secondbeforeIPv4add-onsperandserver.anWorksautomaticwithoutoffer)aandtoken`terms` (then1–36themonths,limitquickispicksthe1/3/6/12).oneWorksforwithout anew account).token. Requires: nothing (with a token the limit ⟨13 unchanged words⟩
⟨20 unchanged words⟩ ,"fi"],"type":"string"},"months":{"maximum":36,"minimum":1,"type":"integer"},"period":{"enum":["month","year" ⟨16 unchanged words⟩
⟨78 unchanged words⟩ be reduced). The server must be active. Options come grouped by `line` (same = a bigger plan on the same network, to_ip, to_nat). Every option can be ordered; `capacity_now: false` (with `wait_reason` capacity | no_ip) means the server's host has no free room or IPv4 for it right now — change_plan then charges as usual and the upgrade is applied automatically from the queue, usually within 24 hours (the server is never moved to another host). `pending_upgrade` is set (and `options` empty) when an upgrade is already paid and waiting. `unused_credit` is the value of the unused time on the current plan, `new_cost` the new plan for the same time; prorated_topup = new_cost − unused_credit, which is what change_plan charges. Requires: token, server active.
⟨41 unchanged words⟩ — omit it and we pick the locationautomatically;automatically. Orders are never refused for capacity: if the chosen country has no freecapacityroomfororthatIPv4planright now, thecallpaidfailsserverwithwaits409in`location_unavailable`the creation queue in that same country (nothing`get_vps_status`isshowscharged`queued: true`) and`available`islistscreated automatically, usually within 24 hours; thecountriescustomerthatgetscanthetakeusualit.access email. Optional `months` (1–36): the billing term paid upfront — the invoice is the monthly price × months, payment moves the paid-until date by exactly that many months, after that the server renews monthly from the balance; `months: 12` is the annual plan with its discount; terms other than 1 and 12 have no discount. Or `period` ("month" by default, or "year" for annual billing) or an explicit `plan_id` from list_plans `plans[]`;` (`months` takes precedence over both); an active automatic offer (`plans[].promo`) is ⟨91 unchanged words⟩ re-order. Several servers in one order: `quantity`2–102–50 → one invoice, N separate services (each ⟨10 unchanged words⟩ after payment (`service_ids` in the response).The maximum50dependsisononlyfreeacapacitytypoinguardthe—locationthere(andisfreenoIPv4limit forIP plans); an account without any payment yet can ordernewupaccountstoand3nopermaximumorderby—freecallcapacity:`get_order_limits`serversfirst;thatadotoo-largenot`quantity`fitfailsrightwithnow409are`quantity_unavailable`queuedandfor`max_quantity`creation (nothing is charged). An unpaid multi-server order keeps its invoice and capacity reservationusuallyforwithin 24 hours, and an account can have only one: a second one fails with 409 `unpaid_group_exists` and the existing `invoice_id`.). Promo codes apply to single-server orders paid for 1 or 12 months only. Optional `addons`: "backups" (Managed Backups, ⟨11 unchanged words⟩ second public IPv4, dedicated-IP plans only);the first month ofeach add-on is added to the same invoice for every month of the chosen term (the first month on an annual plan), see `get_order_limits` for availability and price. Send ⟨69 unchanged words⟩ (else an unpaid invoice is returned).TypicalNevererrorsrefused for capacity:409nolocation_unavailablefree(seeroom/IPv4`available`),→409thequantity_unavailablepaid server is queued (seeget_vps_status`max_quantity`),queued:409true,unpaid_group_existsusually(payreadythatwithin`invoice_id`24firsthours),. Typical errors: 422 unknown product/os_id (see list_plans), 422 quantity above 50, 422 months outside 1–36, 422 coupon_term_only (promo code with a term other than 1 or 12 months).
⟨83 unchanged words⟩ ,"fi"],"type":"string"},"months":{"description":"Billing term in months, 1–36 (default 1). Invoice = monthly price × months; 12 = the annual plan with its discount; other terms have no discount. Takes precedence over period/plan_id.","maximum":36,"minimum":1,"type":"integer"},"os_id":{"exclusiveMinimum":0,"type":"integer ⟨20 unchanged words⟩ identical servers to order in one invoice (1–101–50, default 1).CheckServersget_order_limitswithout free room right now are queued forthecreation,currentnotmaximum.refused.","maximum":1050,"minimum":1,"type":"integer"}, ⟨8 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"addons":{"description":"Optional add-ons created automatically with each server: \"backups\", \"extra_ipv4\".","items":{"enum":["backups","extra_ipv4"],"type":"string"},"maxItems":2,"type":"array"},"hostname":{"type":"string"},"idempotency_key":{"description":"Optional key (letters, digits, - and _). Repeat it when retrying the same order so no second order is created.","pattern":"^[A-Za-z0-9_-]{1,64}$","type":"string"},"location":{"description":"Optional server country: ⟨33 unchanged words⟩ product":{"minLength":1,"type":"string"},"quantity":{"description":"How many identical servers to order in one invoice (1–10, default 1). Check get_order_limits for the current maximum.","maximum":10,"minimum":1,"type":"integer"},"ssh_key":{"type":"string"} ⟨5 unchanged words⟩
Order limits & add-ons — Before order_vps: how many servers of a plan can be ordered in one order right now (`max_quantity`, `limit_reason`: max_per_order | new_account | capacity | capacity_or_ipv4) and which add-ons are available for it with their monthly price (`addons.backups`, `addons.extra_ipv4`). Pass the same `product` and `period`/`plan_id` you will order; include `addons: ["extra_ipv4"]` to see the maximum with a second IPv4 per server. Works without a token (then the limit is the one for a new account). Requires: nothing (with a token the limit is for your account; without one — as for a new account).
⟨10 unchanged words⟩ "minLength":1,"type":"string"},"env":{"additionalProperties":{"maxLength":32768,"type":"string"},"description":"Environment variables for this run only (override the ones set at create_sandbox).","propertyNames":{"pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$"},"type":"object"},"language":{"enum":["python","node" ⟨51 unchanged words⟩
⟨17 unchanged words⟩ Use the ticket code from create_ticket / list_tickets. Requires: token.
⟨83 unchanged words⟩ maintenance; max `ttl` 30 days). `tariff` (vCPU / RAM / disk,default$/hoursmall): micro0.25/5120.25MB/3vCPU/512 MB RAM/3 GB$0.0165disk $0.0165/h · small(default)0.50.5/1vCPU/1GB/5GB RAM/5 GB$0.033disk $0.033/h · standard1/21GB/10vCPU/2 GB$0.066RAM/10 GB disk $0.066/h · plus2/42GB/15vCPU/4 GB$0.132RAM/15 GB disk $0.132/h · pro4/84GB/20vCPU/8 GB$0.264RAM/20 GB disk $0.264/h · max8/168GB/40vCPU/16 GB$0.528RAM/40 GB disk $0.528/h (pick plus or bigger for heavy pip installs ⟨83 unchanged words⟩ top-up; paused snapshots are deleted after 14 days. The response has `state: "running"` and `ready: true` once you can exec (usually immediately); if it says `starting`, call get_sandbox after 1-2 s. Always kill_sandbox when done. Requires: token + balance. Typical errors: 402 insufficient_balance → topup_balance; 503 capacity → retry or smaller tariff.
⟨36 unchanged words⟩ ,"type":"string"},"tariff":{"description":"Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing).","enum":["micro","small","standard", ⟨26 unchanged words⟩
⟨27 unchanged words⟩ use that with get_ticket / reply_ticket / close_ticket. Requires: token.
⟨30 unchanged words⟩ accept link. Optional `expires_days` for time-limited access. Owner-only. Requires: token (owner).
Read a SMALL file from the sandbox (absolute `path`, max 5 MB).Returnsinto this conversation: `content` as UTF-8 text bydefault; setdefault, `as_text: false`to→ `content_base64`. For build artifacts, archives, binaries or anything big use `get_download_url` instead — you get`content_base64`aforshort-livedbinarylinkfiles.and download it with curl, without pulling base64 into your context. Requires: token + live sandbox_id. Max 5 MB — bigger: get_download_url.
⟨119 unchanged words⟩ output and the exit code; kill_task stops it. Requires: token + live sandbox_id. Typical: timed_out after 55 s → repeat with background: true; 404 → sandbox expired, create a new one.
⟨10 unchanged words⟩ from this balance automatically when it is sufficient. Requires: token.
⟨29 unchanged words⟩ already billed and the estimated total so far. Requires: token.
⟨68 unchanged words⟩ output is dropped and reported in `*_dropped`). Requires: token.
⟨31 unchanged words⟩ The ticket code comes from create_ticket / list_tickets. Requires: token.
⟨9 unchanged words⟩ a VPS. `timeframe` ∈ hour|day|week|month (default hour). Requires: token.
⟨278 unchanged words⟩ lock SSH out. See `firewall_note` in the response. Requires: token. Typical: access.ssh_ready=false right after an order — not an error, poll again after retry_after_seconds.
Delete a sandboxnowIMMEDIATELY and IRREVERSIBLY (running or paused).:Itsallmemoryfiles, installed packages, background tasks anddiskmemory aredestroyedlost andbillingcannot be recovered — download_file anything you need first. Billing stops; the final partial period is billed (ephemeral ⟨4 unchanged words⟩ 60 s minimum, persistent per started hour). Requires: token.
⟨13 unchanged words⟩ state (killed). The sandbox itself keeps running. Requires: token.
⟨11 unchanged words⟩ the VPS you can operate but don't own. Requires: token.
⟨13 unchanged words⟩ has operator access to what, and its status. Requires: token.
⟨119 unchanged words⟩ not included — order with period="year". Requires: nothing.
⟨6 unchanged words⟩ paused) with mode, tariff, state and expiry. Requires: token.
⟨12 unchanged words⟩ means support has replied since you last looked. Requires: token.
⟨40 unchanged words⟩ query its status or try to manage it. Requires: token.
Log in with email + password. Returns a bearer `token` (reusable until `token_expires_at`,long-lived;1 year by default or `token_ttl_days`; remembered for the rest of this MCP session) ⟨28 unchanged words⟩ once while still authenticated with your register token. Requires: a password set earlier with set_password. Typical error: 401 invalid credentials (register_account accounts have no password until set_password).
⟨12 unchanged words⟩ :{"minLength":1,"type":"string"},"token_ttl_days":{"description":"Token lifetime in days (default 365).","maximum":1825,"minimum":1,"type":"integer"}},"required":["email","password"],"type":"object"}
⟨229 unchanged words⟩ not included — order with period="year". Requires: token + enough balance (else an unpaid invoice is returned). Typical errors: 409 location_unavailable (see `available`), 422 unknown product/os_id (see list_plans).
⟨16 unchanged words⟩ VPS provisions) automatically once the on-chain payment confirms. Requires: token. Pass invoice_id exactly as returned (a code like "2RUAWV4"). A human pays checkout_url.
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"invoice_id":{"exclusiveMinimumdescription":0"Invoice id exactly as returned by order_vps / topup_balance, e.g. \"type2RUAWV4\":(a plain number is also accepted)."integer,"}}minLength":1,"requiredtype":["invoice_idstring"]}},"type":"object"}
Power-control a VPS: `start`, `stop` or `reboot`. Requires: token. Typical error: 409 during the first boot (setup still running) → wait and retry.⟨33 unchanged words⟩ bearer `token` that is reusable for every requestfor 5untilyears`token_expires_at` (`token_expires_at`1 year by default; optional `token_ttl_days` 1-1825) — it is NOTsingle-use.single-use; call `refresh_token` before it expires. Inside this MCP session the token is remembered ⟨65 unchanged words⟩ a fresh token if this one is lost. Requires: nothing. Typical error: 422 email already registered → use login or your saved token instead of a new account.
⟨17 unchanged words⟩ :{"minLength":1,"type":"string"},"token_ttl_days":{"description":"Token lifetime in days (default 365).","maximum":1825,"minimum":1,"type":"integer"}},"required":["first_name","last_name"," ⟨3 unchanged words⟩
⟨35 unchanged words⟩ from list_plans). Provisioning runs asynchronously; poll `get_vps_status`. Requires: token + confirm (hostname or DELETE). Destroys all data.
⟨8 unchanged words⟩ Use the ticket code from create_ticket / list_tickets. Requires: token.
⟨88 unchanged words⟩ ONCE via get_vps_status (reveal:true); also emailed. Requires: token + confirm (hostname or DELETE). Only if the password is lost.
⟨21 unchanged words⟩ Use list_delegations / list_delegated_to_me to find the id. Requires: token.
⟨125 unchanged words⟩ state persist between calls in the same sandbox. Requires: token + live sandbox_id. Typical: timed_out after 55 s → repeat with background: true.
Public: sandbox tariffs — micro 0.25 vCPU/512MB/3MB RAM/3 GB,disk · small0.5/10.5GB/5vCPU/1 GB,RAM/5 GB disk · standard1/21GB/10vCPU/2 GB,RAM/10 GB disk · plus2/42GB/15vCPU/4 GB,RAM/15 GB disk · pro4/84GB/20vCPU/8 GB,RAM/20 GB disk · max 8 vCPU/16GB/40GB RAM/40 GB disk — with per-second/hour/month prices, the billing model and ⟨26 unchanged words⟩ bash, git, curl). No authentication needed. Requires: nothing.
⟨64 unchanged words⟩ SSH host keys and files are not touched. Requires: token, server running. Typical error: 409 agent_unavailable → start the server / wait for boot.
⟨68 unchanged words⟩ , this returns 409 (use change-password instead). Requires: token. Typical error: 409 password already set → use login.
⟨36 unchanged words⟩ one unpaid top-up may exist at a time. Requires: token. A HUMAN must pay checkout_url in crypto; the balance is credited automatically after confirmation.
⟨20 unchanged words⟩ OR `content_base64` for binary. Limit 5 MB perfile;file inline — for biggerdatafilesdownloadcallit`get_upload_url`fromandinsidePUT thesandboxbytes to the link (curl/wget)noorbase64splitthroughit.this chat). Optional `mode` like "755". Requires: token + live sandbox_id. Max 5 MB.
⟨9 unchanged words⟩ Use to verify the bearer token is valid. Requires: token.
Change VPS plan (resize / convert) — Switch a VPS to another plan IN PLACE — files and the OS are kept; the server reboots once (~1 min). `target_plan` = product_id from get_upgrade_options. The prorated difference is charged from the prepaid balance right away (402 with needed/balance if it is short — top up and retry); convert_to_nat refunds the unused difference to the balance. The next renewal uses the new price. Same function as the cabinet's Upgrade panel. Set `confirm: true`. Requires: token + balance for the prorated difference + confirm: true. Typical errors: 402 (top up), 422 not an upgrade (pick from get_upgrade_optio…
Download link for a sandbox file — Get a short-lived HTTPS link (default 15 min, `ttl` 60-3600 s) that streams ONE file from the sandbox — e.g. a build artifact or archive up to 2 GB — without base64 in this conversation. Download it with `curl -fL -o <name> <url>` from wherever you work. The link only works while the sandbox runs and only for that path; treat it as a secret. Requires: token + live sandbox_id. The link expires (ttl) and dies with the sandbox.
Start here — full guide — Call this FIRST. Returns the whole flow in one response: the exact order of tools to rent a VPS and to run code in a sandbox (with example arguments), the only human step (paying a crypto checkout_url), auth rules (one account, reusable token), common errors with fixes, limits — and `you_are_here`: if you are authenticated, your balance, servers and the next call to make. Every other tool response also carries `next_steps`, and every error carries `error.fix` + `error.next`. Requires: nothing. Call this first.
Plan change options — List the plans this VPS can switch to IN PLACE with its data kept: bigger plans of the same network type (resize: more vCPU/RAM/disk), NAT → dedicated IPv4 (convert: adds a public IP) or dedicated → the equivalent NAT plan (convert_to_nat: drops the IP, the unused price difference is refunded to the balance). Each option: product_id, name, monthly, prorated_topup (charged now for the rest of the current period), mode. Shrinking vCPU/RAM/disk is not possible (a disk cannot be reduced). The server must be active. Requires: token, server active.
Upload link into a sandbox — Get a short-lived HTTPS link to PUT ONE file into the sandbox at `path` (up to 2 GB): `curl -fT <file> <url>`. One request carries at most 95 MB — for bigger files PUT parts in order with `?offset=<bytes already uploaded>` (each response returns `next_offset`; offset 0 overwrites). No base64 through this conversation. Requires: token + live sandbox_id. ≤95 MB per PUT; use ?offset for more.
Refresh the API token — Exchange the CURRENT bearer token for a new one before it expires: returns `token` + `token_expires_at` (1 year by default, or `expires_in_days` 1-1825) and REVOKES the old token immediately. Inside this MCP session the new token is used automatically; with raw HTTP save it and stop using the old one. Every REST response carries the header X-Token-Expires-At; get_started shows the expiry and warns 30 days ahead. An already expired token cannot be refreshed — log in again (login) or create a token in the cabinet. Requires: a valid (not yet expired) token. The old token is revoked.
Undo a scheduled cancellation — Keep a VPS whose cancellation was scheduled with type end_of_period: the scheduled cancellation is removed, the server stays active and renews as usual. No money moves (end_of_period never refunds). An immediate cancellation cannot be undone — the VM is destroyed at once. get_vps_status shows `cancellation` {type, cancel_at, can_undo}. Requires: token + a scheduled end_of_period cancellation. Typical error: 409 nothing_to_undo.
⟨39 unchanged words⟩ :{"enum":["micro","small","stdstandard","plus","pro","max"],"type":"string"},"ttl": ⟨20 unchanged words⟩
⟨14 unchanged words⟩ stdout, stderr, timed_out, truncated, duration_ms}. Shell operators are fine and never filtered: `apt-get update && pip install x | tee log; echo done > out`. If you call the server with raw HTTP/curl, the JSON body must be valid — escape double quotes inside `command` (\") or build the body with a JSON library; a broken body returns a JSON-RPC parse error (-32700), not a firewall block. Optional `cwd` (default /root) and `timeout` (default 30 s, max 55 percall;call).runFor commands longer than 55 s (builds, training, longjobsdownloads)insetthe`background:backgroundtrue`:withyounohupget…a&`task_id`andat once, then poll).get_task for output and the exit code; kill_task stops it.
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"background":{"type":"boolean"},"command":{"minLength":1,"type":"string ⟨22 unchanged words⟩ ,"type":"string"},"timeout":{"maximumdescription":55"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default).","minimum":1,"type":"integer"}} ⟨5 unchanged words⟩
⟨141 unchanged words⟩ in with that key (no password);`ssh_ready`access.ssh_ready` (Linux) / `access.rdp_ready` (Windows) is a LIVE probe of the login port:false`onmeansa fresh order the first boot applies OS updates, so SSH usually opens 1-5 minutes after the VM isstillrunning.bootingWhile it is false the ready-to-paste `command` is withheld and `ready_note` + `retry_after_seconds` tell you to poll again —retrydoshortly.not reset, reboot or reinstall during that window. Use `reset_password` ONLY if the password is lost. ⟨68 unchanged words⟩
Log in with email + password. Returns a bearer`token`.`token` (reusable, long-lived; remembered for the rest of this MCP session). NOTE: accounts created via register_account have NO password by default —reusekeep using the token from register instead.IfToyoubehaveablenotopassword,logfirstin later, call `set_password`(once while still authenticated with your registertoken), or use the human email-OTP flow in a browser.token.
Create anewNEW EQVPS customer accountwith(first_name, last_name,email.email). Use a real email address you control — reserved/test domains such as example.com are not suitable (no recovery, no notifications). Returns a bearer `token`—thatSTOREisITreusableSAFELY:for every request for 5 years (`token_expires_at`) — it isyourNOTonlysingle-use.credential.InsideSendthisitMCPassession the token is remembered automatically for the following tool calls. If you call the server with raw HTTP/curl instead, save the token to a file right away and send `Authorization: Bearer <token>` oneveryEVERYfollowingrequestrequest.—Noapasswordshellorvariablehumandoesstepnotissurviveneeded.separateIfcommands.youNevermaycallloseregister_accounttheagain to "get a new token": that creates another, empty account. Optional backup: call `set_password` once, then `login` (whileemailauthenticated+ password)toreturnsalsoaenablefreshemail+passwordtoken`login`ifasthisaonebackup.is lost.
⟨12 unchanged words⟩ timed_out, truncated, duration_ms}. `language`: python (python3.12Python 3.12), node (Node.js 22) or bash. Install packages first with exec_command (`pip install …` / `npm i …`). The code is passed to the interpreter on ⟨8 unchanged words⟩ seconds (default 30, max 55 per call). LONGER JOBS: set `background: true` —forreturnslongerajobs`task_id`startimmediatelythem(timeoutinthen defaults to thebackgroundsandbox's(e.g.remainingbashlifetime);`nohuppollpython3get_taskjob.pywith>theout.logreturned2>&1offsets&`)to read new output andpollthewithexitexec_command/download_file.code, kill_task to stop it. The sandbox keeps billing while a task runs and is not idle-deleted. Output is capped at 1 MiB perstream.stream for synchronous calls. Files and installed state persist between calls in the same sandbox.
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"background":{"type":"boolean"},"code":{"minLength":1,"type":"string"},"language":{"enum":["python","node","bash"],"type":"string"},"sandbox_id" ⟨18 unchanged words⟩ ,"type":"string"},"timeout":{"maximumdescription":55"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default).","minimum":1,"type":"integer"}} ⟨6 unchanged words⟩
Public: sandbox tariffs(— micro 0.25vCPU/256vCPU/512MBMB/3 GB, small0.50.5/1vCPU/384GB/5MBGB,stdstandard11/2vCPU/512GB/10MB)GB,per-second/hourplus 2/4 GB/15 GB, pro 4/8 GB/20 GB, max 8 vCPU/16 GB/40 GB — with per-second/hour/month prices, the billing model and limits (synchronous exec up to 55 s,perbackgroundcall,tasks longer; files up to 5 MB pertransfer,transfer; runtimes:python3.12Python 3.12 + pip, Node.js 22 + npm, bash, git, curl). No authentication needed.
Poll a background task — Status and NEW output of a background task: `state` (running | done | failed | killed | timeout), `exit_code`, and the stdout/stderr text produced since the offsets you pass. Start with offsets 0, then pass `stdout_next_offset` / `stderr_next_offset` from the previous response to get only new output. `done: true` means finished. Poll every few seconds; each call is quick. Up to 8 MiB per stream is retained (older output is dropped and reported in `*_dropped`).
Stop a background task — Stop a running background task and all processes it started. Returns its final state (killed). The sandbox itself keeps running.
Sandbox status & cost — Status of one sandbox (state running/paused, mode, tariff, expires_at; paused ones show pause_reason and delete_after) plus usage: running seconds, CPU seconds actually used, egress bytes, price per hour, amount already billed and the estimated total so far.
Delete a sandbox — Delete a sandbox now (running or paused). Its memory and disk are destroyed and billing stops; the final partial period is billed (ephemeral per second with the 60 s minimum, persistent per started hour).
List my sandboxes — List the account's sandboxes (running and paused) with mode, tariff, state and expiry.
Run code in a sandbox — Run a code snippet inside a sandbox and return {exit_code, stdout, stderr, timed_out, truncated, duration_ms}. `language`: python (python3.12) or bash. The code is passed to the interpreter on stdin, so it cannot read stdin itself. `timeout` seconds (default 30, max 55 per call) — for longer jobs start them in the background (e.g. bash `nohup python3 job.py > out.log 2>&1 &`) and poll with exec_command/download_file. Output is capped at 1 MiB per stream. Files and installed state persist between calls in the same sandbox.
Sandbox pricing & limits — Public: sandbox tariffs (micro 0.25 vCPU/256 MB, small 0.5 vCPU/384 MB, std 1 vCPU/512 MB), per-second/hour prices, the billing model and limits (exec up to 55 s per call, files up to 5 MB per transfer, runtimes python3.12 + bash). No authentication needed.
Upload a file into a sandbox — Write a file into the sandbox at an absolute `path` (parent directories are created). Give `content` for UTF-8 text OR `content_base64` for binary. Limit 5 MB per file; for bigger data download it from inside the sandbox (curl/wget) or split it. Optional `mode` like "755".
⟨10 unchanged words⟩ "exclusiveMinimum":0,"type":"integer"},"period":{"enum":["month","year"],"type":"string"},"plan_id":{"exclusiveMinimum":0,"type":"integer"},"product":{"minLength":1,"type":"string ⟨8 unchanged words⟩
⟨31 unchanged words⟩ ,"type":"string"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"},"type":{"enum":["end_of_period","immediate"],"type":"string"}},"required":["service_id","reason"],"type":"object"}
⟨9 unchanged words⟩ ,"type":"string"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"},"subject":{"minLength":1,"type ⟨6 unchanged words⟩
⟨16 unchanged words⟩ ,"type":"integer"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"}},"required":["service_id","email"],"type":"object"}
⟨3 unchanged words⟩ additionalProperties":false,"properties":{"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"},"timeframe":{"enum":["hour","day","week","month"],"type":"string"}},"required":["service_id"],"type":"object"}
⟨7 unchanged words⟩ {"type":"boolean"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"type68J67T5\":(a plain numeric id is also accepted)."integer,"}}minLength":1,"requiredtype":["service_idstring"]}},"type":"object"}
⟨11 unchanged words⟩ ,"type":"string"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"}},"required":["service_id","action"],"type":"object"}
⟨12 unchanged words⟩ ,"type":"integer"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"}},"required":["service_id","os_id","confirm"],"type":"object"}
⟨7 unchanged words⟩ {"type":"string"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"}},"required":["service_id","confirm"],"type":"object"}
⟨9 unchanged words⟩ ,"type":"string"},"service_id":{"exclusiveMinimumdescription":0"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted).","minLength":1,"type":"integerstring"}},"required":["service_id","hostname"],"type":"object"}