chrome-mcp server
Drive your real Chrome over MCP: real logins and cookies, multi-tab automation, deny-all by default.
6 stars639 downloads/wk
Reviews
Write oneNobody has reviewed chrome-mcp yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
chrome-mcp tools (40, 2 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
auth_checkIs the tab sitting on a sign-in wall? Reads the page (URL, title, password fields, sign-in controls) and returns { authRequired, confidence, signals }. Use it after a navigate, or whenever a step fails unexpectedly, to tell "the session expired" apart from "the agent got lost". Pass failOnAuthWall:true to get an [AUTH_REQUIRED] error instead of a verdict, so a harness can bucket the run as an auth
backGo back in history.
batchwrite actionRun multiple tool calls in one request — parallel (default) or serial. Each op is { tool, args } and goes through the same policy gate, rate limit, and error handling as a direct call. In parallel mode, tab-scoped ops MUST pass an explicit tabId (the active-tab default is unsafe under concurrency). Use to drive several tabs at once (e.g. open tabs, then batch get_text across them). Cannot be neste
chrome_statusReport backend/session status: paired browser profiles and how each was named, and flags for switched-off capabilities.
clickClick an element. Target by selector, a snapshot ref, or role+name (e.g. role:"button", name:"Sign in") - the locator needs no snapshot first. trusted=true uses real OS-level input.
console_logsConsole output and uncaught errors recorded on the page (requires --enable-observers). This is how you find out WHY a page misbehaved rather than only what it looks like afterwards. Pass sinceSeq to poll for what is new, clear:true to drain.
dialogsNative dialogs (alert/confirm/prompt/beforeunload) the page raised, and how they were answered (requires --enable-observers). With observers on, dialogs are intercepted rather than left to block the renderer - which is what otherwise turns a click that opens a confirm() into a mystery TIMEOUT. Set policy:'accept' to answer confirms with true.
download_fileDownload a file by URL or from a link element.
evalEvaluate JavaScript in the page (disabled in safe-mode).
extract_linksExtract anchors from the page or a subtree. dedupe=true collapses links sharing an href (nav/footer noise); limit caps the count.
fill_formFill multiple fields (keyed by selector) and optionally submit.
forwardGo forward in history.
frames_listList the tab's frames (the top document plus every iframe the extension can reach), with each frame's id and URL. Use it when a selector that should match does not: the element is probably in one of these frames, and you can then pass frameId (or allFrames:true) to act inside it.
get_cookiesRead cookies visible to the tab's URL (or a given url).
get_htmlGet HTML of the page or an element. Output is capped (see maxBytes) and cut at a tag boundary; narrow it with `selector` rather than raising the cap when you can. Password field values are always blanked.
get_textGet visible text of the page or an element.
hoverHover over an element.
navigateNavigate a tab to a URL, REPLACING its current page. Acts on the active tab unless tabId is given — to open a site without losing the current page, use `tab_new` instead.
network_logRequests the page made - fetch and XMLHttpRequest with method, URL, status and duration (requires --enable-observers). Set includeResources:true to also list scripts/images/styles from Resource Timing (those carry timing and size but no status). Does not include the document request or headers.
pressPress a key (with optional modifiers).
print_pdfRender the page to PDF through Chrome's own print pipeline and save it to the task's results/ dir. Returns the path and size, not the bytes - a PDF is not something to spend context on.
profile_renameRename an automatically named browser profile (e.g. "profile-2" -> "work"). The name sticks across restarts; its saved artifacts move with it.
profile_useSwitch the active browser profile (identity). Subsequent downloads, results, screenshots, and the action log are stored under profiles/<name>/. Resets the active task to "default" unless you then call task_new.
read_as_markdownRead the page (or subtree) as readable markdown.
reloadReload the active (or given) tab.
screenshotCapture a screenshot (page or element). Default is JPEG (quality 70) at CSS-pixel size, which is several times smaller than PNG and reads fine. Pass format:"png" for lossless, quality 1-100 for JPEG, scale 2 for device pixels on a Retina display or 0.5 to shrink.
scrollScroll the page or to an element.
select_optionSelect option(s) of a <select> by value or visible label.
snapshotAccessibility snapshot: interactive elements with refs to target by `ref` (more reliable than guessing CSS selectors). Pass diff:true to get only what changed since the last snapshot of this tab - far cheaper in a click/read loop. Password fields appear as secret:true with no value.
storageRead/write localStorage (or sessionStorage). op: get|set|remove|clear.
tab_closeClose a tab by tabId.
tab_newOpen a NEW tab (optionally at a URL) and focus it. Prefer this over `navigate` when the user says "open"/"go to" a site — `navigate` REPLACES the current tab. Pass active:false to open in the background (used by parallel batches).
tab_selectMake a tab active by tabId.
tabs_listList open browser tabs.
task_newStart a new task (run) under the active profile. Creates profiles/<profile>/tasks/<name>/ with downloads/, results/, screenshots/ and makes it the active task so all captured artifacts land there.
task_statusReport the active profile/task and the folder paths where this run's artifacts are stored.
tasks_listList every task across all profiles under the data dir, with sizes and download counts.
typeType text into an element (target by selector, ref, or role+name). trusted=true sends real keystrokes (works on React/Vue controlled inputs).
upload_filewrite actionSet local file(s) on a file <input> (target by selector or ref) — uploads without the OS dialog. Requires --enable-uploads. `files` are absolute local paths.
wait_forWait for a selector or text to appear/disappear.
Public scan report
scanner v0.1.9 · 2026-09-23 · same rubric, same numbers if you re-run it
- Code scan91 source files scanned20/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Findings (1)
- mediumeval / new Function used
exec.evaldist/src/executor/cdp-executor.js: … }; }); } async eval(expression, opts) { return this.…
What the publisher says
From the chrome-mcp repository's README, as published. We do not edit it. Read it on GitHub
chrome-mcp
Let Claude use the Chrome you are already logged into. Not a fresh automated browser that greets every site as a stranger — your Chrome, with your sessions, your cookies, your 2FA already done. If you can see a page in your browser, your agent can read it, without logging in again and without pasting credentials anywhere.
Most browser MCP servers launch their own Chromium and hand your agent a signed-out window. chrome-mcp does the opposite: an MV3 extension dials into a localhost WebSocket server and drives the browser you already have open, through chrome.scripting/chrome.tabs. Works with Claude Code, Claude Desktop, and any other MCP host.
Distributed as an npx CLI (the MCP server) plus a load-unpacked extension.
This build is extension-only. It never launches or attaches a Chromium of
its own, so the extension is required, not optional — without it, no tool
can run. The CDP flags (--cdp-fallback, --no-cdp-fallback, --cdp-endpoint,
--prefer) are still accepted for back-compat but are ignored.
Full design: docs/BLUEPRINT.md — architecture, wire
protocol, the complete tool surface, the extension manifest, the security
model, and the phased build plan.
Quickstart
Up and running in one paste
Hand this to your AI agent (Claude Code, Cursor, Windsurf, anything MCP) and it installs the server, wires it into the client, and walks you through the two steps that must happen inside Chrome:
Set up chrome-mcp on this machine by fetching and following
https://raw.githubusercontent.com/Mehmoodqureshi/chrome-mcp/main/SETUP.md
exactly, step by step. Work autonomously and verify each step.Prefer to read before you run an agent on your machine? SETUP.md is the exact file the agent follows. The manual steps are below.
1. Register the MCP server with your host.
Claude Code (terminal) — one command, no config file to find
claude mcp add chrome-mcp -s user -- \
npx -y @mehmoodqureshi/chrome-mcp \
--allow-domain example.com --enable-mutations --persist-tokenEverything before -- belongs to Claude Code; everything after it is this server's command and flags. Keep the -- or --allow-domain gets read as a Claude Code option.
-s user registers it for every project on your machine. Use -s local (the default) for just the current project, or -s project to write a .mcp.json your team can commit.
Check it came up with claude mcp list. After upgrading the server, reconnect it with /mcp inside a session — no restart needed.
Claude Desktop and other MCP hosts — JSON config
{
"mcpServers": {
"chrome-mcp": {
"command": "npx",
"args": ["-y", "@mehmoodqureshi/chrome-mcp",
"--allow-domain", "example.com", "--enable-mutations",
"--persist-token"]
}
}
}By default everything is deny-all (no domains, no eval, no mutations). Grant exactly what you need with --allow-domain (repeatable), --enable-mutations, --enable-downloads, --enable-uploads, --unsafe-enable-eval, or --unsafe-all-domains.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y @mehmoodqureshi/chrome-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add chrome-mcp -- npx -y @mehmoodqureshi/chrome-mcp
chrome-mcp: common questions
- Is chrome-mcp server safe?
- Yes, by our scan: it is graded A (85/100). Read the chrome-mcp safety report
- How do I install chrome-mcp?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does chrome-mcp need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is chrome-mcp maintained?
- The last commit was in the last day (2026-09-23). The latest release is v0.9.11.
- What can I use instead of chrome-mcp?
- Servers from other publishers that do the same job: DOMShell MCP server, Smart Connections MCP server and Ridealong MCP server. Compare all chrome-mcp alternatives.
Alternatives to chrome-mcp
Same job from other publishers: the closest match first, then the best rated.
DOMShellDrive Chrome with filesystem commands (ls, cd, grep, click, type). One MCP tool, multi-agent.not reviewedGrowingA- Smart ConnectionsLocal semantic search over Obsidian vaults via Smart Connections embeddings. Multi-vault, private.not reviewedGrowingA
- RidealongWatch your AI drive a real Chrome live, point, approve, or take the wheel from your phone.not reviewedGrowingA
- ArgentDrive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agentnot reviewedWidely usedA
MindwtrTask and project automation for local and self-hosted Mindwtr Cloud data; read-only by default.not reviewedEstablishedA