SkillAgentSearch skills...

nodriver-mcp-server

Undetected browser automation MCP server - a stealth, anti-bot-resistant alternative to chrome-devtools-mcp for Claude, Cursor and AI agents. Powered by nodriver (bypasses Cloudflare/WebDriver detection). 65 tools, plus several isolated browsers at once so parallel agents never share a session.

Install / Use

claude mcp add andresolbach -- npx -y github:andresolbach/nodriver-mcp-server

If the server publishes to npm under a different name, use that package instead — check the repo README.

About this skill
🔌

MCP Server

Model Context Protocol server

Quality Score

83/100

Category

Automation

Supported Platforms

Claude Code
Claude Desktop
Cursor
<p align="center"> <img src="https://raw.githubusercontent.com/andresolbach/nodriver-mcp-server/main/assets/logo.png" alt="nodriver-mcp-server — undetected browser automation MCP server" width="130" height="130"> </p>

nodriver-mcp-server

<!-- mcp-name: io.github.andresolbach/nodriver-mcp-server -->

An undetected, anti-bot-resistant browser automation MCP server — a drop-in, stealth alternative to chrome-devtools-mcp for AI agents like Claude, Claude Code, Cursor, Windsurf, and any Model Context Protocol client. Powered by nodriver so your agent can browse, scrape, and automate real Chrome without tripping Cloudflare, hCaptcha, or WebDriver fingerprint detection.

PyPI CI License: MIT Python 3.12+ MCP compatible Tools: 65 Stars

Keywords: MCP server · browser automation · undetected chromedriver · anti-bot · Cloudflare bypass · web scraping · Claude · Cursor · nodriver · chrome-devtools-mcp alternative · Playwright/Puppeteer alternative · AI agent tools.

Is this the problem you have?

If you drive a browser from an AI agent, you have probably run into one of these:

  • The page sits on "Just a moment…" or "Checking your browser before accessing" and never loads
  • A "Verify you are human" checkbox that reappears every single time you click it
  • "Unusual Activity Detected", "Access Denied", or a plain HTTP 403 — from a site that opens perfectly in your normal browser
  • navigator.webdriver returns true, and the site quietly serves you different content because of it
  • The login works when you do it by hand, and fails the moment automation does the same steps
  • It all worked for weeks, then the site started returning an empty page or a captcha wall

None of that is your script being wrong. It is anti-bot detection — Cloudflare, DataDome, PerimeterX, Akamai, hCaptcha — recognising the automation stack itself. It shows up with chrome-devtools-mcp, playwright-mcp, Puppeteer, Selenium and browser-use alike, because they all drive Chrome in ways that leave a detectable signature: a ChromeDriver binary, WebDriver markers, CDP artifacts.

Why this fixes it

nodriver is the successor of undetected-chromedriver. It speaks the CDP protocol directly — no ChromeDriver binary, no Selenium/WebDriver markers — so navigator.webdriver reads false rather than true, and a session looks like a person using Chrome.

This server exposes that through the same tool surface as chrome-devtools-mcp (65 tools), so your agent keeps a familiar API and simply stops getting blocked. Swapping is a config change, not a rewrite.

What it will not do, so you can judge before installing: it does not solve image or text captchas for you, it cannot defeat every protection on every site, and it will not rescue a scraper that hammers a server. If a site blocks you for what you do rather than what you are, no driver fixes that. cf_verify handles the common Cloudflare checkbox challenge; it is not a captcha-solving service.

Does it actually pass? Here is the evidence

Claiming "undetected" is easy, so here is what the standard fingerprint suite reports when this server drives the page itself. Reproduce it in one line: point your agent at https://bot.sannysoft.com and take a snapshot.

<p align="center"> <img src="https://raw.githubusercontent.com/andresolbach/nodriver-mcp-server/main/assets/proof/sannysoft.png" alt="bot.sannysoft.com results: all checks green" width="700"> </p>

| Check | Result | |---|---| | bot.sannysoft.com — Intoli + fingerprint suite | 58 checks, 0 failed | | navigator.webdriver | false — a boolean on Navigator.prototype, not an own property, exactly as in a normal browser | | window.chrome | present | | navigator.plugins | 5 | | navigator.languages | 4 entries | | User agent | no Headless token |

What this does and does not prove. It shows the browser presents no automation artifacts to client-side fingerprinting, which is what these suites test and what most blocks key off. It does not prove any particular site will let you in: server-side signals such as IP reputation and request rate are outside what any driver controls, and captchas are not solved (see above). Measured on Chrome 150 / Windows 11, headful, with the default profile.

