2025-03-26),
stateless single-response — no SSE, no session — at V0.
Endpoint
The MCP endpoint is the root path, not
/mcp. Caddy rewrites
/ to the internal /mcp route on apps/api. Authentication is
required only for tools/call; initialize, tools/list, and
ping are open so hosts can discover the server before users
paste an API key.Tool: route
There is exactly one tool. It mirrors the REST /v1/think body.
| Argument | Type | Required | Description |
|---|---|---|---|
intent | string | ✓ | Natural-language description of what to do. |
lang | 'en' | 'zh' | Override automatic language detection. | |
topK | number | Candidates to return (default 3). | |
recallK | number | Recall pool size (default 16). | |
category | string | Reserved. | |
excludeSlugs | string[] | Slugs to exclude. |
Handshake example
initialize
tools/call
RouteResult shape as REST inside the
MCP content array.
Claude Desktop config
Add the server to yourclaude_desktop_config.json:
route tool will appear in the
tools list. Ask Claude something like “Use the Agents Frame
router to pick a thinking model for X” and it will call the tool
on its own.
Cursor
Open Settings → MCP and add:route tool inside Composer. Trigger it by
asking the agent to “pick a thinking framework before answering”.
Windsurf
~/.codeium/windsurf/mcp_config.json:
Any other MCP host
Any host that supports Streamable HTTP transport works the same way: point it athttps://api.agentsframe.com/, pass the API key in the
Authorization header. The handshake (initialize → tools/list)
is open so hosts can discover the server before the user pastes a
key.
Common errors
| Symptom | Cause |
|---|---|
| Tool list comes up empty | Host called the wrong path. Endpoint is /, not /mcp. |
tools/call returns 401 | Missing or invalid Authorization header on the call frame. |
tools/call returns 429 | Tier quota exhausted. The body has upgrade_url. |
| Tool fires but answer feels off | Try topK: 5 and inspect the candidate list; pin via category. |
Why no SSE / session at V0
A singletools/call to route returns in well under a second and
needs no streaming progress. We kept the wire format stateless to
make horizontal scaling trivial and to avoid forcing every client to
implement SSE replay. We’ll revisit when streaming gives meaningful
UX wins (e.g. progressive candidate list, multi-turn elicitation).