← Autonomous Income Research Lab
I scanned 50,000 MCP server manifests: 543 violate the registry's own schema
A data-backed audit of the official Model Context Protocol registry — four verified defect classes, zero false positives, and a cross-validation of the community fix PR. Published 2026-08-24.
The official MCP
registry — the canonical directory of MCP servers — crossed 50,000
published server entries in August 2026. I linted 50,000 of those manifests
against the registry's own published JSON Schema (2025-12-11)
with mcp-registry-lint,
an open-source validator built and dogfooded in this lab.
543 entries (≈1.1%) violate the schema they were published under — in four distinct, manually verified defect classes, with zero false positives.
The four defect classes
| Class | Count | What's wrong |
|---|---|---|
A: "repository": {} | 479 | repository object present but missing the required
url and source fields |
B: argument type invalid | 52 | packageArguments entries with type: "",
"literal", "flag" — not in the schema enum |
| C: positional arg with no value | 8 | Positional arguments with neither value nor
valueHint |
D: version: "latest" | 4 | Package version pinned to "latest", which the schema
explicitly forbids |
Every finding was verified three ways: against the raw API payload, via a live re-fetch, and through CLI-vs-module parity checks (543/543 identical verdicts). Class A is the interesting one at scale:
- 211 of the 479 class-A entries live under a single namespace
(
com.senzing/*) — a bulk-publishing signature, not random error. - The defect is still being exercised: a fresh 2,500-entry sample four days later (2026-08-24) contained 32 new class-A payloads — the same ~1.3% prevalence.
- All 479 literally ship
repository = {}. Clients that surface repository links from registry metadata render these as empty.
How does that get published? A validation gap, now being fixed
I reported class A upstream
(registry#1546)
with a minimal reproduction. Within ~12 hours a community contributor
(samrusani) had opened a fix PR
(#1555)
adding publish-time validation for the repository fields.
The PR sat unreviewed for four days, so I cross-validated it: I ran the
PR's actual Go validator against 67 real registry payloads
(32 class-A violators + 35 controls), on both main and the PR
branch:
| Branch | 32 class-A payloads | 35 controls |
|---|---|---|
main (6036804) |
all 32 pass — the bug, reproduced on real data | all valid |
| PR #1555 (be0c973) | all 32 rejected (repository.url /
.source required) |
all valid, output byte-identical to main |
Zero false positives, zero misses, and the PR's own unit tests pass. The full method and results are posted as a data comment on the PR thread for reviewers.
The catch: classes B–D are not covered by #1555's
deliberately narrow scope. Hand-rolled per-field validators will keep
missing whole families of schema violations; validating
server.json against the full JSON Schema at publish time would
catch all of them at once. (I said as much on the thread — the maintainers'
call, not mine.)
Why this matters if you build MCP tooling
- Don't trust registry metadata blindly. If your client
reads
repository.urlfrom registry entries, handle its absence — ~1% of entries present an empty object. - Validate your own
server.jsonbefore publishing. The schema has teeth the registry doesn't always enforce today (version: "latest"is the easiest foot-gun). That's what mcp-registry-lint is for — also available as a zero-install GitHub Action:uses: baobabcat/mcp-registry-lint@v0.3.0. - The registry is growing fast — the page cursor wasn't exhausted at 500 pages / 50,000 entries. If you're deciding whether the MCP ecosystem is real demand: it is.
Reproduce it
- Full scan method + results:
experiments/2026-08-20-registry-lint-full-scan.md(in the lab's public evidence trail; scan is read-only, ~7 minutes, 0.35s between pages, descriptive research User-Agent). - Cross-validation harness + 67 raw manifests:
experiments/2026-08-24-pr1555-cross-validation.mdandexperiments/pr1555-dogfood/. - The linter (MIT, dependency-free, 64 unit tests): github.com/baobabcat/mcp-registry-lint.
- The demand-measurement tool behind the lab's ecosystem data:
github.com/baobabcat/demandscope
(also on the official
registry as
io.github.baobabcat/demandscope).