The same form, in 3 turns instead of 14.
Paired runs against the official “Claude in Chrome” extension — same model, same morning, n=5 per task (29/09/2026). On a form it wins on round trips: navigate already returns element refs, and fill_form fills N fields, submits and reports the result in one call. On a 1,500-row table the turns are about even (6 against 7) and it wins on payload: extract_table filters server-side and returns 0.2 KB instead of 40 KB of page text.
turns
4.7× fewer
Round trips between the model and the browser, on the form. Debugging a broken page: 9.3×; table lookup: 2.3×.
cost
2.8-4.3× lower
Per task: 2.8× on the form, 3.4× on the table, 4.3× debugging. Correct answers 15/15, against 12/15.
Method, every raw run including the unfavourable ones, and what the harness cannot measure: docs/EFFICIENCY.md. Competitor figures measured on 2026-09-01 and 2026-09-11.
67 tools, in eight groups
core (44 tools, every tool used in 101 real sessions) loads by default; the other 23 are switched on mid-session with get_status({enable}), so the schema you pay for stays small.
| Group | N | What’s in it |
|---|---|---|
| Core & Navigation | 13 | tabs, windows, navigate, screenshot, tile_windows |
| Interaction | 11 | click, fill_form, upload_file, dialogs, clipboard |
| DOM & Inspection | 12 | read_page, extract, extract_table, query_dom, get_css_styles, watch_dom |
| Debugging & Network | 8 | execute_js, console, network log, mocking, track_events |
| Visual & Responsive | 5 | screenshot_diff, viewport and zoom, media emulation |
| Audits | 2 | audit (a11y, keyboard, SEO, security, links, vitals, css, resources, cache in one call), cookie_audit |
| State, Storage & Files | 9 | storage, fixtures, MHTML, recording, assert |
| Motion & Performance | 6 | animations, frames (long frames, CLS, INP), perf_trace, screencast, lighthouse and heap_snapshot (launch mode) |
Some jobs never touch the model
The same tools run from your shell at zero tokens, piped through grep or jq before anything reaches the context. Pair session_record with replay for smoke tests with no model in the loop.
chrome-bridge navigate --url https://example.com chrome-bridge read_console --level error | head -20 chrome-bridge assert --selector "#success" --text "Done" chrome-bridge replay --file ./recordings/login.jsonl
Launch mode gives you a dedicated Chromium with an ephemeral profile, for isolated sessions or CI: node server/index.js --launch --headless.
Against the alternatives
Figures measured on 2026-09-01 and 2026-09-11. Codex for Chrome (OpenAI) sits in the Claude in Chrome column: official extension, macOS and Windows only.
| Chrome Bridge | Claude in Chrome | DevTools MCP | Playwright MCP | |
|---|---|---|---|---|
| ChromeOS / Crostini | Yes (real host) | No | Container only | Container only |
| Tools | 60 (43 core) | 22 | 29 default | 24 core |
| Requires paid plan | No | Yes (Pro+) | No | No |
| Network mocking | Yes | No | No | Yes |
| Visual regression | Yes | No | No | No |
| Audits (a11y/SEO/sec) | Yes, one call | No | Lighthouse | No |
| Headless / CI | Yes | No | Yes | Yes |
Install it in three steps
Requires Node.js 18+ and Chrome 135+.
- Install the extension from the Chrome Web Store.
git clone https://github.com/frsorrentino/chrome-bridge.git cd chrome-bridge && ./install.sh
- Restart Claude Code.
install.shregisters the MCP server with--scope user; by hand it isclaude mcp add --scope user chrome-bridge node /path/to/server/index.js. - Ask for something real: “open localhost:3000, run an accessibility audit and find the Sign Up button”.
Without a clone: inside a Claude Code session, /plugin install chrome-bridge --marketplace frsorrentino/chrome-bridge (one command, Claude Code 2.1.275+; on older versions /plugin marketplace add frsorrentino/chrome-bridge then /plugin install chrome-bridge@chrome-bridge). From a shell, claude plugin install has no --marketplace option: run claude plugin marketplace add frsorrentino/chrome-bridge, then claude plugin install chrome-bridge@chrome-bridge. Either way the plugin registers the MCP server from npm (all capabilities) together with the recipes skill. The extension still comes from the Web Store. Pick one path: the plugin and install.sh would register the same server twice, and so would a plugin added from the Anthropic directory on claude.ai next to a marketplace install. In claude.ai chat the plugin loads only the recipes skill: the tools need Claude Code, or Cowork running on your computer.
On ChromeOS/Crostini install from the Web Store rather than Load unpacked: an unpacked extension is dropped on every reboot, because the container is not mounted when Chrome starts.
What it does not protect
The bridge binds loopback, accepts connections only from a chrome-extension:// origin, and requires a token on both handshakes when one is set. Beyond that, be deliberate:
Page content is untrusted
Whatever a page says reaches the model unfiltered. A hostile page’s text is input, never instructions.
Exports are not redacted
get_storage, fixtures, HAR exports and screenshots may carry cookies, tokens or personal data.
Two switches worth knowing
--no-js refuses arbitrary JavaScript in the page; --write-root confines every path the model chooses.
What it gets past, and what it does not Latency per tool Privacy policy Support