返回市场
代码演示

代码演示

作者:sarahcstringer5 星标更新:2025-11-14

项目介绍

使用MCP执行代码

此仓库演示了传统工具调用与使用模型上下文协议(MCP)执行代码之间的关键差异。它展示了如何通过分离上下文与执行环境来使AI代理在处理数据密集型任务时更加高效和经济。

该演示基于AnthropicCloudflare关于使用MCP执行代码的博客文章。

这里的示例使用本地MCP服务器来展示完整的MCP+代码执行堆栈。MCP服务器模拟延迟并提供合成数据。运行下面的演示或阅读详细说明以了解更多信息。

运行演示

此演示展示了传统工具调用的一个示例以及使用MCP执行代码的更新示例。

本地MCP服务器(mcp_servers/data_mcp_server.py)获取有关合成用户活动的分页数据,并引入人工延迟(100-200毫秒)以模拟真实API中的延迟。

先决条件

安装

以下命令执行以下操作:

  • 克隆仓库
  • 安装依赖项
  • .env.example复制到.env
    • 您必须将您的ANTHROPIC_API_KEY添加到.env文件中
  • 生成代码执行MCP示例的MCP工具包装器
# 克隆此仓库
git clone https://github.com/sarahcstringer/mcp-code-demo
cd mcp-code-demo

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # 在Windows上:venv\Scripts\activate

# 安装依赖项
pip install -r requirements.txt

# 设置您的API密钥
cp .env.example .env
# 编辑.env并添加您的ANTHROPIC_API_KEY

# 生成MCP工具包装器(用于示例2)
python generate_wrappers.py

MCP工具包装器用于代码执行MCP示例。

示例

示例1:传统的MCP工具调用

python examples/traditional_tool_calling.py

此示例演示了传统的MCP工具调用,其中所有工具结果都通过上下文窗口传递。代理通过从MCP服务器获取用户活动数据来分析分页API日志。

MCP服务器暴露:

  • get_total_pages() - 返回总页数(30)
  • get_data_chunk(page) - 返回包含10个用户活动记录的字典

每个记录包含:

{
  "id": 1,
  "user_id": "user_3",
  "activity": "login",
  "timestamp": "2024-01-01T00:00:00Z",
  "metadata": {
    "duration_seconds": 45,
    "success": true
  }
}

任务: 计算总失败活动次数,识别最活跃用户,并计算平均持续时间。

发生了什么:

  • 所有MCP工具描述在开始时加载到上下文窗口中。
  • 代理调用get_total_pages() → 获取30
  • 调用get_data_chunk(1)get_data_chunk(2)等,对所有30页进行调用,每次向上下文中添加10条记录。
  • 所有300条记录累积在上下文窗口中。
  • 代理处理上下文中的所有内容(计数失败次数,找到最活跃用户,计算平均持续时间)。
  • 每次工具调用都会将数据添加到上下文中,消耗大量中间数据的令牌。

示例2:使用MCP执行代码

python examples/code_execution.py

注意:您必须先通过运行python generate_wrappers.py生成mcp_tools/目录

此示例执行与前一个示例相同的任务,但使用代码执行而不是传统的工具调用。它遵循Anthropic的模式使用MCP执行代码。

发生了什么:

  • 代理使用bash工具访问代码执行环境。
  • 代理不是直接获取MCP工具,而是通过探索文件系统(找到mcp_tools/目录并读取其Python包装器)来发现它们。
  • 代理为任务编写Python代码,在执行环境中直接调用MCP工具。
  • 所有300条记录保留在执行环境中,从未进入上下文窗口。只有最终总结被发送回。

核心见解

传统的工具调用将所有MCP工具描述、参数模式、返回类型和使用说明提前加载到上下文窗口中。然后,随着代理依次协调工具调用,所有中间结果通过LLM的上下文窗口发送。

代码执行允许动态发现——代理通过探索文件系统来查找可用工具并读取它们的实现。它在单独的执行环境中运行处理过程,并仅将最终结果发送回上下文。

这可以显著减少数据密集型任务的令牌使用量,同时启用新的功能,如轮询、等待和有状态处理。

比较图显示传统的工具调用的所有操作都在上下文窗口中,而代码执行则有一个独立的执行环境用于处理

实现说明:现代代理框架如Claude CodeCloudflare Agents内置了代码执行环境。然而,您可以通过给LLM一个执行命令的bash工具来实现相同模式——这是这些示例中采用的方法。

安全考虑:当赋予LLM执行代码的能力时,应实施适当的护栏措施,例如沙箱化、敏感操作的人工审核、执行前的代码审查以及限制文件系统/网络访问。只在您可以验证和信任正在执行的内容的环境中运行代码。

令牌使用变化

即使在同一任务和模型下,令牌使用也会有所不同。在此演示测试中,我看到了以下结果:

  • 传统的工具调用:通常50,000-73,000个令牌
  • 代码执行:通常9,500-10,000个令牌
  • 令牌减少:根据运行情况,减少80-87%

项目结构

mcp-code/
├── examples/                         # 可运行示例
│   ├── traditional_tool_calling.py  # 示例1:传统的MCP工具调用
│   └── code_execution.py            # 示例2:代码执行+MCP(文件系统包装器)
├── mcp_servers/                      # 演示用的MCP服务器
│   └── data_mcp_server.py           # MCP服务器:分页数据获取工具
├── mcp_tools/                        # 自动生成的Python包装器(运行generate_wrappers.py)
│   ├── __init__.py                  # 包导出
│   ├── mcp_client.py                # 处理实际的MCP通信
│   └── data_tools.py                # 数据工具MCP服务器的包装器
├── generate_wrappers.py             # 从MCP服务器生成mcp_tools/的脚本
├── WRITEUP.md                       # 演示的详细说明及我对概念的看法
├── README.md                        # 此文件
└── requirements.txt                 # Python依赖项

学习更多