Skip to content

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

  1. Call list_checked_sites for the sites TrickyBird publishes a checked page for, or get_site_status for one domain.
  2. Call open_site with the address you want; open_site is not limited to the list.

Open a site, then stop it

  1. Call open_site with the address. It answers ok once the launch has started.
  2. Call cancel_launch while 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

  1. Call get_faq on the FAQ page, get_security_overview on the security page, or get_comparison on the comparison page.
  2. Call get_article on an explainer, or get_site_guide on a site’s own page.
  3. 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.

  1. 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.

  2. 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].text carries the tool’s own answer, and a refusal sets isError to 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_comparison reports 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_site and cancel_launch change anything. The rest are read-only, and each says so in its own description.