使用MCP执行代码
此存储库演示了传统工具调用和代码执行之间的关键区别 模型上下文协议(MCP)它展示了将上下文与执行环境分离如何使AI代理在数据繁重的任务中更高效、更具成本效益。
此演示基于以下博客文章 Anthropic 和 云耀 关于使用MCP执行代码。
这里的示例使用本地MCP服务器来演示完整的MCP+代码执行堆栈。MCP服务器模拟延迟并提供合成数据。运行下面的演示或阅读 完整报道 了解有关概念的更多详细信息。
运行演示
此演示显示了传统工具调用的示例和使用MCP执行代码的更新示例。
本地MCP服务器(mcpservers/data_mcp_server.py)获取关于合成用户活动的分页数据,并引入人工延迟(100-200ms)来模拟真实API中的延迟。
先决条件
- Python 3.10+
- 无烟煤API密钥(在 console.anthropic.com)
安装
以下命令执行以下操作:
- 克隆存储库
- 安装依赖项
- 复制
.env.example到.env
- 您必须将ANTHROPIC_API_KEY添加到 .env 文件
- 为代码执行MCP示例生成MCP工具包装器
# Clone this repository
git clone https://github.com/sarahcstringer/mcp-code-demo
cd mcp-code-demo
# Create a virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Set up your API key
cp .env.example .env
# Edit .env and add your ANTHROPIC_API_KEY
# Generate MCP tool wrappers (required for Example 2)
python generate_wrappers.pyMCP工具包装器用于代码执行MCP示例。
例子
示例1:传统MCP工具调用
python examples/traditional_tool_calling.py此示例演示了传统的MCP工具调用,其中所有工具结果都通过上下文窗口传递。代理通过从MCP服务器获取用户活动数据来分析分页的API日志。
MCP服务器公开:
get_total_pages()-返回总页数(30)get_data_chunk(page)-返回包含10条用户活动记录的dict
每条记录包含:
{
"id": 1,
"user_id": "user_3",
"activity": "login",
"timestamp": "2024-01-01T00:00:00Z",
"metadata": {
"duration_seconds": 45,
"success": true
}
}任务: 计算失败的活动总数,确定最活跃的用户,并计算平均持续时间。
发生了什么:
- 所有MCP工具描述在开始时都加载到上下文窗口中。
- 客服电话
get_total_pages()→ gets30. - 呼叫
get_data_chunk(1),get_data_chunk(2), ...,对于所有30页,每次向上下文中添加10条记录。 - 所有300条记录都累积在上下文窗口中。
- 代理在上下文中处理所有内容(统计故障、查找最活跃的用户、计算平均持续时间)。
- 每次工具调用都会将数据添加到上下文中,为中间数据使用大量令牌。
示例2:使用MCP执行代码
python examples/code_execution.py备注:您必须生成mcp_tools/首先运行目录python generate_wrappers.py
此示例执行与前一个示例相同的任务,但使用代码执行而不是传统的工具调用。随之而来 人类学模式 用于使用MCP执行代码。
发生了什么:
- 代理使用bash工具访问代码执行环境。
- 代理不是直接获取MCP工具,而是通过探索文件系统来发现它们(找到
mcp_tools/目录并读取其Python包装器)。 - 代理为任务编写Python代码,直接在执行环境中调用MCP工具。
- 所有300条记录都保留在执行环境中,永远不会进入上下文窗口。只有最后的总结被发回。
核心见解
传统工具调用 将所有MCP工具描述、参数模式、返回类型和使用说明预先加载到上下文窗口中。然后,当代理逐一协调工具调用时,它会通过LLM的上下文窗口发送所有中间结果。
代码执行 允许动态发现——代理探索文件系统以查找可用工具并读取其实现。它在单独的执行环境中运行处理,只将最终结果发送回上下文。
这可以显著减少数据繁重任务的令牌使用,同时启用轮询、等待和有状态处理等新功能。
实施说明: 现代代理框架,如 克劳德代码 和 Cloudflare代理 提供内置的代码执行环境。但是,您可以通过为LLM提供一个执行命令的bash工具来实现相同的模式——这是这些示例中使用的方法。
安全考虑: 在赋予LLM执行代码的能力时,应实施适当的防护措施,如沙盒、敏感操作的人在环验证、执行前的代码审查以及限制文件系统/网络访问。仅在可以验证和信任所执行内容的环境中运行代码。
令牌使用可变性
即使使用相同的任务和模型,令牌的使用情况也会因运行而异。在这个演示的测试中,我看到了以下结果:
- 传统工具调用:通常为50000-73000个代币
- 代码执行:通常为9500-10000个代币
- 代币减少:80-87%取决于跑步情况
项目结构
mcp-code/
├── examples/ # Runnable examples
│ ├── traditional_tool_calling.py # Example 1: Traditional MCP tool calling
│ └── code_execution.py # Example 2: Code execution + MCP (file system wrappers)
├── mcp_servers/ # MCP server for demo
│ └── data_mcp_server.py # MCP server: paginated data fetching tools
├── mcp_tools/ # Auto-generated Python wrappers (run generate_wrappers.py)
│ ├── __init__.py # Package exports
│ ├── mcp_client.py # Handles actual MCP communication
│ └── data_tools.py # Wrappers for data_tools MCP server
├── generate_wrappers.py # Script to generate mcp_tools/ from MCP servers
├── WRITEUP.md # Writeup of the demo and my thoughts on the concepts
├── README.md # This file
└── requirements.txt # Python dependencies了解更多
- 阅读全文 -概念的详细解释
