通过逐步发现工具来减少模型上下文协议(MCP)服务器中的令牌数量,实现98.7%的令牌减少。
此运行时允许AI代理通过逐步披露模式与MCP工具进行交互:
./servers/以发现可用工具结果:发送给代理的令牌减少了约98.7%。
# 安装uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 克隆仓库
git clone https://github.com/ipdelete/mcp-code-execution.git
cd mcp-code-execution
# 安装依赖
uv sync --all-extras
# 在可编辑模式下安装
uv pip install -e ".[dev]"
创建mcp_config.json:
{
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "."]
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}
# 从inputSchema生成包装器
uv run mcp-generate
如果您的MCP服务器缺少outputSchema定义,可以自动生成它们:
# 步骤1:使用LLM驱动的测试参数生成发现配置
uv run mcp-generate-discovery
# 步骤2:查看discovery_config.json并根据需要删除/修改
# 步骤3:执行安全工具并推断模式
uv run mcp-discover
这将在servers/中创建类型化的包装器:
servers/
git/
__init__.py
git_status.py
git_log.py
git_diff.py
discovered_types.py # 生成的输出模式
fetch/
__init__.py
fetch.py
discovered_types.py
当您请求AI代理处理您的数据时:
./servers/call_mcp_tool()从MCP服务器获取数据关键见解:并非所有处理都需要在脚本中完成。LLM可以在后续交互中处理总结和数据转换。脚本专注于高效的数据检索。
代理可能编写的示例脚本:
"""分析git仓库提交记录。"""
import asyncio
from runtime.mcp_client import call_mcp_tool
async def main():
# 获取最近的提交记录
result = await call_mcp_tool(
"git__git_log",
{"repo_path": ".", "max_count": 10}
)
# 返回数据供代理处理
# 代理可以总结、分析或将其作为其他工具输入
print(f"获取到提交日志")
return result
if __name__ == "__main__":
asyncio.run(main())
当代理需要运行脚本时,它会使用以下命令:
# 代理自动运行此命令
uv run python -m runtime.harness workspace/my_script.py
# 或通过方便的别名
uv run mcp-exec workspace/my_script.py
该环境管理MCP客户端生命周期,连接到服务器,并捕获脚本的输出以发送回代理。
传统方法(高令牌使用量):
代理 → MCP服务器 → [全数据50KB] → 代理处理全部
逐步披露(98.7%减少):
代理 → 发现工具 → 编写脚本
脚本 → MCP服务器 → [全数据50KB] → 返回给代理
代理 → 处理/总结 → 在后续调用中使用
runtime/mcp_client.py:懒加载的MCP客户端管理器runtime/harness.py:脚本执行环境runtime/generate_wrappers.py:自动生成类型化的包装器runtime/normalize_fields.py:处理API字段大小写runtime/schema_utils.py:JSON模式 → Pydantic转换# 所有测试
uv run pytest
# 单元测试
uv run pytest tests/unit/
# 集成测试
uv run pytest tests/integration/
# 带覆盖率
uv run pytest --cov=src/runtime
# 类型检查
uv run mypy src/
# 格式化
uv run black src/ tests/
# 代码检查
uv run ruff check src/ tests/
# 格式检查
uv run black --check src/ tests/
# 从工具定义生成包装器
uv run mcp-generate
# (可选)使用LLM参数生成生成发现配置
uv run mcp-generate-discovery
# (可选)执行安全工具并推断模式
uv run mcp-discover
# 使用可用的MCP工具执行Python脚本
uv run mcp-exec workspace/script.py
所有工具参数和结果都使用Pydantic进行验证:
from runtime.servers.git import git_status, GitStatusParams
# 类型安全参数
params = GitStatusParams(repo_path=".")
# 类型安全结果
result = await git_status(params)
基于asyncio实现高效的I/O:
import asyncio
from runtime.mcp_client import call_mcp_tool
async def main():
# 并发工具调用
results = await asyncio.gather(
call_mcp_tool("git__git_status", {"repo_path": "."}),
call_mcp_tool("git__git_log", {"repo_path": ".", "max_count": 5}),
)
asyncio.run(main())
自动处理不一致的API大小写:
from runtime.normalize_fields import normalize_field_names
# ADO返回小写,期望PascalCase
ado_response = {"system.title": "Task", "custom.priority": "High"}
normalized = normalize_field_names(ado_response, "ado")
# 结果:{"System.title": "Task", "Custom.priority": "High"}
许多MCP服务器在其工具定义中没有提供outputSchema,这是MCP规范中的可选项。该项目提供了使用LLM驱动的参数生成的自动模式发现:
生成发现配置(mcp-generate-discovery)
inputSchema生成合理的测试参数discovery_config.json供审查审查和编辑(手动步骤)
发现模式(mcp-discover)
servers/{server}/discovered_types.py工具自动按安全性分类:
get_*,list_*,read_*,fetch,search_*等delete_*,remove_*,update_*,write_*等危险工具默认被排除在自动发现之外。
{
"servers": {
"github": {
"safeTools": {
"search_code": {"q": "language:python", "per_page": 1},
"list_repositories": {"sort": "stars", "per_page": 1}
}
}
},
"metadata": {
"generated": true,
"generated_count": 2,
"skipped_count": 3,
"tools_skipped": {
"dangerous": ["delete_repository"],
"unknown": ["analyze_code", "deploy_release", "configure_webhook"]
}
}
}
参见workspace/example_progressive_disclosure.py以了解完整的示例,展示令牌减少模式。
# 安装开发依赖
uv sync --all-extras
# 提交前运行质量检查
uv run black src/ tests/
uv run mypy src/
uv run ruff check src/ tests/
uv run pytest
MIT