Skip to main content
Glama
InstaNode-dev

instanode-mcp

Official

instanode-mcp

MCP server for instanode.dev. Lets AI coding agents (Claude Code, Cursor, Windsurf, Continue, etc.) provision the full bundle of ephemeral developer infrastructure over HTTPS — no Docker, no signup required for the free anonymous tier.

One tool call per resource type, each returning a drop-in connection string:

  • Postgres (create_postgres) → postgres://... with pgvector pre-installed

  • Redis (create_cache) → redis://... with ACL-scoped user + namespace

  • MongoDB (create_nosql) → mongodb://... with role scoped to the DB

  • NATS JetStream (create_queue) → nats://... with scoped subject namespace

  • S3-compatible storage (create_storage) → endpoint + keys + prefix (backed by DigitalOcean Spaces)

  • Webhook receiver (create_webhook) → public URL that stores every inbound request

  • Container deployment (create_deploy) → upload a base64 gzip tarball (Dockerfile + source), get back a public URL in ~30s. Bind any of the resources above by passing their tokens as resource_bindings — the API resolves tokens to connection URLs server-side.

  • Multi-service stack (create_stack) → declare 1..N services in an instant.yaml manifest, ship them as a bundle in a single MCP call. Anonymous callers get a 6h-TTL stack with a live URL on *.deployment.instanode.dev — no card required. Cross-service refs (service://<name>) resolve cluster-internally at deploy time. Poll status with get_stack.

Every anonymous resource auto-expires in 24h. The provision response carries a note and upgrade field — the MCP server surfaces both verbatim so the agent can show the user the exact CTA + claim URL needed to keep the resource permanently. Run claim_resource on the returned upgrade_jwt to get the dashboard claim URL.

Install

Claude Code

claude mcp add instanode -- npx -y instanode-mcp@latest

To authenticate (unlock paid-tier limits and the account-management tools):

claude mcp add instanode \
  --env INSTANODE_TOKEN=<paste from https://instanode.dev/dashboard> \
  -- npx -y instanode-mcp@latest

Cursor

Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):

