Make a web app agent-ready with WebMCP by detecting app actions, building a manifest, integrating document.modelContext tools, verifying in a real browser, healing failures, and auditing diffs. Use when the user says "webmcpify", "add WebMCP", "expose app actions to AI agents", or asks to make a browser app controllable through WebMCP tools.
Take an existing web application, inventory user-facing actions, transform approved actions into WebMCP tools registered through document.modelContext, verify them through the production browser surface, and deliver .webmcpify/manifest.json plus .webmcpify/report.md without touching unrelated code.
When to invoke
"webmcpify this app."
"Add WebMCP tools for our checkout flow."
"Expose app actions to AI agents."
"Verify the WebMCP manifest and heal failures."
"Show WebMCP integration status."
Inputs
Use $ARGUMENTS as the mode and scope. Accepted modes are inventory, map, integrate, verify, status, and full; any other text is scoping guidance such as only the checkout area or read-only tools only. If $ARGUMENTS is empty, run full and resume from the current .webmcpify/manifest.json when it exists.
Prerequisites and context
Target a web app you control; backend-only MCP servers, third-party-site automation, and SEO work are out of scope.
Prefer live WebMCP guidance before integration when the network works:
Every diff hunk must trace to a manifest tool or recorded one-time setup path. Never refactor, reformat, rename, modify, or revert baselineDirty files.
Mutations
Prefer read-only tools. Use mutating: false, mutating: "client", or mutating: "server". Server-mutating tools require per-tool human approval in approval.
Trust boundary
execute() may only call UI-owned paths: same endpoints, validation, and auth. Never create endpoints, bypass checks, or put secrets in tools.
Runtime
Register via document.modelContext.registerTool() with AbortSignal lifecycle and feature-detect deprecated navigator.modelContext. No third-party WebMCP runtime dependencies.
Forms
Never use toolautosubmit on state-changing forms; use it only for pure read forms such as search, filter, or availability.
State
Persist progress in .webmcpify/; write manifest.json.tmp and rename over manifest.json.
Commits
Never commit unless the gate records commitPolicy. Never use git add -A, git add -u, git add ., or commit -a.
State protocol
.webmcpify/manifest.json is the single source of truth. Resume if it exists. Merge any .webmcpify/areas/<id>.tools.json shard first, mark the area inventoried, delete the shard, then continue from pipeline.phase, the first pending area, or the first non-terminal tool. Terminal statuses are verified, skipped, and rejected.
Use this canonical sample shape when creating or migrating state:
{
"webmcpify": 3,
"app": {
"stack": "react-vite",
"typescript": true,
"entry": "src/main.tsx",
"baseUrl": "http://localhost:5173",
"startCommand": "npm run dev",
"authFixtures": {
"member": { "obtain": "npm run seed:test-user, then sign in at /login", "account": "member@example.test", "env": ["TEST_MEMBER_PASSWORD"] }
}
},
"pipeline": {
"phase": "inventory",
"setup": {
"runtimeVendored": ["src/webmcp/webmcpify.ts", "src/webmcp/webmcp.d.ts"],
"harnessInstalled": [".webmcpify/webmcp.spec.ts"],
"originTrialNoted": ["README.md"]
},
"baselineSha": "abc1234",
"baselineDirty": ["src/wip.ts"],
"commitPolicy": null,
"commitWebmcpifyDir": null,
"blockers": ["app won't start locally: needs API_KEY"]
},
"areas": [{ "id": "checkout", "paths": ["src/features/checkout/"], "status": "pending" }],
"tools": [{
"id": "create_ticket",
"area": "tickets",
"kind": "imperative",
"mutating": "server",
"priority": 1,
"description": "Creates a new ticket in the currently open project.",
"inputSchema": {},
"annotations": { "readOnlyHint": false, "untrustedContentHint": false },
"source": ["src/features/tickets/NewTicket.tsx:42"],
"route": "/projects/demo/tickets",
"auth": ["role:member"],
"examples": { "valid": { "title": "Test ticket" }, "invalid": {} },
"expect": { "result": "created", "navigation": null, "ui": "new row appears in the ticket list" },
"cleanup": "delete the created ticket via the UI's own delete path (test data only)",
"status": "discovered",
"approval": null,
"attempts": 0,
"batchCommit": null,
"notes": ""
}],
"log": ["2026-07-12 inventory: area checkout done, 4 candidates"]
}
Migrate webmcpify: 2 manifests on first write: auth string to array; setup booleans to path arrays where false becomes [] and unrecoverable true becomes null; mutating: true to "server"; add annotations, blockers: [], commitWebmcpifyDir: null, and expect.navigation: null; then bump to 3.
Procedure
DETECT: identify stack, build and dev-server commands, TypeScript, test setup, auth model, authFixtures, baseUrl, startCommand, baselineSha, and baselineDirty. If the app cannot start locally, append a blocker.
INVENTORY: map routes, pages, views, or feature modules cheaply; create areas with pending; deep-read one area per iteration; fill each tool with route, auth, annotations, examples, expect, and cleanup; mark the area inventoried; run a completeness pass over visible user actions.
GATE: present id, area, kind, mutating, priority, and one-line description. Record approved or rejected tools, per-tool approval for mutating: "server", commitPolicy as commit-per-batch or no-commit, commitWebmcpifyDir, and every blocker.
INTEGRATE: vendor templates/webmcpify.ts or templates/webmcpify.js, templates/webmcp.d.ts, and when needed templates/webmcp-jsx.d.ts; note origin trial or flag requirements; integrate one area or no more than five approved tools per batch; build and typecheck; set tools to integrated.
VERIFY: install templates/webmcp.spec.ts; use real headed Chrome and the production getTools() / executeTool() surface with legacy fallback; parse stringified JSON Schema; verify annotations, valid and invalid examples, returned result, UI delta, navigation, auth roles, and cleanup.
HEAL: fix only the failed tool integration. If schema, description, mutating, annotations, or expect changes, return to the gate. Increment attempts; at attempts = 3, mark skipped. Re-run all integrated or verified tools after healing.
AUDIT: collect git diff <baselineSha>..HEAD, index changes, and untracked files for commit-per-batch, or working tree, index, and untracked files for no-commit. Map every hunk to a tool or pipeline.setup; flag unmapped or baselineDirty hunks only. Finalize .webmcpify/report.md.
Progressive disclosure and bundled resources
references/inventory.md: area mapping, naming, schema conventions, tool-count budgets, and overlap rules.
references/security.md: mutating-tool approval and audit checklist; apply before the gate and at audit.
references/runtime.md: vendoring and wiring the runtime while preserving the full MIT header.
references/integrate.md: declarative attributes for standard HTML forms and imperative registration for non-form or controlled-state actions.
references/verify.md: flags, Chrome setup, WebMCP surfaces, Playwright/Puppeteer checks, and dual-outcome assertions for zero-param read tools.
references/heal.md: failure taxonomy and implementation-only fixes.
templates/webmcpify.ts, templates/webmcpify.js, templates/webmcp.d.ts, templates/webmcp-jsx.d.ts, templates/webmcp.spec.ts: vendorable runtime and verification assets.
Gotchas
Manifest state beats memory: read and write .webmcpify/manifest.json at every transition because context can be wiped.
Server-mutating verification can create real effects: require approval.productionSideEffect, mark every payload [webmcpify verification], and list the effect in report.md; otherwise mark skipped.
The manifest cannot contain its own commit SHA: under commit-per-batch, write batchCommit on the next manifest write.
Inventory shards are not manifests: sub-agents may write only areas/<id>.tools.json; the coordinator merges sequentially.
Limits
Do not use this skill for backend-only MCP servers, automating sites you do not control, destructive first-wave actions, irreversible payment actions, or generic SEO work.
Do not expose a tool that bypasses the UI's existing authorization, validation, endpoint, or cleanup path.
1---2name: webmcpify3description: Make a web app agent-ready with WebMCP by detecting app actions, building a manifest, integrating document.modelContext tools, verifying in a real browser, healing failures, and auditing diffs. Use when the user says "webmcpify", "add WebMCP", "expose app actions to AI agents", or asks to make a browser app controllable through WebMCP tools.4license: MIT5---67<!-- Generated from harness/github-copilot/skills/webmcpify/SKILL.md by harness/claude-code/scripts/convert_from_copilot.py. Edit the source, not this file. -->89# webmcpify1011Take an existing web application, inventory user-facing actions, transform approved actions into WebMCP tools registered through `document.modelContext`, verify them through the production browser surface, and deliver `.webmcpify/manifest.json` plus `.webmcpify/report.md` without touching unrelated code.1213## When to invoke1415- "webmcpify this app."16- "Add WebMCP tools for our checkout flow."17- "Expose app actions to AI agents."18- "Verify the WebMCP manifest and heal failures."19- "Show WebMCP integration status."2021## Inputs2223Use `$ARGUMENTS` as the mode and scope. Accepted modes are `inventory`, `map`, `integrate`, `verify`, `status`, and `full`; any other text is scoping guidance such as `only the checkout area` or `read-only tools only`. If `$ARGUMENTS` is empty, run `full` and resume from the current `.webmcpify/manifest.json` when it exists.2425## Prerequisites and context2627- Target a web app you control; backend-only MCP servers, third-party-site automation, and SEO work are out of scope.28- Prefer live WebMCP guidance before integration when the network works:2930```sh31npx -y modern-web-guidance@latest retrieve "webmcp,agentic-forms,agentic-javascript-tools"32```3334- WebMCP is an evolving origin-trial API from the W3C Web Machine Learning Community Group: https://webmachinelearning.github.io/webmcp/35- If offline, use bundled references under `references/` and templates under `templates/`.3637## Invocation modes3839| Argument | Run | Stop at |40| --- | --- | --- |41| none or `full` | DETECT, INVENTORY, GATE, INTEGRATE, VERIFY, HEAL, AUDIT | `done` |42| `inventory` / `map` | DETECT and INVENTORY loops only; zero code changes | manifest table for review |43| `integrate` | INTEGRATE loop only; requires approved manifest tools | integrated and built |44| `verify` | VERIFY and HEAL loops on integrated tools | green or skipped report |45| `status` | read `.webmcpify/manifest.json`; read-only | phase, per-status counts, next command |4647## Ground rules4849| Rule | Requirement |50| --- | --- |51| Unrelated changes | Every diff hunk must trace to a manifest tool or recorded one-time setup path. Never refactor, reformat, rename, modify, or revert `baselineDirty` files. |52| Mutations | Prefer read-only tools. Use `mutating: false`, `mutating: "client"`, or `mutating: "server"`. Server-mutating tools require per-tool human approval in `approval`. |53| Trust boundary | `execute()` may only call UI-owned paths: same endpoints, validation, and auth. Never create endpoints, bypass checks, or put secrets in tools. |54| Runtime | Register via `document.modelContext.registerTool()` with AbortSignal lifecycle and feature-detect deprecated `navigator.modelContext`. No third-party WebMCP runtime dependencies. |55| Forms | Never use `toolautosubmit` on state-changing forms; use it only for pure read forms such as search, filter, or availability. |56| State | Persist progress in `.webmcpify/`; write `manifest.json.tmp` and rename over `manifest.json`. |57| Commits | Never commit unless the gate records `commitPolicy`. Never use `git add -A`, `git add -u`, `git add .`, or `commit -a`. |5859## State protocol6061`.webmcpify/manifest.json` is the single source of truth. Resume if it exists. Merge any `.webmcpify/areas/<id>.tools.json` shard first, mark the area `inventoried`, delete the shard, then continue from `pipeline.phase`, the first `pending` area, or the first non-terminal tool. Terminal statuses are `verified`, `skipped`, and `rejected`.6263| File | Purpose |64| --- | --- |65| `.webmcpify/manifest.json` | Webmcpify Manifest v3, atomically written |66| `.webmcpify/areas/<id>.tools.json` | Sub-agent shard: `{ "webmcpifyShard": 3, "area": "<id>", "tools": [] }` |67| `.webmcpify/report.md` | Human-facing running and final report |6869Keep these v3 fields and values intact: `webmcpify`, `app.stack`, `app.typescript`, `app.entry`, `app.baseUrl`, `app.startCommand`, `app.authFixtures`, `pipeline.phase`, `pipeline.setup.runtimeVendored`, `harnessInstalled`, `originTrialNoted`, `baselineSha`, `baselineDirty`, `commitPolicy`, `commitWebmcpifyDir`, `blockers`, `areas`, `tools`, `id`, `kind`, `mutating`, `priority`, `description`, `inputSchema`, `annotations`, `readOnlyHint`, `untrustedContentHint`, `source`, `route`, `auth`, `examples`, `valid`, `invalid`, `expect`, `result`, `navigation`, `ui`, `cleanup`, `status`, `approval`, `productionSideEffect`, `attempts`, `batchCommit`, `notes`, and `log`.7071Use this canonical sample shape when creating or migrating state:7273```jsonc74{75 "webmcpify": 3,76 "app": {77 "stack": "react-vite",78 "typescript": true,79 "entry": "src/main.tsx",80 "baseUrl": "http://localhost:5173",81 "startCommand": "npm run dev",82 "authFixtures": {83 "member": { "obtain": "npm run seed:test-user, then sign in at /login", "account": "member@example.test", "env": ["TEST_MEMBER_PASSWORD"] }84 }85 },86 "pipeline": {87 "phase": "inventory",88 "setup": {89 "runtimeVendored": ["src/webmcp/webmcpify.ts", "src/webmcp/webmcp.d.ts"],90 "harnessInstalled": [".webmcpify/webmcp.spec.ts"],91 "originTrialNoted": ["README.md"]92 },93 "baselineSha": "abc1234",94 "baselineDirty": ["src/wip.ts"],95 "commitPolicy": null,96 "commitWebmcpifyDir": null,97 "blockers": ["app won't start locally: needs API_KEY"]98 },99 "areas": [{ "id": "checkout", "paths": ["src/features/checkout/"], "status": "pending" }],100 "tools": [{101 "id": "create_ticket",102 "area": "tickets",103 "kind": "imperative",104 "mutating": "server",105 "priority": 1,106 "description": "Creates a new ticket in the currently open project.",107 "inputSchema": {},108 "annotations": { "readOnlyHint": false, "untrustedContentHint": false },109 "source": ["src/features/tickets/NewTicket.tsx:42"],110 "route": "/projects/demo/tickets",111 "auth": ["role:member"],112 "examples": { "valid": { "title": "Test ticket" }, "invalid": {} },113 "expect": { "result": "created", "navigation": null, "ui": "new row appears in the ticket list" },114 "cleanup": "delete the created ticket via the UI's own delete path (test data only)",115 "status": "discovered",116 "approval": null,117 "attempts": 0,118 "batchCommit": null,119 "notes": ""120 }],121 "log": ["2026-07-12 inventory: area checkout done, 4 candidates"]122}123```124125Migrate `webmcpify: 2` manifests on first write: `auth` string to array; `setup` booleans to path arrays where `false` becomes `[]` and unrecoverable `true` becomes `null`; `mutating: true` to `"server"`; add `annotations`, `blockers: []`, `commitWebmcpifyDir: null`, and `expect.navigation: null`; then bump to `3`.126127## Procedure1281291. DETECT: identify stack, build and dev-server commands, TypeScript, test setup, auth model, `authFixtures`, `baseUrl`, `startCommand`, `baselineSha`, and `baselineDirty`. If the app cannot start locally, append a blocker.1302. INVENTORY: map routes, pages, views, or feature modules cheaply; create `areas` with `pending`; deep-read one area per iteration; fill each tool with `route`, `auth`, `annotations`, `examples`, `expect`, and `cleanup`; mark the area `inventoried`; run a completeness pass over visible user actions.1313. GATE: present id, area, kind, mutating, priority, and one-line description. Record approved or rejected tools, per-tool approval for `mutating: "server"`, `commitPolicy` as `commit-per-batch` or `no-commit`, `commitWebmcpifyDir`, and every blocker.1324. INTEGRATE: vendor `templates/webmcpify.ts` or `templates/webmcpify.js`, `templates/webmcp.d.ts`, and when needed `templates/webmcp-jsx.d.ts`; note origin trial or flag requirements; integrate one area or no more than five approved tools per batch; build and typecheck; set tools to `integrated`.1335. VERIFY: install `templates/webmcp.spec.ts`; use real headed Chrome and the production `getTools()` / `executeTool()` surface with legacy fallback; parse stringified JSON Schema; verify `annotations`, valid and invalid examples, returned result, UI delta, navigation, auth roles, and cleanup.1346. HEAL: fix only the failed tool integration. If schema, description, `mutating`, `annotations`, or `expect` changes, return to the gate. Increment `attempts`; at `attempts = 3`, mark `skipped`. Re-run all integrated or verified tools after healing.1357. AUDIT: collect `git diff <baselineSha>..HEAD`, index changes, and untracked files for `commit-per-batch`, or working tree, index, and untracked files for `no-commit`. Map every hunk to a tool or `pipeline.setup`; flag unmapped or `baselineDirty` hunks only. Finalize `.webmcpify/report.md`.136137## Progressive disclosure and bundled resources138139- `references/inventory.md`: area mapping, naming, schema conventions, tool-count budgets, and overlap rules.140- `references/security.md`: mutating-tool approval and audit checklist; apply before the gate and at audit.141- `references/runtime.md`: vendoring and wiring the runtime while preserving the full MIT header.142- `references/integrate.md`: declarative attributes for standard HTML forms and imperative registration for non-form or controlled-state actions.143- `references/verify.md`: flags, Chrome setup, WebMCP surfaces, Playwright/Puppeteer checks, and dual-outcome assertions for zero-param read tools.144- `references/heal.md`: failure taxonomy and implementation-only fixes.145- `templates/webmcpify.ts`, `templates/webmcpify.js`, `templates/webmcp.d.ts`, `templates/webmcp-jsx.d.ts`, `templates/webmcp.spec.ts`: vendorable runtime and verification assets.146147## Gotchas148149- **Manifest state beats memory**: read and write `.webmcpify/manifest.json` at every transition because context can be wiped.150- **Server-mutating verification can create real effects**: require `approval.productionSideEffect`, mark every payload `[webmcpify verification]`, and list the effect in `report.md`; otherwise mark `skipped`.151- **The manifest cannot contain its own commit SHA**: under `commit-per-batch`, write `batchCommit` on the next manifest write.152- **Inventory shards are not manifests**: sub-agents may write only `areas/<id>.tools.json`; the coordinator merges sequentially.153154## Limits155156- Do not use this skill for backend-only MCP servers, automating sites you do not control, destructive first-wave actions, irreversible payment actions, or generic SEO work.157- Do not expose a tool that bypasses the UI's existing authorization, validation, endpoint, or cleanup path.158159## Source compatibility terms160161Retain these WebMCP pipeline terms when reading older manifests or reports: ` paths (both `, `"client"`, `"discovered"`, `"failed"`, `"integrated"`, `"inventoried"`, `"pending"`, `"skipped"`, `"verified"`, `"webmcpify": 2`, `, or `, `/webmcpify <mode>`, `; commit `, `FIRST`, `HERE`, `HUMAN`, `LATER`, `NAMES`, `OBTAINS`, `ONLY`, `PATHS`, `Read/write`, `THREE`, `URL/pattern`, `allow-listed`, `approved`, `audit`, `audit → done`, `auto-revert`, `browser-local`, `budgets/overlap`, `client-mutating`, `created/modified`, `dependency-free`, `detect → inventory`, `dev/test`, `discovered`, `document`, `done-but-unrecorded`, `expect.navigation`, `failed`, `fan-out`, `feature-detected`, `fetch-intercepted`, `file/line`, `framework-rendered`, `gate → integrate`, `green/skipped`, `heal → audit`, `heal-fix`, `integrate → verify`, `integrated/verified`, `invalid: null`, `inventory → gate`, `mapped-or-flagged`, `naming/schema`, `navigator`, `no/empty`, `non-negotiable`, `opt-in`, `origin-trial/flag`, `per-area`, `pipeline.baselineDirty`, `pipeline.baselineSha`, `pipeline.blockers`, `pipeline.commitPolicy`, `pipeline.commitWebmcpifyDir`, `post-heal`, `re-approval`, `re-run`, `re-verify`, `review/commit`, `routes/views/feature`, `runtimeVendored: ["src/webmcp/webmcpify.ts", ...]`, `server-mutating`, `side-effect`, `skipped/rejected`, `tri-state`, `verify → heal`, `webmcp-jsx.d.ts`, `webmcp.d.ts`, `webmcpify.js`, `webmcpify.ts`, and `DevTools`.162163## Output template164165```markdown166## webmcpify report167168**Status:** inventory | gate | integrated | verified | healed | skipped | done | blocked169**Mode:** inventory | integrate | verify | status | full170**Manifest:** `.webmcpify/manifest.json`171172| Area | Tool | Kind | Mutating | Status | Evidence |173| --- | --- | --- | --- | --- | --- |174| `<area>` | `<tool_id>` | imperative | false | verified | `<route>`, schema, annotations, valid and invalid examples passed |175176**Setup paths**177- `<path>`: runtimeVendored | harnessInstalled | originTrialNoted178179**Security and blockers**180- `<mutating tool or blocker>`: `<approval, cleanup, skipped reason, or production side effect>`181182**Audit**183- Mapped hunks: `<count>`184- Flagged hunks: `<file:line and disposition>`185- Validation: `<build/typecheck/browser verify command>` passed | failed186```187188## Quality gate189190- [ ] Mode from `$ARGUMENTS` is honored and unknown words are treated as scope.191- [ ] `.webmcpify/manifest.json` is written atomically and contains Webmcpify Manifest v3.192- [ ] Every absolute URL and environment variable name, including `API_KEY` and `TEST_MEMBER_PASSWORD`, is preserved without secret values.193- [ ] Every tool has `route`, `auth`, `inputSchema`, `annotations`, `examples`, `expect`, `cleanup`, `status`, and `source`.194- [ ] Server-mutating tools have explicit approval before integration or live verification.195- [ ] Verification uses the production `getTools()` and `executeTool()` browser surface.196- [ ] Every diff hunk maps to a manifest entry or `pipeline.setup`, or is flag-only in `.webmcpify/report.md`.197- [ ] Referenced files under `references/` and `templates/` exist and are read only on demand.198199## References200201- [WebMCP draft](https://webmachinelearning.github.io/webmcp/)202- [webmcpify source](https://github.com/TueJon/webmcpify)
Run npx skillmds@latest add paulasilvatech/webmcpify in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Make a web app agent-ready with WebMCP by detecting app actions, building a manifest, integrating document.modelContext tools, verifying in a real browser, healing failures, and auditing diffs. Use when the user says "webmcpify", "add WebMCP", "expose app actions to AI agents", or asks to make a browser app controllable through WebMCP tools. It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under MIT.
paulasilvatech (@paulasilvatech) published this skill. Their other Agent Skills are listed on their SkillMD profile.