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
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| chrome_mcp-0.3.0.tar.gz | 73.3 kB | Without provenance | Details for chrome_mcp-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| chrome_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for chrome_mcp-0.3.0-py3-none-any.whl |
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}
|
Security for chrome-mcp 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.