关于 webmcp
webmcp 是一项指导将 WebMCP 工具集成到浏览器 Web 应用的技能,面向需要让 Agent 调用页面功能的开发者。它涵盖命令式与声明式注册、交互安全和验证流程,并要求在安全的浏览器窗口上下文中运行。
主要功能
- 01识别浏览器应用集成入口
- 02选择命令式或声明式 API
- 03注册并管理 WebMCP 工具
- 04处理取消、校验与错误
- 05保留用户确认和授权流程
- 06测试工具生命周期与调用
适用场景
- 01将现有 JavaScript 功能注册为工具
- 02把 HTML 表单流程开放给 Agent
- 03根据路由或页面状态管理工具
- 04排查工具注册与执行问题
MCP 相关
指导 WebMCP 的浏览器端工具注册和执行,使 Agent 能调用 Web 应用功能。它介绍命令式与声明式 API 的选择、工具描述和参数定义。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ webmaxru/ web-ai-agent-skills --skill webmcp安装后在 Claude Code 中输入/webmcp确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/model-context-registry.template.tsreferences/compatibility.mddeclarative-api.mdtroubleshooting.mdwebmcp-reference.mdscripts/find-webmcp-targets.mjs详细介绍
WebMCP
流程
步骤 1:识别浏览器集成界面
- 检查工作区,查找浏览器入口、UI 处理程序,以及现有应用状态或表单处理层。
- 如果可以使用 Node 运行时,执行
node scripts/find-webmcp-targets.mjs .,盘点可能的前端文件和现有 WebMCP 标记。 - 如果无法使用 Node 运行时,手动检查最近的
package.json、HTML 入口文件和框架引导文件,以确定浏览器应用的边界。 - 如果工作区包含多个前端应用,优先选择包含当前路由、组件或用户请求功能界面的应用。
- 如果盘点后仍有多个可能的前端目标,请停止并询问用户应将 WebMCP 集成到哪个应用中。
- 如果项目不是浏览器 Web 应用,请停止并说明此技能不适用。
步骤 2:选择 WebMCP 形式
- 编写代码前,阅读
references/webmcp-reference.md。 - 如果该功能可以通过 HTML 表单流程实现,或需要由 Agent 调用提交处理程序,请阅读
references/declarative-api.md。 - 如果涉及原生功能是否可用、Chrome 预览版设置,或草案与预览版行为,请阅读
references/compatibility.md。 - 如果注册、架构序列化或 Agent 驱动的表单执行失败,请阅读
references/troubleshooting.md。 - 确认集成在安全的窗口浏览上下文中运行。
- 如果该功能必须在服务端、工作线程中运行,或在没有可见浏览上下文的情况下以无头模式运行,请停止并说明平台限制。
- 如果工具包装现有 JavaScript 逻辑、需要动态注册,或必须处理执行取消,请选择命令式 API。
- 如果用户流程已经可以自然映射到表单提交,且页面能够让面向用户的表单与 Agent 活动保持同步,请选择声明式 API。
- 保持工具名称、描述和参数明确且积极,并优先选择原子化工具,避免使用功能重叠的变体。 步骤 3:实现工具注册
- 使用命令式 API 时,阅读
assets/model-context-registry.template.ts,并根据工作区中的框架、状态模型和文件布局进行调整。 - 使用特性检测模式
const modelContext = document.modelContext || navigator.modelContext;解析模型上下文,并在后续注册前检查其是否存在。优先使用document.modelContext(当前接口),仅将navigator.modelContext保留为 Chrome 146–149 旧版本的后备方案。 - 通过在
try/catch中等待modelContext.registerTool()来注册命令式工具,并使用稳定的name(由 1–128 个 ASCII 字母数字字符、_、-或.组成)、正向的description、对象类型的inputSchema和execute回调。在 Chrome 151+ 中,该调用会返回一个Promise<void>,并在工具可用于整个框架树时解析;使用await可确保同一代码也能在同步注册的旧版本中正常运行。 - 仅对不会修改状态的工具,将
annotations.readOnlyHint设为true。 - 在 Chrome
154.0.8017.0+ 中,对执行高风险、不可逆或影响现实世界的操作(例如预订旅行、转账、购物或删除数据)的工具,将annotations.consequentialHint设为true。这会提示 Agent 在执行前获取用户的明确确认。 - 在 Chrome
156.0.8067.0+ 中,仅对专门用于检查、诊断、测试框架或开发者工具(例如 Chrome DevTools AI 辅助功能)的工具,将annotations.debugging设为true。这样,通用 Agent 和面向终端用户的 Agent 就能识别并筛除面向开发者的工具。 - 如果工具输出可能包含来自不可信来源的数据,请将
annotations.untrustedContentHint设为true。 - 即使架构严格,也要在工具实现中验证业务规则,并返回有助于 Agent 更正输入后重试的明确错误。
- 仅在 UI 和应用状态反映了工具的效果后,才返回工具结果。
- 在 Chrome 153+ 中,接受始终存在的
{ signal }作为execute的第二个参数,并将其传递给fetch()等可取消的任务。请将此执行信号与注册信号分开处理。 - 如果工具的可用性取决于路由、选择项或页面状态,请仅在工具有效时注册,并通过中止传递给
registerTool()的信号所属的AbortController来注销过时工具;在 Chrome 148 过渡期间,也要在中止前通过可选链调用modelContext.unregisterTool?.()。 - 对于声明式工具,请在目标
<form>上添加toolname和tooldescription,并由表单控件定义参数范围。 - 使用标签或
toolparamdescription为声明式字段提供清晰的参数描述。 - 仅当页面应在 Agent 填写表单后自动提交时,才使用
toolautosubmit。 步骤 4:安全地接入 Agent 驱动的用户体验 - 即使页面支持 Agent 调用,也要保留常规的人类交互路径。
- 如果工具需要明确确认或面向用户的步骤,请通过应用的可见界面和现有授权检查处理;当前的
execute(input, { signal })契约不提供客户端回调。 - 自定义声明式提交处理时,请在调用
respondWith()前调用preventDefault(),并为 Agent 调用的提交返回结构化验证错误。 - 仅在具备兼容性意识的界面逻辑中使用
toolactivated、toolcancel、agentInvoked等仅供预览的事件以及 WebMCP 表单伪类。对于toolactivated和toolcancel,请阅读references/declarative-api.md,并先检测document.modelContext上的on*属性,再为较旧版本的构建回退到window。 - 即使
annotations.consequentialHint为true,破坏性或敏感操作仍须经过可见的用户确认和现有授权检查;该注解仅向 Agent 提供信息,不会强制执行应用安全措施。 - 保持界面状态同步,确保同一页面能准确反映由人工输入和工具调用导致的更改。
步骤 5:验证行为
- 测试注册和注销的生命周期,包括重复名称防护,以及路由或状态变化时的清理。
- 测试无效或不完整的输入,确认工具会返回纠正性错误,而不是悄然失败。
- 对于声明式工具,请验证生成的参数描述、必填字段、提交行为以及任何自定义
respondWith()处理。 - 如果目标环境是当前 Chrome 预览版,请先根据
references/compatibility.md确认所需版本和标志状态,再将运行时故障视为应用错误。 - 通过中止传递给
executeTool()的信号来测试执行取消,并验证长时间运行的工作会停止,而不依赖工具注销。 - 仅将 Model Context Tool Inspector 或同类预览工具用作验证辅助工具,不要将其作为运行时依赖。
- 首先通过检查已注册的工具集,并在有预览工具时使用有代表性的参数手动调用工具,来验证确定性执行。
- 确定性执行正确后,再验证自然语言路由,确保描述和参数结构能引导 Agent 使用正确的工具。
- 验证所有高风险、不可逆或涉及现实世界操作的工具都声明了
annotations.consequentialHint: true,并且仍会执行应用的确认和授权流程。 - 验证专用于检查、诊断、测试或开发者工具的工具声明了
annotations.debugging: true,并确保面向用户的工具未设置该项或将其设为false。 - 编辑后运行工作区构建、类型检查或测试。
错误处理
- 如果
document.modelContext和navigator.modelContext都缺失,请确认代码是在安全的浏览器窗口上下文中运行,然后检查references/compatibility.md中的预览版要求。 - 如果只有
navigator.modelContext存在,则页面运行在较旧的 Chrome 146–149 预览版上;请保留document.modelContext || navigator.modelContext回退逻辑,但计划在弃用期限结束后移除navigator.modelContext。 - 在
try/catch中等待registerTool()。在 Chrome151.0.7922.0+ 中,它会返回一个失败时拒绝的Promise<void>;较旧版本则会同步返回并抛出异常。同样的await+try/catch写法可以捕获这两种情况,因此无论错误是以同步异常还是 Promise 拒绝的形式出现,下面的错误检查都适用。 - 如果
registerTool()抛出InvalidStateError,请检查是否存在重名、空的name或description值,或长度超过 128 个字符或包含不允许字符的工具名称(仅允许 ASCII 字母数字字符、_、-、.)。 - 如果
registerTool()抛出NotAllowedError,请检查toolsPermissions Policy 功能是否被禁用;跨源 iframe 需要嵌入文档提供allow="tools"。 - 如果
registerTool()抛出TypeError或 JSON 序列化错误,请将不可序列化或循环引用的inputSchema值替换为纯 JSON 兼容对象。 - 如果较旧的演示或文章提到了
provideContext、clearContext或toolparamtitle,请将这些接口视为当前实现中的过时内容。 - 如果声明式执行未能正确更新页面,请先阅读
references/declarative-api.md和references/troubleshooting.md,再更改工具契约。
评论
支持 Markdown