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.
Detailed answer & concept explanation~4 min readEverything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example.
Everything important, quickly.
4 min: walk the three-message initialize sequence, list common server and client capabilities with sub-flags, explain forward compatibility via mutual opt-in, and close with the debugging heuristic of checking the initialize trace first.
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.
- When a new spec revision adds a capability (e.g., a hypothetical `samplingV2`), older clients that never advertise it keep working because the server sees no flag and never calls it.
- MCP Inspector prominently displays the initialize exchange so developers can verify which capabilities each side advertised before debugging downstream calls.
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?
QHow does capability negotiation interact with protocol version?
Don't say thisRed flags and common mistakes that signal junior thinking. Click to expand.
Red flags and common mistakes 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.
The night-before-the-interview bullets. Scan these on the way to the call.
Primary sources. Skim if you want the original framing.
Same topic, related formats. Practice these next.