# WebMCP agent readiness playbook: survey, register, roll out and verify a portfolio of sites
A plain Markdown playbook for anyone who looks after several websites (an agency, a franchise, a family of small businesses) and wants AI assistants to use them properly. It is the method I used on October 16, 2026 to take thirty sites from "WebMCP tools shipped but inert" to "tools on, verified, renewal dated". Hand it to an AI coding assistant or work through it by hand.
Companion article (the why, in plain English):
Per-finding fix guide:
Facts checked October 16, 2026:
- WebMCP is a draft from the W3C Web Machine Learning Community Group, not a W3C Standard.
- Chrome's origin trial runs Chrome 149 to 162 and ends March 29, 2027.
- Edge runs its own trial from Edge 150, also listed to March 29, 2027, but its tokens are shorter lived: those issued in October 2026 expire November 30, 2026.
- Chrome tokens don't work in Edge.
- Safari has no WebMCP: WebKit opposes it.
- Firefox has an off-by-default prototype.
---
## 0. Ground rules
- **The assistant fills, the person sends.** Read tools return what the site already publishes. Fill tools fill a form and stop. No tool submits, pays, books or deletes anything on its own, and no form carries `toolautosubmit` if it sends a request.
- **Read before you write.** Survey every site first and save the output. You'll want it as the "before" evidence.
- **One change per deploy where you can.** Token first, then form labels, then server tools. It makes a bad deploy obvious.
- **Compare what you deploy with what's live.** If a site's working copy can be behind production (content published from another machine, a CMS edit), diff it against the live site or the repository's main branch before deploying, or you'll quietly roll back someone else's work.
---
## 1. Survey: which sites run WebMCP, and which send a token
Save as `webmcp-survey.mjs`, edit the list, run `node webmcp-survey.mjs` (Node 20 or later). It only reads.
```js
// Which sites run WebMCP tools, send an origin-trial token, and label their forms. Read-only.
const sites = ['example.com', 'www.example.org'];
const get = async (url) => {
try {
const r = await fetch(url, { redirect: 'follow', signal: AbortSignal.timeout(15000) });
return { status: r.status, url: r.url, headers: r.headers, text: await r.text() };
} catch (e) { return { status: String(e.cause?.code || e.name), headers: new Headers(), text: '' }; }
};
const rows = [];
for (const d of sites) {
const h = await get('https://' + d + '/');
const srcs = [...h.text.matchAll(/