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: Chrome DevTools MCP
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 |
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
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA web browser automation server that allows AI assistants to control Chrome with persistent state management, enabling complex browsing tasks through asynchronous browser operations.2-
- AlicenseNot gradedqualityDmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser through DevTools for automated testing, performance analysis, debugging, and web scraping. Provides reliable browser automation using Puppeteer with comprehensive DevTools access.3,204,746 npm3Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser for automation, debugging, performance analysis, network monitoring, and DOM interaction through Chrome DevTools Protocol.3,204,746 npmApache 2.0
- 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