产品发布 · 小互解读

Cloudflare 发布 WebMCP:后台打开一个开关,你的网站就能被 AI 直接操作

源站一行代码不用改,Cloudflare 在边缘往每个 HTML 里塞一行脚本;但今天的 Chrome 稳定版还认不出这个接口,本站实测给你看。
一分钟速览
  • Cloudflare 后台多了一个开关,打开之后,AI Agent 打开你的网页不用再截图猜按钮,可以像调函数一样直接把事办了。
  • 你的源站一行代码不用改,也不用重新部署,脚本是网页发出去的路上被塞进去的。
  • 但今天打开它,绝大多数访客那边什么也不会发生。我在最新版 Chrome 上实测了一遍,结果在第八节。
⚑ 这是 Cloudflare 自己发布的产品预览,功能描述和示例数据都来自厂商。文中标注「本站实测」的部分是我自己在本机 Chrome 上验证的,与厂商无关。
发布

打开一个开关,网站就能被 AI 直接操作

Cloudflare 昨天放出了 WebMCP 的开发者预览版,你在后台点一个开关,你的网站就多了一套「给 AI 用的按钮」:AI Agent 打开你的页面,不用再截图、猜按钮在哪、一步步试,可以像调一个函数那样把事办了。

对网站主来说,这件事的实际价值在于成本几乎为零:源站一行代码不用改,也不用重新部署,访客的浏览器要是不支持,它自己静默跳过,页面跟以前一模一样。

新在哪:WebMCP 这个标准本身几个月前就有了,但一直是「网站得自己写代码去支持」,设计要暴露哪些工具、接进自己的界面、还得跟着标准的变化一路维护。Cloudflare 干的事是把这一步替你做了。

背景

AI 现在用网页,全靠爬内容和截图猜按钮

网页这东西,从第一天起就是按「屏幕对面坐着一个人」设计的。有人会读文字、会点按钮、会填表单。

现在越来越多的访客是 AI Agent。它们怎么用这些为人做的页面?眼下就两条路,都不太好。

第一条是爬取。 Agent 把整个页面抄回自己的服务器去解析。这条路网站主最难受,内容被拿走了,流量一点没留下,署名也没有。

惯常的做法是爬虫,把内容复制回一台服务器,而且往往一点流量都不给原站,署名也少得可怜。有更好的办法,而且它不需要抓取。

Cloudflare 博客 · Give any website a WebMCP interface

第二条是截图-分析-点击。 Agent 像人一样看屏幕:截个图,让模型分析这是什么界面、搜索框在哪,点进去,再截图,再分析。慢、脆,而且烧掉的 token 大半花在「认路」上,不是花在办事上。页面改个版,整套流程就废了。

WebMCP 想给出第三条路:网站主动告诉 Agent「我这儿有哪几个工具你可以直接调」,比如「搜航班」「订机票」,每个参数是什么类型写得清清楚楚。Agent 不用猜了,直接调。

路子一 · 爬走内容 你的网页 整页抄走 AI 的服务器 代价:流量和署名一点没留下 路子二 · 截图猜按钮 截个图 模型分析 点一下 再截一次,从头再来 代价:慢、改版就废 token 花在认路上 路子三 · 直接调工具(WebMCP) 你的网页列出工具 搜商品 加购物车 查订单 结账 照着调 AI Agent 一次调用就办完, token 花在办事上
三条路的代价对比。前两条是今天的现实,第三条是 WebMCP 想换掉它们的方式。本站按原文机制描述绘制。
同一个问题的另一种答法,站内解读过
Cloudflare 发布自动收费网关:AI 想爬取你的网页、API,能自动给你付钱
那篇的思路是「既然拦不住爬,那就让它付钱」,这篇的思路是「根本不用爬」,同一件事的两个方向。
标准

WebMCP 让网站把能干的事列成工具,AI 照着调

先说清楚它的身份:WebMCP 是一个浏览器标准提案,正在 W3C 的一个社区组里孵化,还没成为正式标准。Chrome 那边给它的状态标注到今天仍是「Proposed」(提议中)。

它在网页里长成一个接口,叫 document.modelContext。网站往这个接口上挂工具,浏览器里的 Agent 就能看见并调用。

挂工具有两种写法,门槛差得挺远:

一种是写 JavaScript,调 registerTool(),把工具的名字、说明、参数结构和执行逻辑都写清楚。复杂的交互只能这么来。

另一种更省事,就在你已经有的 HTML 表单上加几个属性。 一个订餐表单,加上 toolname(这个工具叫什么)、tooldescription(它是干嘛的),再给每个输入框加一句 toolparamdescription(这一格填什么),浏览器就自动把它变成一个 Agent 能调的工具,连参数说明书都替你生成好。

