Agents Frame ships an MCP server so any MCP-aware host can call the router as a native tool. The transport is Streamable HTTP (spec 2025-03-26), stateless single-response — no SSE, no session — at V0.

Endpoint

POST https://api.agentsframe.com/
Content-Type: application/json
Authorization: Bearer <api-key>   # required only on tools/call
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.
ArgumentTypeRequiredDescription
intentstringNatural-language description of what to do.
lang'en' | 'zh'Override automatic language detection.
topKnumberCandidates to return (default 3).
recallKnumberRecall pool size (default 16).
categorystringReserved.
excludeSlugsstring[]Slugs to exclude.

Handshake example

initialize
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-03-26",
    "capabilities": {},
    "clientInfo": { "name": "claude-desktop", "version": "0.x" }
  }
}
tools/call
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "route",
    "arguments": {
      "intent": "decide whether to refactor or rewrite this legacy module"
    }
  }
}
The response wraps the same RouteResult shape as REST inside the MCP content array.

Claude Desktop config

Add the server to your claude_desktop_config.json:
{
  "mcpServers": {
    "agents-frame": {
      "transport": "streamable-http",
      "url": "https://api.agentsframe.com/",
      "headers": {
        "Authorization": "Bearer YOUR_AGENTS_FRAME_API_KEY"
      }
    }
  }
}
Restart Claude Desktop and the 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:
{
  "agents-frame": {
    "transport": "streamable-http",
    "url": "https://api.agentsframe.com/",
    "headers": {
      "Authorization": "Bearer YOUR_AGENTS_FRAME_API_KEY"
    }
  }
}
Cursor will surface the route tool inside Composer. Trigger it by asking the agent to “pick a thinking framework before answering”.

Windsurf

~/.codeium/windsurf/mcp_config.json:
{
  "mcpServers": {
    "agents-frame": {
      "serverUrl": "https://api.agentsframe.com/",
      "headers": {
        "Authorization": "Bearer YOUR_AGENTS_FRAME_API_KEY"
      }
    }
  }
}

Any other MCP host

Any host that supports Streamable HTTP transport works the same way: point it at https://api.agentsframe.com/, pass the API key in the Authorization header. The handshake (initializetools/list) is open so hosts can discover the server before the user pastes a key.

Common errors

SymptomCause
Tool list comes up emptyHost called the wrong path. Endpoint is /, not /mcp.
tools/call returns 401Missing or invalid Authorization header on the call frame.
tools/call returns 429Tier quota exhausted. The body has upgrade_url.
Tool fires but answer feels offTry topK: 5 and inspect the candidate list; pin via category.

Why no SSE / session at V0

A single tools/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).