使用说明
Claude代码中的MCP工具调用并行性
发现: MCP工具 做 Claude Code中的并行化——当服务器设置
readOnlyHint: true省略此注释的服务器(默认false)被序列化。这是设计的,不是bug。看 #14353.
关键结果
平行性 — readOnlyHint=true 显示了~2倍的并行调度率 readOnlyHint=false:
| 条件 | 多工具消息 | 工具/消息 | MCP并行组 |
|---|---|---|---|
MCP(readOnlyHint=true) |
11.1% | 1.15 | 11 |
MCP(readOnlyHint=false) |
6.1% | 1.08 | 6 |
IPC开销 --MCP为每个任务增加了约2%的挂钟时间(中位数5ms/呼叫):
| 工具 | 计数 | 中位数ms | P95 ms |
|---|---|---|---|
| 读文本文件 | 60 | 4.0 | 10.0 |
| 列表目录 | 11 | 3.8 | 19.2 |
| 搜索文件 | 13 | 346.4 | 639.6 |
| 编辑文件 | 8 | 14.8 | 34.3 |
| 写文件 | 5 | 11.4 | 45.7 |
演出 --在此样本量下,条件之间没有显著差异:
| 条件 | 工具/工具 | 平均运行时间 | 已解决 |
|---|---|---|---|
MCP(RO=true) |
1.45 | 260秒 | 0/5 |
MCP(RO=false) |
1.45 | 265秒 | 3/5 |
| 基线(本地) | 1.66–1.89 | 261–267s | 1–2/5 |
在n=5时,分辨率方差是噪声。
这对MCP服务器作者意味着什么
克劳德代码 isConcurrencySafe() 检查 readOnlyHint 决定并行执行还是串行执行。这 @modelcontextprotocol/server-filesystem 正确注释其工具:
只读(readOnlyHint: true) |
突变(readOnlyHint: false) |
|---|---|
| read_text_file、read_media_file、read_multiple_files、list_directory、directory_tree、search_files、get_file_info | write_file、edit_file、move_file、create_directory |
如果您的MCP服务器的工具没有并行化,请添加 readOnlyHint: true 到您的只读工具注释。
方法
在Claude Code v2.1.39上使用Sonnet 4.0进行测试,5 SWE工作台验证任务(天体测量),最多30次迭代,超时300秒。三个条件:
- MCP(
readOnlyHint=true) --带有本机注释的服务器文件系统,用于计时的仪器化代理 - MCP(
readOnlyHint=false) --同一代理强制所有工具readOnlyHint: false,序列化执行 - 基线 --仅限本机Claude代码工具,无MCP
通过分组来衡量平行度 tool_use 块通过 message.id 在 .mcp.log traces——每条消息有多个工具=模型请求并行执行。IPC开销由仪表化代理对每次JSON-RPC往返进行计时来衡量。
局限性
- n=5,单存储库(astropy),单型号(Sonnet 4.0),单MCP服务器
- 无基线并行性数据(
.mcp.log仅捕获MCP会话) - MCP提示鼓励并行工具使用,这可能会提高利率
繁殖
git clone https://github.com/greynewell/mcp-serialization-repro.git
cd mcp-serialization-repro
# Prerequisites: Docker, Node.js, Python 3.10+, ANTHROPIC_API_KEY
pip install mcpbr
bash run.sh # ~$10-15 in API calls
python analyze.py results/
参考文献
- MCP规范 · 克劳德代码#14353 · SWE长椅 · 服务器文件系统 · mcpbr