你本来就有的订餐表单 订一张餐桌 日期 几位 联系电话 加三个属性 toolname="book_table" tooldescription="订一张餐桌" toolparamdescription="…" 浏览器自动转换 Agent 看到的工具 book_table 订一张餐桌 参数说明书(自动生成) date : string · 必填 party : number · 必填 phone : string 下拉框自动变成可选项清单, 勾选框自动变成是/否
声明式写法:表单不动,加三个属性就成了工具。右边的参数类型转换规则来自 Google 官方仓库的实现,下拉框转成可选项清单,数字框转成数字,勾选框转成是/否,标了必填的进必填列表。示意图为本站绘制。
实际怎么用

工具会随页面变化,付款前停下等人确认

光看接口定义,还感觉不到它实际用起来什么样。Cloudflare 自己的远程浏览器文档里带了一份实操记录,走的是 Google 官方那个酒店预订 demo,两个细节挺出乎意料。

一是工具不是固定几个。 刚打开页面时只有三个:看酒店详情、按地点搜、查设施政策。等你调完「按地点搜巴黎」,页面跳到搜索结果,这时候才多出来一个新工具「筛选搜索结果」。工具跟着页面状态走。

二是敏感操作会把 Agent 卡住。 「完成预订」这个工具调下去不会直接成交,它停在那儿,等你在浏览器里点「确认预订」那个按钮。这是标准内建的人工确认机制。

页面状态:酒店首页

Agent 刚打开页面,先问一句「你这儿有什么工具」

拿回来三个。想筛选?没有这个工具,因为页面上还没有可筛的东西。

view_hotel 看酒店详情 search_location 按地点搜 lookup_amenity 查设施政策
页面状态:搜索结果页

Agent 调 search_location,参数填「Paris」

页面跳到了搜索结果。再问一次工具清单,多出来一个,这个工具刚才根本不存在。

view_hotel 看酒店详情 search_location 按地点搜 lookup_amenity 查设施政策 + filter_search_results 筛选结果
页面状态:筛过的结果页

Agent 调 filter_search_results,参数填「含早餐」

拿回一份筛过的酒店清单。挑一家,再调 start_booking 开始订。

filter_search_results 筛选结果 + start_booking 开始预订
页面状态:预订确认页

Agent 调 complete_booking,填好姓名和邮箱,然后卡住了

这一步不会自己完成。工具停在那儿等着,直到有人在浏览器里点下「确认预订」那个按钮,预订才真的成立。

complete_booking · 等人点确认
点上面四步看工具清单怎么变。流程和工具名来自 Cloudflare BrowserRun 官方文档里的实操记录。
机制

Cloudflare 的做法:网页送出去的路上塞进一行脚本

标准讲完了,回到 Cloudflare 这次的活。它的实现分两块,两块都在你的源站前面,你的代码一个字不用动。静态站还是单页应用,效果一样。

第一块:在边缘塞一行脚本

你在后台把开关打开之后,你的每一个 HTML 页面从 Cloudflare 的服务器发给访客之前,会被加上这么一行:

Cloudflare 自动注入的那一行
<script type="module"
        src="/.webmcp/bridge.js"
        data-packs="c2pa,mcp-server-client"
        data-mcp-url="/mcp"></script>
data-packs 是启用哪几个功能包,data-mcp-url 指向你自己的 MCP 服务器(默认就是同一个域名下的 /mcp)。这个脚本本身也是 Cloudflare 发的,跟你的网站同域名,所以页面别的地方什么都没变。

干这件事的工具叫 HTMLRewriter,Cloudflare 在网页送出去的路上改写 HTML 的东西。你的源站服务器完全不知情,也不用配合。

第二块:bridge.js 这个桥

它在页面里跑,第一件事是找浏览器有没有 WebMCP 接口。没有就直接返回,什么也不做,页面跟以前一模一样。有的话,它把 data-packs 里列的包合成一份工具清单,逐个注册上去。

你的源站 一行代码没改 Cloudflare HTMLRewriter 在这里 往 HTML 里塞一行 script 访客的浏览器 bridge.js 开始跑 这个浏览器有 WebMCP 接口吗 没有 直接返回,什么也不做 页面跟以前一模一样 ← 今天绝大多数访客走的是这条 把功能包合成工具清单 逐个注册给 Agent
整条链路。左半边是 Cloudflare 替你做的,右半边是 bridge 在访客浏览器里做的。「没有接口就静默返回」这个设计,正是它能一键开、不怕开的原因。本站按原文机制描述绘制。
工具包

自带两个功能包:查图片来历、调你自己的 MCP 服务

工具是按「包」给的,一组相关的工具打包在一起,一起开关。预览版给了两个包,都完全在访客的浏览器里跑,不绕道 Cloudflare 的服务器。以后加了新包,站点只要在后台勾一下就能用上,不用重新部署。

