真正的问题不是画图,而是本地 Agent 怎么触达浏览器

先看一个具体的 demo。基于 Excalidraw 搭建了一个在线白板,人可以在页面里拖动、编辑、选中元素;AI 也可以在同一块画布里读取内容、添加节点、连线、调整布局。关键区别在于:这不是 AI 吐出一张静态图片,而是人和 AI 在同一个浏览器会话里协作编辑。

一旦做到这一步,问题自然就转变了——从"怎么画图"变成"本地 Agent 怎么调用浏览器页面里的能力"。

WebMCP:浏览器侧的 MCP

如果你了解 MCP(Model Context Protocol),知道它解决的是"如何给模型暴露工具",那 WebMCP 就是这件事在浏览器端的延伸。

核心接口是 navigator.modelContext。一个网站如果支持 WebMCP,就可以通过这个接口直接向 AI 暴露自己的能力。AI 不需要去分析页面 DOM 布局、模拟鼠标点击,而是直接调用页面声明好的结构化接口。

但这里有个微妙的地方值得注意:WebMCP 官方目前的设计方向,更偏向于"让浏览器内的 Agent 去调用网页能力"——比如浏览器内建的 AI、浏览器扩展等。它并没有天然解决另一个场景:我本地跑着的 Claude Code 或 Codex,怎么用上浏览器里暴露出来的这些能力?

中间差了一层桥。

webmcp-bridge:把调用路径桥接回本地

webmcp-bridge 做的事情很直接——把本地 Agent 和浏览器里的 WebMCP 能力连起来。

它的调用路径是:

local-mcp -> Playwright -> browser navigator.modelContext

拆开来看:

  • 本地 Agent 调用一个标准的 stdio MCP server(即 local-mcp
  • local-mcp 通过 Playwright 驱动浏览器页面
  • 如果页面支持原生 WebMCP,直接调用 navigator.modelContext
  • 如果页面还没支持 WebMCP,走 shim/adapter 做兜底

这里有一个设计原则值得关注:native-first, shim fallback。也就是说,网站已经支持 WebMCP 就走原生路径,还没支持就补一层适配器。这样做的好处是什么?等 WebMCP 真正普及之后,bridge 不会变成历史包袱;而在当下,它又能让大量还没支持 WebMCP 的网站先接入。

用 uxc 统一调用

在实际使用中,uxc 扮演的是统一调用层的角色。它把浏览器桥接路径固化成稳定的命令,本地 Agent 不需要记一长串启动参数,也不需要把一堆 MCP 配置塞进上下文。

具体来说,可以创建两个 link:一个负责 headless 调用(board-webmcp-cli),另一个把同一个会话打开给人看(board-webmcp-ui)。这一步也可以交给 skill 自动完成。

之后的协作模式就很清晰了:人打开浏览器看着画布,AI 在同一个会话里增删节点、加边、调布局。这和"AI 生成一张图然后扔给你"完全是两回事——它更接近 Google Docs 那种多人协作编辑的体验。

这条路如果走通,意味着什么

这个项目真正想验证的,不只是 AI 能不能操作网页。更深层的问题是:WebMCP 能不能成为浏览器应用和本地 AI 之间一层自然的接口?

如果这条路成立,意味着:

  • 网站在浏览器里声明自己的能力
  • 本地 Agent 通过标准 MCP 协议调用
  • 原生支持优先,适配器兜底
  • 人和 AI 在同一个网页会话里实时协作

现在很多场景下,要让 AI 操作网页,还得靠脚本模拟点击、接口逆向工程、手动搬运状态。如果 WebMCP 这个标准能铺开,这些脏活累活都会大幅简化。

对于独立开发者来说,这里有一个值得思考的方向:你正在开发的 Web 应用,是不是也可以通过 navigator.modelContext 暴露能力,让用户的本地 AI 直接调用?当"AI 可操作性"变成网页的标配属性时,最先支持它的产品,会不会获得一种新的竞争优势?