EQVPS — VPS and code sandboxes for AI agents
Server Details
No-KYC VPS + per-second code sandboxes AI agents run over MCP — 75 tools, SDK, pay BTC/XMR/USDC/USDT
- Status
- Healthy
- Uptime
- 99.8% over 76 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Poiuyhje/eqvps-mcp
- GitHub Stars
- 0
- Server Listing
- EQVPS
TDQS
Scored across 47 tools
Most tools have distinct resource+action targets across VPS, sandbox, billing, auth, support, and delegation. A few pairs could be confused at a glance—exec_command vs run_code, download_file vs get_download_url, and set_password vs reset_password—but the descriptions clearly separate them.
The set overwhelmingly follows a snake_case verb_noun pattern such as create_sandbox, cancel_service, and get_vps_status. Exceptions like login, whoami, sandbox_pricing, and the service/vps resource-name drift are notable but minor.
47 tools is a very large surface for one MCP server, even one spanning six domains. Many operations are granular and valid, but the count makes tool selection heavy and several auth/billing/file-transfer tools could be grouped.
Coverage is strong: VPS lifecycle, sandbox execution, file transfer, tasks, billing, auth, tickets, and delegation are all represented. Minor gaps remain around backup management, invoice listing, VPS console/rDNS operations, and explicit sandbox pause/resume.
Available Tools
47 toolsaccept_delegationAccept delegated accessAIdempotentInspect
Accept a delegation invitation using the token from the invite link. Requires being signed in as the invited email address: it grants operator access to your own account. No new token is returned — keep using yours. Requires: token of the invited email.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Required. Invitation token from the accept link in the invitation email — the long random string after `token=` in the URL, e.g. "9f3c…e1a7". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=false, idempotent=true, destructive=false, and the description is consistent with these while adding real context: the auth requirement as the invited email, the resulting operator access, and the important note that no new token is returned so the caller keeps its own. It doesn't cover reversibility or rate limits, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded and the sentences are short, but the closing 'Requires: token of the invited email' restates the opening sentence, a small redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with full schema coverage, existing annotations, and no output schema, the description supplies the preconditions, effect, and token-rotation behavior an agent needs. Nothing critical is missing, though it could note reversibility or error conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the token parameter is documented in detail in the schema (long random string after `token=`). The description reiterates 'token of the invited email' but adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (accept) and resource (delegation invitation) and explains the effect: it grants operator access to your own account. This clearly distinguishes it from sibling tools like delegate_service, list_delegations, and revoke_delegation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Requires being signed in as the invited email address') and identifies the required input source (the token from the invite link). It does not explicitly name alternatives or when-not-to-use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_serviceCancel a VPSADestructiveInspect
Cancel a VPS. DEFAULT end_of_period: the server stays active until the end of the already-paid period, then is simply not renewed — NO data loss now, safe. immediate DESTROYS the VM and ALL data right away, permanently and irreversibly, and REQUIRES confirm set to the exact server hostname (see get_vps_status). Use end_of_period unless you explicitly intend to wipe the server now. On immediate, the unused portion of the already-paid period is refunded to your 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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional. "end_of_period" (default: runs until the paid period ends, undoable) or "immediate" (destroys the server and all data now). | |
| reason | Yes | Required. Why this VPS is being cancelled (e.g. project finished, too expensive, no longer needed). | |
| confirm | No | Optional. Needed only with type "immediate": the server's exact hostname (from get_vps_status). Ask the human first. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes well beyond them: it explains that immediate permanently destroys the VM and all data, that end_of_period causes no data loss now, that immediate requires confirm=hostname, and that unused paid time is refunded. It omits only details like whether the refund is automatic vs. queued and any latency before destruction takes effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Safety-critical information is front-loaded and every sentence carries real instruction. It is dense with parentheticals and back-references ('refund as above', 'see refund_amount'), which slows scanning slightly for an otherwise high-value block of text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible operation with no output schema, the description supplies prerequisites (token + reason, plus confirm for immediate), the refund behavior and where to read it in the response, the state check via get_vps_status, and the recovery paths. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds relational meaning the schema cannot: that confirm is only meaningful together with type=immediate, that its value must be the exact server hostname sourced from get_vps_status, and that the response carries refund_amount. This is genuine value beyond the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel) on a specific resource (a VPS) and immediately distinguishes the two modes, end_of_period vs immediate. It also names sibling tools it interacts with (get_vps_status, undo_cancel), so an agent can tell it apart from those directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit default recommendation ('Use end_of_period unless you explicitly intend to wipe the server now'), names the alternative tool for reversing a scheduled cancellation (undo_cancel), and even prescribes the handling for the typical 409 cancellation_already_scheduled response.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_planChange VPS plan (resize / convert)ADestructiveInspect
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. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Required. Must be true — you agree to the charge and one reboot. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). | |
| target_plan | Yes | Required. Target plan `product_id` from get_upgrade_options `options[]`, integer, e.g. 11. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give destructiveHint/idempotentHint; the description goes far beyond by disclosing the in-place semantics, the single ~1 min reboot, immediate prorated charging from prepaid balance, refund behavior for convert_to_nat, and the full 402/409/422/202 error and queueing model with a 24h fulfillment window. This is exactly the behavioral context an agent needs for a destructive, non-idempotent operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, but the 202 queued behavior is explained twice in near-identical wording ('If the server's host has no free room... 202 with queued: true' then 'No room on the server's host → 202 queued (paid, applied automatically, usually within 24 hours)'). That duplication pads an otherwise dense but single-topic paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers charges, refunds, reboot count, queue fallback, the response fields (charged, unused_credit, new_cost), and all typical error codes. Nothing material an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning by tying `target_plan` to get_upgrade_options' options[] and by explaining the charging/refund semantics attached to `confirm` and the convert_to_nat variant. It does not add syntax details beyond the schema, so it stays below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Switch a VPS to another plan IN PLACE — files and the OS are kept'). It is clearly distinguishable from siblings like get_upgrade_options (which supplies the target), reinstall_vps, and order_vps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_upgrade_options for `target_plan`, names convert_to_nat as a variant behavior, and states the failure conditions (422 not an upgrade, 409 upgrade_queued). When-to-use and prerequisites (token + balance + confirm) are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_ticketClose a support ticketAIdempotentInspect
Close one of your tickets. rating (1-5) and comment are OPTIONAL — you can close without rating. Use the ticket code from create_ticket / list_tickets. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | No | Optional. Support rating, integer 1–5 (5 = excellent). Default: no rating. | |
| comment | No | Optional. Comment for the rating, up to 2000 characters. Default: none. | |
| ticket_code | Yes | Required. Ticket code from create_ticket / list_tickets, e.g. "K7Q2M9X". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the mutation/idempotency profile is covered structurally. The description adds one genuinely new fact beyond the annotations — "Requires: token" — but says nothing about whether closing is reversible or terminal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, and the optionality caveat is placed before the code-sourcing hint. Efficient, though the inline backticks and em-dash aside make it slightly choppier than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, single-object mutation with a fully documented schema and annotations covering safety and idempotency, the description is nearly complete. The one remaining gap is what the agent should expect after closing (terminal state, whether the ticket can be reopened).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the 1–5 rating range, optionality and the 2000-character comment limit. The description only restates the optionality of rating/comment, adding no new syntactic or semantic detail; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Close one of your tickets") that an agent can clearly distinguish from get_ticket, reply_ticket and list_tickets. However, it never explicitly contrasts itself with those siblings, so it stops short of the 5-level differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it tells the agent where the ticket code comes from (create_ticket / list_tickets) and clarifies that closing does not require a rating. It does not, however, state any when-not-to-use condition or name a fallback alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sandboxCreate a code sandboxADestructiveInspect
Start an isolated Firecracker microVM sandbox (ready in about 1 s; Linux with Python 3.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: "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 (default small): micro 0.25 vCPU/512 MB RAM/3 GB disk $0.0165/h · small 0.5 vCPU/1 GB RAM/5 GB disk $0.033/h · standard 1 vCPU/2 GB RAM/10 GB disk $0.066/h · plus 2 vCPU/4 GB RAM/15 GB disk $0.132/h · pro 4 vCPU/8 GB RAM/20 GB disk $0.264/h · max 8 vCPU/16 GB RAM/40 GB disk $0.528/h (pick plus or bigger for heavy pip installs such as torch, builds or data work). Headless browsers (Chromium via Playwright/Puppeteer) need standard or bigger — micro/small do not have enough RAM. If the host is busy the call fails with 503 capacity (Retry-After) — retry or choose a smaller tariff. Charged from the same prepaid balance as VPS (no subscription). Empty balance → 402 insufficient_balance (top up with topup_balance). If the balance runs out later, persistent sandboxes are paused (memory+disk snapshot, not billed) and resume automatically after a 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 (billed per second from the prepaid balance, from $0.0165/h on micro; minimum 60 s per sandbox). Typical errors: 402 insufficient_balance → topup_balance; 503 capacity → retry or smaller tariff.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Optional. 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. | |
| ttl | No | Optional. Maximum lifetime in seconds (ephemeral up to 86400, persistent up to 2592000). | |
| mode | No | Optional. "ephemeral" (default: billed per second, minimum 60 s, auto-deleted when idle) or "persistent" (billed per started hour, kept up to 30 days). | |
| tariff | No | Optional. Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing). Default "small"; e.g. "plus" for heavy pip installs. | |
| idle_timeout | No | Optional. Seconds of inactivity before an ephemeral sandbox is deleted (default 300, max 3600). 0 = none (persistent only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/non-idempotent/non-readonly; the description goes far beyond by disclosing billing models per mode, the 60 s minimum, auto-deletion after idle_timeout, persistent pause-on-empty-balance with 14-day snapshot retention, capacity failures, and auth/balance prerequisites. That is exactly the lifecycle and cost context an agent needs before committing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the sandbox is, then mode, then tariff, then failure handling – a sensible order with no filler. It loses a point for repetition: the price floor, minimum 60 s, prepaid-balance note and 402 error are each stated twice, and the trailing 'Requires/Typical errors' recap duplicates earlier sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the response shape (state/ready and the 'starting' case), all error paths, cost implications and cleanup obligations. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so 3 is the baseline, but the description adds real semantics: per-second vs per-hour billing, ttl caps by mode, idle_timeout defaults and its persistent-only exemption, and a full tariff table with vCPU/RAM/disk and hourly prices tied to workload types. This meaningfully exceeds the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Start an isolated Firecracker microVM sandbox', plus runtime contents (Linux, Python 3.12, Node 22, git, curl) and network posture. It is unmistakably distinct from get_sandbox, list_sandboxes, kill_sandbox and run_code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete follow-up routing: call get_sandbox if state is 'starting', 'Always kill_sandbox when done', topup_balance on 402, retry-or-smaller-tariff on 503 capacity. It also advises which tariff to pick for heavy pip installs and headless browsers, though it never explicitly states when not to create a sandbox (e.g. versus reusing an existing one).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticketOpen a support ticketAInspect
Open a support ticket with EQVPS. subject and message are required; optional service_id ties it to one of your VPS. The response includes the ticket code — use that with get_ticket / reply_ticket / close_ticket. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Required. Problem description, up to 5000 characters: what you did, what you expected, what happened. | |
| subject | Yes | Required. Short ticket subject, up to 255 characters, e.g. "SSH refused after reboot". | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false. Beyond those, the description adds two things the annotations do not: the auth requirement ('Requires: token') and the fact that the response carries a ticket `code`. It does not warn that repeated calls create duplicate tickets (relevant given idempotentHint=false), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it does, what is required/optional, what comes back and where to use it. Front-loaded with purpose, and every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully names the returned `code`, and it flags the token requirement, so an agent has enough to call and chain the tool. Minor gaps remain (error/permission failure cases, whether service_id must belong to the caller), but nothing blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so subject/message/service_id are already fully documented with lengths, format and examples in the schema. The description only restates required vs optional status, adding no new syntax or constraint detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Open a support ticket with EQVPS') and immediately differentiates itself from the read/mutate siblings by naming the follow-on tools (get_ticket / reply_ticket / close_ticket). An agent can distinguish it from list_tickets or get_ticket without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear workflow context: the returned `code` is the handle to use with get_ticket / reply_ticket / close_ticket, which tells the agent where this tool sits in the lifecycle. It does not explicitly state when NOT to use it (e.g. to reply to an existing ticket use reply_ticket), so it falls short of the full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegate_serviceDelegate service accessAInspect
Grant OPERATOR access to one of YOUR VPS to another person by email (they can power/reinstall/console/hostname/rdns, but NOT renew, cancel or change billing). Sends them an invitation with an accept link. Optional expires_days for time-limited access. Owner-only. Requires: token (owner).
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Required. Email of the person who gets operator access, e.g. "admin@partner.org". They receive an invitation link. | ||
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). | |
| expires_days | No | Optional. Access lifetime in days, integer 1–365. Default: no expiry (until revoked). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), it discloses the actual permission envelope granted (power/reinstall/console/hostname/rdns but not renew/cancel/billing), that an invitation email with an accept link is sent, and that access is time-limited only if expires_days is supplied. This is the auth and effect-scope context an agent needs for a delegation mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its scope are front-loaded in the first clause, with the permission boundary immediately after. It is dense but nearly every clause earns its place, though 'Owner-only' and 'Requires: token (owner)' are mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema, 3-parameter mutation, the description covers the actor, effect, invitation flow, expiry, and auth requirement. The main omission is what the call returns (e.g. a delegation id) and what happens if the same email is delegated twice, which the non-idempotent annotation implies is possible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so email, service_id, and expires_days are already fully documented in the schema. The description restates expires_days as optional time-limited access but adds no syntax or constraint meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb (grant) and resource (OPERATOR access to one of YOUR VPS) plus the target (another person by email). It distinguishes itself cleanly from siblings like revoke_delegation, list_delegations, and accept_delegation, which handle the other stages of the same lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite explicitly (owner-only, requires an owner token) and enumerates exactly what the delegatee may and may not do, which tells the agent when this tool is appropriate. It does not, however, route the agent to the counterpart tools (revoke_delegation to undo, list_delegations to audit), so the when-not side is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileDownload a file from a sandboxARead-onlyInspect
Read a SMALL file from the sandbox (absolute path, max 5 MB) into this conversation: content as UTF-8 text by default, as_text: false → content_base64. For build artifacts, archives, binaries or anything big use get_download_url instead — you get a short-lived link and download it with curl, without pulling base64 into your context. Requires: token + live sandbox_id. Max 5 MB — bigger: get_download_url.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Required. Absolute path inside the sandbox to read (max 5 MB), e.g. "/root/app/main.py". Must start with "/". | |
| as_text | No | Optional. True (default) = return `content` as UTF-8 text; false = return `content_base64` (for binary files). | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds substantial behavioral context beyond annotations: the 5 MB size cap, the default UTF-8 output and the base64 fallback via as_text, and the auth requirements (token + live sandbox_id). This prevents misuse for large payloads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core purpose, then the alternative, then the requirements. It is well-structured, though it slightly repeats 'max 5 MB' and 'get_download_url' at the end, which is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with full schema coverage, no output schema, and safety annotations already in place, the description covers everything an agent needs: scope, size limit, output format, auth prerequisites, and the correct alternative for larger files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents path, sandbox_id, and as_text, including the base64 behavior and the absolute-path constraint. The description mostly repeats that information without adding new syntax or edge-case meaning, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading a small file from a sandbox into the conversation, with the output representation (UTF-8 vs base64). It explicitly distinguishes itself from the sibling get_download_url for large files, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use (small files, max 5 MB) and when-not (build artifacts, archives, binaries, anything big) and names the alternative (get_download_url) with the reason (short-lived link, avoid base64 in context). Prerequisites (token + live sandbox_id) are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exec_commandExecute a shell command in a sandboxADestructiveInspect
Execute a shell command (bash -lc) in a sandbox as root and return {exit_code, 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 per call). For commands longer than 55 s (builds, training, long downloads) set background: true: you get a task_id at once, then poll get_task for 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Optional. Working directory, absolute path, e.g. "/root/app". Default "/root". | |
| env | No | Optional. Environment variables for this command only (override the ones set at create_sandbox). Example: {"DEBUG": "1"}. | |
| command | Yes | Required. Shell command run as root via bash -lc; operators like &&, | and > are allowed, e.g. "pip install requests && python app.py". | |
| timeout | No | Optional. Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default). | |
| background | No | 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). | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey the safety profile (destructive, non-idempotent, open-world), and the description correctly aligns with it. It adds real value: root execution, unfiltered shell operators, and the raw-HTTP/curl gotcha where a malformed JSON body yields a -32700 parse error rather than a firewall block. With annotations covering much of the safety context, a 3 is appropriate for the incremental disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then packs constraints and error branches efficiently into a single dense paragraph. It is long but nearly every clause (background flow, timeout ceiling, curl caveat) carries actionable information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter open-world tool with no output schema, the description supplies the return fields, the sync-vs-background split, the timeout ceiling, the auth requirement (token + live sandbox_id), and error-code semantics. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents cwd (default /root), timeout (max 55), background (returns task_id), and env. The description mostly restates these, adding only the default 30 s timeout, which earns baseline 3 rather than more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (execute) and resource (shell command) with the exact execution context: bash -lc, as root, in a sandbox. It also names the return shape {exit_code, stdout, stderr, timed_out, truncated, duration_ms}, letting an agent distinguish it from the sibling run_code without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing: long commands (>55 s) should set background:true and then poll get_task, kill_task stops it, a timed_out result should be retried with background:true, and a 404 means the sandbox expired so create a new one. Alternatives (get_task, kill_task, create_sandbox) are named with the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet prepaid balanceARead-onlyInspect
Return the account's prepaid credit balance and currency. order_vps spends from this balance automatically when it is sufficient. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context: the auth requirement ('Requires: token') and the behavioral fact that order_vps draws on this balance automatically when sufficient, which helps an agent interpret the number.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and each carrying distinct information (return values, cross-tool behavior, auth requirement). No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does describe what comes back (credit balance plus currency) and states the token requirement, which is enough for a zero-parameter read tool. It stops just short of details like balance units or whether the value includes pending charges.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing parameter-wise to clarify, and the description instead spends its words on the return payload (balance and currency), which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Return the account's prepaid credit balance and currency'), so an agent immediately knows this is a read of account credit. It does not explicitly name the sibling it contrasts with (topup_balance), relying on the resource name to do the differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the note that `order_vps` spends from the balance tells the agent why the balance matters, but there is no explicit 'use this when... / not when...' guidance or pointer to topup_balance for adding funds. Context exists but selection criteria must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_download_urlDownload link for a sandbox fileAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min). | |
| path | Yes | Required. Absolute path inside the sandbox of the file to download, e.g. "/root/app/main.py". Must start with "/". | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: ttl default and range, 2 GB size ceiling, 'only works while the sandbox runs and only for that path', 'treat it as a secret', and that the link dies with the sandbox. The annotations only give generic hints (readOnlyHint false, openWorldHint false), so this behavioral detail is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tightly front-loaded: what the link is, its lifetime, then the curl usage and constraints. Minor redundancy — 'only works while the sandbox runs' is restated at the end as 'dies with the sandbox' — keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description must explain the returned value, and it does: a short-lived secret URL that streams one file. Lifetime, size limit, usage recipe, and the token/sandbox precondition are all covered, leaving nothing an agent needs in order to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so ttl range/default and the absolute-path requirement are already documented in the schema; the description repeats the ttl default and range without adding syntax. The only extra semantic is the 2 GB max file size, which is not expressible in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), a precise artifact ('short-lived HTTPS link') and a bounded resource ('streams ONE file from the sandbox — e.g. a build artifact or archive'). The phrase 'without base64 in this conversation' implicitly distinguishes it from the sibling download_file, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context — call it when you want a link you can pull with `curl -fL -o <name> <url>` from wherever you work, requiring token + live sandbox_id. It implies the alternative (inline base64 download) but never names download_file or get_upload_url, so the when-not-to-use side is only inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_limitsOrder limits & add-onsARead-onlyInspect
Before order_vps: the per-order maximum (max_quantity = 50, a typo guard; limit_reason max_per_order) and which add-ons a plan has with their monthly price (addons.backups, addons.extra_ipv4). Orders are never refused for capacity — servers without free room are queued for creation (usually within 24 hours, see queue_note). Pass the same product and months (or period/plan_id) you will order; the response carries months, term_price (plan price for the term, one server, before add-ons and an automatic offer) and terms (1–36 months, quick picks 1/3/6/12). Works without a token. Requires: nothing (with a token the limit is for your account; without one — as for a new account).
| Name | Required | Description | Default |
|---|---|---|---|
| addons | No | Optional. Add-ons to price: array of "backups" and/or "extra_ipv4", e.g. ["backups"]. Default: none. | |
| months | No | Optional. Billing term in months, integer 1–36 (default 1); 12 = the annual plan. Takes precedence over period/plan_id. | |
| period | No | Optional. Billing period to price: "month" (default) or "year". Ignored when `months` or `plan_id` is given. | |
| plan_id | No | Optional. Billing plan id from list_plans `plans[].plan_id`, integer, e.g. 24. Ignored when `months` is given. | |
| product | Yes | Required. Plan slug from list_plans, e.g. "nano-ip". | |
| location | No | Optional. Server country to check: "de" (Germany) or "fi" (Finland). Default: automatic placement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and closed-world, but the description adds substantial behavior beyond them: orders are never refused for capacity (queued, usually within 24h, see queue_note), and it discloses auth behavior ("works without a token"; with a token the limit is account-scoped). This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and constraint are front-loaded in the first clause, and nearly every sentence carries information (limits, add-ons, queue policy, response fields). It is dense with parentheticals and slightly heavy, but there is little dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing returns and does so fully (months, term_price, terms with quick picks, addons.*, queue_note). An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are documented, but the description adds meaning beyond the schema by tying product/months to the subsequent order call and explaining max_quantity = 50 as a typo guard. This goes past the baseline 3 by supplying usage semantics the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific resource (per-order max quantity, limit_reason, and plan add-on pricing) with an explicit relationship to the sibling order_vps, which an agent can use to distinguish this lookup from the actual ordering tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Before order_vps" names the trigger condition and the sibling it precedes, and the instruction to pass the same product/months you will order tells the agent exactly how to use it in the ordering flow. No ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sandboxSandbox status & costARead-onlyInspect
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. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful context beyond that: it requires a token, and it discloses that paused sandboxes expose pause_reason and delete_after, which previews conditional behavior of the payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the status fields before the usage/billing fields. Every clause earns its place, though the run-on length makes it slightly harder to scan than a short bulleted list would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the agent must otherwise guess the return shape; the description compensates by enumerating the state, mode, and cost fields. Combined with annotations covering the read-only profile, this is nearly complete, missing only guidance on when to call it versus sibling status tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100% with a pattern and an example id format, so the schema fully carries the semantics. The description adds nothing about sandbox_id itself; the 'Requires: token' note refers to auth, not a parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Status of one sandbox') and enumerates the exact fields returned (state, mode, tariff, expires_at, usage metrics). The singular 'one sandbox' + required sandbox_id clearly distinguishes it from the sibling list_sandboxes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the naming and the sandbox_id requirement, but the description never states when to reach for this over siblings like list_sandboxes, get_vps_status, or sandbox_pricing, nor any exclusions or prerequisites beyond auth.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_startedStart here — full guideARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description's marginal value is in disclosing that no auth is required, that the response varies with authentication state (balance/servers only if authenticated), and the cross-cutting conventions (`next_steps` on all responses, `error.fix` + `error.next` on all errors). It does not describe size, pagination, or caching behavior, so a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the imperative 'Call this FIRST,' then enumerates the returned payload in a single dense sentence. Every clause carries information (flow, human step, auth rule, error fixes, limits, personalization), though the run-on em-dash construction and the repeated 'Call this first' could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing the return value, and it does: the response contents are enumerated, including the conditional `you_are_here` block. It also states prerequisites (none), the single human step (crypto checkout_url), and the conventions governing sibling tools, leaving nothing material unstated for a zero-parameter entry point.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case per the scoring rules. The description correctly reinforces this by stating 'Requires: nothing' rather than inventing parameter detail, and the example arguments it mentions belong to the downstream tools, not to this call's schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and deliverable: it 'returns the whole flow in one response' — the exact tool order for renting a VPS and running code, auth rules, error fixes, limits, and a personalized `you_are_here` block. This is unmistakably an onboarding/orientation tool, distinguishable from every sibling like login, order_vps, or run_code, which perform the actual operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the sequence: 'Call this FIRST' at both the opening and the closing line, plus the precondition 'Requires: nothing.' An agent knows exactly when to invoke it (before anything else) and that it needs no credentials. It also explains the alternative pattern — every other tool response carries `next_steps` and every error carries `error.fix`/`error.next` — so the agent knows when a follow-up call to this tool is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskPoll a background taskARead-onlyInspect
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). Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Required. Task id returned by run_code / exec_command with background: true. | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". | |
| stderr_offset | No | Optional. Byte offset in stderr to read from, integer ≥ 0 (default 0); pass `stderr_next_offset` from the previous response. | |
| stdout_offset | No | Optional. Byte offset in stdout to read from, integer ≥ 0 (default 0); pass `stdout_next_offset` from the previous response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, and the description adds genuinely useful context beyond them: an 8 MiB per-stream retention cap with older output dropped and reported in *_dropped, the token requirement, and the low per-call cost. It stops short of explaining behavior for invalid offsets or already-collected tasks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph that front-loads what the tool returns and follows with the polling procedure, retention limit, and auth note. Every clause carries information, though the offset instructions partially duplicate the schema wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return shape — and it does, naming state values, exit_code, done, the stdout/stderr payloads, and the *_dropped fields. Combined with the offset protocol and retention cap, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents offset defaults ≥ 0 and the next_offset handoff pattern, so the description largely restates what is structured. It adds only marginal framing (the 0-start convention and the ordering of poll iterations), so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Status and NEW output of a background task') and immediately scopes it with the field list it returns (state, exit_code, stdout/stderr). This distinguishes it cleanly from kill_task (terminates), exec_command/run_code (start work), and get_sandbox (sandbox-level status).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: start with offsets 0, then feed back stdout_next_offset/stderr_next_offset, and poll every few seconds. It does not name sibling alternatives (e.g. kill_task for cancellation) or state what happens when polling a task that already finished, so it falls just short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticketRead a support ticketARead-onlyInspect
Read one ticket and its full message thread. Each message has an author: you or staff — a staff message is a reply from support. Poll this to see new answers. The ticket code comes from create_ticket / list_tickets. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_code | Yes | Required. Ticket code from create_ticket / list_tickets (field `id`/`code`), e.g. "K7Q2M9X". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real value beyond that: it exposes the auth requirement ('Requires: token') and explains the message-thread shape, including that a `staff` author denotes a support reply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core operation front-loaded and the auth note last. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by describing the returned thread and the `author` semantics. For a single read-only parameter tool this is nearly complete, though it does not mention pagination or thread size limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents ticket_code with an example and its origin. The description repeats the create_ticket/list_tickets source but adds no format or syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Read one ticket and its full message thread.' The singular 'one ticket' plus 'full message thread' distinguishes it from the sibling list_tickets without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to 'Poll this to see new answers' and routes to the source of the identifier ('The ticket code comes from create_ticket / list_tickets'). No explicit when-not-to-use or named alternative like list_tickets, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upgrade_optionsPlan change optionsARead-onlyInspect
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-open-world, yet the description adds substantial operational depth: how capacity_now/wait_reason affect ordering, that queued upgrades apply automatically within ~24h and never move hosts, that pending_upgrade suppresses options, and how refunds/credits work. This goes well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and every subsequent sentence carries distinct information (modes, option fields, constraints, capacity semantics, math). It is dense and could be split for readability, but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates the returned fields (product_id, name, monthly, prorated_topup, mode, line, capacity_now, wait_reason, pending_upgrade, options, unused_credit, new_cost) and explains their meaning and interactions. It is complete enough for an agent to interpret results and reason about a follow-up change_plan call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, with the schema already explaining the service_id format. The description mentions required auth ('token') but adds nothing about service_id semantics, so the structured field carries the burden — the correct baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (plans this VPS can switch to IN PLACE), and names the three operation modes (resize, convert, convert_to_nat) with their effects. It is clearly distinguishable from list_plans (generic catalog) and change_plan (executes the change).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('The server must be active') and hard exclusions ('Shrinking vCPU/RAM/disk is not possible'), and ties the result to the follow-up action change_plan. It stops short of explicitly routing against sibling tools like list_plans, so it is strong but not a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upload_urlUpload link into a sandboxAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min). | |
| path | Yes | 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 "/". | |
| max_bytes | No | Optional. Maximum size of the uploaded file in bytes, integer 1–2147483648 (2 GB). Default: the server limit (2 GB). | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=false), it discloses material behavior: the link is short-lived, each PUT carries at most 95 MB, larger files must be chunked in order via ?offset, each response returns `next_offset`, and offset 0 overwrites prior content. This is exactly the kind of operational context an agent cannot get from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause and the body is dense but readable. The trailing 'Requires: token + live sandbox_id. ≤95 MB per PUT; use ?offset for more.' restates content already established, which is a minor redundancy and the only thing keeping this from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a chunked-upload tool with no output schema, the description covers TTL, size limits, offset chaining, and the `next_offset` field well. It stops short of describing the rest of the returned payload (e.g. the URL field name or link expiry), but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description reinforces max_bytes ('up to 2 GB') and adds semantics not present in the schema, notably the overwrite-at-offset-0 behavior on `path` and the chunked-upload offset mechanic that governs how the returned URL is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: returning a short-lived HTTPS link to PUT one file into a sandbox at `path`. The 'ONE file'/'up to 2 GB' scoping and the 'No base64 through this conversation' remark implicitly route the agent away from upload_file, but no sibling is named, so differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisites ('Requires: token + live sandbox_id') and the operative workflow (one PUT ≤95 MB, chunked PUTs via ?offset for larger files). What is missing is an explicit 'use this instead of upload_file/get_download_url when…' condition, leaving the alternative-selection rule to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vps_metricsGet VPS metricsARead-onlyInspect
Time-series resource metrics (CPU %, memory, network, disk) for a VPS. timeframe ∈ hour|day|week|month (default hour). Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| timeframe | No | Optional. Time window: "hour" (default), "day", "week" or "month". | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuine behavioral fact beyond annotations: an explicit auth requirement ('Requires: token'). It still omits return format/pagination context, but that is a real addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the metrics scope and followed by the parameter constraint and auth note. No filler; the enum notation is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so some return-value explanation is useful; the description covers this by naming the four metric categories returned. Combined with annotations covering safety and schema covering params, it is nearly complete, though return format/pagination is still unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (including the enum and default for timeframe) are fully documented in the schema. The description only restates the enum/default, adding no syntax or behavior beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation (time-series resource metrics), the resource (a VPS), and enumerates the covered signal types (CPU %, memory, network, disk). This scope detail readily distinguishes it from the nearby status/list siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies a monitoring use case and the timeframe/default is noted, but there is no explicit when-to-use, when-not, or alternative (e.g., get_vps_status vs get_vps_metrics) guidance. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vps_statusGet VPS status & accessARead-onlyInspect
Get full detail for one VPS: status, specs, live VM state/uptime, and access info (host, port, ready-to-paste command; access.method = ssh for Linux, rdp for Windows — port follows the plan: dedicated IP 22/3389, NAT 20000+vmid). READ-ONLY since 1.9.1: it never reveals or changes anything, so it is safe to poll. ROOT PASSWORD (keyless VPS): password_available: true means a password is waiting — read it ONCE with reveal_password (the old reveal: true argument is still accepted but only points you there). If you supplied an SSH key at order time, log in with that key (no password); access.ssh_ready (Linux) / access.rdp_ready (Windows) is a LIVE probe of the login port: on a fresh order the first boot applies OS updates, so SSH usually opens 1-5 minutes after the VM is running. While it is false the ready-to-paste command is withheld and ready_note + retry_after_seconds tell you to poll again — do not reset, reboot or reinstall during that window. Use reset_password ONLY if the password is lost. Poll this after order_vps to watch provisioning reach active. NAT plans (no dedicated IP): the SSH port shown is an EXTERNAL DNAT port forwarded to the VM internal port 22 (internal_port in the response). If you configure a host firewall, allow the INTERNAL port — ufw allow OpenSSH — NOT the external port, or ufw enable will 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.
| Name | Required | Description | Default |
|---|---|---|---|
| reveal | No | 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. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: it pins the READ-ONLY guarantee to a version (1.9.1) and explains it is safe to poll, discloses that ssh_ready/rdp_ready are live probes with a 1-5 minute post-boot delay, warns that ready commands are withheld while false, and documents the NAT/firewall trap (allow internal port, not the DNAT port). This is unusually rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is correctly front-loaded, but the body is a dense wall of parenthetical clauses (port mapping, ufw advice, retry semantics) that is hard to parse and partly tangential to a status read. It is information-rich but not economically structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values and does so thoroughly — password_available, access.method, ssh_ready/rdp_ready, ready_note, retry_after_seconds, internal_port, firewall_note. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds interpretation — that the legacy `reveal: true` argument is still accepted but only redirects the caller to reveal_password, and that service_id comes from list_vps/order_vps. That clarifies intent rather than merely restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full detail for one VPS') and enumerates the returned facets: status, specs, live VM state/uptime, and access info. It is clearly distinguishable from siblings like list_vps (enumeration) and get_vps_metrics (metrics-only).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: poll after order_vps to watch provisioning reach 'active'; read a pending password once via reveal_password; use reset_password ONLY if the password is lost. It also states a clear when-NOT-to-act condition — don't reset/reboot/reinstall while ssh_ready is false.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kill_sandboxDelete a sandboxADestructiveIdempotentInspect
Delete a sandbox IMMEDIATELY and IRREVERSIBLY (running or paused): all files, installed packages, background tasks and memory are lost and cannot be recovered — download_file anything you need first. Billing stops; the final partial period is billed (ephemeral per second with the 60 s minimum, persistent per started hour). Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert destructive/idempotent/no-read; the description adds far more: exactly what is destroyed (files, packages, background tasks, memory), irreversibility, billing semantics (stops, final partial period billed, per-second with 60 s minimum for ephemeral, per-started-hour for persistent), and the token requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive consequence, then the recovery caveat (download_file first), then billing, then auth requirement. Every clause carries operational weight; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and none is needed for a delete. Between the description and annotations, an agent knows the safety profile, the scope of data loss, the billing effect, and the auth prerequisite — everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema coverage is 100%, with the schema itself documenting the id pattern and example. The description's only parameter-adjacent line ('Requires: token') concerns auth, not sandbox_id, so it adds no semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+mode: 'Delete a sandbox IMMEDIATELY and IRREVERSIBLY (running or paused)'. That phrasing separates it from the read-only siblings get_sandbox/list_sandboxes and from kill_task, which targets a task rather than the sandbox itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear pre-condition: 'download_file anything you need first', which tells the agent the ordering constraint before invoking. It does not explicitly name an alternative path (e.g. pause or cancel_service) or state when deletion is unnecessary, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kill_taskStop a background taskADestructiveIdempotentInspect
Stop a running background task and all processes it started. Returns its final state (killed). The sandbox itself keeps running. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Required. Task id returned by run_code / exec_command with background: true. | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the kill cascades to all child processes started by the task, the final state is returned as 'killed', and the surrounding sandbox survives. Only the auth requirement and return surface are lightly covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, declarative sentences with zero waste, and the primary action is front-loaded before the scope caveat and the return/requirement notes. Every sentence carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by stating the returned final state ('killed'), and it clarifies the blast radius (child processes) and the non-effect on the sandbox. For a two-parameter mutation with full annotation coverage, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so task_id and sandbox_id are already fully documented with their id formats and provenance. The description adds nothing parameter-specific, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Stop) and resource (a running background task and all processes it started), and explicitly narrows scope with 'The sandbox itself keeps running', which distinguishes it from the sibling kill_sandbox. An agent can tell what it does and what it does not do without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Context is implied: this is the per-task stop operation, contrasted implicitly against kill_sandbox by the 'sandbox keeps running' note. However, it never says when to prefer this over get_task, cancel_service, or kill_sandbox, and lists no prerequisites beyond the auth token. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_delegated_to_meList services delegated to meARead-onlyInspect
List services other owners have delegated operator access to you — the VPS you can operate but don't own. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds the auth prerequisite ('Requires: token'), which is real behavioral context, but says nothing about result shape, volume, or pagination for what could be a long list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence followed by a short auth note; the scoping definition is front-loaded and nothing is redundant. The trailing 'Requires: token.' fragment is slightly tacked-on but small.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description adequately characterizes the returned set (services you have operator access to but do not own). Minor gap: no mention of ordering or whether the list can be paginated, which matters for an unbounded list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. No parameter-level detail is missing or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (services delegated to me) with explicit directionality — 'other owners have delegated operator access to you' — which cleanly separates it from siblings like list_delegations, delegate_service, and list_vps. An agent can pick this tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'the VPS you can operate but don't own' implies the use case well, but no explicit when/when-not guidance or named alternative (e.g. list_delegations for delegations you granted) is given. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_delegationsList delegations I grantedARead-onlyInspect
List outgoing delegations you (the owner) have granted on your services — who has operator access to what, and its status. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral content by disclosing what the listing contains ('who has operator access to what, and its status') and noting the auth requirement, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the resource, the scope, the return content, and the auth note with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read tool with no output schema, the description supplies the essential context: directionality (outgoing), what the result shows, and the token requirement. It stops short of describing pagination or result ordering, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so there is no parameter semantics to explain; the baseline for a parameterless tool is 4. Nothing in the description misrepresents or omits an input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (list) and resource (delegations) and scopes it precisely to outgoing grants 'you (the owner) have granted on your services.' This directionality clearly separates it from the sibling list_delegated_to_me, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'outgoing delegations you (the owner) have granted' implies the usage context (auditing who has access to your services), but there is no explicit when-to-use, when-not-to-use, or named alternative such as list_delegated_to_me. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_plansList VPS plansARead-onlyInspect
List all available VPS plans (catalog) with pricing, specs and the OS images each plan can 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 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. Requires: nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, so the description goes beyond them usefully: no-auth access, flat catalog scope, BYOL licensing semantics for Windows, and that automatic offers surface in `plans[].promo` and `meta.promotions`. It stops short of describing pagination or whether plan availability is regional, but the safety/behavior profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and scope, then prerequisites and usage. The price points and port speed are mildly decorative but arguably help an agent sanity-check catalog expectations; still, it's a dense single block rather than tightly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries return-shape duty and does so (`plans[]`, `plan_id` cadence, `promo`, `meta.promotions`). Combined with zero parameters and annotations covering the safety profile, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description instead documents the response shape (`plans[]` with monthly and annual `plan_id`, `promo`, `meta.promotions`), which is bonus value rather than parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource (list the VPS plan catalog), explicitly scoped to pricing, specs and bootable OS images, with the two catalog segments (Linux NAT/dedicated, Windows BYOL) called out. That 'catalog vs. existing instances' framing separates it from list_vps without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exact next action — 'Use this first to pick a `product` slug and an `os_id` for `order_vps`' — which routes the agent to the correct follow-up tool. It also declares prerequisites ('Requires: nothing', 'No authentication needed'), removing any need for a login-then-list inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sandboxesList my sandboxesARead-onlyInspect
List the account's sandboxes (running and paused) with mode, tariff, state and expiry. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds useful behavioral detail beyond them: the result set includes both running AND paused sandboxes, and it names the returned attributes (mode, tariff, state, expiry). The 'Requires: token' note flags the auth dependency that the empty parameter schema leaves unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses, front-loaded with the action and scope, with the auth requirement appended. No filler, though 'Requires: token' is terse enough to be slightly ambiguous about where the token is sourced given no token parameter exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and the included states, and annotations carry the read-only safety profile. A minor gap remains around pagination/ordering, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description appropriately adds no parameter detail and instead documents the shape of what comes back, which is the more relevant information for a no-arg tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('the account's sandboxes') and narrows scope to running and paused instances. It clearly contrasts with the singular sibling get_sandbox by implication, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implicitly clear (query the account's sandbox inventory), and it discloses the auth prerequisite 'Requires: token'. However, it gives no explicit when-to-use-vs-alternatives guidance, e.g. when to reach for get_sandbox, sandbox_pricing, or create_sandbox instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ticketsList support ticketsARead-onlyInspect
List your support tickets with status and last-message info. last_message_author: "staff" means support has replied since you last looked. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds a real auth requirement ('Requires: token') plus an interpretation of the returned field semantics for last_message_author. It does not discuss pagination or result size, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, with the auth requirement trailing. Efficient overall, though the inline last_message_author snippet is slightly cryptic without surrounding context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema list tool, the description supplies purpose, auth requirement, and value-field meaning, which is essentially all an agent needs to select and call it. Only the get_ticket routing distinction is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. There is nothing further for the description to document, and it correctly avoids inventing filter options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List your support tickets') plus the salient fields returned (status, last-message info). It implicitly distinguishes itself from the singular get_ticket sibling, but never names that sibling to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'list your support tickets' suggests a broad retrieval step, and the last_message_author note hints at a monitoring use case. There is no explicit when-to-use vs get_ticket or when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vpsList my VPSARead-onlyInspect
List the account's ACTIVE VPS services — active, provisioning, and suspended servers (deleted/cancelled are excluded). Use the id as service_id for the management tools. If a server is missing from this list it has been deleted — do not query its status or try to manage it. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, so the description usefully adds the inclusion/exclusion semantics and an auth requirement ('Requires: token'). It does not describe the response payload or ordering, but for a no-arg list tool this is solid added context rather than a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, state/scope first, then the identity mapping, then the negative guidance. Every sentence carries distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, no-output-schema list tool, the description covers scope, the key returned field, and the auth prerequisite. Only minor things like result ordering or size are unstated, which is acceptable at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description still adds cross-tool semantics by explaining that the returned `id` is the `service_id` consumed by management tools, which is meaning beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (account's VPS services) with an explicit scope definition: active, provisioning, suspended included; deleted/cancelled excluded. This clearly separates it from siblings like get_vps_status and list_sandboxes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both positive routing ('Use the `id` as `service_id` for the management tools') and an explicit when-not case ('If a server is missing from this list it has been deleted — do not query its status or try to manage it'). This prevents the agent from wasting calls on deleted resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginLog inAInspect
Log in with email + password. Returns a bearer token (reusable until token_expires_at, 1 year by default or token_ttl_days; remembered for the rest of this MCP session). NOTE: accounts created via register_account have NO password by default — keep using the token from register instead. To be able to log in later, call set_password 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).
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Required. Email of an existing account, e.g. "ops@yourcompany.com". | ||
| password | Yes | Required. Account password set earlier with set_password (accounts from register_account have none by default). | |
| token_ttl_days | No | Optional. Token lifetime in days (default 365). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only cover read-only/idempotency safety) by disclosing token lifetime semantics (default 1 year, configurable via token_ttl_days), session-scoped reuse, the 401 invalid-credentials failure mode, and the register_account-has-no-password gotcha. No contradictions with the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return value, then caveats. Slightly dense and mildly redundant (the 'register_account accounts have no password' point is stated twice), but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (the token) and how long it lasts, and it covers the main error and the account-state prerequisite. Nothing essential to calling this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters; the description still adds value by explaining what token_ttl_days controls (the token's usable lifetime and the 365-day default) and reinforcing the password prerequisite. It stops short of adding format/syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (log in) and the exact inputs (email + password) plus what it produces (a reusable bearer token). It is clearly distinguishable from siblings like register_account, set_password, and refresh_token, which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the prerequisite (a password must have been set with set_password), the alternative path (keep using your register token), and the fix (call set_password while still authenticated) for accounts created via register_account. The agent knows both when to use this and what to do instead if it can't.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
order_vpsOrder a VPSADestructiveInspect
Order a VPS. product = plan slug from list_plans; os_id = an OS id from that plan's images. Optional hostname and ssh_key (public key — strongly recommended so you get key-based root login). Optional location: "de" (Germany) or "fi" (Finland) — omit it and we pick the location automatically. Orders are never refused for capacity: if the chosen country has no free room or IPv4 right now, the paid server waits in the creation queue in that same country (get_vps_status shows queued: true) and is created automatically, usually within 24 hours; the customer gets the usual 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 applied to the first invoice and the response then carries promo. 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 → the prepaid balance covered it; the server is provisioning. Poll get_vps_status until status is active and the VM is reachable.
• paid_from_balance: false → balance was insufficient; an unpaid invoice is returned. Call pay_invoice with invoice.id: it pays from the balance if the balance now covers it, otherwise it returns a crypto checkout_url. Or topup_balance and then pay_invoice (or re-order).
Several servers in one order: quantity 2–50 → one invoice, N separate services (each with its own renewal), names -1…-N, created one after another after payment (service_ids in the response). 50 is only a typo guard — there is no limit for new accounts and no maximum by free capacity: servers that do not fit right now are queued for creation (usually within 24 hours). Promo codes apply to single-server orders paid for 1 or 12 months only. Optional addons: "backups" (Managed Backups, monthly plans only — annual plans include them) and "extra_ipv4" (a second public IPv4, dedicated-IP plans only); each 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 the same idempotency_key when you retry the same order — a repeated call returns the existing order instead of creating a second one. Requires: token + enough balance (else an unpaid invoice is returned). Never refused for capacity: no free room/IPv4 → the paid server is queued (get_vps_status queued: true, usually ready within 24 hours). 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).
| Name | Required | Description | Default |
|---|---|---|---|
| os_id | Yes | Required. OS image id from the chosen plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04). | |
| addons | No | Optional. Add-ons created automatically with each server: "backups", "extra_ipv4". | |
| months | No | Optional. 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. | |
| period | No | Optional. Billing period: "month" (default) or "year" (annual plan). Ignored when `months` or `plan_id` is given. | |
| plan_id | No | Optional. Explicit billing plan id from list_plans `plans[].plan_id`, integer, e.g. 12. Ignored when `months` is given. | |
| product | Yes | Required. Plan slug from list_plans, e.g. "nano-ip", "small" or "windows-medium-ip". | |
| ssh_key | No | 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). | |
| hostname | No | Optional. Server hostname, a valid DNS name up to 128 characters (letters, digits, dots, hyphens), e.g. "web-1". Default: generated. | |
| location | No | Optional. Server country: "de" (Germany) or "fi" (Finland). Omit for automatic placement. | |
| quantity | No | Optional. How many identical servers to order in one invoice (1–50, default 1). Servers without free room right now are queued for creation, not refused. | |
| idempotency_key | No | Optional. Retry key of 1–64 letters, digits, "-" or "_", e.g. "web1-2026-10-20". Send the same key when retrying the same order — the existing order is returned instead of creating a second one. Default: none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it explains capacity queue behavior, billing term semantics, promo application, Windows plan constraints, add-on availability, idempotency_key retry behavior, and typical errors. These are substantial behavioral details an agent would not get from the annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and uses bullets for response branching, but it is very long and repeats the capacity-queue behavior multiple times ('never refused for capacity', 'usually within 24 hours'). Much of the detail is useful, but the repetition and density make it less concise than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter financial/provisioning tool with no output schema, it covers prerequisites, payment flow, response fields, error cases, queuing, and add-on constraints thoroughly. An agent has enough information to call it correctly and interpret the main outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds real semantic value: product and os_id source relationships, months precedence and billing consequences, location omission behavior, quantity batching, add-on billing, and ssh_key/Windows exceptions. This is more than restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Order a VPS.' The description immediately distinguishes the core action from sibling reads like list_plans and get_vps_status, which it references as inputs/status checks rather than alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when ordering applies, including required inputs and the payment/queue outcomes, plus response branching to pay_invoice or topup_balance. It does not explicitly say when not to use this tool or contrast it with siblings such as create_sandbox or change_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_invoicePay an invoiceADestructiveInspect
Pay an owned, unpaid invoice. SPENDS MONEY — confirm with the human first. If the prepaid balance covers the whole invoice, it 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 and a PayRam crypto checkout_url is returned (paid_from_balance: false); the invoice settles automatically once the on-chain payment confirms. Balance top-up invoices are always paid by crypto. Safe to retry: an invoice is never charged twice (a repeat returns 409 Invoice is already paid). Requires: token. Pass invoice_id exactly as returned (a code like "2RUAWV4"). Pays from the balance if it covers the invoice; otherwise a human pays checkout_url.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | No | Optional. Invoice id exactly as returned by order_vps / topup_balance, e.g. "2RUAWV4" (a plain number is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=false) by explaining exactly what money moves, what happens when the balance is insufficient (nothing charged, checkout_url returned), the automatic server-creation side effect, and retry behavior returning 409 'Invoice is already paid'. The retry claim is in mild tension with idempotentHint=false, but is defensible because a repeat call returns an error rather than the original result, so it is not flagged as a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the two things that matter most — what it does and that it SPENDS MONEY. It is dense with parenthetical asides rather than wasteful, but the single paragraph packs several branches together, which slows scanning slightly compared to a bulleted split.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description fully compensates by naming every returned field (paid_from_balance, status, balance, checkout_url) and the 409 failure case. Nothing an agent needs to call this safely or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description reinforces the format requirement ('pass invoice_id exactly as returned, a code like "2RUAWV4"') and notes it originates from order_vps / topup_balance. It adds modest but real value about where the identifier comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope qualifiers: 'Pay an owned, unpaid invoice.' An agent can immediately distinguish it from the sibling mutators that create invoices (order_vps, topup_balance) and from read-only tools like get_balance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions and branches: confirm with the human first, invoice must be owned and unpaid, and balance top-up invoices must go through crypto rather than this path's balance branch. It also routes the agent to list_vps to observe the downstream effect, which is the correct follow-up tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
power_vpsPower controlADestructiveInspect
Power-control a VPS: start, stop or reboot. Requires: token. Typical error: 409 during the first boot (setup still running) → wait and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Required. Power action: "start", "stop" or "reboot". stop/reboot interrupt everything running on the server. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered. The description goes beyond them by disclosing the auth requirement and a concrete failure mode—a 409 during first boot when setup is still running—plus the wait-and-retry remedy, which is genuinely useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences: the operation and its actions come first, then prerequisites and the error case. No padding or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema and annotations that already cover the destructive profile, the description supplies the missing operational details (auth, first-boot 409 retry). It could still clarify whether stop/reboot are asynchronous or how the optional service_id behaves when omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum is fully documented in the schema itself, so the baseline of 3 applies. The description's enumeration of start/stop/reboot duplicates the schema's enum rather than adding format or constraint details the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Power-control') and resource ('a VPS') and enumerates the three concrete actions, so an agent instantly distinguishes it from read-oriented siblings like get_vps_status or reinstall_vps. It stops short of explicitly naming those siblings or stating the boundary between power cycling and reinstalling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumerated actions (start/stop/reboot), and the 'Requires: token' note gives an auth prerequisite. However, there is no explicit when-to-use guidance or alternative routing (e.g. check get_vps_status first, or prefer reinstall_vps when the OS is broken).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_tokenRefresh the API tokenADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| expires_in_days | No | Optional. Lifetime of the NEW token in days, integer 1–1825 (default 365). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description adds the crucial concrete consequence: the old token is revoked immediately and the caller must save the new one when using raw HTTP. It also documents the X-Token-Expires-At header and the 30-day warning, well beyond what structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core exchange-and-revoke behavior and keeps supporting detail (header, session behavior, alternatives) compact. Slight redundancy: 'REVOKES the old token immediately' and the closing 'The old token is revoked' say the same thing twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the returned fields (token, token_expires_at), the default lifetime, and the session-level consumption behavior. An agent has everything needed to call and consume this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states range 1-1825 and default 365 for expires_in_days; the description restates the same range and only marginally clarifies that the lifetime applies to the NEW token. Baseline 3 is appropriate since the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Exchange the CURRENT bearer token for a new one') and immediately disentangles itself from siblings like login and get_started by describing what it does versus what they do when the token is already expired.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when (before expiry, within the 30-day warning window), the when-not (already expired tokens cannot be refreshed), and names the alternatives for that case ('log in again (login) or create a token in the cabinet').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_accountRegister a new accountAInspect
Create a NEW EQVPS customer account (first_name, last_name, 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 that is reusable for every request until token_expires_at (1 year by default; optional token_ttl_days 1-1825) — it is NOT single-use; call refresh_token before it expires. Inside this MCP session 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> on EVERY request — a shell variable does not survive separate commands. Never call register_account again to "get a new token": that creates another, empty account. Optional backup: call set_password once, then login (email + password) returns 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.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | 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. | ||
| last_name | Yes | Required. Account holder's last name, 1+ characters, e.g. "Smith". | |
| first_name | Yes | Required. Account holder's first name, 1+ characters, e.g. "Alex". | |
| token_ttl_days | No | Optional. Token lifetime in days (default 365). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, not destructive, not idempotent), and the description adds substantial non-obvious context: token is reusable and single-use=false, 1-year default lifetime, auto-remembered inside the MCP session, must be persisted manually over raw HTTP/curl, and the 422 already-registered behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the core action and the token's reusability lead, with operational caveats after. It is long, but nearly every clause carries an actionable instruction; the only mild redundancy is the email advice and the repeated 'don't register again' warning, which overlaps the 422 note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return burden and does so fully, explaining the bearer token, its lifetime, the token_ttl_days control, and the refresh path. For a mutation tool with side effects (empty account on repeat), nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the email constraint and token_ttl_days range. The description largely restates the email advice ('no recovery, no notifications') and the TTL bound already present in the schema, adding rationale but little new syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Create a NEW EQVPS customer account', naming the required fields. It also distinguishes itself from siblings (login, set_password, refresh_token) by explaining that re-calling it creates an empty account, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when-not-to-use it (never re-register for a new token; use login if the email is already registered), names alternatives (refresh_token before expiry; set_password + login as backup), and gives the precondition 'Requires: nothing'. The 422 branch is documented with the corrective action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reinstall_vpsReinstall OSADestructiveInspect
DESTRUCTIVE — all data is lost. REQUIRES confirm = exact hostname (from get_vps_status) or 'DELETE'. Agent must explicitly confirm with the human before calling. Wipes and reinstalls the VPS with the given OS image (os_id from list_plans). Provisioning runs asynchronously; poll get_vps_status. Requires: token + confirm (hostname or DELETE). Destroys all data.
| Name | Required | Description | Default |
|---|---|---|---|
| os_id | Yes | Required. OS image id from this plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04). | |
| confirm | Yes | Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal "DELETE". ALL data is erased — ask the human first. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation: it states all data is lost, specifies the exact confirmation mechanism (hostname or DELETE), mandates human confirmation before the call, and discloses that provisioning is asynchronous and must be polled via get_vps_status. That is rich behavioral context an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the DESTRUCTIVE warning, which is the right priority, but repeats itself ('all data is lost' vs 'Destroys all data', and the confirm requirement twice), so a small amount of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema mutation tool this covers everything an agent needs: the safety gate, the confirmation format, the source of os_id, and the post-call polling behavior. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates confirm's allowed values and os_id's source, largely duplicating the schema rather than adding format or edge-case detail for os_id or service_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wipes and reinstalls) and resource (the VPS with a given OS image), and distinguishes itself from siblings like power_vps or change_plan. The destructive scope and cross-references to list_plans make the intent unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: this is destructive, requires explicit human confirmation, and the confirm value must match the exact hostname or 'DELETE'. It does not explicitly contrast against alternatives such as power_vps or change_plan, but the precondition-driven framing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_ticketReply to a support ticketAInspect
Post a reply on one of your tickets. Use the ticket code from create_ticket / list_tickets. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Required. Reply text, up to 5000 characters. | |
| ticket_code | Yes | Required. Ticket code from create_ticket / list_tickets, e.g. "K7Q2M9X". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a non-readOnly, non-idempotent, non-destructive write, so the safety profile is covered. The description adds the auth requirement ('Requires: token'), which is genuine behavioral context, but says nothing about duplicate replies despite idempotentHint=false, nor about visibility to the ticket owner.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler; the core action leads and the prerequisites follow. Efficient, though slightly terse rather than maximally informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter write with no output schema, the definition covers action, identifier source, and auth requirement. It lacks only edge-case behavior (duplicate replies, length failure handling), which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (ticket_code, message with its 5000-char limit) are already fully documented in the schema. The description only reinforces the ticket_code source, adding little beyond what the schema provides — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Post a reply on one of your tickets'), which cleanly separates it from get_ticket, create_ticket, and close_ticket. However it does not explicitly name any sibling it excludes, so differentiation is implied by the verb rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It usefully points the agent at the workflow source for the key identifier ('Use the ticket code from create_ticket / list_tickets'), which is real usage guidance. But it gives no when-to-use vs when-not conditions and no prerequisites beyond the token, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_passwordReset root passwordADestructiveInspect
Rotate the root password. The new password is applied to the LIVE VM immediately via the guest-agent (no reboot) and works within ~10-30s; the OLD password stops working. REQUIRES confirm = exact hostname (from get_vps_status) or 'DELETE'. Agent must confirm with the human before calling. Use this ONLY if the password was lost — NOT because SSH was not instant on a fresh order (a new VM needs ~60s to boot; poll get_vps_status, then reveal_password). New password is NOT in this response — read it ONCE via reveal_password; also emailed. Requires: token + confirm (hostname or DELETE). Only if the password is lost.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal "DELETE". Ask the human first. | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: the change lands on the LIVE VM via guest-agent with no reboot, takes effect in ~10-30s, the OLD password stops working, and the new password is NOT returned here (retrieve once via reveal_password; also emailed). This is exactly the operational context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the safety step is prominent, but the tail is repetitive: 'Requires: token + confirm (hostname or DELETE)' and 'Only if the password is lost' restate points already made earlier in the same description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers everything an agent needs: where the password is delivered, timing, prerequisites, and the human-confirm gate, all consistent with the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents confirm (exact hostname or 'DELETE', ask human first) and service_id. The description restates the confirm requirement but adds no new syntax or format guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Rotate the root password') and immediately scopes it as a live, no-reboot rotation of the root credential. An agent can distinguish it from siblings like set_password and reveal_password without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('ONLY if the password was lost') and when-not-to-use ('NOT because SSH was not instant on a fresh order'), with the correct alternative path spelled out (poll get_vps_status, then reveal_password). It also states the required human-confirmation step before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reveal_passwordReveal root password (once)AIdempotentInspect
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 after ~20 s. If you ordered with an SSH key, you do not need a password — log in with the key. The response is the same server detail as get_vps_status plus the password. Requires: token + a keyless VPS. Typical: password_pending=true while the VM boots — not an error, call again in 30-60 s; no password after it was shown once → reset_password.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds crucial context beyond annotations: the one-time reveal is not spent until a password is returned, pending state behavior, timing, and that the response matches get_vps_status plus the password. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior and well-organized, but it is somewhat verbose and repeats key points (e.g., 'call again in 30-60 s' and 'reset_password') in both the main text and the typical-scenario summary. Every sentence adds value, but trimming would improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and the complexity of a one-time secret reveal, the description is complete: it covers prerequisites (token, keyless VPS), return format (same as get_vps_status plus password), pending state, and recovery via reset_password.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single optional service_id parameter. The description does not add any parameter-specific meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read the root (Windows: Administrator) password of a keyless VPS'. It distinguishes the tool from siblings like reset_password and set_password by explaining the one-time reveal nature and the keyless requirement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: call again in 30-60s if password_pending, use reset_password if the password is lost, and no password is needed if an SSH key was ordered. Alternatives and exclusions are clearly named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_delegationRevoke a delegationADestructiveIdempotentInspect
Revoke a delegation by its id (owner revokes access, or a delegate declines their own). The other side is notified. Use list_delegations / list_delegated_to_me to find the id. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
| delegation_id | Yes | Required. Delegation id from list_delegations or list_delegated_to_me, integer, e.g. 31. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so safety and repeat-call behavior are covered. The description adds value beyond them by disclosing a non-obvious side effect (the other side is notified) and the auth requirement ('Requires: token'), which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with zero filler: action first, actor roles second, id discovery and auth last. Every sentence carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema mutation whose safety profile is fully covered by annotations, the description supplies the actor semantics, the id source, the auth prerequisite, and the notification side effect. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's type, requiredness, and source are already documented in the schema, so the baseline is 3. The description adds the lookup path for the id, which is mildly useful but largely redundant with the schema. No syntax, format, or boundary details (e.g. the exclusiveMinimum) are added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Revoke) and resource (a delegation), and clarifies the two legitimate actor roles: owner revoking access or a delegate declining their own delegation. An agent can distinguish this from sibling tools like accept_delegation or list_delegations without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to list_delegations / list_delegated_to_me to obtain the required id, and states the two conditions under which revocation applies. It stops short of naming the inverse/alternative action (accept_delegation) or stating when revocation is inappropriate, so it is strong context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_codeRun code in a sandboxADestructiveInspect
Run a code snippet inside a sandbox and return {exit_code, stdout, stderr, timed_out, truncated, duration_ms}. language: python (Python 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 stdin, so it cannot read stdin itself. timeout seconds (default 30, max 55 per call). LONGER JOBS: set background: true — returns a task_id immediately (timeout then defaults to the sandbox's remaining lifetime); poll get_task with the returned offsets to read new output and the exit 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 per stream for synchronous calls. Files and installed state persist between calls in the same sandbox. Requires: token + live sandbox_id. Typical: timed_out after 55 s → repeat with background: true.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Optional. Environment variables for this run only (override the ones set at create_sandbox). Example: {"DEBUG": "1"}. | |
| code | Yes | Required. Source code to run, passed to the interpreter on stdin, e.g. "print(2+2)". | |
| timeout | No | Optional. Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default). | |
| language | Yes | Required. Interpreter: "python" (Python 3.12), "node" (Node.js 22) or "bash". | |
| background | No | 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). | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/openWorld/non-idempotent, so the bar is lower, yet the description adds genuinely new behavioral facts: code is delivered on stdin so the program cannot read stdin, 1 MiB per-stream output cap for synchronous calls, sandbox keeps billing and is not idle-deleted while a task runs, and files/installed state persist across calls. It could still note whether concurrent runs in one sandbox are allowed, but coverage is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return shape, then language, then the escalation path, then behavioral caveats. Despite its length, every clause carries an actionable fact (defaults, caps, persistence, quirks) and none restates the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the exact return fields and the alternate task_id return path. Combined with requirements ('token + live sandbox_id'), timeout limits, and the background polling workflow, an agent has everything needed to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds semantics the schema lacks: timeout defaults to 30 (schema states no default), background changes the timeout ceiling to the sandbox's remaining lifetime, env overrides apply to this run only, and the stdin constraint bounds how `code` may be written.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Run a code snippet inside a sandbox') and immediately names the return shape and supported languages, which distinguishes it from the many sandbox-management siblings. An agent can tell this is the execution tool, not a lifecycle tool like create_sandbox or kill_sandbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes installs to exec_command, explains when to escalate to background: true, and gives a concrete failure-recovery rule ('timed_out after 55 s → repeat with background: true'). It also names the follow-up tools (get_task, kill_task) needed to consume a background job, leaving no routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_pricingSandbox pricing & limitsARead-onlyInspect
Public: sandbox tariffs — micro 0.25 vCPU/512 MB RAM/3 GB disk · small 0.5 vCPU/1 GB RAM/5 GB disk · standard 1 vCPU/2 GB RAM/10 GB disk · plus 2 vCPU/4 GB RAM/15 GB disk · pro 4 vCPU/8 GB RAM/20 GB disk · max 8 vCPU/16 GB RAM/40 GB disk — with per-second/hour/month prices, the billing model and limits (synchronous exec up to 55 s, background tasks longer; files up to 5 MB per transfer; runtimes: Python 3.12 + pip, Node.js 22 + npm, 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe read (readOnlyHint=true) and not open-world, so the safety profile is covered. The description adds that no authentication is needed and enumerates operational limits (55s sync exec, 5 MB transfers), but it is mostly a content dump rather than behavioral disclosure about the tool's own operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key pricing table is front-loaded and information-dense, and every spec has some value. However the description is very long, and the SDK-install paragraph is essentially promotional material rather than something needed to select or invoke the tool, so it dilutes the signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what the tool returns, and it does so thoroughly: full tariff specs, per-second/hour/month pricing, billing model, execution and file-size limits, and supported runtimes. Nothing an agent needs to call or interpret this zero-parameter tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this dimension starts at 4. The description correctly conveys that nothing is required ('Requires: nothing'), which is consistent with the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (sandbox tariffs, pricing, and limits) with enough detail (instance sizes, runtimes) that it is unmistakable against siblings like list_plans or get_order_limits. It never states an explicit verb ('returns'/'lists') and does not name a sibling it differs from, so it falls short of the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the pricing context suggests calling it before choosing a sandbox tier, and 'Requires: nothing' plus the SDK note hints at an alternative path for coders. It does not say when to prefer this over list_plans/get_order_limits or state any exclusion, leaving the agent to infer the timing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_hostnameSet hostnameAIdempotentInspect
Set the VPS hostname (valid DNS name). Applied immediately inside the 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. Requires: token, server running. Typical error: 409 agent_unavailable → start the server / wait for boot.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | 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". | |
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses the guest-agent mechanism, immediate application on Linux vs reboot-required on Windows, the 409 agent_unavailable atomic-failure guarantee, and reassures that password/SSH keys/files are untouched. This is exactly the behavioral context an agent needs before a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph front-loaded with the action, then mechanism, preconditions, safety and error. Every clause earns its place, though the stacked parentheticals make it slightly heavy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still surfaces the key response field (reboot_required: true) and covers prerequisites, failure modes and non-destructive scope. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the hostname parameter already documents the DNS-name format, length limit and an example, so the description adds little parameter meaning. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set the VPS hostname) and immediately qualifies it with the expected format (valid DNS name). An agent can distinguish it from siblings like reset_password or reinstall_vps without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (server running, guest agent active) and a remediation path for the typical failure (409 agent_unavailable → start the server / wait for boot). It does not need to name an alternative since no sibling performs this operation, which keeps it short of a 5 but genuinely helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_passwordSet account passwordAIdempotentInspect
Set a password for THIS account (the one your bearer token belongs to). Accounts from register_account have no password by default — the bearer token is the credential. Call this ONCE to enable email+password login as a recovery method in case the token is lost. Needs only the new password (min 8 chars, letters+numbers) — no current password the first time. If a password was already set, this returns 409 (use change-password instead). Requires: token. Typical error: 409 password already set → use login.
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | Required. New account password: at least 8 characters with letters and numbers, e.g. "Rainy-Harbor-2026". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the 409-on-second-call behavior, the token requirement, and that no current password is needed the first time. One minor tension: idempotentHint=true while the description says a repeat call errors with 409, which the text never reconciles (state is unchanged, but the call is not a silent no-op).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well front-loaded: the account scope and the one-time nature land in the first two sentences. Slightly over-specified at the tail, where the 409 error is stated twice ('returns 409' and again 'Typical error: 409 password already set'), which is mild redundancy rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, a fully described single parameter, and no output schema to explain, the description supplies everything needed: auth requirement, first-call-only semantics, password constraints, and the error-to-action mapping. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single param is already fully documented ('at least 8 characters with letters and numbers'). The description adds the useful clarification that there is no current-password parameter on the first call, but otherwise mirrors the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with tight scope: 'Set a password for THIS account (the one your bearer token belongs to).' It distinguishes itself from nearby siblings (register_account, login) by explaining the account's default no-password state and the credential model, so an agent can place it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Call this ONCE to enable email+password login as a recovery method'), when-not ('If a password was already set, this returns 409'), and the alternative ('use change-password instead'). This is the exact when/when-not/alternative structure a routing agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
topup_balanceTop up balanceAInspect
Create a top-up invoice and return a checkout_url (PayRam crypto checkout). The balance is credited automatically once the on-chain payment confirms. amount is in account currency (USD); minimum and maximum are enforced server-side. Only 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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Required. Top-up amount in USD (account currency), number 3–10000, e.g. 25. The checkout shows the crypto amount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the asynchronous credit flow (balance credited only after on-chain confirmation), the single-unpaid-invoice invariant, the auth requirement, and the human-in-the-loop crypto payment step. These are exactly the behavioral traits an agent could not infer from readOnlyHint=false / idempotentHint=false alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return value, and generally tight. The automatic-credit behavior is stated twice (once mid-description, once in the final sentence), which is mild redundancy but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return value (`checkout_url`) and explains what happens after the call. Required token, amount semantics, and the async confirmation path are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents the 3–10000 range, but the description adds that the amount is in account currency (USD) and that bounds are enforced server-side, clarifying failure modes not stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create a top-up invoice) and the concrete artifact returned (`checkout_url`), which cleanly separates it from read-only siblings like get_balance and from pay_invoice. An agent knows immediately what this does and what it produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions and constraints: amount in account currency, server-side min/max, one unpaid top-up at a time, requires token, and a human must complete payment. It doesn't name sibling alternatives (e.g., pay_invoice vs. this), so routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_cancelUndo a scheduled cancellationAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | No | Optional. Service code as returned by list_vps/order_vps, e.g. "68J67T5" (a plain numeric id is also accepted). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, but the description adds important behavioral context: no money moves, end_of_period never refunds, immediate cancellations are irreversible, and a 409 nothing_to_undo error is typical. These details go well beyond the annotations and are consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured and front-loads the core action before consequences, constraints, prerequisite state, and error handling. Every sentence adds distinct value, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with clear annotations and a fully documented schema, the description supplies the remaining context an agent needs: applicability conditions, financial behavior, irreversibility of the alternative, required state, and expected error. No output schema is present, and return values are not needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional service_id parameter is fully documented in the schema. The description does not add syntax, format, or behavioral detail about service_id beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: undo a scheduled cancellation for a VPS whose cancellation type is end_of_period, keeping the server active. It distinguishes scheduled cancellations from immediate ones, which is the key boundary. An agent can identify the tool's purpose and scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies exactly when the tool applies (scheduled end_of_period cancellation), when it does not (immediate cancellation cannot be undone), and what state to check first via get_vps_status. It also names a required condition and a typical error, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileUpload a file into a sandboxADestructiveIdempotentInspect
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 inline — for bigger files call get_upload_url and PUT the bytes to the link (no base64 through this chat). Optional mode like "755". Requires: token + live sandbox_id. Max 5 MB.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Optional. File permissions in octal, 3–4 digits, e.g. "644" or "755". Default: the sandbox default. | |
| path | Yes | Required. Absolute path inside the sandbox to write; parent directories are created, e.g. "/root/app/main.py". Must start with "/". | |
| content | No | Optional. File content as UTF-8 text. Give either `content` or `content_base64` (default: empty file). | |
| sandbox_id | Yes | Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. "sb_3f2a…". | |
| content_base64 | No | Optional. File content as base64 for binary files, up to 5 MB decoded. Use instead of `content`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and idempotentHint=true, and the description adds meaningful context: parent directories are auto-created, an inline size ceiling, and a required auth/sandbox-liveness precondition. It stops short of warning that an existing file at `path` is overwritten, which is exactly what the destructive hint implies and matters for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: purpose, then content choice, then size limit, then permissions, then prerequisites. Slightly redundant — 'Limit 5 MB per file inline' is restated as 'Max 5 MB' at the end, and sandbox_id is re-listed as a requirement despite being a required schema field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema the description should cover behavior, limits and prerequisites, and it does. The remaining gap is overwrite/return semantics: it never says whether an existing file is replaced or what identifier/result comes back from the write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless adds the inline 5 MB cap (not stated in the schema for `content`), reinforces the content/content_base64 mutual exclusivity, and gives a concrete `mode` example. It does not add path syntax beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write a file into the sandbox at an absolute path') and immediately scopes it with parent-directory creation and the writable targets. It also distinguishes itself from the sibling get_upload_url, so an agent can separate it from download_file/run_code without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between inline vs out-of-band upload: 'Limit 5 MB per file inline — for bigger files call get_upload_url and PUT the bytes to the link (no base64 through this chat).' It also states the content vs content_base64 selection rule and the prerequisites ('token + live sandbox_id').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiCurrent accountARead-onlyInspect
Return the authenticated account profile (id, name, email). Use to verify the bearer token is valid. Requires: token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the non-obvious behavioral detail that a bearer token is required and implies failure when it is invalid, plus lists the returned shape in the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler; the purpose, the usage hint, and the auth prerequisite are all front-loaded and each earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only identity probe with no output schema, the description covers purpose, trigger condition, prerequisite, and the returned field set. It could note error behavior on an invalid token, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description mentions only the token requirement, which is a transport-level concern rather than a schema parameter, and nothing further is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the authenticated account profile') and enumerates the fields returned (id, name, email). No sibling tool returns account identity, so an agent can route to it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to verify the bearer token is valid' gives a concrete caller-side scenario, which is more than most siblings offer. It does not name exclusions or alternatives, but none of the sibling tools overlap with identity verification, so there is little to exclude.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
37 tool updates
- Changed
accept_delegation1 field changed- added
Input schema / properties / token / descriptionAdded value: +"Required. Invitation token from the accept link in the invitation email — the long random string after `token=` in the URL, e.g. \"9f3c…e1a7\"."
- Changed
cancel_service4 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Optional. Needed only with type \"immediate\": the server's exact hostname (from get_vps_status). Ask the human first." - changed
Input schema / properties / reason / descriptionPrevious value: -"REQUIRED: why this VPS is being cancelled (e.g. project finished, too expensive, no longer needed)."New value: +"Required. Why this VPS is being cancelled (e.g. project finished, too expensive, no longer needed)." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)." - added
Input schema / properties / type / descriptionAdded value: +"Optional. \"end_of_period\" (default: runs until the paid period ends, undoable) or \"immediate\" (destroys the server and all data now)."
- Changed
change_plan3 fields changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true — you agree to the charge and one reboot."New value: +"Required. Must be true — you agree to the charge and one reboot." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)." - changed
Input schema / properties / target_plan / descriptionPrevious value: -"product_id from get_upgrade_options"New value: +"Required. Target plan `product_id` from get_upgrade_options `options[]`, integer, e.g. 11."
- Changed
close_ticket3 fields changed- added
Input schema / properties / comment / descriptionAdded value: +"Optional. Comment for the rating, up to 2000 characters. Default: none." - added
Input schema / properties / rating / descriptionAdded value: +"Optional. Support rating, integer 1–5 (5 = excellent). Default: no rating." - added
Input schema / properties / ticket_code / descriptionAdded value: +"Required. Ticket code from create_ticket / list_tickets, e.g. \"K7Q2M9X\"."
- Changed
create_sandbox5 fields changed- changed
Input schema / properties / env / descriptionPrevious value: -"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."New value: +"Optional. 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." - changed
Input schema / properties / idle_timeout / descriptionPrevious value: -"Seconds of inactivity before an ephemeral sandbox is deleted (default 300, max 3600). 0 = none (persistent only)."New value: +"Optional. Seconds of inactivity before an ephemeral sandbox is deleted (default 300, max 3600). 0 = none (persistent only)." - added
Input schema / properties / mode / descriptionAdded value: +"Optional. \"ephemeral\" (default: billed per second, minimum 60 s, auto-deleted when idle) or \"persistent\" (billed per started hour, kept up to 30 days)." - changed
Input schema / properties / tariff / descriptionPrevious value: -"Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing)."New value: +"Optional. Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing). Default \"small\"; e.g. \"plus\" for heavy pip installs." - changed
Input schema / properties / ttl / descriptionPrevious value: -"Maximum lifetime in seconds (ephemeral up to 86400, persistent up to 2592000)."New value: +"Optional. Maximum lifetime in seconds (ephemeral up to 86400, persistent up to 2592000)."
- Changed
create_ticket3 fields changed- added
Input schema / properties / message / descriptionAdded value: +"Required. Problem description, up to 5000 characters: what you did, what you expected, what happened." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)." - added
Input schema / properties / subject / descriptionAdded value: +"Required. Short ticket subject, up to 255 characters, e.g. \"SSH refused after reboot\"."
- Changed
delegate_service3 fields changed- added
Input schema / properties / email / descriptionAdded value: +"Required. Email of the person who gets operator access, e.g. \"admin@partner.org\". They receive an invitation link." - added
Input schema / properties / expires_days / descriptionAdded value: +"Optional. Access lifetime in days, integer 1–365. Default: no expiry (until revoked)." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
download_file3 fields changed- added
Input schema / properties / as_text / descriptionAdded value: +"Optional. True (default) = return `content` as UTF-8 text; false = return `content_base64` (for binary files)." - added
Input schema / properties / path / descriptionAdded value: +"Required. Absolute path inside the sandbox to read (max 5 MB), e.g. \"/root/app/main.py\". Must start with \"/\"." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."
- Changed
exec_command6 fields changed- added
Input schema / properties / background / descriptionAdded value: +"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)." - added
Input schema / properties / command / descriptionAdded value: +"Required. Shell command run as root via bash -lc; operators like &&, | and > are allowed, e.g. \"pip install requests && python app.py\"." - added
Input schema / properties / cwd / descriptionAdded value: +"Optional. Working directory, absolute path, e.g. \"/root/app\". Default \"/root\"." - changed
Input schema / properties / env / descriptionPrevious value: -"Environment variables for this command only (override the ones set at create_sandbox)."New value: +"Optional. Environment variables for this command only (override the ones set at create_sandbox). Example: {\"DEBUG\": \"1\"}." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - changed
Input schema / properties / timeout / descriptionPrevious value: -"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)."New value: +"Optional. Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)."
- Changed
get_download_url3 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Required. Absolute path inside the sandbox of the file to download, e.g. \"/root/app/main.py\". Must start with \"/\"." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - added
Input schema / properties / ttl / descriptionAdded value: +"Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min)."
- Changed
get_order_limits6 fields changed- added
Input schema / properties / addons / descriptionAdded value: +"Optional. Add-ons to price: array of \"backups\" and/or \"extra_ipv4\", e.g. [\"backups\"]. Default: none." - added
Input schema / properties / location / descriptionAdded value: +"Optional. Server country to check: \"de\" (Germany) or \"fi\" (Finland). Default: automatic placement." - added
Input schema / properties / months / descriptionAdded value: +"Optional. Billing term in months, integer 1–36 (default 1); 12 = the annual plan. Takes precedence over period/plan_id." - added
Input schema / properties / period / descriptionAdded value: +"Optional. Billing period to price: \"month\" (default) or \"year\". Ignored when `months` or `plan_id` is given." - added
Input schema / properties / plan_id / descriptionAdded value: +"Optional. Billing plan id from list_plans `plans[].plan_id`, integer, e.g. 24. Ignored when `months` is given." - added
Input schema / properties / product / descriptionAdded value: +"Required. Plan slug from list_plans, e.g. \"nano-ip\"."
- Changed
get_sandbox1 field changed- changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."
- Changed
get_task4 fields changed- changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - added
Input schema / properties / stderr_offset / descriptionAdded value: +"Optional. Byte offset in stderr to read from, integer ≥ 0 (default 0); pass `stderr_next_offset` from the previous response." - added
Input schema / properties / stdout_offset / descriptionAdded value: +"Optional. Byte offset in stdout to read from, integer ≥ 0 (default 0); pass `stdout_next_offset` from the previous response." - changed
Input schema / properties / task_id / descriptionPrevious value: -"Task id returned by run_code / exec_command with background: true."New value: +"Required. Task id returned by run_code / exec_command with background: true."
- Changed
get_ticket1 field changed- added
Input schema / properties / ticket_code / descriptionAdded value: +"Required. Ticket code from create_ticket / list_tickets (field `id`/`code`), e.g. \"K7Q2M9X\"."
- Changed
get_upgrade_options1 field changed- changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
get_upload_url4 fields changed- added
Input schema / properties / max_bytes / descriptionAdded value: +"Optional. Maximum size of the uploaded file in bytes, integer 1–2147483648 (2 GB). Default: the server limit (2 GB)." - added
Input schema / properties / path / descriptionAdded value: +"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 \"/\"." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - added
Input schema / properties / ttl / descriptionAdded value: +"Optional. Link lifetime in seconds, 60–3600 (default 900 = 15 min)."
- Changed
get_vps_metrics2 fields changed- changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)." - added
Input schema / properties / timeframe / descriptionAdded value: +"Optional. Time window: \"hour\" (default), \"day\", \"week\" or \"month\"."
- Changed
get_vps_status2 fields changed- added
Input schema / properties / reveal / descriptionAdded value: +"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." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
kill_sandbox1 field changed- changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."
- Changed
kill_task2 fields changed- changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - changed
Input schema / properties / task_id / descriptionPrevious value: -"Task id returned by run_code / exec_command with background: true."New value: +"Required. Task id returned by run_code / exec_command with background: true."
- Changed
login3 fields changed- added
Input schema / properties / email / descriptionAdded value: +"Required. Email of an existing account, e.g. \"ops@yourcompany.com\"." - added
Input schema / properties / password / descriptionAdded value: +"Required. Account password set earlier with set_password (accounts from register_account have none by default)." - changed
Input schema / properties / token_ttl_days / descriptionPrevious value: -"Token lifetime in days (default 365)."New value: +"Optional. Token lifetime in days (default 365)."
- Changed
order_vps11 fields changed- changed
Input schema / properties / addons / descriptionPrevious value: -"Optional add-ons created automatically with each server: \"backups\", \"extra_ipv4\"."New value: +"Optional. Add-ons created automatically with each server: \"backups\", \"extra_ipv4\"." - added
Input schema / properties / hostname / descriptionAdded value: +"Optional. Server hostname, a valid DNS name up to 128 characters (letters, digits, dots, hyphens), e.g. \"web-1\". Default: generated." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional key (letters, digits, - and _). Repeat it when retrying the same order so no second order is created."New value: +"Optional. Retry key of 1–64 letters, digits, \"-\" or \"_\", e.g. \"web1-2026-10-20\". Send the same key when retrying the same order — the existing order is returned instead of creating a second one. Default: none." - changed
Input schema / properties / location / descriptionPrevious value: -"Optional server country: \"de\" (Germany) or \"fi\" (Finland). Omit for automatic placement."New value: +"Optional. Server country: \"de\" (Germany) or \"fi\" (Finland). Omit for automatic placement." - changed
Input schema / properties / months / descriptionPrevious value: -"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."New value: +"Optional. 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." - added
Input schema / properties / os_id / descriptionAdded value: +"Required. OS image id from the chosen plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04)." - added
Input schema / properties / period / descriptionAdded value: +"Optional. Billing period: \"month\" (default) or \"year\" (annual plan). Ignored when `months` or `plan_id` is given." - added
Input schema / properties / plan_id / descriptionAdded value: +"Optional. Explicit billing plan id from list_plans `plans[].plan_id`, integer, e.g. 12. Ignored when `months` is given." - added
Input schema / properties / product / descriptionAdded value: +"Required. Plan slug from list_plans, e.g. \"nano-ip\", \"small\" or \"windows-medium-ip\"." - changed
Input schema / properties / quantity / descriptionPrevious value: -"How many identical servers to order in one invoice (1–50, default 1). Servers without free room right now are queued for creation, not refused."New value: +"Optional. How many identical servers to order in one invoice (1–50, default 1). Servers without free room right now are queued for creation, not refused." - added
Input schema / properties / ssh_key / descriptionAdded value: +"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)."
- Changed
pay_invoice1 field changed- changed
Input schema / properties / invoice_id / descriptionPrevious value: -"Invoice id exactly as returned by order_vps / topup_balance, e.g. \"2RUAWV4\" (a plain number is also accepted)."New value: +"Optional. Invoice id exactly as returned by order_vps / topup_balance, e.g. \"2RUAWV4\" (a plain number is also accepted)."
- Changed
power_vps2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Required. Power action: \"start\", \"stop\" or \"reboot\". stop/reboot interrupt everything running on the server." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
refresh_token1 field changed- added
Input schema / properties / expires_in_days / descriptionAdded value: +"Optional. Lifetime of the NEW token in days, integer 1–1825 (default 365)."
- Changed
register_account4 fields changed- added
Input schema / properties / email / descriptionAdded value: +"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." - added
Input schema / properties / first_name / descriptionAdded value: +"Required. Account holder's first name, 1+ characters, e.g. \"Alex\"." - added
Input schema / properties / last_name / descriptionAdded value: +"Required. Account holder's last name, 1+ characters, e.g. \"Smith\"." - changed
Input schema / properties / token_ttl_days / descriptionPrevious value: -"Token lifetime in days (default 365)."New value: +"Optional. Token lifetime in days (default 365)."
- Changed
reinstall_vps3 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal \"DELETE\". ALL data is erased — ask the human first." - added
Input schema / properties / os_id / descriptionAdded value: +"Required. OS image id from this plan's `available_os` in list_plans, integer, e.g. 4 (Ubuntu 24.04)." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
reply_ticket2 fields changed- added
Input schema / properties / message / descriptionAdded value: +"Required. Reply text, up to 5000 characters." - added
Input schema / properties / ticket_code / descriptionAdded value: +"Required. Ticket code from create_ticket / list_tickets, e.g. \"K7Q2M9X\"."
- Changed
reset_password2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Required. Safety confirmation: the server's exact hostname (from get_vps_status) or the literal \"DELETE\". Ask the human first." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Added
reveal_password - Changed
revoke_delegation1 field changed- added
Input schema / properties / delegation_id / descriptionAdded value: +"Required. Delegation id from list_delegations or list_delegated_to_me, integer, e.g. 31."
- Changed
run_code6 fields changed- added
Input schema / properties / background / descriptionAdded value: +"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)." - added
Input schema / properties / code / descriptionAdded value: +"Required. Source code to run, passed to the interpreter on stdin, e.g. \"print(2+2)\"." - changed
Input schema / properties / env / descriptionPrevious value: -"Environment variables for this run only (override the ones set at create_sandbox)."New value: +"Optional. Environment variables for this run only (override the ones set at create_sandbox). Example: {\"DEBUG\": \"1\"}." - added
Input schema / properties / language / descriptionAdded value: +"Required. Interpreter: \"python\" (Python 3.12), \"node\" (Node.js 22) or \"bash\"." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"." - changed
Input schema / properties / timeout / descriptionPrevious value: -"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)."New value: +"Optional. Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)."
- Changed
set_hostname2 fields changed- added
Input schema / properties / hostname / descriptionAdded value: +"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\"." - changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
set_password1 field changed- added
Input schema / properties / password / descriptionAdded value: +"Required. New account password: at least 8 characters with letters and numbers, e.g. \"Rainy-Harbor-2026\"."
- Changed
topup_balance1 field changed- added
Input schema / properties / amount / descriptionAdded value: +"Required. Top-up amount in USD (account currency), number 3–10000, e.g. 25. The checkout shows the crypto amount."
- Changed
undo_cancel1 field changed- changed
Input schema / properties / service_id / descriptionPrevious value: -"Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."New value: +"Optional. Service code as returned by list_vps/order_vps, e.g. \"68J67T5\" (a plain numeric id is also accepted)."
- Changed
upload_file5 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Optional. File content as UTF-8 text. Give either `content` or `content_base64` (default: empty file)." - added
Input schema / properties / content_base64 / descriptionAdded value: +"Optional. File content as base64 for binary files, up to 5 MB decoded. Use instead of `content`." - added
Input schema / properties / mode / descriptionAdded value: +"Optional. File permissions in octal, 3–4 digits, e.g. \"644\" or \"755\". Default: the sandbox default." - added
Input schema / properties / path / descriptionAdded value: +"Required. Absolute path inside the sandbox to write; parent directories are created, e.g. \"/root/app/main.py\". Must start with \"/\"." - changed
Input schema / properties / sandbox_id / descriptionPrevious value: -"Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."New value: +"Required. Sandbox id as returned by create_sandbox / list_sandboxes, e.g. \"sb_3f2a…\"."
2 tool updates
- Changed
get_order_limits1 field changed- added
Input schema / properties / monthsAdded value: +{ + "maximum": 36, + "minimum": 1, + "type": "integer" +}
- Changed
order_vps1 field changed- added
Input schema / properties / monthsAdded value: +{ + "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" +}
1 tool update
- Changed
order_vps2 fields changed- changed
Input schema / properties / quantity / descriptionPrevious value: -"How many identical servers to order in one invoice (1–10, default 1). Check get_order_limits for the current maximum."New value: +"How many identical servers to order in one invoice (1–50, default 1). Servers without free room right now are queued for creation, not refused." - changed
Input schema / properties / quantity / maximumPrevious value: -10New value: +50
2 tool updates
- Added
get_order_limits - Changed
order_vps3 fields changed- added
Input schema / properties / addonsAdded value: +{ + "description": "Optional add-ons created automatically with each server: \"backups\", \"extra_ipv4\".", + "items": { + "enum": [ + "backups", + "extra_ipv4" + ], + "type": "string" + }, + "maxItems": 2, + "type": "array" +} - added
Input schema / properties / idempotency_keyAdded value: +{ + "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" +} - added
Input schema / properties / quantityAdded value: +{ + "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" +}
3 tool updates
- Changed
create_sandbox1 field changed- added
Input schema / properties / envAdded value: +{ + "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" +}
- Changed
exec_command1 field changed- added
Input schema / properties / envAdded value: +{ + "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
run_code1 field changed- added
Input schema / properties / envAdded value: +{ + "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" +}
15 tool updates
- Added
change_plan - Changed
create_sandbox2 fields changed- added
Input schema / properties / tariff / descriptionAdded value: +"Tariff: micro | small | standard | plus | pro | max (see sandbox_pricing)." - changed
Input schema / properties / tariff / enumPrevious value: -[ - "micro", - "small", - "std" -]New value: +[ + "micro", + "small", + "standard", + "plus", + "pro", + "max" +]
- Changed
exec_command3 fields changed- added
Input schema / properties / backgroundAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / timeout / descriptionAdded value: +"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)." - removed
Input schema / properties / timeout / maximumRemoved value: -55
- Added
get_download_url - Added
get_started - Added
get_task - Added
get_upgrade_options - Added
get_upload_url - Added
kill_task - Changed
login1 field changed- added
Input schema / properties / token_ttl_daysAdded value: +{ + "description": "Token lifetime in days (default 365).", + "maximum": 1825, + "minimum": 1, + "type": "integer" +}
- Changed
pay_invoice5 fields changed- added
Input schema / properties / invoice_id / descriptionAdded value: +"Invoice id exactly as returned by order_vps / topup_balance, e.g. \"2RUAWV4\" (a plain number is also accepted)." - removed
Input schema / properties / invoice_id / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / invoice_id / minLengthAdded value: +1 - changed
Input schema / properties / invoice_id / typePrevious value: -"integer"New value: +"string" - removed
Input schema / requiredRemoved value: -[ - "invoice_id" -]
- Added
refresh_token - Changed
register_account1 field changed- added
Input schema / properties / token_ttl_daysAdded value: +{ + "description": "Token lifetime in days (default 365).", + "maximum": 1825, + "minimum": 1, + "type": "integer" +}
- Changed
run_code4 fields changed- added
Input schema / properties / backgroundAdded value: +{ + "type": "boolean" +} - changed
Input schema / properties / language / enumPrevious value: -[ - "python", - "bash" -]New value: +[ + "python", + "node", + "bash" +] - added
Input schema / properties / timeout / descriptionAdded value: +"Seconds. Synchronous: max 55. With background: true: up to the sandbox's remaining lifetime (default)." - removed
Input schema / properties / timeout / maximumRemoved value: -55
- Added
undo_cancel
9 tool updates
- Added
create_sandbox - Added
download_file - Added
exec_command - Added
get_sandbox - Added
kill_sandbox - Added
list_sandboxes - Added
run_code - Added
sandbox_pricing - Added
upload_file
1 tool update
- Changed
order_vps1 field changed- added
Input schema / properties / locationAdded value: +{ + "description": "Optional server country: \"de\" (Germany) or \"fi\" (Finland). Omit for automatic placement.", + "enum": [ + "de", + "fi" + ], + "type": "string" +}
1 tool update
- Changed
order_vps2 fields changed- added
Input schema / properties / periodAdded value: +{ + "enum": [ + "month", + "year" + ], + "type": "string" +} - added
Input schema / properties / plan_idAdded value: +{ + "exclusiveMinimum": 0, + "type": "integer" +}
Related MCP Connectors
No-KYC offshore hosting an AI agent runs end-to-end: no-email signup, crypto, VPS, deploy, Tor.
No-KYC managed MCP for AI agents: sandboxed TypeScript trading SDK, isolated sub-accounts, futures.
Pay-per-call x402 MCP for AI agents: 35 tools, USDC on Base, from $0.001/call, no API keys.
9 remote MCP servers on Cloudflare Workers for AI agents. Free tier + Pro API keys.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvision KYC-free, crypto-paid Nordic VPS and dedicated servers from any AI agent. Enables natural language hosting workflows including comparison, top-up, and provisioning of anonymous servers.MIT
- AlicenseAqualityCmaintenanceMCP server enabling AI agents to purchase VPS and blockchain node products using USDC on Base via Easy Node's x402 API.714 npm7Business Source 1.1
- AlicenseBqualityDmaintenanceMCP server offering 26 Lightning-paid tools for Bitcoin mempool intelligence and sovereign on-prem AI inference, with no third-party APIs and pay-per-call in sats.2639 npm1MIT
- AlicenseBqualityFmaintenanceAn MCP server providing 22 pay-per-call utility tools for AI agents (scrape, validate, embed, store, moderate, notify, convert, prevent loops) without accounts or API keys, using USDC payments via the x402 protocol.1775 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.