A client must work with newer servers that implement revision 2026-07-28 and with older servers that still expect an initialize handshake. Which approach does the specification describe?
Select an answer to reveal the explanation.
Short Explanation
A dual-era client is like a traveller who tries the local language first and switches to the old one only when needed. You probe the server, and if it's legacy you fall back to initialize. Leading with the old handshake everywhere is the trap.
Full Explanation
The versioning specification defines modern revisions, which carry version and capabilities on every request, legacy revisions, which use an initialize handshake, and dual-era implementations that support both. A client that must interoperate with both kinds of server detects each server's era with transport-specific mechanics: on stdio it probes with server/discover and falls back on any error that is not a recognized modern error, and on Streamable HTTP it attempts a modern request and inspects the body of a 400 response. A recognized modern error, such as UnsupportedProtocolVersionError, identifies a modern server, and the client retries with a supported version rather than falling back. The client SHOULD cache the determination for the server process or origin. Sending initialize first to everyone is wrong because modern-only servers do not implement the handshake and will reject it. Refusing legacy servers contradicts the documented backward-compatibility path, which permits clients and servers to implement both behaviours. Batching initialize with server/discover is not described, and JSON-RPC batching is not part of how this revision composes messages. Exam caveat: a modern-only client cannot talk to a legacy-only server at all, and the compatibility matrix lists that combination as failing. Operational check: point the client at one modern and one legacy server and confirm it stays modern for the first and falls back only for the second.