A request reaches a revision 2026-07-28 server over Streamable HTTP, but its _meta contains no io.modelcontextprotocol/protocolVersion field. How must the server respond?
Select an answer to reveal the explanation.
Short Explanation
If you send a request without its protocol version, it's like a parcel missing the shipping label — the clerk doesn't guess, it bounces it. In 2026-07-28 that bounce is -32602 with a 400. Don't confuse 'missing' with 'unsupported'; they get different errors.
Full Explanation
In revision 2026-07-28, every client request MUST carry io.modelcontextprotocol/protocolVersion and io.modelcontextprotocol/clientCapabilities in _meta. The specification states that a request missing any required field is malformed and the server MUST reject it with JSON-RPC error code -32602, Invalid params, and that on HTTP the response status MUST be 400 Bad Request. This follows from statelessness: the server cannot fall back on an earlier handshake to learn the version, so each request must be self-describing. Assuming the latest revision would mean guessing at semantics the client never declared, which the specification does not permit. UnsupportedProtocolVersion, code -32022, is for a version that is present but not implemented by the server; it carries the supported list so the client can retry, but it is not the response for a missing field. Asking for initialize applies only to legacy revisions; a server that supports only modern versions has no handshake to offer. Exam caveat: a dual-era server may still accept an initialize request from a legacy client, but a request without version metadata and without initialize is simply malformed. Operational check: send a test request with the field omitted and confirm the response is a 400 with error -32602 rather than a processed result.