mcphound
Independent security scanner and reputation layer for MCP servers and agent skills.
Status: pre-launch. v0.1 = static CLI scanning. Reputation site/API and the GitHub Action follow per ROADMAP.md.
mcphound discovers the MCP servers configured in your AI coding clients (Claude Code/Desktop, Cursor, Windsurf, Gemini CLI, OpenCode) and checks them for supply-chain risks: hardcoded secrets, download-and-execute launch commands, over-broad permissions, pinned-version drift, and (in later versions) tool-description poisoning, typosquats, and runtime rug-pulls. Findings map to the OWASP Top 10 for LLM and Agentic applications and can be exported as SARIF into GitHub code scanning.
Why another scanner?
Local scanning is covered by mcp-scan / Snyk Agent Scan. mcphound's job is the layers around it:
- A public reputation database — continuously scanned public registry, per-server risk pages and change history.
- Org-level enforcement —
mcp-policy.yaml+ GitHub Action that blocks risky MCP/skill changes in PRs. - Compliance reporting — findings mapped to OWASP, EU AI Act, and (later) Australian ISM / Essential Eight / DISP controls.
Quickstart
# published on PyPI as "mcphound"
uvx mcphound inspect # inspect what you have (never executes a server)
uvx mcphound scan # scan auto-discovered configs
# or install once:
# pip install mcphound / uv tool install mcphound
# CI: fail on high/critical findings, emit SARIF
mcphound scan .mcp.json --fail-on high --sarif -o mcphound.sarif
# opt-in: also run network-dependent checks (npm registry provenance) — slower,
# not fully deterministic offline, so it's off unless you ask for it
mcphound scan --deep
Development
uv sync --extra dev
uv run pytest -q # tests
uv run ruff check . # lint
make scan-self # scan this repo's own agent configs (dogfood)
Safety
mcphound static scanning never executes MCP servers. Dynamic analysis (post-v1) runs only inside the disposable, network-isolated sandbox in sandbox/. Every malicious test fixture carries the marker MCPHOUND-FIXTURE-CANARY and must never be referenced from agent configurations.
Authoring a detection rule
Every rule ships with four artifacts: YAML rule, malicious fixture, benign fixture, pytest. See .claude/skills/rule-authoring/SKILL.md (or the two worked examples under src/mcphound/rules/ and tests/).
License
Apache-2.0
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 mcphound-0.1.2.tar.gz.
File metadata
- Download URL: mcphound-0.1.2.tar.gz
- Upload date:
- Size: 77.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b88f23fbba2ab4ebe0859b308cb9869b90a846a1df16b780f1ad423bb7237d4
|
|
| MD5 |
beb9aa37624acd62ac03bb1f7654cd20
|
|
| BLAKE2b-256 |
795d9211380e4f410363b3f4f1339dccb852df97cd4b99004761fb560f2f1c7f
|
File details
Details for the file mcphound-0.1.2-py3-none-any.whl.
File metadata
- Download URL: mcphound-0.1.2-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79b761680440603bbaf927f4648d6d0453116c89db7e02914a15f2889cb16d32
|
|
| MD5 |
dcb090260e1f28b38c28afc3ba69f271
|
|
| BLAKE2b-256 |
b92f51154eeda80a0191eb383c0e15129bfd399da7963a86eb0669be1e29a5d5
|