@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 +27 -0
- package/README.md +16 -5
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
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.
|
|
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
|
|
58
|
-
| Tool list in context, every opt-in tool on | 9
|
|
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).
|
|
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
|
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"hasInstallScript": true,
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"name": "@raultov/browser-control-mcp",
|
|
22
|
-
"version": "0.
|
|
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.
|
|
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.
|
|
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.
|
|
95
|
+
"version": "0.8.0-beta.12",
|
|
96
96
|
"volta": {
|
|
97
97
|
"node": "18.14.1",
|
|
98
98
|
"npm": "9.5.0"
|