为AI Agent设计的上网方式-WebMCP介绍与实际使用案例
WebMCP 是什么?
WebMCP(Web Model Context Protocol) 是一个提议的浏览器级 Web 标准,让任何网页都能将其功能声明为 AI Agent 可调用的结构化工具。
可以这样理解:WebMCP 将你的网站变成 AI Agent 可以使用的 API——而无需你构建或维护单独的 API。
没有 WebMCP: AI Agent 爬取你的页面,猜测哪些输入字段需要什么数据,希望表单接受它的输入,然后祈祷一切顺利。
有了 WebMCP: 你的网站说「我这里有一个叫
searchFlights的函数。它需要出发地、目的地和日期。调用它,我会给你结构化的结果。」Agent 调用这个函数。获取数据。继续执行。
背后的支持很强大:这是 Google Chrome 团队和 Microsoft Edge 团队的联合努力,通过 W3C 孵化。预计到 2026 年中后期将获得更广泛的浏览器支持。
为什么需要 WebMCP
AI Agent 正在成为主要的 Web 用户
2026 年 1 月,Google 推出了由 Gemini 驱动的 Chrome 自动浏览功能。OpenAI 的 Atlas 浏览器推出了 Agent 模式。Perplexity 的 Comet 正在跨平台进行全任务浏览。
| 产品 | 公司 | 发布时间 | 核心能力 |
|---|---|---|---|
| Chrome Auto Browse |
|
2026 年 1 月 |
由 Gemini 驱动的自主浏览 |
| Atlas(Agent Mode) |
OpenAI |
2025 年 10 月 |
多步骤任务执行 |
| Comet |
Perplexity |
2025 年 7 月 |
搜索优先的 Agent 浏览 |
| Disco |
Google Labs |
2025 年 12 月 |
从标签页生成自定义应用 |
那些让这些 Agent 能够轻松完成任务的网站将获得更多流量。那些做不到的网站将被跳过,转向竞争对手。
这是 AI 时代的响应式设计时刻
当移动时代到来时,那些早期采用响应式设计的网站赢得了分发游戏。后来者只能追赶,而流量已经转移。
WebMCP 是同样的动态。那些首先成为 Agent 就绪的网站,随着 Agent 电商成为主流,将获得复合优势。
一次结构化调用替代数十步操作
没有 WebMCP,AI Agent 需要截图、解析 HTML、猜测按钮功能、点击筛选器、滚动结果——每一步都在消耗 token 并增加延迟。
有了 WebMCP,只需三步:发现工具 → 读取 schema → 执行一次调用。
WebMCP 如何设置
WebMCP 为开发者提供了两种让网站为 Agent 准备就绪的方法:Declarative API(声明式 API) 和 Imperative API(命令式 API)。
Declarative API(基于 HTML)
这是低投入选项。如果你的网站已经有标准 HTML 表单,你可以通过添加几个属性让它们与 Agent 兼容。
餐厅预订表单会获得 toolname 和 tooldescription 属性。浏览器会自动将其字段转换为 AI Agent 可以解释的结构化 schema。
<form toolname="reserveRestaurant"
tooldescription="预订餐厅座位。需要日期、时间、人数和联系人信息。">
<label>
日期: <input type="date" name="date" required />
</label>
<label>
时间: <input type="time" name="time" required />
</label>
<label>
人数: <input type="number" name="partySize" required min="1" />
</label>
<label>
姓名: <input type="text" name="name" required />
</label>
<button type="submit">预订</button>
</form>
Imperative API(基于 JavaScript)
这是用于更复杂、动态交互的 API。
开发者通过一个新的浏览器接口 navigator.modelContext 以编程方式注册工具。你为工具提供名称、描述、输入 schema 和执行函数。
// 注册一个动态工具
navigator.modelContext.addTool({
name: 'addToCart',
description: '将商品添加到购物车',
inputSchema: {
type: 'object',
properties: {
productId: {
type: 'string',
description: '商品 ID'
},
quantity: {
type: 'number',
description: '添加数量',
default: 1
}
},
required: ['productId']
},
execute: async (input) => {
// 执行添加到购物车的逻辑
const result = await cartAPI.addItem(input.productId, input.quantity);
return {
success: true,
cartTotal: result.total,
itemCount: result.count
};
}
});
// 可以根据页面状态动态注销工具
// 当购物车为空时,移除结账工具
if (cart.isEmpty()) {
navigator.modelContext.removeTool('checkout');
}
特别强大的地方:工具可以根据页面状态注册和注销。只有当购物车中有商品时,结账工具才会出现。只有在选择日期后,预订工具才会显示。Agent 只能看到与当前上下文相关的内容。
如何测试 WebMCP
WebMCP 在 Chrome 146 中通过功能标志已经可用。以下是亲身体验的方法:
步骤 1: 确保你运行的是 Chrome 版本 146.0.7672.0 或更高版本。
步骤 2: 导航到 chrome://flags/#enable-webmcp-testing 并将标志设置为「Enabled」。
步骤 3: 重新启动 Chrome。
步骤 4: 从 Chrome 网上应用店安装 Model Context Tool Inspector 扩展程序。它允许你检查任何页面上注册的工具并使用自定义参数测试它们。
真实案例
官方测试地址
Google 还发布了一个在线旅行演示,你可以在其中看到完整的流程——从发现工具到使用自然语言调用它们。
一个简单的 Todo 页面,使用 WebMCP 完成 Todo 增删改查
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebMCP Todo Demo</title>
<style>
body {
font-family: system-ui, -apple-system, sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
}
.todo-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px;
border-bottom: 1px solid #eee;
}
.todo-item.completed span {
text-decoration: line-through;
color: #888;
}
form {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
input[type="text"] {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
padding: 10px 20px;
background: #007AFF;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background: #0051D5;
}
.delete-btn {
background: #FF3B30;
padding: 5px 10px;
font-size: 12px;
}
.delete-btn:hover {
background: #C8261C;
}
.status {
padding: 10px;
background: #f0f0f0;
border-radius: 4px;
margin-top: 20px;
}
</style>
</head>
<body>
<h1>📝 Todo 列表 - WebMCP 测试</h1>
<!-- 手动添加 Todo 的表单 -->
<form id="addTodoForm">
<input
type="text"
name="text"
placeholder="输入新任务..."
required
autocomplete="off">
<button type="submit">添加</button>
</form>
<div id="todoList"></div>
<div class="status" id="status">
当前共有 <strong id="count">0</strong> 个待办事项
</div>
<script>
// Todo 数据存储
let todos = [
{ id: 1, text: '学习 WebMCP 基础知识', completed: true },
{ id: 2, text: '实现 Declarative API 表单', completed: true },
{ id: 3, text: '实现 Imperative API 工具', completed: false },
];
// 渲染 Todo 列表
function renderTodos() {
const list = document.getElementById('todoList');
const count = document.getElementById('count');
list.innerHTML = '';
count.textContent = todos.filter(t => !t.completed).length;
todos.forEach(todo => {
const item = document.createElement('div');
item.className = `todo-item${todo.completed ? ' completed' : ''}`;
item.innerHTML = `
<input type="checkbox" ${todo.completed ? 'checked' : ''} onchange="toggleTodo(${todo.id})">
<span>${escapeHtml(todo.text)}</span>
<button class="delete-btn" onclick="deleteTodo(${todo.id})">删除</button>
`;
list.appendChild(item);
});
}
// 添加 Todo(手动表单提交)
document.getElementById('addTodoForm').addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const text = formData.get('text');
if (text.trim()) {
todos.push({
id: Date.now(),
text: text.trim(),
completed: false
});
e.target.reset();
renderTodos();
}
});
// 切换完成状态
function toggleTodo(id) {
todos = todos.map(t =>
t.id === id ? { ...t, completed: !t.completed } : t
);
renderTodos();
}
// 删除 Todo
function deleteTodo(id) {
todos = todos.filter(t => t.id !== id);
renderTodos();
}
// HTML 转义
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// ===== WebMCP Imperative API =====
// 初始化 WebMCP 工具
async function initWebMCP() {
// 检查 API 是否可用
if (typeof navigator.modelContext === 'undefined') {
console.error('WebMCP 不可用,请确保:1. 使用 Chrome 146+ 2. 在 chrome://flags/#enable-webmcp-testing 启用 3. 重启浏览器');
return;
}
try {
// 1. 注册"添加 Todo"工具
await navigator.modelContext.registerTool({
name: 'addTodo',
description: '添加一个新的待办事项到列表中。提供待办事项的文本内容,系统会自动创建并返回新创建的待办事项信息。',
inputSchema: {
type: 'object',
title: '添加待办事项参数',
description: '添加待办事项所需的参数',
properties: {
text: {
type: 'string',
title: '待办事项内容',
description: '要添加的待办事项的文本描述,例如:购买牛奶、完成项目报告等',
minLength: 1,
maxLength: 200
}
},
required: ['text']
},
execute: async (params) => {
const text = params?.text;
if (text && text.trim()) {
const newTodo = {
id: Date.now(),
text: text.trim(),
completed: false
};
todos.push(newTodo);
renderTodos();
return {
content: [{
type: 'text',
text: JSON.stringify({ success: true, message: `已添加 "${text.trim()}"`, todo: newTodo }, null, 2)
}]
};
}
return {
content: [{
type: 'text',
text: JSON.stringify({ success: false, message: '文本内容不能为空' }, null, 2)
}]
};
}
});
// 2. 注册"列出所有 Todo"工具
await navigator.modelContext.registerTool({
name: 'listTodos',
description: '获取所有待办事项列表,包括文本内容、完成状态和 ID。可以选择过滤条件来只查看未完成或已完成的待办事项。',
inputSchema: {
type: 'object',
title: '列表过滤参数',
description: '可选的过滤条件参数',
properties: {
filter: {
type: 'string',
title: '过滤类型',
description: '选择要显示的待办事项类型',
enum: ['all', 'active', 'completed'],
default: 'all'
}
}
},
execute: async (params) => {
const filter = params?.filter || 'all';
let filtered = todos;
if (filter === 'active') {
filtered = todos.filter(t => !t.completed);
} else if (filter === 'completed') {
filtered = todos.filter(t => t.completed);
}
const result = {
todos: filtered,
total: todos.length,
active: todos.filter(t => !t.completed).length,
completed: todos.filter(t => t.completed).length
};
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
// 3. 注册"删除 Todo"工具
await navigator.modelContext.registerTool({
name: 'deleteTodo',
description: '删除指定的待办事项。提供待办事项的 ID 即可永久删除该事项。',
inputSchema: {
type: 'object',
title: '删除待办事项参数',
description: '删除待办事项所需的参数',
properties: {
todoId: {
type: 'number',
title: '待办事项 ID',
description: '要删除的待办事项的唯一标识符(ID)。可以通过 listTodos 工具查看所有待办事项的 ID。'
}
},
required: ['todoId']
},
execute: async (params) => {
const todoId = params?.todoId;
const todo = todos.find(t => t.id === todoId);
if (todo) {
todos = todos.filter(t => t.id !== todoId);
renderTodos();
return {
content: [{
type: 'text',
text: JSON.stringify({ success: true, message: `已删除 "${todo.text}"`, deletedId: todoId }, null, 2)
}]
};
}
return {
content: [{
type: 'text',
text: JSON.stringify({ success: false, message: '未找到指定的待办事项' }, null, 2)
}]
};
}
});
// 4. 注册"切换完成状态"工具
await navigator.modelContext.registerTool({
name: 'toggleTodo',
description: '切换指定待办事项的完成状态。如果待办事项是未完成状态,则标记为已完成;如果已完成,则标记为未完成。',
inputSchema: {
type: 'object',
title: '切换状态参数',
description: '切换待办事项完成状态所需的参数',
properties: {
todoId: {
type: 'number',
title: '待办事项 ID',
description: '要切换状态的待办事项的唯一标识符(ID)。可以通过 listTodos 工具查看所有待办事项的 ID。'
}
},
required: ['todoId']
},
execute: async (params) => {
const todoId = params?.todoId;
const todo = todos.find(t => t.id === todoId);
if (todo) {
todo.completed = !todo.completed;
renderTodos();
return {
content: [{
type: 'text',
text: JSON.stringify({ success: true, message: `"${todo.text}" 已${todo.completed ? '完成' : '未完成'}`, todoId, completed: todo.completed }, null, 2)
}]
};
}
return {
content: [{
type: 'text',
text: JSON.stringify({ success: false, message: '未找到指定的待办事项' }, null, 2)
}]
};
}
});
// 5. 注册"清空已完成"工具
await navigator.modelContext.registerTool({
name: 'clearCompleted',
description: '删除所有已完成的待办事项',
inputSchema: {
type: 'object',
properties: {}
},
execute: async () => {
const deleted = todos.filter(t => t.completed).length;
todos = todos.filter(t => !t.completed);
renderTodos();
return {
content: [{
type: 'text',
text: JSON.stringify({ success: true, message: `已删除 ${deleted} 个已完成的待办事项`, deleted }, null, 2)
}]
};
}
});
} catch (error) {
console.error('❌ 注册 WebMCP 工具时出错:', error);
}
}
// 页面加载时初始化
document.addEventListener('DOMContentLoaded', () => {
renderTodos();
// 延迟初始化 WebMCP
setTimeout(() => {
initWebMCP();
}, 100);
});
</script>
</body>
</html>
测试内容:请帮我添加一个待办事项“计划下周的团队会议”,然后列出所有我未完成的任务。最后,清除所有已完成的待办事项。
User prompt: "请帮我添加一个待办事项“计划下周的团队会议”,然后列出所有我未完成的任务。最后,清除所有已完成的待办事项。"
AI calling tool "addTodo" with {"text":"计划下周的团队会议"}
Tool "addTodo" result: {"content":[{"type":"text","text":"{\n \"success\": true,\n \"message\": \"已添加 \\\"计划下周的团队会议\\\"\",\n \"todo\": {\n \"id\": 1773996522894,\n \"text\": \"计划下周的团队会议\",\n \"completed\": false\n }\n}"}]}
AI calling tool "listTodos" with {"filter":"active"}
Tool "listTodos" result: {"content":[{"type":"text","text":"{\n \"todos\": [\n {\n \"id\": 3,\n \"text\": \"实现 Imperative API 工具\",\n \"completed\": false\n },\n {\n \"id\": 1773996522894,\n \"text\": \"计划下周的团队会议\",\n \"completed\": false\n }\n ],\n \"total\": 4,\n \"active\": 2,\n \"completed\": 2\n}"}]}
AI calling tool "clearCompleted" with {}
Tool "clearCompleted" result: {"content":[{"type":"text","text":"{\n \"success\": true,\n \"message\": \"已删除 2 个已完成的待办事项\",\n \"deleted\": 2\n}"}]}
小结
Web 正在为两种类型的用户重建:人类和 AI Agent。
WebMCP 是一个严肃的尝试,为这些 Agent 提供了一种与网站交互的原生、结构化方式——没有屏幕抓取的脆弱性,也没有维护单独 API 的开销。
关键要点
-
1. 早期行动者优势:那些早期让自己对 Agent 来说可读的网站将获得复合优势
-
2. 基础仍然重要:干净的 HTML、语义化标记、结构化表单是 WebMCP 就绪的基础
-
3. 两种 API 互补:Declarative API 适合简单表单,Imperative API 适合复杂交互
-
4. 状态感知能力:工具可以根据页面状态动态注册/注销,这是 WebMCP 的强大之处
现在可以做什么
-
• 审计现有表单的结构和语义化程度
-
• 确保网站有干净、可预测的 HTML 结构
-
• 在测试环境中尝试 WebMCP API
-
• 与开发团队讨论 WebMCP 的潜在影响
参考资料:WebMCP What It Is, Why It Matters, and What to Do Now
更多推荐


所有评论(0)