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/