playwright-e2e-mcp 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +57 -18
  2. package/dist/apps/index.d.ts +29 -0
  3. package/dist/apps/index.js +52 -0
  4. package/dist/apps/index.js.map +1 -0
  5. package/dist/apps/test-report-html.d.ts +15 -0
  6. package/dist/apps/test-report-html.js +430 -0
  7. package/dist/apps/test-report-html.js.map +1 -0
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/oauth.d.ts +12 -2
  11. package/dist/oauth.js +44 -6
  12. package/dist/oauth.js.map +1 -1
  13. package/dist/server.d.ts +14 -2
  14. package/dist/server.js +107 -8
  15. package/dist/server.js.map +1 -1
  16. package/dist/tools/audit-tests.js +24 -6
  17. package/dist/tools/audit-tests.js.map +1 -1
  18. package/dist/tools/compare-visual-state.js +7 -1
  19. package/dist/tools/compare-visual-state.js.map +1 -1
  20. package/dist/tools/generate-e2e-test.js +27 -12
  21. package/dist/tools/generate-e2e-test.js.map +1 -1
  22. package/dist/tools/inspect-page.js +5 -12
  23. package/dist/tools/inspect-page.js.map +1 -1
  24. package/dist/tools/quarantine.js +7 -1
  25. package/dist/tools/quarantine.js.map +1 -1
  26. package/dist/tools/shared.d.ts +10 -0
  27. package/dist/tools/shared.js +15 -0
  28. package/dist/tools/shared.js.map +1 -1
  29. package/dist/tools/structured.d.ts +2 -0
  30. package/dist/tools/structured.js +4 -2
  31. package/dist/tools/structured.js.map +1 -1
  32. package/dist/tools/suggest-fix.js +6 -1
  33. package/dist/tools/suggest-fix.js.map +1 -1
  34. package/dist/types/index.d.ts +9 -0
  35. package/dist/utils/client-metadata.d.ts +46 -0
  36. package/dist/utils/client-metadata.js +174 -0
  37. package/dist/utils/client-metadata.js.map +1 -0
  38. package/dist/utils/compact-schema.d.ts +20 -0
  39. package/dist/utils/compact-schema.js +55 -0
  40. package/dist/utils/compact-schema.js.map +1 -0
  41. package/dist/utils/confirm.d.ts +68 -0
  42. package/dist/utils/confirm.js +120 -0
  43. package/dist/utils/confirm.js.map +1 -0
  44. package/dist/utils/locator-map.d.ts +25 -0
  45. package/dist/utils/locator-map.js +113 -0
  46. package/dist/utils/locator-map.js.map +1 -0
  47. package/examples/github-actions/playwright-e2e.yml +1 -1
  48. package/package.json +1 -1
  49. package/skill/playwright-e2e-mcp/SKILL.md +12 -5
  50. package/skill/playwright-e2e-mcp/references/setup.md +2 -2
  51. package/skill/playwright-e2e-mcp/references/tools.md +1 -1
