NeoBrowser: An MCP server that drives real Chrome with your logged-in sessions

Aug 18, 2026 08:25 PM - 2 hours ago 1

CI Release  MIT Install successful VS Code Install successful Cursor

Your AI drives a existent Chrome pinch your existent logged-in sessions — it wins the fingerprint crippled (passes bot.sannysoft pinch a genuine fingerprint), moves the rodent for illustration a human, and lands already authenticated, truthful it isn't flagged for illustration a banal headless bot. An MCP server for AI models to usage the web the measurement you do.

It doesn't dress to beryllium invisible: erstwhile a tract throws an interactive situation (reCAPTCHA, Turnstile) NeoBrowser detects it and hands power backmost pinch a real-session aliases quality way — that honesty is what makes it dependable.

Most browser devices for LLMs motorboat a fresh, fingerprintable headless browser pinch nary cookies, truthful the exemplary hits login walls and bot checks constantly. NeoBrowser drives the real Google Chrome binary and tin reuse your existent logged-in profile, truthful the exemplary lands already authenticated and looks for illustration a genuine personification — because it is one.

Rust rewrite: a azygous ~4 MB fixed binary, nary runtime to install. (The original Python implementation lives connected successful this repo arsenic a trial oracle — spot Development.)


# One statement (macOS / Linux): curl -fsSL https://raw.githubusercontent.com/pitiflautico/neobrowser/main/install.sh | sh # Or from root (needs the Rust toolchain): git clone https://github.com/pitiflautico/neobrowser && cd neobrowser/rust cargo build --release # -> target/release/neobrowser neobrowser expert # verify Chrome is recovered + a unrecorded CDP fume test

Windows binaries are connected the Releases page. Requires Google Chrome (or Chromium); auto-discovered connected macOS/Linux/Windows, override pinch NEOBROWSER_CHROME_BIN.

NeoBrowser demo

Real run: login, record upload and a bot-detector cheque against unrecorded sites (~14 s).

python3 rust/scripts/demo.py # drives a existent login, record upload, and a bot-detector check

Real output against unrecorded sites:

✓ Open a existent login page Navigated to .../login ✓ Fill the username / password ok ✓ Click Login (real isTrusted click) ok ✓ Read the consequence → logged successful You logged into a unafraid area! ✓ Attach a existent image record ok ✓ Submit the upload ok ✓ Server confirms the record neobrowser_demo.png ✓ Check the stealth tells {"webdriver":"hidden (passed)","chrome_runtime":true,"headless_ua":false}
NeoBrowser Playwright MCP / Puppeteer browser-use
Drives the real Chrome binary ⚠️ bundled Chromium ⚠️
Reuses your real logged-in sessions (no API keys, nary re-login)
Stealth by default — passes bot.sannysoft pinch a genuine fingerprint partial
Semantic constituent uncovering (accessibility character + heuristics + optional LLM) ❌ selectors
Multi-source hunt that routes astir bot walls
Single fixed binary, zero runtime deps ❌ Node + browsers
Talks CDP straight (no Selenium/WebDriver)
  • Real-session browsing — optionally decrypt + inject cookies from your existent Chrome floor plan (opt-in; macOS Keychain / Linux secret-service / Windows DPAPI). Session-identity cookies for Google/LinkedIn/Microsoft are excluded truthful your existent browser isn't logged out.
  • Stealth-hardened, genuinely — existent Chrome, navigator.webdriver suppressed, real-version User-Agent matching its Client Hints, real GPU WebGL (not spoofed). The accuracy is consistency, not piling connected fakes. Verified unrecorded against bot.sannysoft.
  • Bot-wall aware — navigate detects bot walls, CAPTCHAs, consent gates, rate-limits and login gates connected immoderate tract and tells the exemplary really to react.
  • Multi-source search — matter (DuckDuckGo + Google), images (Bing + Google), videos (YouTube + Google): walled sources are skipped, results merged. No azygous tract is simply a difficult dependency.
  • Real multi-tab — new_tab / list_tabs / switch_tab / close_tab, each sharing 1 Chrome.
  • 43 tools — navigate, click, type, fill/submit forms, upload/download, read, extract tables, screenshot, scroll, console/network logs, capacity metrics, record/replay playbooks, web/image/video search, login, and more.
  • Robust core — 1 isolated CDP relationship per tab (tokio), typed timeouts, self-healing betterment from dormant tabs / restarted Chrome, and nary orphaned Chrome processes.
  • docs/TOOLS.md — afloat reference for each 43 devices (params + descriptions). Regenerate pinch neobrowser devices --markdown; introspect unrecorded pinch neobrowser tools.
  • AGENTS.md — architecture, build/test, and conventions for contributors and AI agents.
  • The MCP initialize consequence ships an instructions section truthful the exemplary gets a usage primer automatically.

