Protocol notes for developers
What the MCP server tells a client, what the API-key gateway speaks, headers, status codes, and the instructions Pythe gives every connected agent.
Updated 2026-10-13
The OAuth server at /mcp
| Property | Value |
|---|---|
| Name and title | pythe / “Pythe” |
| Version | 1.4.0 |
| Transport | Streamable HTTP |
| Auth | OAuth 2.1 with a Supabase Auth issuer; accepted audience authenticated; resource https://pythe.app/mcp; resource name “Pythe”; documentation https://pythe.app/connect-agent |
| Capabilities | Tools only. There is no prompts registry, so get_task_prompt is an ordinary tool. |
The instructions every connected agent receives
The server sends these in its instructions. They are the same rules as Recipes.
Tool annotations
Each tool declares MCP annotations so clients can decide when to ask you first.
| Tool | readOnly | destructive | idempotent | openWorld |
|---|---|---|---|---|
Most reads (get_*, list_*, search_library) | true | - | true | false |
assign_task | false | - | false | true |
run_research | false | - | false | true |
cancel_run | false | true | true | false |
update_operating_plan | false | true | true | false |
set_active_workspace | false | - | true | false |
save_note, save_chat, add_milestone, answer_run | false | - | false | false |
The API-key gateway’s MCP
The gateway at /api/cofounder answers MCP JSON-RPC 2.0 as server pythe-cofounder version 2.0.0, for clients that send a pk_live_… key.
- Methods:
initialize,ping,tools/list,tools/call,resources/listandprompts/list(both answered with empty lists, since some clients probe them). Notifications get no response (HTTP 202). - Protocol versions:
2024-11-05,2025-03-26and2025-06-18. It echoes the one the client asks for when supported, otherwise answers with2025-06-18. - Batches of JSON-RPC messages are supported.
- Tool failures come back in-band with
isError: true; out-of-credits comes back as JSON-RPC error-32000with the details, because clients cannot read a bare HTTP 402. - Responses are JSON when the client accepts it, and a single server-sent event only when a client asks for a stream and nothing else. A
GETthat asks for a stream gets 405: the server pushes nothing. - Headers the browser clients need are allowed by CORS:
mcp-protocol-version,mcp-session-id,last-event-id. - Status codes: 401 with
WWW-Authenticate: Bearer resource_metadata="…"when unauthenticated, 429 withRetry-After: 60over the rate limit, 400 for bad JSON or an unknown request. - Caching: responses are
no-store.
List tools over JSON-RPC with an API key
curl -s https://pythe.app/api/cofounder \
-H "Authorization: Bearer YOUR_PYTHE_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Server card
/.well-known/mcp/server-card.json lists the name, title, version, description, documentation URL, the remote (streamable-http at https://pythe.app/mcp), the authentication type (oauth2.1) and every tool with its effect. It is generated from the same catalogue as this reference.
Related
Previous: The REST gateway and API keys · Next: MCP safety model