
2026 年 2 月 10 日,Chrome 146 悄悄上线了一个实验性功能,可能会彻底改变网站的设计理念——WebMCP。
这不是又一个花里胡哨的前端框架,而是 Google 和 Microsoft 联合推动的 W3C 标准提案。它提出了一个颠覆性的问题:如果 AI Agent 也是你的用户,你的网站准备好了吗?
想象一下这个场景:你让 AI 助手"帮我买张周五晚上的电影票",以前它要像个视障人士一样摸索网页——截屏看图、猜测按钮位置、尝试点击、验证结果。而 WebMCP 的目标是让网站主动告诉 AI:"我这儿有个 buyTicket() 方法,你直接调用就行"。
这不是科幻,这是浏览器正在发生的变化。
故事要从 2025 年初说起。亚马逊后端工程师 Alex Nahas 遇到了一个让人头疼的问题。
亚马逊内部有数千个微服务,每个服务都有自己的认证体系:
当时 Anthropic 刚推出 MCP 协议(Model Context Protocol),理论上可以把这些服务打包成 AI Agent 的工具。但现实很骨感:
问题1:上下文窗口爆炸
┌─────────────────────────────────┐
│ MCP 服务器 │
│ ├─ 工具1 (500 tokens) │
│ ├─ 工具2 (500 tokens) │
│ ├─ 工具3 (500 tokens) │
│ └─ ... x 数千个 │
│ 结果:context 直接塞满! │
└─────────────────────────────────┘
解决方案? 在连接字符串里手动禁用工具——这简直是在用命令行参数做配置管理,太原始了。
问题2:认证地狱
┌─────────────────────────────────┐
│ MCP 要求: OAuth 2.1 │
│ 亚马逊现实: │
│ ├─ 服务A: 自研 SSO │
│ ├─ 服务B: SAML │
│ ├─ 服务C: API Key │
│ └─ 每个都要单独适配! │
└─────────────────────────────────┘
Alex 注意到一个关键事实:亚马逊所有的授权管理都在浏览器里完成。
员工访问内部服务时,浏览器里已经有了:
既然浏览器已经解决了认证问题,为什么不直接在浏览器里运行 MCP?
他做了一个原型:
postMessage API 构建传输层这就是 MCP-B(Model Context Protocol for the Browser)的诞生——WebMCP 的前身。
2025 年,三件事几乎同时发生:
时间线
┌──────────────────────────────────────────┐
│ 2025 年初 │
│ └─ Alex 在亚马逊内部开发 MCP-B │
│ │
│ 2025 年中 │
│ ├─ Google Chrome 团队原型 "Script Tools" │
│ └─ Microsoft Edge 团队探索类似方向 │
│ │
│ 2025.08.13 │
│ └─ 三方在 W3C 汇合,联合提案发布 │
│ │
│ 2025.09.25 │
│ └─ WebMCP 成为 W3C 社区组交付物 │
│ │
│ 2026.02.10 │
│ └─ Chrome 146 发布早期预览版 │
└──────────────────────────────────────────┘
但这里有个重要细节:Apple/Safari 和 Mozilla/Firefox 没有参与。
这意味着什么?WebMCP 目前是 Chromium 阵营的标准,就像当年的 WebUSB、Web Bluetooth 一样。如果苹果和火狐不跟进,它可能永远只是 Chrome/Edge 的特性,而非真正的 Web 标准。
这也是为什么我说"可能会改变"而不是"一定会改变"。
WebMCP 的巧妙之处在于,它提供了两套 API,满足不同开发者的需求。
核心思路:HTML 表单属性就能定义工具。
举个例子,你的网站有个待办事项表单:
<!-- 传统表单:只给人类用户 -->
<form action="/add-todo" method="POST">
<input name="task" type="text" required>
<input name="priority" type="number" min="1" max="5">
<button type="submit">添加</button>
</form>
现在加三行属性,AI Agent 就能直接调用:
<!-- WebMCP 增强表单:人类和 AI 都能用 -->
<form
action="/add-todo"
method="POST"
toolname="add-todo"
tooldescription="添加一个待办事项到列表"
toolscope="user">
<input name="task" type="text" required>
<input name="priority" type="number" min="1" max="5">
<button type="submit">添加</button>
</form>
浏览器自动从表单字段生成工具的参数 Schema:
{
"name": "add-todo",
"description": "添加一个待办事项到列表",
"inputSchema": {
"type": "object",
"properties": {
"task": { "type": "string" },
"priority": { "type": "number", "minimum": 1, "maximum": 5 }
},
"required": ["task"]
}
}
这就像把"菜单"写在门口,AI 看一眼就知道能点什么菜,不用进店瞎猜。
对于复杂的动态功能,可以用 JavaScript 注册工具:
// 在页面 JavaScript 中注册工具
navigator.modelContext.registerTool({
name: "add-to-cart",
description: "添加商品到购物车",
inputSchema: {
type: "object",
properties: {
productId: { type: "string", description: "商品ID" },
quantity: { type: "number", minimum: 1 }
},
required: ["productId"]
},
async execute({ productId, quantity }) {
// 调用你的业务逻辑
const result = await addToCart(productId, quantity);
// 返回结果给 AI
return {
content: [{
type: "text",
text: `成功添加 ${quantity} 件商品到购物车!`
}]
};
}
});
工作流程:
用户 → AI Agent → WebMCP
↓ ↓ ↓
"帮我加购" → 调用工具 → execute() → 返回结果 → 告知用户
WebMCP 还提供了几个实用 API:
1. 判断是谁提交的表单
form.addEventListener('submit', (event) => {
if (event.agentInvoked) {
console.log('AI Agent 提交的');
// 可能需要跳过某些 UI 反馈
} else {
console.log('人类用户提交的');
// 显示加载动画等
}
});
2. CSS 伪类:给 AI 操作时显示不同样式
/* AI 操作时隐藏某些 UI 元素 */
.loading-spinner:tool-form-active {
display: none;
}
/* AI 提交时高亮表单 */
form:tool-submit-active {
border: 2px solid #4CAF50;
}
很多人看到"MCP"三个字母就以为这是 Anthropic 的东西,但其实完全不是。
Alex 最初确实想把 Anthropic MCP 搬到浏览器,但 W3C 工作组在 2025 年 9 月 18 日明确拒绝了这个方案。原因很简单:MCP 是为后端服务设计的,浏览器环境有自己的约束。
维度 | Anthropic MCP | WebMCP |
|---|---|---|
协议基础 | JSON-RPC 2.0 | Web 原生 API(非 JSON-RPC) |
架构 | Client-Server(需要后端) | 纯客户端(网页即服务器) |
传输方式 | stdio / HTTP / SSE | postMessage / 浏览器消息 |
认证 | OAuth 2.1 | 复用浏览器 Cookie/Session |
运行环境 | Python/Node.js 后端 | 浏览器 JavaScript |
可用性 | 服务器常驻 | 用户访问页面时才可用 |
人类参与 | 可选 | 核心设计原则 |
用一个比喻解释:
一个成熟的 AI 应用很可能同时使用两者:
完整架构
┌──────────────────────────────────────┐
│ 用户:"帮我订周五晚上的电影票" │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ AI Agent │
│ ├─ 后端操作 → 用 Anthropic MCP │
│ │ └─ 查询用户会员信息 │
│ │ └─ 查询优惠券 │
│ └─ 前端操作 → 用 WebMCP │
│ └─ 打开电影票网站 │
│ └─ 调用 selectSeat() 工具 │
│ └─ 调用 checkout() 工具 │
└──────────────────────────────────────┘
在 WebMCP 出现之前,AI Agent 操作网页只有两种方式——都很笨拙。
代表工具:Anthropic Computer Use、OpenAI Operator
工作原理:
流程
┌────────────────────────────────────┐
│ 1. 截取网页屏幕 │
│ └─ 消耗 ~2000 tokens/张 │
│ 2. GPT-4V 分析图片 │
│ └─ "这个按钮在左上角" │
│ 3. 尝试点击坐标 │
│ 4. 再截屏验证是否成功 │
│ └─ 又是 ~2000 tokens │
└────────────────────────────────────┘
问题:
比喻:就像蒙着眼睛玩电脑,全靠摸。
代表工具:Browser Use、Playwright MCP
工作原理:
流程
┌────────────────────────────────────┐
│ 1. 解析 DOM 树或无障碍树 │
│ 2. AI 分析元素语义 │
│ └─ "有个 button,文本是'购买'" │
│ 3. 通过选择器定位 │
│ └─ document.querySelector(...) │
│ 4. 模拟点击 │
└────────────────────────────────────┘
问题:
比喻:像在黑暗中摸索开关,需要猜测每个按钮的用途。
工作原理:
流程
┌────────────────────────────────────┐
│ 1. 网站声明可用工具 │
│ └─ navigator.modelContext │
│ 2. AI 直接查看工具列表 │
│ └─ "有个 buyTicket() 方法" │
│ 3. 确定性调用 │
│ └─ 不需要猜测,直接执行 │
└────────────────────────────────────┘
优势:
**比喻:**网站主动给了一份"功能清单",AI 照着菜单点菜。
方式 | 单次操作 Token | 典型流程 Token |
|---|---|---|
视觉(截屏) | ~2000 | ~8000(4次截屏) |
语义(DOM) | ~500 | ~2000(4次解析) |
WebMCP | ~50 | ~200(4次调用) |
节省高达 97.5% 的 Token 消耗!
它需要网站主动适配。
Computer Use 和 Browser Use 可以操作任意网页,哪怕网站完全不知道 AI 的存在。而 WebMCP 只能操作"支持 WebMCP"的网站。
这就像:
所以现实情况是:
这是个容易混淆的地方,因为"WebMCP"这个名字指代了三个不同的东西:
navigator.modelContext API**注意:**规范文本非常骨架化,很多细节还在 proposal.md 和 Chrome 实现中。
架构:
┌───────────────────────────────────────┐
│ 网页 │
│ └─ 引入 @mcp-b/global │
│ └─ 实现 navigator.modelContext │
└───────────────────────────────────────┘
↓ postMessage
┌───────────────────────────────────────┐
│ MCP-B Chrome 扩展 │
│ └─ 处理工具调用 │
└───────────────────────────────────────┘
↓ Native Messaging
┌───────────────────────────────────────┐
│ MCP-B Native Server(端口 12306) │
│ └─ 连接 Claude Desktop、Cursor 等 │
└───────────────────────────────────────┘
重要提示:MCP-B 扩展本身已不再开源,代码库仅供历史参考。
架构:
┌───────────────────────────────────────┐
│ 网页 │
│ └─ 引入 @jason.today/webmcp │
└───────────────────────────────────────┘
↓ WebSocket
┌───────────────────────────────────────┐
│ MCP 客户端(Claude Desktop 等) │
└───────────────────────────────────────┘
**Jason 的建议:**开发者应关注 W3C 标准化进程,他的库只是过渡方案。
**Chrome Web Store:**搜索"Web MCP" **功能:**一键启动浏览器 MCP 服务
**注意:**这是独立开发者的项目,与上述几个都不同。
用途 | 推荐方案 |
|---|---|
学习研究 | W3C 标准规范 |
当前开发 | MCP-B Polyfill |
快速测试 | webmcp.dev |
生产环境 | 等 Chrome 正式支持 |
WebMCP 引入了新的攻击面,安全设计仍在完善中。
1. 继承 Web 安全模型
安全边界
┌─────────────────────────────────────┐
│ 网站 A(taobao.com) │
│ └─ 工具只能操作 taobao.com │
│ ├─ 同源策略 │
│ ├─ CSP 保护 │
│ └─ HTTPS 要求 │
└─────────────────────────────────────┘
不能跨域访问
┌─────────────────────────────────────┐
│ 网站 B(jd.com) │
│ └─ WebMCP 工具不可见 │
└─────────────────────────────────────┘
2. 用户确认流程(Elicitation)
工作流
┌────────────────────────────────────┐
│ AI 想调用敏感工具(如:支付) │
│ ↓ │
│ 浏览器弹窗确认 │
│ "允许 AI 在 taobao.com 执行支付?" │
│ ↓ │
│ 用户点击"允许" → 执行 │
│ 用户点击"拒绝" → 取消 │
└────────────────────────────────────┘
3. 域信任 TTL
// 用户允许后,一段时间内不再询问
navigator.modelContext.setTrustDuration('taobao.com', 3600); // 1小时
场景:
用户同时打开了两个标签页
┌─────────────────────────────────────┐
│ 标签页1:中国银行 │
│ └─ 账户余额:500,000 元 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 标签页2:恶意网站 │
│ └─ 诱导 AI:"帮我查查银行余额" │
└─────────────────────────────────────┘
如果 Agent 同时看到两个标签页的上下文...
可能被操纵泄露数据!
当前缓解措施:
但风险并未完全消除。
2026 年 2 月 9 日,W3C 成员 Tom Jones 在 blink-dev 邮件列表直言:
"基于 explainer 文档来看,没有进行过安全审查……我认为这对任何启用此功能的浏览器用户来说都将是隐私噩梦。"
Google 方面回应:
**建议:**生产环境使用前,等待安全模型成熟。
36Kr:"终于,AI 不用再假装是人了"
53AI:"WebMCP:Google 刚对 Chrome 动了手术,AI Agent 的玩法全过时了"
**搜狐新闻:**强调 89% 的 Token 节省
安全内参:
慢雾科技:
火山引擎(字节):
V2EX 讨论:
"WebMCP 就像是给网站装了个'API 说明书',以前 AI 要像盲人一样摸,现在直接看菜单点菜。"
"这是 Agent 时代的 SEO——以前要优化给 Google 爬虫看,现在还要优化给 AI Agent 调用。"
传统方式:
用户:"帮我找双耐克跑鞋,41码"
↓
AI 截屏分析淘宝页面
↓
尝试输入搜索框(可能输错)
↓
截屏查看结果
↓
尝试点击筛选器(可能点错)
↓
...重复多次
WebMCP 方式:
// 淘宝注册工具
navigator.modelContext.registerTool({
name: "product-search",
description: "搜索商品",
inputSchema: {
type: "object",
properties: {
keyword: { type: "string" },
size: { type: "string" },
brand: { type: "string" }
}
},
execute({ keyword, size, brand }) {
const results = searchProducts({ keyword, size, brand });
return { content: [{ type: "text", text: JSON.stringify(results) }] };
}
});
用户体验:
**痛点:**公司有自研 OA,没有 API 文档,AI 无法操作。
WebMCP 解决方案:
<!-- 请假申请表单 -->
<form
toolname="submit-leave"
tooldescription="提交请假申请"
action="/api/leave"
method="POST">
<input name="startDate" type="date" required>
<input name="endDate" type="date" required>
<select name="reason">
<option value="sick">病假</option>
<option value="annual">年假</option>
</select>
<button type="submit">提交</button>
</form>
员工可以:
"帮我请 3 月 15 号到 17 号的年假"
AI 直接调用 submit-leave 工具,无需截屏猜测。
功能:AI 助教帮学生提交作业、查看成绩。
// 作业提交工具
navigator.modelContext.registerTool({
name: "submit-homework",
description: "提交作业",
inputSchema: {
type: "object",
properties: {
courseId: { type: "string" },
homeworkId: { type: "string" },
content: { type: "string" }
}
},
async execute({ courseId, homeworkId, content }) {
await submitHomework(courseId, homeworkId, content);
return {
content: [{
type: "text",
text: "作业已提交!老师会在 48 小时内批改。"
}]
};
}
});
// 成绩查询工具
navigator.modelContext.registerTool({
name: "get-grades",
description: "查询成绩",
inputSchema: {
type: "object",
properties: {
courseId: { type: "string" }
}
},
async execute({ courseId }) {
const grades = await getGrades(courseId);
return {
content: [{
type: "text",
text: `你的成绩:${JSON.stringify(grades)}`
}]
};
}
});
步骤:
# 1. 下载 Chrome Canary
https://www.google.com/chrome/canary/
# 2. 启动时添加 flag
chrome.exe --enable-features=WebMCP
# 3. 在网页中测试
console.log(navigator.modelContext); // 应该有值
适合:想要体验最新规范的开发者。
步骤:
# 安装 npm 包
npm install @mcp-b/global @mcp-b/transports
# 在网页中引入
import '@mcp-b/global';
import { TabTransport } from '@mcp-b/transports';
# 注册工具
navigator.modelContext.registerTool({ ... });
适合:想在当前浏览器中使用的开发者。
步骤:
# 安装
npm install @jason.today/webmcp
# 启动 WebSocket 服务
npx webmcp-server
# 在网页中使用
import { registerTool } from '@jason.today/webmcp';
registerTool({ ... });
适合:想快速验证想法的开发者。
浏览器如何从 HTML 表单生成工具?
工作流
┌──────────────────────────────────────┐
│ 1. 浏览器解析 HTML │
│ └─ 发现 toolname 属性 │
│ │
│ 2. 分析表单字段 │
│ ├─ <input name="task"type="text"> │
│ │ → { task: { type: "string" } } │
│ ├─ <input name="priority" min="1"> │
│ │ → { priority: { min: 1 } } │
│ └─ required → "required": [...] │
│ │
│ 3. 生成 JSON Schema │
│ └─ 自动推断类型和验证规则 │
│ │
│ 4. 注册到 modelContext │
│ └─ 工具可被 AI 发现和调用 │
└──────────────────────────────────────┘
流程图:
HTML 表单
↓
浏览器解析引擎
↓
Schema 生成器
↓
navigator.modelContext.tools
↓
AI Agent 可见
AI 调用工具时发生了什么?
完整流程
┌──────────────────────────────────────┐
│ 用户:"帮我添加一个待办事项" │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ AI Agent 分析意图 │
│ └─ 需要调用 "add-todo" 工具 │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ 检查工具是否需要用户确认 │
│ └─ 如果是敏感操作 → 弹窗询问 │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ 调用 execute() 回调函数 │
│ └─ 传入参数:{ task: "买菜" } │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ 执行网站业务逻辑 │
│ └─ addTodo({ task: "买菜" }) │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ 返回结果给 AI │
│ └─ { content: [{ text: "已添加" }] } │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ AI 回复用户 │
│ └─ "好的,已经帮你添加'买菜'到列表" │
└──────────────────────────────────────┘
工具调用失败怎么办?
navigator.modelContext.registerTool({
name: "payment",
async execute({ amount }) {
try {
const result = await processPayment(amount);
return {
content: [{
type: "text",
text: `支付成功!订单号:${result.orderId}`
}]
};
} catch (error) {
// 返回错误信息给 AI
return {
content: [{
type: "text",
text: `支付失败:${error.message}`,
}],
isError: true
};
}
}
});
AI 会看到错误信息,并可以:
Alex Nahas 的预测:2026 年中后期将有"官方浏览器公告"。
这意味着:
但前提是:安全审查通过,跨浏览器共识达成。
类比 Schema.org 的历史:
2011 年:Schema.org 发布
↓
网站开始添加结构化标记
↓
Google 用于生成富摘要
↓
2025 年:大多数网站都有 Schema.org
WebMCP 可能的路径:
2026 年:WebMCP 发布
↓
头部网站开始适配
↓
AI Agent 优先使用支持 WebMCP 的网站
↓
2028 年:WebMCP 成为标配?
新的优化方向:
就像以前优化"title 标签"给 Google 看,未来要优化"toolname 属性"给 AI 看。
如果 Safari 和 Firefox 不跟进会怎样?
历史教训:
特性 | Chrome | Safari/Firefox | 结果 |
|---|---|---|---|
WebUSB | ✅ | ❌ | Chrome 独有 |
Web Bluetooth | ✅ | ❌ | Chrome 独有 |
WebRTC | ✅ | ✅(后来) | 成为标准 |
Push API | ✅ | ✅ | 成为标准 |
可能的结果:
开发者策略:
1. 学习阶段(适合所有人)
# 看规范
https://webmachinelearning.github.io/webmcp
# 试用 Polyfill
npm install @mcp-b/global
# 搭建 Demo
创建一个简单的表单,添加 toolname 属性
2. 观望阶段(适合大多数人)
3. 实验阶段(适合头部企业)
不建议:
高优先级:
原因:
低优先级:
原因:
1. 效率革命
"AI 从'模拟人类'到'直接调用 API',这是质的飞跃。"
2. 开发者控制
"网站可以精确定义 AI 能做什么,不能做什么,比视觉方式更安全。"
3. 用户体验
"不再需要看着 AI 像个新手一样笨拙地操作页面。"
1. 隐私风险
"浏览器里同时有银行和购物网站,AI 会不会泄露数据?"
2. 生态割裂
"如果只有 Chrome 支持,Web 会分裂成两个平台。"
3. 开发负担
"网站要维护两套接口:一套给人,一套给 AI,工作量翻倍?"
4. 用户依赖
"用户会不会过度依赖 AI,失去操作网页的能力?"
WebMCP 是一个有前景但不成熟的技术。
优势明确:
风险存在:
建议态度:
就像 2015 年的 Service Worker,有潜力但需要时间验证。
WebMCP 提出了一个根本性的问题:网站应该如何与 AI 交互?
过去的答案:不需要,AI 自己想办法。 WebMCP 的答案:网站主动提供结构化接口。
这不是技术细节的变化,而是设计理念的转变:
Web 1.0: 网站 → 人类用户
Web 2.0: 网站 ↔ 人类用户(交互)
Web 3.0(?): 网站 → 人类用户 + AI Agent
核心价值:
当前挑战:
三个时间节点:
给开发者的行动建议:
最后一句话:
Web 开发的下一个十年,可能不仅仅是"为人类设计",而是"为人类和 AI 设计"。
WebMCP 是这个方向的第一步,但绝不是最后一步。
想了解更多关于 AI Agent、Web 技术和前端发展的深度内容?
👉 关注《前端达人》
我会持续分享:
你的每一个点赞、分享,都是对原创技术内容最大的支持!
如果这篇文章对你有帮助,欢迎:
咱们评论区见! 🚀