Let Claude use the Chrome you are already logged into.
Not a fresh browser that greets every site as a stranger. Your Chrome, your sessions, your 2FA already done. An MCP server plus an extension, 40 tools, deny-all until you say otherwise.
claude mcp add chrome-mcp -s user -- \
npx -y @mehmoodqureshi/chrome-mcp \
--allow-domain example.com --enable-mutations --persist-token- Works with
- Claude Code
- Claude Desktop
- Cursor
- Windsurf
- any MCP host
- tabs_list
- 4 tabsadmin.shop.example is already signed in
- snapshot { diff: true }
- 12 interactive nodesbutton "Export CSV" ref=e7
- click { ref: "e7" }
- okdownload saved to results/orders.csv
- batch { ops: [tab_new, tab_new, tab_new] }
- 3 tabs opened418 ms, policy: allowed
- batch { ops: [read_as_markdown x3] }
- 3 pages41 KB, 0 secrets scrubbed
Why
Why a real browser
Most browser MCP servers launch their own Chromium and hand your agent a signed-out window. chrome-mcp does the opposite.
Your sessions, not a stranger’s
Drives the Chrome you already have open. Logged-in dashboards, admin panels and CRMs work with no credentials in any config file and no 2FA to redo.
Deny-all by default
Empty domain allowlist, eval off, downloads off, mutations off. You name the domains and the capabilities; everything else is refused before it reaches the page.
Real multi-tab concurrency
One batch call fans out across tabs, in parallel or in series, with per-tab serialisation so nothing races. Wall-clock is the slowest tab, not the sum.
Snapshots the model can act on
An accessibility snapshot with stable refs, or a diff of what changed since the last one. Target elements by role and name without guessing CSS selectors.
See why a page broke
Console output, network requests and native dialogs are captured, so the agent learns what happened rather than only what the page looks like afterwards.
An audit trail you can read
Every call lands in history.jsonl with the URL, the policy verdict, duration, bytes returned and secrets scrubbed. Password values are always blanked.
See it run
A real run, not a demo reel
One task folder, ten review sites, thirty tabs at a time. Every page it reads lands in results/ with its URL, every action lands in the log, and nothing was typed by hand. Recorded on a normal Chrome window with the extension paired.
Read the guidesBatch
Thirty tabs, one call
Open the pages in the background, then read them all at once. Each sub-op goes through the same policy gate, rate limit and error envelope as a direct call. Parallel ops must name their tab, so nothing is ever mis-routed.
Read the batch guide{ "name": "batch", "arguments": { "ops": [
{ "tool": "tab_new", "args": { "url": "https://a.example/p" } },
{ "tool": "tab_new", "args": { "url": "https://b.example/p" } },
{ "tool": "tab_new", "args": { "url": "https://c.example/p" } }
]}}
{ "name": "batch", "arguments": { "ops": [
{ "tool": "read_as_markdown", "args": { "tabId": "<a>" } },
{ "tool": "read_as_markdown", "args": { "tabId": "<b>" } },
{ "tool": "read_as_markdown", "args": { "tabId": "<c>" } }
]}}Setup
Three steps, then it stays paired
- 01
Register the server
One command in Claude Code, or a five-line JSON block in any other MCP host. npx fetches the package; nothing else to install.
- 02
Add the extension
Install it from the Chrome Web Store in one click, or load the plain folder the server drops in your home directory via chrome://extensions.
- 03
It pairs itself
The server writes a 0600 pairing file into that folder. The badge turns green. Your agent now has the tools.
MCP host (Claude Code / Desktop / Cursor)
| JSON-RPC over stdio
v
npx @mehmoodqureshi/chrome-mcp policy gate, rate limit, audit log
| localhost WebSocket, per-boot 256-bit token
v
MV3 extension chrome.scripting / chrome.tabs
|
v
your Chrome, your sessionsTools
40 tools, generated from the source
The reference is built from the same catalog the server advertises, so it cannot drift from what your agent sees.
Tabs
4Open, list, focus and close tabs in the real Chrome window.
tabs_list tab_new tab_select tab_close
Navigation
5Move a tab between pages and wait for the page to settle.
navigate back forward reload wait_for
Interaction
8Click, type, select and scroll. Target by CSS selector, snapshot ref, or role and accessible name.
click type select_option press hover scroll fill_form upload_file
Reading
8Get the page back as text, markdown, HTML, an accessibility snapshot, a screenshot or a PDF.
snapshot get_text read_as_markdown get_html extract_links screenshot print_pdf frames_list
State and scripting
4Cookies, storage, downloads and JavaScript evaluation.
get_cookies storage download_file eval
Observers
3Console output, network requests and native dialogs. Requires --enable-observers.
console_logs network_log dialogs
Session and artifacts
6Backend status, sign-in wall detection, and where downloads, results and screenshots are stored.
chrome_status auth_check profile_use task_new tasks_list task_status
Batch
1Run many tool calls in one request, in parallel or in series.
batch
Other
1Tools not yet categorised.
profile_rename
Security
Nothing is allowed until you allow it
The allowlist decides which pages may be read. Password values are always blanked. --redact scrubs JWTs, cloud keys and bearer tokens before the output cap, so a truncated read cannot leak what a full one would hide. The pairing token is 0600 on disk and the server fails closed if it is not.