使用说明
动态MCP代理
一个智能MCP代理服务器,根据您的项目上下文延迟加载相关的MCP工具服务器,将AI工具计数保持在推荐的限制范围内(对于Google Antigravity,≤50个工具)。专为需要开发自己的工具集的高自主性环境而设计。
部分 反重力剂提示协议 生态系统。
这个项目是一个可行的、与客户无关的解决方案 人类学/克劳德编码#7336-- 功能请求:MCP服务器和工具的延迟加载. 看 相关工作 在......下面
运作原理
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.
安装
使用强化安装程序进行安装(克隆或就地安装):
curl -fsSL https://raw.githubusercontent.com/SPhillips1337/DynamicMCPProxy/main/install.sh -o install.sh
chmod +x install.sh
./install.sh --dir "$HOME/DynamicMCPProxy"
如果您已经克隆了存储库,请从项目根目录运行安装程序:
./install.sh
安装程序在更新之前验证现有的目标目录是否是此存储库,检查所需的工具(git 和 uv),运行 uv sync,并创建 proxy_config.json 从 proxy_config.json.example 必要时。要检查首次安装,请在执行脚本之前下载并查看脚本;除非您信任源代码,否则请避免将远程脚本直接管道传输到shell中。
手动安装仍然存在:
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?, lean?) |
从OpenAPI/GraphQL生成并挂载服务器(lean=True使用LAP来实现更小的规格) |
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/正常运行时间指标 |
proxy_get_usage() |
服务器使用率对自我进化排名很重要 |
proxy_reset_usage(server?) |
重置使用统计数据(用于测试/重新基线化) |
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 --49个公共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",
"receipts_enabled": true,
"otel_enabled": false,
"otel_service_name": "dynamic-mcp-proxy",
"otel_exporter_otlp_endpoint": null,
"otel_capture_content": false
}
关键设置:
tool_budget--一次暴露的最大工具数(默认值50,符合反重力限制)auth_enabled-用于生产的JWT RS256+HMAC API密钥验证guardrails_enabled--快速注射扫描+结果大小上限receipts_enabled--将JSONL收据写入audit_log_path随着run_id,span_id、调用者、状态、延迟、服务器/工具名称和隐私安全参数摘要otel_enabled--在以下情况下,可以选择将接收事件镜像到OpenTetry中opentelemetry-*软件包已安装;JSONL收据在没有这些可选包的情况下继续工作otel_capture_content--默认为false;默认情况下,不捕获跟踪中的原始提示、客户内容、API密钥或工具有效负载
收据和可追溯性
DynamicMCPProxy是收集代理收据的正确位置,因为每次服务器激活和子MCP工具调用都会通过它。默认情况下,收据在 audit.log 专为安全第一调试而设计:
- 每条记录都包括
run_id和span_id;相关操作可以传递父跨度(如果可用)。 - HMAC/JWT调用者由身份验证类型标识,而不是由秘密值标识。例如,sidecar HMAC调用记录
service:hmac. - 工具参数概括为密钥、类型、长度和SHA-256指纹。未记录原始字符串、嵌套有效负载、密码、令牌、cookie和API密钥。
- OpenTetry导出是可选的,依赖关系是可选的。如果在未安装OTel包的情况下启用,代理会向stderr记录一个警告,并继续使用JSONL收据。
JSONL记录形状示例:
{
"ts": "2026-07-04T12:00:00+00:00",
"event_type": "mcp.tool.call",
"run_id": "run_...",
"span_id": "...",
"tool": "github_search",
"caller": "service:hmac",
"outcome": "ok",
"latency_ms": 42.1,
"server": "github",
"argument_keys": ["query"],
"redacted_args": {
"query": {"type": "str", "length": 12, "sha256": "..."}
}
}
安全
当 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协议。回购在 docs/memories/.每个开发人员的上下文都存在于 .antigravity/memories/ (忽略):
patterns_and_lessons.md--解决了问题,失败了codebase_insights/--模块级隐藏知识architectural_decisions/--设计权衡和基本原理
按照以下步骤启动本地LTM BOOTSTRAP.md 来自协议仓库。看 AGENTS.md 对于完整的代理协议。
存储库文档
README.md--用户概述和入门CONTEXT.md--简明操作手册(堆栈、规则、决策、指导)AGENTS.md--代理行为、工作流规则和LTM协议(HERMES等效协议)docs/memories/--活记忆:模式、见解、架构决策research/--外部参考、比较和注释(非事实来源)
相关工作和问题背景
人类学/克劳德编码#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;匹配器和预算执行是自动的。