惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
月光博客
月光博客
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
T
Tailwind CSS Blog
美团技术团队
D
Docker
V
Visual Studio Blog
Martin Fowler
Martin Fowler
博客园 - 聂微东
The Cloudflare Blog

InfoQ - 促进软件开发领域知识与创新的传播

Meta 收购 Manus 这事儿泡汤了 5.5万 Star 开源项目 Ghostty 被迫出走,GitHub 正在终结一代技术人的乌托邦 Slack 长时运行多智能体系统的上下文管理方案 从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台 谷歌云推出 Agents CLI,简化 AI 智能体开发全流程 Claude官方击穿高薪、高学历的安全防线!Anthropic点名10大高危职业,但有群人暂时稳了 亚马逊云科技终止 WorkMail 服务,并将 App Runner 转入维护模式 OPPO小布记忆:全模态碎片化内容的理解与智能整理实践|AICon上海 模力工场038周AI应用周榜:工具在消失,工作流在出现 Akamai CEO Tom Leighton:Agent 时代来临,云基础设施正从“中心化”转向“分布式边缘” 日均数百亿入库背后:从“人肉调度”到K8s弹性架构,度小满金融基于OceanBase重构入库架构实践 百度文库网盘发布GenFlow 4.0:月活用户超1亿,要把网盘变成全端AI工作台 Altman 投的 Agent 终端 Warp 开源了!斩获3.5万star 哪些客户需要拒, 敢让龙虾决定吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从开发到生产:为什么越来越多的机器学习团队纷纷迁移到 Snowflake | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 探索多智能体工作流:LangGraph Snowflake Cortex AI | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 腾讯云分布式缓存数据库:AI Agent - 从提示词工程到 Harness 工程 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 基于 Streamlit 为 CSV 数据构建分析智能体 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 AI 智能体:告别文档缺漏 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 构建 AI 驱动的数据管道:深度探讨 Snowflake Openflow 与非结构化数据 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 云端太贵、本地不够聪明,英特尔押注“端云混合AI”:智能体PC会替人完成工作 不到10%的存储投入,可能拖垮90%的GPU投资!IBM把AI Agent塞进存储系统,算清企业最容易忽略的一笔账 Snowpark 上手实战 | BUILD 2025_大数据_王玮_InfoQ精选视频 ClickHouse + Langfuse,构建 Agent 可观测基石 腾讯云分布式缓存数据库:Cluster Proxy 共享连接架构深度解析 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 AI 写代码太烧钱了:Copilot、Claude 一起涨价,不如把程序员请回来? 英特尔发布至强600系列工作站处理器与锐炫Pro B70 GPU,全新AI工作站来了 腾讯云分布式缓存数据库:从 Redis 到 Valkey - 开源社区如何快速创新 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 印奇这次要“从0重做”智驾模型!首谈阶跃和千里双公司布局:中国AI商业闭环要靠车跑出来 从Cursor返聘归来,90后华裔女高管带Claude开启日更模式:token成本比工程师工资低多了!
Chrome 推出 WebMCP 标准提案(Origin Trial):为智能体提供...
作者:Bruno Couriol马可薇 · 2026-06-18 · via InfoQ - 促进软件开发领域知识与创新的传播

谷歌近日宣布,WebMCP 已进入 Chrome 149 的 Origin Trial 阶段。WebMCP 是一项新的标准提案,它允许网站向浏览器内的 AI 智能体暴露可调用工具,例如 JavaScript 函数或 HTML 表单。这样一来,智能体便可以通过明确的接口完成用户操作,而不再需要依赖成本高昂且可靠性有限的“猜测式”交互方式,例如读取屏幕内容或解析 DOM 结构。

谷歌这样解释 WebMCP 的设计初衷:

通过定义这些工具,你可以明确告诉智能体应该如何以及在何处与网站交互。这样一来,智能体便能够调用面向机器的接口,在数秒内完成复杂任务,同时获得更高的可靠性、准确性和个性化能力。举例来说,假设用户正在规划一次多城市旅行。过去,用户只能看着智能体一步步填写旅行表单;而现在,用户可以授权智能体直接调用后端 API,瞬间生成结合天气因素优化过的个性化行程方案,并提交给用户确认。

在没有 WebMCP 的情况下,如果 AI 智能体希望代表用户完成某项操作,通常需要经历一套相当复杂的流程:首先下载相关网页的 DOM,然后分析页面中的按钮和控件作用,接着截取页面截图并进行图像识别。最后推断目标按钮在屏幕上的坐标位置,并模拟鼠标点击。正如业内经常提到的那样,这种方式不仅不够确定,而且 Token 消耗极高。一个简单的 CSS 布局变化,或者一个加载稍慢的广告组件,都可能导致整个自动化流程失效。与此同时,即便是低分辨率截图,其图像分析过程也会带来额外延迟和大量 Token 开销。

与主要面向后端场景的模型上下文协议(MCP)类似,WebMCP 也允许网站为 AI 智能体提供明确的接口,从而让其能够代表用户完成个性化任务。但两者的定位并不相同。WebMCP 完全运行在客户端侧,专门为浏览器环境设计,因此省略了 MCP 中许多服务器端概念,例如 Resources。从本质上讲,WebMCP 的目标是帮助智能体更可靠地理解 Web 界面。开发者可以通过定义 API,为智能体提供一组带有名称、类型和说明的操作菜单,让其直接调用,而不是依赖对页面结构的推测。

WebMCP 规范目前定义了两种 API 形式。第一种是声明式 API(Declarative API)。它允许开发者直接在现有 HTML 表单上添加自定义属性

