chrome-mcp
A Model Context Protocol server for browser automation, powered by DrissionPage.
Lets MCP clients (Claude Desktop, Claude Code, Cursor, etc.) drive a real Chromium browser through a minimal 8-tool surface — all sharing one "current tab" pointer.
Why
- Zero learning curve for agents. Facade tools (
execute_js,run_cdp,navigate,capture) speak only universal knowledge — JavaScript, the CDP protocol, URLs. No niche-library syntax required for the 90% cases. - Full power underneath.
run_drission_codeis the complete-capability base: execute DrissionPage Python code in-process withpage/browser/context(persistent dict) /switch_tab()/tabs()/relaunch()injected — loops, waits, multi-tab orchestration, anything one tool call can't express. - One pointer, always in sync. Switch tabs via DrissionPage code or
Target.createTarget/Target.activateTargetCDP commands — every tool follows. (Call tools serially per session; the shared pointer is not concurrency-safe.) - Multi-instance safe. Per-process isolation (atomic port allocation via
socket.bind+ PID/UUID private user-data dirs) — spawn N servers, zero conflicts. - Self-documenting.
get_manualreturns a compact built-in cheat sheet (DrissionPage locator syntax, error-prone CDP recipes, capture workflow, launch options) — agents fetch it on demand, zero token cost otherwise.
Installation
uv tool install chrome-mcp
# or
uvx chrome-mcp
# or
pip install chrome-mcp
Requires Python ≥ 3.10 and a local Chromium-based browser.
Usage
Add to your MCP client config (e.g. claude_desktop_config.json). Two equivalent forms:
{
"mcpServers": {
"chrome": {
"command": "chrome-mcp"
}
}
}
Or run on the fly with uvx (no install needed):
{
"mcpServers": {
"chrome": {
"command": "uvx",
"args": ["chrome-mcp"]
}
}
}
A typical agent flow:
navigate("https://httpbin.org/get") → returns tab list
execute_js("return document.body.innerText") → page data as JSON
capture(action="start", url_filter="api/")
... trigger requests ...
capture(action="get") → overview inline,
full bodies in $TMPDIR/chrome-mcp-captures/*.json
Tools
| Tool | Description |
|---|---|
navigate |
Navigate in current tab, or open a new tab (new_tab) and switch the pointer to it. Returns the full tab list |
execute_js |
Run JavaScript in the current tab (must return the result). preset: "dom_tree" outputs a DOM structure tree without writing the template |
run_cdp |
Raw CDP passthrough to the current tab. Target.createTarget / activateTarget auto-switch the pointer — no attachToTarget needed |
run_drission_code |
Full-capability base: execute DrissionPage Python code with injected page/browser/context/switch_tab()/tabs()/relaunch()/get_browser() |
capture |
Network capture in one tool: action = start / get / stop. Overview returned inline; full data (with bodies) saved to $TMPDIR/chrome-mcp-captures/capture_*.json |
get_manual |
Return the built-in authoring manual (locator syntax, CDP recipes, capture workflow, launch options) |
get_browser |
Instance management: no args = ensure an instance is ready (starts one if absent); cdp = attach to an already-running browser (login state preserved; hard error if unreachable — never falls back to launching); any launch option = rebuild with new params (destructive, same semantics as relaunch) |
close_browser |
Close the browser instance |
Launch options
Customize browser startup via command-line args:
{
"mcpServers": {
"chrome": {
"command": "chrome-mcp",
"args": ["--headless", "--proxy", "http://127.0.0.1:7890", "--arg", "--lang=zh-CN"]
}
}
}
| Arg | Description |
|---|---|
--headless |
Run browser headless |
--proxy URL |
Proxy server |
--user-agent UA |
Custom User-Agent |
--user-data PATH |
User data dir to reuse login state. ⚠️ Conflicts if your system Chrome is using the same profile |
--browser-path PATH |
Path to a specific browser binary |
--incognito |
Incognito mode |
--no-imgs |
Don't load images. ⚠️ May be ignored by recent Chrome versions — reliable alternative: run_cdp("Network.setBlockedURLs", {"urls": ["*.png", "*.jpg"]}) |
--arg ARG |
Pass through any Chrome flag (repeatable) |
Options can also be changed mid-session (destructive, restarts the browser) from inside run_drission_code:
return relaunch(headless=True, user_agent="Mozilla/5.0 ...")
The get_browser tool exposes the same options (plus cdp) at the tool level — e.g. get_browser(cdp="127.0.0.1:9222") takes over your logged-in browser; get_browser(user_data=...) rebuilds with a given profile.
Testing
8 scenario suites run against the real MCP stdio protocol (each spawns an independent server + headless browser — itself a multi-instance concurrency test):
uv run python tests/run_all.py # full regression
uv run python tests/run_all.py --only smoke,c
Covers: data extraction (DOM tree/pagination/iframes), form interaction (DP actions + CDP input sequences), network capture (filters/timing traps/body fidelity), multi-tab pointer consistency, CDP capabilities (screenshots/emulation/cookies), lifecycle (relaunch/kill-recovery), and real-site scenarios (httpbin/TLS).
License
Release files for chrome-mcp 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chrome_mcp-0.3.0.tar.gz | 73.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chrome_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 111.0 kB
Release files / chrome_mcp-0.3.0.tar.gz
| Download URL | chrome_mcp-0.3.0.tar.gz |
|---|---|
| Size | 73.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
32c010fdf47df6df7928806190f1a1445a7a2bf080c322cf79a1dea5c6334e03
|
|
BLAKE2b-256 checksum How to use checksums |
35db53fc0d02e87058361d6c22f04df8abd3bbd31bd97d2aa3ae262244639220
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / chrome_mcp-0.3.0-py3-none-any.whl
| Download URL | chrome_mcp-0.3.0-py3-none-any.whl |
|---|---|
| Size | 37.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e86e644632aa9c4504f731d0ee8e6748073fe6c7252f3b34d2f10274722bcc1a
|
|
BLAKE2b-256 checksum How to use checksums |
5493849903de7136d9df2bd749503d6e49bbde0485e5fc43ea9f6c0d75d6e6ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|