
Security News
Happy Birthday, Shai-Hulud
It has been one year since Shai-Hulud made its first appearance on npm.
capmonster-mcp-patchright
Advanced tools
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; opt into main only when you need it. E
🛡️ 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.
npm i -g capmonster-mcp-patchright
capmonster-mcp-patchright --port 9321 --host 127.0.0.1
{
"mcpServers": {
"patchright": {
"command": "npx",
"args": ["capmonster-mcp-patchright", "--port", "9321", "--host", "127.0.0.1"]
}
}
}
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.
npm install
npm run build
node dist/index.js
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:
npx patchright install chromium
npm run release:check
npm publish
By 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:
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": {
"patchright": {
"command": "node",
"args": ["/path/to/capmonster-mcp-patchright/dist/index.js"]
}
}
}
Shipped:
world: "main" opt-in for browser_evaluate / browser_run_code_unsafebrowser_find)browser_save_blob)Next:
FAQs
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; opt into main only when you need it. E
The npm package capmonster-mcp-patchright receives a total of 17 weekly downloads. As such, capmonster-mcp-patchright popularity was classified as not popular.
We found that capmonster-mcp-patchright demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
It has been one year since Shai-Hulud made its first appearance on npm.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.

Security News
GitHub Actions now supports cache-mode, a least-privilege control on the Actions cache aimed at the cache poisoning technique behind recent compromises.