feat(mcp): expose page-registered WebMCP tools - #42613
Conversation
Pages can register tools for agents through the experimental WebMCP API. Surface them as browser_webmcp_list / browser_webmcp_call, and report their presence in the page status after a navigation.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Collect the page's WebMCP tools alongside the snapshot rather than on demand, so tools registered without a navigation are picked up. browser_webmcp_list now reports the cached listing without evaluating in the page.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Carry the tool count on TabHeader and report it whenever the page has tools, instead of asking for the hint from the navigation tools. A changed count is a header change, so tools are advertised as soon as they are collected, and switching tabs collects them for the tab being switched to.
Test results for "MCP"4 failed 8435 passed, 1415 skipped Merge workflow run. |
|
Hi, I'm the Playwright bot and I took a look at the failing CI. 🟡 Two failures are confirmed pre-existing flakes; one I can't fully clearThe latest report (run 34489962372) has four reds across three tests. Two are well-documented flakes on bots unrelated to this PR. The third — DetailsThis PR is WebMCP-only, but it does touch shared MCP backend files ( Pre-existing flake / infra
Uncertain
Triaged by the Playwright bot - agent run |
|
Thank you for adding this! This looks great and I'm excited to test it. The specification has now changed to have tools to be declared on |
1cee222
into
microsoft:main
## What's New ### 🎉 New Tools - **`browser_webmcp_list` / `browser_webmcp_call`** — List and call the tools a page registers through the [WebMCP](https://webmachinelearning.github.io/webmcp/) API, letting the page do the work instead of driving its UI. When a page has WebMCP tools, the page status reports how many are available ([#42613](microsoft/playwright#42613)). WebMCP is experimental, see [WebMCP in Chrome](https://developer.chrome.com/docs/ai/webmcp) for how to enable it. ### Other Changes - New `--profile-dir-name <name>` option (env `PLAYWRIGHT_MCP_PROFILE_DIR_NAME`) selects the Chrome profile to connect to in extension mode when the extension is installed in several profiles, for example `"Profile 1"` ([#42527](microsoft/playwright#42527)) - Headless browsers launched by the server are now closed after one hour without tool calls; the next tool call launches a new one. Use `--idle-timeout <ms>` (config `timeouts.idle`, env `PLAYWRIGHT_MCP_IDLE_TIMEOUT`) to change the timeout, `0` disables it. Headed and attached browsers are not closed unless a timeout is set explicitly ([#42663](microsoft/playwright#42663), [#42676](microsoft/playwright#42676)) - `--image-responses` accepts `only`: a response that carries an image consists of the image parts alone, without the text part ([#42672](microsoft/playwright#42672)) ## Bug Fixes - `browser_close` returns an error when the browser context is shared (`--shared-browser-context`) instead of breaking the calling client's session. This supersedes the v0.0.80 change that dropped the backend after `browser_close` ([#42495](microsoft/playwright#42495)) - With `--shared-browser-context`, `browser_start_recording` / `browser_stop_recording` (opt-in via `--caps=devtools`) keep each client's recording separate instead of delivering one client's recorded actions to another ([#42622](microsoft/playwright#42622), [#42627](microsoft/playwright#42627)) - The file access check follows symlinks, so a symlink inside the workspace can no longer be used to read or write files outside the allowed roots ([#42628](microsoft/playwright#42628)) - Explicitly named output files in a nested directory (e.g. `sub/shot.png`) no longer fail with `ENOENT`; `browser_file_upload` and `browser_drop` resolve relative paths against the workspace root ([#42540](microsoft/playwright#42540)) - In extension mode with `PLAYWRIGHT_MCP_EXTENSION_TOKEN` set, a connection that never completes (e.g. the token belongs to another Chrome profile) now fails after 30 seconds with a hint instead of hanging the tool call forever ([#42525](microsoft/playwright#42525)) - Disable the Chromium sandbox by default on Linux for the bundled Chromium build, which lacks the setuid sandbox helper ([#42490](microsoft/playwright#42490))
## What's New ### 🎉 New Commands - **`webmcp-list` / `webmcp-call`** — List and call the tools a page registers through the [WebMCP](https://webmachinelearning.github.io/webmcp/) API, letting the page do the work instead of driving its UI. When a page has WebMCP tools, the page status reports how many are available ([#42613](microsoft/playwright#42613)). WebMCP is experimental, see [WebMCP in Chrome](https://developer.chrome.com/docs/ai/webmcp) for how to enable it. ### Other Changes - Headless sessions now shut down after one hour without commands, so a session an agent never closed no longer holds a browser; run `open` again to start a new one. Use `open --idle-timeout <ms>` (config `timeouts.idle`, env `PLAYWRIGHT_MCP_IDLE_TIMEOUT`) to change the timeout, `0` disables it. Headed browsers stay open, and attached browsers are only detached when `attach --idle-timeout <ms>` is set ([#42676](microsoft/playwright#42676)) - The skill includes a guide for attaching screenshots and videos to pull requests with `gh --attach` ([#42645](microsoft/playwright#42645)) ## Bug Fixes - Session daemons exit when their control socket is deleted or replaced, instead of staying alive with the browser ([#42454](microsoft/playwright#42454)) - Explicitly named output files in a nested directory (e.g. `screenshot --filename=sub/shot.png`) no longer fail with `ENOENT` ([#42540](microsoft/playwright#42540)) - Video chapters and screencast overlays are no longer hidden behind open dialogs and popovers ([#42642](microsoft/playwright#42642)) - `npx playwright test --debug=cli` works for tests that create more than one browser context and for every test in a worker, not just the first ([#42503](microsoft/playwright#42503)) - With `PLAYWRIGHT_MCP_EXTENSION_TOKEN` set, `attach --extension` fails after 30 seconds with a hint when the extension never connects (e.g. the token belongs to another Chrome profile) instead of hanging forever ([#42525](microsoft/playwright#42525)) - Disable the Chromium sandbox by default on Linux for the bundled Chromium build, which lacks the setuid sandbox helper ([#42490](microsoft/playwright#42490)) ## Upgrading ```bash npm install -g @playwright/cli@0.1.20 ```
Summary
Pages can register tools for agents through the experimental WebMCP API. This exposes them.
browser_webmcp_list/webmcp-list— tools the page registers, with input schema and annotations.browser_webmcp_call/webmcp-call <name> --params '<json>'— call one.- 2 webmcp tools available on the pagewhenever the page has any.Example
Against a Shopify storefront that registers 10 tools, abbreviated:
Key decisions
document.modelContext/navigator.modelContext, not a browser-specific automation surface. Works on Chromium and Firefox, and needs no protocol change.browser_webmcp_listreports what was collected rather than evaluating in the page.getTools()aggregates same-origin descendants, so tools are filtered to the frame that owns them and the per-frame results are merged. Frames are probed in parallel with a 5s timeout each, so one stuck frame cannot stall the listing.url (frame N)when several frames share a URL — two copies of the same widget each register their own tool under the same name, and the URL alone cannot tell them apart.isError, recovery hints — is what the caller needs. Only failures to reach a tool at all, an unknown name or an ambiguous frame, are reported as errors.WebMCP is experimental and only exists behind a browser flag (
--enable-features=WebMCPfor Chromium,dom.modelcontext.*prefs for Firefox), so nothing changes for pages that do not opt in.Known gap: under
--jsonboth commands return their output as a single string, and the page status is dropped along with the rest of that section, so the tool count is not visible there.