Under MCP revision 2026-07-28, where does each side communicate its capabilities?
Select an answer to reveal the explanation.
Short Explanation
Think of it as a menu and your order slip. The server posts its menu through server/discover, and the client writes its abilities on every single order. The one-time initialize handshake is the legacy trap.
Full Explanation
The 2026-07-28 revision is stateless, so capability negotiation no longer depends on a one-time handshake. Clients include their capabilities in _meta under io.modelcontextprotocol/clientCapabilities on every request, which is a required field, and servers use it to decide what they may rely on for that request. Servers advertise their capabilities, supported protocol versions and serverInfo in response to server/discover, which every server MUST implement and which clients MAY call before any other request. Exchanging capabilities once in initialize describes 2025-11-25 and earlier revisions; that handshake belongs to the legacy era and appears now only in backward-compatibility paths. Reversing the roles is wrong: clients send server/discover rather than answering it, and servers do not attach their capability set to every result's _meta, where they SHOULD include serverInfo instead. Carrying capabilities in HTTP headers is also incorrect; Streamable HTTP mirrors the protocol version, method and name into headers, but capabilities stay in the JSON body, and stdio uses capabilities through the same _meta field. Exam caveat: calling server/discover is optional for clients, since any request carries the same _meta and a client can handle a version error if one comes back. Operational check: inspect a request and confirm clientCapabilities appears in _meta, and call server/discover to read the server's capabilities.