August 2026 edition
The MCP Security Index
We independently scanned 15,383 Model Context Protocol servers. 13% scored D or F, 0% ship committed secrets, and 33% declare no authentication at all.
Frozen · captured · scoring rubric v2.8.1 · methodology
Baseline edition. This is the first month we have recorded, so there is nothing to compare against yet. Month-over-month deltas appear in the next edition.
- Graded D or F
- 13%
- Committed secrets
- 0%
- No declared auth
- 33%
- Graded A
- 39%
2,000 of 15,383 scanned servers carry a failing or near-failing security grade.
Live credentials found in published source — an attacker can use these as-is.
No OAuth 2.1 or protected-resource metadata gating who may invoke the server's tools.
6,070 servers verifiably pass the controls that apply to them.
Grade distribution
The median MCP server scores 88/100. Half the corpus falls between 80 and 91.
15,383 scored servers
| Mean score | 79.4 |
| Median score | 88 |
| 25th percentile | 80 |
| 75th percentile | 91 |
| Lowest score | 11 |
| Highest score | 100 |
Popularity does not mean safety
Adoption and security posture move independently. The most-installed servers are not the safest ones.
By GitHub stars
| Cohort | servers | Average score | Graded D/F |
|---|---|---|---|
| 1,000+ stars | 156 | 62 | 37% |
| 100–999 stars | 544 | 76 | 17% |
| 10–99 stars | 1,429 | 75 | 19% |
| Under 10 stars | 11,891 | 82 | 8% |
By monthly downloads
| Cohort | servers | Average score | Graded D/F |
|---|---|---|---|
| 100k+/month | 29 | 76 | 21% |
| 10k–100k/month | 70 | 78 | 14% |
| 1k–10k/month | 1,177 | 80 | 12% |
| Under 1k/month | 4,995 | 85 | 6% |
Authentication and live exposure
We reached 4,764 live MCP endpoints. Of those, 2% declared that authentication was required and then served their tool surface to an anonymous caller.
- Live endpoints probed
- 4,764
- Auth declared but not enforced
- 2%
- Tool-poisoning markers
- 1%
Servers we connected to and spoke MCP with directly.
Of probed endpoints — documented auth that anonymous callers get straight past.
Hidden instructions found in tool descriptions, which hijack the calling agent.
Attack surface and ecosystem
More exposed tools means more ways to be wrong. Ecosystem mix shows where the risk concentrates.
By number of exposed tools
| Cohort | servers | Average score | Graded D/F |
|---|---|---|---|
| No tools | 3,808 | 79 | 7% |
| 1–5 tools | 3,831 | 82 | 11% |
| 6–20 tools | 4,328 | 80 | 15% |
| 20+ tools | 3,416 | 76 | 18% |
By package ecosystem
| Cohort | servers | Average score | Graded D/F |
|---|---|---|---|
| npm | 6,482 | 84 | 7% |
| repo / remote-only | 5,997 | 74 | 20% |
| pypi | 2,626 | 80 | 10% |
| mcpb | 179 | 81 | 9% |
| nuget | 80 | 87 | 6% |
| cargo | 19 | 85 | 5% |
What the ecosystem fails most
Every control in the catalog, ranked by failure rate within each domain. Failure rates are a share of servers where the control actually applied and could be evaluated.
Code safety
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| No command-injection sinksGuardcode.no_command_injection | 7% | 1,078 | 0 | 14,877 |
| No dynamic code executionGuardcode.no_code_eval | 1% | 171 | 0 | 14,877 |
| No unsafe deserializationGuardcode.no_unsafe_deserialize | 1% | 86 | 0 | 14,877 |
| No path traversalGuardcode.no_path_traversal | 0% | 0 | 2,510 | 14,877 |
| No SSRF sinksGuardcode.no_ssrf | 0% | 0 | 4,986 | 14,877 |
Secrets & credentials
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| No committed secretsGuardsecrets.no_committed_secrets | 0% | 0 | 0 | 14,877 |
| Credentials sourced from environmentsecrets.from_env | 0% | 0 | 5,163 | 14,877 |
Dependencies & supply chain
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| No install/post-install scriptsGuardsupply.no_install_scripts | 5% | 328 | 0 | 6,471 |
| Package name not typosquattingGuardsupply.not_typosquatting | 0% | 7 | 0 | 9,083 |
| No known-vulnerable dependenciessupply.no_known_vulns | 0% | 0 | 2,163 | 10,921 |
| Dependencies pinned (lockfile)supply.deps_pinned | 0% | 0 | 11,421 | 14,877 |
| Published with provenancesupply.provenance | 0% | 0 | 5,163 | 6,471 |
| Established maintainersupply.maintainer_established | 0% | 0 | 8,267 | 9,083 |
Tool integrity
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| No over-broad / destructive toolsGuardtool.no_destructive_scope | 2% | 238 | 0 | 11,575 |
| Tool descriptions free of injection markersGuardtool.no_injection_markers | 2% | 196 | 0 | 11,575 |
| No risky post-publish tool changes (rug-pull)Guardtool.no_rug_pull | 0% | 6 | 687 | 4,438 |
| Strict tool input schemastool.schemas_strict | 0% | 0 | 10,198 | 11,295 |
Auth & transport
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| Remote endpoints use TLSGuardtransport.uses_tls | 0% | 0 | 0 | 6,117 |
| Authentication declaredauth.declared | 0% | 0 | 5,121 | 6,117 |
| Execution sandboxingdeploy.sandboxed | 0% | 0 | 12,006 | 14,877 |
| Live endpoint reachabledynamic.reachable | 0% | 0 | 1,431 | 4,730 |
| Authentication enforceddynamic.auth_enforced | 0% | 0 | 113 | 517 |
| No bind-all / exposed debugtransport.no_bind_all | 0% | 0 | 2,152 | 14,877 |
Maintenance & governance
| Control | Failure rate | Failed | Warned | Evaluated |
|---|---|---|---|---|
| Repository not archivedGuardmaint.not_archived | 1% | 136 | 0 | 14,020 |
| Actively maintainedmaint.actively_maintained | 0% | 0 | 344 | 14,020 |
| Declares a licensegov.declares_license | 0% | 0 | 3,165 | 14,020 |
| Has a security policygov.security_policy | 0% | 0 | 12,582 | 14,877 |
| Signed releasesgov.signed_releases | 0% | 0 | 0 | 0 |
| Adoption & popularityreputation.adoption | 0% | 0 | 8,012 | 14,866 |
How much we could verify
Absence of evidence is not safety. A partially-scannable server cannot present a high score, so confidence caps it.
| Cohort | servers | Average score | Graded D/F |
|---|---|---|---|
| High (80%+ verified) | 12,811 | 81 | 10% |
| 60–80% verified | 2,066 | 77 | 5% |
| 40–60% verified | 1 | 60 | 0% |
| Low (under 40% verified) | 505 | 40 | 100% |
A further 4,906 listed servers declare no public repository or their source cannot be retrieved. They are listed without a score rather than given an invented one.
How to read these numbers
- How often does the MCP Security Index update?
- The live page recomputes from the database continuously; a permanent edition is frozen at the end of every calendar month at /mcp-security-index/YYYY-MM. Servers themselves are re-ingested and re-scanned every six hours, so a score change shows up on the live page the same day.
- What does a D or F grade actually mean?
- Grades come from a 0–100 score: A is 90 and up, B 75–89, C 60–74, D 40–59, F below 40. A confirmed security flaw caps the score outright — a server with a verified command-injection sink cannot exceed 20 no matter how good the rest of it is — so D and F overwhelmingly indicate a specific, evidenced problem rather than a general lack of polish.
- Are month-over-month deltas comparing the same servers?
- No. Distribution deltas cover the whole corpus, which grows as new servers are ingested, so part of any shift is composition rather than servers changing. The 'biggest score drops' section is the cohort-stable view: those are specific servers that were re-scanned and scored lower than before.
- Why are some listed servers not scored at all?
- If a server declares no public repository, or its source cannot be retrieved because it is private, moved, or removed, there is nothing to verify. Those are listed as unverified with no score rather than given an invented number, and they are excluded from every percentage on this page.
- What counts as 'no authentication'?
- A server that declares no authentication mechanism — no OAuth 2.1, no protected-resource metadata — so nothing gates who may invoke its tools. Separately, among servers whose live endpoints we probed, some declare that auth is required and then serve their full tool surface to an anonymous caller; that is reported as 'auth declared but not enforced'.
- Can I use these numbers in my own work?
- Yes. The full dataset behind each edition is downloadable as JSON and CSV from the page itself. Cite the Canopii Trust Index and link to the specific monthly edition you used, so the numbers you quoted remain verifiable.
Take the data
Every number on this page is downloadable. Attribution to the Canopii Trust Index is all we ask.
Past editions
Looking for a specific server? Browse the full directory — every server page shows its complete control checklist with the evidence behind each result.