Try this first
You have seen tools/list. A server can also answer resources/list and prompts/list.
Three menus, not one. Most tutorials only mention the first, which is why most people’s mental
model of MCP is smaller than MCP.
The three
| Kind | What it is | Who decides to use it | Analogy |
|---|---|---|---|
| Tool | An action the model can take | The model | A function call |
| Resource | Data the client can read | The application | A file |
| Prompt | A template the user can invoke | The user | A slash command |
The middle column is the real distinction, and it is the one worth remembering. All three
deliver something useful. They differ in who chooses.
Tools — model-controlled
What you already know. The model reads the description and decides to call it.
tools/call {"name": "add_note", "arguments": {"text": "..."}}
Side effects live here. If it changes something, it is a tool.
Resources — application-controlled
A resource is data with a URI, that your application reads and puts into context because it
decided to.
resources/list → [{"uri": "notes://all", "name": "All notes", "mimeType": "text/plain"}]
resources/read {"uri": "notes://all"} → the contents
The model does not ask for a resource. Your code fetches it and includes it, the way an IDE
plugin includes the open file without the model requesting it.
The distinction matters because it changes who is responsible. A tool call is the model’s
decision, and it can be wrong. A resource is your application’s decision, and it is
predictable.
Prompts — user-controlled
A prompt is a named template the server offers and the user picks — the thing behind a /
command in a chat interface.
prompts/list → [{"name": "summarise_week", "description": "Summarise this week's notes"}]
prompts/get {"name": "summarise_week"} → a ready-made message list
The server author knows how to ask their own service a good question. A prompt is how they
ship that knowledge alongside the tools.
Why this is worth knowing
Two reasons.
Reading other people’s servers. A server offering only tools is doing the minimum. One
that offers resources and prompts is a more complete integration, and knowing the difference
tells you what you are looking at.
Designing your own. The common mistake is to make everything a tool. If your server
exposes read-only data that the application should always include, that is a resource, and
making it a tool means hoping the model remembers to ask.
Our server in the next lesson offers tools and one resource. Prompts we will mention and skip
— they are the least used of the three, and the concept is now in your head, which is what
matters.
Tools are chosen by the model, resources by the application, prompts by the user. Three
menus, three decision-makers.
Try this before the next lesson
Take the three services you listed in 5.1. For each, sort what you want into the three
categories.
You will find most things are tools, one or two are resources, and prompts are rare. That
ratio is normal, and now you know it is a choice rather than a limit.