Pre-flight checks for MCP servers: passive token footprint, use-case scoping, security, and name safety. LLM-facing quality scorecard.
Project description
mcp-scorecard
⚠️ Status: v0.1 alpha — under active development. Rules, thresholds, and scoring are being calibrated against real-world MCP servers.
Pre-flight checks for MCP (Model Context Protocol) servers.
mcp-scorecard answers one question: "Is this MCP server safe and efficient enough for LLMs to actually use?" — before you publish it, install it, or let it into your agent config.
Existing MCP tools cover runtime security (MCP-Scan) and protocol compliance (MCP Inspector). This one covers the missing layer: how expensive is the server just to keep registered, and are its tools scoped well enough for an LLM to pick the right one?
Companion tool to the book 『MCP実践セキュリティ』 (Impress NextPublishing).
The four layers
| Layer | What it measures | Status |
|---|---|---|
| A. Passive Footprint | Tokens the server steals from every LLM turn just by being listed. tools/list initial load, per-tool cost, bloat ratio, schema verbosity |
v0.1 |
| B. Use-Case Scoping | Whether each tool is narrow enough that the LLM knows when to use it. When-to-use present, vague verb scan, overlap detection, naming consistency, AI Slop | v0.1 |
| C. Security | Own rules (prompt injection in description, tool shadowing, hardcoded secrets, transport hygiene) + optional MCP-Scan wrap | v0.1 own rules; wrap in v0.2 |
| D. Name Safety | Case collision, brand similarity, separator variants, namespace hygiene | v0.1 |
Design details: docs/design.md.
Install
pip install mcp-scorecard # CLI + library
pip install "mcp-scorecard[mcp]" # + MCP server (stdio)
Use as a CLI
# Full scan
mcp-scorecard scan ./path/to/server.py
mcp-scorecard scan http://localhost:8000/
mcp-scorecard scan pypi:some-mcp
# Layer-only
mcp-scorecard footprint ./server.py
mcp-scorecard scoping ./server.py
mcp-scorecard security ./server.py
mcp-scorecard name my-new-mcp
# CI-friendly
mcp-scorecard scan ./server.py --json
mcp-scorecard scan ./server.py --format sarif
# exit codes: 0=GREEN/YELLOW, 1=ORANGE, 2=RED
Use as an MCP server (self-hosting)
Register mcp-scorecard itself as an MCP tool in Claude Code / Cursor / Windsurf, then ask the LLM to audit another MCP:
{
"mcpServers": {
"mcp-scorecard": {
"command": "mcp-scorecard-mcp"
}
}
}
Then in chat: "score the MCP server at ./my-server.py".
Why passive footprint matters
Every tool description and inputSchema in a registered MCP server is sent to the LLM on every turn — because the model needs to see them to decide which tool to call. A single verbose server can silently burn 5,000+ tokens per turn before anyone touches it.
mcp-scorecard footprint measures exactly that, so you can trim before you publish.
Roadmap
- v0.1 — Layers A + B + D full, Layer C own rules, CLI + MCP server
- v0.2 — MCP-Scan wrap, SARIF, real MCP client negotiation
- v0.3 — Book『MCP実践セキュリティ』章別ルール取り込み
- v0.4 — Registry-source targets (
github:/npm:)
Support this project
- 💚 GitHub Sponsors
- ☕ Ko-fi
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_scorecard-0.1.1.tar.gz.
File metadata
- Download URL: mcp_scorecard-0.1.1.tar.gz
- Upload date:
- Size: 23.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c3803d7153373016ef5135e8f188afd95f3a3aed7d94f14db55fc1cc69caa3d
|
|
| MD5 |
a39143eef3931272ab03e5f3d2ac2391
|
|
| BLAKE2b-256 |
eba45399c605cc40c3d623e0efce7fef3ee06f82e53e64a69941ffc38bd633db
|
Provenance
The following attestation bundles were made for mcp_scorecard-0.1.1.tar.gz:
Publisher:
publish.yml on kenimo49/mcp-scorecard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_scorecard-0.1.1.tar.gz -
Subject digest:
4c3803d7153373016ef5135e8f188afd95f3a3aed7d94f14db55fc1cc69caa3d - Sigstore transparency entry: 2163676258
- Sigstore integration time:
-
Permalink:
kenimo49/mcp-scorecard@572665a45115840e055c7ee23c9425ffe0a5fb18 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/kenimo49
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@572665a45115840e055c7ee23c9425ffe0a5fb18 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file mcp_scorecard-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mcp_scorecard-0.1.1-py3-none-any.whl
- Upload date:
- Size: 21.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8840b72cfb3dc66d25b1f2b936decfbc8b375e1a2d71edc179a35d1978bfce06
|
|
| MD5 |
10a0db49b4ab3cda6a8e3fabfd9d4d4c
|
|
| BLAKE2b-256 |
1775b2f884ebe913212d34d9b70cff9599f9e00fe426f0e2f6c242e309bef159
|
Provenance
The following attestation bundles were made for mcp_scorecard-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on kenimo49/mcp-scorecard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_scorecard-0.1.1-py3-none-any.whl -
Subject digest:
8840b72cfb3dc66d25b1f2b936decfbc8b375e1a2d71edc179a35d1978bfce06 - Sigstore transparency entry: 2163676273
- Sigstore integration time:
-
Permalink:
kenimo49/mcp-scorecard@572665a45115840e055c7ee23c9425ffe0a5fb18 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/kenimo49
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@572665a45115840e055c7ee23c9425ffe0a5fb18 -
Trigger Event:
workflow_dispatch
-
Statement type: