The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Capmonster MCP Patchright Captcha Solver listing page.
🛡️ Undetectable browser MCP server — 66 tools, Patchright-powered, zero CDP fingerprint.
Passes Cloudflare / Akamai / Kasada / Datadome.
Fork of mcp-patchright that adds a per-call
world: "main" option to browser_evaluate / browser_run_code_unsafe, so page-defined window
globals are visible and callable. Defaults to Patchright's isolated stealth world (matching
upstream); opt into main only when a page's own script needs to see or be called by your
evaluated code. Everything else matches upstream mcp-patchright.
| 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.
world: "main" opt-in — browser_evaluate / browser_run_code_unsafe can run in the page's real world to see/call page-defined globals (default stays isolated/stealth)browser_find — search the current aria snapshot for text/regex, cheaper than a full browser_snapshotbrowser_save_blob — save a Blob/data URL produced by page code to disk/mcp)owner query/headerbrowser_storage_save / browser_storage_load (cookies + localStorage)browser_cookie_*, browser_localstorage_*, browser_sessionstorage_*)browser_api_request reuses session cookies (hybrid scraping)browser_get_visible_text / _html (token-light)frameSelector to any element tool (click/fill/type/hover/press/wait_for/select/drag) to act inside an iframebrowser_save_pdf via CDP (works in headed/stealth mode)browser_start with recordVideo, browser_video_save; .webm flushed on browser_closebrowser_highlight / browser_hide_highlight overlays for screenshots & recordingsbrowser_fingerprint_check diagnosticsFull comparison HTML in /docs/tool-comparison.html.
browser_startbrowser_statusbrowser_navigatebrowser_new_pagebrowser_pagesbrowser_switch_pagebrowser_close_pagebrowser_snapshotbrowser_findbrowser_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_add_init_scriptbrowser_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_passkey_installbrowser_passkey_createbrowser_passkey_listbrowser_passkey_deletebrowser_video_savebrowser_highlightbrowser_hide_highlightbrowser_save_blobbrowser_save_pdfbrowser_closeHTTP mode requires a stable owner on
the MCP URL (?owner=<id>) or with the X-Browser-Owner header. Page listing,
switching, navigation, and closing are restricted to that owner's tabs. Delete
/owners?owner=<id> to close all tabs owned by one caller without stopping the
browser or clearing the profile.
Install the matching Chromium build once, then prepare a release from the exact
dependency versions in package-lock.json, run the full verification suite,
and inspect the package without publishing it:
By default, browser_start launches Chromium via patchright as headed real Chrome with a persistent profile at:
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:
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:
Shipped:
world: "main" opt-in for browser_evaluate / browser_run_code_unsafebrowser_find)browser_save_blob)Next: