{
  "markdown": "# zendriver-mcp\n\n<!-- mcp-name: io.github.bituq/zendriver-mcp -->\n\n**Undetectable browser automation for LLM agents, spoken over MCP.**\n\n`zendriver-mcp` is an [MCP](https://modelcontextprotocol.io) server that gives\nyour coding agent (Claude, Cursor, Gemini, Copilot) a real Chrome browser it\ncan actually use on the real web - behind Cloudflare, behind login walls, on\npages that detect and block WebDriver.\n\nIt's built on [Zendriver](https://github.com/cdpdriver/zendriver), which speaks\nthe Chrome DevTools Protocol directly instead of going through WebDriver. That\nmeans no `navigator.webdriver` flag, no headless telltales, and a fingerprint\nthat looks like an ordinary Chrome install.\n\nOn top of that foundation, `zendriver-mcp` layers everything an agent needs\nto get work done: a token-efficient DOM walker, an accessibility tree with\nstable uids, performance traces, Lighthouse audits, heap snapshots, human-like\ninput, device emulation, cookie round-tripping, and more - **96 tools across\n22 modules**.\n\n## Highlights\n\n- **Undetectable by design.** Zendriver keeps a clean fingerprint; we ship a\n  Cloudflare Turnstile solver, identity overrides (UA, locale, timezone,\n  geolocation), and bezier-curve mouse movement plus gaussian typing timing.\n- **Token-efficient DOM.** Two ways to see the page - the upstream DOM walker\n  that reports 96% fewer tokens than raw HTML, and a CDP accessibility tree\n  keyed by stable uids that survive re-renders.\n- **Full DevTools parity.** Performance traces that load in Chrome DevTools,\n  heap snapshots in the standard `.heapsnapshot` format, Lighthouse audits\n  via the Lighthouse CLI reusing the same browser.\n- **Session round-tripping.** Export all cookies (including HTTP-only ones)\n  to JSON, re-import on the next session. Log in once, reuse everywhere.\n- **Emulation.** iPhone 15 Pro, Pixel 8, iPad Pro, and desktop presets; CPU\n  throttling; Slow 3G / Fast 3G / 4G / offline network profiles; force\n  `prefers-color-scheme`.\n- **Screencasts.** Write frames to disk as JPEG or PNG at configurable FPS.\n\n## Tool catalogue\n\n| Module | Tools |\n|---|---|\n| `browser` | start, stop, status |\n| `navigation` | navigate, back, forward, reload, page info |\n| `tabs` | new / list / switch / close |\n| `elements` | click, type, clear, focus, select, upload |\n| `query` | find element(s), text, attributes, buttons, inputs |\n| `content` | HTML, text, interaction tree, scroll |\n| `storage` | cookies (document.cookie), localStorage |\n| `logging` | network + console logs, wait-for-request |\n| `forms` | fill form, submit, key press, mouse click |\n| `utils` | screenshot, execute JS, wait, security audit |\n| `stealth` | Cloudflare bypass, UA / locale / timezone / geolocation overrides |\n| `humanlike` | human_click, human_type, estimated_typing_duration |\n| `emulation` | viewport, device presets, CPU + network throttle, media |\n| `devtools` | start/stop trace, take heap snapshot |\n| `lighthouse` | run audit, check CLI availability |\n| `screencast` | start / stop (writes frame directory) |\n| `accessibility` | AX snapshot with stable uids, click_by_uid, describe_uid |\n| `cookies` | export / import / list / clear (CDP-level, all origins) |\n| `network_control` | block URLs, extra headers, bypass service worker |\n| `permissions` | grant / reset, list names |\n| `proxy` | configure / clear (restarts browser with proxy args) |\n| `interception` | mock_response, fail_requests, list, stop |\n| `screencast` | + export_screencast_mp4, check_ffmpeg_available |\n\nFull signatures live in the docstrings of `src/tools/*.py` and are auto-listed\nby the MCP handshake.\n\n## Install\n\nPublished on PyPI: <https://pypi.org/project/zendriver-mcp/>.\n\nRequires Python 3.10+ and a Chrome / Chromium install.\n\n```sh\n# Zero-setup, re-resolves on every run - great for Claude Desktop configs\nuvx zendriver-mcp\n\n# Or install once, invoke many\nuv tool install zendriver-mcp\npipx install zendriver-mcp\npip install zendriver-mcp\n```\n\n## Use with Claude Desktop / Claude Code\n\n```json\n{\n  \"mcpServers\": {\n    \"zendriver\": {\n      \"command\": \"uvx\",\n      \"args\": [\"zendriver-mcp\"]\n    }\n  }\n}\n```\n\nNo clone, no `--directory`, no absolute path. If you prefer a permanent\ninstall instead, swap ``\"command\": \"uvx\"`` for ``\"command\": \"zendriver-mcp\"``\nafter running ``uv tool install zendriver-mcp``.\n\n### Development checkout\n\nWorking on `zendriver-mcp` itself? Clone + `uv sync`, then point your MCP\nclient at the checkout:\n\n```json\n{\n  \"mcpServers\": {\n    \"zendriver\": {\n      \"command\": \"uv\",\n      \"args\": [\"--directory\", \"/absolute/path/to/zendriver-mcp\", \"run\", \"zendriver-mcp\"]\n    }\n  }\n}\n```\n\nOptional flags on the CLI:\n\n- `--browser-path /path/to/chrome` - point at a specific Chrome binary\n- `--transport stdio` - only stdio for now; SSE/HTTP arrive when upstream\n  `mcp` ships stable support\n\n## The 30-second tour\n\n```python\n# Ask the browser to start, log in once, save the session.\nawait start_browser()\nawait navigate(\"https://example.com/login\")\nawait fill_form({\"#email\": \"me@me.com\", \"#pw\": \"...\"})\nawait export_cookies(\"~/sessions/example.json\")\n\n# Next run: skip the login entirely.\nawait start_browser()\nawait import_cookies(\"~/sessions/example.json\")\nawait navigate(\"https://example.com/dashboard\")\n\n# Get an accessibility snapshot, click by stable uid.\nsnap = await get_accessibility_snapshot()\nawait click_by_uid(\"ax_1b2c3d4e\")\n\n# Record a performance trace while you click around.\nawait start_trace()\nawait human_click(selector=\"#buy-now\")\nawait stop_trace(\"/tmp/buy-flow.json\")   # loads in Chrome DevTools\n\n# Run Lighthouse against the current browser.\nawait run_lighthouse(\"https://example.com\", form_factor=\"mobile\")\n```\n\n## Token-optimised DOM walker\n\nThe interaction tree emits compact rows like\n`{\"id\": 1, \"t\": \"btn\", \"l\": \"Search\", \"r\": \"hdr\"}`:\n\n- **Compact keys**: `t` (type), `l` (label), `r` (region)\n- **Smart labels**: inferred from `aria-label`, `aria-labelledby`, associated\n  `<label>`, `placeholder`, text, `title`, `alt`\n- **Noise filtering**: SVG internals, nested interactive children skipped\n- **Region tagging**: `hdr`, `nav`, `main`, `side`, `ftr`, `dlg`\n- **Type compression**: `button` -> `btn`, `checkbox` -> `chk`, etc.\n\nReported reduction on perplexity.ai: ~96% fewer tokens than raw HTML (~11k ->\n~400).\n\nFor flows that span multiple actions, prefer `get_accessibility_snapshot` +\n`click_by_uid` - the uids stay valid as long as the underlying backend node\nsurvives, even across re-renders.\n\n## Development\n\n```sh\nuv sync\nuv run ruff check .\nuv run ruff format --check .\nuv run mypy src\nuv run pytest\n```\n\nCI runs the same four on every push and PR.\n\n## Roadmap\n\nEverything on the original roadmap shipped in the 0.2 / 0.3 releases:\n\n- [x] Stealth: Cloudflare solver, UA / locale / timezone / geolocation\n- [x] Human-like input: bezier mouse paths, gaussian keystroke timing\n- [x] DevTools parity: traces, heap snapshots, Lighthouse\n- [x] Screencast + mp4 export via ffmpeg\n- [x] Accessibility tree with stable uids\n- [x] Cookie import/export, blocking, extra headers, permissions\n- [x] Request interception + response mocking (`Fetch.enable`)\n- [x] Proxy configuration (restart with `--proxy-server`)\n- [x] `ToolResponse` envelope adopted in rich-output tools\n- [x] PyPI publish workflow (Trusted Publishing)\n\nDocumentation site: **<https://bituq.github.io/zendriver-mcp/>**\n\nWhat's next is driven by actual usage. Ideas on deck:\n\n- Per-request proxy routing via Fetch interception\n- Binary body support in `mock_response`\n- `Fetch.enable` with patterns (faster than our \"match all then filter\")\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n\n## Acknowledgements\n\n- [Zendriver](https://github.com/cdpdriver/zendriver) does the heavy lifting\n  underneath.\n- The token-optimised DOM walker and the original 49-tool foundation come from\n  [ShubhamChoulkar/Zendriver-MCP](https://github.com/ShubhamChoulkar/Zendriver-MCP).\n  This project started as a fork and has since grown its own identity and\n  feature set.\n",
  "bytes": 7983,
  "sha": "606037d69b487c09e6b4a9d3a4dad5330ceb540bc8b58d2345fb7d4d0c78f6d5",
  "repo_slug": "bituq/zendriver-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_bituq_zendriver_mcp_015850c2/readme"
}