一个开源且与平台无关的MCP代码模式实现,适用于沙箱环境。
灵感来源:
传统的MCP(模型上下文协议)使用方式直接将工具暴露给大语言模型(LLMs),需要它们明确调用工具。然而,正如Cloudflare发现的那样,LLMs在编写调用MCP的代码方面比直接调用MCP更擅长。
这个库实现了复杂的六步流水线:
用户查询 → 假设代码计划 → 工具过滤 → TypeScript生成
→ 代码实现 → 编译 → 沙箱执行
系统使用三个专门的LLMs:
npm install mcp-codemode
import { CodeModeMCP } from 'mcp-codemode';
import { OpenRouterClient } from 'mcp-codemode/model_clients';
import { ComposioProvider } from 'mcp-codemode/mcp_providers';
import { E2BRunEnvironment } from 'mcp-codemode/run_environments';
// 初始化OpenRouter客户端以访问LLM
const openRouterClient = new OpenRouterClient();
// 设置Composio与你的项目
const composioProvider = new ComposioProvider({
projectId: 'your-project-id', // 可选:配置connectedAccountId和userId
});
// 配置三个专门的LLMs
const codeMode = new CodeModeMCP({
llms: {
tinyLLM: openRouterClient.getLLM('openai/gpt-oss-20b'), // 快速筛选模型
mainLLM: openRouterClient.getLLM('openai/gpt-oss-120b'), // 代码生成模型
strategyLLM: openRouterClient.getLLM('anthropic/claude-sonnet-4.5') // 战略规划
},
tools: await composioProvider.getTools({
toolkits: ['slack', 'gmail', 'github'] // 指定你需要的工具包
}),
runEnvironment: new E2BRunEnvironment(), // 安全云沙箱
logPath: './prompt_logs' // 可选:记录所有LLM交互
});
// 执行复杂的多步骤任务
const result = await codeMode.runMCPCode({
query: "获取Slack中的所有频道,并向以'test'开头的每个频道发送消息,在以'e'开头的频道中设置表情符号",
maxToolCalls: 100,
totalExecutionTimeout: 60,
toolCallTimeout: 10
});
console.log(`执行结果: ${result.resultType}`);
console.log(`持续时间: ${result.totalDurationMs}ms`);
在可能有数千种工具的情况下,小型LLM迅速筛选出仅相关的工具,减少上下文大小并提高准确性。
所有生成的代码都是TypeScript,并在执行前进行完整的类型检查,提前捕获错误。
支持多种执行环境:
IRunEnvironmentinterface CodeModeMCPConfig {
llms: {
tinyLLM: LLMFunction; // 快速筛选模型
mainLLM: LLMFunction; // 代码生成模型
strategyLLM: LLMFunction; // 规划模型
};
tools?: ToolCatalog; // 分层工具目录
mcpProvider?: IMCPProvider; // 可选的MCP提供者
runEnvironment?: IRunEnvironment; // 执行沙箱
logPath?: string; // 可选的日志目录
}
interface RunMCPCodeOptions {
query?: string; // 用户任务描述
maxToolCalls: number; // 工具调用限制
totalExecutionTimeout: number; // 总超时时间(秒)
toolCallTimeout: number; // 每个工具超时时间(秒)
maxToolsPerPrompt?: number; // 每批筛选工具数量(默认:20)
maxConcurrentThreads?: number; // 并发筛选线程数(默认:5)
includeDescriptionsInFilter?: boolean; // 在日志中包含工具描述
}
import { LLMFunction } from 'mcp-codemode/model_clients';
const myCustomLLM: LLMFunction = async (prompt: string): Promise<string> => {
// 你的LLM集成在这里
const response = await myLLMService.complete(prompt);
return response.text;
};
const codeMode = new CodeModeMCP({
llms: {
strategyLLM: myCustomLLM,
tinyLLM: myCustomLLM,
mainLLM: myCustomLLM
},
// ... 其他配置
});
import { IRunEnvironment } from 'mcp-codemode/run_environments';
class MyCustomEnvironment implements IRunEnvironment {
async execute(code: string): Promise<{ success: boolean; output: string }> {
// 你的执行逻辑
}
}
// 列出所有可用工具
const toolPaths = codeMode.listToolPaths();
console.log(toolPaths); // ['slack.message.send', 'github.issues.create', ...]
// 获取特定工具
const tool = codeMode.getTool('slack.message.send');
// 更新目录
codeMode.setToolCatalog(newCatalog);
src/
├── CodeModeMCP.ts # 主协调类
├── steps/ # 流水线步骤
│ ├── generatePseudocode.ts
│ ├── filterTools.ts
│ ├── generateToolsCode.ts
│ ├── implementCode.ts
│ └── executeCode.ts
├── model_clients/ # LLM集成
│ ├── openai.ts
│ └── openrouter.ts
├── run_environments/ # 执行沙箱
│ ├── local.ts
│ └── e2b.ts
└── mcp_providers/ # MCP服务器集成
├── composio.ts
└── pipedream.ts
随着MCP的采用增加,代理将拥有数百或数千种工具的访问权限。传统的工具调用方法在规模上会失效:
Code Mode通过利用LLMs最擅长的事情——编写代码——解决了这些问题。这个库提供了一个模块化、可扩展且平台无关的生产就绪实现。
这是一个完全免费且开放合作的仓库。欢迎贡献!
MIT