package/README.md CHANGED
@@ -64,9 +64,11 @@ red at HEAD ─▶ bisect-failure (runs it across git history, names the breakin
64
64
  - **Works on CI failures too.** Load a CI job's report and traces and get the same diagnosis and fixes.
65
65
  - **TypeScript and Python.** Works on `@playwright/test` suites and on `pytest-playwright` ones, with the same failure diagnosis and traces.
66
66
  - **Flakiness with evidence.** Names the flaky test, whether it's a race, shared state or test order, and the seed that reproduces it.
67
- - **Lean.** With the `core` tool set, finding and fixing a broken locator took about **5,500 tokens**
68
- versus about **7,900** with Playwright MCP plus a shell. All 19 tools add about 16k tokens of
69
- definitions to every request, so load only the [profiles](#configuration) you use ([benchmark](#benchmark)).
67
+ - **Lean.** With the `core` tool set, finding and fixing a broken locator took about **3,000 tokens**
68
+ versus about **7,200** with Playwright MCP plus a shell, and a look at a page costs about 570 tokens
69
+ against 2,300 for a Playwright MCP snapshot. All 19 tools add about 11.5k tokens of definitions to
70
+ every request, so load only the [profiles](#configuration) you use, or start with `--tools=auto`
71
+ (about 2.4k) and let the agent load the rest when it needs them ([benchmark](#benchmark)).
70
72
  - **Free and open source.** MIT, no account, no API key, no telemetry. Every tool and feature is free, including the shared team history server you can host yourself.
71
73
 
72
74
  ## 🚀 What only this MCP does
@@ -190,7 +192,7 @@ or go to **Settings → MCP → Add new MCP server** and paste the standard conf
190
192
  project only, put it in `.cursor/mcp.json`.
191
193
 
192
194
  Only fixing failing tests? [Install the core tools only](https://cursor.com/en/install-mcp?name=playwright-e2e&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInBsYXl3cmlnaHQtZTJlLW1jcCIsIi0tdG9vbHM9Y29yZSJdfQ==): the seven-tool fix loop
193
- (`--tools=core`), about 5k tokens of tool definitions instead of 16k.
195
+ (`--tools=core`), about 2.3k tokens of tool definitions instead of 11.5k.
194
196
 
195
197
  </details>
196
198
 
@@ -273,8 +275,8 @@ Running and fixing your own tests needs your project, so use the local install f
273
275
  | --- | --- |
274
276
  | Skill only, any agent | `npx skills add xsignon-secure/E2E` |
275
277
  | MCP Registry | `io.github.xsignon-secure/E2E` ([listing](https://registry.modelcontextprotocol.io/)); registry-aware clients find it there |
276
- | Straight from GitHub, no npm | `npx -y github:xsignon-secure/E2E#v0.9.0` (pin a release tag) |
277
- | Release tarball | `npm install -D https://github.com/xsignon-secure/E2E/releases/download/v0.9.0/playwright-e2e-mcp-0.9.0.tgz` |
278
+ | Straight from GitHub, no npm | `npx -y github:xsignon-secure/E2E#v0.11.0` (pin a release tag) |
279
+ | Release tarball | `npm install -D https://github.com/xsignon-secure/E2E/releases/download/v0.11.0/playwright-e2e-mcp-0.11.0.tgz` |
278
280
  | Docker | `docker run -i --rm -v "$PWD:/work" ghcr.io/xsignon-secure/playwright-e2e-mcp` (published on each release; see [Development](docs/development.md#docker)) |
279
281
  | Local checkout | `"command": "node", "args": ["/path/to/E2E/dist/index.js"]` |
280
282
 
@@ -338,6 +340,30 @@ in the project, else `python3` / `python`.
338
340
  pip install pytest-playwright && playwright install chromium
339
341
  ```
340
342
 
343
+ ## What's new in 0.11
344
+
345
+ - **Fewer tokens.** `inspect-page` now returns the compact locator map by default: on the
346
+ benchmark storefront a page look costs about 570 tokens instead of 3,600 (Playwright MCP's
347
+ snapshot of the same page is about 2,300). Repeated blocks such as product cards are shown
348
+ once. `view: 'elements'` still gives the full DOM inventory.
349
+ - **Load tools on request.** `--tools=auto` (or `PW_MCP_TOOLS=auto`) starts with the core fix
350
+ loop plus `load-tools`, about 2.4k tokens of tool definitions instead of 11.5k; the agent
351
+ loads the page, audit or history tools when a task needs them.
352
+ - **Smaller tool definitions.** Input schemas are listed without length and item limits; the
353
+ server still checks every call against them.
354
+
355
+ ## What's new in 0.10
356
+
357
+ - **Asks before changing your files.** Applying a fix, writing a new test, quarantining a test or
358
+ replacing a visual baseline now shows you the exact change and waits for your yes, in clients
359
+ that support MCP questions (elicitation). No writes nothing. `PW_MCP_CONFIRM_WRITES` sets the
360
+ policy (`auto`, `always`, `off`).
361
+ - **Interactive test report** in Claude, ChatGPT, Cursor and other MCP Apps clients: counts,
362
+ a filterable list of failures, expected vs. received, and one-click re-run or "Ask to fix".
363
+ Other clients show the text result as before. `PW_MCP_APPS=0` turns it off.
364
+ - **Newer sign-in for the hosted endpoint:** OAuth clients can identify with a Client ID
365
+ Metadata Document (the MCP default since 2025-11-25); dynamic registration keeps working.
366
+
341
367
  ## What's new in 0.9
342
368
 
343
369
  - **Everything is free, including team history.** The CI history service that used to be a
@@ -423,6 +449,8 @@ prompts.
423
449
 
424
450
  **Only need the fix loop?** `--tools=core` (or `PW_MCP_TOOLS=core`) exposes seven tools and cuts the
425
451
  tool-definition context by about three quarters ([one-click core install for Cursor](https://cursor.com/en/install-mcp?name=playwright-e2e&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInBsYXl3cmlnaHQtZTJlLW1jcCIsIi0tdG9vbHM9Y29yZSJdfQ==)). Other profiles: `triage`, `inspect`, `author`.
452
+ Want the savings without losing tools? `--tools=auto` starts with the same seven plus `load-tools`,
453
+ which the agent calls to turn on the page, audit or history tools when a task needs them.
426
454
 
427
455
  <details>
428
456
  <summary><b>Typical workflow</b></summary>
@@ -481,7 +509,7 @@ steps:
481
509
  - uses: actions/setup-node@v6
482
510
  with: { node-version: 24 }
483
511
  - run: npm ci && npx playwright install --with-deps chromium
484
- - uses: xsignon-secure/E2E@v0.9.0
512
+ - uses: xsignon-secure/E2E@v0.11.0
485
513
  with:
486
514
  flaky-runs: 3 # 0 skips the flaky verdict
487
515
  suggest: 2 # suggest-fix diffs for the first 2 failures
@@ -521,10 +549,12 @@ npx -y playwright-e2e-mcp guard --base origin/main # exit 1 on BLOCK; --strict
521
549
  | Environment variable | Default | Purpose |
522
550
  | --- | --- | --- |
523
551
  | `PW_MCP_PROJECT_ROOT` | server cwd | Default project root for every tool |
524
- | `PW_MCP_TOOLS` | all | Which tools to expose, as tool names and/or profiles, comma separated (same as the `--tools=` flag). Profiles: `core` (run, status, failure, fix, flaky, heal guard, list), `triage` (run, status, failure, CI report, flaky, history, test audit, bisect, quarantine, heal guard, list), `inspect` (page, selector, accessibility, performance, visual, login), `author` (list, page, selector, generate, run, login, heal guard). All nineteen tool definitions cost about 16k tokens of context per request; `core` costs about 5k (12k and 2.6k with `PW_MCP_OUTPUT_SCHEMAS=0`) |
552
+ | `PW_MCP_TOOLS` | all | Which tools to expose, as tool names and/or profiles, comma separated (same as the `--tools=` flag). Profiles: `core` (run, status, failure, fix, flaky, heal guard, list), `triage` (run, status, failure, CI report, flaky, history, test audit, bisect, quarantine, heal guard, list), `inspect` (page, selector, accessibility, performance, visual, login), `author` (list, page, selector, generate, run, login, heal guard). `auto` starts with the core loop (or the tools listed with it, e.g. `auto,inspect`) plus a `load-tools` tool the agent calls to turn on more tools for the session; the client is told the tool list changed. `auto` needs a client that refreshes its tool list (Claude Code, Cursor, VS Code); over the hosted HTTP endpoint it lists every tool. All nineteen tool definitions cost the model about 11.5k tokens per request and `core` about 2.3k (the full `tools/list`, with output schemas most clients do not show the model, is about 16k and 4.8k) |
525
553
  | `PW_MCP_OUTPUT_SCHEMAS` | on | `0` leaves the output schemas out of the tool list to save context. Results still carry `structuredContent` (see [Structured results](docs/tools.md#structured-results)) |
526
554
  | `PW_MCP_PROTOCOL` | both | `legacy` stops offering the stateless 2026-07-28 MCP revision, for a client that trips over it. By default 2026 clients get it and 2025 clients get the old handshake |
527
555
  | `PW_MCP_NO_UPDATE_CHECK` | off | `1` stops `doctor` from asking npm whether a newer version is out (same as `doctor --offline`) |
556
+ | `PW_MCP_CONFIRM_WRITES` | `auto` | Ask before a tool changes your files (`suggest-fix` apply, `audit-tests` fix, a new test from `generate-e2e-test`, quarantine add/remove, replacing a visual baseline). `auto` asks when the client can show a question (MCP elicitation) and writes as before when it can't; `always` refuses to write when the client can't ask; `off` never asks. The question shows the exact diff, and a yes only covers that diff |
557
+ | `PW_MCP_APPS` | `1` | Show an interactive test report next to `run-test`, `get-run-status` and `get-failure` results in clients that support MCP Apps (Claude, ChatGPT, Cursor). The report filters failures, shows expected vs. received, and re-runs or asks to fix a test with one click. `0` turns it off; other clients show the text result as before |
528
558
  | `PW_MCP_SKILLS` | on | `0` stops serving the bundled agent skill over the MCP Skills extension (`skill://playwright-e2e-mcp/SKILL.md`) |
529
559
  | `PW_MCP_STORAGE_STATE` | — | Default `storageState` file (inside the project) for the page tools |
530
560
  | `PW_MCP_PYTHON` | project venv, then `python3` | The Python that runs a pytest-playwright suite |
@@ -538,6 +568,7 @@ npx -y playwright-e2e-mcp guard --base origin/main # exit 1 on BLOCK; --strict
538
568
  | `PW_MCP_ALLOWED_HOSTS` | localhost + Vercel hostnames when there is no token | HTTP bridge only: comma-separated `Host` allowlist; `*` accepts any |
539
569
  | `PW_MCP_MAX_FAILED_AUTH` | `20` | HTTP bridge only: wrong tokens or access keys one client address may send in 15 minutes before it gets `429` |
540
570
  | `PW_MCP_OAUTH_REDIRECT_HOSTS` | any https host | HTTP bridge only: comma-separated hosts OAuth apps may return to, e.g. `claude.ai,chatgpt.com`; `.example.com` covers subdomains; localhost always works |
571
+ | `PW_MCP_OAUTH_CIMD` | `1` | HTTP bridge only: accept OAuth clients that identify with a Client ID Metadata Document (an https `client_id`, the MCP default since 2025-11-25); `0` accepts only dynamically registered clients |
541
572
  | `PW_MCP_TRUST_PROXY` | off (on for Vercel) | HTTP bridge only: `1` trusts `X-Real-IP` / `X-Forwarded-For` from a reverse proxy in front, so the sign-in limit counts per client, not per proxy |
542
573
  | `PW_MCP_PASSTHROUGH_ENV` | — | HTTP bridge only: comma-separated extra variables passed to test runs (e.g. `BASE_URL`) |
543
574
  | `PW_MCP_MAX_CHILDREN` | `4` | HTTP bridge only: how many test runs and browser probes may run at once |
@@ -566,18 +597,26 @@ apply) and with Playwright MCP plus a shell (`playwright test`, `browser_navigat
566
597
 
567
598
  | Step | playwright-e2e-mcp (`core` tools) | playwright-e2e-mcp (all tools) | Playwright MCP + shell |
568
599
  | --- | ---: | ---: | ---: |
569
- | Tool definitions (sent with every request) | 4,826 | 16,121 | 5,225 |
570
- | Run the failing test | 244 | 244 | 323 |
600
+ | Tool definitions the model reads (every request) | 2,266 | 11,480 | 4,558 |
601
+ | Run the failing test | 257 | 257 | 323 |
571
602
  | Find the element / propose the fix | 232 | 232 | 2,286 |
572
603
  | Apply + verify (re-run) | 230 | 230 | 34 |
573
- | **Total for one fix** | 5,532 | 16,827 | 7,868 |
574
-
575
- Tokens are characters ÷ 4. The work itself (run, diagnose, fix, verify) takes about 700 tokens
576
- here versus about 2,600 with Playwright MCP, but tool definitions are sent with every request:
577
- with all 19 tools loaded they outweigh that saving, so set `PW_MCP_TOOLS=core` (or another
578
- profile) when you only fix failing tests. The Playwright MCP route is a lower bound: it assumes
579
- the agent picks the right locator from the snapshot on the first try, which the server does for
580
- it here. Run 2026-10-28 with 0.7.0 and Playwright 1.64.1; re-run with
604
+ | **Total for one fix** | 2,985 | 12,199 | 7,201 |
605
+
606
+ | Looking at the storefront page | Tokens |
607
+ | --- | ---: |
608
+ | `inspect-page` (default: locator map) | 571 |
609
+ | Playwright MCP `browser_navigate` + `browser_snapshot` | 2,286 |
610
+
611
+ Tokens are characters ÷ 4. Tool definitions count what the model reads: each tool's name,
612
+ description and input schema. The full `tools/list` also carries output schemas, which clients
613
+ keep for themselves (about 16k for all tools). The work itself (run, diagnose, fix, verify)
614
+ takes about 700 tokens here versus about 2,600 with Playwright MCP, but tool definitions are
615
+ sent with every request: with all 19 tools loaded they outweigh that saving, so set
616
+ `PW_MCP_TOOLS=core` (or another profile) when you only fix failing tests, or `PW_MCP_TOOLS=auto`
617
+ to start with the core loop (2,427 tokens) and load more tools on request. The Playwright MCP
618
+ route is a lower bound: it assumes the agent picks the right locator from the snapshot on the
619
+ first try, which the server does for it here. Run 2026-11-01 with Playwright 1.64.1; re-run with
581
620
  `npm run build && node bench/token-benchmark.mjs`.
582
621
 
583
622
  ## Demo
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MCP Apps (SEP-1865, extension `io.modelcontextprotocol/ui`): an
3
+ * interactive test report that Claude, ChatGPT, Cursor and other MCP Apps
4
+ * hosts render next to the run-test, get-run-status and get-failure results.
5
+ *
6
+ * The tools say which view to show in their `_meta.ui.resourceUri`; the
7
+ * host reads the `ui://` resource, renders it in a sandboxed iframe and
8
+ * hands it the tool result. Hosts that do not support MCP Apps ignore the
9
+ * metadata and show the text result exactly as before, so nothing changes
10
+ * for them.
11
+ *
12
+ * The view makes no network requests (it declares no CSP domains) and only
13
+ * calls this server's own tools through the host.
14
+ *
15
+ * Set PW_MCP_APPS=0 to turn it off.
16
+ */
17
+ import type { McpServer } from '@modelcontextprotocol/server';
18
+ /** The MCP Apps resource MIME type (`text/html;profile=mcp-app`). */
19
+ export declare const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app";
20
+ /** Older hosts read the view from this flat key (`ui/resourceUri`). */
21
+ export declare const LEGACY_RESOURCE_URI_KEY = "ui/resourceUri";
22
+ export declare const TEST_REPORT_URI = "ui://playwright-e2e-mcp/test-report.html";
23
+ /** Tools whose results the report view can show. */
24
+ export declare const REPORT_TOOLS: ReadonlySet<string>;
25
+ export declare function appsEnabled(): boolean;
26
+ /** The `_meta` a tool declares so MCP Apps hosts show the report, or undefined. */
27
+ export declare function appMetaFor(toolName: string): Record<string, unknown> | undefined;
28
+ /** Register the report view resource. A no-op when PW_MCP_APPS=0. */
29
+ export declare function registerApps(server: McpServer): void;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * MCP Apps (SEP-1865, extension `io.modelcontextprotocol/ui`): an
3
+ * interactive test report that Claude, ChatGPT, Cursor and other MCP Apps
4
+ * hosts render next to the run-test, get-run-status and get-failure results.
5
+ *
6
+ * The tools say which view to show in their `_meta.ui.resourceUri`; the
7
+ * host reads the `ui://` resource, renders it in a sandboxed iframe and
8
+ * hands it the tool result. Hosts that do not support MCP Apps ignore the
9
+ * metadata and show the text result exactly as before, so nothing changes
10
+ * for them.
11
+ *
12
+ * The view makes no network requests (it declares no CSP domains) and only
13
+ * calls this server's own tools through the host.
14
+ *
15
+ * Set PW_MCP_APPS=0 to turn it off.
16
+ */
17
+ import { TEST_REPORT_HTML } from './test-report-html.js';
18
+ /** The MCP Apps resource MIME type (`text/html;profile=mcp-app`). */
19
+ export const MCP_APP_MIME_TYPE = 'text/html;profile=mcp-app';
20
+ /** Older hosts read the view from this flat key (`ui/resourceUri`). */
21
+ export const LEGACY_RESOURCE_URI_KEY = 'ui/resourceUri';
22
+ export const TEST_REPORT_URI = 'ui://playwright-e2e-mcp/test-report.html';
23
+ /** Tools whose results the report view can show. */
24
+ export const REPORT_TOOLS = new Set(['run-test', 'get-run-status', 'get-failure']);
25
+ export function appsEnabled() {
26
+ return process.env.PW_MCP_APPS !== '0';
27
+ }
28
+ /** The `_meta` a tool declares so MCP Apps hosts show the report, or undefined. */
29
+ export function appMetaFor(toolName) {
30
+ if (!appsEnabled() || !REPORT_TOOLS.has(toolName))
31
+ return undefined;
32
+ return { ui: { resourceUri: TEST_REPORT_URI }, [LEGACY_RESOURCE_URI_KEY]: TEST_REPORT_URI };
33
+ }
34
+ /** Rendering hints for the host: a border, and no outside origins at all. */
35
+ const RESOURCE_UI_META = {
36
+ prefersBorder: true,
37
+ csp: { connectDomains: [], resourceDomains: [] },
38
+ };
39
+ /** Register the report view resource. A no-op when PW_MCP_APPS=0. */
40
+ export function registerApps(server) {
41
+ if (!appsEnabled())
42
+ return;
43
+ server.registerResource('test-report', TEST_REPORT_URI, {
44
+ title: 'Interactive test report',
45
+ description: 'The view MCP Apps hosts show for run-test, get-run-status and get-failure results.',
46
+ mimeType: MCP_APP_MIME_TYPE,
47
+ _meta: { ui: RESOURCE_UI_META },
48
+ }, async () => ({
49
+ contents: [{ uri: TEST_REPORT_URI, mimeType: MCP_APP_MIME_TYPE, text: TEST_REPORT_HTML, _meta: { ui: RESOURCE_UI_META } }],
50
+ }));
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/apps/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAE7D,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAE1E,oDAAoD;AACpD,MAAM,CAAC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC;AAExG,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;AACzC,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,eAAe,EAAE,CAAC;AAC9F,CAAC;AAED,6EAA6E;AAC7E,MAAM,gBAAgB,GAAG;IACvB,aAAa,EAAE,IAAI;IACnB,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;CACjD,CAAC;AAEF,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAC3B,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,eAAe,EACf;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,oFAAoF;QACjG,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE;KAChC,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC;KAC3H,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The interactive test report view (MCP Apps, SEP-1865).
3
+ *
4
+ * One self-contained HTML page with no external requests: the host loads it
5
+ * in a sandboxed iframe and talks to it with JSON-RPC over postMessage. The
6
+ * page speaks the small part of the MCP Apps protocol it needs directly
7
+ * (ui/initialize, tool-input, tool-result, tools/call, ui/message,
8
+ * size-changed), so it ships no framework and no bundle.
9
+ *
10
+ * Everything from the tool result is written with textContent, never as
11
+ * HTML: test titles and error messages come from the project under test.
12
+ *
13
+ * Kept as a TypeScript string so `tsc` ships it in dist/ with the server.
14
+ */
15
+ export declare const TEST_REPORT_HTML: string;