MCP Blast-Radius Auditor
See what any MCP server can actually touch — before you add it to your agent.
No manifest? You still get the full blast-radius report. Add a manifest to also catch divergences.
Conflict-free verification: no phone-home, Ed25519 attestations, and the same audit rules applied to our own tools via public governance.json.
Also, if the server declares a manifest: Catch an MCP server that touches files it said it wouldn't — and block the merge in CI.
Statically extract what a third-party MCP server can reach (files, network, subprocess, env) via surface-level analysis. Compare against declared boundaries when a manifest is present.
Scan scope (default): production package only — excludes tests/, docs/, examples/, scripts/, benchmarks/, .github/, and test_*.py patterns; JSON output includes scan_scope and excluded_file_count. Pass --include-peripheral to scan the full repo.
Try it in 3 steps
① Scan your server in one command
pip install mcp-blast-radius==0.2.8
mcp-blast-radius-gate --gate-mode advisory --target-dir /path/to/your-mcp-server
Point --target-dir at your shipping package root (e.g. src/). Default scope excludes tests, docs, and scripts.
② Read the JSON
| Field | What it means |
|---|---|
gate_pass |
Scan finished (advisory = report either way; blocking = exit 1 on divergences) |
blocking_reasons |
Lines starting with DIVERGENCE: = declared vs. observed mismatch (if you ship a manifest) |
blast_radius |
Static capability surface (network, subprocess, env, filesystem) |
confidence labels |
declared / observed-static / cannot-determine — static only, upper bounds |
Undeclared capability is usually drift, not malice. Treat network/subprocess counts as upper bounds, not confirmed traffic.
③ Apply for an audit badge (optional, opt-in)
Ran a clean scan and want a signed README badge? Open a badge application — paste your command and JSON. Free, 90-day attestation, no phone-home. Criteria: BADGE_CRITERIA.md.
To verify any published attestation independently: pip install cryptography, then run packaging/scripts/verify_attestation.py (accepts local paths or HTTPS URLs). See BADGE_CRITERIA.md §Verify.
Machine-readable metadata
- Agent Card (capabilities, limitations, pricing): agent_card.json
- Catalog entry (pricing, install, MCP endpoint): aos-standard/catalog
- Spec: AOS-v0.1
Example walkthrough
git clone --depth 1 https://github.com/oraios/serena.git /tmp/serena
mcp-blast-radius-gate --gate-mode advisory --target-dir /tmp/serena
Inspect blast_radius and any DIVERGENCE: lines in blocking_reasons.
Report a scan question
Open a GitHub issue with your JSON output (structured template loads automatically).
30-second scan
pip install mcp-blast-radius
mcp-blast-radius-gate --gate-mode blocking --target-dir /path/to/mcp-server
pipx run mcp-blast-radius starts the MCP stdio server (for Claude Desktop / Cursor). For CLI scanning, use mcp-blast-radius-gate as above.
- Red (blocking): divergence detected — code touches paths or capabilities not declared in manifest.
- Green: no divergences (or no manifest — blast radius report only, advisory pass).
Install
python3 -m venv .venv
source .venv/bin/activate
pip install .
CLI entry
mcp-blast-radius # MCP stdio server
mcp-blast-radius-gate # CI gate (default blocking, exit 1 on fail)
CI blocking gate
mcp-blast-radius-gate --gate-mode blocking --target-dir .
# no divergences → exit 0 / divergences or declaration violations → exit 1
MCP tools
aos_compliance_validate— scan one MCP server directory (target_dirrequired;tool_idoptional label)aos_compliance_self_test— wiring smoke test
Default gate_mode=advisory. Use gate_mode=blocking in CI to fail on divergences.
What is extracted
| Layer | Scope | Confidence |
|---|---|---|
| Dependencies | requirements.txt, pyproject.toml, package.json |
declared |
| Python AST | imports, file I/O, network, env, subprocess; MCP tool attribution | observed-static / cannot-determine |
| Divergence | manifest permitted_output_paths / oracle_paths vs observed access |
blocking when mismatch |
Limitations: Static analysis only. Dynamic imports, getattr/eval, obfuscation, and native extensions may hide capabilities. We do not claim complete coverage — every finding includes a confidence label.
Environment
| Variable | Purpose |
|---|---|
AOS_VALIDATOR_TARGET_DIR |
Default scan root when target_dir is omitted |
AOS_VALIDATOR_MCP_LOG |
JSONL path for local tool call log (never sent externally) |
AOS_VALIDATOR_CALLER |
Caller label (ci, smoke_self_call, etc.) |
Example
aos_compliance_validate target_dir=/path/to/my-mcp-server gate_mode=blocking
License
MIT
Metadata
Release files for mcp-blast-radius 0.2.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mcp_blast_radius-0.2.8.tar.gz | 30.9 kB | Without provenance | Details for mcp_blast_radius-0.2.8.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mcp_blast_radius-0.2.8-py3-none-any.whl | Python 3 | none | any | Details for mcp_blast_radius-0.2.8-py3-none-any.whl |
Total release size: 65.1 kB
Release files / mcp_blast_radius-0.2.8.tar.gz
| Download URL | mcp_blast_radius-0.2.8.tar.gz |
|---|---|
| Size | 30.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
20535c4fbb4c22c4dd840722cb0de00d9f85843ecaaa3786a82939ce0c5de746
|
|
BLAKE2b-256 checksum How to use checksums |
215b76cffa25bf6b47608b3e70e010cb2e58a5b47d1a4fce06dfaf323b374daa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / mcp_blast_radius-0.2.8-py3-none-any.whl
| Download URL | mcp_blast_radius-0.2.8-py3-none-any.whl |
|---|---|
| Size | 34.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dc594ba15ad2d6241f6099db35eac1cde092b5b003f1c41e05c01ce123665ebf
|
|
BLAKE2b-256 checksum How to use checksums |
736e87bbec790184bbc342a030af3ef29d16e6bd7d79b7d582e07b50711ef202
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Security for mcp-blast-radius 0.2.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.