modelcontextprotocol / modelcontextprotocol/registry

759 declared endpoints fail the `initialize` handshake, and 70 more are broken before it

Open
#1,643 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Go
Stars
7.3k
Forks
994
Avg merge
4d 12h
Merged PRs (30d)
19

Description

Hello — a data-quality report, checkable one line at a time.

I sent one initialize handshake to every remote endpoint the registry
declares
. Reading, not calling: no tools/call was ever issued, and no
credential was ever sent. First run 2026-09-10, repeated weekly since —
generated from the live registry on 2026-09-15:

304 404 or 410 to initialize
254 the host no longer resolves in DNS
41 unreachable (connection or TLS failure)
96 server error or timeout, confirmed by a second observation
56 answers, but is not a conformant MCP endpoint
8 accept initialize, then reject the mandatory notifications/initialized with HTTP 400 — a client following the specification breaks here

And separately, needing no network at all:

70 the entry's URL still contains an unexpanded template placeholder, e.g. https://host:{HAPI_PORT}/mcp

Those 70 were never probed — they are broken on
their face, and they look like the cheapest thing to fix: they could be
rejected at submission.

What I deliberately did not count

A server answering 401 or 403 is alive, and is not in these figures at all.

56 HTTP 429s were discarded rather than recorded. A sequential re-probe, 2 s
apart, found 9 of 9 rate-limited endpoints answering on the second try — so
those were my own crawl pressure, not your data.

32 HTTP 402s were discarded too: a server demanding payment is working.

707 local-package entries were never probed. A package is not a defect, and
nothing is ever installed in order to inspect it.

Check any of it
curl -s -X POST https://<endpoint> -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"check","version":"1"}}}'

Full list: https://errata.apidefects.workers.dev/errata.json — filter on
subject.registry == "registry.modelcontextprotocol.io": 829
confirmed records
. If one is wrong it should be withdrawn, and 46
already have been
.

One more measurement, free with the same pass and possibly of use to you:
405 of the 2 606 live servers — 16 % — issue an Mcp-Session-Id on
initialize
that a client must capture and replay, or be rejected on
tools/list.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the registry submission path and the supplied errata.json examples, focusing first on entries whose URLs contain unexpanded template placeholders. Use the issue's curl command to understand the reported handshake cases; done should include rejecting malformed template URLs at submission and covering the behavior with tests, though no repository file or test is named.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.