@raultov/browser-control-mcp 0.7.0-beta.11 → 0.8.0-beta.12

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.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,33 @@ from a copy of its code: entries describe the differences from that release.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.8.0-beta.12] - 2026-10-31
14
+
15
+ Public **BETA**. Reaches into frames of another origin (payment forms,
16
+ embedded editors, playgrounds, widgets), which Playwright MCP already did:
17
+ `snapshot` reads them in place with frame refs (`f2e5`), and the input tools
18
+ act in them through those refs, on Chrome and Firefox. Behaviour changes:
19
+ `snapshot` and `find_in_snapshot` now show the content of such frames
20
+ instead of a "not readable" line, iframes read get a `[frame=f2]` mark, and
21
+ selectors starting with `f` and a number (`f2e5`, `f2 >>> css`) name
22
+ elements of those frames.
23
+
24
+ ### Added
25
+
26
+ - Frames of another origin (payment forms, embedded editors and playgrounds,
27
+ widgets): `snapshot` and `find_in_snapshot` read them in place, at most 20
28
+ and 5 deep, marking each iframe with its frame number (`[frame=f2]`) and
29
+ prefixing its refs (`f2e5`); `snapshot` with `selector: "f2"` outlines one
30
+ frame. Every selector argument takes those refs and `f2 >>> css`:
31
+ `click_element`, `hover`, `drag`, `fill_input`, `fill_form`, `press_key`,
32
+ `scroll`, `wait_for` and `upload_file` check and act in the frame. Chrome
33
+ reaches an out-of-process frame through its own target (attached for the
34
+ call) and an in-process one through its document, and sends mouse events
35
+ to the tab offset by where the frame shows; Firefox acts in the frame's
36
+ browsing context. Before, such a frame was a "not readable" line and
37
+ nothing inside it could be reached. `evaluate_js` still runs in the page,
38
+ and `capture_screenshot` refuses an element inside such a frame. (#27)
39
+
13
40
  ## [0.7.0-beta.11] - 2026-10-31
14
41
 
15
42
  Public **BETA**. Closes gaps with Playwright MCP and chrome-devtools-mcp and
package/README.md CHANGED
@@ -13,7 +13,7 @@ It is the successor of
13
13
  from a copy of its code) and complements Playwright MCP or
14
14
  chrome-devtools-mcp with runtime JavaScript debugging on both browsers.
15
15
 
