{"slug": "i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken", "title": "I checked every MCP server in the official registry. About 1 in 10 is broken.", "summary": "A developer found that about one in ten remote MCP servers in the official registry is genuinely broken, contradicting a widely repeated claim that half are dead. The 'half' figure likely comes from counting servers requiring an API key as down. The developer warns that uptime checks miss the more critical issue of schema drift.", "body_md": "There is a number going around that roughly half of all remote MCP servers are dead.\n\nI had repeated it myself, in the README of a tool I published. I could not find where it came from, so I measured it.\n\nThe answer is that about **one in ten** is actually broken. The \"half\" figure appears to come from counting servers that require an API key as if they were down.\n\nHere is the method and the full breakdown.\n\nOn 29 July 2026 I pulled every entry from the [official MCP registry](https://registry.modelcontextprotocol.io) — 1,200 servers. Of those, **297 had status: active and advertised a remote endpoint URL** (the rest are stdio/local packages with nothing to probe over the network).\n\nEach got one anonymous JSON-RPC `initialize`\n\nover streamable HTTP, with a 10 second timeout:\n\n```\n{\n  \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"initialize\",\n  \"params\": {\n    \"protocolVersion\": \"2025-06-18\",\n    \"capabilities\": {},\n    \"clientInfo\": {\"name\": \"mcp-uptime\", \"version\": \"0.1.0\"}\n  }\n}\n```\n\nThen I classified the response: a valid `result`\n\ncontaining `protocolVersion`\n\nor `serverInfo`\n\nis up, 401/403 is auth-gated, and everything else got bucketed by its actual failure.\n\n| Result | Count | Share |\n|---|---|---|\n| Completed an MCP handshake | 133 | 44.8% |\n| Auth-gated (401/403) | 134 | 45.1% |\n| DNS failure | 8 | 2.7% |\n| Server error (5xx) | 6 | 2.0% |\n| Not found (404/410) | 5 | 1.7% |\n| Redirect (307/308) | 4 | 1.3% |\n| Timeout | 2 | 0.7% |\n| Non-MCP response | 2 | 0.7% |\n| Other (400, 405, connection) | 3 | 1.0% |\n\n**Reachable: 267 (89.9%). Genuinely broken: 30 (10.1%).**\n\nLook at the first two rows. **55.2% of these endpoints will not complete an anonymous handshake** — and that is suspiciously close to the number people quote.\n\nBut 134 of those 164 are returning a clean 401 or 403. They are running. They are answering. They want an API key, which is a completely reasonable thing for a hosted service to want.\n\nCounting those as dead inflates the failure rate by roughly five times.\n\nThis matters beyond pedantry: if you believe half the ecosystem is rubble, you build defensively against the wrong thing. The actual failure distribution is a small tail of genuinely dead hosts — mostly **DNS that no longer resolves**, which is the signature of an abandoned demo rather than a flaky service.\n\nLiveness is the easy question, and it is not the one that will hurt you.\n\nA server can return a perfect handshake and still break every agent that depends on it, because what agents actually consume is the **tool contract**: names, descriptions, and input schemas. Rename a tool, add a required parameter, tighten an enum — the endpoint stays green and your agent fails at call time, mid-run, looking for all the world like a model error.\n\nDowntime is loud. Schema drift is silent, and it surfaces as \"the AI is being weird today.\"\n\nSo an uptime check that pings a URL is measuring the least interesting property available. What you want to watch is whether the tool inventory and schemas changed since the last time you looked.\n\nThe sweep is about sixty lines: page through `/v0/servers`\n\n, keep active entries with a remote URL, POST one `initialize`\n\n, bucket the responses. If you run it and get materially different numbers, I would genuinely like to know.\n\nI also published the checker as a free tool — it does the handshake, the tool inventory, and the schema-drift comparison, as a [live MCP server](https://mcp-uptime.park11innyc.workers.dev/mcp) (`io.github.park11innyc-lgtm/mcp-uptime`\n\nin the registry) and as an Apify Actor. No auth, no cost.\n\nI published a number I had not verified, in a README, on a public page, about the exact domain the tool claims expertise in.\n\nThat is the same mistake I keep writing about from other angles: [trusting a status field instead of the artifact](https://dev.to/parkerrrrr/published-is-not-deliverable-what-five-storefront-apis-dont-tell-you-412h), and [the operational parts of MCP that tutorials skip](https://dev.to/parkerrrrr/the-parts-of-building-an-mcp-server-that-the-tutorials-skip-3n07). A widely-repeated statistic is a status field. It feels like knowledge and it is actually someone else's unverified claim, forwarded.\n\nMeasuring it took under an hour.", "url": "https://wpnews.pro/news/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken", "canonical_source": "https://dev.to/parkerrrrr/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken-1ehj", "published_at": "2026-07-30 21:15:54+00:00", "updated_at": "2026-07-30 21:32:37.195309+00:00", "lang": "en", "topics": ["developer-tools", "artificial-intelligence", "ai-agents"], "entities": ["MCP registry", "park11innyc-lgtm", "Apify"], "alternates": {"html": "https://wpnews.pro/news/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken", "markdown": "https://wpnews.pro/news/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken.md", "text": "https://wpnews.pro/news/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken.txt", "jsonld": "https://wpnews.pro/news/i-checked-every-mcp-server-in-the-official-registry-about-1-in-10-is-broken.jsonld"}}