动态MCP代理
一个智能MCP代理服务器,根据您的项目上下文延迟加载相关的MCP工具服务器,将AI工具计数保持在推荐的限制范围内(对于Google Antigravity,≤50个工具)。专为需要开发自己的工具集的高自主性环境而设计。
部分 反重力剂提示协议 生态系统。
运作原理
IDE connects → proxy exposes proxy_* tools + MCP Resources + Prompts
AI calls proxy_handshake({ tech_stack, task_description })
→ Matcher scores catalogue entries
→ Top-5 servers activated (lazily mounted as stdio subprocesses or SSE)
→ tools/list now includes those servers' tools
→ Budget cap (50 tools) enforced via LRU eviction快速开始
先决条件
目录服务器通过运行 npx (Node.js)和 uvx (紫外线)。这些必须在IDE生成代理时使用的PATH上。在MCP配置中明确添加它们 env 块(见下文)。找到你的路 type npx 和 type uvx.
安装
uv sync配置
复制示例配置:
cp proxy_config.json.example proxy_config.json设置您的环境和私人目录:
cp .env.example .env # fill in your API keys
# user.catalogue.json is auto-created or copy from your IDE's mcp_config.json添加到您的IDE(反重力/开放代码/克劳德桌面)
{
"mcpServers": {
"dynamic-proxy": {
"command": "uv",
"args": [
"run",
"--quiet",
"--project",
"/path/to/dynamic-mcp-proxy-server",
"python", "-m", "src.proxy_server"
],
"env": {
"PATH": "/home/user/.nvm/versions/node/v20.18.1/bin:/home/user/.local/bin:/usr/local/bin:/usr/bin:/bin"
}
}
}
}调整 PATH 以匹配您的系统(type npx 和 type uvx 显示正确的目录)。
proxy\_\*工具
| 工具 | 说明 |
|---|---|
proxy_handshake(tech_stack, task_description, ...) | 上下文握手——激活相关服务器 |
proxy_list_active_servers() | 当前安装的服务器+工具数量 |
proxy_list_available_servers(filter_tag?) | 浏览目录 |
proxy_activate_server(name, eager?) | 装载服务器(默认情况下延迟) |
proxy_activate_from_spec(name, url, type?) | 从OpenAPI/GraphQL生成并挂载服务器 |
proxy_deactivate_server(name) | 释放工具预算 |
proxy_add_custom_proxy(name, url, tags, runtime) | 添加临时服务器(仅限SSE/HTTP) |
proxy_list_tools(server_name?) | 列出所有安装工具的确切名称 |
proxy_inspect_registry() | 诊断:当前工具注册表的完整转储 |
proxy_get_metrics() | 实时内存/CPU/正常运行时间指标 |
MCP资源
| URI | 描述 |
|---|---|
mcp://proxy/info | 静态元数据(版本、功能) |
mcp://proxy/health | 实时健康状况(正常运行时间、内存、活动工具) |
mcp://proxy/servers | 完整的服务器资源清册(活动+可用) |
MCP发现表面
| MCP方法 | AI看到了什么 |
|---|---|
tools/list | 最小 proxy_* 管理工具 |
resources/list + resources/read | 实时健康状况、代理信息、服务器清单 |
prompts/list | suggest_tools_for_context 引导式工作流程 |
目录
catalogue.json \\u2014 46个公共MCP服务器(GitHub、Docker、Postgres、Slack、Stripe等)。
user.catalogue.json --您的私人覆盖(gitignored)。在此处添加个人服务器——本地路径、私有API、自定义工具。同名条目会覆盖公共目录。
[
{
"name": "my-server",
"description": "My private MCP server",
"command": "python /path/to/server.py",
"tags": ["custom"],
"tech_stack": ["any"],
"runtime": "stdio",
"env_vars": ["MY_API_KEY"],
"pick": ["id", "status"],
"token_budget": 500
}
]响应转向
通过在服务器响应到达LLM之前对其进行整形来优化AI上下文的使用。适用于任何服务器(stdio、SSE、REST):
pick:要保留的点标记路径数组(所有其他路径均已删除)。omit:要删除的路径数组。template:Python风格的格式字符串(例如。,"{id}: {content}")将复杂的JSON转换为可读文本。token_budget:硬字符上限(大约标记\*4),以防止上下文泛滥。
REST网桥支持(通过40mcp)
代理支持 runtime: "rest",允许它作为任何OpenAPI或GraphQL API的桥梁。
- 自动生成:使用
proxy_activate_from_spec(name, url)在中生成服务器配置./configs/并立即安装。 - 手动设定:添加一个条目
"runtime": "rest"和"config_path": "configs/mysvc.json"。代理使用40mcp引擎将MCP工具调用映射到REST/GraphQL请求。
环境变量
.env (gitignored)在启动时自动加载。复制 .env.example 开始:
cp .env.example .env按键跟随 env_vars 每个目录条目中的字段。真实环境变量中的值始终优先于 .env 文件。
配置
proxy_config.json (gitignored,使用安全默认值自动生成):
{
"tool_budget": 50,
"auth_enabled": false,
"guardrails_enabled": true,
"rate_limit_rpm": 120,
"catalogue_path": "catalogue.json",
"audit_log_path": "audit.log"
}关键设置:
tool_budget--一次暴露的最大工具数(默认值50,符合反重力限制)auth_enabled-用于生产的JWT RS256+HMAC API密钥验证guardrails_enabled--快速注射扫描+结果大小上限
安全
当 auth_enabled = true:
- JWT(RS256)——套装
jwt_public_key_path到您的RSA公钥PEM - HMAC API密钥集
hmac_api_key(通过X-API-Key头球 - 护栏——对所有工具描述进行8次快速注射模式检查
- 审计日志——记录到的每个工具调用
audit.log(JSON行) - 速率限制——每个呼叫者可配置的RPM
热插拔插件
将任何可执行的MCP服务器脚本放入 ./plugins/。代理通过监视器检测到它并实时注册——不需要重新启动。
自主工具和热插拔
这个代理的真正力量在于 运行时突变与静态MCP配置不同,此代理允许代理随着任务的进展“进化”其工具箱:
- 即时激活:运行数小时的A2A(代理到代理)工作流可以激活
sequential-thinking只有当碰到复杂的逻辑门时,才将其换成docker或terraform在执行阶段。 - 自主Bootstrap:代理可以研究新工具,通过以下方式配置其环境
proxy_add_custom_proxy,并立即开始使用,无需人工干预。 - 自我修正:如果缺少工具,代理可以编写一个新的MCP服务器
./plugins/代理将立即对其进行热插拔。 - 代币可持续性:通过保持活动工具集的精简(通过LRU驱逐),长时间运行的代理可以避免上下文窗口饱和,并保持对任务的峰值关注。
更新公共目录
uv run python scripts/sync_catalogue.py运行测试
uv run pytest tests/ -v可选HTTP端点
默认情况下禁用。启用 ENABLE_HTTP_SIDECAR=1:
curl -X POST http://localhost:8765/handshake \
-H "Content-Type: application/json" \
-d '{"tech_stack": ["python", "fastapi"], "task_description": "Building a REST API"}'长时程记忆
该项目使用反重力LTM协议。代理上下文存在 .antigravity/memories/ (gitignored--每个开发人员的本地):
patterns_and_lessons.md--解决了问题,失败了codebase_insights/--模块级隐藏知识architectural_decisions/--设计权衡和基本原理
按照以下步骤启动本地LTM BOOTSTRAP.md 来自协议仓库。看 AGENTS.md 对于完整的代理协议。
相关工作和问题背景
人类学/克劳德编码#7336 记录了一个真正的问题:在会话启动时加载所有MCP服务器可能会消耗 54%的可用上下文窗口 (约108k的200k令牌)在发送单个消息之前。已经提出或建立了几种方法:
| 项目 | 方法 | 限制 |
|---|---|---|
| machjessmoto/claude延迟加载 | 离线注册表生成器——从MCP配置中生成轻量级令牌索引 | 无运行时注入;明确列出 *“运行时自动延迟加载”* 需要Claude Code支持 |
| 街区镇/mcp门户 | 用3-4个通用工具替换所有工具 gw(service, tool, args) 垫片工具;调用时分派 | 硬编码,要求每栈分叉和编辑;AI失去了完整的工具类型安全性和发现能力 |
| 这个项目 | 智能代理,通过以下方式仅激活与当前项目上下文相关的服务器 proxy_handshake(),通过LRU驱逐强制执行工具预算,并且在运行时完全动态 | 与 *任何* 今天的MCP客户端--不需要更改IDE |
为什么MCP层是解决这个问题的合适位置
- 客户不可知 --代理透明地处理任何MCP客户端(Claude Code、Windsurf、Antigravity、opencode、Claude Desktop…)的延迟加载,而不仅仅是一个IDE。
proxy_handshake()已经从问题中交付了“之后”的用户体验 --功能请求的理想示例显示> Auto-loading: context7, magic [+3.5k tokens]在检测到用户输入中的关键字之后。这正是proxy_handshake({ tech_stack, task_description })今天做。- 无需叉子 --将服务器添加到
catalogue.json或user.catalogue.json;匹配器和预算执行是自动的。
