MCP批次
将多个MCP工具调用批处理到一个“Batch_excute”请求中,从而减少AI代理的开销和令牌使用。

______________________________________________________________________
目录
- 实施阶段 - 信息收集 - LLM-Only Step(列出代码定义) - 文档创建
______________________________________________________________________
引言
⚠️ 注意:工作正在进行中 该项目正在积极开发中,以应对几个复杂的挑战: - 保持与现有MCP服务器的向后兼容性 - 使用多连接客户端解决传输复杂性(Cline、Roo、Claude Desktop) - 创建适合初学者的实现 虽然功能正常,但随着我们完善解决方案,预计会不断改进和变化。
MCP批次 是一个简单的聚合服务器 模型上下文协议(MCP) 生态系统。它只是暴露了 一 工具: batch_execute。而不是调用多个MCP工具(如 fetch, read_file, create_directory, write_file等等) 分开 消息,你可以 批次 将它们放在一个聚合器请求中。
这大大减少了令牌使用、网络开销和AI代理或LLM对话中的重复上下文。
______________________________________________________________________
为什么使用BatchIt
- 每条消息一个操作 问题:
通常,LLM或AI代理一次只能调用一个MCP工具,这迫使多步任务需要多次调用。
- 往返次数过多:
10个单独的文件操作可能需要10条消息→ 10 响应。
- BatchIt的方法:
1. 只需一个 batch_execute 请求。 1. 在幕后生成(或连接到)实际的目标MCP服务器(如文件系统服务器)。 1. 并行运行每个子操作(工具调用),最多可达 maxConcurrent. 1. 如果一个子操作失败 stopOnError 确实如此,它会阻止新的潜艇行动。 1. 返回一个合并的JSON结果。
______________________________________________________________________
主要功能和限制
特性
- 单个“批处理执行”工具
- 您只需指定一个引用现有MCP服务器工具的子操作列表。
- 并行执行
- 一次运行多个子操作,由以下人员控制 maxConcurrent.
- 超时&出错时停止
- 每个小组赛一个 timeoutMs,如果一个操作失败,您可以跳过剩余的操作。
- 连接缓存
- 重复调用与下游MCP服务器的相同连接,在空闲超时后关闭。
局限性
- 中间批次无数据通过
- 如果子操作#2依赖于#1的输出,则执行多个聚合器调用。
- 无部分进展
- 在每个“batch_excute”的末尾,您将获得所有子操作的结果
- 必须使用真正的MCP服务器
- 如果你生成或连接到聚合器本身,你会看到“找不到工具”。聚合器只有“batch_excute”
- 每次呼叫一个目标服务器
- 每个聚合器调用都引用一个目标MCP服务器。如果你想要多台服务器,你会做更高级的逻辑或单独的调用。
______________________________________________________________________
安装与启动
git clone https://github.com/ryanjoachim/mcp-batchit.git
cd mcp-batchit
npm install
npm run build
npm startBatchIt开始于 标准输入输出 默认情况下,您的AI代理(或任何MCP客户端)都可以生成它。例如:
mcp-batchit is running on stdio. Ready to batch-execute!您现在可以发送JSON-RPC请求(tools/call 方法, name= "batch_execute")到它。
______________________________________________________________________
存储体
使用Cline/Roo Code,您可以通过利用Nick Baumann开发的强大的“记忆库”自定义指令来构建一个上下文项目文档框架。
传统方法(19+个电话):
- 阅读package.json
- 等待响应
- 阅读README.md
- 等待响应
- 列出代码定义
- 等待响应
- 创建内存库目录
- 等待响应
- 编写productContext.md
- 写入系统Patterns.md
- 编写techContext.md
- 写入进度.md
- 编写activeContext.md
- 等待响应(另外5个电话)
总共:约19个单独的API调用(13个操作+6个响应等待)
BatchIt方法(1-3次调用)
多阶段使用
当处理依赖于实时输出的复杂多步任务(如读取文件和生成文档)时,您需要在不同的阶段处理该过程。这是必要的,因为 BatchIt 不支持在同一请求内的子操作之间传递数据。
实施阶段
信息收集
在这个初始阶段,我们通过读取必要的文件(例如。, package.json, README.md).这是通过 批处理执行器 调用文件系统MCP服务器:
{
"targetServer": {
"name": "filesystem",
"serverType": {
"type": "filesystem",
"config": {
"rootDirectory": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit"
}
},
"transport": {
"type": "stdio",
"command": "cmd.exe",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-filesystem",
"C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit"
]
}
},
"operations": [
{
"tool": "read_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/package.json"
}
},
{
"tool": "read_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/README.md"
}
}
],
"options": {
"maxConcurrent": 2,
"stopOnError": true,
"timeoutMs": 30000
}
}备注:聚合器生成 @modelcontextprotocol/server-filesystem (通过 npx)并行执行 read_file 操作。
LLM-Only Step(列出代码定义)
此阶段涉及聚合器之外的处理,通常使用LLM或AI代理功能:
src
此步骤使用Roo Code的 list_code_definition_names 该工具仅供LLM使用。但是,请注意,许多MCP服务器可以提供类似的功能,从而可以在没有LLM请求的情况下完成此过程。
文档创建
最后一个阶段将来自前面步骤的数据(文件内容和代码定义)组合在一起,在 memory-bank 目录:
{
"targetServer": {
"name": "filesystem",
"serverType": {
"type": "filesystem",
"config": {
"rootDirectory": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit"
}
},
"transport": {
"type": "stdio",
"command": "cmd.exe",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-filesystem",
"C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit"
]
}
},
"operations": [
{
"tool": "create_directory",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank"
}
},
{
"tool": "write_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank/productContext.md",
"content": "# MCP BatchIt Product Context\\n\\n## Purpose\\n..."
}
},
{
"tool": "write_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank/systemPatterns.md",
"content": "# MCP BatchIt System Patterns\\n\\n## Architecture Overview\\n..."
}
},
{
"tool": "write_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank/techContext.md",
"content": "# MCP BatchIt Technical Context\\n\\n## Technology Stack\\n..."
}
},
{
"tool": "write_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank/progress.md",
"content": "# MCP BatchIt Progress Status\\n\\n## Completed Features\\n..."
}
},
{
"tool": "write_file",
"arguments": {
"path": "C:/Users/Chewy/Documents/GitHub/ryanjoachim/mcp-batchit/memory-bank/activeContext.md",
"content": "# MCP BatchIt Active Context\\n\\n## Current Status\\n..."
}
}
],
"options": {
"maxConcurrent": 1,
"stopOnError": true,
"timeoutMs": 30000
}
}聚合器按顺序处理这些操作(maxConcurrent=1),创建目录并编写多个文档文件。结果数组指示每个操作的成功/失败状态。
______________________________________________________________________
常见问题解答
Q1:如果子操作#2依赖于子操作#1的结果,我是否需要多个聚合器调用? 对。 BatchIt不会在同一请求中的子操作之间传递数据。您执行多阶段呼叫(如上面的示例)。
Q2:为什么我有时会得到“未找到工具create_directory”? 因为你 transport 可能指向聚合器脚本本身,而不是真正的MCP服务器。确保你引用了以下内容 @modelcontextprotocol/server-filesystem.
问题3:我可以执行并发加stopOnError吗? 当然。如果一个子操作失败,我们将跳过启动新的子操作。已经运行的两个并行完成。
Q4:BatchIt每次都会重新生成目标服务器吗? 它 *能* 如果您指定 keepAlive: false。但如果你用同样的精确方法 targetServer.name + transport,它会缓存连接,直到空闲超时过去。
问题5:如果中间出现错误,会返回部分结果吗? 对。在错误发生之前完成的每个子操作都包含在最终的聚合器响应中,以及失败的子操作。如果发生以下情况,则跳过剩余的子操作 stopOnError 这是真的。
______________________________________________________________________
许可证
麻省理工学院
