mcpField
M
mcp-scan

mcp-scan

本地服务
github.com安全016 周前更新

关于 mcp-scan

mcp-scan 是供开发者和团队评估 MCP 服务风险的被动安全扫描器。它静态检查服务公开的能力,以 A–F 评级,并可输出控制台、JSON 或 SARIF 报告。

主要功能

  1. 0112 项 OWASP MCP Top 10 检查
  2. 02静态检查工具、提示词和资源
  3. 03跨工具 toxic-flow 分析
  4. 04A–F 等级与 0–100 分
  5. 05控制台、JSON 和 SARIF 报告
  6. 06命令行与 MCP 服务模式

适用场景

  1. 01接入客户端前检查 MCP 服务
  2. 02扫描 HTTP 或 stdio MCP 端点
  3. 03使用 SARIF 结果设置 CI 门禁

MCP 相关

通过枚举 MCP 服务公开的工具、提示词和资源进行扫描,不会调用工具。作为服务运行时,它向 MCP 客户端提供 `scan_mcp_server` 和 `list_checks`。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"codingselim-mcp-scan": {
"command": "npx",
"args": [
"-y",
"owasp-mcp-scan"
]
}
}
}
启动命令npx -y owasp-mcp-scan

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmowasp-mcp-scan0.2.1

工具

2

收录的工具列表 · 更新于 2 周前

参数类型必填说明
envobject否stdio 子进程的环境变量。
urlstring否远程 Streamable-HTTP 或 SSE MCP 服务的 URL。请提供此项或 'command'。
argsarray否stdio 命令的参数,例如 ['-y', '@modelcontextprotocol/server-filesystem', '/tmp']。
formatenum否报告格式。'summary'(默认)是易读的摘要;'json' 和 'sarif' 是机器可读格式。summary | json | sarif
commandstring否stdio MCP 服务的可执行文件,例如 'npx'。请提供此项或 'url'。
headersobject否url 目标的 HTTP 标头,例如 { "Authorization": "Bearer ..." }。

详细介绍

🛡️ mcp-scan

用于 Model Context Protocol 服务的被动安全扫描器。 将其指向任意正在运行的 MCP 服务;它会依据 OWASP MCP Top 10 审计实时服务,并评定 A–F 等级。只读,因此可安全用于生产环境。

npm License: MIT Node CI Tests OWASP MCP Top 10

npx owasp-mcp-scan --stdio "npx -y @modelcontextprotocol/server-filesystem /tmp"
mcp-scan 控制台报告:firecrawl-mcp 被评为 F 级,并有严重问题

我用它扫描了安装量最高的 12 个 MCP 服务。其中 9 个未通过。 无需安装、无需配置,也不会利用任何漏洞。


为什么要用

MCP 工具描述会直接馈入模型的上下文,而大多数公开服务从未经过安全审查。恶意服务可能在描述中隐藏指令、暴露原始 Shell 工具,或泄露密钥;而你的 Agent 会据此采取行动。Endor Labs 发现,82% 的服务容易遭受路径遍历攻击,34% 容易遭受命令注入攻击。

mcp-scan 是接入服务前的安全检查。 它采用被动扫描:读取已公布的功能并进行静态分析,从不调用工具,因此可安全地用于生产环境中的服务。

工作原理

  1. 通过 stdio 或 Streamable HTTP 连接服务,并枚举其公布的所有工具、提示词和资源。
  2. 针对这些内容运行 12 项静态检查:密钥、注入、SSRF、路径遍历、工具投毒、权限范围过大等。
  3. toxic-flow 会分析整套工具,推断是否存在致命三要素(读取私有数据 + 接收不可信内容 + 能够外传数据);这是单工具扫描器会漏掉的情况。
  4. 评分范围为 0-100,等级为 A-F(出现任何严重问题都会被评为 F)。输出格式支持控制台、JSON 或 SARIF。

它从不调用工具、不会进行模糊测试,也不会发送任何漏洞利用内容。它最过分的行为,也只是读取服务已经向所有人公开的信息。

真实服务上的实际发现

12 个热门 npm 服务的实际输出(快照日期:2026-07-11,完整基准测试):

服务工具数等级🔴🟠🟡值得注意的问题
firecrawl-mcp26F2111致命三要素(MCP10)+ code 执行(MCP05)
@modelcontextprotocol/server-filesystem14F0111路径参数不受限制(MCP01)
@modelcontextprotocol/server-puppeteer7F120script 参数会执行 JS(MCP05)
tavily-mcp5F031不可信输入 + 数据外传(MCP10)
@modelcontextprotocol/server-memory9F030delete_* 工具无需确认即可使用(MCP02)
@modelcontextprotocol/server-github26D002会改变状态的工具(MCP02)
@modelcontextprotocol/server-slack8C010读取 + 发布 = 数据 + 外传(MCP10)
@modelcontextprotocol/server-everything13A000无问题 ✓
@kazuph/mcp-fetch1A000无问题 ✓

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-exposureMCP01对外公开文本中的 AWS / OpenAI / Anthropic / GitHub / GitLab / Stripe / SendGrid / npm / HF / 数据库 URI / JWT / 私钥
transportMCP01向非回环主机发送明文 http:// 请求
path-traversalMCP01file:///{path} 模板和不受约束的路径参数
excessive-scopeMCP02无需确认即可执行的破坏性工具(delete、drop、transfer)
tool-poisoningMCP03指令覆盖、隐藏的数据外传指令、零宽字符 / Unicode 标签隐写
tool-shadowingMCP03 / MCP09重复的工具名称冲突和“先调用我”优先级注入
supply-chainMCP04 / MCP09未固定 / 占位版本和使用同形异义字符的服务名称
command-injectionMCP05不受约束的 command / shell / code 参数、原始 SQL、对外声明的执行能力
ssrfMCP05没有允许列表的任意 url / host 参数
tool-poisoning(动态)MCP06资源内容和服务指令中的注入
authnMCP07能完成未认证握手的 HTTP 服务
telemetryMCP08没有审计记录的高影响工具(仅供参考,不计分)
toxic-flowMCP10致命三要素:单个服务既能读取私有数据、接收不可信内容,又能外传数据

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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。