Why this exists
Chrome DevTools MCP opens a sandboxed browser. No saved cookies, no logged-in sessions. Every Cloudflare-protected site throws a captcha. You're in a clean room when you need a workshop.
BraveBridge runs as a real extension in your real browser. Same cookies, same sessions, same fingerprint that 1Password and Grammarly use. 29 tools including accessibility tree snapshots with UID targeting. No automation detection.
BraveBridge vs Chrome DevTools MCP
| BraveBridge | Chrome DevTools MCP | |
|---|---|---|
| Browser context | Real browser (cookies, sessions) | Sandboxed (no saved state) |
| Cloudflare / captchas | Rarely triggered | Frequently triggered |
| Authentication | Already logged in everywhere | Must re-auth every session |
| Element targeting | A11y tree + UIDs + CSS | A11y tree + UIDs |
| Tools | 29 tools | 25 tools |
| Detection | None (real extension) | Detectable as automated |
At a glance
29 MCP tools. Zero captchas in normal use. Manifest V3. MIT licensed.
How it works
BraveBridge is a bidirectional bridge: your browser extension talks to an MCP server over WebSocket on localhost:7225, and the MCP server talks to AI agents over stdio.
The flow looks like this: AI agent (Claude Code) ↔ MCP stdio ↔ MCP server ↔ WebSocket ↔ BraveBridge extension ↔ your browser.
The extension uses standard Chrome APIs (chrome.scripting, chrome.tabs). No puppeteer. No headless mode. No navigator.webdriver flag. The same APIs that 1Password and Grammarly use every day.
The full toolkit
Every tool from Chrome DevTools MCP that's possible without the debugger permission, plus a few unique to BraveBridge.
Page reading and snapshots
take_snapshot— accessibility tree with UIDs for element targeting. The primary way to read pages.read_page— extract content in structured, text, or forms mode.read_elements— find elements by CSS selector with text, attributes, positions.screenshot— visual capture: viewport, full page, or element. PNG, JPEG, or WebP.scroll— scroll page or element in any direction.wait_for— wait for elements to appear via MutationObserver.
Interaction
click— click by CSS selector or UID. Supports double-click.hover— trigger CSS:hover, tooltips, dropdown menus.drag— full drag-and-drop between elements.type— type into inputs, textareas, contentEditable. Works with React.key— press keys with modifiers (ctrl, shift, alt, meta).fill_form— batch-fill multiple form fields at once.upload_file— upload local files through file inputs.select_all— select all text in an element.
Navigation and tabs
navigate— go to URL, back, forward, or reload.get_tabs— list all open tabs with IDs, URLs, titles.switch_tab— switch to a tab by ID.close_tab— close a tab by ID or active tab.get_url— get current tab's URL and title.resize_page— resize the browser window.
JS, network, and console
execute_script— run JS in page context. Access cookies, globals, bypass CORS.fetch_url— HTTP requests from extension context. Bypasses CSP.capture_network— intercept all fetch/XHR requests on the page.get_captured_requests— retrieve captured network requests with filtering.capture_console— capture console output and uncaught exceptions.get_console_messages— retrieve console messages with type filtering.handle_dialog— auto-handle alert, confirm, prompt dialogs.emulate— dark/light mode, viewport size, user agent override.
Get started in three steps
1. Load the extension
# Open brave://extensions
# Enable Developer mode (top right)
# Click "Load unpacked" → select extension/ folder
2. Build the MCP server
cd server && npm install && npm run build
3. Add to Claude Code
# In ~/.claude/settings.json:
{
"mcpServers": {
"bravebridge": {
"command": "node",
"args": ["/path/to/bravebridge/server/dist/index.js"]
}
}
}
Tech stack
- Extension — Chrome Manifest V3 (service worker plus content script).
- Server — Node.js with TypeScript and the MCP SDK v1.12.1.
- Transport — WebSocket on
localhost:7225, stdio for MCP. - Validation — Zod schemas on every tool param.
- Bundler — tsup, ESM output.
- License — MIT.
Built it. Killed it. Brought it back.
I originally built BraveBridge in April 2026 to let Claude control Brave. Then I discovered Claude's official Chrome extension already worked on Brave — and it had accessibility tree snapshots, a better approach than my CSS selectors.
So I killed the project and wrote about it.
Two weeks later, I actually tried using Chrome DevTools MCP for real work. The sandboxed browser was the dealbreaker — no cookies, constant Cloudflare captchas, losing auth state every session. BraveBridge's core advantage was always real: it connects to your actual browser.
So I brought it back, implemented every Chrome DevTools MCP feature I could (including accessibility tree snapshots with UIDs), and shipped v0.3.0 with 29 tools. The feature that killed BraveBridge is now built into it.