A legacy client that only knows the initialize handshake connects over stdio to a server that supports only revision 2026-07-28, and the connection fails immediately. What resolves this?
Select an answer to reveal the explanation.
Short Explanation
An old client meeting a modern-only server is like a cassette in a streaming app — there's no adapter in the box. Either you upgrade the client, or you run the server in dual-era mode so it still speaks the old language. Retrying the handshake harder won't help.
Full Explanation
The compatibility matrix in the versioning page lists a legacy client connecting to a modern-only server as a failure. On stdio the server rejects initialize with a JSON-RPC error, because initialize is an unknown method and the request also lacks the required _meta fields; on HTTP the request is missing required headers and fails validation with 400. The specification states plainly that legacy clients have no fall-forward mechanism. The remedies are therefore to upgrade the client to a modern or dual-era implementation or to deploy the server as dual-era, which answers initialize with legacy semantics while serving modern requests statelessly. Retrying initialize with a newer version string does not help, because a modern-only server does not implement initialize at all and the legacy client cannot produce per-request _meta. UnsupportedProtocolVersionError helps modern clients pick a mutually supported version; it cannot convert a legacy client, which is not built to read it. Sending notifications/initialized first is meaningless here, since that notification belongs to the legacy handshake and a modern server neither expects nor uses it. Exam caveat: a modern-only server SHOULD name its supported versions in the error it returns to initialize so the legacy client can show a useful message. Operational check: read the error the client surfaces and confirm it lists the server's supported versions, then retest after upgrading the client.