代码执行工具

通过模型上下文协议(MCP)实现代码执行,显著减少AI代理与多工具交互时的上下文开销,适用于GitHub和Slack等服务的自动化操作。

  • by madhurprash
  • Python
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 madhurprash/code_execution_with_mcp

使用说明

使用MCP执行代码

构建与多种工具和数据源交互的AI代理面临着一个根本挑战:上下文窗口约束。当代理需要访问数十个工具时,传统方法会通过预先加载所有工具定义并反复通过上下文窗口传递中间结果来消耗过多的令牌。

Anthropic最近发表了关于使用模型上下文协议(MCP)执行代码的研究,通过将工具表示为可发现的代码而不是冗长的JSON模式,证明了上下文开销减少了98.7%。本文介绍了使用Amazon Bedrock AgentCore代码解释器对这些概念的实际实现,展示了基于文件系统的工具发现如何在实现类似效率提升的同时实现渐进式功能加载。

在构建具有广泛工具功能的人工智能代理时,我们面临一个基本约束:上下文窗口。考虑一个需要访问GitHub和Slack运营中22个不同工具的代理。传统方法要求在每次请求时向模型发送完整的工具定义。

代码执行从根本上改变了这种动态。我们可以将工具表示为代理根据需要发现和导入的Python函数,而不是发送描述每个工具的详细JSON模式。

在这里查看更多:https://medium.com/@madhur.prashant/scaling agent-带代码执行和模型上下文-标签a4c263fa7f61?postPublishedType=初始

概述

该项目实现了 使用MCP执行代码 AI代理编写Python代码,从文件系统组织的注册表中发现和使用工具的模式。代理不会将所有工具定义发送到模型(15000多个令牌),而是探索目录结构并仅导入所需的内容,从而实现 90%+代币减少.

关键创新

传统方法:发送所有工具定义→ 模型调用工具→ 返回结果

  • 令牌使用量:每个多步骤工作流约50000个令牌
  • 费用:每次请求7.50美元
  • 延迟:5-10秒(多次往返)

使用MCP执行代码:列出工具名称→ 模型编写代码→ 在沙盒中执行

  • 令牌使用:每个多步骤工作流约650个令牌
  • 费用:每次请求0.10美元
  • 延迟:~500ms(单次执行)

MCP注册表

这 mcp_registry 目录包含按服务组织的工具:

GitHub工具(14个工具)

  • 存储库操作:create_or_update_file、push_file、create_repository、fork_repository、create_branch
  • 问题与公关管理:create_issue、create_pull_request、list_issue
  • 搜索:search_repositories、search_code、search_issues、search_users
  • 文件操作:get_file_contents,list_repository_files

Slack工具(8个工具)

  • 渠道运作:list_channels,get_channel_history
  • 消息传递:post_message、reply_to_thread、add_reaction
  • 线程操作:get_thread_replys
  • 用户操作:get_users,get_user_profile

看 mcp_reregistry/README.md 了解详细的使用说明。

先决条件

  • Python 3.11+
  • 已配置AWS凭据(适用于Amazon Bedrock)
  • GitHub个人访问令牌
  • Slack机器人令牌

入门指南

1.安装uv并设置Python环境

# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"

# Create virtual environment and sync dependencies
uv venv && source .venv/bin/activate && uv pip sync pyproject.toml

# Set environment variable for uv
export UV_PROJECT_ENVIRONMENT=.venv

# Install additional dependencies
uv add zmq

# Install Jupyter kernel (if needed)
python -m ipykernel install --user --name=.venv --display-name="Python (uv env)"

2.安装项目依赖项

依赖关系已在中定义 pyproject.toml 并将在上述同步步骤中安装。该项目包括:

  • 核心:PyGithub、slack sdk、pydantic、langchain、langchain aws、基岩agentcore
  • 开发:pytest、pytest asyncio、ruff、mypy

配置

3.创建环境文件

复制示例环境文件并填写您的凭据:

cp .env.example .env

4.设置GitHub Token

  1. 首选https://github.com/settings/tokens
  2. 点击“生成新令牌”→ “生成新令牌(经典)”
  3. 根据您的需求选择范围:
    • repo -完全控制私有存储库
    • public_repo -访问公共存储库
    • write:discussion -创建和管理讨论
  4. 复制令牌并添加到 .env:
    GITHUB_TOKEN=github_pat_YOUR_TOKEN_HERE
    

