mcpmap
  
用于发现和安全审计的网络扫描仪 主控程序 跨IP范围的服务器。与nmap类似,但适用于模型上下文协议。
安装
# Homebrew (macOS/Linux)
brew install canack/tap/mcpmap
# Cargo
cargo install mcpmap
# Shell one-liner (macOS/Linux)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/canack/mcpmap/releases/latest/download/mcpmap-installer.sh | sh
# Docker
docker run --rm ghcr.io/canack/mcpmap:latest 192.168.1.0/24上所有平台的预构建二进制文件 .
用法
mcpmap 192.168.1.0/24 # discover MCP servers
mcpmap 192.168.1.0/24 --enumerate # list tools + risk levels
mcpmap 192.168.1.0/24 --enumerate --active # active security audit (safe, metadata-only)
mcpmap 192.168.1.0/24 --enumerate --active \
--probe-tools --i-accept-risk # call LOW-risk tools
mcpmap 192.168.1.0/24 --enumerate --active \
--pin baseline.json # save tool hashes
mcpmap 192.168.1.0/24 --enumerate --active \
--verify baseline.json # verify against baseline
mcpmap 192.168.1.0/24 --enumerate --json # JSON output for CI/CD运作原理
Targets ──▶ Port Scan ──▶ HTTP Probe ──▶ MCP Handshake ──▶ Security Checks
│
--enumerate: Tool Enumeration
│
--active: Behavioral Probing被动(默认): 端口扫描→ HTTP启发式→ JSON-RPC initialize 握手→ origin/auth/session验证→ 工具枚举和风险分类。
活动(--active): 模式中毒、资源注入、工具占用、临时地毯拉取、渗透链、跨服务器操作、响应注入、拒绝钱包。
主动探测层
| 级别 | 标志 | 它的作用 |
|---|---|---|
| 1--安全 | --active | 仅元数据:工具/列表、资源/列表、模式分析。没有工具调用。 |
| 2--受控 | + --probe-tools --i-accept-risk | 使用测试输入调用低风险工具(读取、获取、列表、搜索)。 |
| 3--攻击性 | + --probe-medium | 也称为中等风险工具。只有最重要的。 |
从不调用关键/高风险工具。没有旗帜可以覆盖这一点。
安全限制:3个调用/工具,50个调用/服务器,5秒/调用超时,100KB响应上限,总探测超时120秒。
安全检测
被动和主动扫描中的15个漏洞类别:
| ID | 漏洞 | 服务。 | 模式 |
|---|---|---|---|
| MCP-001 | DNS重新绑定(缺少源验证) | 高 | 被动 |
| MCP-002 | 缺少身份验证 | 高 | 被动 |
| MCP-003 | 不安全传输(无TLS) | 医疗 | 被动 |
| MCP-004 | 可预测会话ID | 高 | 被动 |
| MCP-005 | 危险工具暴露 | 临界值 | --enumerate |
| MCP-006 | 工具说明中的快速注射 | Med | --enumerate |
| MCP-007 | 资源含量注射 | 药物 | --active |
| MCP-008 | 架构中毒 | 高 | --active |
| MCP-009 | 工具名称浅写 | 高 | --active |
| MCP-010 | Rug pull(定义突变) | Crit | --active |
| MCP-011 | 反应注射(ATPA) | 高 | --probe-tools |
| MCP-012 | 拒绝钱包 | 医疗 | --probe-tools |
| MCP-013 | 渗出链风险 | 高 | --active |
| MCP-014 | 跨服务器操作 | 医疗 | --active |
| MCP-015 | 引脚验证失败 | 关键 | --verify |
输出示例
MCPMAP - 256 targets scanned in 3.42s
────────────────────────────────────────────────────────────
192.168.1.10:3001 [CONFIRMED 100%]
Server: filesystem-server/1.2.0 (MCP 2025-11-25)
Capabilities: tools, resources
Transport: SSE @ /mcp
Origin: NOT VALIDATED (DNS rebinding risk)
Tools: 5 discovered [HIGH RISK]
- read_file [Medium] - Read file contents
- write_file [High] - Write to files
- delete_file [Critical] - Delete files
Active Probe: Tier 2 executed, 3 findings
MCP-008 [HIGH] Schema poisoning: parameter 'content_include_env_vars'
MCP-010 [CRITICAL] Rug-pull: get_weather description changed after 3 calls
MCP-012 [MEDIUM] analyze_data returned 102KB (threshold: 50KB)
192.168.1.15:8000 [LIKELY 75%]
Server: unknown (MCP 2024-11-05)
Capabilities: tools
Transport: HTTP @ /
Auth: Required (Bearer)
────────────────────────────────────────────────────────────
2 MCP servers | 1 confirmed | 1 likely | 1 auth required选项
Scanning:
-m, --mode fast | full | stealth [default: fast]
-p, --ports
port range (80,443 or 1-1000)
-t, --threads concurrent threads [default: 50]
--timeout connection timeout [default: 5]
Probing:
--enumerate list tools on confirmed servers
--active active security probing (safe, metadata-only)
--probe-tools call LOW-risk tools with test inputs
--probe-medium also call MEDIUM-risk tools (pentest only)
--dry-run show probe plan without executing
--i-accept-risk explicit consent for tool invocation
--pin save tool/resource hashes
--verify verify against a saved pin file
Output:
--json JSON output
-W, --wide wide table (grep-friendly)
-q, --quiet suppress progress output
-v, --verbose verbose (-v, -vv, -vvv)Advanced options (see mcpmap --help)
Scanning:
--deep-probe try extra endpoints (/sse, /api/mcp, /v1/mcp)
--scheme http | https | both [default: both]
--insecure accept invalid TLS certs
--max-targets max IP:port combinations [default: 1000000]
--rate-limit max req/sec (0 = unlimited) [default: 0]
Output:
--show-all include low-confidence results
--min-confidence minimum confidence 0-100 [default: 0]退出代码
| 代码 | 含义 |
|---|---|
0 | 成功 |
1 | 错误 |
2 | Pin验证失败(--verify) |
