mcp-patchright
Undetectable browser MCP server — 59 tools, Patchright-powered, zero CDP fingerprint.
Passes Cloudflare / Akamai / Kasada / Datadome.
Why Patchright, not Playwright?
| Playwright | Patchright | |
|---|---|---|
Runtime.enable |
sends (detectable) | removed |
Console.enable |
sends | removed |
--enable-automation flag |
present | removed |
navigator.webdriver |
true |
false / undefined |
| Anti-bot evasion |
See the full comparison for details.
Quick start
npm i -g mcp-patchright
mcp-patchright --port 9321 --host 127.0.0.1With Claude / GPT / agents
{
"mcpServers": {
"patchright": {
"command": "npx",
"args": ["mcp-patchright", "--port", "9321", "--host", "127.0.0.1"]
}
}
}Features
- 41 MCP tools — full browser automation surface
- 3 transports — stdio, SSE, Streamable HTTP (
/mcp) - Persistent profiles — real Chrome profile, reuse across sessions
- Multi-page — tab management (new, list, switch, close)
- CDP attach — control an already-running Chrome
- Network tracking + interception — request list/detail, offline toggle, block/mock routes
- Session import/export —
browser_storage_save/browser_storage_load(cookies + localStorage) - Granular storage — per-key cookie / localStorage / sessionStorage CRUD (
browser_cookie_*,browser_localstorage_*,browser_sessionstorage_*) - Authenticated API requests —
browser_api_requestreuses session cookies (hybrid scraping) - Text/HTML extraction —
browser_get_visible_text/_html(token-light) - Iframe-aware — pass
frameSelectorto any element tool (click/fill/type/hover/press/wait_for/select/drag) to act inside an iframe - PDF export —
browser_save_pdfvia CDP (works in headed/stealth mode) - Video recording —
browser_startwithrecordVideo,browser_video_save; .webm flushed onbrowser_close - Element highlight —
browser_highlight/browser_hide_highlightoverlays for screenshots & recordings - Stealth profiles — proxy / geolocation / locale / timezone / colorScheme
- Console capture — real-time console message stream
- Fingerprint check —
browser_fingerprint_checkdiagnostics
Tools
Full comparison HTML in /docs/tool-comparison.html.
browser_startbrowser_statusbrowser_navigatebrowser_new_pagebrowser_pagesbrowser_switch_pagebrowser_close_pagebrowser_snapshotbrowser_take_screenshotbrowser_clickbrowser_fillbrowser_typebrowser_hoverbrowser_press_keybrowser_wait_forbrowser_evaluatebrowser_fingerprint_checkbrowser_navigate_backbrowser_select_optionbrowser_handle_dialogbrowser_file_uploadbrowser_network_requestsbrowser_network_requestbrowser_console_messagesbrowser_resizebrowser_dragbrowser_fill_formbrowser_run_code_unsafebrowser_network_state_setbrowser_api_requestbrowser_get_visible_textbrowser_get_visible_htmlbrowser_iframe_clickbrowser_iframe_fillbrowser_route_blockbrowser_route_mockbrowser_route_clearbrowser_storage_savebrowser_storage_loadbrowser_cookie_listbrowser_cookie_getbrowser_cookie_setbrowser_cookie_deletebrowser_cookie_clearbrowser_localstorage_listbrowser_localstorage_getbrowser_localstorage_setbrowser_localstorage_deletebrowser_localstorage_clearbrowser_sessionstorage_listbrowser_sessionstorage_getbrowser_sessionstorage_setbrowser_sessionstorage_deletebrowser_sessionstorage_clearbrowser_video_savebrowser_highlightbrowser_hide_highlightbrowser_save_pdfbrowser_close
Development
npm install
npm run build
node dist/index.jsBy default, browser_start launches Chromium via patchright as headed real Chrome with a persistent profile at:
~/.maestro/stealth-playwright-mcp/profiles/default
You can override it with the userDataDir tool argument or STEALTH_PLAYWRIGHT_USER_DATA_DIR.
To attach to an already-running Chrome instead of launching one, start Chrome with remote debugging and pass cdpEndpoint to browser_start:
/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome \\
--remote-debugging-port=9222 \\
--user-data-dir=$HOME/.maestro/stealth-playwright-mcp/profiles/cdp{ "cdpEndpoint": "http://127.0.0.1:9222" }browser_snapshot returns Playwright's AI aria snapshot. Use [ref=eN] values from that snapshot with browser_click, browser_fill, browser_type, browser_hover, browser_press, and browser_wait_for by passing { "ref": "eN" }. CSS selectors remain supported via { "selector": "..." }.
MCP config example:
{
"mcpServers": {
"stealth-playwright": {
"command": "node",
"args": ["/Users/maestrobot/stealth-playwright-mcp/dist/index.js"]
}
}
}Direction
Shipped:
- persistent user data dirs
- CDP attach to real Chrome
- proxy / timezone / locale / geolocation profiles
- accessibility snapshots for LLM-friendly page control
- fingerprint diagnostics
- network interception (block / mock)
- session import/export (storageState)
- PDF export
- authenticated API requests (reuse browser cookies)
- lightweight text/HTML extraction
- iframe actions
Next:
- rebrowser-playwright backend
- codegen sessions
- coordinate-based (vision) clicks
- tracing / video recording