
Parallel Browser MCP
β 43from etairl
MCP server for parallel browser automation across multiple providers (Playwright, Browserbase, Anchor, Cloudflare).
parallel-browser-mcp
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.
Supported providers:
playwrightfor local Chromiumbrowserbasevia@browserbasehq/sdkanchorviaanchorbrowsercloudflarevia Cloudflare Browser Run
Each browser session gets a numeric ID like 1, 2, 3, and every browser_* tool accepts a sessionId.
Features
- Multiple concurrent browser sessions in memory
- Provider abstraction shared across Browserbase, Anchor Browser, Cloudflare Browser Run, and local Playwright
- MCP session tools:
start_sessionclose_sessionclose_all_sessionsget_sessions
- Browser tools:
browser_navigatebrowser_go_backbrowser_clickbrowser_fillbrowser_fill_formbrowser_screenshotbrowser_snapshotbrowser_hoverbrowser_dragbrowser_select_optionbrowser_generate_locatorbrowser_get_page_structurebrowser_evaluatebrowser_keyboard_pressbrowser_keyboard_typebrowser_mouse_movebrowser_mouse_click_xybrowser_mouse_dragbrowser_upload_filebrowser_wait_for_selectorbrowser_wait_for_timeout
Example Flow
- Call
start_sessionwith{ "provider": "playwright" } - Read the returned session
id - Call
browser_navigatewith{ "sessionId": 1, "url": "https://example.com" } - Call any additional
browser_*tool with the samesessionId - Call
close_sessionwhen done
Development
corepack pnpm install
corepack pnpm typecheck
corepack pnpm test
corepack pnpm test:coverage
corepack pnpm build
corepack pnpm smoke:localPublishing
This repo is set up to publish as an npm package:
- the CLI entrypoint is
parallel-browser-mcp - production builds exclude tests and smoke scripts
- the published package only includes
dist,README.md, and.env.example
Before publishing:
corepack pnpm typecheck
corepack pnpm test
corepack pnpm build
npm pack --dry-runGitHub Actions publishing:
.github/workflows/publish.ymlpublishes to npm on GitHub release publication or manual dispatch- set the
NPM_TOKENrepository secret before using the publish workflow
Examples
examples/localcontains a standalone npm package that connects toparallel-browser-mcpwith@langchain/mcp-adaptersand runs a LangChain agent against the local Playwright provider.examples/browserbasecontains a standalone npm package that connects LangChain to the published MCP server with Browserbase config and prompts the agent to usebrowser_screenshot.examples/anchorcontains a standalone npm package that connects LangChain to the published MCP server with Anchor config and prompts the agent to usebrowser_snapshot.examples/cloudflarecontains a standalone npm package that connects LangChain to the published MCP server with Cloudflare Browser Run config and prompts the agent to usebrowser_snapshot.- The root
.npmignoreexcludes the fullexamplesdirectory from npm publishing.
Testing
The repo includes:
- unit coverage for config loading, providers, registry behavior, session tools, and representative browser tools
- a local Playwright smoke script in
src/smoke/localSmoke.ts
Notes
start_sessionis intentionally small. Provider-specific behavior belongs in MCP configuration, not tool inputs.- The server logs to stderr so stdout stays clean for MCP JSON-RPC traffic.
- Browserbase and Anchor Browser are normalized to Playwright page operations after connection, so the browser tools stay provider-agnostic.
corepack pnpm install
corepack pnpm buildBefore it works, you'll need: BROWSER_MCP_CONFIG
Quick Start
corepack pnpm install
corepack pnpm buildRun locally over stdio:
node dist/index.jsRun it as an npm package CLI:
npx parallel-browser-mcp@latestConfiguration
Provider-specific settings are configured at the MCP server configuration level, not per tool call.
The server reads config in this order:
BROWSER_MCP_CONFIGBROWSER_MCP_CONFIG_PATH- direct env defaults
- built-in defaults
Recommended config shape:
{
"defaultProvider": "playwright",
"providers": {
"browserbase": {
"projectId": "proj_123",
"keepAlive": true
},
"anchor": {
"recording": false
},
"playwright": {
"launchOptions": {
"headless": true
},
"useCloakBrowser": false
}
}
}Stealth Chromium via CloakBrowser
The playwright provider can optionally launch CloakBrowser instead of vanilla Chromium for sessions that need to bypass bot detection. Enable it per-config or via env:
{
"providers": {
"playwright": { "useCloakBrowser": true }
}
}PLAYWRIGHT_USE_CLOAKBROWSER=truecloakbrowser is an optional peer β install it only when you need stealth:
npm install cloakbrowserThe 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.
Required credentials by provider:
playwright: nonebrowserbase:BROWSERBASE_API_KEY, plus aprojectIdin config orBROWSERBASE_PROJECT_IDanchor:ANCHOR_API_KEYcloudflare:CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID
Optional env defaults:
BROWSERBASE_PROJECT_IDBROWSERBASE_KEEP_ALIVEBROWSERBASE_CONTEXT_IDBROWSERBASE_PERSISTPLAYWRIGHT_STORAGE_STATE_PATHPLAYWRIGHT_EXECUTABLE_PATHPLAYWRIGHT_CHANNELPLAYWRIGHT_USE_CLOAKBROWSER(trueto launch stealth Chromium via CloakBrowser; requiresnpm install cloakbrowser)
Installation
Use the standard config below in any MCP client that supports stdio:
{
"mcpServers": {
"parallel-browser-mcp": {
"command": "npx",
"args": ["parallel-browser-mcp@latest"],
"env": {
"BROWSER_MCP_CONFIG": "{\"defaultProvider\":\"playwright\",\"providers\":{\"playwright\":{\"launchOptions\":{\"headless\":true}}}}",
"BROWSERBASE_API_KEY": "your_browserbase_key",
"ANCHOR_API_KEY": "your_anchor_key"
}
}
}
}Use the Claude Code CLI to add the server:
claude mcp add parallel-browser-mcp npx parallel-browser-mcp@latestIf you need provider configuration, add the environment variables in your Claude MCP config using the standard config above.
</details> <details> <summary>Claude Desktop</summary>Follow the Claude Desktop MCP install flow and use the standard config above in the local MCP configuration file.
</details> <details> <summary>Codex</summary>Use the Codex CLI:
codex mcp add parallel-browser-mcp npx "parallel-browser-mcp@latest"Or add this to ~/.codex/config.toml:
[mcp_servers.parallel-browser-mcp]
command = "npx"
args = ["parallel-browser-mcp@latest"]Use the Copilot CLI interactive flow:
/mcp addOr add this to ~/.copilot/mcp-config.json:
{
"mcpServers": {
"parallel-browser-mcp": {
"type": "local",
"command": "npx",
"tools": ["*"],
"args": ["parallel-browser-mcp@latest"],
"env": {
"BROWSER_MCP_CONFIG": "{\"defaultProvider\":\"playwright\",\"providers\":{\"playwright\":{\"launchOptions\":{\"headless\":true}}}}",
"BROWSERBASE_API_KEY": "your_browserbase_key",
"ANCHOR_API_KEY": "your_anchor_key"
}
}
}
}Go to Cursor Settings -> MCP -> Add new MCP Server, then use:
- command:
npx - args:
parallel-browser-mcp@latest
Or paste the standard config above into the MCP config editor.
</details> <details> <summary>Gemini</summary>Add the server to .gemini/settings.json:
{
"mcpServers": {
"parallel-browser-mcp": {
"command": "npx",
"args": ["parallel-browser-mcp@latest"],
"env": {
"BROWSER_MCP_CONFIG": "{\"defaultProvider\":\"playwright\",\"providers\":{\"playwright\":{\"launchOptions\":{\"headless\":true}}}}",
"BROWSERBASE_API_KEY": "your_browserbase_key",
"ANCHOR_API_KEY": "your_anchor_key"
}
}
}
}Use the MCP install flow in VS Code with the standard config above, or install with the VS Code CLI:
code --add-mcp '{"name":"parallel-browser-mcp","command":"npx","args":["parallel-browser-mcp@latest"]}'No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.