What is the correct client behavior when a server's capabilities object omits a feature the client needs?
Check the server's capabilities during initialize and degrade gracefully up front; never blindly call a feature the server never advertised.
Imagine plugging a new appliance into a wall socket. Before you switch it on, you check whether the socket actually supplies what the appliance needs. If the socket has no grounding pin, you do not just flip the switch and hope. You either pick a different socket or tell the user the appliance will run in a limited mode. MCP capability negotiation works the same way. During the opening handshake, the server hands the client a list of what it actually supports. The client reads that list first. If a feature is missing, the client disables the matching button or warns the user, instead of firing a call that is doomed to error.
Detailed answer & concept explanation~8 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: the initialize handshake + what each side advertises + why detect at init not runtime + graceful degradation patterns + compatibility payoff.
| Behavior | When detected | User experience |
|---|---|---|
| Graceful degradation | At initialize, from capabilities object | Feature hidden or explained; no failed call |
| Call anyway, handle error | At runtime, via error response | Wasted round trip; cryptic error to debug |
| Silent skip | At runtime, no signal | Functionality vanishes with no explanation |
| Assume full support | Never; assumption only | Breaks against any partial server |
Real products, models, and research that use this idea.
- Claude Code and Claude Desktop read each MCP server's capabilities at session start and only register the tools and resources the server advertised.
- Cursor and Zed negotiate capabilities per MCP server, so a filesystem server without subscriptions simply omits live update behavior in their UIs.
- The official mcp-inspector tool surfaces the negotiated capabilities object, letting developers confirm what a server declared before any call is attempted.
What an interviewer would ask next. Try answering before peeking at the approach.
QWhat exactly does the client advertise back to the server during capability negotiation?
QHow does capability negotiation give MCP forward and backward compatibility?
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.
Calling a capability the server never advertised and treating the runtime error as the discovery mechanism. The handshake exists precisely to avoid that.
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.