Explainer

MCP tools vs resources vs prompts: which to use

MCP tools are actions the model calls, resources are data the app feeds the model, and prompts are templates the user invokes. Choose by who is in control.

MCPOrbit Team

Engineering, MCPOrbit

Published
Updated
· Updated
Read time
· 6 min read
Three cards labeled Tools (model-controlled), Resources (app-controlled), and Prompts (user-controlled).

In the Model Context Protocol (MCP), tools are actions the model chooses to call, resources are data the application feeds into the model's context, and prompts are templates the user explicitly invokes. The fastest way to pick the right one is to ask who is in control.

All three are capabilities an MCP server can expose, and it is easy to reach for a tool for everything. But the three primitives exist precisely because they answer different questions. Getting the mapping right makes servers that models use correctly and that hosts can render sensibly.

When should something be a tool?

Make it a tool when the model should be able to decide, mid-conversation, to perform an action. Tools carry a name, a description, and a JSON Schema for their inputs, and the model reads those to choose when and how to call them. Running a query, creating an issue, sending a message, searching an index: all tools.

Because the model invokes tools autonomously, a tool that has side effects deserves the same care as an API endpoint that mutates data. Describe it precisely, validate the input schema, and mark read-only versus write behavior clearly. A vague tool description is the single most common reason a model calls the wrong tool.

When should something be a resource?

Make it a resource when you are exposing data for context rather than an action to take. Resources are addressed by URI and are meant to be selected by the application (or the user through the app), not called spontaneously by the model. A file's contents, a database record, the current git diff, a documentation page: all resources.

The distinction is about control, not content. The same Postgres row could be reachable through a read-only query tool (the model asks for it) or a resource (the app pins it into context). If you want deterministic control over what the model sees, use a resource; if you want the model to fetch on demand, use a tool.

// A tool advertises an action the model may call:
{ "name": "query", "description": "Run a read-only SQL query", "inputSchema": { "...": "..." } }

// A resource advertises data the app can load, addressed by URI:
{ "uri": "postgres://main/orders/1042", "name": "Order 1042", "mimeType": "application/json" }

When should something be a prompt?

Make it a prompt when you want to give the user a reusable, parameterized workflow they trigger deliberately. Prompts are user-controlled. Hosts commonly surface them as slash commands or menu items. "Summarize this PR," "draft a release note," "start an incident review" are prompts: the user picks them, the server returns a well-formed message sequence, and the conversation proceeds.

Prompts are the most under-used primitive. If your users keep typing the same multi-step instruction by hand, that instruction wants to be a prompt: encode it once, expose it, and let the host offer it as a first-class command.

Tools vs resources vs prompts at a glance

Primitive   Controlled by   Answers the question        Typical example
---------   -------------   -------------------------   ------------------------
Tool        The model       "What can I DO?"             run a query, send a message
Resource    The app/user    "What context should I SEE?" a file, a DB row, a diff
Prompt      The user        "What workflow do I START?"  a slash-command template

Frequently asked questions

What is the difference between MCP tools and resources?
Tools are actions the model chooses to invoke, like running a query or sending a message. Resources are data the application loads into the model's context, addressed by URI. Tools are model-controlled; resources are application-controlled.
Should I expose my database as a tool or a resource in MCP?
Both are valid. Use a read-only query tool if you want the model to fetch rows on demand, and a resource if you want the app to pin specific records into context deterministically. Many servers offer both.
What are MCP prompts used for?
Prompts are reusable, user-invoked templates or workflows, typically surfaced as slash commands. They encode a multi-step instruction once so the user can trigger it deliberately instead of retyping it.
Can one MCP server expose tools, resources, and prompts together?
Yes. A single MCP server can advertise any combination of the three primitives. The client discovers each type separately via tools/list, resources/list, and prompts/list.
Why does my model call the wrong MCP tool?
Almost always a description problem. Models choose tools from their name, description, and input schema, so vague or overlapping descriptions cause mis-calls. Tighten the wording and make read-only versus write behavior explicit.

About the author

MCPOrbit Team

Engineering, MCPOrbit

The MCPOrbit engineering team builds tooling for running Model Context Protocol servers in production, and monitors a fleet of public MCP endpoints in the wild.

Share this post

MCPOrbit

Test an MCP server in 60 seconds.

Download MCPOrbit for free. No signup, no telemetry. Hear about a server and test it before the curiosity wears off.

macOS 14+ · Apple Silicon & Intel · No account needed