MCP负载测试工具

MCPLoadTester是一个用于模型上下文协议(MCP)服务器的负载测试工具包,支持使用Apache JMeter等工具进行性能测试。

  • by AndreyVMarkelov
  • Java
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 AndreyVMarkelov/MCPulse

使用说明

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,或使用绝对路径。

  1. 安装插件(请参阅 Installation > Recommended local install 上文)。
  2. 重新启动JMeter。
  3. 添加采样器: Thread Group -> Add -> Sampler -> MCP Sampler.
  1. 使用具有以下采样器设置的本地回声模拟(stdio):
    • Transport: stdio
    • Command: python3
    • Arguments: scripts/mock_mcp_server.py
    • MCP Method: tools/list
    • Client name: jmeter-mcp-sampler (默认)
    • Client version: 1.0.0 (默认)
  1. 添加响应断言:
    • Field to Test: Response Data
    • Pattern: echo
  1. 运行测试并验证断言是否通过。

HTTP+SSE快速入门

  1. 启动本地模拟HTTP+SSE服务器:
node scripts/mock_http_sse_mcp_server.js
  1. 在取样器组中:
  • Transport: http+sse
  • HTTP base URL: http://127.0.0.1:8080
  • SSE endpoint path: /events
  • HTTP send path: /rpc
  • MCP Method: tools/list
  • Validation mode: none (使用JMeter时 Response Assertion)
  1. 为HTTP状态添加响应断言:
  • Field to Test: Response Code
  • Pattern: 200
  1. 运行测试并验证断言是否通过(Response Code = 200,样品为绿色)。

替代方案:使用内置采样器验证而不是JMeter断言:

  • Validation mode: regex
  • Validation 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.html
  • results/docker-mock-calc/report/index.html
  • results/docker-perf-cold-start/report/index.html
  • results/docker-perf-tail/report/index.html
  • results/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/发布详细信息单独记录。

故障排除

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

许可证

麻省理工学院