groundforgeai/groundforge-mcp-inspector
GitHub: groundforgeai/groundforge-mcp-inspector
一款本地优先的 CLI 工具,用于在 AI Agent 连接 MCP 服务器前审查其暴露的工具与元数据,并基于 OWASP MCP Top 10 生成风险发现报告。
Stars: 0 | Forks: 0
# GroundForge MCP Inspector
GroundForge MCP Inspector 是一个本地 CLI 工具,用于在 MCP 服务器连接到 AI agent 之前审查其暴露的内容。
它会发现 MCP 工具、提示、资源、描述、输入 schema 和注解,然后生成一份包含规范化清单和发现时间点调查结果的 JSON 报告。
它回答的问题很简单:
该检查器不声称可利用性,也不批准生产环境的使用。它仅从 MCP 元数据中展示有证据支持审查点。
## 为什么这很重要
MCP 服务器可以暴露读取数据、发送消息、修改系统、执行代码或向 agent 返回不受信任上下文的工具。在将 MCP 服务器连接到 agent 之前,团队应了解该操作面。
典型的审查问题:
- 暴露了哪些工具、提示和资源?
- 哪些工具有输入 schema?
- 哪些工具看起来具有副作用、破坏性、特权、外部连接或执行能力?
- 描述、提示或资源中是否包含工具投毒或上下文注入模式?
- 调查结果是否足以支持审查,或者它们仅仅是微弱的元数据提示?
## MCP Top 10 重点关注
本项目使用 **OWASP MCP Top 10** 作为主要的控制分类标准。
当前的开源检查器专注于从 MCP 元数据中可以合理检测到的发现期信号:
- [MCP01:2025 - Token 管理不当与机密暴露](https://owasp.org/www-project-mcp-top-10/2025/MCP01-2025-Token-Mismanagement-and-Secret-Exposure)
- [MCP03:2025 - 工具投毒](https://owasp.org/www-project-mcp-top-10/2025/MCP03-2025%E2%80%93Tool-Poisoning)
- [MCP05:2025 - 命令注入与执行](https://owasp.org/www-project-mcp-top-10/2025/MCP05-2025%E2%80%93Command-Injection%26Execution)
- [MCP08:2025 - 缺乏审计与遥测](https://owasp.org/www-project-mcp-top-10/2025/MCP08-2025%E2%80%93Lack-of-Audit-and-Telemetry)
- [MCP10:2025 - 上下文注入与过度共享](https://owasp.org/www-project-mcp-top-10/2025/MCP10-2025%E2%80%93ContextInjection%26OverSharing)
当元数据提供合理的信号时,一些调查结果也会映射到这些 MCP 领域:
- [MCP02:2025 - 通过范围蔓延实现权限提升](https://owasp.org/www-project-mcp-top-10/2025/MCP02-2025%E2%80%93Privilege-Escalation-via-Scope-Creep)
- [MCP06:2025 - 意图流颠覆](https://owasp.org/www-project-mcp-top-10/2025/MCP06-2025%E2%80%93Intent-Flow-Subversion)
- [MCP07:2025 - 认证与授权不足](https://owasp.org/www-project-mcp-top-10/2025/MCP07-2025%E2%80%93Insufficient-Authentication%26Authorization)
MCP04 和 MCP09 很重要,但它们暂非此本地元数据检查器的主要关注点:
- [MCP04:2025 - 软件供应链攻击与依赖篡改](https://owasp.org/www-project-mcp-top-10/2025/MCP04-2025%E2%80%93Software-Supply-Chain-Attacks-and-Dependency-Tampering)
- [MCP09:2025 - 影子 MCP 服务器](https://owasp.org/www-project-mcp-top-10/2025/MCP09-2025%E2%80%93Shadow-MCP-Servers)
## 高层架构
```
flowchart TD
A["MCP server command / mcp.json config / inventory JSON"] --> B["Discovery"]
B --> C["Normalized MCP inventory"]
C --> D["Risk hints"]
C --> E["MCP metadata checks"]
C --> F["YARA metadata scan"]
E --> G["Findings mapped to MCP Top 10"]
F --> G
C --> H["JSON scan report"]
G --> H
H --> I["Terminal summary"]
H -. "optional import" .-> J["GroundForge platform"]
subgraph CLI["Local CLI"]
B
C
D
E
F
G
H
I
end
```
## 安装
```
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
```
## 使用方法
扫描本地 stdio MCP 服务器:
```
gf-mcp-inspector scan \
--command "python examples/mcp_servers/vulnerable_support/server.py" \
--output reports/vulnerable-support-report.json
```
服务器名称通过命令推断得出。仅在需要覆盖报告标签时使用 `--name`。
从 `mcp.json` 扫描服务器:
```
gf-mcp-inspector scan \
--config examples/mcp.json \
--server vulnerable-support \
--output reports/vulnerable-support-report.json
```
这避免了 shell 引号和 Docker 参数问题。检查器支持 MCP 客户端使用的常见 `mcpServers` 结构:
```
{
"mcpServers": {
"redis": {
"command": "docker",
"args": ["run", "-i", "--rm", "mcp/redis"],
"env": {
"REDIS_HOST": "host.docker.internal",
"REDIS_PORT": "6379"
}
}
}
}
```
从示例配置中扫描 Redis:
```
gf-mcp-inspector scan \
--config examples/mcp.json \
--server redis \
--output reports/redis-report.json
```
扫描现有的清单 JSON:
```
gf-mcp-inspector scan \
examples/inventories/vulnerable_support_inventory.json \
--output reports/vulnerable-support-report.json
```
使用自定义 YARA 规则目录:
```
gf-mcp-inspector scan \
examples/inventories/tool_poisoned_inventory.json \
--rules ./rules/yara/mcp-baseline \
--output reports/tool-poisoned-report.json
```
## 运行示例
```
$ gf-mcp-inspector scan \
> examples/inventories/tool_poisoned_inventory.json \
> --rules ./rules/yara/mcp-baseline \
> --output reports/tool-poisoned-report.json
GroundForge MCP Inspector
Target: Tool Poisoned MCP (stdio)
Tools: 3 | Prompts: 0 | Resources: 0
Findings: critical=0 high=1 medium=1 low=0 info=0 (3 evidence items in JSON)
Discovered tools
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Tool ┃ Fields ┃ Risk hints ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ summarize_ticket │ ticket_id │ sensitive_data │
│ update_ticket │ body, ticket_id │ write_action │
│ post_to_webhook │ payload, url │ external_communication, network_access │
└──────────────────┴─────────────────┴────────────────────────────────────────┘
Findings
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Severity ┃ Finding ┃ Controls ┃ Target ┃
┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ high │ Instruction override language in MCP │ • MCP03:2025 │ tool:summarize_ticket │
│ medium confidence │ metadata │ • MCP10:2025 │ tool:update_ticket │
│ │ GF-MCP03-TOOL-POISONING-INSTRUCTION-OVERRI… │ │ │
│ │ evidence: content_pattern │ │ │
│ medium │ Hidden instruction language in MCP metadata │ • MCP03:2025 │ tool:summarize_ticket │
│ medium confidence │ GF-MCP03-TOOL-POISONING-HIDDEN-INSTRUCTION │ │ │
│ │ evidence: content_pattern │ │ │
└───────────────────┴─────────────────────────────────────────────┴──────────────────────────────┴─────────────────────────────┘
Wrote reports/tool-poisoned-report.json
```
终端输出的是摘要。对于工具繁多的 MCP 服务器,具有相同规则的重复调查结果会在终端中分组显示,以保持审查的可读性。分组后的调查结果会列出所有受影响的工具。JSON 报告仍然包含完整的清单、每个工具的每项调查结果、控制措施、证据、置信度和建议。调查结果是发现阶段的审查项,而非已确认的漏洞。
## 发现过程中的 MCP 服务器日志
默认情况下,检查器会抑制子 MCP 服务器发出的 stderr 日志,以便扫描输出专注于清单和调查结果。如果发现失败,捕获的服务器日志将包含在错误消息中。
当需要查看 MCP 服务器启动日志时,请使用 `--verbose`:
```
gf-mcp-inspector scan \
--command "uvx blender-mcp" \
--output reports/blender-report.json \
--verbose
```
部分 MCP 服务器在成功返回元数据的同时,可能仍会报告依赖项问题。例如,桌面应用 MCP 服务器可能提示桌面应用程序未连接,但 `list_tools` 仍然有效。请将这些消息视为 MCP 服务器依赖日志,而非检查器的调查结果。
## 如何解读调查结果
检查器将微弱的元数据信号与值得审查的调查结果区分开来。
| 术语 | 含义 |
|---|---|
| 风险提示 | 从名称、描述、schema、字段或注解中推断出的标签。风险提示会出现在工具表中。它们本身不是调查结果。 |
| 调查结果 | 具有足够证据出现在调查结果表中的审查项。示例:通过自由格式输入实现的执行能力、工具投毒元数据、机密暴露语言、审计抑制语言或类似凭据的输入字段。调查结果并非已确认的漏洞利用。 |
| 置信度 | 发现阶段的证据强度。大多数仅基于元数据的调查结果置信度为 `medium`。类似凭据的字段名通常置信度为 `low`。 |
| 证据类型 | 调查结果是来自元数据、schema 字段、声明的描述、内容模式还是值模式。 |
## 内置 MCP 元数据检查
这些检查在规范化清单上运行。它们是通用的,不包含特定于服务器的例外情况。
| 检查组 | MCP 映射 | 捕获内容 |
|---|---|---|
| 清单规范性 | MCP03 | 缺失的输入 schema 和空的工具描述。 |
| 命令/代码执行 | MCP05 | 暴露 shell、命令、脚本或代码执行的工具名称、描述或字段。 |
| 宽泛输入的执行 | MCP05 | 具有宽泛字段(如 `command`、`code`、`script` 或 `payload`)且具备执行能力的工具。 |
| 类似凭据的输入 | MCP01 | 诸如 `token`、`api_key`、`subscription_key`、`secret` 或 `password` 的字段名称。这并非泄露机密的证据。 |
| 破坏性、财务和特权操作 | MCP02、MCP07 | 暗示删除、付款、退款或特权操作的工具元数据。诸如 `get`、`range`、`members`、`info` 和 `scan` 等类读取操作被视为清单上下文,而非写入调查结果。 |
| 携带敏感数据的外部传输 | MCP10 | 将外部通信指示器与敏感数据指示器结合的工具元数据。 |
## 基础 YARA 规则
基础规则包是通用的。它由 MCP 元数据模式构建,应在不相关的 MCP 服务器中均具有意义。
| 规则 | 主要 MCP 映射 | 目的 |
|---|---|---|
| `GF-MCP01-SECRET-EXPOSURE-METADATA` | MCP01 | 检测机密暴露语言以及少部分具体的机密值模式。 |
| `GF-MCP03-TOOL-POISONING-INSTRUCTION-OVERRIDE` | MCP03 | 检测指令覆盖语言,如“忽略之前的指令”或“系统覆盖”。 |
| `GF-MCP03-TOOL-POISONING-HIDDEN-INSTRUCTION` | MCP03 | 检测隐藏或隐秘的指令语言。 |
| `GF-MCP03-TOOL-POISONING-COVERT-CHAINING` | MCP03 | 检测指示 agent 静默调用另一个工具或将结果发送到别处的元数据。 |
| `GF-MCP05-COMMAND-OR-CODE-EXECUTION-METADATA` | MCP05 | 检测声明的 shell、命令、脚本或代码执行语言。 |
| `GF-MCP06-POLICY-BYPASS-METADATA` | MCP06 | 检测批准、审查、确认或绕过策略的语言。 |
| `GF-MCP06-DESTRUCTIVE-ACTION-PRESSURE-METADATA` | MCP06 | 检测在未经批准的情况下施压进行破坏性或变更性操作的元数据。 |
| `GF-MCP08-AUDIT-SUPPRESSION-METADATA` | MCP08 | 检测要求抑制日志、追踪或审计记录的元数据。 |
| `GF-MCP10-CONTEXT-INJECTION-METADATA` | MCP10 | 检测试图将自身注入 system/developer 上下文的资源或提示元数据。 |
| `GF-MCP10-DATA-EXFILTRATION-METADATA` | MCP10 | 检测批量导出、数据库转储、任意文件读取或外部数据传输语言。 |
## 规范规则组与控制映射
映射意味着“审查此领域”。这并不意味着 MCP 服务器是可利用的或不合规的。
| 规则组 | 示例 | 主要控制/风险映射 |
|---|---|---|
| Token 和机密暴露 | `GF-MCP01-SECRET-EXPOSURE-METADATA`、`GF-MCP01-CREDENTIAL-LIKE-INPUT` | - [MCP01:2025 - Token 管理不当与机密暴露](https://owasp.org/www-project-mcp-top-10/2025/MCP01-2025-Token-Mismanagement-and-Secret-Exposure) |
| 范围蔓延与高影响能力 | `GF-MCP02-FINANCIAL-ACTION-CAPABILITY`、`GF-MCP02-DESTRUCTIVE-ACTION-CAPABILITY`、`GF-MCP02-PRIVILEGED-ACTION-CAPABILITY` | - [MCP02:2025 - 通过范围蔓延实现权限提升](https://owasp.org/www-project-mcp-top-10/2025/MCP02-2025%E2%80%93Privilege-Escalation-via-Scope-Creep) |
| 工具投毒元数据 | `GF-MCP03-TOOL-POISONING-INSTRUCTION-OVERRIDE`、`GF-MCP03-TOOL-POISONING-HIDDEN-INSTRUCTION`、`GF-MCP03-TOOL-POISONING-COVERT-CHAINING`、`GF-MCP03-TOOL-MISSING-INPUT-SCHEMA` | - [MCP03:2025 - 工具投毒](https://owasp.org/www-project-mcp-top-10/2025/MCP03-2025%E2%80%93Tool-Poisoning) |
| 软件供应链 | 在 v0.1 中默认未覆盖 | - [MCP04:2025 - 软件供应链攻击与依赖篡改](https://owasp.org/www-project-mcp-top-10/2025/MCP04-2025%E2%80%93Software-Supply-Chain-Attacks-and-Dependency-Tampering) |
| 命令与代码执行 | `GF-MCP05-SHELL-EXECUTION-CAPABILITY`、`GF-MCP05-CODE-EXECUTION-CAPABILITY`、`GF-MCP05-FREEFORM-EXECUTION-INPUT`、`GF-MCP05-COMMAND-OR-CODE-EXECUTION-METADATA` | - [MCP05:2025 - 命令注入与执行](https://owasp.org/www-project-mcp-top-10/2025/MCP05-2025%E2%80%93Command-Injection%26Execution) |
| 意图流颠覆 | `GF-MCP06-POLICY-BYPASS-METADATA`、`GF-MCP06-DESTRUCTIVE-ACTION-PRESSURE-METADATA` | - [MCP06:2025 - 意图流颠覆](https://owasp.org/www-project-mcp-top-10/2025/MCP06-2025%E2%80%93Intent-Flow-Subversion) |
| 认证与授权审查 | 当元数据暗示存在破坏性、财务或特权操作时,高影响能力调查结果也可能映射到此处。 | - [MCP07:2025 - 认证与授权不足](https://owasp.org/www-project-mcp-top-10/2025/MCP07-2025%E2%80%93Insufficient-Authentication%26Authorization) |
| 审计与遥测抑制 | `GF-MCP08-AUDIT-SUPPRESSION-METADATA` | - [MCP08:2025 - 缺乏审计与遥测](https://owasp.org/www-project-mcp-top-10/2025/MCP08-2025%E2%80%93Lack-of-Audit-and-Telemetry) |
| 影子 MCP 服务器 | 在 v0.1 中默认未覆盖 | - [MCP09:2025 - 影子 MCP 服务器](https://owasp.org/www-project-mcp-top-10/2025/MCP09-2025%E2%80%93Shadow-MCP-Servers) |
| 上下文注入与过度共享 | `GF-MCP10-CONTEXT-INJECTION-METADATA`、`GF-MCP10-DATA-EXFILTRATION-METADATA`、`GF-MCP10-EXTERNAL-DELIVERY-WITH-SENSITIVE-DATA` | - [MCP10:2025 - 上下文注入与过度共享](https://owasp.org/www-project-mcp-top-10/2025/MCP10-2025%E2%80%93ContextInjection%26OverSharing) |
## MCP 服务器示例
该代码库包含了具有故意设计的风险元数据的本地 MCP 服务器。
| 示例 | 演示内容 |
|---|---|
| `examples/mcp_servers/vulnerable_support` | 客户查询、退款、外部电子邮件、shell 执行、破坏性操作元数据以及退款运行手册资源。 |
| `examples/mcp_servers/tool_poisoned` | 隐藏指令、指令覆盖、绕过审批以及外部 webhook 行为。 |
| `examples/mcp_servers/oversharing_resources` | 敏感资源名称、类机密资源 URI、客户导出元数据以及宽泛搜索行为。 |
请勿部署这些示例服务器或将其连接到真实系统。
## 项目结构
```
groundforge-mcp-inspector/
groundforge_mcp_inspector/
cli.py
models.py
mcp_config.py
risk_hints.py
metadata_checks.py
yara_scan.py
discovery/stdio.py
rules/yara/mcp-baseline/
mcp_metadata_baseline.yar
examples/
mcp.json
mcp_servers/
inventories/
docs/
schema.md
roadmap.md
```
## 高级风险扫描与策略控制
开源 CLI 用于本地 MCP 发现和初步检查。
GroundForge 平台增加了更深层次的风险扫描和策略控制:
- 针对 MCP 工具和 agent 工作流的策略建议
- 受管制的应用/runtime 配置文件
- 对工具调用和追踪的 runtime 监控
- 可疑运行检测
- 追踪证据与追踪到测试的转换
- 审批工作流和审计证据
- 对允许、审查、拒绝和观察决策的 runtime 执行
有关更多信息,请参阅 [groundforge.ai](https://groundforge.ai)。
## 许可证
基于 [Apache License 2.0]( ) 获得许可。
标签:MCP, 人工智能, 元数据分析, 安全审查, 文档结构分析, 用户模式Hook绕过, 逆向工具