Model Context Protocol
MCP is one wiring standard for connecting AI applications to outside data and tools. This page covers the three roles, the three things a server offers, and what the 2026 revision threw out.
Written against revision 2026-07-28
01 — In one sentence
MCP lets any AI application connect to any data source the same way.
Model Context Protocol. Anthropic introduced it in 2024, and since December 2025 it has not been Anthropic's — the protocol was donated to the Agentic AI Foundation (Linux Foundation, co-founded with Block and OpenAI), and is now governed by the community.
02 — The problem it solves
Four AI applications, and five things to connect them to: Google Drive, GitHub, a database, Slack, an internal API.
Without a shared protocol
4 × 5 = 20
Every application-times-source pair is written separately. One more application is five more integrations; one more source is four.
With one
4 + 5 = 9
Each application implements "be a client" once. Each source implements "be a server" once.
This is the N×M problem, and MCP's entire value is one sentence: any MCP client can talk to any MCP server. USB is the same story — before it, every peripheral brought its own connector.
03 — The three roles
Three roles, and the first two are what everyone conflates. When people say "MCP client" they usually mean Claude Desktop — which is the host.
- Host
- The AI application itself. Claude Desktop, VS Code, Claude Code. It holds the model, the conversation and the permissions. The host is the application.
- Client
- A connector inside the host, one per server. Not an application — a part of one. VS Code talking to two servers has two clients.
- Server
- The program offering tools and data. It may run on your machine or somewhere else. It cannot see your conversation, and cannot see other servers — that isolation is deliberate.
04 — What a server offers
Three things, and the difference between them is not read versus write. That is the intuition almost everyone arrives with, and it is wrong.
The real difference is who decides to use it. Three situations, three different answers:
Resource — the application decides
You drag a document in, or the host works out that this question needs that file attached. The decision belongs to the application, not the model. The model simply receives the content.
Typically: file contents, git history, a database schema.
Tool — the model decides
You say "file this bug as a ticket" and the model works out which function to call and with what arguments. The decision belongs to the model.
The key point: a read-only lookup can be a tool, as long as the model is the one deciding to run it. Which is why "read equals resource, write equals tool" does not hold.
Prompt — the user decides
You pick "code review" from a menu, or type a slash command. The decision is yours — the model will not reach for it on its own.
Typically: slash commands, template menus.
├─ One difference across all three: who presses the button.
05 — How it travels
Two standard transports. stdio: the server is a subprocess, talking over standard input and output. Streamable HTTP: each message is an HTTP POST. This is a difference in how, not in where: a server running on your own machine can speak Streamable HTTP just as well.
Worth knowing that their security properties differ completely: stdio inherits your user permissions and has no auth layer at all; the HTTP path wants OAuth and origin validation. And "local server" means "runs on your machine" — it says nothing about whether it reaches the internet. A local server can call a remote API perfectly happily.
06 — What this revision changed
Servers no longer remember anything.
2026-07-28 is the largest revision since MCP appeared, and it breaks things. A client used to handshake with a server to establish a connection, after which both remembered each other. There is now no handshake and no connection phase — every request carries its own version and identity, and the server forgets it as soon as it has answered.
The direction changed too: a server does not ask you a question. It returns "I need this" and ends the request; the client gets the answer and sends a fresh one.
Seeing any of these elsewhere means that material is out of date
- ├─
initializehandshake - ├─
Mcp-Session-Idheader, and protocol-level sessions - ├─ a server initiating a request to a client
- └─
ping,logging/setLevelas methods
The third one needs spelling out, because it reads as "servers can no longer ask for anything". What went is the mechanism for initiating a request, not the ability to ask. A server used to push a request across; now it can only say "I need this" in a response and stop, and the client picks it up from there.
So the features where a server asks a client for something are all still there, just routed differently — including Elicitation (asking the user for a piece of information) and Sampling (borrowing the host's model; the direction is the opposite of the intuitive one, so it trips people up more than anything else here).
Separately: Roots (telling a server which directories are in scope), Sampling and Logging are marked deprecated. They still work today, but do not treat them as the architecture to learn. Deprecation and the mechanism change above are separate things: one is about how a message travels, the other about whether the feature stays at all.
07 — Which revision this page describes
An MCP version is a date. It marks the last day a breaking change was made, not a release cadence. So for any MCP material you come across, the date tells you how current it is — which is the single most useful thing on this page.
2024-11-05 → 2025-03-26 → 2025-06-18 → 2025-11-25 → 2026-07-28
Statements with a shelf life
- The previous section holds for 2026-07-28 and no other revision.
- The three deprecated features will not actually be removed before some revision after 2027-07-28.
- "The protocol no longer needs a connection phase" is not "deployed servers are all stateless." A great many servers in the wild still speak the older revision, and that gap will persist.