网络的新语言:Google 的 Web MCP 如何让每个网站都为智能体做好准备

多年来,网络是为人类的眼睛而构建的。点击这里,滚动那里,填写这个表单。每一个设计决策——颜色、布局、交互元素——都是为坐在屏幕前的人优化的。

但有些事情正在发生变化。智能体正在进入网络,而大多数网站还没有为它们做好准备。


问题:智能体在“盲目浏览”

想象一下,你拥有一个电商网站,并希望 AI 智能体能够使用它——搜索商品、添加到购物车、完成购买。在一个数百万智能体代表用户浏览网页并执行操作的未来,你的网站是否对这些智能体友好,可能决定你的业务成败。

今天,你有两个选择,但都不理想。

第一个是构建你自己的 MCP 服务器,并希望所有智能体都恰好安装了它。这几乎不可能发生。没有任何一个网站重要到可以被预加载进每个智能体的工具集中,成为永久组件。

第二个选择是依赖智能体的浏览器操作能力——让它截图、解析原始 HTML,然后自己判断该点击什么。这种方式正在变好,但从根本上说它是“非确定性的”。智能体需要在为人类设计的大量 HTML 代码中摸索:导航栏、广告位、Cookie 提示、动态内容。信息噪声大、速度慢,而且容易失败。智能体可能错过按钮、误读字段,或者直接放弃。

在 AI 智能体成为网页内容主要使用者的时代,一个难以被智能体导航的网站,终将被抛在后面。


解决方案:嵌入页面内部的 MCP

Google 的答案是 Web MCP —— 一种将 MCP 工具直接嵌入网站的方法,使得任何使用兼容浏览器的智能体在浏览页面时,都能自动发现当前页面可用的操作。

核心理念非常优雅。与其让智能体反向解析页面 HTML 来猜测能做什么,不如让页面主动告诉它。当智能体访问你的电商首页时,它会看到:search_productsget_categoriesapply_filters。当它进入商品详情页时,会看到:add_to_cartget_similar_products。不需要翻译层。不需要猜测。只有干净、结构化、确定性的操作——根据页面上下文逐页加载。

这正是 Web MCP 真正令人兴奋的关键点:工具不会预加载到智能体的全局上下文中,而是在智能体浏览时“当场发现”。正确的工具出现在正确的页面,当不再相关时自动消失。


两种构建方式

Web MCP 支持两种实现方式,取决于你的网站构建方式。

声明式:适用于静态 HTML

对于简单的静态页面,方法非常直接。你只需要在现有的表单元素上添加一些 HTML 属性——tool-nametool-description,以及每个输入字段的 tool-param-description。仅此而已。

当使用支持 Web MCP 的浏览器的智能体访问页面时,它会自动看到一个完整的 MCP 工具,包括名称、描述和输入结构——全部来自你添加的属性。不需要服务器,不需要 API,不需要额外基础设施。

你甚至可以监听智能体的操作。当智能体填写表单时,会触发一个特殊的 agent.invoked 事件,你可以返回结构化反馈——确认成功、返回错误,或者触发自定义 UI 元素,例如在提交前显示“请确认”的提示框。智能体获得标准的工具响应;人类用户也可以在最终提交前进行确认。

命令式:适用于动态应用

对于 React 或 Next.js 应用,命令式方式提供完全的编程控制。新版 Chrome 浏览器暴露了两个新的 navigator 函数——navigator.registerToolnavigator.unregisterTool,允许你将 MCP 工具绑定到特定组件。

模式很清晰:定义工具结构(名称、描述、输入结构、输出结构、处理函数),在组件挂载时注册工具,在组件卸载时取消注册。结果是一个实时、具备上下文感知能力的工具注册表,会随着用户或智能体的导航自动更新。

在一个演示的看板应用中,效果立刻显现。让智能体“为三个人准备晚餐制定所有任务计划,并将每一列作为一个类别”,它会实时创建列并填充卡片,自主完成,零错误。每个操作都通过类型化的 MCP 工具调用完成。没有猜测。没有幻觉。


一种新的上下文智能模式

Web MCP 不只是浏览器功能。它代表了一种新的架构模式,介于两种各有明显限制的方法之间。

传统 MCP 功能强大,但成本高:所有工具结构一开始就加载到智能体的上下文窗口中,无论是否需要。对于拥有数十个工具的智能体来说,这种开销非常大。

“技能”方法更轻量——初始只加载标题和描述,需要时再获取完整细节——但它牺牲了 MCP 在工具调用中提供的严格类型安全性。

Web MCP 在两者之间找到了平衡。工具根据上下文加载,由智能体所在位置触发,而不是预先配置。智能体在需要时拥有完整的结构保证,不需要时则不占用上下文成本。

这种“上下文驱动”的 MCP 模式——在正确时刻呈现正确工具,由任务和上下文驱动而非静态配置——很可能是更广泛智能体生态系统的发展方向。


