MCP Server
Point any MCP client — Claude Code, Cursor, your own agent — at Spunto and let it drive projects, workspaces and commands.
Spunto ships an MCP (Model Context Protocol) server at POST /mcp. It exposes the platform as a set of tools an AI agent can call directly: find a project, spawn a workspace, run commands in it, read the output. No SDK to write, no REST API to teach.
https://spunto.net/mcpAuthentication is the same as the REST API: an API key sent as a Bearer token. There is no separate OAuth flow.
Create an API key
From Account Settings → API keys, create a key scoped to what the agent should be able to do. projects:read + workers:read gives a read-only agent; add workers:write to let it create workspaces and workers:exec to let it run commands.
Add the server to your client
With Claude Code:
claude mcp add --transport http spunto https://spunto.net/mcp \
--header "Authorization: Bearer spk_your_key"Or, in any client that reads an mcp.json:
{
"mcpServers": {
"spunto": {
"type": "http",
"url": "https://spunto.net/mcp",
"headers": { "Authorization": "Bearer spk_your_key" }
}
}
}Ask for something
"List my Spunto projects", "spin up a workspace on project X and run the test suite there" — the agent picks the tools itself.
| Tool | What it does |
|---|---|
search | One search across projects, workspaces, deployments, services and nodes — the shortest path from a name to an id |
list_organizations | Organizations the token can act in |
list_projects, get_project | Projects and their configuration |
list_workers, get_worker | Workspaces: state, branch, public URLs |
create_worker, start_worker, stop_worker, delete_worker | Workspace lifecycle |
run_command | Run a shell command in a workspace — waiting for it, or in the background |
get_command, list_commands, cancel_command | Follow, list and cancel those commands |
get_worker_logs, get_worker_git_status, list_worker_ports, list_worker_terminals | Observe a workspace |
list_nodes, list_deployments | Compute nodes and shipped services |
Two conveniences worth knowing: orgId is optional everywhere (an API key belongs to exactly one organization), and the workspace tools accept a workerId on its own — the project is looked up for you.
search / list_projects → find the project
create_worker → get a sandbox
get_worker (until "ready") → wait for setup to finish
run_command → do the work
get_command → read the result
delete_worker → clean upAnything longer than a minute — a build, a test suite, an agent run — should use run_command with background: true and then poll get_command. The command runs inside the workspace and keeps going regardless of what the client does; see Running commands.
An MCP client can do exactly what its API key could already do over REST, and nothing more. Every tool call is re-dispatched through the API's own routes with the caller's token, so the same scope and organization checks apply:
- a key without
workers:execgets a "missing scope" error fromrun_command; - a key scoped to one organization cannot read another, even by passing
orgIdexplicitly; - revoking the key stops the MCP session immediately.
The server is stateless Streamable HTTP: no Mcp-Session-Id, no server-initiated stream. GET /mcp and DELETE /mcp answer 405 with a JSON-RPC error explaining that — clients should just POST. Responses are plain JSON (Content-Type: application/json), so send Accept: application/json, text/event-stream and handle either.
