How these numbers were measured

9.8% of the endpoints the official MCP registry declares fail the MCP initialize handshake: 3634 of 36912, measured on 2026-11-01. The listing was walked to the end - 54142 entries - rather than sampled.

Separately, 5.5% of the npm and PyPI packages those entries name are not installable as named: 1087 of 19836. Nothing was installed to find that out - the package registry's own document says whether the package and the declared version exist.

Why published figures for this disagree

Figures for how much of the MCP ecosystem is broken range from about one in ten to more than half. They are not measuring the same thing, and the number moves for three reasons before anyone probes anything.

So the figure above is published with its denominator attached, and every record carries the request that produced it. You are not asked to accept the rate; you are given what you need to recompute it.

What was deliberately not counted

Each of these was produced by this registry's own harvesters and then rejected. They are the difference between a defect and a thing that merely failed.

A server that answers 401 with a usable challenge
167 of 171 endpoints in one commercial catalogue refuse an anonymous handshake with a 401 carrying WWW-Authenticate and a resource_metadata pointer that resolves. That is the MCP authorization specification working. Counting it would have published 272 false claims in an afternoon.
A server that demands payment
402 means something is there to pay for. It is alive.
Anything we were rate-limited out of
429 is our own crawl pressure, never the subject's defect.
A package we did not install
18089 of the MCP registry's 54142 entries, read on 2026-11-01, ship only as an installable package. Nothing is ever installed to inspect it, so what is checked is whether the package registry publishes the package and the exact version the entry declares - not whether the code works.
A deprecated package, counted apart from a missing one
A deprecated package installs and runs, and its registry usually names the replacement. It is recorded, under its own kind, and never folded into 'there is nothing to install'.
A response we could not read as a defect
405, 406 and 400 can mean our request was at fault. A registry that blames the subject for its own malformed call is measuring itself.
An operation nobody examined
Absence from this registry is absence of observation. It is never published as health.

What a record contains

A claim, what was observed, and a check: a method, a URL and the result we saw. Run the check. If it answers differently, the record is withdrawn - 1141 already have been. Nothing here asks to be believed.

The loop runs every night; a record is re-checked when its own interval is up - the next night for one held awaiting a second observation, within thirty days for a settled one. "Re-checked nightly" is what this page said until somebody counted, and what it meant was that the loop runs nightly, not that every record does.

Records are never deleted. A withdrawal is not a claim of health: it means this particular check stopped supporting this particular claim.

The open classes, by size

kindopen records
endpoint_gone1369
host_gone881
declared_package_deprecated800
server_error779
document_gone560
not_a_conformant_mcp_endpoint518
host_unreachable437
auth_unknown_resolved_credentials_required413
entry_unexpanded_template366
timeout263
declared_package_gone138
declared_package_unpublished67
rejects_mandatory_notification61
declared_package_version_absent53

Built from errata-2026-09-10@c2ce1acdc653 on 2026-09-10. The whole registry is machine-readable, and llms.txt says the same thing in one screen. To ask about one tool: /check?tool=<identity>.

All subjects