包一:查页面上的图片是谁做的

这个包读的是图片里的 C2PA 信息,一套给图片记「出身证明」的行业标准:这张图是谁生成的、是不是 AI 做的、后来谁改过,都写在图片文件开头的元数据里。

打个比方

像相机胶卷边上那排小字,记着这张片子出自哪台机器。只不过现在记的是「这张图是 Adobe Firefly 生成的,Adobe 公司签的字」。

包里给两个工具。scan_images_c2pa 把整页图片扫一遍,返回一份摘要。Cloudflare 给的示例输出是:整页 12 张图,全扫完了,其中 8 张带 C2PA 信息;每张列出来源,比如某张 hero.jpg 的生成器写着 Adobe Firefly、签名方是 Adobe Inc.。另一个 inspect_image_c2pa 单张挖深,解出完整档案,编辑历史、声称的作者、签名证书。

技术上它就是一个纯 TypeScript 的读取器,只碰图片开头那几 KB 的元数据,不下载整张图。

这一点很实在

只读不验签。每条结果里都带一个 signatureVerified: false,明明白白告诉 Agent:这只是我从图里读出来的说法,我没做密码学校验。这样 Agent 就不会把「图片自称是 Adobe Firefly 做的」当成「已核实是 Adobe Firefly 做的」。

包二:把你自己的 MCP 服务器搬进页面

如果你的站本来就有一个 MCP 服务器(这一两年不少公司已经建好了),这个包会先去 /mcp 问一句「你有哪些工具」,拿到清单之后,把你已有的每个工具原样代理一份到页面上:名字照抄、说明照抄、参数说明书也直接照抄。

这也是两个包的差别所在,查图片那个包的工具是预先写死声明好的,这个包的工具得先问才知道。

bridge 怎么把你的一个工具变成 Agent 能调的工具
document.modelContext.registerTool({
  name: tool.name,                 // 比如 "search_products"
  description: tool.description,
  inputSchema: tool.inputSchema,   // 直接照抄你的参数说明书
  execute: async (args) => {
    const res = await fetch(mcpUrl, {   // 同域名的 /mcp
      method: "POST",
      credentials: "same-origin",       // ← 带着访客当前的登录状态
      headers: { "content-type": "application/json" },
      body: JSON.stringify({
        jsonrpc: "2.0", id: 1, method: "tools/call",
        params: { name: tool.name, arguments: args },
      }),
    });
    const { result } = await res.json();
    return result;   // 结果原样传回去
  },
});
注意 credentials: "same-origin" 这一行:Agent 调这个工具时,用的是访客本人当前的登录状态。用户已经登录过了,Agent 帮他查订单不用再登录一遍。同一件事的另一面是,页面里的 Agent 拿到的就是这个用户本人的权限。
页面里的 Agent 调「搜商品」 带着登录状态 同域名的 /mcp 还是你自己的服务器 你的 MCP 服务器干活 结果原样传回页面 全程没经过 Cloudflare 的服务器,请求从访客的浏览器直接发到你自己的站
代理链路。Cloudflare 只负责把桥搭上,真正干活的还是你自己的 MCP 服务器。本站按原文代码绘制。

对 Agent 来说,这些全都是普普通通的 MCP 工具,Cloudflare 用的是 MCP 协议自己的数据类型,一个本来就会跟 MCP 服务器打交道的 Agent,不用加任何东西就能操作网页。

还有一句话透露了后面的路:bridge 的代码是 Cloudflare 边缘的一个 Worker 发的,这是给以后留的余地,将来的功能包可以让这个 Worker 干页面自己干不了的活,比如用 Workers AI 总结整个站点地图,或者查 AI Search 索引。

上手

这个开关在哪打开,怎么确认生效

后台路径:Cloudflare Dashboard → Agent Readiness → Labs(还挂着 Beta 标)。这个 Labs 页面的自我介绍是「实验性的、要自己开的功能,让你的站跟 AI Agent 配合得更好」。

Cloudflare Dashboard 里 Agent Readiness 下 Labs 页面的 WebMCP 开关和两个工具包勾选框
后台实际长这样:上面一个总开关,下面两个功能包的勾选框,两个默认都勾上。一个都不勾等于用默认集。图片来自 Cloudflare 博客。

确认真的生效了,就一条命令,去你的站要任意一个网页,看有没有那行注入:

验证
curl -s https://your-site.example | grep webmcp

想看工具真的能被调起来,不用自己造一个 Agent,拿 Browser Run(Cloudflare 那台跑在云上的远程浏览器)指向你的网址就行,它会像访客的 Agent 一样,把工具发现出来、调一遍。不过有个前提:WebMCP 目前只在 Chrome 测试版里,所以得开一个专门的实验会话。

