MCP has three roles and three kinds of thing a server offers. Learn those and each feature has an obvious place to go.
Host, client, server
The host is the AI application a person uses: Claude Code, Codex, a chat app, or a program you write. Inside it, one client per connection talks to one server, a separate program that offers capabilities. The model never talks to your server. The host decides which of your tools the model may see, shows the person what is happening, asks for approval when its rules say so, sends the call and hands the result back.
So you are writing for a model that reads your descriptions, through a host that may filter, truncate or block what you send.
Messages are JSON-RPC 2.0. Two transports carry them: stdio, where the client starts your server as a child process and writes one JSON message per line, and Streamable HTTP, where each message is an HTTP POST to one endpoint. With stdio, nothing but protocol messages may ever be written to standard output.
Three primitives, by who decides
| Primitive | Who decides when it is used | Example from the course's TeamBoard server |
|---|---|---|
| Tools | The model, during a task | search_issues, create_issue |
| Resources | The application or the person, as context to attach | teamboard://projects |
| Prompts | The person, by choosing one, often as a slash command | triage_issue |
Mental Model
Pick the primitive by who should decide, not by what is easiest to code. Everything exposed as a tool is something the model may decide to call.
A worked choice
You want the person to attach "every open issue assigned to me" to a conversation, without the model deciding to fetch it. That is a resource: context the application or person attaches, such as teamboard://me/issues. A tool would leave the decision to the model, and a prompt is a reusable instruction the person runs, not the right way to offer plain data.


