扩大 MCP 采用:面向企业 MCP 部署的更简单、更安全、更省钱的参考架构
原文:Scaling MCP adoption: Our reference architecture for simpler, safer and cheaper enterprise deployments of MCP Source: https://blog.cloudflare.com/enterprise-mcp/
2026-04-14
我们在 Cloudflare 已经把 Model Context Protocol(MCP) 作为 AI 战略的核心部分积极采用。这一转变远远超出工程团队,产品、销售、市场与财务团队的员工也在使用 agentic 工作流提升日常工作效率。但用 MCP 推广 agentic 工作流并非没有安全风险,这些风险包括授权扩散、prompt injection 和 供应链风险。为了在全公司广泛采用的同时保持安全,我们集成了 Cloudflare One(SASE)平台 与 Cloudflare Developer 平台 的一整套安全控制,让我们能够治理 MCP 之下的 AI 使用,而不拖慢员工。
在这篇博客中,我们将走过我们自己保护 MCP 工作流的最佳实践,把平台的不同部分组合起来,为自主 AI 时代构建一个统一的安全架构。我们还会分享两个支持企业 MCP 部署的新概念:
-
我们正推出 Code Mode 与 MCP server portals,大幅降低 MCP 使用相关的 token 成本;
-
我们描述如何使用 Cloudflare Gateway 进行 Shadow MCP 检测,以发现未授权远程 MCP server 的使用。
我们也会谈谈我们组织如何部署 MCP,以及如何用包括 远程 MCP 服务器、Cloudflare Access、MCP server portals 与 AI Gateway 在内的 Cloudflare 产品搭建我们的 MCP 安全架构。
远程 MCP 服务器提供更好的可见性与控制
MCP 是一个开放标准,使开发者能够在 AI 应用与其需要访问的数据源之间构建双向连接。在该架构中,MCP 客户端是与 LLM 或其他 AI agent 的集成点,MCP server 位于 MCP client 与公司资源之间。
MCP 客户端与 MCP 服务器的分离让 agent 能自主追求目标并采取行动,同时在 AI(集成于 MCP 客户端)与公司资源的凭证及 API(集成于 MCP 服务器)之间维持清晰边界。
我们 Cloudflare 的员工持续使用 MCP server 访问各种内部资源中的信息,包括项目管理平台、内部 wiki、文档与代码管理平台等。
很早以前我们就意识到,本地托管的 MCP server 是安全负担。本地 MCP server 部署可能依赖未审查的软件来源与版本,这增加了 供应链攻击 或 tool injection 攻击 的风险。它们让 IT 与安全管理员无法管理这些服务器,完全由员工和开发者自己决定运行哪些 MCP server 以及如何更新。这是一场必输之战。
相反,Cloudflare 有一支集中团队管理着全企业的 MCP server 部署。这个团队在我们的 monorepo 中构建了一个共享 MCP 平台,开箱即用提供受治理的基础设施。当员工想通过 MCP 暴露内部资源时,先获得 AI 治理团队批准,然后复制模板、编写工具定义并部署,过程中自动继承默认拒绝写控制并带审计日志、自动生成的 CI/CD 流水线 与免费的 secrets management。这意味着启动一个新的受治理 MCP server 只需要几分钟搭建。治理被烤进平台本身,这正是采用能如此迅速扩散的原因。
我们的 CI/CD 流水线把它们部署为运行在 Cloudflare 开发者平台 上自定义域名的 远程 MCP 服务器。这让我们能看到员工正在使用哪些 MCP server,同时保留对软件来源的控制。额外的好处是:每一台运行在 Cloudflare 开发者平台上的远程 MCP server 都会自动部署到我们全球的数据中心,这样无论员工身处世界何处,都能以低延迟访问 MCP server。
Cloudflare Access 提供身份认证
我们的一些 MCP server 位于公共资源前面,比如 Cloudflare 文档 MCP server 或 Cloudflare Radar MCP server,因此希望对所有人开放。但我们员工使用的许多 MCP server 都位于私有公司资源前面。这些 MCP server 需要用户身份认证以确保只对授权的 Cloudflare 员工开放。为此,我们 monorepo 中的 MCP server 模板把 Cloudflare Access 集成为 OAuth provider。Cloudflare Access 保护登录流程并向资源颁发访问令牌,同时充当身份聚合器,校验最终用户的 单点登录(SSO)、多因素认证(MFA) 以及 IP 地址、地理位置或设备证书等多种上下文属性。
MCP server portals 集中发现与治理
MCP server portals 统一所有 AI 活动的治理与控制。
随着远程 MCP server 数量增长,我们撞到了新的墙:发现。我们想让每位员工(尤其是 MCP 新手)都能轻松找到并使用所有可用的 MCP server。我们的 MCP server portals 产品提供了便利的方案。员工只需把 MCP 客户端连到 MCP server portal,portal 立即展示其有权使用的全部内部与第三方 MCP server。
不止如此,MCP server portals 提供集中日志、统一策略执行以及 数据丢失防护(DLP 护栏)。管理员可以看到谁登录了哪个 MCP portal,并制定 DLP 规则,防止比如个人身份信息(PII)等特定数据被分享给特定 MCP server。
我们还可以制定策略来控制谁有权访问 portal 本身,以及每个 MCP server 的哪些工具应被暴露。例如,可以设置一个 MCP server portal,仅对财务组员工开放,只暴露内部代码仓库 MCP server 的只读工具。同时,另一个 MCP server portal 仅对工程团队的员工(且必须使用公司笔记本)开放,可以暴露代码仓库 MCP server 上更强大的读写工具。
我们 MCP server portal 架构的概览如上图所示。Portal 同时支持托管在 Cloudflare 上的远程 MCP server 与托管在其他任何地方的第三方 MCP server。这种架构的独特高性能之处在于,所有这些安全与网络组件都在我们全球网络的同一台物理机上运行。员工请求穿过 MCP server portal、Cloudflare 托管的远程 MCP server 与 Cloudflare Access 时,流量始终不离开同一台物理机。
Code Mode 与 MCP server portals 降低成本
我们做了几个月的高强度 MCP 部署,付出了不少 token 代价。我们也开始觉得多数人都在以错误的方式使用 MCP。
MCP 的标准做法要求为通过 MCP server 暴露的每个 API 操作单独定义一个工具。但这种静态而详尽的方法很快就会耗尽 agent 的上下文窗口,尤其对于拥有数千端点的大型平台。
我们之前写过我们如何在服务器端使用 Code Mode 驱动 Cloudflare 的 MCP server,让我们能在暴露 Cloudflare API 中的数千个端点 的同时把 token 使用降低 99.9%。Cloudflare MCP server 仅暴露两个工具:search 工具让模型写 JavaScript 探索可用内容,execute 工具让模型写 JavaScript 调用其找到的工具。模型按需发现所需,而不是预先收到一切。
我们太喜欢这一模式,必须把它带给所有人。所以我们现在在 MCP server portals 中推出了使用“Code Mode“模式的能力。现在你可以把所有 MCP server 都放在一个集中 portal 之后,该 portal 执行审计控制与渐进式工具披露,以降低 token 成本。
它的工作方式如下。不再把每个工具定义都暴露给客户端,你所有底层 MCP server 折叠成只有两个 MCP portal 工具:portal_codemode_search 与 portal_codemode_execute。search 工具让模型可以使用 codemode.tools() 函数获取所有连接的上游 MCP server 的全部工具定义。模型随后写 JavaScript 过滤并探索这些定义,精准找到所需工具,而无需把每个 schema 都加载进上下文。execute 工具提供一个 codemode 代理对象,每个上游工具都作为可调用函数。模型写 JavaScript 直接调用这些工具,串联多个操作,在代码中过滤结果与处理错误。所有这些都运行在 MCP server portal 上由 Dynamic Workers 驱动的沙箱环境中。
下面是一个 agent 例子,需要找到一张 Jira 工单并用 Google Drive 中的信息更新它。它先搜索合适的工具:
// portal_codemode_search
async () => {
const tools = await codemode.tools();
return tools
.filter(t => t.name.includes("jira") || t.name.includes("drive"))
.map(t => ({ name: t.name, params: Object.keys(t.inputSchema.properties || {}) }));
}
模型现在知道所需工具的确切名称与参数,而无须把工具的完整 schema 装进上下文。然后它写一次 execute 调用把操作串起来:
// portal_codemode_execute
async () => {
const tickets = await codemode.jira_search_jira_with_jql({
jql: ‘project = BLOG AND status = “In Progress”’,
fields: [“summary”, “description”]
});
const doc = await codemode.google_workspace_drive_get_content({
fileId: “1aBcDeFgHiJk”
});
await codemode.jira_update_jira_ticket({
issueKey: tickets[0].key,
fields: { description: tickets[0].description + “\n\n” + doc.content }
});
return { updated: tickets[0].key };
}
这只是两次工具调用。第一次发现可用项,第二次完成工作。没有 Code Mode,同样的工作流将要求模型预先收到来自两个 MCP server 的每个工具的完整 schema,然后做三次单独的工具调用。
让我们把节省感受得更具体:当我们的内部 MCP server portal 仅连接四个内部 MCP server 时,它暴露 52 个工具,光是定义就要消耗约 9400 token 的上下文。启用 Code Mode 后,这 52 个工具折叠为 2 个 portal 工具,大约消耗 600 token,降幅 94%。关键是,这一开销保持固定。随着我们把更多 MCP server 接入 portal,Code Mode 的 token 成本不会增长。
可以通过在 URL 上添加查询参数为 MCP server portal 启用 Code Mode。不再以常规 URL(如 https://myportal.example.com/mcp)连接 portal,而是在 URL 上加 ?codemode=search_and_execute(如 https://myportal.example.com/mcp?codemode=search_and_execute)。
AI Gateway 提供可扩展性与成本控制
我们还没结束。我们把 AI Gateway 接入架构,放在 MCP 客户端到 LLM 的连接上。这让我们可以快速在不同 LLM 提供方之间切换(防止厂商锁定),并执行成本控制(限制每位员工可用的 token 数)。完整架构如下。
Cloudflare Gateway 发现并阻止 shadow MCP
如今我们已为授权 MCP server 提供了受治理的访问,接下来看看如何处理未授权的 MCP server。我们可以使用 Cloudflare Gateway 进行 shadow MCP 发现。Cloudflare Gateway 是我们综合的安全 Web 网关,为企业安全团队提供对员工互联网流量的可见性与控制。
我们可以用 Cloudflare Gateway API 进行多层扫描,找出未通过 MCP server portal 访问的远程 MCP server。这可以使用多种现有的 Gateway 与 Data Loss Prevention(DLP)选择器,包括:
-
使用 Gateway
httpHost选择器扫描-
已知的 MCP server 主机名(如 mcp.stripe.com)
-
使用通配符主机名模式扫描 mcp.* 子域名
-
-
使用 Gateway
httpRequestURI选择器扫描 MCP 专属 URL 路径,如 /mcp 与 /mcp/sse -
使用基于 DLP 的 body 检查查找 MCP 流量,即使该流量使用的 URI 不含
mcp或sse等典型字眼。具体来说,我们利用 MCP 在 HTTP 上使用 JSON-RPC 这一事实,即每个请求都包含一个 “method” 字段,值如 “tools/call”、“prompts/get” 或 “initialize”。下面是一些可用于在 HTTP body 中检测 MCP 流量的正则规则:
const DLP_REGEX_PATTERNS = [
{
name: "MCP Initialize Method",
regex: '"method"\\s{0,5}:\\s{0,5}"initialize"',
},
{
name: "MCP Tools Call",
regex: '"method"\\s{0,5}:\\s{0,5}"tools/call"',
},
{
name: "MCP Tools List",
regex: '"method"\\s{0,5}:\\s{0,5}"tools/list"',
},
{
name: "MCP Resources Read",
regex: '"method"\\s{0,5}:\\s{0,5}"resources/read"',
},
{
name: "MCP Resources List",
regex: '"method"\\s{0,5}:\\s{0,5}"resources/list"',
},
{
name: "MCP Prompts List",
regex: '"method"\\s{0,5}:\\s{0,5}"prompts/(list|get)"',
},
{
name: "MCP Sampling Create Message",
regex: '"method"\\s{0,5}:\\s{0,5}"sampling/createMessage"',
},
{
name: "MCP Protocol Version",
regex: '"protocolVersion"\\s{0,5}:\\s{0,5}"202[4-9]',
},
{
name: "MCP Notifications Initialized",
regex: '"method"\\s{0,5}:\\s{0,5}"notifications/initialized"',
},
{
name: "MCP Roots List",
regex: '"method"\\s{0,5}:\\s{0,5}"roots/list"',
},
];
Gateway API 还支持额外自动化。例如,你可以使用上面定义的自定义 DLP 配置文件去阻止流量、重定向流量,或仅记录并审查 MCP 负载。综合起来,Gateway 可用于全面检测企业网络中访问的未授权远程 MCP server。
更多构建细节,见 教程。
面向公开的 MCP server 由 AI Security for Apps 保护
到目前为止,我们专注于保护员工对内部 MCP server 的访问。但与许多其他组织一样,我们也有面向公开的 MCP server,客户可借此 agentic 地管理与运维 Cloudflare 产品。这些 MCP server 托管在 Cloudflare 的开发者平台上。(各产品的具体 MCP 列表见 此处,也可以回看我们使用 Code Mode 提供更高效访问整个 Cloudflare API 的新方法。)
我们认为每个组织都应该为自己的产品发布官方一方 MCP server。否则,客户就会从公共仓库获取未审查的服务器,这些包可能包含 危险的信任假设、未公开的数据收集以及各种未授权的行为。通过发布你自己的 MCP server,你掌控代码、更新节奏和客户使用工具的安全态势。
由于每台远程 MCP server 都是 HTTP 端点,我们可以把它放在 Cloudflare Web Application Firewall(WAF) 后面。客户可以在 WAF 中启用 AI Security for Apps 功能,自动检查入站 MCP 流量是否存在 prompt injection、敏感数据泄露与主题分类。面向公开的 MCP 与任何其他 Web API 一样受到保护。
MCP 在企业的未来
我们希望我们的经验、产品与参考架构对其他组织在企业全员采用 MCP 的旅程中有所帮助。
我们已经通过以下方式保护了自己的 MCP 工作流:
-
为开发者提供模板化框架,使用 Cloudflare Access 进行身份认证,在我们的开发者平台上构建并部署远程 MCP server
-
通过把全员工连接到 MCP server portals,确保对授权 MCP server 的安全、基于身份的访问
-
使用 AI Gateway 调度面向员工 MCP 客户端 LLM 的访问以控制成本,并在 MCP server portals 中使用 Code Mode 减少 token 消耗与上下文膨胀
-
通过 Cloudflare Gateway 发现 shadow MCP 使用
对于在企业 MCP 旅程中前进的组织,我们建议先把已有的远程与第三方 MCP server 放在 Cloudflare MCP server portals 后面,并启用 Code Mode,从而开始享受更便宜、更安全、更简单的企业 MCP 部署带来的好处。
致谢: 本参考架构与博客代表了 Cloudflare 跨多角色与业务部门许多人的工作。这只是部分贡献者列表: Ann Ming Samborski, Kate Reznykova, Mike Nomitch, James Royal, Liam Reese, Yumna Moazzam, Simon Thorpe, Rian van der Merwe, Rajesh Bhatia, Ayush Thakur, Gonzalo Chavarri, Maddy Onyehara, and Haley Campbell.