A tab-aware Playwright MCP server for parallel agent workflows.
playwright-mcp-tabbed adds explicit tab_index support to Playwright MCP tools so multiple agents can operate on different tabs while sharing a single browser context and login session.
The official @playwright/mcp model is centered around a shared active page. That is perfectly fine for single-agent flows, but it becomes fragile in concurrent workflows:
- Agent A selects tab 1
- Agent B selects tab 2
- Agent A's next action may accidentally run on tab 2
This project removes that shared active-tab assumption. Instead, each tool call can target a tab directly.
playwright-mcp-tabbed is especially useful when browser automation is part of a larger agent workflow.
One main agent logs in once, opens several tabs, and assigns one tab_index to each bug-fixing sub-agent. Every sub-agent can reproduce and verify its own issue in parallel without losing authentication state.
After a refactor, different agents can validate /orders, /wallet, /settings, and /users at the same time while staying inside the same logged-in admin session.
One tab points to the old app, another to the migrated app, and another to a staging environment. Agents can compare behavior or styling in parallel without repeatedly logging in.
Instead of forcing one agent to serialize a long browser journey, you can split related subflows into dedicated tabs and assign them to separate agents.
- One browser instance
- One shared browser context
- Many tabs
- Every browser tool call can specify
tab_index
This gives you:
- shared cookies and login state
- stable routing to the intended tab
- better fit for multi-agent orchestration
- Adds
tab_index(and stabletab_id) to nearly all browser tools - Shares login state across tabs through one browser context for the same origin
browser_context_infoexplains open tabs and reminds thatlocalhostvs127.0.0.1use different cookies- Optional
PLAYWRIGHT_MCP_BASE_URLplusbrowser_navigate.base_urlfor relative paths like/dashboard browser_snapshotsupportsroot_selectorandmax_charsto limit MCP payload sizebrowser_clicksupportsforce,trial, andtimeout(Playwright semantics)browser_network_requestssupportslimitandurl_contains- Keeps tool names close to the official Playwright MCP naming
- Works well in Cursor and similar MCP clients
- Designed for deterministic parallel agent behavior
browser_tabsSupportsaction: "list" | "new" | "close";newaccepts optionallabel; list includestab_idper tabbrowser_context_infoJSON summary of tabs, origins, and per-origin storage notebrowser_navigatebrowser_snapshotbrowser_take_screenshotbrowser_run_codebrowser_clickbrowser_typebrowser_fill_formbrowser_file_uploadbrowser_hoverbrowser_select_optionbrowser_press_keybrowser_wait_forbrowser_evaluatebrowser_navigate_backbrowser_network_requestsbrowser_console_messagesbrowser_resizebrowser_dragbrowser_handle_dialogbrowser_closebrowser_install
Tools that target a page accept either tab_index or tab_id (mutually exclusive). Prefer tab_id when sub-agents might race on tab creation order.
{ "tab_index": 1 }{ "tab_id": "550e8400-e29b-41d4-a716-446655440000" }Exceptions (no tab argument): browser_tabs, browser_close, browser_install, browser_context_info.
PLAYWRIGHT_MCP_BASE_URL— optional default origin for relative URLs inbrowser_navigate(e.g.http://127.0.0.1:3000).PLAYWRIGHT_MCP_RECORD_VIDEO_DIR— optional writable directory for Playwright video recording. When set, each tab/page created in the shared browser context records a video. Video files are finalized when the page or browser context closes.
browser_tabs.selectis intentionally not implemented- tab switching is replaced by explicit
tab_indexrouting - the design target is concurrent agent execution, not a shared active-tab interaction model
npm install playwright-mcp-tabbedgit clone https://github.com/songofhawk/playwright-mcp-tabbed
cd playwright-mcp-tabbed && npm installAdd this to ~/.cursor/mcp.json:
{
"mcpServers": {
"playwright-tabbed": {
"command": "node",
"args": ["/absolute/path/to/playwright-mcp-tabbed/dist/index.js"],
"env": {
"PLAYWRIGHT_MCP_RECORD_VIDEO_DIR": "/absolute/path/to/recordings"
}
}
}
}You can keep the official playwright server alongside it and only use playwright-tabbed for concurrent browser tasks.
If you do not need recording, omit env or leave PLAYWRIGHT_MCP_RECORD_VIDEO_DIR unset.
This repository includes an optional Agent Skill (for Cursor, Claude Code, and similar hosts) that documents how a main agent should create tabs, assign stable tab_ids to parallel sub-agents, and merge results—aligned with this MCP server.
- Path in repo:
skills/playwright-tabbed-orchestration/— containsSKILL.mdand helper scriptscripts/resolve-base-url.js. - Prerequisite: enable the
playwright-tabbedMCP server in your client (see Add to Cursor). - Note: The published npm package includes
dist/andskills/; you can copy fromnode_modules/playwright-mcp-tabbed/skills/playwright-tabbed-orchestrationafter install, or clone / use GitHub subpath (below) so paths stay stable.
Resolve PLAYWRIGHT_BASE_URL, open N tabs, split URL/scenario lists, spawn N sub-agents (each scoped to one tab_id), then summarize. Full steps, guardrails, and a sub-agent prompt template are in SKILL.md.
Cursor — copy the folder into a skills directory your Cursor version recognizes, for example:
- Project-local:
<your-project>/.cursor/skills/playwright-tabbed-orchestration/ - Or your user-level skills path per current Cursor documentation.
Claude Code — copy to:
<repo>/.claude/skills/playwright-tabbed-orchestration/(or the global skills location described in Anthropic’s docs).
OpenAI Codex — use the Codex skill-installer helper against this repository and the subpath below (adjust --ref if not on main):
python scripts/install-skill-from-github.py \
--repo songofhawk/playwright-mcp-tabbed \
--path skills/playwright-tabbed-orchestrationEquivalent tree URL:
https://github.com/songofhawk/playwright-mcp-tabbed/tree/main/skills/playwright-tabbed-orchestration
Restart Cursor / Codex (or reload skills) after copying or installing.
From the skill root:
cd skills/playwright-tabbed-orchestration
node scripts/resolve-base-url.js --helpPrints the site root URL from PLAYWRIGHT_BASE_URL (environment variable and/or git-root .env.local / .env / playwright.env.local). When resolving from project files, run with your terminal cwd on the application repository, or set PLAYWRIGHT_BASE_URL explicitly.
Use playwright-mcp-tabbed when:
- you have multiple sub-agents running browser tasks at the same time
- you need shared login state across those tasks
- you want deterministic browser routing without a shared current-tab pointer
Stay with the official @playwright/mcp when:
- you only have one agent
- your workflow is strictly sequential
- you do not need shared tabs across concurrent tasks
This project intentionally favors explicit tab routing over active-tab semantics. If your tooling depends on browser_tabs.select, this server is not a drop-in replacement for that specific behavior.
MIT