Browser Run 是什么,站内解读过
Cloudflare 发布了一个浏览器 Kitesurf:专给 AI Agent 用,CPU 和内存省 3 到 7 倍
Browser Run 是 Cloudflare 那套给 Agent 用的远程浏览器服务,Kitesurf 是今天刚在它里面开放公测的新浏览器。
本站实测

实测:今天最新版 Chrome 还不支持 WebMCP

开是开了,但访客那一端现在到底认不认?这件事的说法需要更新一下。

Cloudflare 博客写的是 WebMCP「正在 Chrome 146 里实验性发布」。这个口径已经滞后了:Chrome 官方文档的说法是,WebMCP 的公开试用期(origin trial)从 Chrome 149 开始,网站去 Google 那儿登记一下,就能对自己的真实用户打开这个功能,不再只能在自己电脑上开开关试。而今天,Chrome 稳定版已经是 151 了。

所以到底能不能用?我在本机测了一遍。测试页面带了 Chrome 要求的那个隔离响应头,满足接口可用的前提条件:

默认的 Chrome 151
接口根本不存在
document.modelContextnavigator.modelContext 都读不到
打开 chrome://flags 里的「Experimental Web Platform Features」之后
接口出现了
两个都在,工具可以正常注册
这意味着什么

你今天把这个开关打开,Cloudflare 确实会往你的页面里注入那行脚本,但绝大多数访客的浏览器里根本没有这个接口,bridge 找不到它,按设计直接返回,什么也不发生,页面照旧。真正能吃到工具的,是那些自己开了实验开关的浏览器,以及跑 Chrome 测试版的云端远程浏览器。

这不是说这东西没用,「开发者预览」本来就是这个意思。它现在的价值在于「你可以零成本先把站备好」,而不是「今天开了明天就有 Agent 来用」。Chrome 那边给这个特性登记的目标发布版本是 157,状态仍然是「提议中」。

151
今天的 Chrome 稳定版,默认状态下接口不存在
149
Chrome 官方文档写的公开试用期起始版本
157
Chrome 给这个特性登记的目标发布版本,尚未落定

顺带一提,我也查了 Cloudflare 自己:它的博客、官网、Radar 三个站现在都没打开这个功能。Radar 那套自己的 WebMCP 工具也还没上线,发布时给的时间是「很快」。

边界

Chrome 官方列出的三个限制:网页不开着就调不了

标准本身还有几条硬边界,写在 Chrome 官方文档的「限制」一节里。这是做这套标准的人自己列的,比任何第三方点评都硬:

必须有开着的页面

工具调用是在页面的 JavaScript 里执行的,所以必须有一个开着的标签页提供界面。想让一个纯后台、不开窗口的 Agent 悄悄调 WebMCP 工具,办不到。

界面复杂的站有改造成本

站越复杂,越可能得重构或者补一堆 JavaScript 去处理页面状态。这一条对 Cloudflare 这个一键开关不完全适用,开关给的是通用工具包;但真要暴露你自己的业务能力,还是绕不开那个 MCP 服务器。

工具不好被发现

Agent 必须先访问到你的站,才知道你有没有可调的工具。没有一个全网名录能让它提前知道哪些站备好了。

另外两条是安全上的约束:WebMCP 只在做了源隔离的页面里可用(站点如果关掉这个隔离,接口直接失效);工具注册还受一条权限策略管,默认只允许顶层页面和同域名的页面注册,跨域名的内嵌框架默认禁止,想让它也能注册工具,得单独放行。

回到最开始那个问题:这个开关值不值得现在打开。开的成本是零,点一下,源站不动,浏览器不支持就静默跳过。所以要想的其实是另一个问题:开了之后,除了那两个通用包,你有没有自己的 MCP 服务器可以接上去。让 Agent 真能替用户在你站上办事的,是那个包。图片凭证扫描器是搭头。

🧰 上手卡 · Cloudflare WebMCP(开发者预览)
门槛域名托管在 Cloudflare,后台打开开关即可;想让 Agent 调你自己的业务功能,还得有一个同域名 /mcp 的 MCP 服务器
来源
Give any website a WebMCP interfaceCloudflare·blog.cloudflare.com·2026-08-06
本站说明
后台截图来自 Cloudflare 博客,其余示意图为本站按原文机制描述与代码绘制。第八节的 Chrome 实测由本站于 2026-08-07 在 macOS + Chrome 151.0.7922.108 上完成,测试页面响应头带 Origin-Agent-Cluster: ?1。酒店预订流程与工具名来自 Browser Run 官方文档;声明式表单的参数转换规则、Chrome 版本口径与三条限制来自 Chrome 官方文档与 Google 官方仓库源码,这几项都不出自 Cloudflare 那篇博客。