ByteNoteByteNote

字节笔记本

2026年8月28日

Docker cagent 动态 MCP:按需拉服务器

API中转
¥120

Docker 把 MCP Gateway 往前推了一步:代理不用再死盯一份写死的 MCP 配置,而是在会话里自己搜服务器、按需挂载,甚至在沙箱里用代码拼出新工具。配上开源的 cagent 和 ACP,这套动态 MCP 还能直接嵌进 Neovim、Zed 这类编辑器。

静态 MCP 为什么越来越难受

半年前大家演示 MCP,往往就挂一两个本地服务器,工具数量也好控。现在目录里动辄几百个服务器,问题就变成三件具体的事:

  1. 哪些服务器值得信
  2. 怎么避免把用不到的工具定义塞满上下文
  3. 代理能不能自己发现、配置、用好这些工具,而不是每次都让人去改 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 等客户端能力会让这步顺一点)。

想关掉动态工具特性时,可以用:

bash
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 之后
发现人去翻目录mcp-find 按描述搜策展目录
挂载改 JSON、重启mcp-add 按需拉进会话
授权事先配好需要时再走 OAuth / elicitation
组合一轮轮 tool callcode-mode 在沙箱里脚本化
上下文工具定义堆满只保留当前任务真正用到的

如果你已经在用 Docker Desktop 4.50+ 的 MCP Toolkit,优先试:连上 Gateway → 让代理自己 find/add 一个无密钥的服务器 → 再试一个要 OAuth 的 → 最后对工具很多的服务器开 code-mode。先把「谁决定挂哪些工具」从人挪到代理,再谈省 token;顺序反了容易只感觉到复杂度上去了。

这套东西还在快速迭代,适合当实验工作流,而不是一次性锁死生产配置。试完有坑,直接去 Gateway 仓库开 issue 或讨论最管用。

分享: