关于 mcp-scan
mcp-scan 是供开发者和团队评估 MCP 服务风险的被动安全扫描器。它静态检查服务公开的能力,以 A–F 评级,并可输出控制台、JSON 或 SARIF 报告。
主要功能
- 0112 项 OWASP MCP Top 10 检查
- 02静态检查工具、提示词和资源
- 03跨工具 toxic-flow 分析
- 04A–F 等级与 0–100 分
- 05控制台、JSON 和 SARIF 报告
- 06命令行与 MCP 服务模式
适用场景
- 01接入客户端前检查 MCP 服务
- 02扫描 HTTP 或 stdio MCP 端点
- 03使用 SARIF 结果设置 CI 门禁
MCP 相关
通过枚举 MCP 服务公开的工具、提示词和资源进行扫描,不会调用工具。作为服务运行时,它向 MCP 客户端提供 `scan_mcp_server` 和 `list_checks`。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
2收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| env | object | 否 | stdio 子进程的环境变量。 |
| url | string | 否 | 远程 Streamable-HTTP 或 SSE MCP 服务的 URL。请提供此项或 'command'。 |
| args | array | 否 | stdio 命令的参数,例如 ['-y', '@modelcontextprotocol/server-filesystem', '/tmp']。 |
| format | enum | 否 | 报告格式。'summary'(默认)是易读的摘要;'json' 和 'sarif' 是机器可读格式。summary | json | sarif |
| command | string | 否 | stdio MCP 服务的可执行文件,例如 'npx'。请提供此项或 'url'。 |
| headers | object | 否 | url 目标的 HTTP 标头,例如 { "Authorization": "Bearer ..." }。 |
详细介绍
🛡️ mcp-scan
用于 Model Context Protocol 服务的被动安全扫描器。 将其指向任意正在运行的 MCP 服务;它会依据 OWASP MCP Top 10 审计实时服务,并评定 A–F 等级。只读,因此可安全用于生产环境。
npx owasp-mcp-scan --stdio "npx -y @modelcontextprotocol/server-filesystem /tmp"
我用它扫描了安装量最高的 12 个 MCP 服务。其中 9 个未通过。 无需安装、无需配置,也不会利用任何漏洞。
为什么要用
MCP 工具描述会直接馈入模型的上下文,而大多数公开服务从未经过安全审查。恶意服务可能在描述中隐藏指令、暴露原始 Shell 工具,或泄露密钥;而你的 Agent 会据此采取行动。Endor Labs 发现,82% 的服务容易遭受路径遍历攻击,34% 容易遭受命令注入攻击。
mcp-scan 是接入服务前的安全检查。 它采用被动扫描:读取已公布的功能并进行静态分析,从不调用工具,因此可安全地用于生产环境中的服务。
工作原理
- 通过 stdio 或 Streamable HTTP 连接服务,并枚举其公布的所有工具、提示词和资源。
- 针对这些内容运行 12 项静态检查:密钥、注入、SSRF、路径遍历、工具投毒、权限范围过大等。
toxic-flow会分析整套工具,推断是否存在致命三要素(读取私有数据 + 接收不可信内容 + 能够外传数据);这是单工具扫描器会漏掉的情况。- 评分范围为 0-100,等级为 A-F(出现任何严重问题都会被评为 F)。输出格式支持控制台、JSON 或 SARIF。
它从不调用工具、不会进行模糊测试,也不会发送任何漏洞利用内容。它最过分的行为,也只是读取服务已经向所有人公开的信息。
真实服务上的实际发现
12 个热门 npm 服务的实际输出(快照日期:2026-07-11,完整基准测试):
| 服务 | 工具数 | 等级 | 🔴 | 🟠 | 🟡 | 值得注意的问题 |
|---|---|---|---|---|---|---|
firecrawl-mcp | 26 | F | 2 | 11 | 1 | 致命三要素(MCP10)+ code 执行(MCP05) |
@modelcontextprotocol/server-filesystem | 14 | F | 0 | 1 | 11 | 路径参数不受限制(MCP01) |
@modelcontextprotocol/server-puppeteer | 7 | F | 1 | 2 | 0 | script 参数会执行 JS(MCP05) |
tavily-mcp | 5 | F | 0 | 3 | 1 | 不可信输入 + 数据外传(MCP10) |
@modelcontextprotocol/server-memory | 9 | F | 0 | 3 | 0 | delete_* 工具无需确认即可使用(MCP02) |
@modelcontextprotocol/server-github | 26 | D | 0 | 0 | 2 | 会改变状态的工具(MCP02) |
@modelcontextprotocol/server-slack | 8 | C | 0 | 1 | 0 | 读取 + 发布 = 数据 + 外传(MCP10) |
@modelcontextprotocol/server-everything | 13 | A | 0 | 0 | 0 | 无问题 ✓ |
@kazuph/mcp-fetch | 1 | A | 0 | 0 | 0 | 无问题 ✓ |
12 个服务中有 9 个被标记,3 个无问题;每项发现都经过逐条审计,而不是凑数报告误报。你可以自行复现任意一行:
npx owasp-mcp-scan --stdio "npx -y firecrawl-mcp" # F: lethal trifecta + code exec
npx owasp-mcp-scan --stdio "npx -y @modelcontextprotocol/server-everything" # A: clean
使用方法
CLI
npx owasp-mcp-scan --stdio "<command>" # local stdio server
npx owasp-mcp-scan --url https://host/mcp --header "Authorization: Bearer $TOKEN"
npx owasp-mcp-scan --config ~/.cursor/mcp.json --format sarif --output mcp.sarif
作为 MCP 服务,让你的 Agent 按需扫描服务(“添加此 MCP 服务前先扫描它”)。添加到任意客户端;此 mcpServers 格式适用于 Claude Code、Claude Desktop、Cursor、Windsurf、VS Code 和 Gemini CLI:
{ "mcpServers": { "mcp-scan": { "command": "npx", "args": ["-y", "owasp-mcp-scan", "--serve"] } } }
OpenAI Codex(~/.codex/config.toml):
[mcp_servers.mcp-scan]
command = "npx"
args = ["-y", "owasp-mcp-scan", "--serve"]
提供两个工具:scan_mcp_server(审计 stdio/HTTP 目标)和 list_checks。
Claude Code 插件
/plugin marketplace add CodingSelim/mcp-scan
/plugin install mcp-scan@mcp-scan
也已发布到官方 MCP 注册表,名称为 io.github.CodingSelim/mcp-scan。发布步骤:PUBLISHING.md。
检查内容
完整覆盖 OWASP MCP Top 10 (2025),共 12 项检查:
| 检查项 | OWASP | 检测内容 |
|---|---|---|
secret-exposure | MCP01 | 对外公开文本中的 AWS / OpenAI / Anthropic / GitHub / GitLab / Stripe / SendGrid / npm / HF / 数据库 URI / JWT / 私钥 |
transport | MCP01 | 向非回环主机发送明文 http:// 请求 |
path-traversal | MCP01 | file:///{path} 模板和不受约束的路径参数 |
excessive-scope | MCP02 | 无需确认即可执行的破坏性工具(delete、drop、transfer) |
tool-poisoning | MCP03 | 指令覆盖、隐藏的数据外传指令、零宽字符 / Unicode 标签隐写 |
tool-shadowing | MCP03 / MCP09 | 重复的工具名称冲突和“先调用我”优先级注入 |
supply-chain | MCP04 / MCP09 | 未固定 / 占位版本和使用同形异义字符的服务名称 |
command-injection | MCP05 | 不受约束的 command / shell / code 参数、原始 SQL、对外声明的执行能力 |
ssrf | MCP05 | 没有允许列表的任意 url / host 参数 |
tool-poisoning(动态) | MCP06 | 资源内容和服务指令中的注入 |
authn | MCP07 | 能完成未认证握手的 HTTP 服务 |
telemetry | MCP08 | 没有审计记录的高影响工具(仅供参考,不计分) |
toxic-flow | MCP10 | 致命三要素:单个服务既能读取私有数据、接收不可信内容,又能外传数据 |
toxic-flow 是其中的亮点,它会对整个工具集进行推理,能够检测出逐工具检查会漏掉的 GitHub-MCP / 邮件 Agent 注入模式。
输出与 CI
console(默认)· json · sarif(GitHub Code Scanning)。当结果达到或超过 --fail-on(默认为 high)时,退出代码为非零,因此可用于拦截 CI:
- run: npx owasp-mcp-scan --url ${{ secrets.MCP_URL }} --format sarif --output mcp.sarif
- uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: mcp.sarif }
局限性(请阅读)
- 静态分析无法识别运行时沙箱,因此即使服务能安全地限制路径,也仍会触发告警。请根据实际执行的限制措施进行验证。
- 身份验证和传输检查仅适用于 HTTP 目标。
- 启发式规则倾向于提高召回率,因此请结合上下文进行结果研判。收紧规则以消除误报时,会通过测试固定预期行为。
- 扫描 stdio 目标会启动相应命令,因此仅对你信任的服务运行扫描。
开发
npm install && npm run build && npm test # 48 tests, incl. live end-to-end fixture scans
检查项彼此独立且不产生副作用(src/checks/),并复用 src/detectors/ 中的检测器。请参阅 CONTRIBUTING.md。
参考资料
OWASP MCP Top 10 · MCP Security Cheat Sheet · Vulnerable MCP Project · MCPTox
MIT © CodingSelim
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。