使用说明
MCP负载测试仪
MCPLoadTester是一个用于模型上下文协议(MCP)服务器的负载测试工具包。
它允许使用以下工具对MCP工具和代理进行性能测试:
- Apache JMeter
- k6(计划)
- CLI工具(计划中)
兼容性
| 组件 | 版本 |
|---|---|
| Java | 11+ |
| Apache JMeter | 5.6.3(当前项目基线) |
| Gradle包装 | 8.10.2 |
安装
该项目现在构建了一个 瘦插件jar:
- 插件jar转到
JMETER_HOME/lib/ext - 运行时依赖关系转到
JMETER_HOME/lib
推荐本地安装(插件+依赖项)
JMETER_HOME=/path/to/apache-jmeter-5.6.3 ./gradlew installLocalWithDeps
仅插件本地安装
仅当依赖关系已在其他地方管理时才使用此选项。
JMETER_HOME=/path/to/apache-jmeter-5.6.3 ./gradlew installLocal
构建工件
./gradlew jar
罐子路径:
build/libs/jmeter-mcp-sampler-<version>.jar
插件管理器自定义回购(最新版本)
每个标记的版本现在都会发布一个插件管理器描述符资源:
https://github.com/AndreyVMarkelov/MCPLoadTester/releases/latest/download/plugins-repo.json
要在JMeter中添加此自定义仓库,请在 user.properties:
jpgc.repo.address=https://jmeter-plugins.org/repo/;https://github.com/AndreyVMarkelov/MCPLoadTester/releases/latest/download/plugins-repo.json
然后重新启动JMeter并打开插件管理器。
目录/显示名称为 MCPLoadTester JMeter MCP Sampler.
快速入门(2分钟)
路径注释:命令和 scripts/... 以下参数与此存储库根相关。
从repo根目录运行JMeter,或使用绝对路径。
- 安装插件(请参阅
Installation > Recommended local install上文)。 - 重新启动JMeter。
- 添加采样器:
Thread Group -> Add -> Sampler -> MCP Sampler.
- 使用具有以下采样器设置的本地回声模拟(stdio):
Transport:stdioCommand:python3Arguments:scripts/mock_mcp_server.pyMCP Method:tools/listClient name:jmeter-mcp-sampler(默认)Client version:1.0.0(默认)
- 添加响应断言:
Field to Test:Response DataPattern:echo
- 运行测试并验证断言是否通过。
HTTP+SSE快速入门
- 启动本地模拟HTTP+SSE服务器:
node scripts/mock_http_sse_mcp_server.js
- 在取样器组中:
Transport:http+sseHTTP base URL:http://127.0.0.1:8080SSE endpoint path:/eventsHTTP send path:/rpcMCP Method:tools/listValidation mode:none(使用JMeter时Response Assertion)
- 为HTTP状态添加响应断言:
Field to Test:Response CodePattern:200
- 运行测试并验证断言是否通过(
Response Code = 200,样品为绿色)。
替代方案:使用内置采样器验证而不是JMeter断言:
Validation mode:regexValidation expr:echo
GUI配置
| 字段 | 描述 | 示例 |
|---|---|---|
| 运输 | stdio, http, http+sse |
http+sse |
| 命令 | 要运行的可执行文件 | python3, node, uvx |
| 参数 | 传递给命令的以空格分隔的参数 | scripts/mock_mcp_server.py |
| HTTP基本URL | 目标MCP网关/服务器URL | http://127.0.0.1:8080 |
| HTTP发送路径 | JSON-RPC POST端点 | /rpc |
| SSE端点路径 | SSE流端点(HTTP+SSE模式) | /events |
| SSE连接模式 | per-sample 或 per-thread |
per-thread |
| 相关键 | 用于匹配SSE响应的字段 | id |
| 标题 | 多行 Key: Value |
Authorization: Bearer ... |
| 客户端名称 | 已发送 initialize |
jmeter-mcp-sampler |
| 客户端版本 | 已发送 initialize |
1.0.0 |
| 响应超时(ms) | 每个请求超时 | 30000 |
| 最大响应字节数 | 修剪样本数据中的响应有效载荷 | 65536 |
| 验证模式 | none, regex, jsonpath, equals |
jsonpath |
| 预热模式 | none, process, initialize |
initialize |
| MCP方法 | JSON-RPC方法族 | tools/list |
| 原始请求JSON | 完整的JSON-RPC模板 raw JSON 方法 |
{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\"} |
| 工具名称 | 使用人 tools/call |
echo |
| 参数(JSON) | 工具参数 tools/call |
{"message":"hello","count":2} |
屏幕截图指南和目录: docs/images/README.md
支持的MCP方法
| 采样器方法 | 发送JSON-RPC |
|---|---|
initialize |
initialize (以及 notifications/initialized 仅当初始化成功时) |
tools/list |
tools/list |
tools/call |
tools/call |
resources/list |
resources/list |
raw JSON |
用户提供的JSON-RPC有效载荷 |
测试MCP服务器
此仓库中的本地模拟服务器
1) Python回声服务器
文件: scripts/mock_mcp_server.py
手动启动:
python3 scripts/mock_mcp_server.py
行为:
initialize返回服务器mock-mcp-server.tools/list公开了一个工具:echo.tools/call使用工具echo回应论点并返回content.resources/list返回一个内存资源。- 未知工具返回JSON-RPC错误
-32602.
有用的 tools/call 样品:
{"message":"hello","count":2}
预期响应包括:
content[0].text喜欢echo: hello (count=2)echo.message = "hello"
2) 节点计算服务器
文件: scripts/mock_calc_mcp_server.js
手动启动:
node scripts/mock_calc_mcp_server.js
行为:
initialize返回服务器mock-calc-mcp-server-ts.tools/list公开工具add和divide.tools/call验证数字a和b.- 除以零返回错误
-32000. - 未知工具返回错误
-32602.
有用的 tools/call 样品:
{"a":40,"b":2}
{"a":10,"b":0}
预期:
add返回数字value(42以上样品)。divide随着b=0返回错误Division by zero.
3) Python性能服务器
文件: scripts/mock_perf_mcp_server.py
手动启动:
python3 scripts/mock_perf_mcp_server.py --base-delay-ms 5 --jitter-ms 10 --slow-every 20 --slow-delay-ms 200
行为:
tools/list暴露sleep,payload,cpu.sleep该工具支持受控延迟。payload该工具返回一个大斑点用于有效载荷压力测试。cpu该工具烧毁CPU循环并返回累加器。
有用的 tools/call 有效载荷样本:
{"delayMs":50}
{"sizeKb":256}
{"loops":300000}
4) 节点HTTP+SSE服务器
文件: scripts/mock_http_sse_mcp_server.js
手动启动:
node scripts/mock_http_sse_mcp_server.js
行为:
- SSE端点:
/events - JSON-RPC发送端点:
/rpc和/message - 支持
initialize,tools/list,tools/call,resources/list - 通过HTTP正文发送JSON-RPC响应,并通过SSE广播相同的响应
此采样器经常使用的外部服务器
mcp-server-fetch (通过 uvx):
Command: uvx
Arguments: mcp-server-fetch
mcp-server-filesystem:
Command: uvx
Arguments: mcp-server-filesystem /tmp
github-mcp-server:
Command: github-mcp-server
Arguments: stdio
需要 GITHUB_PERSONAL_ACCESS_TOKEN.
Docker场景
每个配置文件构建图像,运行测试计划,编写JTL+HTML报告 results/.
docker compose --profile mock-echo up --build
docker compose --profile mock-calc up --build
docker compose --profile perf-cold-start up --build
docker compose --profile perf-tail up --build
docker compose --profile perf-payload up --build
报告:
results/docker-mock-echo/report/index.htmlresults/docker-mock-calc/report/index.htmlresults/docker-perf-cold-start/report/index.htmlresults/docker-perf-tail/report/index.htmlresults/docker-perf-payload/report/index.html
Gradle任务快捷方式
./gradlew test
./gradlew check
JMETER_HOME=/path/to/apache-jmeter-5.6.3 ./gradlew installLocalWithDeps
JMETER_HOME=/path/to/apache-jmeter-5.6.3 ./gradlew mockAll
JMETER_HOME=/path/to/apache-jmeter-5.6.3 ./gradlew perfAll
CI与发布
其他CI/发布详细信息单独记录。
- CI详细信息: docs/CI.md
- 发布和出版详细信息: docs/RELEASE.md
故障排除
Results file ... is not empty 在Docker中:
- 通过清除污垢固定在当前入口点
results.jtl跑步前。
JMETER_HOME is not set:
- 使用以下命令运行Gradle任务
JMETER_HOME=/path/to/apache-jmeter-5.6.3.
JMeter中没有出现采样器:
- 验证插件jar是否在
lib/ext - 验证运行时依赖jar是否在
lib - 重新启动JMeter
许可证
麻省理工学院