16
- > **Status: BETA (0.7.0-beta.11).** This version contains known bugs and differences
16
+ > **Status: BETA (0.8.0-beta.12).** This version contains known bugs and differences
17
17
  > between Chrome and Firefox (see [Limitations and TODO](#limitations-and-todo))
18
18
  > and parts that have not been verified (see [Untested](#untested)). Tool
19
19
  > replies may change in incompatible ways before 1.0. Please report problems
@@ -37,6 +37,7 @@ Tokens are estimated as characters / 4 for every server.
37
37
  | Firefox | **✓ next to Chrome, same tools** | ✓ one browser per server | ✗ |
38
38
  | Several browsers and instances at once | **✓** | ✗ | ✗ |
39
39
  | Selectors | CSS, snapshot refs, `host >>> inner` into shadow roots and iframes | CSS, snapshot refs | snapshot refs only |
40
+ | Frames of another origin (payment forms, embedded editors) | ✓ in the snapshot, refs `f2e5` for every input tool | ✓ refs `f1e5` | ✗ |
40
41
  | Snapshot of a long page | **bounded at 50 000 characters**, `find_in_snapshot` searches the rest | unbounded | unbounded |
41
42
  | Waits for the page to react after an action | ✓ ~50 ms when nothing reacts | ✓ ~500 ms | ✓ ~200 ms |
42
43
  | Clicking a covered or hidden element | **fails at once, naming the overlay** | fails after a 5 s timeout | reports success (the overlay gets the click) |
@@ -54,8 +55,8 @@ Tokens are estimated as characters / 4 for every server.
54
55
 
55
56
  | Task | browser-control-mcp | Playwright MCP | chrome-devtools-mcp |
56
57
  | --- | --- | --- | --- |
57
- | Tool list in context, default tools | 6 430 tokens | 5 330 tokens | 7 770 tokens |
58
- | Tool list in context, every opt-in tool on | 9 880 tokens | 12 040 tokens | not measured (optional categories) |
58
+ | Tool list in context, default tools | 6 450 tokens | 5 330 tokens | 7 770 tokens |
59
+ | Tool list in context, every opt-in tool on | 9 910 tokens | 12 040 tokens | not measured (optional categories) |
59
60
  | Snapshot of Hacker News | **4 588 tokens** | 12 356 tokens | 6 869 tokens |
60
61
  | Snapshot of Wikipedia "Web browser" | **12 643 tokens** (cut, searchable) | 34 349 tokens | 27 656 tokens |
61
62
  | Snapshot of MDN `<input>` | **12 625 tokens** (cut, searchable) | 158 077 tokens | 76 654 tokens |
@@ -124,7 +125,7 @@ see the note.
124
125
  | `emulate` | ✓ | partial | `emulation` group; `width`/`height`, `device_scale_factor`, `mobile` (touch), `color_scheme`, `reduced_motion`, `forced_colors`, `media` (`print`), `reset`; answers what the page now sees; Firefox: viewport and device pixel ratio only (BiDi has no media or touch emulation yet; those options fail naming them) |
125
126
  | `wait_for` | ✓ | ✓ | waits (checking every 100 ms, at most 30 s) until a visible text appears or is gone, a selector is `visible` / `hidden` / `attached` / `detached`, or the URL contains a text; a dialog or debugger pause ends the wait at once |
126
127
  | `inspect_dom` | ✓ | ✓ | includes open shadow roots and same-origin iframes (cross-origin ones are noted); at most 100 000 characters without `query` (cut in the page) |
127
- | `snapshot` | ✓ | ✓ | outline of the page: role, name, states, value and a ref (`e12`) per element, through open shadow roots and same-origin iframes; tables without headers (`th`, `thead`, `caption`) are layout and leave only their content, and a cell is named by its text only when it holds nothing else; comboboxes, spinbuttons and sliders built with ARIA show their value (the field's text, `aria-valuetext` or `aria-valuenow`, the option a button-like combobox shows); an element that is only clickable (a handler or a pointer cursor) is one named line, unless it holds links, buttons or fields, which are listed under it; at most 50 000 characters (`selector` and `depth` narrow it); the same JavaScript on both browsers |
128
+ | `snapshot` | ✓ | ✓ | outline of the page: role, name, states, value and a ref (`e12`) per element, through open shadow roots and same-origin iframes; frames of another origin are read too (at most 20, 5 deep), their iframe marked `[frame=f2]` and their refs prefixed (`f2e5`), and `selector: "f2"` outlines one; tables without headers (`th`, `thead`, `caption`) are layout and leave only their content, and a cell is named by its text only when it holds nothing else; comboboxes, spinbuttons and sliders built with ARIA show their value (the field's text, `aria-valuetext` or `aria-valuenow`, the option a button-like combobox shows); an element that is only clickable (a handler or a pointer cursor) is one named line, unless it holds links, buttons or fields, which are listed under it; at most 50 000 characters (`selector` and `depth` narrow it); the same JavaScript on both browsers |
128
129
  | `find_in_snapshot` | ✓ | ✓ | `text` (case-insensitive) or `regex` over the whole outline; matching lines under their ancestors, at most 20 |
129
130
  | `save_pdf` | ✓ | ✓ | `files` group; prints the tab as the browser's print does (`landscape`, `print_background`, `scale` 0.1–2, `page_ranges` like `1-3, 5`); with `path` (an absolute `.pdf` under the upload roots) writes the file and answers `{path, bytes, pages}`, else returns the PDF as an embedded `application/pdf` resource (at most 5 MB); Chrome `Page.printToPDF`, Firefox `browsingContext.print` |
130
131
  | `capture_screenshot` | ✓ | ✓ | `format` `png`, `jpeg` (or `jpg`) or `webp`; `full_page` at most 16 384 px per side (a text note says when cut); `selector` captures one element (CSS, `host >>> inner` or a snapshot ref), scrolled into view, whole even when taller than the viewport |
@@ -410,7 +411,13 @@ claude mcp add browser-control-mcp -- npx -y @raultov/browser-control-mcp
410
411
  their ancestors. The `selector` of `click_element`, `fill_input`,
411
412
  `scroll` and `wait_for` takes such a ref, a CSS selector, or
412
413
  `host >>> inner` to reach into an open shadow root or a same-origin
413
- iframe (`#checkout >>> #card-number`, chainable). An element keeps its ref
414
+ iframe (`#checkout >>> #card-number`, chainable). A frame of another
415
+ origin (a payment form, an embedded editor) is read as well, through its
416
+ own target on Chrome and its own browsing context on Firefox: its iframe
417
+ line says `[frame=f2]` and its elements have refs such as `f2e5`, which
418
+ every selector argument takes, as does `f2 >>> css`; the input tools then
419
+ check and act in that frame (one call acts in one document: `fill_form`
420
+ and `drag` refuse selectors of two frames). An element keeps its ref
414
421
  in later snapshots while it is in the page; refs end when the page
415
422
  navigates (a stale ref fails saying so). Roles and names are computed in
416
423
  the page, an approximation of the browser's accessibility tree that is
@@ -613,6 +620,10 @@ incompatible:
613
620
  - `get_network_logs` with `include_details: true` has no total size limit (each
614
621
  Firefox body is capped at 2 MB): use `url_filter` on busy pages.
615
622
  - The Docker image is amd64 only.
623
+ - Frames of another origin: `evaluate_js` runs in the page only, and
624
+ `capture_screenshot` cannot clip to an element inside such a frame (pass
625
+ the iframe's ref instead); `snapshot` reads at most 20 of them, 5 deep;
626
+ the coordinates in the replies of the input tools are the frame's.
616
627
 
617
628
  ## Untested
618
629
 
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT",
21
21
  "name": "@raultov/browser-control-mcp",
22
- "version": "0.7.0-beta.11"
22
+ "version": "0.8.0-beta.12"
23
23
  },
24
24
  "node_modules/detect-libc": {
25
25
  "engines": {
@@ -48,5 +48,5 @@
48
48
  }
49
49
  },
50
50
  "requires": true,
51
- "version": "0.7.0-beta.11"
51
+ "version": "0.8.0-beta.12"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/raultov/browser-control-mcp/releases/download/v0.7.0-beta.11"
3
+ "https://github.com/raultov/browser-control-mcp/releases/download/v0.8.0-beta.12"
4
4
  ],
5
5
  "author": "raultov <raultov@protonmail.com>",
6
6
  "bin": {
@@ -92,7 +92,7 @@
92
92
  "zipExt": ".tar.xz"
93
93
  }
94
94
  },
95
- "version": "0.7.0-beta.11",
95
+ "version": "0.8.0-beta.12",
96
96
  "volta": {
97
97
  "node": "18.14.1",
98
98
  "npm": "9.5.0"