5.设置Slack Bot令牌

  1. 首选https://api.slack.com/apps
  2. 创建新应用程序或选择现有应用程序
  3. 转到“OAuth和权限”
  4. 添加机器人令牌作用域:
    • channels:read -查看基本频道信息
    • channels:history -查看公共频道中的消息
    • chat:write -发送消息
    • users:read -查看工作区中的人员
  5. 将应用程序安装到工作区并复制“Bot用户OAuth令牌”
  6. 增添 .env:
    SLACK_BOT_TOKEN=xoxb-YOUR-TOKEN-HERE
    

6.AWS配置

确保配置了AWS凭据:

# Configure AWS CLI
aws configure

# Or set environment variables
export AWS_REGION=us-east-1
export AWS_PROFILE=default

重要:从不承诺 .env 文件到版本控制。它已经在里面了 .gitignore.

快速开始

GitHub示例

from github import Github
from mcp_registry.github import create_issue, push_files
import os

# Initialize client
client = Github(os.getenv("GITHUB_TOKEN"))

# Create an issue
result = create_issue(
    client=client,
    owner="username",
    repo="repository",
    title="Bug report",
    body="Description of the bug",
    labels=["bug"]
)

print(f"Created issue: {result['url']}")

松弛示例

from slack_sdk import WebClient
from mcp_registry.slack import post_message, list_channels
import os

# Initialize client
client = WebClient(token=os.getenv("SLACK_BOT_TOKEN"))

# List channels
channels = list_channels(client=client, limit=50)

# Post message
result = post_message(
    client=client,
    channel_id="C1234567890",
    text="Hello from MCP tools!"
)

print(f"Message posted at: {result['timestamp']}")

测试

运行测试

该项目包括一个测试套件,可以使用提供的测试脚本或直接使用pytest运行:

# Run all tests using the test script
./run_tests.sh

测试MCP集成

测试MCP功能有两种主要方法:

1.定期MCP服务器测试

使用MCP检查器或客户端工具直接测试MCP服务器:

# Start MCP server (if applicable)
uv run python -m mcp_server

# Test with MCP inspector
npx @modelcontextprotocol/inspector

2.基于配置的MCP测试

通过配置文件测试MCP集成:

更新Claude桌面配置 (~/.claude/config.json 或类似):

{
  "mcpServers": {
    "code-execution-mcp": {
      "command": "uv",
      "args": ["run", "python", "-m", "mcp_server"],
      "env": {
        "UV_PROJECT_ENVIRONMENT": ".venv"
      }
    }
  }
}

要修改MCP服务器配置:

  1. 在中编辑配置文件 ~/.claude/config.json (或您的Claude配置位置)
  2. 更新服务器名称、命令、参数或环境变量
  3. 重新启动Claude Desktop以获取更改
  4. 测试新配置

自定义配置示例:

{
  "mcpServers": {
    "custom-mcp-name": {
      "command": "uv",
      "args": ["run", "python", "custom_mcp.py"],
      "env": {
        "GITHUB_TOKEN": "${GITHUB_TOKEN}",
        "SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
        "UV_PROJECT_ENVIRONMENT": ".venv"
      }
    }
  }
}

直接运行代码

你也可以直接运行Python代码进行快速测试:

# Run main application
uv run python code_exec_with_mcp_agent.py

与常规MCP方法的比较

要比较代码执行方法和常规MCP方法之间的性能和令牌使用情况:

# Run the regular MCP comparison tests
./regular_mcp/run_tests.sh

这将使用传统的MCP方法(将所有工具定义发送到模型)运行相同的测试套件,并生成比较结果。然后,您可以比较:

  • 令牌使用:常规MCP使用100000多个令牌,而代码执行MCP使用约27000个令牌
  • 成本效益:常规MCP成本约0.36美元/请求,而代码执行MCP成本约0.11美元/请求
  • 响应质量:比较答复的准确性和完整性

请参阅 比较结果 详细指标见下文。

比较结果

