capmonster-mcp-patchright
Official# capmonster-mcp-patchright
š”ļø Undetectable browser MCP server ā 66 tools, Patchright-powered, zero CDP fingerprint.
[![npm]](https://npmjs.com/capmonster-mcp-patchright) [![MCP]](https://modelcontextprotocol.io)
Passes Cloudflare / Akamai / Kasada / Datadome.
Fork of [mcp-patchright](https://github.com/maestrojeong/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.
## 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](docs/tool-comparison.html) for details.
## Quick start
```bash
npm i -g capmonster-mcp-patchright
capmonster-mcp-patchright --port 9321 --host 127.0.0.1
```
### With Claude / GPT / agents
```json
{
"mcpServers": {
"patchright": {
"command": "npx",
"args": ["capmonster-mcp-patchright", "--port", "9321", "--host", "127.0.0.1"]
}
}
}
```
## Features
- **66 MCP tools** ā full browser automation surface
- **`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_snapshot`
- **`browser_save_blob`** ā save a Blob/data URL produced by page code to disk
- **3 transports** ā stdio, SSE, Streamable HTTP (`/mcp`)
- **Persistent profiles** ā real Chrome profile, reuse across sessions
- **Multi-page** ā tab management (new, list, switch, close)
- **Owner-scoped HTTP sessions** ā isolate tabs per caller with `owner` query/header
- **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_request` reuses session cookies (hybrid scraping)
- **Text/HTML extraction** ā `browser_get_visible_text` / `_html` (token-light)
- **Iframe-aware** ā pass `frameSelector` to any element tool (click/fill/type/hover/press/wait_for/select/drag) to act inside an iframe
- **PDF export** ā `browser_save_pdf` via CDP (works in headed/stealth mode)
- **Video recording** ā `browser_start` with `recordVideo`, `browser_video_save`; .webm flushed on `browser_close`
- **Element highlight** ā `browser_highlight` / `browser_hide_highlight` overlays for screenshots & recordings
- **Stealth profiles** ā proxy / geolocation / locale / timezone / colorScheme
- **Console capture** ā real-time console message stream
- **Fingerprint check** ā `browser_fingerprint_check` diagnostics
- **Virtual passkeys** ā create, import, list, and delete WebAuthn credentials with private keys redacted by default
## Tools
Full comparison HTML in [/docs/tool-comparison.html](docs/tool-comparison.html).
- `browser_start`
- `browser_status`
- `browser_navigate`
- `browser_new_page`
- `browser_pages`
- `browser_switch_page`
- `browser_close_page`
- `browser_snapshot`
- `browser_find`
- `browser_take_screenshot`
- `browser_click`
- `browser_fill`
- `browser_type`
- `browser_hover`
- `browser_press_key`
- `browser_wait_for`
- `browser_evaluate`
- `browser_fingerprint_check`
- `browser_navigate_back`
- `browser_select_option`
- `browser_handle_dialog`
- `browser_file_upload`
- `browser_network_requests`
- `browser_network_request`
- `browser_console_messages`
- `browser_resize`
- `browser_drag`
- `browser_fill_form`
- `browser_run_code_unsafe`
- `browser_add_init_script`
- `browser_network_state_set`
- `browser_api_request`
- `browser_get_visible_text`
- `browser_get_visible_html`
- `browser_iframe_click`
- `browser_iframe_fill`
- `browser_route_block`
- `browser_route_mock`
- `browser_route_clear`
- `browser_storage_save`
- `browser_storage_load`
- `browser_cookie_list`
- `browser_cookie_get`
- `browser_cookie_set`
- `browser_cookie_delete`
- `browser_cookie_clear`
- `browser_localstorage_list`
- `browser_localstorage_get`
- `browser_localstorage_set`
- `browser_localstorage_delete`
- `browser_localstorage_clear`
- `browser_sessionstorage_list`
- `browser_sessionstorage_get`
- `browser_sessionstorage_set`
- `browser_sessionstorage_delete`
- `browser_sessionstorage_clear`
- `browser_passkey_install`
- `browser_passkey_create`
- `browser_passkey_list`
- `browser_passkey_delete`
- `browser_video_save`
- `browser_highlight`
- `browser_hide_highlight`
- `browser_save_blob`
- `browser_save_pdf`
- `browser_close`
## Development
### Owner-scoped HTTP sessions
HTTP 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.
```bash
npm install
npm run build
node dist/index.js
```
### Release
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:
```bash
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:
```text
~/.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`:
```bash
google-chrome --remote-debugging-port=9222 --user-data-dir=$HOME/.maestro/stealth-playwright-mcp/profiles/cdp
```
```json
{ "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:
```json
{
"mcpServers": {
"patchright": {
"command": "node",
"args": ["/path/to/capmonster-mcp-patchright/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
- ā
`world: "main"` opt-in for `browser_evaluate` / `browser_run_code_unsafe`
- ā
aria-snapshot search (`browser_find`)
- ā
save Blob/data URL output to disk (`browser_save_blob`)
Next:
- rebrowser-playwright backend
- codegen sessions
- coordinate-based (vision) clicks
- tracing / video recording
TDQS
Scored across 66 tools
Most tools fall into clear categories (navigation, input, storage, network), but several pairs overlap: browser_run_code_unsafe duplicates browser_evaluate, and browser_iframe_click/browser_iframe_fill are legacy shorthands for browser_click/browser_fill with frameSelector. The detailed descriptions mitigate confusion, so boundary issues are limited to a handful of cases.
All tools share a consistent browser_ prefix and most follow a verb-object or area-action pattern (cookie_get, storage_save, navigate, click). However, some query tools are noun-named instead of verb-named (browser_status, browser_pages, browser_network_requests) and browser_new_page breaks the verb pattern, so it is not fully uniform.
66 tools is far beyond the 3-15 sweet spot and well past the 25+ threshold for too many, making the server heavy for an agent to navigate. The tools are at least organized into coherent families, but the sheer number and 15 near-identical CRUD micro-tools for cookies/localStorage/sessionStorage inflate the surface.
The browser automation surface is extensive, covering navigation, input, network interception, storage, and passkeys, with only minor browser gaps like reload/forward/scroll. However, the server is branded capmonster and browser_save_blob explicitly references create_task, yet no CapMonster task-creation or result-retrieval tools exist, leaving a notable dead end for the intended captcha workflow.