Compatibility
What was measured, on which browser build, with which flags.
Verified environment
Test date: 2026-09-13. Host: macOS. Runner: Playwright 1.63.0. Browser: bundled headless Chromium 153.0.8010.12. The page ran at http://127.0.0.1:4173. The browser reported a secure context for this loopback origin.
| Browser configuration | Result |
|---|---|
| Default Playwright Chromium | Required API absent. The probe showed an unsupported message. |
Chromium with --enable-experimental-web-platform-features | Native registration, discovery, execution, events, and removal passed. |
The two reports from this run are kept in the repository at playground/compatibility/reports/2026-09-13-chromium.json and playground/compatibility/reports/2026-09-13-chromium-webmcp.json. They are fixed evidence. New runs write fresh reports under test-results/.
Observed native API
document.modelContexthasregisterTool,getTools, andexecuteToolmethods.- The probe registered its echo tool before discovery. It did not patch registration or use a replacement registry.
- Discovery returned the tool with its name, description, origin, current window, annotations, and a JSON-string input schema.
- Execution required JSON-string arguments in this browser build. Object arguments failed before the handler ran. The probe selects the input format from the discovered schema format. It does not retry execution.
- The original handler ran once. Execution returned
{"text":"WebMCP probe"}as a JSON string. toolchangefired after registration and removal. Aborting the registration signal removed the tool.- The returned annotations included
readOnlyHint: trueanduntrustedContentHint: false. They did not includeconsequentialHint.
The current WebMCP draft describes object input schemas and object arguments. Chrome documentation notes an argument-format change from Chrome 155. The verified Chromium 153 target uses the older format. No claim is made that it implements the full current draft.
Chrome setup guidance lists a local testing flag, origin isolation, and a tools permissions policy. This probe used the command-line flag listed above. It did not test an origin-trial token, cross-origin frames, insecure remote HTTP, or other browser engines.
Unsupported browsers
These configurations are not a supported WebMCP host for this release. The product does not ship a replacement document.modelContext or another workaround.
| Browser configuration | Result |
|---|---|
Playwright Chromium without --enable-experimental-web-platform-features | Required API absent. The widget shows an unsupported message. |
| Firefox | Not verified. The required API is not part of this release matrix. |
| Safari / WebKit | Not verified. The required API is not part of this release matrix. |
| Insecure remote HTTP | Out of scope. Discovery requires a secure context. |
Fixture Playwright suites under tests/e2e/failures.spec.ts and packages/actionwire/e2e use a test ToolSource. They are not native compatibility evidence. Native evidence is pnpm test:native, playground/compatibility/probe.spec.ts, and tests/e2e/native-webmcp.spec.ts. That native suite fails when the API is absent. It does not skip.
Widget viewport matrix
Verified in Playwright Chromium with tests/e2e/frameworks.spec.ts.
| Viewport | Result |
|---|---|
| 1280×800 | Panel width stays in 360–400px and inside the viewport. |
| 640×568 | Bottom sheet. Composer stays visible. |
| 320×568 | Bottom sheet. Composer stays visible. Horizontal overflow stays at most 1px. |
prefers-reduced-motion: reduce | Transitions are disabled. |
| Keyboard | Enter opens the panel. Enter sends. Escape closes and returns focus to the launcher. |
PRD acceptance evidence
| # | Criterion | Evidence |
|---|---|---|
| 1 | A web application can expose WebMCP tools | playground/src/tools.ts, native probe reports |
| 2 | The library discovers them automatically | tests/e2e/native-webmcp.spec.ts, playground/compatibility/probe.spec.ts |
| 3 | The tools become available to the text agent | playground/e2e/journey.spec.ts, tests/e2e/native-webmcp.spec.ts |
| 4 | The user can request an action using natural language | playground/e2e/journey.spec.ts |
| 5 | The agent selects and calls the correct WebMCP tool | playground/e2e/journey.spec.ts |
| 6 | The existing application handler performs the action | playground journey plus Vanilla/React/Vue/Svelte example tests |
| 7 | The result is returned to the agent | playground/e2e/journey.spec.ts |
| 8 | The assistant responds naturally after execution | Scripted wording in playground/e2e/journey.spec.ts. Manual real-model steps are in that file. |
| 9 | Tool activity is visible in the widget | Journey plus packages/actionwire/e2e/accessibility.spec.ts |
| 10 | Destructive actions require confirmation | Journey plus widget confirmation tests |
| 11 | Tool availability can refresh while the app is running | Journey billing tools, tests/e2e/failures.spec.ts navigation case |
| 12 | The same browser/core implementation works with Vanilla JS, Vue, React, and Svelte | tests/e2e/frameworks.spec.ts and examples/*/e2e |
| 13 | No tool definition is duplicated between WebMCP and the agent | tests/e2e/frameworks.spec.ts checks playground/src/assistant.ts |
| 14 | No voice-related dependencies are introduced in Phase 1 | tests/e2e/frameworks.spec.ts package dependency scan |
Run the checks
pnpm install --frozen-lockfile
pnpm exec playwright install chromium
pnpm test:e2e
pnpm test:nativetest:e2e runs both browser configurations. It also removes the API in a separate test to check the unsupported message. That test is not native compatibility evidence. test:native requires a real successful native run. It fails if the required API is absent. No native test is silently skipped.
For a manual check, run pnpm probe. Open the loopback address in the target browser. Select Run probe. Record the exact browser build and launch flags with the report.
Invariants for the native adapter
These rules hold in packages/actionwire/src/webmcp today. Keep them.
- Native format conversion stays inside
packages/actionwire/src/webmcp. - Parse a discovered JSON-string schema once and forward it. Do not write a second definition.
- Send JSON-string arguments only for the format the tool declares.
- Preserve the native tool handle and the current-window check.
- Never infer safety from a missing annotation. A tool with no explicit read-only classification requires confirmation.
- Invalidate the execution revision when native registrations change, even when the public name and schema stay the same.