以下是对同一任务的两种方法进行比较的真实示例:

任务:分析madhurprash拥有的所有存储库,并确定排名前5位的存储库

使用MCP方法执行代码

韵律学:

  • 延迟:53.49秒
  • 输入令牌: 26,888
  • 输出令牌: 1,888
  • 代币总数: 28,776
  • 估计成本: $0.109

结果质量:

  • ✅ 正确分析了所有83个存储库
  • ✅ 提供了确切的星数(6、5、3、3、4)
  • ✅ 正确识别主要语言(Jupyter Notebook、Python)
  • ✅ 完整准确的描述
  • ✅ 生成用于验证的可执行Python代码

生成代码: 代理生成的Python代码如下:

  1. 使用PyGithub获取所有存储库
  2. 按星数排序
  3. 提取了前5名,并附有完整的元数据
  4. 以人类可读和JSON格式格式化的结果

常规MCP方法

韵律学:

  • 延迟:37.51秒
  • 输入令牌: 112,837
  • 输出令牌: 1,241
  • 代币总数: 114,078
  • 估计成本: $0.357

结果质量:

  • ⚠️ 无法确定确切的恒星计数
  • ⚠️ 不得不依赖GitHub API排序顺序
  • ⚠️ 不太精确的语言识别
  • ⚠️ 未生成用于验证的可执行代码

主要观察结果:

  • API的回复不包括实际的星级计数
  • 必须根据排序顺序做出假设
  • 结果不太精确和可验证

关键要点

度量 代码执行MCP 常规MCP 改进
令牌使用 28,776 114,078 减少74.8%
每次请求的成本 $0.109 $0.357 节省69.5%
准确度 精确的恒星计数 近似顺序 精确的
可验证性 已生成代码 无代码 更透明
延迟 53.5秒 37.5秒 慢42%*

* 虽然由于代码生成和执行,代码执行的延迟略高,但大幅节省的成本和提高的准确性使其成为大多数用例的首选方法。

为什么代码执行MCP更好

  1. 大幅降低成本:每次请求成本降低69.5%
  2. 更高的准确性:API直接访问可提供准确的数据
  3. 透明度:生成的代码可以被审查和验证
  4. 灵活性:代理可以根据API响应调整代码
  5. 未来考验:代码可以动态处理API更改

设计理念

此实现遵循“使用MCP执行代码”模式:

  1. 最小令牌使用量:工具是Python函数,而不是冗长的模式
  2. 渐进式发现:只在需要时导入所需内容
  3. 直接执行:简单的函数调用,无需中间件
  4. 结果筛选:结构化返回,便于数据过滤
  5. 无状态工具:每个工具都是独立且可组合的

令牌优化

传统方法:

Load all 22 tool schemas � 50,000+ tokens

MCP方法:

List available tools � 650 tokens
Import specific tool � Execute directly

这代表了 减少98.7% 在代币使用方面。

用法

运行代理

# Interactive mode
uv run python code_exec_with_mcp_agent.py

# Single query mode
uv run python code_exec_with_mcp_agent.py --query "List all GitHub repositories for user anthropics"

# With custom model
uv run python code_exec_with_mcp_agent.py --model anthropic.claude-haiku-4-5-20251001-v1:0

# Enable debug logging
uv run python code_exec_with_mcp_agent.py --debug

代理将使用文件系统工具逐步发现MCP工具并执行代码以完成您的任务。

与亚马逊基岩代理Core集成

这些工具旨在与Amazon Bedrock AgentCore代码解释器配合使用,以实现安全的沙盒执行:

# In AgentCore sandbox
from mcp_registry.github import create_issue

# Execute tool
result = create_issue(...)

# Filter result before returning to model
return {
    "issue_number": result["issue_number"],
    "url": result["url"]
}

实施状态

✅ 完成

  • MCP注册表,包含22个工具(GitHub:14个,Slack:8个)
  • 基于文件系统的工具组织
  • 具有全面文档的类型安全实现

🚧 进行中

  • 亚马逊基岩整合(Claude Sonnet 4.5)
  • AgentCore代码解释器集成
  • REST API服务器
  • 部署自动化

看 IMPLEMENTATION_DESIGN.md 完整的路线图。

参考文献