During initialize, client and server each declare supported features via a capabilities object; both sides then stick to the intersection, enabling forward compatibility.
Imagine two kids meeting at a playground for the first time. Before they start playing, each one says which games they know: 'I know tag, hide and seek, and kickball.' The other says 'I know tag and freeze dance.' They agree to play tag because both listed it. Neither suggests a game the other never learned. MCP works the same way. When a client and server first connect, each sends a short list of features it supports. From then on, both stick to only the features they share. If the server later learns a new trick, older clients that never listed it simply ignore it. Nobody breaks. Nobody gets confused.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Capability negotiation is the small but critical mechanism that lets MCP evolve safely. The spec changes every few months. Hosts ship and stay deployed for years. Servers update on their own schedules. Without a way for both sides to agree on supported features at session start, every spec update would risk breaking something.
This explanation walks the three-message exchange, lists the capabilities each side commonly advertises in the 2026 spec, and shows why the asymmetric opt-in design is what makes forward compatibility actually work.
The three-message handshake
Every MCP session opens with exactly three messages.
The client sends an initialize JSON-RPC request. Its params include protocolVersion (a date-stamped string like "2026-03-26"), clientInfo (an object with name and version), and capabilities (an object listing the optional features the client supports). No other method may be called before this.
The server responds with its own protocolVersion (which may match the client's or be older if the server does not understand the client's version), serverInfo, and its own capabilities object listing what it offers.
The client sends a notifications/initialized notification (no id, no response expected). This signals the client has processed the server's response and the session is ready for normal operations.
Capability negotiation is the act of populating and reading the two capabilities objects in messages one and two. Everything that happens for the rest of the session must fit within the intersection of those two declarations.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- Claude Desktop announces `roots` and `sampling` client capabilities; servers configured in the desktop config can rely on Claude to surface roots and accept sampling requests.
- A simple search MCP server advertises only `tools`; the client never attempts `resources/list` against it because the resources capability is absent.
What an interviewer would ask next. Try answering before peeking at the approach.
QWhat should a client do if it attempts to call a feature the server did not advertise?
It should not make the call at all. A well-behaved client checks capabilities before issuing any method beyond initialize. Most servers return JSON-RPC error -32601 method not found for unadvertised methods. The client should hide the feature in its UI or surface a clear error to the user.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Assuming every MCP server supports every feature. Servers advertise only what they implement, and the client must check before calling anything beyond initialize.
60 second bullets to scan on the way to the call.
Define capability negotiation as the feature exchange inside initialize.
Walk the three-message sequence (initialize request, response, notifications/initialized).
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.