// the "who controls it" axis
This isn't ToolCall's framing — it's straight from the MCP spec, which has a literal "Who controls it" column. That one axis tells you which primitive to reach for.
"GET/POST" is a teaching analogy, not spec wording. The spec's enforceable side-effect hints (readOnlyHint etc.) actually live on tools; resources are described as read-only/passive in the docs.
One server, all three
The spec's own example: a single database server can expose every primitive at once.
Tools are for actions. Resources are for data. Prompts are for intent. Match each thing your server offers to who should decide when it runs.
The catch: client support
Here's the real reason everyone defaults to tools — uneven client support. Tools are near-universal; resources are the least supported. Claude Code doesn't support resources at all; Cursor and VS Code Copilot are tools-only. So a tool "works everywhere" today, while a resource may simply be ignored.
Sources: MCP — server concepts ("who controls it") · Tools spec · Resources spec · Prompts spec · Client support matrix
One concept a week. Free.
The deeper, copy-paste version of each ToolCall short — MCP, RAG, agents, caching — in your inbox.
// total: 0.00 · spam: void · unsubscribe: one click
