WebMCP on TrickyBird
WebMCP is a draft from the W3C Web Machine Learning Community Group that lets a page register named actions on document.modelContext, so a browser agent calls a function instead of guessing its way around the DOM.
Through a proxy every frame of a proxied page becomes same-origin, so WebMCP’s default self policy would let a frame of the site you opened register tools into the page an agent is reading.
Last updated
The tools
TrickyBird registers these tools on its own pages, one set per page and only while you are on it, and the table says which page each one lives on. The description column is the string the browser hands the agent, read from the modules that register the tools rather than retyped here, so the table cannot list a tool this site does not register.
The ChatGPT desktop browser has been reading the tools a site registers since 2026-08-27, on the Work and Codex plans.
Not a remote MCP server
There is no MCP endpoint to call and nothing to install. document.modelContext lives inside a browser tab, so these tools exist only while one of these pages is open in yours.
Navigate
open_site- Registers on
- /
- Input
- url
- Result
- ok, invalid_url, busy, cancelled, failed
Open a website through TrickyBird in this tab. The proxied page loads in place of this one. Returns ok (launch started), invalid_url (not a web address), busy (already launching), cancelled (call cancelled), failed (launch incomplete).
cancel_launch- Registers on
- /, /unblock/<slug>
- Input
- None
- Result
- cancelled, nothing_to_cancel
Stop an open_site or open_this_site launch on this page, before it navigates. Returns cancelled when a launch was in progress, or nothing_to_cancel when none was or a check is waiting on the person at the screen. Opens nothing, starts no session, navigates nowhere.
open_this_site- Registers on
- /unblock/<slug>
- Input
- None
- Result
- ok, busy, cancelled, failed
Open the site this page is about through TrickyBird in this tab. The proxied page loads in place of this one. It takes no input; open_site is the tool that takes an address. Returns ok (launch started), busy (already launching), cancelled (call cancelled), failed (launch incomplete).
Look up a site
list_checked_sites- Registers on
- /, /unblock, /status
- Input
- None
- Result
- None
List the sites TrickyBird publishes checked pages for. Read-only, opens nothing. A site not listed has no such page, which does not mean it is blocked or unchecked, and open_site is not limited to the list.
get_site_status- Registers on
- /, /unblock, /status
- Input
- domain
- Result
- renders, unknown_site
Return what TrickyBird publishes for one checked site: status, category, page address and the date a person last checked it. A domain outside this schema returns unknown_site. Read-only, opens nothing. open_site is not limited to these domains.
Read a page
get_faq- Registers on
- /faq
- Input
- None
- Result
- None
Return the questions and answers TrickyBird publishes on its FAQ page, in the page's order. Read-only, opens nothing.
get_security_overview- Registers on
- /security
- Input
- None
- Result
- None
Return the sections TrickyBird publishes on its security page, in the page's order. Read-only, opens nothing.
get_comparison- Registers on
- /compare
- Input
- None
- Result
- None
Return the comparison TrickyBird publishes between a web proxy and a VPN: the rows in the page's order, with the answer and the balance note the page prints beside them. Read-only, opens nothing.
get_article- Registers on
- /learn/<slug>
- Input
- None
- Result
- None
Return the explainer this page is about, in the page's order: title, the answer it leads with, opening, sections and the questions it answers. Read-only, opens nothing.
get_site_guide- Registers on
- /unblock/<slug>
- Input
- None
- Result
- None
Return what TrickyBird publishes for the site this page is about: name, domain, category, status, the date a person last checked it and this page's own address, then any note on what to expect from it, the opening paragraphs, sections and the questions it answers. It is the one tool for what this page publishes about the site; open_this_site is the tool that opens it. Read-only, opens nothing.
list_articles- Registers on
- /learn
- Input
- None
- Result
- None
List the explainers TrickyBird publishes, in the order this page lists them, each with its title, the answer it leads with and the address of its own page. Read-only, opens nothing.
get_leak_test- Registers on
- /proof
- Input
- None
- Result
- None
Return the leak test TrickyBird publishes on its proof page, in the page's order: the steps a person can run in their own tab, the page's own note on the test, and the questions it answers. Read-only, opens nothing.
Recommended workflows
Check a site, then open it
- Call
list_checked_sitesfor the sites TrickyBird publishes a checked page for, orget_site_statusfor one domain. - Call
open_sitewith the address you want;open_siteis not limited to the list.
Open a site, then stop it
- Call
open_sitewith the address. It answers ok once the launch has started. - Call
cancel_launchwhile that launch is still running: it answers cancelled when a launch was in progress, and nothing_to_cancel when none was or a check is waiting on the person at the screen.
Read what a page publishes
- Call
get_faqon the FAQ page,get_security_overviewon the security page, orget_comparisonon the comparison page. - Call
get_articleon an explainer, orget_site_guideon a site’s own page. - Each one returns what its own page publishes, in that page’s order.
How to try it
Before you start
WebMCP is Chromium-only today: Firefox and Safari have no document.modelContext. Chrome 149 through 156 runs the WebMCP origin trial and this origin carries the token, so on one of those you turn nothing on.
A Chrome outside the trial needs --enable-features=WebMCP. Other Chromium-based browsers each decide whether WebMCP is on.
In the console
Open our home page in a new tab, then its console. We ran the steps below in Chrome 152.
Call
getTools()to see what this page has registered.const tools = await document.modelContext.getTools()You get the tools registered on the page you are on, each carrying the name and the description from the table, with its input schema.
Call
executeTool()with one of the tools you just got back, and its input as a JSON string.await document.modelContext.executeTool(tools.find(t => t.name === 'get_site_status'), JSON.stringify({ domain: 'youtube.com' }))You get
'{"content":[{"type":"text","text":"..."}]}'A JSON string. Parse it:
content[0].textcarries the tool’s own answer, and a refusal setsisErrorto true.
What it does not do
None of these tools is registered on the sites you open through TrickyBird; the gateway refuses WebMCP on every document it serves, so a proxied page can register no tools.
The reason is the collapse in the first paragraph: on our own address a proxied page is not a third party your browser can hold apart, so the refusal has to come from us.
What these tools can reach
- Nothing these tools return comes from a site you open through TrickyBird or carries anything about your session. The read-only ones return what TrickyBird already publishes on the page each registers on.
get_comparisonreports the comparison TrickyBird publishes between a web proxy and a VPN, with the balance note the page prints beside it. It names no other product.- Only
open_site,open_this_siteandcancel_launchchange anything. The rest are read-only, and each says so in its own description.
Links
- W3C Community Group draft · webmachinelearning.github.io
- Explainer and open issues · github.com
- The awesome-webmcp list · github.com
- llms.txt · trickybird.com
- WebMCP in the FAQ · trickybird.com
- A measurement note on WebMCP tool metadata, in English · trickybird.com