开始使用

今天想要试验 Web MCP,你需要:

  1. Chrome Beta(需要最新版本)
  2. chrome://flags 中启用 Web MCP flag
  3. 安装 Model Context Protocol Tool Inspector Chrome 扩展

之后,无论是为静态页面添加声明式 HTML 属性,还是在动态应用中调用 navigator.registerTool,都可以轻松设置并在本地测试。

网络最初是为人类而建。Web MCP 正在开始让它也能被智能体理解。

Read more

【前端地图】地图开发基础概念——地图服务类型(矢量图、卫星图、地形图)、WGS84 / GCJ-02 / BD09 坐标系、地图 SDK 简介

【前端地图】地图开发基础概念——地图服务类型(矢量图、卫星图、地形图)、WGS84 / GCJ-02 / BD09 坐标系、地图 SDK 简介

🌍第1节 | 地图开发基础概念——地图服务类型(矢量图、卫星图、地形图)、WGS84 / GCJ-02 / BD09 坐标系、地图 SDK 简介 🎯 学习目标 老曹说:“别急着敲代码,先搞懂地图是个啥玩意儿!不然你画个圈都可能画歪。” 1. 🧠 理解地图服务的基本类型及其应用场景 2. 🔍 掌握 WGS84、GCJ-02、BD09 三大坐标系的区别与转换原理 3. 🛠️ 熟悉主流地图 SDK 的核心功能与适用场景 4. 🧩 构建对地图开发的整体认知框架 🧠 引言:地图不是纸,是数据! 你以为地图就是一张平面图?Too young too simple!现代前端地图开发本质上是对空间数据的可视化与交互处理。它融合了地理信息系统(GIS)、计算机图形学、前端工程化等多个领域的知识。 老曹吐槽时间: “有人问我为啥地图开发这么难?我说:因为你不仅要会前端,还得懂地球科学!

By Ne0inhk

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置) 如果你在本地运行大模型,比如用Ollama部署了Qwen、Llama或者DeepSeek,可能会发现一个尴尬的问题:模型的知识截止日期是固定的,它不知道今天股市涨跌,不清楚最新的科技新闻,甚至不知道明天是什么节日。这种“信息孤岛”的感觉,让本地大模型的实用性大打折扣。 我最初搭建OpenWebUI环境时,也遇到了这个痛点。看着模型一本正经地分析过时的数据,那种无力感让我开始寻找解决方案。市面上有不少联网搜索方案,但要么配置复杂,要么对国内网络环境不友好。经过几周的折腾和测试,我发现SearXNG这个开源元搜索引擎,配合OpenWebUI的联网搜索功能,是目前最稳定、最灵活的方案之一。 更重要的是,通过合理配置SearXNG,我们可以让本地大模型直接调用百度、360等国内搜索引擎,获取符合中文用户习惯的实时信息。这不仅仅是技术上的连接,更是让本地AI真正“接地气”的关键一步。下面我就把自己踩过的坑、验证过的配置,以及实际效果对比,毫无保留地分享给你。 1. 为什么需要SearXN

By Ne0inhk

【架构】前端 pnpm workspace详解

前端 pnpm workspace 架构详解 一篇帮你搞懂 pnpm workspace 的实战向教程,从「为啥要用」到「怎么配」全给你捋清楚;每个知识点都会讲清是什么、为什么、怎么用、注意啥,方便你系统学习、随时查阅、直接落地。 一、先聊聊:我们到底遇到了啥问题? 做前端久了,多包、monorepo、组件库联调这些事一多,就会踩到一堆具体又磨人的坑。下面把这些痛点拆开说:具体表现 → 典型场景 → 对你有啥影响。搞清楚这些,后面再看 pnpm workspace 解决啥就一目了然。 1.1 node_modules 膨胀,磁盘和时间都遭殃 具体表现:用 npm 搞 monorepo 时,根目录一个

By Ne0inhk

芋道项目部署:前端写死后端地址 vs Nginx 反向代理

两种方式的区别、风险与完整配置(小白也能照做) 很多同学第一次部署芋道(Ruoyi-Vue-Pro / 芋道源码)这种前后端分离项目,常见两种访问方式: 1. 前端直接请求后端域名(把 API 地址写死成 https://api.xxx.com) 2. 前端只请求自身域名,Nginx 反向代理转发到后端(前端写 /api,Nginx 转发到 127.0.0.1:48081) 这两种都能跑起来,但生产环境推荐的做法很明确: ✅ Nginx 反向代理(同域转发)更稳、更安全、更省心。 下面用 芋道项目为例,带你从 0 配置到可用,并解释常见坑(比如你遇到的:为什么页面里会看到 localhost)。 1. 两种方式是什么?(先把概念讲明白)

By Ne0inhk