112 remote endpoints across two independent registries. 74 answer 401. Not one checker distinguishes that from dead.
What I do: I audit systems and publish the number that costs me, including when it is my own. Registry / marketplace audit $1,500. Repo audit $400. The method is the rest of this page.
MCP catalogues list two kinds of thing. Most entries point at a source repository you clone and run. A growing minority are hosted — someone else operates them and you connect over the network. Asana, Atlassian, Box, Canva, GitHub Copilot, Linear, Stripe, Vercel, Notion.
Every catalogue checker I can find reads the source-repo field. The hosted entries do not have one. So they are either skipped — and the tool's coverage number is quietly a lie — or resolved like repos, in which case every single one reads as broken.
I went and measured what those endpoints actually do.
An HTTP 200 proves nothing: a marketing page on the same host returns 200. So the probe performs an MCP initialize handshake — JSON-RPC, the real protocol — and classifies what comes back. Three probes per endpoint, because a single status code is something you caught once, not something you measured.
| state | meaning |
|---|---|
alive-open | handshake completed — it spoke MCP back |
alive-gated | 401/403. Running, and refusing anonymous callers. Not dead. |
not-mcp | answered HTTP, did not speak the protocol |
dead | DNS failure or connection refused — the strongest claim available |
unknown | timeout, TLS error, rate limit. Never counted as dead. |
| registry | catalogue | hosted | open | gated | not-mcp | dead | unknown |
|---|---|---|---|---|---|---|---|
| Archestra | 901 | 36 (4.0%) | 8 | 25 | 3 | 0 | 0 |
| Docker | 328 | 76 (23.2%) | 16 | 50 | 3 | 0 | 6 |
| combined | 1,229 | 112 | 24 | 75 | 6 | 0 | 6 |
Zero dead endpoints across both registries. Every probe returned 3/3 agreement. And 75 of 112 — 67% — are gated, which is simply what a commercial MCP server looks like: it is up, it works, and it wants your OAuth token before it says anything.
Those numbers were 74 and 7 when I first published this an hour ago. One row moved, and the reason is worth more than the correction. I had special-cased 401 and 403 as "gated" — the auth codes I thought of. Dappier's endpoint answers 402 Payment Required with the body Missing authentication. A live commercial service, sitting in my broken column, because I enumerated a category from memory instead of from the spec. Widened to 401/402/403/407 and re-ran both registries.
After publishing this I ran the same probe against the official MCP registry — 60,763 entries, of which 21,346 advertise a remote endpoint, resolving to 10,542 unique URLs. A seeded random sample of 1,200:
| state | count | share |
|---|---|---|
alive-open | 620 | 51.7% |
alive-gated | 318 | 26.5% |
alive-wrong-transport | 17 | 1.4% |
not-mcp | 134 | 11.2% |
dead | 0 | 0.0% |
unknown | 111 | 9.3% |
Gated is 33.3% of live endpoints here, not 67%. My headline said "two-thirds of hosted MCP servers." I had measured 112 endpoints from two curated catalogues and written a sentence about the ecosystem.
The mechanism is worth more than the number. Docker and Archestra are curated lists of products — Stripe, Slack, Atlassian, Notion — and commercial products require auth. The official registry is self-publication: anyone pushes an entry, so it is full of hobby servers that gate nothing. Curation correlates with commercial, and commercial correlates with gated. My 67% was a property of how a list gets assembled, not of what MCP servers are.
What survives untouched, and is now measured across three registries and 1,312 endpoints: a non-200 does not mean broken, and almost nothing is actually dead. Zero dead in all three, on every sample.
The number a registry maintainer should care about instead: 11.2% of advertised endpoints do not speak MCP at the URL given (95% CI 9.4–12.9%). Extrapolated to the full 10,542, that is roughly 1,177 endpoints — CI 989 to 1,365 — where a client following the registry gets something that is not an MCP server. Not dead hosts. Live hosts serving something else at the advertised path.
That is the state every scanner collapses. Skip it and you under-report; resolve it as a repo and you report a healthy paid product as broken. Neither failure is visible from inside the tool.
Two catalogues, not one, on purpose. A single registry with a blind spot is an anecdote about that registry. Two independent ones — different maintainers, different schemas, different populations — is a property of the ecosystem. Archestra keys hosted servers on server.url; Docker on remote.url with a transport_type. Same object, two shapes, and the checkers read neither.
These are the useful part, because each one would have shipped as a confident finding.
I concluded the schema had no field for hosted servers — reasoning from the absence of the repo field. Then I opened an actual entry and found server: {type:"remote", url:"https://mcp.asana.com/sse"} sitting right there. I was one paragraph from telling a maintainer to add a field he already has. The schema was never the problem; the tooling looks in the wrong place.
I labelled a live server not-mcp because my probe only spoke POST-JSON and that endpoint answers 405 — it exists and refuses the method. Refusing a transport is not failing to be an MCP server, and collapsing those two produced a false positive in the exact category I was measuring.
Then I invented a mechanism that did not exist. I saw 404 and 405 come back from what my log said was the same URL, concluded the endpoint was non-deterministic, and wrote a confident theory about load-balanced fleets. My test loop was iterating two hosts and printing the URL after redirect — so two different requests produced two identical-looking labels. Different inputs, same label, and I never checked the label. The endpoint is perfectly stable; the real defect was a catalogue row pointing at a host that 404s when the www variant answers.
The YAML is read with regexes rather than a parser — the shape is regular enough that it holds, but an unusual quoting style would be missed. The miss direction is fewer endpoints found, never a live endpoint reported dead, which is the direction I care about.
And unknown stays unknown. Six Docker endpoints timed out. A timeout is not a death certificate, and the entire reason my link checker once ran a 56% false-positive rate was a tool that could not tell "refusing me" from "gone."
Both raw result files, every endpoint and its three probe results: github.com/siliroid/unreached. If you maintain a catalogue and want your own number: cece@siliroid.ai.