mcpsweep
A small, dependency-free discovery and fingerprinting scanner for MCP-over-HTTP
servers. It finds Model Context Protocol endpoints on a host or network,
performs the JSON-RPC initialize handshake to fingerprint each one, enumerates
its tools / resources / prompts, and flags risky or poisoned tools.
It is strictly read-only — it performs the handshake and */list calls only,
and never invokes a tool (tools/call).
Authorized use only. Scan hosts you own or are explicitly permitted to test.
Why
MCP servers are easy to spin up and often ship with no authentication, over-broad
tools (arbitrary SQL, shell, money movement), or instructions hidden inside a
tool's description (tool poisoning). mcpsweep helps you inventory that surface
— including shadow servers nobody registered — and see the risk at a glance.
Install
pip install mcpsweep
Or from source:
git clone https://github.com/krishnareddypadala/mcpsweep && cd mcpsweep
pip install .
Usage
# scan one host on a known port
mcpsweep 10.10.0.31 --ports 8090
# route everything through Burp for inspection
mcpsweep 10.10.0.31 --ports 8090 --proxy http://127.0.0.1:8080
# sweep a subnet and a port range, also list resources/prompts
mcpsweep 10.10.0.0/28 --ports 8000-9100 --full
# a full URL, and a target list from a file
mcpsweep http://10.10.0.31:8090/mcp/api
mcpsweep -iL targets.txt --exclude 10.10.0.5
# authenticated scan (servers that require a token)
mcpsweep 10.10.0.31 --ports 8090 --bearer "$TOKEN"
mcpsweep 10.10.0.31 --ports 8090 -H "X-Api-Key: abc123"
# reports: JSON, Markdown, SARIF (GitHub code-scanning), self-contained HTML
mcpsweep 10.10.0.31 --ports 8090 --format json -o report.json
mcpsweep 10.10.0.31 --ports 8090 --format md -o report.md
mcpsweep 10.10.0.31 --ports 8090 --format sarif -o report.sarif
mcpsweep 10.10.0.31 --ports 8090 --format html -o report.html
# CI gates: only show high+, fail the build on any critical
mcpsweep 10.10.0.31 --ports 8090 --severity high --fail-on critical
# drift detection between two JSON scans (continuous posture monitoring)
mcpsweep diff yesterday.json today.json --fail-on-drift
Key options
| Flag | Purpose |
|---|---|
--target-file/-iL |
read targets from a file (one per line, # comments) |
--exclude |
comma-separated hosts to skip |
--ports |
ports/ranges, e.g. 8090,8000,9000-9010 |
--paths |
URL paths to probe (defaults cover /mcp, /mcp/api, /sse, …) |
--scheme |
http, https, or both |
--header/-H, --bearer |
custom header(s) / bearer token for authenticated scans |
--proxy |
send all traffic via a proxy (e.g. Burp on 127.0.0.1:8080) |
--insecure/-k |
skip TLS verification |
--full |
also enumerate resources/list and prompts/list |
--severity |
only report endpoints at/above a level |
--fail-on |
exit 2 if any endpoint is at/above a level (CI gate) |
--format/-f |
text (default), json, md, sarif, html |
--concurrency/-c |
parallel probes (default 16) |
Exit codes: 0 found (or clean), 1 nothing found, 2 --fail-on threshold hit,
3 drift found (diff --fail-on-drift).
Drift detection
mcpsweep 10.10.0.31 --ports 8090 -f json -o baseline.json # week 1
mcpsweep 10.10.0.31 --ports 8090 -f json -o current.json # week 2
mcpsweep diff baseline.json current.json
Reports new / removed servers and tools, newly-poisoned descriptions, and risk-level changes — turning point-in-time scans into continuous monitoring.
Windows / Git Bash note: Git Bash (MSYS) rewrites arguments that look like Unix paths, so
--paths /mcp/apibecomes a Windows path before the tool sees it. Either omit--paths(the built-in defaults are unaffected), prefix the command withMSYS_NO_PATHCONV=1, or run from PowerShell /cmd.
What it detects
- Live MCP endpoints across many candidate paths/ports, via the
initializehandshake (Streamable-HTTP and SSE-framed responses). - Server fingerprint: name, version, protocol, capabilities, instructions.
- No authentication:
initializethat succeeds with no credentials. - Auth-gated endpoints:
401/403with an MCP/WWW-Authenticatesignature. - Risky tools: name/description heuristics tag
rce,sql,money,destructive,write,secret,pii,filesystem, … - Prompt injection / poisoning in tool descriptions and server
instructions, prompt templates, and resource listings ("ignore previous instructions", "silently", "password_hash", …). - Injection surface: high-impact tools (
sql/rce/…) that accept a free-form string parameter. - HTTP fingerprint:
Server/X-Powered-Byheaders, and server names that hint at an elevated or untrusted purpose.
A per-endpoint risk score rolls these up into low / medium / high / critical.
Library use
from mcpsweep import scan
for ep in scan(["10.10.0.31"], ports=[8090], proxy="http://127.0.0.1:8080"):
print(ep.url, ep.server_name, ep.risk_level)
for t in ep.tools:
print(" ", t.name, t.tags, "POISONED" if t.poisoned else "")
License
MIT
Metadata
Release files for mcpsweep 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcpsweep-0.2.0.tar.gz | 20.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcpsweep-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.8 kB
Release files / mcpsweep-0.2.0.tar.gz
| Download URL | mcpsweep-0.2.0.tar.gz |
|---|---|
| Size | 20.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
54eb67ed01f0d990bc9c58eecbd6032bd162a5ccf8cc76935a1c02a74044e79d
|
|
BLAKE2b-256 checksum How to use checksums |
bfcb9e333de26ae9536821e2ae49d8f7668cc3262cd9077cf481f85ba3d712e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / mcpsweep-0.2.0-py3-none-any.whl
| Download URL | mcpsweep-0.2.0-py3-none-any.whl |
|---|---|
| Size | 19.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
51385c9953aa4cfd88323b1ba5a96a9d778faea766047e98a3d7a1f556475003
|
|
BLAKE2b-256 checksum How to use checksums |
ffd283c0298dd156ff7cb07182845413040ba8e5e0dddc79f53e6482364a88e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|