webmcp
Skill0 starsChanged 2 months agoMITView on GitHub
Implements and debugs browser WebMCP integrations in JavaScript or TypeScript web apps. Use when exposing imperative tools through document.modelContext (with a navigator.modelContext fallback), annotating HTML forms for declarative tools, handling agent-invoked form flows, or validating WebMCP behavior in the current Chrome preview. Don't use for server-side MCP servers, REST tool backends, or non-browser providers.
6 other projects use a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- malinskibeniamin/skillstheir own version, first seen Nov 1, 2026
- BuilderIO/skillstheir own version, first seen Oct 28, 2026
- ScaleDockHQ/scaledock-skillstheir own version, first seen Oct 2, 2026
- AgriciDaniel/web-mcptheir own version, first seen Sep 6, 2026
- webmaxru/web-ai-agent-skillsedited, first seen May 15, 2026
- qdhenry/Claude-Command-Suitetheir own version, first seen Oct 18, 2025
Other versions6 projects use a version of this.
Word for word · 0
None found.
Edited · 1
- webmaxru/web-ai-agent-skills★ 5283% same
Wrote their own version · 5
- BuilderIO/skills★ 4.7ksame name
- qdhenry/Claude-Command-Suite★ 1.3ksame name
- AgriciDaniel/web-mcp★ 12same name
- malinskibeniamin/skills★ 4same name
- ScaleDockHQ/scaledock-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
34 rules. 0 are common, 13 are distinctive, and 21 are very specific to this project.
0
Common
Most of the 6 edited versions we read keep these.
13
Distinctive
This author's own choices. Worth a look.
21
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 17
If a Node runtime is unavailable, inspect the nearest package.json, HTML entry point, and framework bootstrap files manually to identify …
- Distinctive: line 18
If the workspace contains multiple frontend apps, prefer the app that contains the active route, component, or user-requested feature …
- Distinctive: line 19
If the inventory still leaves multiple plausible frontend targets, stop and ask the user which app should receive the WebMCP integration.
- Distinctive: line 20
If the project is not a browser web app, stop and explain that this skill does not apply.
- Very specific: line 23
Read references/webmcp-reference.md before writing code.
- Very specific: line 24
Read references/declarative-api.md when the feature can be expressed as an HTML form flow or needs agent-invoked submit handling.
- Very specific: line 25
Read references/compatibility.md when native availability, Chrome preview setup, or draft-versus-preview behavior matters.
- Very specific: line 26
Read references/troubleshooting.md when registration, schema serialization, or agent-driven form execution fails.
- Distinctive: line 27
Verify that the integration runs in a secure window browsing context.
- Distinctive: line 28
If the feature must run on the server, in a worker, or headlessly without a visible browsing context, stop and explain the platform …
- Distinctive: line 31
Keep tool names, descriptions, and parameters explicit and positive, and prefer atomic tools over overlapping variants.
- Very specific: line 34
Read assets/model-context-registry.template.ts and adapt it to the framework, state model, and file layout in the workspace when using the …
- Very specific: line 42
If tool availability depends on route, selection, or page state, register tools only while they are valid and unregister stale tools by …
- Very specific: line 44
Use labels or toolparamdescription to produce clear parameter descriptions for declarative fields.
- Very specific: line 45
Use toolautosubmit only when the page should submit automatically after the agent populates the form.
- Very specific: line 49
When a tool needs explicit confirmation or a user-facing step, route it through the application's visible UI and existing authorization …
- Very specific: line 50
When customizing declarative submit handling, call preventDefault() before respondWith() and return structured validation errors for …
- Very specific: line 51
Use preview-only events such as toolactivated, toolcancel, agentInvoked, and WebMCP form pseudo-classes only behind compatibility-aware UI …
- Distinctive: line 52
Keep destructive or sensitive actions gated behind visible user confirmation, even if the agent can prepare the input.
- Distinctive: line 53
Keep UI state synchronized so the same page accurately reflects changes caused by human input and tool calls.
- Distinctive: line 56
Test the register and unregister lifecycle, including duplicate-name protection and cleanup on route or state changes.
- Distinctive: line 57
Test invalid or incomplete inputs to confirm the tool returns corrective errors instead of silently failing.
- Very specific: line 59
If the target environment is the current Chrome preview, confirm the required version and flag state from references/compatibility.md …
- Very specific: line 60
Test execution cancellation by aborting the signal passed to executeTool() and verify that long-running work stops without relying on tool …
- Distinctive: line 61
Use the Model Context Tool Inspector or equivalent preview tooling only as a validation aid, not as a runtime dependency.
- Distinctive: line 63
After deterministic execution is correct, validate natural-language routing so descriptions and parameter shapes guide the agent toward the …
- Distinctive: line 64
Run the workspace build, typecheck, or tests after editing.
- Very specific: line 67
If both document.modelContext and navigator.modelContext are missing, confirm the code is running in a secure browser window context and …
- Very specific: line 68
If only navigator.modelContext is present, the page is running on an older Chrome 146–149 preview build.
- Very specific: line 70
If registerTool() throws InvalidStateError, check for duplicate names, empty name or description values, or tool names that exceed 128 …
- Very specific: line 71
If registerTool() throws NotAllowedError, check whether the tools Permissions Policy feature is denied.
- Very specific: line 72
If registerTool() throws TypeError or JSON serialization errors, replace non-serializable or circular inputSchema values with plain …
- Very specific: line 73
If an older demo or article references provideContext, clearContext, or toolparamtitle, treat those surfaces as obsolete for current …
- Very specific: line 74
If declarative execution does not update the page correctly, read references/declarative-api.md and references/troubleshooting.md before …
“Common” is measured: kept by at least 6 in 10 of the 6 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
WebMCP
Procedures
Step 1: Identify the browser integration surface
- Inspect the workspace for browser entry points, UI handlers, and any existing app state or form handling layer.
- Execute
node scripts/find-webmcp-targets.mjs .to inventory likely frontend files and existing WebMCP markers when a Node runtime is available. - If a Node runtime is unavailable, inspect the nearest
package.json, HTML entry point, and framework bootstrap files manually to identify the browser app boundary. - If the workspace contains multiple frontend apps, prefer the app that contains the active route, component, or user-requested feature surface.
- If the inventory still leaves multiple plausible frontend targets, stop and ask the user which app should receive the WebMCP integration.
- If the project is not a browser web app, stop and explain that this skill does not apply.
Step 2: Choose the WebMCP shape
- Read
references/webmcp-reference.mdbefore writing code. - Read
references/declarative-api.mdwhen the feature can be expressed as an HTML form flow or needs agent-invoked submit handling. - Read
references/compatibility.mdwhen native availability, Chrome preview setup, or draft-versus-preview behavior matters. - Read
references/troubleshooting.mdwhen registration, schema serialization, or agent-driven form execution fails. - Verify that the integration runs in a secure window browsing context.
- If the feature must run on the server, in a worker, or headlessly without a visible browsing context, stop and explain the platform limitation.
- Choose the imperative API when the tool wraps existing JavaScript logic, requires dynamic registration, or must handle execution cancellation.
- Choose the declarative API when the user flow already maps cleanly to a form submission and the page can keep the human-visible form in sync with agent activity.
- Keep tool names, descriptions, and parameters explicit and positive, and prefer atomic tools over overlapping variants.
Step 3: Implement tool registration
- Read
assets/model-context-registry.template.tsand adapt it to the framework, state model, and file layout in the workspace when using the imperative API. - Resolve the model context with the feature-detection pattern
const modelContext = document.modelContext || navigator.modelContext;and guard subsequent registration on its presence. Preferdocument.modelContext(the current surface) and keepnavigator.modelContextonly as a fallback for older Chrome 146–149 builds. - Register imperative tools by awaiting
modelContext.registerTool()inside atry/catch, using a stablename(1–128 ASCII alphanumeric/_/-/.characters), a positivedescription, an objectinputSchema, and anexecutecallback. On Chrome 151+ the call returns aPromise<void>that resolves when the tool is available across the frame tree;awaitkeeps the same code working on older builds that registered synchronously. - Set
annotations.readOnlyHinttotrueonly for tools that do not modify state. - Set
annotations.untrustedContentHinttotruewhen the tool's output may contain data from untrusted sources. - Validate business rules inside the tool implementation even when the schema is strict, and return descriptive errors that help the agent retry with corrected input.
- Return tool results only after the UI and application state reflect the tool's effect.
- On Chrome 153+, accept the always-present
{ signal }as the secondexecuteargument and pass it to cancellable work such asfetch(). Treat this execution signal separately from the registration signal. - If tool availability depends on route, selection, or page state, register tools only while they are valid and unregister stale tools by aborting the
AbortControllerwhose signal was passed toregisterTool(); during the Chrome 148 transition window, also callmodelContext.unregisterTool?.()with optional chaining before aborting. - For declarative tools, annotate the target
<form>withtoolnameandtooldescription, and let form controls define the parameter surface. - Use labels or
toolparamdescriptionto produce clear parameter descriptions for declarative fields. - Use
toolautosubmitonly when the page should submit automatically after the agent populates the form.
Step 4: Wire agent-driven UX safely
- Preserve the normal human interaction path even when the page supports agent invocation.
- When a tool needs explicit confirmation or a user-facing step, route it through the application's visible UI and existing authorization checks; the current
execute(input, { signal })contract does not provide a client callback. - When customizing declarative submit handling, call
preventDefault()beforerespondWith()and return structured validation errors for agent-invoked submits. - Use preview-only events such as
toolactivated,toolcancel,agentInvoked, and WebMCP form pseudo-classes only behind compatibility-aware UI logic. - Keep destructive or sensitive actions gated behind visible user confirmation, even if the agent can prepare the input.
- Keep UI state synchronized so the same page accurately reflects changes caused by human input and tool calls.
Step 5: Validate behavior
- Test the register and unregister lifecycle, including duplicate-name protection and cleanup on route or state changes.
- Test invalid or incomplete inputs to confirm the tool returns corrective errors instead of silently failing.
- For declarative tools, verify generated parameter descriptions, required fields, submit behavior, and any custom
respondWith()handling. - If the target environment is the current Chrome preview, confirm the required version and flag state from
references/compatibility.mdbefore treating runtime failures as application bugs. - Test execution cancellation by aborting the signal passed to
executeTool()and verify that long-running work stops without relying on tool unregistration. - Use the Model Context Tool Inspector or equivalent preview tooling only as a validation aid, not as a runtime dependency.
- Validate deterministic execution first by inspecting the registered tool set and manually invoking the tool with representative arguments when preview tooling is available.
- After deterministic execution is correct, validate natural-language routing so descriptions and parameter shapes guide the agent toward the correct tool.
- Run the workspace build, typecheck, or tests after editing.
Error Handling
- If both
document.modelContextandnavigator.modelContextare missing, confirm the code is running in a secure browser window context and then check the preview requirements inreferences/compatibility.md. - If only
navigator.modelContextis present, the page is running on an older Chrome 146–149 preview build; keep thedocument.modelContext || navigator.modelContextfallback in place but plan to dropnavigator.modelContextonce the deprecation window closes. - Await
registerTool()inside atry/catch. On Chrome151.0.7922.0+ it returns aPromise<void>that rejects on failure; older builds returned synchronously and threw. The sameawait+try/catchcatches both, so the error checks below apply whether the failure surfaces as a synchronous throw or a Promise rejection. - If
registerTool()throwsInvalidStateError, check for duplicate names, emptynameordescriptionvalues, or tool names that exceed 128 characters or contain disallowed characters (only ASCII alphanumeric,_,-,.are allowed). - If
registerTool()throwsNotAllowedError, check whether thetoolsPermissions Policy feature is denied; cross-origin iframes needallow="tools"from the embedding document. - If
registerTool()throwsTypeErroror JSON serialization errors, replace non-serializable or circularinputSchemavalues with plain JSON-compatible objects. - If an older demo or article references
provideContext,clearContext, ortoolparamtitle, treat those surfaces as obsolete for current implementations. - If declarative execution does not update the page correctly, read
references/declarative-api.mdandreferences/troubleshooting.mdbefore changing the tool contract.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