A reproducible harness (bench/) drives browser devices done a shared task matrix. It includes a neutral 2-way comparison vs Playwright MCP (python3 bench/compare.py) pinch a communal furniture — thing tuned to make either win. Honest first-run findings: some walk the shared functional tasks; Playwright MCP is faster (NeoBrowser pays for forcing frames truthful deferred contented renders), while NeoBrowser adds convention persistence and first-class bot-wall detection Playwright MCP lacks. On adversarial pages both were walled equally (single IP) — nary "evades better" claim; that needs residential proxies + repeated runs. Metrics separate task_execution_success from destination_access_success truthful a detected wall never inflates the score. See bench/README.md and bench/compare.md.

Register it pinch immoderate MCP client, past inquire your exemplary to browse. Example instrumentality calls:

navigate { "url": "https://example.com" } find { "intent": "search box" } → returns a backendNodeId type { "text": "hello world" } screenshot { "format": "png" } → returned arsenic an image read {} → visible page text

By default NeoBrowser runs its ain headless Chrome nether a dedicated profile. To reuse your existent logged-in sessions, group NEOBROWSER_REAL_PROFILE (see below).

Set NEOBROWSER_REAL_PROFILE to the Chrome floor plan files whose sessions you want (e.g. "Default", "Profile 1"). NeoBrowser decrypts that profile's cookies via the OS keychain and injects them, truthful the supplier starts authenticated:

Or connect to a Chrome you already person unfastened (started pinch --remote-debugging-port=9222): group NEOBROWSER_ATTACH_PORT=9222. In connect mode NeoBrowser ne'er patches aliases kills your existent browser.

Modern bot discovery (Cloudflare, DataDome, …) mostly looks for inconsistencies — a spoofed UA that doesn't lucifer Client Hints, a HeadlessChrome token, package WebGL, navigator.webdriver === true. NeoBrowser is genuinely consistent alternatively than piling connected spoofs:

  • Runs the real Chrome binary (real TLS, existent fonts, existent everything).
  • navigator.webdriver forced undefined; anti-throttle + attraction emulation support the headless compositor unrecorded truthful contented really renders.
  • UA rewritten to the real installed Chrome version via the motorboat flag, truthful genuine Client Hints enactment consistent.
  • No --disable-gpu, truthful WebGL reports the real GPU.
  • JS patches for plugins, languages, and the permissions/Notification mismatch — only connected tabs NeoBrowser owns, ne'er connected an attached existent Chrome.

Beyond the fingerprint, input is behaviorally human: clicks move the cursor to the target on a multi-step way pinch human-cadence pauses (not a teleport-then-click), and typing tin beryllium per-key pinch realistic timing — the signals behavioral systems watch for.

Verified live: passes bot.sannysoft's WebDriver, Chrome, plugins and WebGL checks pinch the host's genuine fingerprint. CI installs Chrome and runs these checks against a existent browser connected each push; the afloat bot.sannysoft tally is an on-demand trial (cargo trial --test stealth_verify -- --ignored).

What nary instrumentality tin committedness is defeating interactive challenges — reCAPTCHA, Turnstile, aliases behavioral/reputation systems (DataDome) tin still put up a wall, and a caller cookie-less floor plan is itself a signal. NeoBrowser's separator location is simply a lukewarm existent floor plan positive detecting the wall (navigate flags it) truthful the exemplary reacts alternatively of hammering it.

Env var Default Purpose
NEOBROWSER_REAL_PROFILE (unset) Real Chrome floor plan files to propulsion sessions from
NEOBROWSER_PROFILE default Which Ghost floor plan this convention uses. Chrome locks a floor plan exclusively, truthful springiness concurrent sessions different names to support them from colliding
NEOBROWSER_ATTACH_PORT (unset) Attach to an already-running Chrome connected this debug port
NEOBROWSER_CHROME_BIN (auto) Path to the Chrome/Chromium binary
NEOBROWSER_HOME ~/.neobrowser Where profiles, cookies, sessions, playbooks, downloads live
NEOBROWSER_PROXY (unset) Upstream proxy (http://… aliases socks5://…)
NEOBROWSER_DISABLE_GPU (unset) Force package rendering (GPU-less CI hosts only)
ANTHROPIC_API_KEY (unset) Enables the optional LLM fallback successful find (your key, your cost; disconnected by default)

Security & responsible use

Real-session mode sounds cookies from your Chrome floor plan and injects them into an automated browser. Treat it for illustration immoderate credential:

  • It is opt-in — thing touches your existent floor plan unless you group NEOBROWSER_REAL_PROFILE.
  • Cookie/session files are written nether ~/.neobrowser pinch 0600 permissions.
  • Server-side fetches (browse, download) are SSRF-guarded to nationalist http(s) only.
  • The login instrumentality refuses non-https URLs and ne'er logs credentials.
  • Anything an AI browses pinch your convention acts as you. Point it only astatine sites and tasks you'd beryllium comfortable doing yourself. This is simply a instrumentality for automating your own accounts and workflows — not for evading entree controls connected services you don't own.
# Rust (primary): cd rust && cargo test # portion + 1 live-Chrome integration trial (self-skips without Chrome) cargo test --test stealth_verify -- --ignored # existent bot.sannysoft detector # Python (legacy implementation, kept arsenic a differential-testing oracle): pip instal -e ".[dev]" && python -m pytest -q

MIT © Daniel Perez Pinazo

More