chrome-driverless
Allows logging into Bilibili in the managed browser, exporting and persisting the login state for reuse by yt-dlp downloads.
Click on "Deploy 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., "@chrome-driverlessOpen example.com, take a screenshot, and list the clickable elements on the page."
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.
chrome-driverless
A persistent, headed Chrome driven by Playwright, exposed through an MCP-style HTTP API (POST /mcp) with a built-in web console. Humans and AI agents share one long-lived browser: log in once through the console, then drive it via HTTP, CDP, Node.js scripts — or let an LLM complete tasks for you.
Highlights
Persistent context — login state survives restarts in
data/profiles/<name>/auth.json(exportable for reuse)MCP-style HTTP API — navigate, screenshot, click, type, keys, hover, evaluate, tabs, profiles, proxy toggle, raw mouse / scroll control
Web console — layered live viewport (screenshot / element-highlight / virtual-cursor layers), touchpad-style pointer control, element picker, built-in DevTools
Human mode — a bare Chromium with zero Playwright/CDP attachment, purpose-built for Cloudflare / Turnstile challenge pages (open the challenge, wait 5–15 s, it passes)
Fingerprint profiles —
real/ Chrome·Win / Chrome·Mac / Safari·Mac, each self-consistent across HTTPUser-Agent, JSplatform/vendor/userAgentData, andsec-ch-uaheadersStealth audit — the classic 0–7 anti-detection checklist made runnable in one call (
pw/stealth_audit,human/stealth_audit)Humanized input — mouse trajectories and keystroke cadence with reproducible seeds (
HUMANIZE_SEED)Clipboard interop — Ctrl+C / Ctrl+V bridged between your machine and the remote page (paste = one-shot insertText, copy reads the remote selection)
Network consistency — browser timezone aligned with the proxy's egress timezone; UA /
sec-ch-uacoherenceReal Google Chrome engine — set
BROWSER_ENGINE=chromefor native brands + Widevine (fixes the two biggest Chromium-for-Testing fingerprint tells)GPU passthrough — WebGL renderer probing; real GPU by default when available (no SwiftShader software-rendering tell)
Audio streaming — hear the browser at
/audio.mp3(PulseAudio null-sink → parec → ffmpeg)AI tasks — a browser-use-style agent: the DOM is distilled into numbered interactive elements (
[3] <button>Sign in</button>), the LLM answers with index-based actions and self-corrects from execution feedback; any OpenAI-compatible endpoint works (DeepSeek preset), and a vision mode attaches screenshots for multimodal modelsEnv-driven auto login —
pw/auto_loginfills login forms fromBROWSER_LOGIN_*env vars, no credentials in codeNode.js job scripts —
pw/run_scriptexecutes scripts thatconnectOverCDPinto the same browser, sharing login stateModular codebase —
main.py+cd_*.pymodules, each ≤600 lines
Related MCP server: browser-control-mcp-server
Quick start
pip install -r requirements.txt
python main.py # serves 0.0.0.0:9223Or with Docker (images built by GitHub Actions):
docker run -d --name chrome-driverless \
-p 9223:9223 \
-v chrome-data:/app/data \
ghcr.io/friddle/chrome-driverless:latest
# real Google Chrome engine instead of Chromium-for-Testing:
docker run -d -p 9223:9223 -v chrome-data:/app/data \
-e BROWSER_ENGINE=chrome \
ghcr.io/friddle/chrome-driverless:latestOpen http://localhost:9223/ for the console.
Environment variables
Variable | Description | Default |
| Persistent data dir (profiles / auth.json / browser profile) |
|
| Profile activated at startup |
|
|
|
|
| Browser proxy (empty = no proxy) | empty |
| Comma-separated no-proxy list |
|
| Chrome CDP port for external |
|
| External access URL (shown in logs / | empty |
| Default model + endpoint for AI tasks | empty |
| Credentials for | empty |
| Fix the humanized-input RNG seed for reproducibility | random |
Proxies are intentionally empty by default — inject them via env vars instead of hardcoding addresses.
HTTP endpoints
GET /— web consoleGET /healthPOST /mcp— MCP method call:{"method": "pw/...", "params": {...}}GET /debug/status·/debug/logs·/debug/files·/debug/urlGET /audio.mp3— live browser audio streamGET /devtools/targets,GET /devtools/{rest}(+ WS bridges) — Chrome DevTools
MCP methods
Method | Description |
| Init / reuse the persistent browser |
| Navigation (returns screenshot) |
| Screenshot of the current page (base64) |
| Humanized click / hover / typing ( |
| Read the remote page's selected text (clipboard-interop copy side) |
| Run JS in the current page |
| List interactive elements (id / selector / coordinates) |
| Env-driven form login (QR → password tab switch included) |
| Multi-tab management ( |
| Profile-isolated login states |
| Export current login state to auth.json |
| Toggle browser proxy (aligns timezone to egress) |
| Raw pointer / scroll control |
| Run Node.js scripts via |
| LLM-driven task execution |
| Stealth audit on the Playwright-driven page |
| Human mode / GPU passthrough switching |
| Human-mode page ops |
| Human-mode input |
| Human-mode pointer control |
| Stealth audit inside human mode |
| Fingerprint profile: |
| AI task configuration |
Multi-tab concurrency & per-tab lock
One profile supports operating multiple tabs at the same time. Convention:
pw/new_tab {tab: "my-task", url: ...}creates (or reuses) a named tab; the response carries thetabname;Any later
pw/*call with{tab: "my-task"}runs on that tab (resolved by name; unknown names fail withtab not found);Lock granularity is per tab: requests on the same tab are serialized — the next request starts only after the previous one finishes (locked automatically before execution); different tabs run concurrently;
Calls without
tabtake the global lock (single-browser serial semantics unchanged);ai/cancelbypasses locks so long tasks can always be interrupted;/debug/statusexposestab_busyshowing which named tabs currently have a task running.
Module map
File | Responsibility |
| MCP dispatch + startup events |
| FastAPI app · env config & fingerprint profiles · global state & persistence |
| HTTP/WS routes, debug endpoints, DevTools proxy |
| Persistent Playwright context, tabs, profiles |
| Page actions, humanized input, auto login |
| Human-mode lifecycle · human-mode page operations |
| Stealth audit checklist · stealth JS injection |
| Raw CDP helpers, GPU / WebGL probing |
| browser-use-style task agent: element-indexed action space, same-origin iframe recursion, step-by-step logging |
| LLM client (messages + vision shards), AI config, Node script runner |
| PulseAudio → parec → ffmpeg → |
Embedding into your app
Run the service (docker or bare) and expose port
9223.Open the console URL in an in-app tab / iframe.
Log in to target sites in the console — state persists in auth.json for later scripts / CDP connections.
The service itself has no built-in auth — it is meant as an internal / embedded tool. Put an authenticating reverse proxy in front if you need access control.
Disclaimer
For personal learning and self-hosted automation only. Respect the terms of service of the websites you visit.
This server cannot be deployed
Maintenance
Related MCP Connectors
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI coding assistants to control a persistent Chrome browser through DevTools Protocol. Supports web navigation, screenshots, element interaction, mobile testing, console logs, and network debugging in a stable Docker environment.108MIT
- AlicenseAqualityCmaintenanceEnables AI agents to fully control a browser for web automation, including navigation, clicking, typing, scrolling, screenshots, and DOM inspection, with session persistence and anti-bot bypass.4043 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and clients to control a real Chromium browser through MCP tool calls, including navigation, clicking, typing, JavaScript evaluation, screenshots, and DOM snapshots. Supports multiple isolated sessions over authenticated HTTP with no disk writes.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to run Playwright-compatible browser automation with persistent profiles, proxies, Chrome extensions, and humanized mouse, keyboard, and scroll interactions over stdio or Streamable HTTP. Supports web research, daily automation, testing workflows, and optional session-scoped CDP access.541 npmMIT