chrome-mcp-bridge
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@chrome-mcp-bridgetake a screenshot of the current page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
chrome-mcp-bridge
An ungated reimplementation of the "Claude in Chrome" MCP bridge. Exposes the same 22 browser-automation tools to any MCP client (Claude Code, Codex, Cursor, …), driving the official Claude Chrome extension via native messaging — no claude.ai login required.
Why this exists
The official "Claude in Chrome" integration is two gated binaries:
Official binary | Role | Gate |
| native host (Chrome-spawned, talks to the extension) | account-gated ( |
| MCP server (MCP-client-spawned, stdio JSON-RPC) | account-gated (refuses to engage the bridge without login) |
Both were proven gated by reverse-engineering: the native host never connects the extension unless logged in, and the MCP server returns "Browser extension is not connected… logged into claude.ai with the same account" without ever touching the bridge pipe. So the real binaries cannot be reused ungated.
This project replaces both halves with ungated reimplementations. The extension itself is not modified — only its native-messaging host is swapped (a manifest path change) and a permission seed is applied to its chrome.storage.local (reversible).
Related MCP server: YetiBrowser MCP
Architecture
┌─────────────┐ JSON-RPC 2.0 (stdio) ┌──────────────────┐ named pipe ┌─────────────────────┐ native messaging ┌────────────┐
│ MCP client │ ───────────────────────▶ │ src/mcp-server │ ──────────────────▶│ src/native-host │ ───────────────────▶│ extension │
│ (Claude etc)│ │ .mjs (22 tools) │ \\.\pipe\chrome- │ .mjs (manifest │ 4-byte-LE + JSON │ (chrome. │
└─────────────┘ └──────────────────┘ mcp-bridge-<user> │ `path`, ungated) │ │ debugger) │
└─────────────────────┘ └────────────┘src/native-host.mjs— Chrome spawns this (via the manifestpath) when the extension callsconnectNative. Handles the extension handshake (ping→pong,get_status→status_response, sendsmcp_connected), and relaystool_request/tool_responseto/from a named-pipe IPC server. One-in-flight dispatch (the extension processes requests sequentially).src/mcp-server.mjs— spawned by the MCP client over stdio. Speaks JSON-RPC 2.0 (protocol2025-06-18). Exposes all 22 tools (static catalog fromtools/list). Ontools/call, connects to the IPC pipe, sends atool_request, awaits the matchingtool_response, translates the result to MCP content (text + base64 images).src/protocol.mjs— shared 4-byte-LE-length-prefixed frame codec (used for both native messaging and IPC), message constructors, and extension→MCP content translation.src/tools.mjs— the 22-tool catalog, captured verbatim from the official server'stools/list.
Both wire protocols share the same framing (4-byte little-endian length prefix + UTF-8 JSON), so one codec serves both.
The 22 tools
tabs_context_mcp, tabs_create_mcp, tabs_close_mcp, navigate, computer (left_click/right_click/type/screenshot/wait/scroll/key/left_click_drag/double_click/triple_click/zoom/scroll_to/hover), browser_batch, read_page, find, form_input, javascript_tool, get_page_text, resize_window, read_console_messages, read_network_requests, gif_creator, upload_image, file_upload, shortcuts_list, shortcuts_execute, switch_browser, list_connected_browsers, select_browser.
Schemas are in src/tools.mjs — identical to the official server's.
Install
1. Native host (so Chrome spawns this bridge instead of the gated CLI host)
:: copy the launcher into Chrome's native-host dir
copy install\chrome-native-host-bridge.bat %USERPROFILE%\.claude\chrome\
:: repoint the manifest `path` to it (edit the JSON at)
:: %APPDATA%\Claude Code\ChromeNativeHost\com.anthropic.claude_code_browser_extension.json
:: "path": "C:\\Users\\<you>\\.claude\\chrome\\chrome-native-host-bridge.bat"The manifest name must stay com.anthropic.claude_code_browser_extension (the extension looks for that exact native-messaging host name) and allowed_origins must include chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/.
Then reload the Claude extension at chrome://extensions. Chrome spawns chrome-native-host-bridge.bat → src/native-host.mjs, which creates the IPC pipe and completes the extension handshake.
2. Permission seed (one-time, per domain)
The extension's per-domain permission gate (checkPermission) has no auth check — a stored always-allow entry short-circuits to allowed with no prompt and no login. Seed it for any domain you want to navigate/interact with:
// chrome://extensions → Claude extension → "Service Worker" → paste:
// (edit NETLOCS in scripts/seed-permission.js first)See scripts/seed-permission.js. tabs_context_mcp and tabs_create_mcp need no permission; navigate and most computer actions on a tab need the tab's netloc seeded.
3. MCP client (add this server to your MCP client)
# Claude Code example:
claude mcp add chrome-mcp-bridge -- node C:/Users/<you>/work/chrome-mcp-bridge/src/mcp-server.mjsAny MCP client that can spawn a stdio command works.
Usage / test
# offline: list the 22 tools (no bridge needed)
node test/drive-mcp-server.mjs list
# end-to-end (bridge must be up = extension reloaded):
node test/drive-mcp-server.mjs tabs # tabs_context_mcp
node test/drive-mcp-server.mjs navigate https://example.com # navigate + screenshot
node test/drive-mcp-server.mjs call computer '{"action":"screenshot","tabId":123,"save_to_disk":true}'Status
✅ MCP server
initialize+tools/list(all 22 tools, protocol2025-06-18).✅ Native host: extension handshake (
ping/get_status/mcp_connected) + IPC pipe + one-in-flight relay.✅ End-to-end
tools/callflow proven ungated (no claude.ai login):tabs_context_mcp→get_page_text→javascript_tool(javascript_exec), all relayed through the bridge.✅
javascript_execreads SPA page content thatget_page_textmisses: on acloud.tencent.comdoc page,get_page_textreturned 250 chars (marketing shell only);javascript_exec(wait +innerTextextract) returned 1011 chars including the real API-action list the SPA loads async. So for JS-rendered pages, preferjavascript_exec.Reversible: restore the manifest
pathto the originalchrome-native-host.batto return to the gated CLI host;chrome.storage.local.remove("permissionStorage")to undo the seed.
How it was reverse-engineered
See docs/protocol.md. Short version:
Tool catalog — captured verbatim from the official
claude --claude-in-chrome-mcpserver'stools/list(it's static metadata, returned even with the bridge down).Extension native-messaging protocol — reverse-engineered from the extension's service worker (
service-worker.ts-*.js,mcpPermissions-*.js):ping→pong,get_status→status_response,{type:"mcp_connected"},{type:"tool_request",method:"execute_tool",params:{client_id:"claude-code",tool,args}}↔{type:"tool_response",result:{content:[…]}}. 4-byte-LE-length-prefixed UTF-8 JSON on stdio.Gate location — proven in both binaries (see above); neither can be reused, so both are reimplemented here.
IPC protocol — our own design (we control both ends), reusing the native-messaging framing for simplicity.
License
MIT. Not affiliated with Anthropic. "Claude" and "Chrome" are trademarks of their owners. This is an independent, ungated reimplementation for authorized automation of your own browser.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/k-l-lambda/chrome-mcp-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server