Chrome MCP
Provides tools to control Google Chrome: list tabs, navigate, take snapshots, click, type, screenshot, and evaluate JavaScript in a live Chrome browser with your real profile.
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 MCPlist my open tabs"
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
Connect AI coding assistants (Cursor, Claude Code, and any MCP-compatible client) to your live Google Chrome browser over the Model Context Protocol. Your agent can list tabs, navigate, snapshot the page, click, type, screenshot, and evaluate JavaScript in your real profile — cookies, logins, and extensions intact.
Unlike headless-browser MCPs, this drives the Chrome you already use, via a Manifest V3 extension and chrome.debugger (CDP). Multiple MCP clients (e.g. Cursor and Claude Code) share one browser connection through a per-machine Connection Hub.
Architecture
Cursor / Claude Code ──stdio MCP──▶ chrome-mcp (per session)
│ IPC (Unix socket / Windows named pipe)
▼
Connection Hub (chrome-mcp-hub, one per machine)
│ WebSocket ws://127.0.0.1:17321
▼
Chrome Extension (MV3 service worker)
│ chrome.debugger (CDP)
▼
Your Google Chromepackages/shared— wire protocol v1, error codes, IPC transport, config, policy.packages/hub—chrome-mcp-hub: holds the single WebSocket to the extension and multiplexes MCP sessions.packages/mcp-server—chrome-mcp: the stdio MCP server that registers the 10 browser tools.apps/chrome-extension— the MV3 extension (CDP adapter + pairing popup).
Related MCP server: Chrome DevTools MCP
Tools
browser_list_tabs, browser_activate_tab, browser_navigate, browser_snapshot, browser_click, browser_type, browser_screenshot, browser_evaluate, browser_wait_for, browser_subscribe.
Quickstart
1. Build
pnpm install
pnpm buildexFAT / removable drives: pnpm symlinks fail on exFAT. This repo's
.npmrcalready setsnode-linker=hoisted,inject-workspace-packages=true, andpackage-import-method=copy.pnpm buildrunsscripts/sync-workspace-deps.mjsto copy the built@chrome-mcp/sharedintonode_modules(no symlinks).
2. Load the Chrome extension
Open
chrome://extensions.Enable Developer mode (top right).
Click Load unpacked and select
apps/chrome-extension/dist.
3. Start the hub
node packages/hub/dist/cli.js start
# or, once published: npx chrome-mcp-hub startIt prints a pairing token and listens on ws://127.0.0.1:17321 + the platform IPC socket. Leave it running.
4. Configure your MCP client
Copy the matching example from examples/:
Claude Code →
.mcp.json(project) — seeexamples/claude-code.mcp.jsonCursor →
.cursor/mcp.json— seeexamples/cursor.mcp.jsonWindows → use the
cmd /cwrapper — seeexamples/windows-cmd-wrapper.jsonLocal (pre-publish) → point at the built CLI — see
examples/local-dev.mcp.json
5. Pair the extension
Click the Chrome MCP extension icon.
Paste the pairing token from the hub output.
Check Approve this connection and click Save & Connect.
The status dot turns green when connected.
Your agent can now control Chrome. Try: "list my tabs, navigate to http://localhost:3000, and take a snapshot."
Security
Localhost only. All listeners bind to
127.0.0.1. Nothing is exposed externally.Pairing required by default; the extension must present the hub's token (rejected with close code 4001 otherwise).
URL allowlist, enforced on both the server and the extension. Defaults permit only
localhost/127.0.0.1.file://,chrome://, andchrome-extension://are always blocked unless explicitly allowlisted.New-origin prompt. When an agent hits an unlisted origin, the popup offers Allow / Deny (configurable via
promptForNewOrigins).Incognito tabs are excluded by default.
Configure via ~/.chrome-mcp/config.json (hot-reloaded within ~2s) or the extension popup. Example:
{
"policy": {
"allowedUrlPatterns": ["http://localhost:*", "https://*.mycompany.dev/*"],
"enforceAllowlist": true,
"promptForNewOrigins": true
}
}Troubleshooting
Symptom | Cause | Fix |
Every tool returns | Hub not running, or extension not paired | Run |
| DevTools is open on that tab (only one debugger per tab) | Close DevTools on the tab, or target a different tab |
Extension shows "Disconnected" and won't reconnect | Wrong/rotated pairing token | Copy the current token from the hub output into the popup and re-approve |
| The page changed or navigated; refs are ephemeral | Re-run |
| Origin not in the allowlist | Approve it in the popup, or add a pattern to |
| npx not resolved directly | Use the |
MCP client shows protocol/parse errors | Something wrote to stdout | The server logs only to stderr by design; check for a stray |
Hub | Stale socket after a crash (POSIX) | Delete |
Development
pnpm test # run the full Vitest suite (shared, hub, mcp-server, extension)
pnpm typecheck # tsc --noEmit across packages
pnpm lint # ESLint 9 (bans stdout writes in the MCP server)Scope (MVP)
Chrome stable only; stdio MCP transport only; chrome.debugger (no Puppeteer/Playwright at runtime); sideloaded extension. HTTP/SSE transport, cross-origin iframe targeting, and Chrome Web Store publishing are deferred. See openspec/changes/chrome-mcp/ for the full spec and TDD.md for the technical design.
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/crimSun-dev/crimSun-chrome-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server