{
  "mcpServers": {
    "instanode": {
      "command": "npx",
      "args": ["-y", "instanode-mcp@latest"],
      "env": {
        "INSTANODE_TOKEN": "<optional — paste from dashboard for paid tier>"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "instanode": {
      "command": "npx",
      "args": ["-y", "instanode-mcp@latest"],
      "env": {
        "INSTANODE_TOKEN": "<optional>"
      }
    }
  }
}

Continue.dev

Add to your ~/.continue/config.yaml:

mcpServers:
  - name: instanode
    command: npx
    args: ["-y", "instanode-mcp@latest"]
    env:
      INSTANODE_TOKEN: "<optional>"

For a drop-in CLAUDE.md / .cursorrules that tells the agent exactly when to reach for this MCP, see https://instanode.dev/agent.html.

Related MCP server: Nexlayer MCP

Environment

Variable

Required

Default

Purpose

INSTANODE_TOKEN

No

—

Bearer JWT minted at https://instanode.dev/dashboard. Required for list_resources, claim_token, delete_resource, get_api_token, and all deploy tools (create_deploy, list_deployments, get_deployment, redeploy, delete_deployment). Unlocks paid-tier limits on every create_*.

INSTANODE_API_URL

No

https://api.instanode.dev

Override the API base URL. Only set this for local development against a k3s cluster.

INSTANODE_DASHBOARD_URL

No

https://instanode.dev

Override the dashboard host that claim_resource builds claim URLs against. Only set this for staging.

Tools

Tool

Description

create_postgres

POST /db/new — Provision a Postgres database (pgvector included). Returns connection_url + the note/upgrade claim URL. name required.

create_vector

POST /vector/new — Provision a pgvector-enabled Postgres database (embedding store). Returns connection_url + extension/dimensions + note/upgrade. name required; optional dimensions is a documentation hint.

create_cache

POST /cache/new — Provision a Redis cache (ACL-scoped user + namespace). Returns connection_url + note/upgrade. name required.

create_nosql

POST /nosql/new — Provision a MongoDB database (per-resource user + DB-scoped role). Returns connection_url + note/upgrade. name required.

create_queue

POST /queue/new — Provision a NATS JetStream queue (scoped subject namespace). Returns connection_url + note/upgrade. name required.

create_storage

POST /storage/new — Provision an S3-compatible bucket prefix (DigitalOcean Spaces). Returns endpoint, access keys, prefix + note/upgrade. name required.

create_webhook

POST /webhook/new — Provision an inbound webhook receiver URL. Returns receive_url + note/upgrade. name required.

create_deploy

POST /deploy/new — Upload a base64 gzip tarball (with Dockerfile) and deploy a container. Returns deploy_id, status, url, build_logs_url. name required. Pass redeploy: true (with the SAME name) to update an existing deployment IN PLACE (same app_id + URL). Requires INSTANODE_TOKEN.

create_stack

POST /stacks/new — Multi-service bundle. Upload an instant.yaml manifest plus one base64 gzip tarball per service; returns stack_id, per-service URLs, and the 6h-TTL claim block on the anonymous tier. Anonymous-friendly (the wedge). name, manifest, service_tarballs required.

get_stack

GET /stacks/{stack_id} — Poll a stack's per-service status + URLs. Anonymous-friendly. stack_id required.

list_deployments

GET /api/v1/deployments — List all deployments on the caller's team. Requires INSTANODE_TOKEN.

get_deployment

GET /api/v1/deployments/:id — Fetch one deployment (poll until status="running"). Requires INSTANODE_TOKEN.

get_deployment_events

GET /api/v1/deployments/:id/events — Read the failure-timeline autopsy for a deployment (kind/reason/exit_code/event/last_lines/hint/created_at, newest first) so an agent can self-correct a broken Dockerfile. Optional limit. Requires INSTANODE_TOKEN.

redeploy

POST /deploy/:id/redeploy — Push updated code to an existing deployment BY ID. Same URL, new build. Requires tarball_base64 (same shape as create_deploy) — the api never reuses the original tarball. For the more common "update by name" path prefer create_deploy({ name, redeploy: true, tarball_base64 }). Requires INSTANODE_TOKEN.

delete_deployment

DELETE /deploy/:id — Tear down a running deployment. Irreversible. Requires INSTANODE_TOKEN.

claim_resource

Helper — turn an upgrade_jwt from any create_* response into the dashboard claim URL the user should click. No API call. No auth required.

claim_token

POST /claim — Programmatic claim: attach an anonymous resource to the authenticated account using its upgrade_jwt + email. No auth required.

list_resources

GET /api/v1/resources — List resources on the caller's account. Requires INSTANODE_TOKEN.

delete_resource

DELETE /api/v1/resources/{token} — Hard-delete a resource you own. Paid tier only. Requires INSTANODE_TOKEN.

get_api_token

POST /api/v1/auth/api-keys — Mint a fresh bearer Personal Access Token (PAT). Requires an existing user-session INSTANODE_TOKEN (PATs cannot mint other PATs — the API returns 403 in that case).

get_capabilities

GET /api/v1/capabilities — Read the live per-tier capability matrix (storage / connection / resource-count / deployment caps, pricing, backup + RPO/RTO promises) in upgrade order so an agent can plan a provision before a call 402s. Auth optional (public discovery surface).

set_vault_key

PUT /api/v1/vault/{env}/{key} — Write a secret to the team vault (always a new version). Reference it from a deploy as vault://{env}/{key} in env_vars; the API decrypts it at deploy time. Vault is paid (Hobby+ = 20 entries, Pro/Team = unlimited; Hobby/Pro restrict env to production). Requires INSTANODE_TOKEN.

rotate_vault_key

POST /api/v1/vault/{env}/{key}/rotate — Rotate a vault secret's value (new version, recorded under a distinct audit action). Redeploy referencing apps to apply. Requires INSTANODE_TOKEN.

update_deploy_env

PATCH /deploy/{id}/env — Merge env vars into an existing deployment (incoming wins; values may be vault://env/KEY refs). Returns the merged map with secrets redacted. Redeploy to apply. Requires INSTANODE_TOKEN.

update_stack_env

PATCH /stacks/{slug}/env — Merge env vars into an existing stack (row-locked; an empty-string value deletes a key). Redeploy the stack to apply. Requires INSTANODE_TOKEN.

presign_storage

POST /storage/{token}/presign — Mint a short-lived (≤1h) presigned S3 URL (GET/PUT/HEAD) scoped to a storage prefix. Auth is the storage token in the path — works for anonymous-tier storage. DELETE is not offered (a leaked URL must not wipe a prefix).

pause_resource

POST /api/v1/resources/{id}/pause — Suspend a resource without deleting it (storage + connection URL preserved; new connections refused). Pro tier or higher. Requires INSTANODE_TOKEN.

resume_resource

POST /api/v1/resources/{id}/resume — Un-pause a resource (same connection URL keeps working). Pro tier or higher. Requires INSTANODE_TOKEN.

rotate_credentials

POST /api/v1/resources/{id}/rotate-credentials — Rotate a resource's password; returns the NEW connection_url in plaintext (host + DB unchanged). Locks out a leaked old URL. Requires INSTANODE_TOKEN.

wake_deployment

POST /deploy/{id}/wake — Explicitly wake a scaled-to-zero deployment (scales to 1 replica; cold-start before serving). Flag-gated on the platform: returns 501 scale_to_zero_disabled when the feature is off. Requires INSTANODE_TOKEN.

Container deployment (create_deploy)

Deploying is a single multipart/form-data POST with a base64-encoded gzip tarball of the project (Dockerfile + source). The MCP tool handles the encoding plumbing; the agent's job is just to construct the tarball.

Building the tarball (any language):

import base64, subprocess
tar = subprocess.check_output(["tar", "czf", "-", "-C", project_dir, "."])
tarball_base64 = base64.b64encode(tar).decode()
import { execFileSync } from "node:child_process";
const tar = execFileSync("tar", ["czf", "-", "-C", projectDir, "."]);
const tarball_base64 = tar.toString("base64");

Cap: 50 MB after decode. Honor .dockerignore — only ship what docker build needs. The name field is required (1–64 chars, letters/numbers/spaces/dashes) — it's the human-readable label shown on the dashboard.

Binding provisioned resources:

Provision the resources first with create_postgres / create_cache / etc. to get their tokens (UUIDs), then pass the tokens as resource_bindings:

{
  "tarball_base64": "...",
  "name": "my-app",
  "port": 8080,
  "resource_bindings": {
    "DATABASE_URL": "<token from create_postgres>",
    "REDIS_URL":    "<token from create_cache>"
  }
}

The agent passes resource tokens (not connection URLs); the API resolves each token to its connection URL server-side at deploy time. The MCP server never pre-resolves tokens — pre-resolving would round-trip every binding through GET /credentials and embed raw secrets into the tool params, which the agent host may log.

Polling:

create_deploy returns status="building" immediately. Poll get_deployment({ id: deploy_id }) every few seconds until status flips to "running" (typical: ~30s). At that point the url field is the live URL.

Updating an existing deployment (same URL, new build)

To ship v2 of an app you already deployed without changing the URL or app_id, call create_deploy again with the same name plus redeploy: true:

{
  "tarball_base64": "...",
  "name": "my-app",
  "redeploy": true
}

The api finds the existing deployment by (team_id, name) and updates it in place — same app_id, same *.deployment.instanode.dev URL, status flips back to building while the new image rolls out.

Without redeploy: true, calling create_deploy with a name you've used before mints a new app_id and a new URL (the legacy behaviour). This is the trap that caused the AGENT-UX issue where agents ended up with two live deployments + two URLs for the same app.

The standalone redeploy tool (by id, not name) still works and also requires a tarball_base64 — the api never reuses the original tarball. Prefer the create_deploy({ name, redeploy: true }) path when you have the name; use redeploy({ id, tarball_base64 }) when you only have the deploy id.

Private deploys

Set private: true and pass allowed_ips to restrict access to specific IPs or CIDR blocks at the Ingress. Useful when the agent is asked to deploy a CRM, internal dashboard, or staging app that should only be reachable by the user.

Pro tier or higher required. Hobby callers will see HTTP 402 with an agent_action field — the MCP server surfaces the upgrade URL so the agent can prompt the user to upgrade.

Example prompt (paste into Claude Code):

"Deploy my CRM as a private app, only accessible from 1.2.3.4 and my office subnet 10.0.0.0/8"

The agent will then call:

{
  "tarball_base64": "...",
  "name": "my-crm",
  "private": true,
  "allowed_ips": ["1.2.3.4", "10.0.0.0/8"]
}

get_deployment and list_deployments surface private + allowed_ips back to the agent so it can confirm the policy to the user. To turn a private deploy public, redeploy without the flags.

How anonymous → claimed works

Every create_* tool returns three fields the agent should treat as load-bearing:

  • token — the resource UUID (used for claim_token and delete_resource).

  • note — a one-sentence human-readable CTA, already mentions the upgrade URL.

  • upgrade — the full claim URL (https://instanode.dev/start?t=<jwt>). The user clicks it, signs in with GitHub/Google or a magic link, and the resource is attached to their account.

upgrade_jwt is also returned for callers that want to build their own UI around the claim flow. The claim_resource tool accepts that JWT and returns the same dashboard URL — useful if the agent wants to re-surface the claim URL later in the conversation after the original response has scrolled out of context.

Example agent interactions

1. "I need a Postgres for this project"

You: Claude, I need a Postgres database for this project.

Claude: calls create_postgres({ name: "my-side-project" })

Returns a connection_url like postgres://usr_a1b2:...@pg.instanode.dev:5432/db_a1b2?sslmode=require, plus note: "Works for 24h free. Claim to keep — from $9/mo: https://instanode.dev/start?t=...".

Claude then: writes DATABASE_URL=... to .env, adds .env to .gitignore, runs the migrations, and shows the user the claim URL verbatim so they know how to keep the database past 24h.

2. "Spin up a Redis cache for rate limiting"

You: Add a Redis cache so I can rate-limit my API.

Claude: calls create_cache({ name: "api-ratelimit" })

Returns a connection_url like redis://usr_b2c3:...@redis.instanode.dev:6379/0.

3. "Set up a webhook to catch Stripe events"

You: Give me a webhook URL I can point Stripe at.

Claude: calls create_webhook({ name: "stripe-sandbox" })

Returns a receive_url that captures every request. curl $receive_url pulls back the stored log.

4. "Object storage for user uploads"

You: I need S3-compatible storage for uploaded avatars.

Claude: calls create_storage({ name: "user-avatars" })

Returns endpoint, access key, secret key, and prefix. Claude wires the AWS SDK with the returned credentials.

5. "Make last night's database permanent"

You: I want to keep the database you made yesterday past 24h.

Claude (no INSTANODE_TOKEN): calls claim_resource({ upgrade_jwt: "<the upgrade_jwt from yesterday's response>" }) → shows you the dashboard claim URL. You click it, sign in, the resource is attached.

Claude (with INSTANODE_TOKEN): calls claim_token({ token: "a1b2c3d4-..." }) → resource is now linked to the authenticated account, no browser round-trip needed.

Authentication

The anonymous tier works without any setup. To unlock paid limits, permanent resources, and the account-management tools (list_resources, delete_resource, claim_token, get_api_token):

  1. Sign up at https://instanode.dev with GitHub.

  2. Visit the dashboard and copy your bearer token.

  3. Set it as INSTANODE_TOKEN in the MCP server's env block (see examples above).

Rotate any time by calling get_api_token, which mints a fresh Personal Access Token via POST /api/v1/auth/api-keys. PATs are revocation-based (not time-bound). NOTE: PATs cannot mint other PATs — get_api_token requires a user-session token (sign in via the dashboard), not an existing PAT, otherwise the API returns 403.

Development

npm install
npm run build
# Integration test (optional — requires a running instanode.dev server.
# For local k8s, port-forward first: kubectl port-forward -n instant svc/instant-api 8080:8080):
INSTANODE_API_URL=http://localhost:8080 npm test

License

MIT — (c) instanode.dev

Available Tools

31 tools
claim_resourceA

Turn an anonymous resource's upgrade JWT into the API claim URL the agent should direct the user to. NO API call — pure helper: builds https://api.instanode.dev/start?t= from the JWT the create_* tools return in the 'upgrade_jwt' field. /start issues a 302 redirect to the dashboard's /claim page, which drives the email login.

Use this when:

  1. You just provisioned an anonymous resource via create_postgres / create_cache / etc.

  2. The user wants to keep it past 24h (upgrade to a paid plan, or just claim it on a free authenticated account so it's visible on their dashboard).

  3. You want to give them a single clickable URL rather than a long JWT string.

The MCP server cannot complete the claim for the user — it requires a browser session for OAuth login. Show the URL and tell the user to click it.

If you (the agent) already have the user's email and the upgrade JWT, use 'claim_token' instead to claim programmatically (POST /claim).

ParametersJSON Schema
NameRequiredDescriptionDefault
upgrade_jwtYesThe 'upgrade_jwt' field returned by any create_* tool (or the raw JWT from the 'upgrade' URL). Required.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses that this is a pure helper (no API call), the URL structure, that /start issues a 302 redirect to dashboard /claim page, and explicitly states the MCP server cannot complete the claim—it requires a browser session. All behavioral traits are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points for usage guidelines, front-loaded with purpose. Every sentence is informative and necessary. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the tool is simple and the description covers input, behavior, limitations, and how to present the result. For a helper tool returning a URL, this is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds extra context beyond the schema: clarifies the JWT comes from create_* tools' 'upgrade_jwt' field or raw JWT from 'upgrade' URL, and emphasizes it is required. This adds meaningful value, raising the score to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it transforms a JWT into a claim URL, explicitly calling it a pure helper that builds a URL from the JWT. It distinguishes itself from sibling tools like claim_token (programmatic) and create_* tools (provisioning) by specifying its unique purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use conditions: after provisioning, user wants to keep resource past 24h, or wants a clickable URL. Also gives a when-not-to-use: if agent has user's email and JWT, use claim_token instead. This is comprehensive guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_tokenA

Convert an anonymous upgrade JWT into a claimed team programmatically (POST /claim). Same flow the dashboard's /claim page drives — but lets an agent that already knows the user's email skip the browser round-trip.

The 'upgrade_jwt' is the JWT returned in the upgrade_jwt field of any create_* tool response (NOT the per-resource UUID token). It can also be extracted from the 't=' query param of the upgrade URL.

On success the API creates (or attaches to) the user's team, links every anonymous resource issued under that JWT, and returns a 24h session token. The session token isn't returned to the agent here — use 'get_api_token' or have the user mint one in the dashboard to authenticate future MCP calls.

If you don't have the user's email yet, use 'claim_resource' instead to get a URL the user can click in their browser.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesUser's email address. The team will be created or matched against this email.
upgrade_jwtYesThe 'upgrade_jwt' field returned by any create_* tool (or the raw JWT from the 'upgrade' URL). Required.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behaviors: the tool creates/attaches to the user's team, links anonymous resources, returns a 24-hour session token (not to the agent), and requires subsequent authentication via 'get_api_token'. It also clarifies what the upgrade_jwt is not (per-resource UUID). While rate limits or idempotency are not mentioned, the description covers the most important behavioral aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It front-loads the main purpose, then provides essential details about the flow, constraints, and alternatives. Every sentence adds value; there is no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters and no output schema, the description provides complete context: it explains the input parameters, the process (team creation, resource linking), the output (session token, but not returned to agent), and follow-up actions ('get_api_token' or dashboard). It also covers error handling implicitly by mentioning the alternative tool when email is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already describes both parameters. However, the description adds value by explaining the source of 'upgrade_jwt' (from create_* tool responses or the 't=' query param) and clarifying 'email' leads to team creation/matching. This goes beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Convert an anonymous upgrade JWT into a claimed team programmatically (POST /claim).' It specifies the endpoint, the input (JWT), and the outcome. It also distinguishes itself from the sibling tool 'claim_resource' by mentioning an alternative when the user's email is unavailable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: use this tool when you have the user's email; otherwise use 'claim_resource'. It also explains the source of the upgrade_jwt (from create_* tools or upgrade URL) and what to do with the session token afterwards (use 'get_api_token' or dashboard). This is a clear when-to-use and when-not-to-use instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_cacheA

Provision a fresh Redis cache on instanode.dev (POST /cache/new).

Returns a redis:// connection URL backed by a per-resource ACL user with a scoped key namespace — multiple tenants share the same Redis cluster safely. Drop in as REDIS_URL with any Redis client (ioredis, node-redis, go-redis, etc.).

Without INSTANODE_TOKEN: anonymous tier — 5 MB, 24h TTL. The response carries 'note' + 'upgrade' (claim URL) — surface both verbatim. With INSTANODE_TOKEN (paid): hobby 50 MB / hobby_plus 50 MB / pro 512 MB / growth 1024 MB / team 1536 MB (per api/plans.yaml), permanent.

Cleanup: anonymous resources auto-expire after 24h — there is no on-demand delete for anonymous tokens, by design. On a paid tier, call delete_resource to tear down on demand.

The 'name' field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden by disclosing behavioral traits: returns a redis:// URL, multi-tenant safety, anonymous tier limits (5 MB, 24h TTL), paid tier sizes, auto-expiry vs manual deletion, and env semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized with clear paragraphs, front-loaded with the main action, and every sentence adds meaningful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description covers return value, tier details, cleanup behavior, and environment scoping, making it fully complete for an agent to understand and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the env choices and the name format with an example, going beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Provision a fresh Redis cache on instanode.dev (POST /cache/new).' It uses a specific verb ('Provision') and resource ('Redis cache'), distinguishing it from sibling tools like create_postgres or create_nosql.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool (e.g., anonymous vs paid tiers, env scoping) but does not explicitly compare it to alternative tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_deployA

Create a new deploy — OR set redeploy: true to update an existing deployment with the same name (preserves app_id + URL). Optionally set private: true + allowed_ips: ['1.2.3.4', '10.0.0.0/8'] to restrict access to specific IPs. Deploying requires a paid plan: Hobby tier or higher (Hobby = 1 app, Hobby Plus = 2, Pro = 10, Growth = 50, Team = 100 — per api/plans.yaml deployments_apps); anonymous and free tiers cannot deploy and get HTTP 402. The PRIVATE-deploy option (private: true + allowed_ips) additionally requires Pro tier or higher. Useful when an agent is asked to deploy a CRM, internal dashboard, or staging app that should only be reachable by the user.

Deploys a containerized application on instanode.dev (POST /deploy/new).

The agent base64-encodes a gzip tarball of the user's project (must contain a Dockerfile at the root), passes it as 'tarball_base64', and the API builds + deploys + returns a public URL in ~30s. Build is asynchronous: the initial response carries status="building"; poll 'get_deployment' with the returned 'deploy_id' until status becomes "running" or "failed".

In-place update (redeploy:true): when you ship v2 of an existing app, pass the SAME 'name' plus 'redeploy: true'. The api updates that deployment in place — same app_id, same *.deployment.instanode.dev URL — instead of minting a fresh one. Default behaviour (redeploy omitted or false) always creates a new deployment and a new URL. This closes the AGENT-UX trap where shipping v2 with the same name left two live deployments + two URLs.

Tarball construction (agent side, runtime depends on language): tar = subprocess.check_output(["tar", "czf", "-", "-C", project_dir, "."]) tarball_base64 = base64.b64encode(tar).decode() Cap: 50 MB after base64 decode. Include only what 'docker build' needs; respect .dockerignore.

Resource bindings: pass 'resource_bindings' as a map of env var name → resource token (UUID), e.g. { "DATABASE_URL": "", "REDIS_URL": "" } The API resolves each token to its connection URL server-side and injects the resolved URL into the container at deploy time. The MCP server does NOT pre-resolve tokens — that would round-trip every binding through GET /credentials and embed raw secrets in the tool params, which the agent host may log.

Env vars: 'env_vars' takes plaintext values or vault://env/KEY refs (the vault is per-team, per-env; rotate without redeploying). 'env_vars' and 'resource_bindings' are merged before being sent to the API; on collision, 'resource_bindings' wins.

The 'name' field is required (the human-readable label shown on the dashboard).

Private deploys: set 'private: true' AND pass 'allowed_ips' (IPs or CIDR blocks) to restrict access at the Ingress. Pro tier or higher is required — hobby tier returns 402 with an agent_action prompting the user to upgrade. The two fields are coupled (T17 P2): allowed_ips without private:true is silently dropped by the api (the deploy stays publicly reachable), and private:true with an empty allowed_ips is a 400. The MCP client rejects both shapes locally with a clear error before the upload.

Tarball cap: 50 MiB after base64 decode. The MCP client enforces this client-side (T17 P2) — an oversized payload fails fast with a "shrink the tarball" hint instead of being uploaded and rejected server-side.

Requires INSTANODE_TOKEN (anonymous tier cannot deploy).

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoDeploy environment scope: 'development' (default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$. Omitting `env` lands the deploy in 'development' (lowest stakes), so accidental no-env deploys can't merge with prod state. Each scope has its own vault and env_vars.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.
portNoContainer HTTP port. Default 8080.
privateNoWhen true, the deploy is only reachable from IPs in 'allowed_ips'. Requires Pro tier or higher — anonymous and hobby callers get HTTP 402 with an agent_action prompting the user to upgrade. Use for CRMs, internal dashboards, staging apps.
env_varsNoEnv vars to inject into the container. Values may be plaintext or 'vault://env/KEY' refs (the API decrypts them at deploy time). Max 256 entries, 8 KiB per value.
redeployNoSet true to update an existing deployment with the same name (preserves app_id + URL). Default false → creates a new deployment with a fresh app_id and URL. Use redeploy:true when shipping a new version of an app you've already deployed.
allowed_ipsNoIP / CIDR allowlist enforced at the Ingress when 'private' is true. Examples: ['1.2.3.4', '10.0.0.0/8', '203.0.113.42/32']. Required when private=true; ignored otherwise. Max 256 entries; each must parse as IPv4/IPv6 address or CIDR.
tarball_base64YesBase64-encoded gzip tarball of the project directory (must include a Dockerfile at the root). <50 MB after decode (≈70 MiB encoded).
resource_bindingsNoMap of env var name → resource token UUID (e.g. { DATABASE_URL: '<postgres token>' }). The API resolves each token to its connection URL server-side. DO NOT pass raw connection URLs here — use create_postgres/create_cache/etc. to get tokens, then bind them. Max 256 entries, 8 KiB per value.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully compensates for the lack of annotations by detailing key behaviors: asynchronous build with polling, tarball construction and size limits, resource binding token semantics, env var merging, private deploy coupling and client-side validation, plan requirements, and authentication. No contradictions are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long and detailed, which is necessary given the tool's complexity, but it lacks conciseness. It is front-loaded with the essential purpose but includes substantial explanatory sections. Some redundancy exists (e.g., tarball cap mentioned twice). It is well-structured but could be trimmed without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, no output schema), the description is nearly complete. It covers async behavior, tarball construction, plan requirements, private deploy details, env var and resource binding merge, coupling, client-side validations, and auth. It lacks explicit mention of the output schema (e.g., exact fields returned), but it notes the deploy_id and status for polling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantial value beyond the schema. It explains the redeploy parameter's use case, the coupling of private and allowed_ips, the resource_bindings token-based approach, tarball_base64 construction instructions, env parameter scope and default, and provides examples for clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's main action: 'Create a new deploy — OR set redeploy: true to update an existing deployment.' It specifies the resource (deploy) and the action (create/update), and distinguishes from the separate redeploy sibling by noting that using the same name with redeploy:true preserves the URL, avoiding the trap of duplicate deployments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool (e.g., deploying CRM, internal dashboards) and when to use redeploy:true (shipping v2). It also mentions plan requirements (Hobby+ for deploys, Pro+ for private deploys) and when the tool fails (HTTP 402 for anonymous/free). However, it does not explicitly compare to the sibling redeploy tool, so the score is slightly reduced.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_leadA

Submit an enterprise contact / interest form to instanode.dev (POST /api/v1/leads).

Use this when the user needs capacity or features beyond the Pro tier — dedicated infrastructure, SAML/SSO, SOC 2 compliance, a custom SLA, or any other Enterprise-tier requirement. It directly reaches the instanode.dev team and is faster than a cold email.

Only 'email' is required. Providing 'company' and 'use_case' gives the team context to respond with an accurate quote without a back-and-forth.

No INSTANODE_TOKEN needed — anonymous callers are accepted. When called with a valid bearer token the lead is automatically linked to the caller's team so the sales team can see the account's current usage.

Returns the UUID of the created lead record on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesContact email address. Required. Must be a valid RFC 5322 address (max 254 chars).
companyNoCompany or organisation name. Optional — max 128 chars.
use_caseNoPlain-text description of scale requirements or the use case driving the Enterprise inquiry. Optional — max 1024 chars.
contact_nameNoContact full name. Optional — max 128 chars.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that no token is needed for anonymous calls, but with a valid bearer token links to the caller's team. Returns UUID on success. No annotations are provided, so the description carries the full burden; while it covers key behaviors, it omits potential errors or side effects, which prevents a perfect score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and concise: first sentence defines action, then usage context, then parameter guidance, then auth behavior, then return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations or output schema, the description is comprehensive: covers purpose, usage, parameters, auth, and output. It explains the endpoint, required field, optional benefit, and linking behavior, making it complete for a form-submission tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining that providing 'company' and 'use_case' gives context for an accurate quote, which is advice beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it submits an enterprise contact/interest form to instanode.dev (POST /api/v1/leads). Distinguishes itself from sibling resource-creation tools by focusing on enterprise inquiries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to use: when the user needs enterprise-tier features like dedicated infrastructure, SAML/SSO, SOC 2, or custom SLA. Also notes it's faster than a cold email, providing clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_nosqlA

Provision a fresh MongoDB database on instanode.dev (POST /nosql/new).

Returns a mongodb:// connection URL backed by a per-resource Mongo user with a role scoped to that single database. Drop in as MONGODB_URI with the official mongodb driver (mongoose, pymongo, etc.).

Without INSTANODE_TOKEN: anonymous tier — 5 MB, 2 connections, 24h TTL. 'note' + 'upgrade' fields in the response surface the claim URL. With INSTANODE_TOKEN (paid): hobby 100 MB / hobby_plus 1 GB / pro 5 GB / growth 20 GB / team 40 GB (per api/plans.yaml), permanent.

Cleanup: anonymous resources auto-expire after 24h — there is no on-demand delete for anonymous tokens, by design. On a paid tier, call delete_resource to tear down on demand.

The 'name' field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses all behavioral traits: connection URL format, user role scoping, tier limits, TTL auto-expiry, note/upgrade fields, and the absence of on-demand delete for anonymous tokens.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with main purpose first, but slightly verbose; all sentences are informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all essential aspects (return values, auth, tiers, cleanup, env) despite no output schema, making it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds context beyond schema: default env, response echo, and name examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('Provision a fresh MongoDB database') and the resource ('on instanode.dev'), distinguishing it from siblings like create_postgres or create_vector.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides tier-based usage guidance (anonymous vs paid) and cleanup options, but does not explicitly compare to sibling tools for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_postgresA

Provision a fresh Postgres database on instanode.dev (POST /db/new). pgvector is pre-installed.

Returns a standard postgres:// connection URL that any driver can use directly as DATABASE_URL — no wrapper SDK, no setup. The 'name' field is required (the human label surfaced on the dashboard).

Without INSTANODE_TOKEN: anonymous tier — 10 MB, 2 connections, expires in 24h, capped at 5 provisions/day per /24 subnet. The response includes a 'note' and 'upgrade' (claim) URL; surface both to the user so they know how to keep it. With INSTANODE_TOKEN (paid): hobby/pro/team limits per the user's plan, permanent.

Cleanup: anonymous tier auto-expires after 24h — there is no on-demand delete_resource for anonymous tokens, by design. On a paid tier, call delete_resource to tear down on demand.

Store the connection_url in an env var (DATABASE_URL); do not hardcode it.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully carries the burden. It discloses anonymous tier limits (10 MB, 2 connections, 24h expiry, 5/day per /24 subnet) and paid tier behavior. It explains cleanup mechanics and warns that there is no on-demand delete for anonymous tokens. It also advises storing the URL as an environment variable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and informative, with clear sections for functionality, connection URL, tier limits, and cleanup. It is slightly verbose but every sentence adds value. Front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations and output schema, the description covers all essential aspects: provisioning action, parameter requirements, tier-specific limits, cleanup behavior, and usage instructions. It is complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds minimal extra meaning for parameters: it emphasizes 'name' is required and a human label, but doesn't elaborate on 'env' beyond schema. It doesn't add format or constraints not already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provisions a Postgres database on instanode.dev, specifies pgvector is pre-installed, and returns a standard connection URL. It distinguishes from sibling tools like 'create_vector' or 'create_nosql' by focusing on Postgres.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (provisioning Postgres) and provides tier-specific guidance (anonymous vs paid). It mentions cleanup behavior (auto-expiry for anonymous, delete_resource for paid), but doesn't explicitly exclude scenarios or suggest alternatives for other database types.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_queueA

Provision a fresh NATS JetStream queue on instanode.dev (POST /queue/new).

Returns a nats:// connection URL backed by a per-resource NATS user with a scoped subject namespace. JetStream is enabled — use it for durable streams, pub/sub, or work queues. Drop in as NATS_URL with the nats.js / nats.go / nats.py client.

Without INSTANODE_TOKEN: anonymous tier — 24h TTL, basic message quotas. With INSTANODE_TOKEN (paid): tier-scaled quotas, permanent.

Cleanup: anonymous resources auto-expire after 24h — there is no on-demand delete for anonymous tokens, by design. On a paid tier, call delete_resource to tear down on demand.

The 'name' field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description covers key behaviors: returns a nats:// URL with scoped user, JetStream enabled, cleanup auto-expiry for anonymous, on-demand delete for paid, and auth token requirements. It omits rate limits or error scenarios but is fairly comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that efficiently conveys purpose, usage, tiers, cleanup, and requirements. It is not overly verbose, but could be slightly more structured with bullet points for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the return format, auth requirements, tier differences, and cleanup policies. It lacks an example output or mention of error responses, but given no output schema, it covers the essential context well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100% with clear descriptions for both parameters. The tool description adds no further semantic information beyond what the schema provides, justifying a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it provisions a NATS JetStream queue on instanode.dev, distinguishing it from other resource creation tools like create_postgres or create_cache. The verb 'Provision' and resource 'NATS JetStream queue' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use the tool (durable streams, pub/sub, work queues) and differentiates between anonymous and paid tiers with TTL and quota details. However, it does not explicitly state when not to use it or compare to other queue-like siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_stackA

Deploy a multi-service bundle from a single MCP call (POST /stacks/new).

The wedge: one tool call → a live URL on *.deployment.instanode.dev for an instant.yaml-shaped manifest declaring 1..N services. Each service has its own build context (tarball), Dockerfile, port, optional Ingress (expose: true), and resource deps (needs: [postgres, redis] to auto-provision and bind, or kind: postgres blocks inline). Cross-service references use service://<name> in env values — these resolve to cluster-internal http://<name>:<port> URLs at deploy time.

ANONYMOUS-FRIENDLY: no INSTANODE_TOKEN required. Anonymous stacks land at the anonymous tier with a 6h TTL (a stack is live compute, so its window is tighter than the 24h anonymous RESOURCE TTL), rate-limited by /24-subnet fingerprint. The response carries the same 'note' + 'upgrade' (claim) URL as create_postgres so the agent can prompt the user to keep the stack past 6h. With INSTANODE_TOKEN the stack inherits the user's plan tier and is permanent.

Multipart shape (the client builds this for you):

  • name (text, required)

  • manifest (text, the YAML body)

  • One binary file part PER service declared in the manifest, named after the service. The MCP receives them as a { <service-name>: <base64-gzip> } object — pass the same base64-encoded gzip tarball you'd pass to create_deploy, one per service.

Example manifest: services: app: build: . port: 8080 expose: true env: DATABASE_URL: service://postgres REDIS_URL: service://redis postgres: kind: postgres redis: kind: cache

Build is asynchronous: the initial response carries status="building"; poll 'get_stack' with the returned 'stack_id' until status="healthy" (~30s typical). Overall status is "healthy" only when every service is healthy.

Each tarball: gzip(tar()) → base64, cap 50 MiB per service (client-enforced). Total request body cap is 200 MB across all services (api).

Returns: stack_id, status, tier, env, per-service { name, port, expose, url, status } (only exposed services get a public URL), expires_in (6h on anon), plus the anonymous-tier upgrade fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$. Omitting `env` lands the stack in 'development' (lowest stakes). The response echoes the resolved `env`.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.
manifestYesinstant.yaml text. MUST declare a top-level `services:` map; each service entry takes build/port/expose/env/needs/kind fields. Cross-service refs use service://<name>. See the example in this tool's description. Max 256 KiB.
service_tarballsYesMap of service-name → base64-encoded gzip tarball of that service's build context (Dockerfile + source). One entry per service declared in the manifest that has a `build:` field. Service names match ^[A-Za-z0-9][A-Za-z0-9 _-]*$ (1..64). Cap: 50 MiB per service after base64 decode; max 32 services per stack.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavior. It does so comprehensively: asynchronous build, polling via get_stack, status states (building/healthy), timeouts (6h anonymous TTL), rate limiting by subnet, and detailed response fields. There is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose but well-structured with clear sections and front-loaded purpose. Every sentence adds value given the tool's complexity. Could be slightly more concise, but it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description thoroughly explains all return fields and the asynchronous lifecycle. The complex tool is well-documented: example manifest, dependency resolution, anonymous vs. authenticated behavior, and polling instructions. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds significant extra semantics: explains the multipart shape, async nature, manifest examples, per-service tarball caps (50 MiB each, 200 MB total), and environment scoping. This goes well beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Deploy a multi-service bundle from a single MCP call' and explains the key value proposition: one tool call yields a live URL. It distinguishes from siblings like create_deploy (single service) and other resource tools. The purpose is specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (multi-service bundle with dependencies) and provides context about anonymous vs. token usage, TTL, and rate limiting. While it doesn't explicitly say 'don't use for single service', the sibling tools and the description's focus on multi-service make it clear. It lacks explicit alternatives but is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_storageA

Provision a fresh S3-compatible object storage bucket prefix on instanode.dev (POST /storage/new). Backed by DigitalOcean Spaces with a per-resource access key, secret key, and prefix isolation under a shared bucket.

Returns endpoint, access_key_id, secret_access_key, prefix, and a public connection_url. Drop in to the AWS SDK (any language) by setting: AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_ENDPOINT_URL= AWS_REGION=us-east-1 (or whatever the endpoint requires) and uploading under the returned prefix.

Without INSTANODE_TOKEN: anonymous tier — 24h TTL enforced by the object store lifecycle policy (objects auto-delete). Response carries 'note' + 'upgrade' (claim URL) — surface both verbatim so the user can keep their objects past 24h. With INSTANODE_TOKEN (paid): tier-scaled storage limits, permanent.

Cleanup: anonymous storage prefixes auto-expire after 24h — there is no on-demand delete for anonymous tokens, by design. Objects under the prefix are removed by the bucket lifecycle policy. On a paid tier, call delete_resource to tear down on demand.

The 'name' field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: anonymous tier auto-deletes after 24h, no on-demand delete for anonymous, paid tier permanent and deletable via delete_resource. It also explains cleanup mechanism and that the response carries note/upgrade fields. This is comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: first sentence states purpose, followed by technical details, tier differences, cleanup, and a note on required field. It is efficient but could be slightly trimmed. Nevertheless, it earns its length by providing essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of output schema and annotations, the description covers all necessary context: purpose, usage scenarios, parameter behavior, tier differences, cleanup, and response fields. It is complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed parameter descriptions. The description adds no new semantic value beyond the schema—e.g., it reiterates that 'name' is required and that 'env' defaults to development, both stated in schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provisions an S3-compatible object storage bucket prefix with a specific verb 'Provision' and resource, and mentions the API endpoint. It distinguishes itself from siblings (e.g., create_postgres, create_vector) by specifying it's for storage, backed by DigitalOcean Spaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use anonymous vs paid tiers, the 24-hour TTL, and that delete_resource can be used on paid tiers. It provides clear context on authentication (INSTANODE_TOKEN) and lifecycle behavior. However, it does not explicitly compare with other create_* tools, but the purpose is distinct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_vectorA

Provision a pgvector-enabled Postgres database on instanode.dev (POST /vector/new).

Underlying storage IS Postgres (tier limits mirror Postgres exactly), with the pgvector extension already loaded via CREATE EXTENSION vector at provisioning time. Use for embedding stores (OpenAI text-embedding-ada-002 / 3-small = 1536 dims; text-embedding-3-large = 3072). Returns a standard postgres:// connection URL — drop in as DATABASE_URL with any pg driver.

Note: create_postgres ALSO ships with pgvector pre-installed today, so this tool is functionally equivalent for embedding workloads. Use create_vector when the agent wants to make the intent (pgvector / embeddings) explicit, or when the API contract evolves and pgvector-only routing diverges from generic Postgres provisioning.

The optional 'dimensions' field is a documentation hint only — pgvector lets you pick per-column dimensions at table-create time, so the server stores the declared default but does not enforce it.

Without INSTANODE_TOKEN: anonymous tier — 10 MB, 2 connections, expires in 24h, capped at 5 provisions/day per /24 subnet. The response carries 'note' + 'upgrade' (claim URL) — surface both verbatim. With INSTANODE_TOKEN (paid): hobby/pro/team Postgres limits, permanent.

The 'name' field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.
dimensionsNoOptional embedding dimension hint (defaults to 1536 — OpenAI text-embedding-3-small / ada-002). Use 3072 for text-embedding-3-large. Informational only; pgvector enforces dimensions per column at table-create time.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: underlying storage is Postgres with pgvector preloaded, dimensions are a hint, authentication tiers with limits, and return type (connection URL). It also notes functional equivalence with create_postgres, setting accurate expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the main action. However, it is somewhat verbose with detailed tier explanations. It earns its sentences but could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately covers outputs (connection URL, anonymous tier response fields). It explains all three parameters and their semantics. Slightly lacking in full response structure, but sufficient for a creation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining the dimensions default (1536) and that it's a hint, and clarifies the env parameter's default and purpose. This pushes the score to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provisions a pgvector-enabled Postgres database on instanode.dev, specifying the HTTP endpoint and use case for embedding stores. It distinguishes itself from the sibling create_postgres by noting functional equivalence and intent-based differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool vs create_postgres: to make intent explicit for pgvector/embeddings. Also details anonymous vs token tiers with specific limits, guiding the agent on appropriate authentication context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_webhookA

Provision an inbound webhook receiver URL on instanode.dev (POST /webhook/new).

Returns a receive_url that accepts any HTTP method from any sender and stores each request (method, headers, body, received_at). GET the same URL to pull back the stored log. The 'name' field is required.

Useful for: testing Stripe/GitHub/Slack webhooks locally, inspecting payloads during development, building integrations without exposing a local port.

Without INSTANODE_TOKEN: anonymous tier — up to 100 requests stored, 24h TTL. 'note' + 'upgrade' fields in the response carry the claim URL — surface both. With INSTANODE_TOKEN (paid): 1000+ stored per tier, permanent.

Cleanup: anonymous webhook receivers auto-expire after 24h — there is no on-demand delete for anonymous tokens, by design. On a paid tier, call delete_resource to tear down on demand.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoResource environment scope: 'development' (server default — see CLAUDE.md convention #11 / migration 026), 'staging', or 'production'. Format: ^[a-z0-9-]{1,32}$ — lowercase letters, digits, and dashes only. Omitting `env` lands the resource in 'development' (lowest stakes). The response echoes the resolved `env` so callers can confirm the bucket.
nameYesHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description carries full burden and excels: details returned receive_url, HTTP method handling, storage mechanics, cleanup policies (auto-expire for anonymous, on-demand delete for paid), and response fields ('note', 'upgrade'). Discloses behavioral traits comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with front-loaded purpose, followed by behavior, use cases, tier details, and cleanup. Every paragraph adds value, though slightly verbose. Efficient for the complexity covered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description covers creation, usage, and lifecycle well. Explains return value (receive_url) and response fields. Lacks exact response format, but otherwise complete for a creation tool with tiered behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds minor context (e.g., env defaults to 'development', name is required) but largely reiterates schema info. Does not significantly extend meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool provisions an inbound webhook receiver URL on instanode.dev, specifying the endpoint and behavior. It distinguishes itself from sibling tools (none are webhook-related) with a specific verb-resource combination.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases (testing Stripe/GitHub/Slack webhooks, inspecting payloads, building integrations) and differentiates tiers with token vs. anonymous. Does not explicitly compare to alternatives, though the unique nature of webhooks makes this less necessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_deploymentA

Tear down a running deployment (DELETE /deploy/:id). Stops the container, releases compute, removes the public URL, and marks the deployment row deleted. Irreversible.

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy).

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description fully discloses effects: stops container, releases compute, removes URL, irreversible deletion. Also specifies token requirement. This is comprehensive for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two meaningful sentences and a token requirement line. Slightly informal phrasing but efficient; could be structured more formally.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool (one parameter, no output schema), the description covers what happens and prerequisites. However, it omits mention of return value or error states, which might be useful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides a clear description and pattern for the single parameter 'id'. The description adds value by pointing out it comes from create_deploy's 'deploy_id', enhancing context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool tears down a running deployment with specific actions (stops container, releases compute, removes public URL, marks deleted). It distinguishes from siblings like 'delete_resource' by focusing on deployment resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to delete a deployment) and warns it's irreversible, but does not explicitly contrast with alternatives like pause_resource or wake_deployment, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_resourceA

Permanently delete one of the caller's resources (DELETE /api/v1/resources/{id}, where the {id} path param is the resource token). Drops the underlying Postgres/Mongo database, Redis ACL user, NATS user, storage prefix, or clears the webhook's request log, then marks the row status='deleted'.

Paid tier only (hobby/pro/team). Anonymous and free tiers cannot be deleted manually BY DESIGN — they auto-expire 24h after creation. This is the documented platform contract (see CLAUDE.md "anonymous = 24h TTL"): the free surface is throwaway-by-construction, which is why there's no auth required to provision and why deletion is a paid-tier feature. If your agent needs on-demand teardown, claim the resources first (move them to a paid tier), then call delete_resource.

For anonymous-tier cleanup: do nothing — the resource self-destructs at the 24h mark. The api's worker reaper handles the underlying DB / Redis ACL / storage prefix cleanup automatically.

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesResource token (UUID) to delete.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that deletion is permanent, drops underlying databases/ACLs/storage, and marks row status='deleted'. It also details the tier restrictions and auto-expiry behavior. However, it omits error scenarios or response details, which would enhance transparency further.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured, with clear sections explaining the operation, tier restrictions, and cleanup details. While it could be trimmed slightly, the length is justified by the complexity of the platform's behavior. The information is front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description covers the core action, prerequisites, and platform-specific behavior. It explains what happens to the underlying resources and the tier distinction. It lacks details on the response format or error handling, which would complete the picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with a description for the 'token' parameter. The description adds minimal extra meaning beyond the schema, noting that it is a path parameter. This is adequate but does not significantly enhance understanding beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: permanently delete a resource. It specifies the verb 'delete', the resource type, and distinguishes from sibling tools like pause_resource by emphasizing permanence. The HTTP method and path are also provided, leaving no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use (paid tier resources) and when not to (anonymous/free tiers auto-expire). It explains the alternative for anonymous tiers (do nothing) and outlines the prerequisite (claiming resources first for paid tiers). It also mentions the required INSTANODE_TOKEN.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_tokenA

Mint a fresh API key for the authenticated caller and return it as plain text (POST /api/v1/auth/api-keys). The user should paste the returned key into their MCP server config as INSTANODE_TOKEN (or export it as an env var for CLI use).

API keys are revocation-based (not time-bound) — they live until revoked in the dashboard.

IMPORTANT — PATs cannot mint other PATs (BugBash B16 F5 / task #171): The api enforces a one-step trust chain. A PAT (Personal Access Token, the standard INSTANODE_TOKEN format) can only be created by a logged-in user session, NOT by another PAT. So this tool will return HTTP 403 "PAT creation requires a user session" whenever INSTANODE_TOKEN itself is a PAT (which is the common case once the user has minted at least one).

The supported flow is therefore:

  1. Claim once via the dashboard's browser sign-in.

  2. From the dashboard's Settings → API Keys page, mint the FIRST key.

  3. Paste it into the MCP server's INSTANODE_TOKEN.

  4. Rotate by minting a NEW key in the dashboard (not via this tool) and revoking the old one.

This tool remains useful for the (rare) caller running with a dashboard session token (not a PAT), and as a clear surface for the 403 above so the agent can route the user to the dashboard instead of guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHuman-readable label for this resource (1-64 chars; must start with a letter or digit, then letters/digits/spaces/underscores/hyphens). Example: 'prospector-agent', 'stripe-sandbox'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses critical behaviors: the one-step trust chain restriction (PATs cannot mint PATs), revocation-based lifetime, and return format. It also mentions the 403 error scenario, ensuring agent understands limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed and well-structured, front-loading purpose and then explaining the crucial limitation and flow. While every sentence is informative, it is slightly lengthy; a more concise version could achieve the same clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter, no output schema, and no annotations, the description covers all necessary context: behavior, error handling, usage flow, and return format. It is fully adequate for an agent to understand and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the 'name' parameter already described in the input schema (pattern, maxLength, example). The tool description does not add additional semantics beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool mints an API key and returns it as plain text. While it distinguishes the limited use case (dashboard session token only) and contrasts with dashboard manual minting, it does not explicitly differentiate from sibling tools like 'claim_token'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use (dashboard session token) and when-not-to-use (PAT cannot mint PAT, user should use dashboard for rotation). It also gives a step-by-step supported flow and directs to the dashboard as an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_capabilitiesA

Read the live per-tier capability matrix (GET /api/v1/capabilities).

Use this BEFORE a provision/deploy call to plan around tier limits instead of provisioning-to-discover them and eating a 402 mid-flow. The api iterates its live plans registry, so the response is always current — tiers today are anonymous and free (both no-cost, 24h-TTL), then the paid tiers hobby ($9/mo), hobby_plus ($19/mo), pro ($49/mo), growth ($99/mo) and team ($199/mo). The exact numbers come from the api, not this description, so they never drift.

Per tier you get:

  • storage_limit_mb — per-service storage cap (postgres/redis/mongodb/ queue/storage/webhook/vector); -1 = unlimited

  • connections_limit — per-service max connections; -1 = unlimited

  • resource_count_limit — per-service max number of active resources; -1 = unlimited

  • deployments_apps — max concurrent deployed apps; -1 = unlimited

  • price_usd_monthly, paid_from_day_one, annual_discount_percent

  • backup_retention_days / backup_restore_enabled / manual_backups_per_day

  • rpo_minutes / rto_minutes (durability promise; 0 = not promised)

  • upgrade_url (null on the terminal Team tier) + is_terminal_tier

Tiers are returned in upgrade order (cheapest first). NO INSTANODE_TOKEN required — this is a public discovery surface so a cold-start agent can plan its first call. The response is the same for every caller.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: the API iterates live plans registry so response is always current, lists all tiers and their properties, notes that exact numbers come from API (no drift), specifies no token required, and states response is identical for every caller.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured: front-loads purpose, then usage guidance, then details output fields. Every sentence adds value, though it could be slightly more concise without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no output schema, the description is very complete. It comprehensively explains the output structure (all fields) and behavior, compensating for lack of output schema. Also clarifies authentication and usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100% (trivially). Baseline is 4 per instructions; no additional parameter info needed. The description does not add parameter semantics because there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the live per-tier capability matrix with the endpoint GET /api/v1/capabilities. It specifies the 'get' verb and the resource 'capability matrix', and distinguishes from sibling tools like provision/deploy by advising to use this before those calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'BEFORE a provision/deploy call to plan around tier limits instead of provisioning-to-discover them and eating a 402 mid-flow.' Also clarifies that no authentication token is required, making it accessible to cold-start agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deploymentA

Fetch one deployment by its app id (GET /api/v1/deployments/:id).

Use this after create_deploy to poll until status="running" (typically ~30s after the initial 202). Returns the same shape as list_deployments for a single record.

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy).

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It discloses it's a GET request, requires INSTANODE_TOKEN, and returns same shape as list_deployments. But it omits details like error handling (e.g., 404 if id not found) or idempotency, leaving some behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences that front-load the main action, followed by usage context and requirements. No wasted words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple GET endpoint, the description covers the polling workflow, return shape, and authentication. Given no output schema and one parameter, it is sufficiently complete for correct agent usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers the single 'id' parameter 100% with pattern and description. The description adds valuable context by linking 'id' to the 'deploy_id' from create_deploy, enhancing meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb 'Fetch' and the resource 'one deployment by its app id', and clearly distinguishes itself from siblings like list_deployments (multiple) and create_deploy (creation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance to use this after create_deploy for polling until running status, which is clear context. However, it does not explicitly mention scenarios where it should not be used or alternatives for other needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deployment_eventsA

Read the failure-timeline autopsy for a deployment (GET /api/v1/deployments/:id/events).

This is the rule-27 self-correction surface: when a deploy is stuck in "building" or flips to "failed", get_deployment only shows the LATEST error string — this tool returns the full chronological autopsy the platform's worker captured (Kaniko build failures, k8s pod events, OOM kills, image-pull errors). Each event carries:

  • kind (e.g. "failure_autopsy")

  • reason (e.g. "BackoffLimitExceeded", "OOMKilled", "ImagePullBackOff")

  • exit_code (process exit code, or null when not an exit)

  • event (k8s event type, when captured)

  • last_lines (the tail of the build/pod log — usually the actual error)

  • hint (a remediation suggestion you can act on)

  • created_at (RFC3339 UTC)

Events are newest-first, so events[0] is the most recent failure. Use this to fix a broken Dockerfile or misconfigured port without guessing: read the hint and last_lines, patch the project, then redeploy.

If the deploy succeeded there may be no events (empty list) — that's normal.

Requires INSTANODE_TOKEN. A deployment id that isn't on your team returns a clean "not found" (the api never confirms other teams' deployments).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy / 'app_id' by get_deployment).
limitNoMax number of events to return (newest first). Optional — the api defaults to 50 and clamps to its own maximum. Omit to use the default.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: it lists the exact fields returned (kind, reason, exit_code, etc.), confirms newest-first ordering, describes authentication (INSTANODE_TOKEN), and explains error handling (clean 'not found' for other teams). No annotations are present to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and clear paragraphs. It is fairly long but every sentence adds necessary information. A minor cut could be the analogy 'the rule-27 self-correction surface,' which is evocative but adds little concrete value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description meticulously explains the return value (seven fields with examples), ordering, pagination behavior, and edge cases (empty list for successful deploys, 'not found' for unauthorized ids). No additional documentation is needed for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (both 'id' and 'limit' have descriptions). The description adds value by explaining that 'id' corresponds to 'deploy_id' from create_deploy or 'app_id' from get_deployment, and that 'limit' defaults to 50 if omitted. This goes beyond the schema, justifying a score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Read the failure-timeline autopsy for a deployment.' It specifies the verb (read), resource (deployment events), and distinguishes itself from the sibling tool 'get_deployment' by highlighting that it returns the full chronological autopsy versus just the latest error string.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: when a deploy is stuck in 'building' or flips to 'failed.' It also clarifies that a successful deploy may result in an empty list. However, it does not explicitly state when not to use it or list alternative tools, though the context implies its niche use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stackA

Fetch a stack by id (GET /stacks/{stack_id}). Use this after create_stack to poll until every service is "healthy" (~30s typical).

Anonymous-friendly: the public /stacks/{slug} route mirrors the StackResponse shape returned by POST /stacks/new (services array, expires_in, etc.) and does not require INSTANODE_TOKEN — anonymous callers can poll their own stacks. The dashboard-only GET /api/v1/stacks/{slug} returns a flatter summary and requires auth; this tool uses the public route.

Returns the same shape as create_stack: stack_id, status, tier, env, per-service { name, port, expose, url, status }, expires_in.

ParametersJSON Schema
NameRequiredDescriptionDefault
stack_idYesStack id (returned as 'stack_id' by create_stack). Format: stk-<8-char-hex>.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool uses the public route, does not require auth for anonymous callers, returns the same shape as create_stack, and lists response fields. However, it does not mention potential errors or rate limits, which would be needed for a perfect score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is approximately 120 words, well-structured with clear paragraphs. Every sentence adds value, and the main purpose is front-loaded. No unnecessary content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description thoroughly explains the return shape (same as create_stack with specific fields). It also covers auth requirements and polling context. For a single-parameter tool, this is complete and informative.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds value beyond the schema: it describes the stack_id format ('stk-<8-char-hex>') and notes that it is returned by create_stack. This reduces ambiguity beyond the schema's description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Fetch a stack by id' and distinguishes from sibling tools by specifying polling after create_stack and contrasting with a dashboard-only route that requires auth. Verb+resource and usage context are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this after create_stack to poll until every service is healthy (~30s typical).' Also explains when to use this public route versus the dashboard route based on auth requirements, giving clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_deploymentsA

List deployments on the caller's team (GET /api/v1/deployments).

Returns each deployment's app_id, tier, status (building/running/failed/...), live URL, port, and the deploy env scope (production/staging/...).

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses returned fields (app_id, tier, status, etc.) and authentication requirement. No annotations provided, so description carries burden. Lacks information on pagination, sorting, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences. Front-loaded with purpose and endpoint. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description adequately explains return fields. However, lacks information on pagination or limits, which would be expected for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema; baseline 4. Description adds value by enumerating return fields, which aids understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'list', resource 'deployments', and scope 'on the caller's team'. Distinguishes from sibling 'list_resources' and 'get_deployment'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance. No mention of alternatives or preconditions beyond requiring token.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_resourcesA

List resources on the caller's instanode.dev account, newest first (GET /api/v1/resources).

Requires INSTANODE_TOKEN to be set. Mint one at https://instanode.dev/dashboard.

Returns each resource's type (postgres/cache/nosql/queue/storage/webhook/vector), token, tier, status, name, and expiry.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It discloses that results are sorted newest first, scoped to the caller's account, and lists the returned fields. It does not mention pagination or rate limits, but for a simple list operation, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, front-loaded with the purpose, and contains no superfluous information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no parameters, the description provides sufficient context about the action, prerequisites, and return fields. It could mention pagination or maximum results, but it is otherwise complete for a straightforward list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description does not need to explain parameters and correctly omits any reference to them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description begins with 'List resources on the caller's instanode.dev account, newest first', clearly identifying the verb and resource. It distinguishes from sibling create/delete tools by focusing on listing and includes the HTTP endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States a clear prerequisite (INSTANODE_TOKEN) and provides a link to obtain one. While it doesn't explicitly contrast with sibling tools, the use case for listing vs. creating/deleting is self-evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pause_resourceA

Suspend a resource WITHOUT deleting it (POST /api/v1/resources/:id/pause).

Storage is preserved and the connection URL is unchanged — the resource just stops accepting new connections (the provider-side credential is revoked) until you resume it. Use this to park a staging database overnight, freeze a resource during an incident, or temporarily cut access without losing data.

Pro tier or higher only (anonymous/free/hobby get 402 with an upgrade prompt). Pausing an already-paused resource returns 409. Resume with resume_resource; the same connection URL works again immediately after resume.

Requires INSTANODE_TOKEN. A token not on your team returns a clean 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesResource token (UUID) to pause — the value create_* returned as 'token'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully discloses behavioral traits: no data loss, stops new connections, revokes credential, preserves storage and URL. Also covers error conditions (409 for already paused, 402 for insufficient tier, 404 for invalid token) and authentication requirements (INSTANODE_TOKEN, Pro tier).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is efficiently structured with the primary action first, followed by key details and use cases. No redundant sentences, though the authentication note could be placed earlier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While comprehensive, the description omits whether existing connections are terminated gracefully or left hanging. It also doesn't discuss return value or success indicators. Without an output schema, these details would help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and baseline is 3. Description adds value by explaining that the 'id' parameter is a resource token from a create_* call, which aids in understanding where to obtain the value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action ('Suspend'), the object ('resource'), and explicitly distinguishes it from deletion. It specifies that storage and URL are preserved, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete use cases (parking database, freezing during incident, temporary access cut) and directs to resume_resource for undoing. While it doesn't explicitly state when not to use, the context and sibling comparison (delete_resource) imply the appropriate scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

presign_storageA

Mint a short-lived presigned S3 URL for an object in a storage bucket prefix (POST /storage/:token/presign).

Use this to upload (PUT) or download/inspect (GET/HEAD) an object without handing out long-lived credentials. The signed URL is scoped to the storage resource's tenant prefix and expires in ≤1h (default 10 min). Auth is the storage TOKEN in the path (the value create_storage returned) — so this works for anonymous-tier storage you just provisioned, no INSTANODE_TOKEN needed.

Then use the returned 'url' with any plain HTTP client:

  • PUT → upload the object body to that URL

  • GET → download the object

  • HEAD → fetch metadata only

DELETE is intentionally NOT offered — a leaked presigned URL must not be able to wipe a prefix. The key must be relative to the prefix (no leading slash, no '..' path traversal — the api rejects those).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesObject key RELATIVE to the tenant prefix (e.g. 'uploads/avatar.png'). No leading slash, no '..' segments.
tokenYesStorage resource token (UUID) returned by create_storage.
operationYesS3 verb the signed URL authorises: GET (download), PUT (upload), or HEAD (metadata). DELETE is not permitted.
expires_inNoTTL in seconds. Default 600 (10 min); capped server-side at 3600 (1h). Omit for the default.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It fully discloses: expiration ≤1h (default 10 min), auth via token in path, scoped to tenant prefix, key restrictions (relative, no leading slash or '..'), and that DELETE is intentionally excluded to avoid data loss. This is comprehensive for a security-sensitive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: starts with a concise summary, then provides details on usage, auth, and constraints. Every sentence adds value—no filler. It is appropriately sized for the tool's complexity (4 parameters, security concerns).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description mentions the returned 'url' and how to use it. It covers all essential aspects: token source, operation restrictions, key format, expiration, and security rationale. The tool is moderately complex, but the description leaves no ambiguity about usage or behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, but the description adds significant value beyond the schema: it explains that the token comes from create_storage, gives context for the operation enum (including why DELETE is missing), and describes the expiration default and cap. This extra context helps the agent use parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: mint a short-lived presigned S3 URL for upload (PUT), download (GET), or inspect (HEAD). It distinguishes itself from sibling tools by being the only presign tool, and explicitly ties to the storage resource created by create_storage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use (upload/download/inspect without long-lived credentials) and when not (DELETE not offered). Also explains that it works for anonymous-tier storage without INSTANODE_TOKEN, and gives concrete HTTP client usage examples. No alternative tools mentioned, but siblings don't overlap in purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeployA

Push updated code to an existing deployment by app id. Same URL, new build (POST /deploy/:id/redeploy).

Use this when you already know the deploy_id and want to ship a code change without touching the URL or app_id. For the more common "I have the name, I want to update the app I just shipped" path, prefer create_deploy({ name, tarball_base64, redeploy: true }) — that resolves the deployment by name and is the AGENT-UX-recommended path.

The api REQUIRES a fresh tarball — there is no server-side tarball reuse (the earlier tool description claiming reuse was wrong and caused every real call to fail with 400 missing_tarball). Pass a base64-encoded gzip tar of the project (Dockerfile + source), same shape as create_deploy.

Status flips back to "building"; poll get_deployment until it returns to "running" (~30s typical).

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy).
tarball_base64YesBase64-encoded gzip tarball of the project directory (must include a Dockerfile at the root). <50 MB after decode (≈70 MiB encoded). Same shape as create_deploy.tarball_base64.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description fully handles transparency. It discloses that a fresh tarball is required (no server-side reuse), flips status to 'building', and requires INSTANODE_TOKEN. Also corrects a previous erroneous claim about tarball reuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Eight sentences, well-structured with a clear front-loaded purpose, usage guidance, and important behavioral notes. Slightly verbose due to the correction about a previous wrong description, but still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but description covers the async rebuild process (polling, status changes), prerequisites (token), and tarball requirements. Lacks description of return values or error cases, but sufficient for an update tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds meaningful context: id is the deploy_id from create_deploy, and tarball_base64 shares the same shape as create_deploy.tarball_base64. Mentions size limits and contents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool pushes updated code to an existing deployment by app id, and contrasts with create_deploy's redeploy option. The verb 'redeploy' and resource 'deployment' are well-specified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to use this tool when the deploy_id is known and a code change is needed without changing URL/app_id. Also recommends the alternative create_deploy with redeploy:true for name-based workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_resourceA

Un-pause a previously-paused resource (POST /api/v1/resources/:id/resume).

Flips the resource back to 'active' and re-grants the provider credential. The connection URL is preserved unchanged (same password, host, database name) so your existing config keeps working — no reconnection-string change needed.

Pro tier or higher only (symmetric with pause_resource). Resuming a resource that isn't paused returns 409. Requires INSTANODE_TOKEN. A token not on your team returns a clean 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesResource token (UUID) to resume — the value create_* returned as 'token'.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description covers key behavioral traits: flips status, re-grants credential, preserves connection URL, requires INSTANODE_TOKEN, and returns 409/404 on error. It omits details like rate limits or idempotency, but is sufficient for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4-5 lines) and front-loaded with the core action. It uses a clear structure with details on behavior, limitations, and errors. Minor improvement could be using bullet points for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers purpose, usage, behavioral implications, authentication, error handling, and prerequisite (Pro tier). No output schema is needed, and the given level of detail is complete for a simple resume operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description for the id parameter ('the value create_* returned as token'). The description adds no additional parameter-level insights, meeting the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Un-pause a previously-paused resource' with a specific verb and resource. It explains the effect (flips to active, re-grants credential) and implicitly distinguishes from siblings like pause_resource by mentioning symmetry and the 409 error on non-paused resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context: 'Pro tier or higher only', 'symmetric with pause_resource', and error conditions for misuse (409 if not paused, 404 for wrong token). It does not explicitly list alternatives to non-paused resources, but the sibling context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotate_credentialsA

Rotate a resource's password and get the NEW connection URL (POST /api/v1/resources/:id/rotate-credentials).

The host and database name are unchanged; only the credential rotates. An attacker holding a leaked OLD connection URL is locked out, while the freshly- returned URL keeps working. Use this after a suspected leak, on a key-rotation schedule, or before handing a resource off.

The response includes the new connection_url IN PLAINTEXT (the one place besides create_* that exposes it) — treat it as a secret, store it (e.g. with set_vault_key), and update any app/deploy that references the old URL.

Requires INSTANODE_TOKEN. A token not on your team returns a clean 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesResource token (UUID) whose credentials to rotate — the value create_* returned as 'token'.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description fully carries the burden. It discloses that only credentials rotate (host/database unchanged), returns new URL in plaintext, requires INSTANODE_TOKEN, and returns 404 for unauthorized tokens. This provides good behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, with a clear structure: action, behavior, usage, security note, auth requirement. Every sentence adds value, and it is front-loaded with the key purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and no output schema, the description covers all essential aspects: what it does, when to use it, the nature of the response (plaintext URL), security handling, and authentication. It is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already describes the 'id' parameter as the resource token UUID. The description reinforces this but does not add new semantic detail beyond what the schema provides, meeting the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Rotate' and the resource 'password', and specifies the outcome 'get the NEW connection URL'. It effectively distinguishes this tool from siblings like create_* or delete_resource by focusing on credential rotation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage scenarios are provided: after a suspected leak, on a key-rotation schedule, before handing off. No explicit 'when not to use' is given, but the context effectively implies it, and no alternative tools are mentioned, though the action is unique.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotate_vault_keyA

Rotate a vault secret's value (POST /api/v1/vault/:env/:key/rotate).

Functionally a vault write that mints a new version, but recorded under a distinct audit action so the vault audit log distinguishes an intentional rotation (e.g. a leaked credential, scheduled key rotation) from a routine update. Use this when you're replacing a compromised or expiring secret; use set_vault_key for a first write or a normal value change.

After rotating, redeploy any app that references vault:/// so the new value is injected (the running container keeps the old value until its next deploy).

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
envYesVault environment namespace of the existing secret (e.g. 'production').
keyYesSecret key name to rotate (e.g. 'DATABASE_URL').
valueYesThe NEW secret value (≤1 MiB). Stored encrypted; never echoed back.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses that the tool mints a new version under a distinct audit action, that the running container keeps the old value until redeploy, and that the value is encrypted and not echoed. Also notes auth requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value. The description is front-loaded with the core purpose, followed by functional distinction, usage guidance, redeploy note, and auth requirement. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage, side effects, and auth. However, it does not mention the return value or response format, which is a minor gap for a write operation. Still, given the thoroughness elsewhere and no output schema, a 4 is reasonable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptive parameter docs (env, key, value). The description adds no new parameter details beyond the schema, but the schema itself is sufficient; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Rotate a vault secret's value'), specifies the HTTP endpoint, and distinguishes the tool from its sibling set_vault_key by identifying the intended use case (compromised or expiring secret).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool vs set_vault_key ('Use this when... use set_vault_key for...'), advises redeploying dependent apps, and mentions the required INSTANODE_TOKEN.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_vault_keyA

Write a secret to the team vault (PUT /api/v1/vault/:env/:key).

This is the WRITE side of the vault:// references create_deploy advertises. Store a secret here, then reference it from a deploy as vault:/// in env_vars (or resource_bindings) — the api decrypts it at deploy time so the plaintext never sits in your tool params or the deploy record. Closes the gap where create_deploy could point at vault://env/KEY but there was no MCP tool to populate it.

Every write creates a NEW version (v1 on first create, v2+ on updates), so the returned 'version' tells you which generation this call minted. The plaintext value is never echoed back.

Vault is a paid feature: Hobby+ (20 entries) through Pro/Team (unlimited). On anonymous/free you get 403 vault_not_available; at the entry cap you get 402. Hobby/Pro tiers restrict the env to 'production' only — pass env="production" there (the api returns 403 vault_env_not_allowed otherwise).

Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
envYesVault environment namespace (e.g. 'production', 'staging'). Hobby/Pro tiers allow 'production' only. Format: ^[A-Za-z0-9_-]{1,64}$.
keyYesSecret key name (e.g. 'DATABASE_URL', 'STRIPE_SECRET_KEY'). Format: ^[A-Za-z0-9_.-]{1,256}$. Reference it later as vault://<env>/<key>.
valueYesThe secret value (≤1 MiB). Stored encrypted at rest; never echoed back.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses version creation, that plaintext is never echoed, authentication requirement (INSTANODE_TOKEN), and possible error codes (403, 402, 403 vault_env_not_allowed).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening sentence followed by relevant details. It is slightly verbose but every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers return value (version), error scenarios, and authentication. Without an output schema, it provides sufficient context for a simple write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage, but description adds critical context: env tier restrictions, key reference format, and value encryption/echo behavior. This goes beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it writes a secret to the team vault using a specific HTTP method and path. It distinguishes itself from sibling tools like rotate_vault_key by focusing on writing/updating secrets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when to use the tool: to populate a vault:// reference for create_deploy. Also covers tier restrictions and possible HTTP errors, but does not explicitly mention alternative tools for read operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_deploy_envA

Merge environment variables into an existing deployment (PATCH /deploy/:id/env).

The supplied keys are MERGED into the deployment's current env (incoming wins on collision) — you don't have to resend the full set. The response echoes the full merged map with secret values redacted. A redeploy is required to apply the change: the running container keeps its current env until its next build, so finish with create_deploy({ name, redeploy: true }) or redeploy({ id }).

Values can be plaintext or vault://env/KEY references (write the secret first with set_vault_key). Requires INSTANODE_TOKEN. A deployment id not on your team returns a clean 404 (the api never confirms other teams' deployments).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy / 'app_id' by get_deployment).
envYesMap of env var name → value to merge in. Values may be plaintext or vault://env/KEY references. Merged with the deployment's existing env (incoming wins).

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully discloses key behaviors: merge semantics (not replace), secret redaction in response, redeploy requirement, vault support, auth token need, and 404 behavior for unauthorized access.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence adds value; the description is front-loaded with primary action, followed by merge details, redeploy, vault, auth, and error handling. Concise yet comprehensive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all key aspects: merge operation, response format, redeploy necessity, vault integration, auth, and error behavior. No output schema needed; description handles completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, but description adds essential context: id source from create_deploy/get_deployment, env values can be plaintext or vault references, and merge behavior beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it merges environment variables into an existing deployment, with explicit verb and resource. Distinguishes itself from siblings like update_stack_env and set_vault_key.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (merge env vars), mentions redeploy requirement, suggests using create_deploy or redeploy to apply changes, explains vault references prerequisite, and notes authentication and error behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_stack_envA

Merge environment variables into an existing stack (PATCH /stacks/:slug/env).

Same merge semantics as update_deploy_env but for a multi-service stack, and transactionally row-locked server-side so concurrent updates don't clobber each other. An EMPTY-STRING value deletes that key. The response echoes the merged map with secret values redacted. Redeploy the stack (POST /stacks/:slug/redeploy) to apply the change.

Auth required — anonymous stacks cannot be mutated (claim the stack first). A slug not on your team returns a clean 404. Requires INSTANODE_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
envYesMap of env var name → value to merge in. An empty-string value DELETES that key. Values may be plaintext or vault://env/KEY references.
stack_idYesStack id / slug (format stk-<8hex>, returned by create_stack as 'stack_id').

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description bears full burden. Discloses transactionally row-locked concurrency, empty-string deletion semantics, redacted response, auth requirements, 404 for unauthorized slugs, and required token.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear first sentence followed by bullet-like paragraphs. All information is relevant and no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all essential aspects: behavior, concurrency, deletion, response, auth, edge cases, and required subsequent action. No output schema but description suffices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters have detailed explanations beyond schema: env includes value types and deletion behavior, stack_id includes format and source. Schema coverage is 100%, but description adds significant value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Merge environment variables into an existing stack' with HTTP method and path. Distinguishes from sibling update_deploy_env by noting 'same merge semantics but for a multi-service stack'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies use case (multi-service stack), mentions alternative (update_deploy_env) implicitly, and explains required redeploy step. Lacks explicit when-not-to-use but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wake_deploymentA

Explicitly wake a scaled-to-zero deployment (POST /deploy/:id/wake).

When scale-to-zero is enabled, an idle app is descheduled to 0 replicas to save compute; its URL then returns 502/503 (no pod) until woken. This tool scales it back to 1 replica and refreshes its activity stamp. The pod still needs its normal cold-start time before it serves traffic, so retry the app URL a few seconds after waking.

This endpoint is FLAG-GATED on the platform: when scale-to-zero is disabled the api returns 501 'scale_to_zero_disabled' and nothing is scaled. That's expected on a deploy where the feature isn't turned on — the deployment is already always-on, so there's nothing to wake.

Requires INSTANODE_TOKEN. A deployment id not on your team returns a clean 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDeployment app id (returned as 'deploy_id' by create_deploy / 'app_id' by get_deployment).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it scales to 1 replica and refreshes activity stamp, notes cold-start delay, explains the flag-gated 501 error, requires INSTANODE_TOKEN, and mentions 404 for unauthorized ids. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the main purpose. It is slightly verbose but every sentence adds necessary context. Could be trimmed slightly without losing value, hence 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers preconditions, behavior, and errors well, but fails to describe the successful response format or body. Since there is no output schema, the agent is left guessing what a successful wake returns. This gap lowers completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds minimal extra meaning beyond the schema: it ties the 'id' to the URL path and mentions its origin from other tools. This is helpful but not a significant addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the action: 'Explicitly wake a scaled-to-zero deployment' and ties it to the HTTP endpoint. It clearly distinguishes from sibling tools like pause_resource or resume_resource by focusing on the specific scenario of waking a deployment that was scaled to zero.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: when to use (when app returns 502/503 due to scale-to-zero), when not to use (when feature is disabled, deployment is always-on), and what to expect (cold-start time, need to retry). It also warns about 404 for non-owned ids.

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.

  1. 31 tool updatesv0.12.0
    • First observedclaim_resource
    • First observedclaim_token
    • First observedcreate_cache
    • First observedcreate_deploy
    • First observedcreate_lead
    • First observedcreate_nosql
    • First observedcreate_postgres
    • First observedcreate_queue
    • First observedcreate_stack
    • First observedcreate_storage
    • First observedcreate_vector
    • First observedcreate_webhook
    • First observeddelete_deployment
    • First observeddelete_resource
    • First observedget_api_token
    • First observedget_capabilities
    • First observedget_deployment
    • First observedget_deployment_events
    • First observedget_stack
    • First observedlist_deployments
    • First observedlist_resources
    • First observedpause_resource
    • First observedpresign_storage
    • First observedredeploy
    • First observedresume_resource
    • First observedrotate_credentials
    • First observedrotate_vault_key
    • First observedset_vault_key
    • First observedupdate_deploy_env
    • First observedupdate_stack_env
    • First observedwake_deployment

TDQS

A4.3/5.0

Scored across 31 tools

Disambiguation5/5

Every tool targets a distinct resource or action. Even similar tools like create_postgres and create_vector are clearly differentiated by intent and usage notes. Overlap is minimal and well-documented.

Naming Consistency5/5

Tool names consistently follow a verb_noun pattern (e.g., create_postgres, delete_resource, list_deployments). Only minor deviations like 'redeploy' exist, but they are still clear.

Tool Count4/5

31 tools is above the typical 3-15 range but justified by the broad scope: resource provisioning, management, deployments, stacks, vault, and lead creation. Each tool has a clear purpose, and the count is not excessive for the domain.

Completeness4/5

The tool set covers most lifecycle operations for resources and deployments. Minor gaps exist (e.g., no delete_stack or get_resource for a single resource), but agents can work around them. Overall, it's reasonably complete for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to execute Python, JavaScript, Bash, and Go code in blazing-fast (~0.1ms startup), isolated cloud containers with secure, ephemeral environments that auto-destroy after use.
    156
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Agentic cloud platform with 45+ MCP tools. Deploy any containerized stack, debug live pods (shell, file editing, DB queries), manage custom domains & TLS, push to built-in container registry, scale pods, and manage GPU workloads. The infrastructure layer where AI agents ship software to production.
    8
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provisions Docker-based development environments on demand, allowing AI agents to create, manage, and inspect containerized dev environments without manual setup.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    The agent-native cloud: provision Postgres-compatible databases, deploy services and functions in isolated microVMs, manage storage, auth and AI inference, and read logs and billing — 50 tools behind one API key. Hosted remote server; this repository carries the connection docs.
    2
    MIT