字节笔记本
2026年8月28日
Docker cagent 动态 MCP:按需拉服务器
Docker 把 MCP Gateway 往前推了一步:代理不用再死盯一份写死的 MCP 配置,而是在会话里自己搜服务器、按需挂载,甚至在沙箱里用代码拼出新工具。配上开源的 cagent 和 ACP,这套动态 MCP 还能直接嵌进 Neovim、Zed 这类编辑器。
静态 MCP 为什么越来越难受
半年前大家演示 MCP,往往就挂一两个本地服务器,工具数量也好控。现在目录里动辄几百个服务器,问题就变成三件具体的事:
- 哪些服务器值得信
- 怎么避免把用不到的工具定义塞满上下文
- 代理能不能自己发现、配置、用好这些工具,而不是每次都让人去改 JSON、重启会话
以前的流程很不「代理化」:退出聊天界面,手改配置,重启,再回来看挂没挂上。服务器越多,这套流程越站不住。
Docker MCP Gateway 的解法:先给代理几把「原语工具」
Docker 的开源 MCP Gateway 站在代理和目录里各个 MCP 服务器中间,默认带一份策展过的 Docker MCP Catalog(两百多个可信服务器),也能接自己的私有目录。因为跑在 Docker 上,拉镜像、起容器的成本相对低。
关键改动是:会话一开始不塞满工具列表,而是先给代理几把用来管理 MCP 的原语工具,例如:
- mcp-find:按名字或描述在当前目录里搜服务器
- mcp-add:把目录里已有的服务器加进当前会话(需要时会拉镜像、起容器)
- mcp-exec / 动态选型:有些服务器可以先「可见、可查」,但不立刻把全部工具定义灌进上下文
代理接到「帮我搜一下」,可以自己 mcp-find 找到 DuckDuckGo 一类简单服务器,再 mcp-add 挂上并调用。遇到 Notion 这类要 OAuth 的远程服务器,Gateway 会在合适时机把授权流程抛回给用户(MCP elicitation、mcp-ui 等客户端能力会让这步顺一点)。
想关掉动态工具特性时,可以用:
docker mcp feature disable dynamic-tools客户端侧可用 docker mcp client connect,或在 Docker Desktop 的 MCP Toolkit「Clients」页里加连接。
code-mode:从「一次一次调工具」变成「写代码组合工具」
工具一多,上下文会被两块东西吃掉:工具定义本身,以及中间结果。Cloudflare、Anthropic 最近都在推类似「code mode」的思路:让模型写一小段代码,在沙箱里组合多个 MCP 工具,而不是每一步都把大量 schema 和中间输出塞回对话。
Docker Gateway 里的 code-mode 大致是:生成一段可调用指定服务器工具的 JavaScript,在仅能访问已选 MCP 服务器的容器沙箱里跑。好处比较实在:
- 权限边界仍在 MCP / 容器层,代理拿不到额外逃逸面
- 后续回合往往只需要记住「这个新拼出来的工具」,而不是整份巨型工具表
- 中间状态可以用 volume 留着,不必每轮都回灌给模型
常见例子是拿 GitHub Official MCP(工具特别多)再加 markdownify,让代理用 code-mode 写一段「拉 issue → 转 Markdown」的组合工具。Token 和延迟通常会好一截。
cagent + ACP:把动态 MCP 嵌进编辑器
cagent 是 Docker 的开源代理构建与运行时。新版本支持 Agent Client Protocol(ACP),可以把自定义代理接到 Neovim、Zed 等编辑器,也能把代理配置推到 / 从 Docker Hub 拉。
实际用法是:用 cagent 写好一个已经会用 Smart Search / code-mode 的 agent.yaml,再通过 ACP 挂进编辑器。例如 Neovim 里用 code companion 一类插件接 ACP,Zed 则按官方「添加自定义代理」文档配置。这样编辑当前项目时,代理可以按仓库上下文去目录里找相关 MCP,而不是一上来挂十几套用不到的服务器。
相关入口:
- MCP Gateway / 动态工具:https://github.com/docker/mcp-gateway
- 官方介绍文:https://www.docker.com/blog/dynamic-mcps-stop-hardcoding-your-agents-world/
- cagent:在 Docker 开源仓库与文档里搜 cagent、ACP adapter
动手前可以怎么想
| 环节 | 以前 | 动态 MCP 之后 |
|---|---|---|
| 发现 | 人去翻目录 | mcp-find 按描述搜策展目录 |
| 挂载 | 改 JSON、重启 | mcp-add 按需拉进会话 |
| 授权 | 事先配好 | 需要时再走 OAuth / elicitation |
| 组合 | 一轮轮 tool call | code-mode 在沙箱里脚本化 |
| 上下文 | 工具定义堆满 | 只保留当前任务真正用到的 |
如果你已经在用 Docker Desktop 4.50+ 的 MCP Toolkit,优先试:连上 Gateway → 让代理自己 find/add 一个无密钥的服务器 → 再试一个要 OAuth 的 → 最后对工具很多的服务器开 code-mode。先把「谁决定挂哪些工具」从人挪到代理,再谈省 token;顺序反了容易只感觉到复杂度上去了。
这套东西还在快速迭代,适合当实验工作流,而不是一次性锁死生产配置。试完有坑,直接去 Gateway 仓库开 issue 或讨论最管用。