BuildNot yet confirmed elsewhere1 publisher2 min readPublished
Official MCP SDK still downgrades 2026-07-28 handshakes to the 2025-11-25 era, probe finds
MCP's official server package, @modelcontextprotocol/server 2.3.1, answers 2026-07-28 handshakes with the 2025-11-25 era, a probe published on dev.to found. Default test clients and the Inspector settle for older eras, so a server passes local checks until a client requiring the new era connects.
The Engineer · Build desk

What happened
- The same downgrade occurs over streamable-HTTP, in both the stateless pattern with a fresh transport per request and the stateful one, so it is not a stdio quirk.
- A server built on the SDK's stateful streamable-HTTP pattern answers exactly one initialize, and any second client receives a 400 "Server already initialized" error.
- DeepWiki's public MCP endpoint, probed on 2026-10-10, served 2025-11-25, accepted every 2025 era and silently downgraded requests for 2026-07-28.
- The probe's --strict mode exits non-zero unless a server serves 2026-07-28 verbatim, and the authors offer it as a one-line CI step.
Why it matters
- constraint A strict era gate added today fails every build on @modelcontextprotocol/server 2.3.1, so teams on the official package cannot finish this migration with their own code changes.
- decision Passing tests against default clients or the Inspector stops counting as evidence of migration; the useful test is a client that asks for 2026-07-28 alone and fails on any other reply.
- exposure Client authors who require 2026-07-28 today cut themselves off from every server still built on the official SDK's published line.
The failure sits in one field of the initialize reply. The client names the era it wants, and the server's answer carries the era it will actually speak [4]. A client that requires 2026-07-28 and gets 2025-11-25 back either errors somewhere far from the cause or quietly drops into compatibility mode, according to the post's authors on dev.to [4]. Nothing in the server logs marks the moment [4]. The Inspector is built to connect, and it does [3]. A green local suite shows only that the test client was willing to settle for an older era [3].
The pattern first showed up in the official SDK's issue tracker as typescript-sdk#2977 [14]. The downgrade on 2.3.1 comes from upstream of any team's own code. The authors did not find the July revision in any of the org's npm packages they probed, including the v2 server line [7]. Their check on 2026-10-10 came 74 days after the date the revision carries [20]. "Installing the new major does not mean getting the new era," they wrote [11].
We think the probe is scoped correctly for a CI gate. It checks compatibility, not conformance, so a server that negotiates 2026-07-28 and then mishandles a tool call would still pass [9]. That is the property default clients hide, and the probe tests only that property.
The build is small. It is one file with no dependencies, MIT-licensed, with fixtures that reproduce each behaviour the post describes [10]. For each known era it opens a real initialize handshake, records the reply, then calls tools/list to confirm the server is still alive [5]. The sample output walks four eras, newest first, from 2026-07-28 down to 2025-03-26 [12]. The order is deliberate: a stateful server grants a single handshake, and the authors want it spent on the most informative era [17]. Over HTTP the whole run is a handful of small POSTs, with no tool calls and no data read [9]. A server that answers initialize but cannot list tools gets its own verdict instead of a pass [9].
The DeepWiki result is a single endpoint on a single day [18]. The post does not say which SDK that server runs, so it cannot show whether the downgrade there comes from the same package. The authors present it as a snapshot of an ecosystem where, they wrote, "the 2026-07-28 revision barely exists in the wild yet" [2].
What to watch
- A published @modelcontextprotocol/server release that answers 2026-07-28 verbatim, and the outcome of typescript-sdk#2977.
- Repeat probes of public endpoints such as DeepWiki's, showing when 2026-07-28 starts to appear in production servers.
- Whether the Inspector or the SDK's test clients add a mode that requests a single era and fails on a downgrade.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence55
- Adoption5
- Hype gap+10
- Incentives60
- Confidence55
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
In July 2026 the MCP spec got a new protocol revision, 2026-07-28.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [2]
"the 2026-07-28 revision barely exists in the wild yet"
ReportedSupportedSource: Authors of the dev.to post3 sources— create a free account to open themView cited source - [3]
A server in this state compiles and starts, serves any client that negotiates an older era (which most default test clients do), and the Inspector connects because it negotiates down.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [4]
When a client that requires the new era connects, the server answers initialize with the old era in the response; the client either errors somewhere far from the cause or quietly operates in compatibility mode, and nothing in the server logs marks the moment.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [5]
The probe opens a real initialize handshake for each known protocol era in sequence, records what the server did, then confirms liveness with a real tools/list call.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [6]
@modelcontextprotocol/server@2.3.1, the latest published major at the time of writing (2026-10-10), downgrades 2026-07-28 to 2025-11-25.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [7]
The July revision is not yet in the org's npm packages the authors probed (the v2 server line and the SDK).
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [8]
The probe's --strict flag exits non-zero unless the server serves 2026-07-28 verbatim; the authors suggest adding it as one line in CI.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [9]
The probe checks compatibility, not conformance; it performs real handshakes (a handful of small POSTs in HTTP mode, no tool calls, no data read), and a server that answers initialize but cannot list tools gets a distinct verdict rather than a pass.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [10]
The probe is MIT-licensed, a single file with no dependencies, and its repo includes runnable fixtures that reproduce every behaviour described, including the stateful 'already initialized' trap.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [11]
"Installing the new major does not mean getting the new era."
ReportedSupportedSource: Authors of the dev.to post2 sources— create a free account to open themView cited source - [12]
The probe's sample output tests the eras 2026-07-28, 2025-11-25, 2025-06-18 and 2025-03-26, in that order.
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [13]
The probe's verdict for a server serving 2025-11-25 only states that a 2026-07-28-only client cannot use the server (typescript-sdk#2977 failure class).
ReportedSupportedSource: dev.to post on mcp-era-probe2 sources— create a free account to open themView cited source - [14]
The authors noticed the pattern in the official SDK's issue tracker (typescript-sdk#2977), built a probe, and pointed it at fixtures and real servers.
- [15]
The same downgrade happens over streamable-HTTP, in both the stateless pattern (a fresh transport per request) and the stateful one.
- [16]
A server built on the SDK's stateful streamable-HTTP pattern (one transport per process) answers exactly one initialize; a second client gets 400 "Server already initialized".
- [17]
The probe goes newest-era-first so that the one handshake a stateful server grants is spent on the most informative era, and it flags this shape in its verdict.
- [18]
DeepWiki's public MCP endpoint, probed on 2026-10-10 without auth, serves 2025-11-25, accepts every 2025 era, and silently downgrades 2026-07-28.
- [19]
A client that requires 2026-07-28 cannot use servers built on the official SDK's current published line.
- [20]
The authors' 2026-10-10 check came 74 days after the 2026-07-28 revision date.
- [21]
Run against a server built on @modelcontextprotocol/server@2.3.1, the probe's --strict mode would exit non-zero, because that version answers 2026-07-28 with 2025-11-25.
Sources
1 independent publisher whose own reporting we read for this story.
- dev.toYour MCP server compiles, passes its tests, answers the Inspector — and still speaks the wrong protocol era
2 articles · October 10, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.
Entities
- Model Context ProtocolFollow
- @modelcontextprotocol/serverFollow
- MCP TypeScript SDKFollow
- DeepWikiFollow
- mcp-era-probeFollow
- PennyforgeFollow
- MCP InspectorFollow