POST that carries its own authentication and gets a complete answer.
POST is handled. A client that opens an SSE stream first will fail, and that is expected.
initialize
Optional in practice, since the server keeps no state, but every MCP client sends it.2025-06-18, 2025-03-26, 2024-11-05 and 2024-10-07. The server echoes yours when it recognises it, and answers 2025-06-18 otherwise.
The only capability is tools. The server exposes no resources, no prompts and no sampling, and it never sends a notification to the client. Notifications you send to it are accepted with a 202 and an empty body.
tools/list
Returns the full tool list in one shot. There is no pagination cursor.tools/call
content[0].text for clients that only read text, and once as a real object in structuredContent. Read structuredContent if your client supports it.
Errors
Two error shapes exist, and the distinction matters.Protocol errors
Returned for a malformed request. HTTP status is still200.
Tool errors
A tool that throws does not produce a JSON-RPC error. It produces a normal result flagged withisError, so a calling model reads the reason and corrects its arguments.
result.isError on every call. A 200 response does not mean the tool succeeded.
Authentication errors
A missing or invalid key is the one case that is not JSON-RPC at all:401 Unauthorized with a plain text body, before any parsing happens.
Destructive tools
Seven tools refuse to run unless you passconfirm: true:
delete_agent, delete_skill, delete_schedule, delete_trigger, detach_connector, delete_template, remove_template_agent.
Without it, the call comes back as a tool error telling you to call again once the account owner has agreed. This exists so an assistant cannot delete an agent as a side effect of a vague instruction.