Endpoint
/mcp and /mcp/ are the same endpoint. There is no stdio package; a host that only speaks stdio connects through a bridge, mcp-remote or fastmcp-remote (below).
Auth
The server accepts the sameaf_... API key as the REST API, as a bearer token. A key that works on /v3 works on /mcp. Mint one at app.anyformat.ai/api-key.
A missing or unknown key returns 401 with the API’s error envelope (MISSING_API_KEY or INVALID_API_KEY). Repeated invalid keys from one address are throttled and return 429 with Retry-After, as on the REST API.
There is no OAuth flow today.
Connect
- Claude Code
- Cursor
- Claude Desktop and stdio clients
- Any client
Add the server with the Or write Check with
claude mcp add command. --scope user makes it available in every project; --scope project writes it to the project’s .mcp.json..mcp.json in the project root. Claude Code expands ${VAR} from the environment.claude mcp list, then ask Claude to list your workflows.Tools
The server exposes these 17 tools today. Each API tool calls the matching v3 endpoint under your key, so the endpoint page is the reference for its inputs, outputs and errors. TheScope column names the key scope the tool needs. For a worked end-to-end session with real payloads, see Agents over MCP.
The graph a tool takes or returns is the one on the Node schemas page. A host reads the full input schema from the server, so an agent can compose a valid graph without you pasting the schema into the conversation.
The document flow an agent follows is
upload_documents, then run_document_packet with an idempotency_key, then get_run with wait_seconds set, so one call waits for the result instead of the agent polling. A file on the agent’s machine enters the flow through stage_files: upload the bytes to the returned form, then pass { object_id, filename } to parse_document or upload_documents. Pass the short id, never the kilobytes-long presigned read_url. parse_document is the one-call shortcut when the agent needs only the markdown of a single document. Save that markdown: its output is not retained.
Every extracted value is a JSON string on the wire, whatever the field’s declared type. A float field answers "4594.62", so parse numbers before comparing them. Confidence is an integer from 0 to 100, and each field carries the evidence text and the page it was read from.
delete_workflow and delete_document_packet are irreversible. Their descriptions ask the agent to call request_approval with a one-line summary and to wait for your approval before deleting. That approval is a card the host shows you; a host that does not render it still sees the destructiveHint and can ask you its own way.Tool annotations
Every API tool declares the standard MCP annotations, so a host can decide when to ask you before calling it.request_approval declares none: it touches nothing on anyformat.
All API tools set
openWorldHint: false: they only reach anyformat.
Skill resources
The server also serves the anyformat skill, the design know-how an agent reads before it builds a workflow, as MCP resources. It is the same content that ships as the@anyformat/skill npm package; the resource path needs no install step.
A host discovers them with
resources/list and reads one with resources/read and its URI; any valid key can read them, whatever its scopes. In Claude Code, mention a resource as @anyformat:skill://anyformat/SKILL.md to pull it into the conversation. Over plain HTTP:
Authorization and limits
Authorization follows the API key. Whatever the key can do on/v3, it can do over /mcp, on the key’s organization only. Each API tool needs one of the key’s scopes: the list and get tools need read, the tools that create, run, update or delete need write; request_approval needs none. A tool the key cannot call is left out of the server’s tool list, and a direct call to it is answered as an unknown tool. Every tool call passes through the gateway’s normal rate limiting, so the rate limit tiers apply per tool call as they do per request.
Errors
A failed tool call returns an MCP tool error whose message is the API’s error envelope as JSON:{ error, detail, error_code, retryable, request_id, status }. Read error_code to branch, status for the equivalent HTTP status code, and quote request_id in a support request. A TOPOLOGY_INVALID error carries detail.violations[], one entry per broken rule, with the node ids involved.
Related
- Agents over MCP: a worked end-to-end session with real payloads, covering stage, build, run and read.
- Coding assistant: the
@anyformat/skillpackage, the same content as the skill resources above. - Python SDK and TypeScript SDK: the same calls from code.

