MCP server for instanode.dev — let any AI coding agent (Claude, Cursor, Copilot, Windsurf) provision a real Postgres/pgvector/Redis/MongoDB/queue/S3 bucket and deploy apps via one tool call. No account, no Docker, free tier.
Drift inferred · capture-to-capture
tool count over time
tools
-
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.
-
create_cache
POST /cache/new — Provision a Redis cache (ACL-scoped user + namespace). Returns connection_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 upd
-
create_nosql
POST /nosql/new — Provision a MongoDB database (per-resource user + DB-scoped role). Returns connection_url + note/upgrade. name required.
-
create_postgres
POST /db/new — Provision a Postgres database (pgvector included). Returns connection_url + the note/upgrade claim URL. name required.
-
create_queue
POST /queue/new — Provision a NATS JetStream queue (scoped subject namespace). Returns connection_url + note/upgrade. name required.
-
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.
-
create_storage
POST /storage/new — Provision an S3-compatible bucket prefix (DigitalOcean Spaces). Returns endpoint, access keys, prefix + note/upgrade. 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
-
create_webhook
POST /webhook/new — Provision an inbound webhook receiver URL. Returns receive_url + note/upgrade. name required.
-
delete_deployment
DELETE /deploy/:id — Tear down a running deployment. Irreversible. 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
-
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 Doc
-
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.
-
list_resources
GET /api/v1/resources — List resources on the caller's account. Requires INSTANODE_TOKEN.
-
note
a one-sentence human-readable CTA, already mentions the upgrade URL.
-
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.
-
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
-
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. F
-
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.
-
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.
-
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 pai
-
token
the resource UUID (used for claim_token and delete_resource).
-
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 INSTA
-
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.
-
upgrade
the full claim URL (https://instanode.dev/start?t=<jwt>). The
-
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 i
code files: 18
filesystem 5
- fs InstaNode-dev-mcp-eba9e5f/src/client.ts :34
import { readFileSync } from "node:fs"; - fs InstaNode-dev-mcp-eba9e5f/src/index.ts :78
import { readFileSync } from "node:fs"; - fs (weak) InstaNode-dev-mcp-eba9e5f/test/error-contract-unit.test.ts :29
import { readFileSync } from "node:fs"; - fs (weak) InstaNode-dev-mcp-eba9e5f/test/integration.test.ts :45
import { readFileSync } from "node:fs"; - fs (weak) InstaNode-dev-mcp-eba9e5f/test/tool-coverage.test.ts :27
import { readdirSync, readFileSync } from "node:fs";
shell / exec 2
- shell (weak) InstaNode-dev-mcp-eba9e5f/test/input-hardening-unit.test.ts :18
import { spawnSync } from "node:child_process"; - shell (weak) InstaNode-dev-mcp-eba9e5f/test/integration.test.ts :36
import { spawnSync } from "node:child_process";
network 6
- net InstaNode-dev-mcp-eba9e5f/src/client.ts :914
* omit Content-Type here so fetch() can set its own multipart boundary. - net (weak) InstaNode-dev-mcp-eba9e5f/test/client-unit.test.ts :14
* These tests stub global.fetch (Node 26 has it built-in) so they run with - net (weak) InstaNode-dev-mcp-eba9e5f/test/integration.test.ts :1158
const resp = await fetch(`${mock.url}/deploy/${appId}/redeploy`, { - net (weak) InstaNode-dev-mcp-eba9e5f/test/mock-api.ts :18
import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http"; - net (weak) InstaNode-dev-mcp-eba9e5f/test/prod-cohort.test.ts :68
const resp = await fetch(`${PROD_API_URL}/internal/e2e/account`, { - net (weak) InstaNode-dev-mcp-eba9e5f/test/tools-unit.test.ts :1568
// Capture the suite-baseline fetch (mock-api-backed via INSTANODE_API_URL)
secrets 10
- secrets InstaNode-dev-mcp-eba9e5f/src/client.ts :896
const tok = process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/client-unit.test.ts :40
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/deploy-id-schema-unit.test.ts :35
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/error-contract-unit.test.ts :70
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/index-unit.test.ts :28
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/live-smoke.test.ts :44
const token = process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/operate-tools-unit.test.ts :72
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/prod-cohort.test.ts :45
const E2E_TOKEN = process.env["E2E_ACCOUNT_TOKEN"] ?? ""; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/tool-contract.test.ts :66
delete process.env["INSTANODE_TOKEN"]; - secrets (weak) InstaNode-dev-mcp-eba9e5f/test/tools-unit.test.ts :73
delete process.env["INSTANODE_TOKEN"];
install hooks 1
- prepublishOnly InstaNode-dev-mcp-eba9e5f/package.json :52
npm run build
declared dependencies 4
- @modelcontextprotocol/sdk@1.29.0
- zod@4.3.6
- @types/node@^25.9.2
- typescript@^6.0.3