It is a protocol, not a product
MCP standardises one thing: how an AI application asks an external system what it can
do, and then does it. It says nothing about which model you use, how you prompt it, or
how you manage context. That narrowness is the point — it is why the same server works
in Claude Code, VS Code, Cursor and a script you wrote yourself.
Think of it the way the docs do: a standard port, not a standard appliance.
Host, client, server
The host is the application you use. Inside it, one client
is created per connection, and each client maintains a dedicated, stateful link to one
server. Four servers means four clients in the same application, each
negotiated independently.
“Server” describes a role, not a location. A local filesystem server launched as a child
process and a vendor’s HTTP endpoint on the other side of the world are both servers.
Two transports, one message format
stdio: the client spawns the server as a child process and speaks
JSON-RPC over its standard input and output. No port, no network, nothing to firewall.
Streamable HTTP: HTTP POST for client-to-server messages, with optional
Server-Sent Events for streaming, plus standard HTTP authentication. MCP recommends OAuth
for obtaining tokens. An older SSE-only transport still exists at many
/sse endpoints and is being deprecated.
The messages are identical either way. That is what lets a server move from your laptop
to a vendor’s infrastructure without changing its data layer.
Three primitives, three different owners
This is the distinction worth internalising. All three are things a server can offer,
but they differ in who decides when they are used.
Primitive
What it is
Who controls it
Protocol methods
Tools
Executable functions with a JSON Schema for their input. They act: write a file, open a pull request, run a query.
The model decides when to call one.
tools/list, tools/call
Resources
Read-only context addressed by URI, with a MIME type. A file, a schema, a record. Templates such as weather://forecast/{city} make whole families addressable.
The application decides what to attach.
resources/list, resources/read, resources/subscribe
Prompts
Reusable, parameterised instruction templates — usually the server author showing you how to use their own tools well.
You invoke one explicitly.
prompts/list, prompts/get
Clients can expose primitives too. Sampling lets a server ask the host to
run a model completion, so a server author needs no model key of their own.
Elicitation lets a server ask you a question mid-operation.
Logging sends diagnostics back to the client.
It is stateful, and it negotiates
Every connection opens with an initialize exchange in which both sides
declare a protocol version and the capabilities they support. If no mutually compatible
version exists, the connection should be terminated rather than guessed at.
Discovery happens at runtime, not build time. A server that declares
listChanged: true can send notifications/tools/list_changed
later, and the client re-lists — so an agent’s capabilities can change mid-conversation
without a restart.
“Official” means three different things
The directory labels every listing with one of three tiers, because
they carry genuinely different risk.
Reference servers live in
modelcontextprotocol/servers and are explicitly
educational examples rather than production products.
Vendor-maintained servers are built by the company
whose product they wrap — usually the safest default.
Community servers are everything else, and are
sometimes the only option, sometimes better than the official one,
and always worth reading before you hand over a credential.
A large star count is a popularity signal, not a security review —
and where a repository is a whole platform rather than the server
itself, this site says so next to the number.
Everything a tool returns is data, not instruction
An issue body, a web page, a calendar invite, a support ticket: these arrive in the
model’s context looking exactly like legitimate content. If any of them contains
“ignore previous instructions and …”, a naive agent may comply. This is prompt
injection, and it is the central security problem of connecting agents to real systems.
The mitigations are boring and effective: least-privilege credentials, read-only modes,
narrow toolsets, approval for writes, and never pairing broad read access to private
data with an unrestricted outbound channel.
Read the trust and permissions guide →