A tiny wrapper that connects a browser-automation MCP server to a shared, already-running Chrome instance.
- Loads config (MCP server, CDP port, browser) from
.playwright-mcp/config.yml(created on first run; port auto-detected from9222). - If the browser isn't listening on that port, starts one via
simple-browser. - Runs the chosen MCP server connected to that browser — it never launches its own.
This gives MCP clients (like Claude Code) full browser automation — clicking, typing, navigating, screenshots — against a single shared Chrome instance.
--mcp value |
Server | Connection flag used |
|---|---|---|
playwright (default) |
@playwright/mcp |
--cdp-endpoint |
chrome-devtools |
chrome-devtools-mcp |
--browserUrl |
# Playwright MCP (default)
npx --yes playwright-browser-mcp@latest
# Chrome DevTools MCP
npx --yes playwright-browser-mcp@latest --mcp chrome-devtools
# All flags
npx --yes playwright-browser-mcp@latest --mcp chrome-devtools --port 9333 --browser electron| Flag | Description |
|---|---|
--mcp <name> |
MCP server: playwright or chrome-devtools. |
--port <N> |
Browser CDP debugging port. |
--browser <name> |
Browser started by simple-browser: chrome or electron. |
-h, --help |
Show help and exit. |
Unknown arguments are rejected.
Each value resolves as flag > config.yml > default (port also falls back to legacy port.txt before detecting a free port). Resolved values are written back to config.yml after every run; legacy txt files are removed.
# MCP server to run.
# Values: playwright | chrome-devtools (default: playwright)
mcp: playwright
# Browser CDP debugging port.
# Values: any TCP port (default: first free port from 9222, detected once)
port: 9222
# Browser started by simple-browser when nothing is listening on the port.
# Values: chrome | electron (default: chrome)
browser: chromePlaywright MCP screenshots/artifacts go to .playwright-mcp/output (chrome-devtools-mcp has no output-dir flag).
The wrapper passes opinionated defaults to @playwright/mcp (rationale in main.sh comments): --snapshot-mode none (no accessibility-tree YAML on every response), --image-responses omit (no inline screenshot bytes), --output-mode file (big payloads go to .playwright-mcp/output, referenced not inlined). chrome-devtools-mcp runs with upstream defaults.
claude mcp add playwright -- npx --yes playwright-browser-mcp@latest
# or
claude mcp add chrome-devtools -- npx --yes playwright-browser-mcp@latest --mcp chrome-devtoolsOr add to your project's .mcp.json:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["--yes", "playwright-browser-mcp@latest"]
}
}
}Go to Cursor Settings > MCP > Add new global MCP server and paste the same JSON as above.
codex mcp add playwright -- npx --yes playwright-browser-mcp@latestgemini mcp add playwright npx --yes playwright-browser-mcp@latest- Node.js and npm
lsof(standard on macOS/Linux)
MIT