FRONTIER · 2026-10-06 · Uber Engineering

扫到的 MCP 工具,默认先关着

Uber 把内部 API 扫进统一的 MCP 注册表。扫到只是登记。每个 server 和每个工具一开始都是关闭的,所属团队审查之后才打开。

1讨论什么

Uber Engineering 在 2026 年 10 月 2 日发了一篇 X 长文,Designing MCP Gateway。他们要解决的是内部 agent 接工具时各写各的:难找、难运维,也和具体服务绑死。

做法是做一个 MCP Gateway。控制面放注册表,数据面做运行时代理。已有 API 不用改成 MCP server,网关负责把 MCP 调用翻成原来的协议。

这篇工程笔记里最硬的一句原则是:discovery doesn’t imply exposure。发现了,还不等于对外暴露。每个 MCP server、每个工具,初始状态都是 disabled。所属团队明确审查并启用之后,才进到可调用的集合。

2三条登记路径

内部有几千个服务,接口走 HTTP、gRPC 或 TChannel。让每个团队手写一个 MCP server,他们判断会又慢又痛。登记交给 AutoCrawler。它是挂在 Cadence 上的分布式工作流,订阅 IDL 注册表和内部服务信号。cron 按固定节奏触发一次扫描,找新服务、新 API 和 schema 变更。

IDL 路径针对 Protobuf 或 Thrift。对每个服务的 API 组,AutoCrawler 建立或更新虚拟 MCP server,解析方法名、请求和响应 schema、注释,再用 LLM 生成给 agent 看的工具说明,把 schema 译成 MCP 用的 JSON-RPC 2.0,然后写入注册表。写入时就是关闭状态。

原生 MCP 用另一套。Uber 用 MCPFx 写直接实现 MCP 的服务。每个原生 server 打心跳,表示自己在、并且就绪。AutoCrawler 看到心跳后调用 listTools,把对方声明的工具和 schema 收进来,在注册表里建一个虚拟代理。这些工具同样以关闭状态入库。

第三方点名了 Jira 和 Google。网关把调用方的内部用户 token 往后传,同时做鉴权、限流和敏感数据打码。对方的 MCP 服务再把这个内部 token 换成自己的凭证,然后才打到外部 server。

IDL 扫描 Protobuf / Thrift 生成说明后关闭入库 原生 MCP 心跳,再 listTools 虚拟代理,默认关闭 第三方 Jira、Google 内部 token 再换凭证 三条都进同一份注册表。关闭是初始状态,打开要所属团队审查。 来源:Uber Engineering,Designing MCP Gateway,2026-10-02。
图 1. 登记和启用是两步。AutoCrawler 可以不找服务团队写 server,开关不在爬虫手里。

工具说明一旦要改,会走出一份配置 diff,必须由 server 的 owner 批准。owner 可以批准并发布,也可以回到之前已知的一版。

3调用时网关做什么

数据面按固定节奏把控制面的 server 和工具配置拉进内存。启用状态变了,不用重启网关。它按配置物化虚拟 MCP server。每个虚拟 server 对外一个入口:/<service-name>/mcp。

进来的 MCP 调用由 Proxy Gateway 翻成 HTTP、gRPC 或 TChannel,发给原来的后端,再把 Protobuf 或 Thrift 的响应翻回 MCP 能用的 JSON。打到下游的那一跳走 Muttley,也就是跟后端服务放在一起的服务网格 sidecar。下游服务本身不用为了 agent 改接口。

鉴权用 Uber 内部的访问控制系统。策略按调用方的身份来,身份包括人、服务和 agent。Charter policy 写在 server 上,需要时可以按工具覆盖。工具回复里的 PII 和敏感字段,网关直接打码。

Agent 只发 MCP MCP Gateway 鉴权、打码、翻译 Muttley 服务网格 sidecar 原服务 接口不改 入口是 /<service-name>/mcp。配置变更靠刷新内存生效,不重启网关。
图 2. 协议翻译发生在网关。原服务继续讲 HTTP、gRPC 或 TChannel。

4结果

文中给出的规模是:网关当时托管超过 800 个 MCP server、超过 5000 个工具。这是「超过」,不是精确到个位的计数。分母是这座网关上的 server 和 tool,不是某一次 agent 任务的成功率。

编码 agent 还有一条不把工具定义放进上下文的用法,他们叫 Code Mode。命令行是 aifx,三条子命令:aifx mcp list 列出 server,aifx mcp search 在全部 server 里搜工具,aifx mcp call 经网关调用。输出写到文件,文件系统 agent 再按需摘。原文写:这已经是公司内部 coding agent 使用 MCP 的默认方式。本机不需要安装那些 MCP server。

原文里的结果条件
超过 800 个 MCP server,超过 5000 个工具这篇发布时网关上的托管规模
新工具初始为 disabledIDL 生成的、原生 listTools 收来的,都一样
Code Mode 成为内部默认coding agent 调 MCP。原文没给采用人数

帖子互动只说明传播,不说明设计是否成立。2026-10-07 00:36(北京时间)抓取时,这条帖子浏览 968462,赞 3098。分母是这一条帖。

5难点

爬虫可以替团队把工具写进注册表,所有权仍要留在服务团队。打开之前,owner 还要看生成出来的工具说明。说明一改就要批 diff。这一步若没人批,注册表里会堆着永远关着的工具。文章没有给「关着的比例」或平均打开时间。

工具回复可能带 PII。打码做在网关,按工具粒度。下游若在网关看不到的侧信道里返回同一份数据,这层打码盖不住。文章没有写他们测过哪些侧信道。

Code Mode 把工具定义留在网关外面,agent 用搜索来找。搜错工具时,上下文里没有那份完整 schema 帮它自查。文章把这当作省上下文的办法,没有给搜错率。

6新在哪里

新的部分是把「扫进目录」和「允许调用」拆开,打开权在所属团队。爬虫和调用方的 agent 没有这道开关。配置可以回滚到上一版已知状态。运行时只消费已经启用的那一版。

和 测过的优化,为什么还在跑 放在一起看:那边是旧的通过记录继续挑选程序,这边是新的工具记录先落库、默认不暴露。两篇都把「有一份记录」和「可以执行」分开。谱系仍在 递归自改进前世今生,这里不重写。

7出处

  • Uber Engineering,Designing MCP Gateway,2026-10-02。正文来自这条 X 长文,不是 eng.uber.com 上另找的镜像。抓取时首页没有列出这篇,正式博客 URL 未确认。
  • 原则原句:discovery doesn’t imply exposure. Every MCP server and tool starts in a disabled state and must be explicitly reviewed and enabled by the owning team.

没做的:没有在 Uber 内部复现 AutoCrawler 或 aifx;没有延迟、QPS 或打开率,原文没给,这里不补;Reddit 和 X 的讨论区没有登录态,不收。