Features

  • 🕵️ Undetected by designnavigator.webdriver reads false, exactly as in a browser a person is using, and there are no CDP or WebDriver artifacts to find.
  • ☁️ Built-in Cloudflare challenge solver (cf_verify, needs the [cf] extra).
  • 🖼️ Frames are not a blind spotlist_frames plus a frame argument on the readers, and take_snapshot splices each iframe's tree in under the element hosting it, so a payment field or consent wall inside one gets a uid and can be clicked and filled like anything else.
  • 🔍 A network log that says what happened — status, response headers, timing, transfer size, redirect hops and failures, plus WebSocket frames in both directions. A 500, a 404, a redirect and a DNS failure are different lines, not the same one.
  • 👥 Several isolated browsers at once — pass browser: "agent-a" to any tool and that name gets its own Chrome, in its own process, with its own cookies, tabs and uids. Parallel agents stop stealing each other's selected tab. Omit it and nothing changes: the default browser runs in the server process, exactly as before. How it works
  • 🧩 65 tools covering navigation, input, snapshots, screenshots, content/PDF export, network + console inspection, device emulation, cookies/storage, sessions, profiles, and performance tracing.
  • 🧠 Schemas written for the agent, not just the compiler — every parameter carries a description, fixed-value options are real enums, and each tool declares read-only/destructive hints. See why this matters.
  • 📄 Compact accessibility-tree snapshots (take_snapshot) — searchable page text with a uid per element. Measured on the Hacker News front page: 27 KB against 97 KB unfiltered, 72% smaller, with every link, URL and text preserved. Same-origin URLs are printed relative to the page, which is lossless because the root node keeps the absolute one. That saving lands on every single agent step.
  • 🔗 Attach to a browser you are already signed into (use_running_browser) — drive your real Chrome profile over its debugging port instead of rebuilding logins in a fresh one.
  • 📱 Device emulation (Pixel 7, iPad) with correct UA / client hints.
  • Actions that verify themselvesfill reads the value back, set_checked reads the checked state back, and click, press_key and type_text report when no input event reached the page. A tool that cannot confirm what it did says so instead of reporting success.
  • 💾 Session save/restore — persist logins across runs.
  • 🧬 Ephemeral by default, run many at once — each session gets its own temp Chrome profile (auto-deleted), so Claude Desktop, Claude Code and VS Code can all drive nodriver simultaneously without colliding. Named persistent profiles are available on demand for reusable logins.
  • One-command setup for 15+ MCP clients.

Installation

# Recommended: isolated install, won't touch your global Python environment
uv tool install nodriver-mcp

# or with pip
pip install nodriver-mcp

# or run it without installing anything
uvx nodriver-mcp

Requires uv for the first and third form. To track the development branch instead of a release:

uv tool install "nodriver-mcp @ git+https://github.com/andresolbach/nodriver-mcp-server.git@main"

Also listed in the official MCP Registry as io.github.andresolbach/nodriver-mcp-server, so clients and marketplaces that read the registry can find and install it directly.

Uses upstream nodriver >=0.50.3, which contains the Chrome 146+ CDP fixes (sameParty removed from Cookie, privateNetworkRequestPolicylocalNetworkAccessRequestPolicy) — verified working against Chrome 150. pip install also works, but uv tool install keeps it isolated.

You'll also need a local installation of Google Chrome (auto-detected).

Upgrade

uv tool upgrade nodriver-mcp

Requirements & tested versions

Every tool in this server was tested end-to-end against Google Chrome 150 with nodriver 0.50.3 on Python 3.12.11 / Windows 11 (macOS and Linux are supported too). Because nodriver talks to Chrome directly over CDP and tracks upstream Chrome changes, it keeps working as Chrome auto-updates.

| Component | Requirement | Verified version | |-----------|-------------|------------------| | Python | 3.12+ | 3.12.11 | | Google Chrome | any recent stable | 150.0.7871.101 | | Operating system | Windows / macOS / Linux | Windows 11 | | nodriver | >= 0.50.3 | 0.50.3 | | mcp (MCP SDK) | >= 1.26.0, < 2 | 1.26.0 | | pillow | >= 12.1.1 | 12.1.1 | | tomli-w | >= 1.0.0 | 1.2.0 |

The pip packages/versions are also listed in requirements.txt (pip install -r requirements.txt), though uv tool install is recommended for a fully pinned, reproducible install.

One-command MCP client setup

# Interactive client selector (terminal TUI)
nodriver-mcp install

# Install to specific clients
nodriver-mcp install claude,cursor,kiro

# Uninstall
nodriver-mcp uninstall claude

# List all supported clients
nodriver-mcp --list-clients

# Print MCP config JSON (for manual setup)
nodriver-mcp --config

# Project-level config (writes to .cursor/mcp.json, .mcp.json, etc.)
nodriver-mcp install --scope project

Supported clients: Claude Desktop, Claude Code, Cursor, Windsurf, Codex, Gemini CLI, Copilot CLI, Kiro, VS Code, Cline, Roo Code, Amazon Q, Warp, Opencode, Trae.

The Claude Code VS Code extension shares Claude Code's config (~/.claude.json), so installing to claude-code covers both the CLI and the extension.

Manual config

If you'd rather paste it yourself, this works in any MCP client (claude_desktop_config.json, ~/.claude.json, .cursor/mcp.json, .mcp.json, …):

{
  "mcpServers": {
    "nodriver": {
      "command": "uvx",
      "args": ["nodriver-mcp"]
    }
  }
}

Environment Variables

| Variable | Description | Default | |----------|-------------|---------| | NODRIVER_HEADLESS | Headless mode (true/false) | false | | NODRIVER_USER_DATA_DIR | Explicit persistent Chrome profile dir (overrides the default) | Ephemeral temp profile, auto-deleted per session | | NODRIVER_BROWSER_PATH | Chrome executable path | Auto-detected | | NODRIVER_PROXY | Proxy server address | None | | NODRIVER_BROWSER_URL | Attach to a Chrome already running at this address (e.g. http://127.0.0.1:9222) instead of launching one | Launch our own | | NODRIVER_ENABLE_TRANSLATE | Set true to re-enable Chrome's Google Translate popup | Disabled | | `NODRIVER

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars3
CategoryAutomation
Updated10d ago
Forks0

Languages

Python

Security Score

92/100

Audited on Aug 8, 2026

1 low