{
  "markdown": "# parallel-browser-mcp\n\n[![npm version](https://img.shields.io/npm/v/parallel-browser-mcp.svg)](https://www.npmjs.com/package/parallel-browser-mcp)\n[![npm downloads](https://img.shields.io/npm/dt/parallel-browser-mcp.svg)](https://www.npmjs.com/package/parallel-browser-mcp)\n\n`parallel-browser-mcp` is an MCP server for parallel browser automation. It exposes a numeric session model over MCP so one client can create and control multiple browser sessions at the same time across multiple browser providers.\n\nSupported providers:\n- `playwright` for local Chromium\n- `browserbase` via `@browserbasehq/sdk`\n- `anchor` via `anchorbrowser`\n- `cloudflare` via Cloudflare Browser Run\n\nEach browser session gets a numeric ID like `1`, `2`, `3`, and every `browser_*` tool accepts a `sessionId`.\n\n## Features\n\n- Multiple concurrent browser sessions in memory\n- Provider abstraction shared across Browserbase, Anchor Browser, Cloudflare Browser Run, and local Playwright\n- MCP session tools:\n  - `start_session`\n  - `close_session`\n  - `close_all_sessions`\n  - `get_sessions`\n- Browser tools:\n  - `browser_navigate`\n  - `browser_go_back`\n  - `browser_click`\n  - `browser_fill`\n  - `browser_fill_form`\n  - `browser_screenshot`\n  - `browser_snapshot`\n  - `browser_hover`\n  - `browser_drag`\n  - `browser_select_option`\n  - `browser_generate_locator`\n  - `browser_get_page_structure`\n  - `browser_evaluate`\n  - `browser_keyboard_press`\n  - `browser_keyboard_type`\n  - `browser_mouse_move`\n  - `browser_mouse_click_xy`\n  - `browser_mouse_drag`\n  - `browser_upload_file`\n  - `browser_wait_for_selector`\n  - `browser_wait_for_timeout`\n\n## Quick Start\n\n```bash\ncorepack pnpm install\ncorepack pnpm build\n```\n\nRun locally over stdio:\n\n```bash\nnode dist/index.js\n```\n\nRun it as an npm package CLI:\n\n```bash\nnpx parallel-browser-mcp@latest\n```\n\n## Configuration\n\nProvider-specific settings are configured at the MCP server configuration level, not per tool call.\n\nThe server reads config in this order:\n1. `BROWSER_MCP_CONFIG`\n2. `BROWSER_MCP_CONFIG_PATH`\n3. direct env defaults\n4. built-in defaults\n\nRecommended config shape:\n\n```json\n{\n  \"defaultProvider\": \"playwright\",\n  \"providers\": {\n    \"browserbase\": {\n      \"projectId\": \"proj_123\",\n      \"keepAlive\": true\n    },\n    \"anchor\": {\n      \"recording\": false\n    },\n    \"playwright\": {\n      \"launchOptions\": {\n        \"headless\": true\n      },\n      \"useCloakBrowser\": false\n    }\n  }\n}\n```\n\n### Stealth Chromium via CloakBrowser\n\nThe `playwright` provider can optionally launch [CloakBrowser](https://cloakbrowser.dev/) instead of vanilla Chromium for sessions that need to bypass bot detection. Enable it per-config or via env:\n\n```json\n{\n  \"providers\": {\n    \"playwright\": { \"useCloakBrowser\": true }\n  }\n}\n```\n\n```bash\nPLAYWRIGHT_USE_CLOAKBROWSER=true\n```\n\n`cloakbrowser` is an optional peer — install it only when you need stealth:\n\n```bash\nnpm install cloakbrowser\n```\n\nThe CloakBrowser binary (~200MB stealth Chromium) is downloaded automatically on the first session launch. Existing `launchOptions` / `contextOptions` continue to apply, and the rest of the provider behaves identically to standard Playwright.\n\nRequired credentials by provider:\n- `playwright`: none\n- `browserbase`: `BROWSERBASE_API_KEY`, plus a `projectId` in config or `BROWSERBASE_PROJECT_ID`\n- `anchor`: `ANCHOR_API_KEY`\n- `cloudflare`: `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ACCOUNT_ID`\n\nOptional env defaults:\n- `BROWSERBASE_PROJECT_ID`\n- `BROWSERBASE_KEEP_ALIVE`\n- `BROWSERBASE_CONTEXT_ID`\n- `BROWSERBASE_PERSIST`\n- `PLAYWRIGHT_STORAGE_STATE_PATH`\n- `PLAYWRIGHT_EXECUTABLE_PATH`\n- `PLAYWRIGHT_CHANNEL`\n- `PLAYWRIGHT_USE_CLOAKBROWSER` (`true` to launch stealth Chromium via [CloakBrowser](https://cloakbrowser.dev/); requires `npm install cloakbrowser`)\n\n## Installation\n\nUse the standard config below in any MCP client that supports stdio:\n\n```json\n{\n  \"mcpServers\": {\n    \"parallel-browser-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"parallel-browser-mcp@latest\"],\n      \"env\": {\n        \"BROWSER_MCP_CONFIG\": \"{\\\"defaultProvider\\\":\\\"playwright\\\",\\\"providers\\\":{\\\"playwright\\\":{\\\"launchOptions\\\":{\\\"headless\\\":true}}}}\",\n        \"BROWSERBASE_API_KEY\": \"your_browserbase_key\",\n        \"ANCHOR_API_KEY\": \"your_anchor_key\"\n      }\n    }\n  }\n}\n```\n\n<details>\n<summary>Claude Code</summary>\n\nUse the Claude Code CLI to add the server:\n\n```bash\nclaude mcp add parallel-browser-mcp npx parallel-browser-mcp@latest\n```\n\nIf you need provider configuration, add the environment variables in your Claude MCP config using the standard config above.\n</details>\n\n<details>\n<summary>Claude Desktop</summary>\n\nFollow the Claude Desktop MCP install flow and use the standard config above in the local MCP configuration file.\n</details>\n\n<details>\n<summary>Codex</summary>\n\nUse the Codex CLI:\n\n```bash\ncodex mcp add parallel-browser-mcp npx \"parallel-browser-mcp@latest\"\n```\n\nOr add this to `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.parallel-browser-mcp]\ncommand = \"npx\"\nargs = [\"parallel-browser-mcp@latest\"]\n```\n</details>\n\n<details>\n<summary>Copilot</summary>\n\nUse the Copilot CLI interactive flow:\n\n```text\n/mcp add\n```\n\nOr add this to `~/.copilot/mcp-config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"parallel-browser-mcp\": {\n      \"type\": \"local\",\n      \"command\": \"npx\",\n      \"tools\": [\"*\"],\n      \"args\": [\"parallel-browser-mcp@latest\"],\n      \"env\": {\n        \"BROWSER_MCP_CONFIG\": \"{\\\"defaultProvider\\\":\\\"playwright\\\",\\\"providers\\\":{\\\"playwright\\\":{\\\"launchOptions\\\":{\\\"headless\\\":true}}}}\",\n        \"BROWSERBASE_API_KEY\": \"your_browserbase_key\",\n        \"ANCHOR_API_KEY\": \"your_anchor_key\"\n      }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary>Cursor</summary>\n\nGo to `Cursor Settings` -> `MCP` -> `Add new MCP Server`, then use:\n\n- command: `npx`\n- args: `parallel-browser-mcp@latest`\n\nOr paste the standard config above into the MCP config editor.\n</details>\n\n<details>\n<summary>Gemini</summary>\n\nAdd the server to `.gemini/settings.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"parallel-browser-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"parallel-browser-mcp@latest\"],\n      \"env\": {\n        \"BROWSER_MCP_CONFIG\": \"{\\\"defaultProvider\\\":\\\"playwright\\\",\\\"providers\\\":{\\\"playwright\\\":{\\\"launchOptions\\\":{\\\"headless\\\":true}}}}\",\n        \"BROWSERBASE_API_KEY\": \"your_browserbase_key\",\n        \"ANCHOR_API_KEY\": \"your_anchor_key\"\n      }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary>VS Code</summary>\n\nUse the MCP install flow in VS Code with the standard config above, or install with the VS Code CLI:\n\n```bash\ncode --add-mcp '{\"name\":\"parallel-browser-mcp\",\"command\":\"npx\",\"args\":[\"parallel-browser-mcp@latest\"]}'\n```\n</details>\n\n## Example Flow\n\n1. Call `start_session` with `{ \"provider\": \"playwright\" }`\n2. Read the returned session `id`\n3. Call `browser_navigate` with `{ \"sessionId\": 1, \"url\": \"https://example.com\" }`\n4. Call any additional `browser_*` tool with the same `sessionId`\n5. Call `close_session` when done\n\n## Development\n\n```bash\ncorepack pnpm install\ncorepack pnpm typecheck\ncorepack pnpm test\ncorepack pnpm test:coverage\ncorepack pnpm build\ncorepack pnpm smoke:local\n```\n\n## Publishing\n\nThis repo is set up to publish as an npm package:\n\n- the CLI entrypoint is `parallel-browser-mcp`\n- production builds exclude tests and smoke scripts\n- the published package only includes `dist`, `README.md`, and `.env.example`\n\nBefore publishing:\n\n```bash\ncorepack pnpm typecheck\ncorepack pnpm test\ncorepack pnpm build\nnpm pack --dry-run\n```\n\nGitHub Actions publishing:\n\n- `.github/workflows/publish.yml` publishes to npm on GitHub release publication or manual dispatch\n- set the `NPM_TOKEN` repository secret before using the publish workflow\n\n## Examples\n\n- `examples/local` contains a standalone npm package that connects to `parallel-browser-mcp` with `@langchain/mcp-adapters` and runs a LangChain agent against the local Playwright provider.\n- `examples/browserbase` contains a standalone npm package that connects LangChain to the published MCP server with Browserbase config and prompts the agent to use `browser_screenshot`.\n- `examples/anchor` contains a standalone npm package that connects LangChain to the published MCP server with Anchor config and prompts the agent to use `browser_snapshot`.\n- `examples/cloudflare` contains a standalone npm package that connects LangChain to the published MCP server with Cloudflare Browser Run config and prompts the agent to use `browser_snapshot`.\n- The root `.npmignore` excludes the full `examples` directory from npm publishing.\n\n## Testing\n\nThe repo includes:\n- unit coverage for config loading, providers, registry behavior, session tools, and representative browser tools\n- a local Playwright smoke script in `src/smoke/localSmoke.ts`\n\n## Notes\n\n- `start_session` is intentionally small. Provider-specific behavior belongs in MCP configuration, not tool inputs.\n- The server logs to stderr so stdout stays clean for MCP JSON-RPC traffic.\n- Browserbase and Anchor Browser are normalized to Playwright page operations after connection, so the browser tools stay provider-agnostic.\n",
  "bytes": 9067,
  "sha": "1b4e486bc9cb608664d96a89827afea5fb9b7374edaeeda026d2b6eb8ba8b1ea",
  "repo_slug": "etairl/parallel-browser-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_etairl_parallel_browser_mcp_c99f6313/readme"
}