Research · census of 2026-07-20

2,069 listed MCP servers point at source code that is not publicly accessible.

On 2026-07-20 we checked every repository and website URL carried by the 17,673 servers in the official MCP registry. 1,830 of the 13,105 distinct GitHub repositories those servers reference could not be reached, one in seven. What has gone is the ability to read the code before you hand it to an agent. This census measured URL reachability only; it makes no claim about whether a package still installs.

Every MCP registry has this problem, mcpindex’s own catalog included — these are our listings. The difference is that we measure it and publish the measurement.

What we found

Servers listed in the registry17,673
Distinct GitHub repositories referenced13,105
Repositories not publicly accessible (HTTP 404; one HTTP 451)1,830
Servers affected by an unreachable repository2,069
Website URLs unreachable (single vantage — see limits)304

Why “not publicly accessible” and not “deleted”

GitHub returns the same 404 for a repository that was deleted and one that was made private. We cannot tell those apart, so we do not claim to. Both mean the same thing for the reader who matters: the source backing a tool your agent may call can no longer be audited by anyone. A maintainer who took a repository private on purpose has done nothing wrong, and the wording on every affected listing says so.

Method

  1. Every repositoryUrl and websiteUrl in the 2026-07-20 registry snapshot, de-duplicated to distinct URLs (13,105 repositories from 17,673 servers).
  2. Each repository probed with git ls-remote, then — this matters — corroborated through the authenticated GitHub API. Anonymous git answers a missing repository with a credential prompt rather than a 404, so a checker that trusts anonymous git alone reports zero casualties and looks healthy doing it. That bug hid all 1,830 of these from our own first two passes.
  3. Only HTTP 404, 410, 451 and NXDOMAIN count as unreachable. Rate limits, timeouts, 401s, 403s and 5xx are recorded as unknown and never counted against a project.
  4. A random sample of 150 was re-checked by hand through a different method (unauthenticated web), a different network, and no credentials. All 150 agreed, which bounds the false-positive rate at 2.0% (95% confidence).
  5. The sweep’s result digest is stamped to Bitcoin via OpenTimestamps, so the date of this measurement is independently verifiable and cannot be backdated — including by us.

Limits

What to do about it

If you install MCP servers as packages, an unreachable repository is a real audit gap: pin the version you already reviewed, because you can no longer diff what you are running against anything. If you connect to a hosted server, the repository was never the code that executes — treat it as context, not as a reason to disconnect. Affected listings say which case applies, and maintainers can dispute any flag from the listing itself.

Cite this

The full dataset — aggregates, the per-server list, and the OpenTimestamps proof — is archived with a DOI and a CC-BY-4.0 license. Paste the BibTeX into your .bib file:

BibTeX · Source Liveness · Baseline v1
@dataset{bharti2026liveness,
  author    = {Bharti, Gautam},
  title     = {mcpindex Source Liveness -- Baseline v1: a corroborated, timestamp-anchored
              census of source reachability in the Model Context Protocol registry},
  year      = {2026},
  publisher = {Zenodo},
  doi       = {10.5281/zenodo.21501867},
  url       = {https://doi.org/10.5281/zenodo.21501867},
  note      = {Concept DOI; resolves to the latest version. CC-BY-4.0. Live: https://mcpindex.ai/research/source-liveness}
}

Concept DOI (series): 10.5281/zenodo.21501867. First-edition version DOI: 10.5281/zenodo.21501868.

Method and limits: how a verdict is produced. Corrections and disputes: hello@mcpindex.ai.

Source liveness censusA census funnel over the MCP registry. 17,673 listed servers reference 13,105 GitHub repositories. Each repository was checked from two independent vantages with a 48-hour debounce, producing zero cross-vantage disagreements. 1,830 repositories, 14.0%, were not publicly reachable, affecting 2,069 listed servers. The census digest is anchored to Bitcoin via OpenTimestamps and archived under CC-BY-4.0 with a DOI. The evidence is negative-only: an absent entry means nothing publishable, never a healthy verdict.listed servers17,673extract the referenced source repository for eachreferenced GitHub repositories13,105vantage Avantage B0 cross-vantage disagreementsconfirmed only after 2 failures ≥48h apartrepository reachability1,830 not publicly reachable · 14.0% · one in sevenlisted servers affected2,069CENSUS 2026-07-20· DIGEST ANCHORED TO BITCOIN VIA OPENTIMESTAMPS · CC BY 4.0 · DOI 10.5281/ZENODO.21501868Negative-only evidence: an absent entry means nothing publishable, never“verified healthy” — a reachable repository proves only that a URL resolves.
Fig. 15 · 14.0% of referenced repositories were unreachable, confirmed by two independent vantages with zero disagreements.
Read Fig. 15 as text
  listed servers                    17,673
        |  extract referenced source repositories
        v
  referenced GitHub repositories    13,105
        |
        +-- vantage A --+
        |               +-- 0 cross-vantage disagreements (48h debounce)
        +-- vantage B --+
        v
  not publicly reachable            1,830  (14.0%, one in seven)
        |
        v
  listed servers affected           2,069

  census date 2026-07-20. digest anchored to bitcoin via OpenTimestamps.
  CC-BY-4.0, DOI 10.5281/zenodo.21501867 (concept DOI - resolves to the current version).
  NEGATIVE-ONLY evidence: an absent entry means nothing publishable, never
  "verified healthy" - a reachable repo proves only that a URL resolves.

Permalink, SVG & reuse · CC BY 4.0

The provenance chainA verdict is hashed with SHA-256 into an entry, chained to the prior entry, folded into a daily digest, and timestamped to Bitcoin via OpenTimestamps. Pending arrives in about ten minutes and Bitcoin-finalized at six confirmations in about an hour. This proves the verdict existed by some Bitcoin block and that the chain is auditable end to end. It does not prove minute-level ordering inside the confirmation window, and checking confirmation depth is the relying party job against their own Bitcoin node.verdicta finding on a toolentrychained to the priordaily digestone root per dayOTSOpenTimestampsbitcoin blockthe anchorsha256chainedfoldedstamped~10 min · pending~1 hour · N=6, finalPROVESthe verdict existed by some Bitcoin block. the chain is auditable end to end.DOES NOTprove minute-level ordering inside the confirmation window.confirmation-depth checking is the relying party’s job, against their own node.
Fig. 12 · The history cannot be quietly rewritten. Here is exactly what that does not prove.
Read Fig. 12 as text
  verdict --sha256--> entry --chained to prior--> daily digest --OTS--> bitcoin block
                                                                            |
                                                          ~10 min ----------+ pending
                                                          ~1 hour ----------+ N=6, final

  PROVES     the verdict existed by some block. the chain is auditable end to end.
  DOES NOT   prove minute-level ordering inside the confirmation window.
             confirmation-depth checking is the relying party's job, against
             their own bitcoin node.

Permalink, SVG & reuse · CC BY 4.0