工具并行调用功能

MCP工具在Claude Code中实现并行调用,通过设置`readOnlyHint`参数控制并行与串行执行。

  • by greynewell
  • Python
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 greynewell/mcp-serialization-repro

使用说明

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秒。三个条件:

  1. MCP(readOnlyHint=true) --带有本机注释的服务器文件系统,用于计时的仪器化代理
  2. MCP(readOnlyHint=false) --同一代理强制所有工具 readOnlyHint: false,序列化执行
  3. 基线 --仅限本机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/

参考文献