<pre class=" language-html"><code class="prism  language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span>  <span class="token attr-name">toolname</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Search flights<span class="token punctuation">"</span></span>  <span class="token attr-name">tooldescription</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>This form searches flights and displays [...]<span class="token punctuation">"</span></span>  <span class="token attr-name">toolautosubmit</span><span class="token punctuation">&gt;</span></span></code></pre>

复制代码

第二种是命令式 API(Imperative API)。它通过 modelContext 接口注册工具。注册工具时需要提供工具名称、描述以及输入参数 Schema:

pre class=" language-js"><code class="prism  language-js">document<span class="token punctuation">.</span>modelContext<span class="token punctuation">.</span><span class="token function">registerTool</span><span class="token punctuation">(</span><span class="token punctuation">{</span>  name<span class="token punctuation">:</span> <span class="token string">'toggle_layer'</span><span class="token punctuation">,</span>  description<span class="token punctuation">:</span> <span class="token string">'Control pizza layers (sauce, cheese). Use "add", "remove", or "toggle".'</span><span class="token punctuation">,</span>  inputSchema<span class="token punctuation">:</span> <span class="token punctuation">{</span>    type<span class="token punctuation">:</span> <span class="token string">'object'</span><span class="token punctuation">,</span>    properties<span class="token punctuation">:</span> <span class="token punctuation">{</span>      layer<span class="token punctuation">:</span> <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">'string'</span><span class="token punctuation">,</span> <span class="token keyword">enum</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'sauce-layer'</span><span class="token punctuation">,</span> <span class="token string">'cheese-layer'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>      action<span class="token punctuation">:</span> <span class="token punctuation">{</span> type<span class="token punctuation">:</span> <span class="token string">'string'</span><span class="token punctuation">,</span> <span class="token keyword">enum</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'add'</span><span class="token punctuation">,</span> <span class="token string">'remove'</span><span class="token punctuation">,</span> <span class="token string">'toggle'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    required<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'layer'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>  <span class="token punctuation">}</span><span class="token punctuation">,</span>  execute<span class="token punctuation">:</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> layer<span class="token punctuation">,</span> action <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>    <span class="token keyword">await</span> <span class="token function">toggleLayer</span><span class="token punctuation">(</span>layer<span class="token punctuation">,</span> action<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">return</span> <span class="token template-string"><span class="token string">`Performed </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>action <span class="token operator">||</span> <span class="token string">'toggle'</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> on layer: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>layer<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span><span class="token punctuation">;</span>  <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>

复制代码

注册完成后,工具可以直接执行页面逻辑、管理状态,并将执行结果直接返回给智能体

一位为 Chrome DevTools 开发 WebMCP Polyfill 的早期实践者表示,WebMCP 带来了非常明显的效率提升。根据他的测试结果,LLM 的 Token 消耗量最高可减少约 90%。他表示:

Playwright 和 Chrome DevTools MCP Server 目前已经成为智能体驱动 Web 应用测试的事实标准。但它们的 Token 利用效率非常差。截图、执行操作、再截图的循环会迅速耗尽上下文窗口。

我一直在使用浏览器自动化来替代 TDD(因为智能体生成的测试中过度使用 Mock),但必须解决 Token 膨胀问题。因此,我 Fork 了 Chrome DevTools MCP Server,让它能够直接执行来自客户端 JavaScript 的 WebMCP 工具。

初步测试显示,Token 使用量大约下降了 90%。更难量化但同样重要的收益来自执行速度和确定性,两者都得到了显著提升。

不过,WebMCP 并非没有风险。提案作者特别提醒开发者,大语言模型容易受到间接提示注入(Indirect Prompt Injection)攻击,而将网站原生能力直接暴露给智能体,也会引入新的安全挑战。因此,他们建议开发者在工具定义中显式提供安全提示信息。对于来自外部来源的数据,应添加 untrustedContentHint 标记,以提醒智能体对相关输入进行严格的安全审查。相反,对于不会修改状态的只读操作,则可以使用 readOnlyHint,帮助智能体判断是否能够跳过人工确认步骤。

除了安全问题之外,WebMCP 还会带来一些运营层面的风险。例如,一个退款工具可能已经开放调用,但背后的退款政策却已经过时。此时,智能体仍然能够准确执行操作,只不过执行的是错误的业务逻辑。又或者,某位用户虽然能够访问某个页面,但实际上并不满足对应业务规则要求。过去,人类操作过程中可能会通过经验判断避免错误,而浏览器智能体则可能直接暴露这种权限设计漏洞。因此,开发者被建议针对关键用户旅程开展 AI Eval 测试,以验证智能体在真实场景下的行为是否符合预期。

一些早期采用者也发现,虽然 WebMCP 为智能体提供了更友好的网站接口,但这并不意味着智能体已经拥有完成任务所需的全部知识。它仍然需要准确了解”业务政策、用户状态、产品规则、资格条件、异常处理流程,以及人工干预路径。

谷歌还建议开发者尽量保持工具描述和返回结果的简洁性。目前推荐的长度限制包括:工具描述不超过 500 个字符;参数描述不超过 150 个字符;工具名称和参数名称不超过 30 个字符;单次工具输出不超过 1500 个字符。

在 I/O 2026 大会上,Chrome 团队将 WebMCP 作为其浏览器 AI 战略的重要组成部分之一进行了发布。与 WebMCP 一同公布的还包括面向浏览器的 Agentic Browsing 能力、内置 AI API,以及帮助开发者构建 AI 智能体的相关开发工具。

查看英文原文:WebMCP Standard Proposal for Agentic Web Actuation Now Available in Chrome (Origin Trials) - InfoQ