Pick the MCP primitive by who chooses it
RolesAgent Systems EngineeringDeveloper Experience and EducationCustomer AI Deployment
The question
A team builds an MCP server for a project tracker. It has five capabilities: show the details of one issue, create an issue, a sprint review template, the project policy document, and close an issue. A developer proposes to publish each capability as a tool, a resource and a prompt at the same time, so that every client finds it. Which primitive do you give each capability, and why not all three?
Answer it first, aloud or on paper. Then open the answer.
The answer
Show short answer
Pick the primitive from who makes the choice. The model chooses a tool to perform an operation, so create and close are tools. A host or a user reads addressable content at a URI, so issue details and the policy are resources, and a user starts a prepared message workflow, so the review template is a prompt. Each extra surface costs discovery, authorization, caching, error handling, tests and documentation, so one capability gets one primitive.
Show full answer
Three primitives, three choosers
| Primitive | Chooser | Intent | Result |
|---|---|---|---|
| Tool | model or application | perform an operation | structured action result |
| Resource | host, application or user | read content at a URI | text or binary content |
| Prompt | user, through the host UI | start a reusable message workflow | one or more messages |
The five capabilities
- Issue details: content with a stable address, such as
tracker://issues/7. A resource. - Create issue: changes state. A tool.
- Sprint review template: a user picks it from a menu or a slash command and fills in arguments. A prompt.
- Project policy: a document the host reads into context. A resource.
- Close issue: changes state. A tool.
Why the triple publication is wrong
A capability published three ways needs three discovery entries, three authorization checks, three cache policies, three error paths and three test sets. The model also sees a tool it should not call for content that the host reads. Begin with the consumer, then write the handler.
Design rules that follow
- Design the resource URI before the handler. Namespace it to the server, keep it independent of a process or a connection, validate it before storage access, and authorize every read.
prompts/getresolves arguments into messages. The host decides how those messages enter model context and keeps its own policy above them.- Treat resource text and prompt templates as untrusted server output. The host keeps provenance and treats the content as data.
Follow-ups
L1ScreenWhat makes a good resource URI?
Show expected answer
stable enough to bookmark, namespaced to the server, independent of a process id or connection, validated before storage access, and authorized on every read.
L2WorkingA client wants to know when the policy document changes. Which mechanism does the current revision use?
Show expected answer
a client-opened
subscriptions/listenrequest that names the URI inresourceSubscriptions; the event says the resource changed, and the client reads it again withresources/read.L2WorkingA client asks
resources/readfor a URI that does not exist. Do you return an empty document?Show expected answer
no, return JSON-RPC
-32602, so the client can tell absence from a valid empty document.L3SeniorWhen would you publish a resource template instead of listing every issue?
Show expected answer
when the list is large or unbounded; the template tells the client how to form a valid URI, and the server still parses the variables, authorizes, and uses typed storage queries.
Wrong answers
Show the wrong answers that interviewers hear
“Make everything a tool so that the model can reach it.”
Content that a host reads is not an operation. It loses the URI contract, the cache hints and the user-controlled surface.
“Store the template as a resource because it lives in a file.”
Where the data is stored does not decide the primitive. A user starts the review, so it is a prompt.
“A prompt is policy that the host injects without the user knowing.”
Prompts exist for explicit user selection. Policy that the host enforces stays in the host at a higher priority.
Taught in
The resources and prompts lesson sorts the three primitives by the consumer's intent and shows the subscription flow.