studiomeyer-io/mcp-gauntlet
GitHub: studiomeyer-io/mcp-gauntlet
面向 MCP 服务器的可靠性与安全性测试工具包,提供基于 schema 的模糊测试和负载测试两个 CLI,帮助开发者在部署前发现崩溃、校验缺陷和延迟瓶颈。
Stars: 0 | Forks: 0
# mcp-gauntlet
**一个用于 [Model Context Protocol](https://modelcontextprotocol.io) 服务器的可靠性 + 安全性工具包。**
两个单二进制 CLI 共享一个快速异步 MCP 客户端核心:
| 工具 | 功能 |
|------|--------------|
| 🔬 **[`mcp-fuzz`](crates/mcp-fuzz)** | 支持 schema 的模糊测试工具。读取每个工具的 `inputSchema` 并向其发送大量恶意/边界/畸形 payload —— 查找 **崩溃**、**挂起**、内部错误和隐式验证漏洞。为 GitHub code scanning 生成 **SARIF** 报告。 |
| 🌩️ **[`mcp-storm`](crates/mcp-storm)** | 负载测试工具(“MCP 版 k6”)。驱动 N 个并发 worker 对您的服务器进行测试,报告每个工具的 **p50/p95/p99** 延迟 + 吞吐量,并根据延迟/错误率阈值为 **CI 设置门禁**。 |
两者均使用 Rust 编写:各自为一个静态二进制文件,无需 runtime,可直接放入任何 CI 中。它们通过 **stdio**(子进程)或 **Streamable HTTP** 进行 MCP 通信。
## 为什么需要
MCP 服务器经常发生 [静默失败](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2734) 并且迭代迅速。大多数服务器 **没有针对畸形输入进行测试**,也 **没有延迟预算**。`mcp-gauntlet` 让您只需两条命令即可同时实现这两点,并且今天就能接入 CI —— 无需手写任何测试,因为 payload 是根据服务器自身的 schema 生成的。
## 安装
```
# 从 crates.io(发布后)
cargo install mcp-fuzz mcp-storm
# 或从源码
git clone https://github.com/studiomeyer-io/mcp-gauntlet
cd mcp-gauntlet && cargo build --release
# target/release/{mcp-fuzz,mcp-storm} 中的二进制文件
```
MSRV:Rust 1.82。
## `mcp-fuzz` — 在用户之前发现崩溃
```
# fuzz 一个 stdio server(-- 之后的所有内容为启动命令)
mcp-fuzz run --stdio -- node my-server.js
# fuzz 远程 HTTP endpoint,为 GitHub code scanning 写入 SARIF
mcp-fuzz run --http https://example.com/mcp --sarif findings.sarif
# 仅一个 tool,更多 payload,遇任何 HIGH 发现则 CI fail
mcp-fuzz run --stdio --tool search --iterations 300 --fail-on high -- ./server
```
它会建立连接,调用 `tools/list`,并根据 schema 为每个工具生成 payload:
- **类型混淆**(在需要数字的地方传入字符串等)
- **边界**(空字符串 / 10万字符的字符串,`i64::MAX`,负数,零,巨大的浮点数)
- **注入**(路径遍历、SQLi、命令/模板/格式化字符串注入、prompt 注入、CRLF、NUL 字节、RTL/零宽 Unicode)—— 仅作为 *数据* 发送,绝不执行
- **缺少必填字段**,**`arguments` 类型错误**,**深层嵌套**
结果会被分类:连接断开 ⇒ **崩溃** (HIGH),超时 ⇒ **挂起** (HIGH),`-32603` ⇒ **内部错误** (MEDIUM),在 schema 无效的输入上执行成功 ⇒ **接受无效输入** (LOW)。正常的 `-32602 invalid params` 会被视为服务器 *正确* 进行了验证 —— 不算作发现。
测试运行可复现(`--seed`)。发生崩溃后,模糊测试工具会重启服务器并继续测试;如果服务器无法恢复,它会记录一次该情况并干净地停止,而不是将后续的每个 payload 都归咎于最初的崩溃。
```
mcp-fuzz report
───────────────
server my-server (protocol 2025-11-25)
tools 7
payloads sent 412
findings 2 total — 1 high, 0 medium, 1 low, 0 info
Findings (worst first):
[HIGH ] crash search::server crashed on field 'query': null-byte
stderr tail:
thread 'main' panicked at 'invalid utf-8 ...'
[LOW ] accepted-invalid search::schema-invalid input accepted without error: missing required field 'query'
```
### 在 CI 中使用(GitHub code scanning)
```
- run: mcp-fuzz run --stdio --sarif mcp.sarif --fail-on high -- node server.js
- uses: github/codeql-action/upload-sarif@v3
if: always()
with: { sarif_file: mcp.sarif }
```
## `mcp-storm` — 了解您的延迟预算
```
# 使用 16 个 worker 对一个 stdio server 运行 30 秒
mcp-storm run --stdio --concurrency 16 --duration-secs 30 -- node my-server.js
# 针对固定请求数量的 HTTP,基于 p95 + error rate 门控 CI
mcp-storm run --http https://example.com/mcp --requests 5000 \
--threshold-p95-ms 250 --max-error-rate 1.0
```
```
mcp-storm report
────────────────
server my-server (protocol 2025-11-25)
workers 16
duration 30.00s
requests 48213 (3 errors, 0.01% error rate)
throughput 1607 req/s
tool calls err% p50ms p95ms p99ms maxms req/s
──────────────────────────────────────────────────────────────────────────────────────
search 31044 0.01% 6.20 14.80 31.10 102.40 1035
fetch 17169 0.00% 9.10 22.30 58.70 210.00 572
```
在 stdio 模式下,并发是真实的:请求通过单个管道进行多路复用,并由 JSON-RPC id 进行解复用,因此 N 个 worker 是真正重叠执行的。`--threshold-p95-ms` / `--max-error-rate` 参数使其在超出预算时以非零状态码退出 —— 可以直接将其放入 CI 门禁中。使用 `--warmup-secs` 来排除冷启动的影响。
## 工作区结构
```
mcp-gauntlet/
├── crates/mcp-gauntlet-core # shared async MCP client (stdio + HTTP), schema gen, mock server
├── crates/mcp-fuzz # the fuzzer CLI
└── crates/mcp-storm # the load tester CLI
```
`mcp-gauntlet-core` 也已发布 —— 它是一个小巧且支持并发的 MCP 客户端,您可以独立使用,它包含一个基于 schema 的值/突变生成器以及一个进程内的 [`mock`](crates/mcp-gauntlet-core/src/mock.rs) 服务器(`mcp-fuzz mock` / `mcp-storm mock`),您可以将这两个工具指向它,从而在零配置的情况下进行试用:
```
mcp-fuzz run --stdio -- mcp-fuzz mock # fuzz the bundled demo server
```
## 开发
```
cargo fmt --all
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features
```
## StudioMeyer MCP 工具包的一部分
这是一个专注于构建和运维 MCP 服务器的生产级小型工具家族 —— 您可以自由搭配使用:
- [mcp-armor](https://github.com/studiomeyer-io/mcp-armor) —— 运行时防御 sidecar:扫描工具调用,验证已签名的 manifest,拦截已知的恶意 CVE
- **mcp-gauntlet** *(本工具)** —— 部署前使用的 `mcp-fuzz`(基于 schema 的模糊测试工具)+ `mcp-storm`(负载测试工具)
- [mcp-otel](https://github.com/studiomeyer-io/mcp-otel) —— W3C Trace Context → OpenTelemetry 桥接器
- [mcp-cache-kit](https://github.com/studiomeyer-io/mcp-cache-kit) —— 防泄漏的 SEP-2549 缓存(`ttlMs` + `cacheScope`)
- [skilldoctor](https://github.com/studiomeyer-io/skilldoctor) —— 针对 agent skill 文件的 linter + 安全扫描器
## 许可证
MIT © StudioMeyer。参见 [LICENSE](LICENSE)。
标签:AI基础设施, ASM汇编, Rust, 压力测试, 可视化界面, 开发与测试工具, 模型上下文协议(MCP), 网络流量审计