zendriver-mcp
Provides Cloudflare Turnstile solver to bypass anti-bot challenges, enabling undetectable browsing on sites protected by Cloudflare.
Allows exporting screencast frame sequences to MP4 video files via FFmpeg, enabling recording of browser sessions.
Enables running Lighthouse audits (performance, accessibility, SEO) against the current page or a specified URL, using the undetectable browser.
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., "@zendriver-mcpGo to example.com, log in, and export cookies"
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.
zendriver-mcp
Undetectable browser automation for LLM agents, spoken over MCP.
zendriver-mcp is an MCP server that gives
your coding agent (Claude, Cursor, Gemini, Copilot) a real Chrome browser it
can actually use on the real web - behind Cloudflare, behind login walls, on
pages that detect and block WebDriver.
It's built on Zendriver, which speaks
the Chrome DevTools Protocol directly instead of going through WebDriver. That
means no navigator.webdriver flag, no headless telltales, and a fingerprint
that looks like an ordinary Chrome install.
On top of that foundation, zendriver-mcp layers everything an agent needs
to get work done: a token-efficient DOM walker, an accessibility tree with
stable uids, performance traces, Lighthouse audits, heap snapshots, human-like
input, device emulation, cookie round-tripping, and more - 96 tools across
22 modules.
Highlights
Undetectable by design. Zendriver keeps a clean fingerprint; we ship a Cloudflare Turnstile solver, identity overrides (UA, locale, timezone, geolocation), and bezier-curve mouse movement plus gaussian typing timing.
Token-efficient DOM. Two ways to see the page - the upstream DOM walker that reports 96% fewer tokens than raw HTML, and a CDP accessibility tree keyed by stable uids that survive re-renders.
Full DevTools parity. Performance traces that load in Chrome DevTools, heap snapshots in the standard
.heapsnapshotformat, Lighthouse audits via the Lighthouse CLI reusing the same browser.Session round-tripping. Export all cookies (including HTTP-only ones) to JSON, re-import on the next session. Log in once, reuse everywhere.
Emulation. iPhone 15 Pro, Pixel 8, iPad Pro, and desktop presets; CPU throttling; Slow 3G / Fast 3G / 4G / offline network profiles; force
prefers-color-scheme.Screencasts. Write frames to disk as JPEG or PNG at configurable FPS.
Related MCP server: Airbrowser
Tool catalogue
Module | Tools |
| start, stop, status |
| navigate, back, forward, reload, page info |
| new / list / switch / close |
| click, type, clear, focus, select, upload |
| find element(s), text, attributes, buttons, inputs |
| HTML, text, interaction tree, scroll |
| cookies (document.cookie), localStorage |
| network + console logs, wait-for-request |
| fill form, submit, key press, mouse click |
| screenshot, execute JS, wait, security audit |
| Cloudflare bypass, UA / locale / timezone / geolocation overrides |
| human_click, human_type, estimated_typing_duration |
| viewport, device presets, CPU + network throttle, media |
| start/stop trace, take heap snapshot |
| run audit, check CLI availability |
| start / stop (writes frame directory) |
| AX snapshot with stable uids, click_by_uid, describe_uid |
| export / import / list / clear (CDP-level, all origins) |
| block URLs, extra headers, bypass service worker |
| grant / reset, list names |
| configure / clear (restarts browser with proxy args) |
| mock_response, fail_requests, list, stop |
| + export_screencast_mp4, check_ffmpeg_available |
Full signatures live in the docstrings of src/tools/*.py and are auto-listed
by the MCP handshake.
Install
Published on PyPI: https://pypi.org/project/zendriver-mcp/.
Requires Python 3.10+ and a Chrome / Chromium install.
# Zero-setup, re-resolves on every run - great for Claude Desktop configs
uvx zendriver-mcp
# Or install once, invoke many
uv tool install zendriver-mcp
pipx install zendriver-mcp
pip install zendriver-mcpUse with Claude Desktop / Claude Code
{
"mcpServers": {
"zendriver": {
"command": "uvx",
"args": ["zendriver-mcp"]
}
}
}No clone, no --directory, no absolute path. If you prefer a permanent
install instead, swap "command": "uvx" for "command": "zendriver-mcp"
after running uv tool install zendriver-mcp.
Development checkout
Working on zendriver-mcp itself? Clone + uv sync, then point your MCP
client at the checkout:
{
"mcpServers": {
"zendriver": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/zendriver-mcp", "run", "zendriver-mcp"]
}
}
}Optional flags on the CLI:
--browser-path /path/to/chrome- point at a specific Chrome binary--transport stdio- only stdio for now; SSE/HTTP arrive when upstreammcpships stable support
The 30-second tour
# Ask the browser to start, log in once, save the session.
await start_browser()
await navigate("https://example.com/login")
await fill_form({"#email": "me@me.com", "#pw": "..."})
await export_cookies("~/sessions/example.json")
# Next run: skip the login entirely.
await start_browser()
await import_cookies("~/sessions/example.json")
await navigate("https://example.com/dashboard")
# Get an accessibility snapshot, click by stable uid.
snap = await get_accessibility_snapshot()
await click_by_uid("ax_1b2c3d4e")
# Record a performance trace while you click around.
await start_trace()
await human_click(selector="#buy-now")
await stop_trace("/tmp/buy-flow.json") # loads in Chrome DevTools
# Run Lighthouse against the current browser.
await run_lighthouse("https://example.com", form_factor="mobile")Token-optimised DOM walker
The interaction tree emits compact rows like
{"id": 1, "t": "btn", "l": "Search", "r": "hdr"}:
Compact keys:
t(type),l(label),r(region)Smart labels: inferred from
aria-label,aria-labelledby, associated<label>,placeholder, text,title,altNoise filtering: SVG internals, nested interactive children skipped
Region tagging:
hdr,nav,main,side,ftr,dlgType compression:
button->btn,checkbox->chk, etc.
Reported reduction on perplexity.ai: ~96% fewer tokens than raw HTML (~11k -> ~400).
For flows that span multiple actions, prefer get_accessibility_snapshot +
click_by_uid - the uids stay valid as long as the underlying backend node
survives, even across re-renders.
Development
uv sync
uv run ruff check .
uv run ruff format --check .
uv run mypy src
uv run pytestCI runs the same four on every push and PR.
Roadmap
Everything on the original roadmap shipped in the 0.2 / 0.3 releases:
Stealth: Cloudflare solver, UA / locale / timezone / geolocation
Human-like input: bezier mouse paths, gaussian keystroke timing
DevTools parity: traces, heap snapshots, Lighthouse
Screencast + mp4 export via ffmpeg
Accessibility tree with stable uids
Cookie import/export, blocking, extra headers, permissions
Request interception + response mocking (
Fetch.enable)Proxy configuration (restart with
--proxy-server)ToolResponseenvelope adopted in rich-output toolsPyPI publish workflow (Trusted Publishing)
Documentation site: https://bituq.github.io/zendriver-mcp/
What's next is driven by actual usage. Ideas on deck:
Per-request proxy routing via Fetch interception
Binary body support in
mock_responseFetch.enablewith patterns (faster than our "match all then filter")
License
MIT. See LICENSE.
Acknowledgements
Zendriver does the heavy lifting underneath.
The token-optimised DOM walker and the original 49-tool foundation come from ShubhamChoulkar/Zendriver-MCP. This project started as a fork and has since grown its own identity and feature set.
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
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/bituq/zendriver-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server