Snapshot · 2026-08-23
State of MCP migration
60.1%
of graded MCP servers still answer only the legacy protocol — the handshake the 2026-07-28 revision removed — with no modern surface responding at all.
Narrowed to the 6,191 servers touched since the revision shipped, the ones that could have migrated and are demonstrably still maintained, 63.8% are legacy-only. That is the number worth arguing about.
The Model Context Protocol revision dated 2026-07-28 removed protocol-level sessions, formalized OAuth 2.1 and deprecated several capabilities. Every entry in the official registry with an HTTP endpoint was probed once and graded by the same rule engine the checker on this site runs. No sampling and no estimate — the whole registry as it stood on 2026-08-23.
Sample
24,365 registry entries, latest version of each. Most of the registry is stdio servers that run on the user's own machine and cannot be probed over the network at all.
| Registry | Endpoints | Share |
|---|---|---|
| Entries scannedlatest version of each | 24,365 | — |
| Addressable over HTTPunique endpoints — the population below | 13,380 | 54.9% |
| stdio or local onlynot reachable from anywhere, not probed | 10,984 | 45.1% |
Of those 13,380 endpoints, only the graded row is scored. An endpoint that answers but exposes neither MCP protocol behaviour nor an authentication challenge told us nothing, and counting it as clean is how a snapshot like this ends up claiming the opposite of the truth.
| Outcome | Endpoints | Share |
|---|---|---|
| Graded | 10,890 | 81.4% |
| Answered, but showed no MCP behaviour | 1,597 | 11.9% |
| Unreachable | 892 | 6.7% |
| Blocked by the SSRF guard | 1 | 0.0% |
Which protocol era each server serves
Accepting the legacy handshake is a compatibility choice, not a compliance failure: the revision says a server MAY implement both behaviours, and maintained servers do exactly that because v1 clients are still out there. Only the legacy-only row has actually been left behind.
| Era | Endpoints | Share |
|---|---|---|
| Serves the current revision, no legacy handshake | 96 | 0.9% |
| Dual-era: current and backwards compatible | 594 | 5.5% |
| Legacy only: no modern surface answered | 6,541 | 60.1% |
| Answered, but neither era could be confirmed | 3,659 | 33.6% |
7,230 of the 10,890 graded endpoints (66.4%) carry at least one critical finding, counting the OAuth posture rule alongside the era rules.
Maintained, or just still listed?
A dead endpoint that returns 200 is indistinguishable from a maintained one that chose not to migrate — unless you can date it. The registry skews heavily toward servers listed once and never touched again, so a flat percentage charges the whole ecosystem for what is largely a graveyard. Where an entry links a repository, the split below uses that repository's last push; otherwise it falls back to the date the registry entry itself was updated.
Dated by a repository push
74.5%
legacy-only, of 4,325 servers whose linked repository has been pushed to since 2026-07-28. Era undetermined for 18.6%.
Dated by a registry timestamp
39.0%
legacy-only, of 1,866 with no repository date to rest on. Era undetermined for 48.9% — a much weaker signal.
Some of that gap is composition rather than substance: the registry-dated group is far harder to classify at all. But the stronger signal is also the less flattering one, and it is the half to trust — the left-hand figure rests on servers whose maintainers demonstrably committed something after the revision shipped.
What fired
Findings across the 10,890 graded endpoints. A live probe only sees the outside, so the four rules that read a manifest — the TypeScript, Python, Rust and Go SDK versions — cannot appear here at all.
| MCP001 | critical | Legacy-only: answers the removed handshake, serves no modern surface | 6,541 |
| MCP002 | critical | Session id minted for a modern request | 310 |
| MCP006 | critical | Auth without RFC 9728 protected-resource metadata | 677 |
| MCP003 | warning | Deprecated logging capability | 408 |
| MCP004 | warning | Deprecated sampling capability | 4 |
| MCP005 | warning | Deprecated roots capability | 2 |
| MCP008 | warning | Modern server without server/discover | 17 |
| MCP101 | info | Dual-era: current and still backwards compatible | 594 |
| MCP102 | info | Session ids issued to legacy clients only | 74 |
What this snapshot is not
- Not a conformance suite. A fixed set of rules covers the breaking changes visible from outside. A server can pass every one of them and still be broken.
- One probe, one moment. Each endpoint was contacted once on 2026-08-23. A server behind a cold start or a transient outage lands in the unreachable row rather than in a category it earned.
- Not every server could be classified. 33.6% of graded endpoints answered without revealing which era they serve, often from behind auth. They stay in the denominator and are claimed for neither side.
- An earlier version of this report was wrong. It counted every server that accepted the old handshake as unmigrated, which charged dual-era servers for doing exactly what the revision permits. The postmortem is in the repository.
And your server?
The rule engine behind every number on this page runs against one endpoint in about a second, or over a source tree without leaving your machine. Nothing is stored either way.
npx mcp-migration-check --source .