需 Node.js 18 或更新版本;需在客户端中按标准 mcpServers 配置接入,不能直接当命令行工具用;README 提示编码类 agent 可能更适合用 Playwright CLI+SKILLS 以节省 token
playwright-mcp
microsoftApache-2.0活跃维护把 Playwright 浏览器自动化能力封装成 MCP 服务器,让 AI Agent 通过结构化接口操控网页、抓取页面内容,无需依赖截图识别。
Playwright MCP server
npx @playwright/mcp@latestREADME 未说明显存或 GPU 要求,仅要求 Node.js 18 或更新版本,以及 VS Code、Cursor、Windsurf、Claude Desktop 等任一 MCP 客户端
用 Playwright 给 LLM 提供浏览器自动化能力的 MCP 服务器,靠无障碍树而非截图操作网页
把 Playwright 浏览器自动化能力封装成 MCP 服务器,让 AI Agent 通过结构化接口操控网页、抓取页面内容,无需依赖截图识别。
核心能力
- 基于 Playwright 无障碍树快照操作页面
- 无需视觉模型,纯结构化数据交互
- 工具调用确定性强,避免截图歧义
- 通过标准 MCP 配置接入各类客户端
容易踩的坑
- v0.0.85最新正式版2026-11-09 · 2026-11-09 18:28 UTC
✨ Highlights
- 🌙 Keep the browser in the background (microsoft/playwright#42973) — connecting through the extension activated the tab and focused the browser window, taking the screen from the app you were working in. Pass
--backgroundalongside--extension(configbackground: true, envPLAYWRIGHT_MCP_BACKGROUND=1) to leave the connected tab inactive and its window unfocused, and to open the client's new tabs in the background. WithPLAYWRIGHT_MCP_EXTENSION_TOKENset, the connect page opens in the background too (Chrome 158.0.8127.2 or later, with the browser already running). Requires extension 0.5.0 or later. Chrome throttles timers and animation frames in background tabs. (microsoft/playwright#43864) - 🗂️ Leave tabs out of the Playwright tab group (microsoft/playwright#43038) — the extension always moved the tabs a client controls into its own tab group. Pass
--no-tab-groupalongside--extension(configtabGroup: false, envPLAYWRIGHT_MCP_NO_TAB_GROUP=1) to keep the selected tab and the tabs the client opens in their existing groups, if any. Connection approval is unchanged, each controlled tab still belongs to one client, and the extension's status page lists the controlled tabs. Requires extension 0.5.0 or later. (microsoft/playwright#43814) - 👁️ Match only visible elements (microsoft/playwright#43855) — a locator could resolve to a hidden element, or fail because a hidden duplicate matched as well. Set
browser.contextOptions.locateOnlyVisible: truein the config file to restrict locators to visible elements, both in thetargetof element tools such asbrowser_clickand inbrowser_run_code_unsafe, as if.filter({ visible: true })ended each of them. A locator that ends with its own visibility filter keeps it. Off by default. (microsoft/playwright#43903) - 🏷️ Keep container names in snapshots (microsoft/playwright#43809) — dialogs, landmarks and tables could appear unnamed even when their heading or caption was visible.
browser_snapshotnow retains identifying names on containers and table headers when the text supplying the name also appears among their children. (microsoft/playwright#43810) - 🎯 Find custom form controls by label (microsoft/playwright#43898) — native
<label>associations were ignored for form-associated custom elements. Element tools now recognize these controls through targets such asgetByLabel('City'), and accessible names use the associated labels too. Bothforattributes and nested labels are supported. (microsoft/playwright#43900)
🐛 Fixes
fix(aria): restore snapshot visibility rules for inert and modal content— the filtering announced in v0.0.84 is reverted:browser_snapshotno longer hides content solely because it is inert or outside a modal dialog. Click, fill and select actions still wait for explicitly inert targets to become non-inert (microsoft/playwright#43792). (microsoft/playwright#43850, microsoft/playwright#43851)fix(mcp): preserve non-JSON evaluation results—browser_evaluatereturns readable representations of values such as BigInt,NaN,Infinity,undefinedand circular objects instead of losing values or failing JSON serialization. JSON-compatible results keep their existing format (
- 🌙 Keep the browser in the background (microsoft/playwright#42973) — connecting through the extension activated the tab and focused the browser window, taking the screen from the app you were working in. Pass
- v0.0.842026-10-31 · 2026-10-31 15:20 UTC
查看更新说明
✨ Highlights
- 👥 Separate sessions in one browser — work with multiple accounts without sharing their cookies or storage.
browser_tabswithaction: "new"now acceptsisolatedContext: "<name>": tabs with the same name share a context, while different names stay isolated. Omit it or use"default"for the default context. Cookie and storage tools operate on the current tab's context. (microsoft/playwright#43087) - 🙈 Redact runtime values in URLs (#1791) — session and grant values minted at runtime cannot be listed in a secrets file ahead of time.
--redact-url-params=access_token,code(configredactUrlParams, envPLAYWRIGHT_MCP_REDACT_URL_PARAMS) replaces the named query and fragment parameter values with<redacted>in tool responses. Likesecrets, this is a convenience, not a security feature. The extension also removes its connection token from the connect page URL after reading it. (microsoft/playwright#43258) - 🔎 Bound find results (microsoft/playwright#42077) — common search terms no longer have to fill the response with every match.
browser_findaccepts a positive integermaxResults, returns the first matching items with their context, and reports the total match count. Omit it to keep returning all matches; ancestor paths are unchanged. (microsoft/playwright#42947) - 🌐 Inspect requests across navigations (microsoft/playwright-cli#479) — requests from the previous page are no longer lost as soon as a flow navigates.
browser_network_requestsacceptsall: trueto include retained history, keeping up to 200 requests from earlier navigations. Request indexes stay stable across navigations forbrowser_network_request.browser_console_messagesalso reports counts consistent with its existingalloption. (microsoft/playwright#43526) - 🎯 Use locators in your language (#1797) — element tools such as
browser_clicknow accept JavaScript, Python, Java and C# locators intarget, alongside snapshot refs and CSS selectors. Invalid targets get an actionable error, including a reminder to pass the bare ref rather thanbutton [ref=e5]. (microsoft/playwright#43539) - 📂 Skip unsupported workspace-root requests (#1798) — clients that advertise roots but cannot answer
roots/listcan stall the first tool call. Pass--ignore-roots(configignoreRoots: true, envPLAYWRIGHT_MCP_IGNORE_ROOTS=true) to skip that request and use the server's current working directory as the workspace root. (microsoft/playwright#43532) - 🍪 Delete cookies by domain and path — deleting a cookie by name no longer has to remove every cookie with that name.
browser_cookie_delete(opt-in via--caps=storage) accepts optionaldomainandpathfilters to leave other domains and paths untouched. (microsoft/playwright#43319)
🐛 Fixes
fix(mcp): allow combining time, text and textGone in browser_wait_for— when combined with a text condition,timeis its timeout (capped at 30 seconds), not a delay before checking it. Supplying bothtextandtextGonenow waits for the first condition to happen, rather than both in sequence. (microsoft/playwright#43011)fix(mcp): allow loopback hosts by default for all bind addresses— HTTP clients can connect through `loc
- 👥 Separate sessions in one browser — work with multiple accounts without sharing their cookies or storage.
- v0.0.832026-09-28 · 2026-09-28 23:17 UTC
查看更新说明
Bug Fixes
browser_findtakesfilenameto save matches to a file instead of the response (microsoft/playwright#42077). (microsoft/playwright#42968)browser_navigateandbrowser_reloadreport a dialog opened during page load instead of timing out (microsoft/playwright#42817). (microsoft/playwright#42908)- The server no longer crashes when the browser is closed during a download (microsoft/playwright#42831). (microsoft/playwright#42922)
browser_wait_forreports whentimeis capped at 30 seconds (#1767). (microsoft/playwright#42932)- WebMCP tools no longer stay bound to a stale tab or frame (microsoft/playwright#42816). (microsoft/playwright#42821)
- WebMCP tool calls work with Chromium 155+. (microsoft/playwright#42915)
- Snapshots quote accessible names that look like regexes, e.g.
"/home/"(microsoft/playwright#42807). (microsoft/playwright#42811) - The Docker image reaps orphaned browser processes (#1769). (#1771)
- v0.0.822026-09-18 · 2026-09-18 23:35 UTC
查看更新说明
✨ Highlights
- 🎬 Smooth 60 fps, styleable videos —
browser_start_video(opt-in via--caps=devtools) takesfps, sofps: 60records smooth 60 fps videos instead of the default 25, andcursor: truerenders an animated mouse cursor that travels to each action point and stays visible between actions.browser_video_show_actionstakes astylewithpoint,highlightandtitleCSS declarations; the action point marker and the target highlight are now only shown when styled. (microsoft/playwright#42752, microsoft/playwright#42758) - 🧰 WebMCP tools become real MCP tools — the tools a page registers through the WebMCP API now show up right in the tool list as
webmcp_<tool>, with the page's own input schema and annotations, so an agent can call them directly and let the page do the work instead of driving its UI. The list follows the current tab, and clients get atools/list_changednotification when it changes. This replacesbrowser_webmcp_list/browser_webmcp_callfrom v0.0.81, which are no longer exposed over MCP. Tool names, descriptions, schemas and results come from the page, so treat them as untrusted input. Pass--no-webmcp(configwebmcp: false, envPLAYWRIGHT_MCP_WEBMCP=false) to opt out. WebMCP is experimental, see WebMCP in Chrome for how to enable it. (microsoft/playwright#42671) - 🌗 Switch between light and dark color scheme (microsoft/playwright#42243) — an agent working on a dark theme had no way to see it mid-session. The new
browser_emulate_mediatool emulates media features on the fly:colorScheme,reducedMotion,forcedColors,contrastand themediatype (screen / print). Omitted parameters are left unchanged,nullclears an override. (microsoft/playwright#42668) - 📁 Absolute paths in results (microsoft/playwright#42497) — links to snapshots, screenshots, console logs and downloads are relative to the workspace root, which a client without one cannot resolve. Pass
--file-paths=absolute(configfilePaths: "absolute", envPLAYWRIGHT_MCP_FILE_PATHS=absolute) to get absolute paths instead. (microsoft/playwright#42673)
🐛 Fixes
fix(mcp): keep upload modal and reject bad headers— a failedbrowser_file_upload(e.g. a missing file) reports the error and keeps the file chooser open so it can be retried, andbrowser_route(opt-in via--caps=network) returns an error for a header that is not in theName: Valueform instead of setting a header named"". (microsoft/playwright#42713)fix(chromium): bypass service workers on the storage state page—browser_storage_state(opt-in via--caps=storage) no longer runs the site's own scripts, or fails when they redirect, for origins with an active service worker (microsoft/playwright#42656). (microsoft/playwright#42664, microsoft/playwright#42741)
📦 Upgrading
Configs that use
@playwright/mcp@latestpick this release up on the next client restart. To pin it:npx @playwright/[email protected] - 🎬 Smooth 60 fps, styleable videos —
- v0.0.812026-09-14 · 2026-09-14 21:24 UTC
查看更新说明
What's New
🎉 New Tools
browser_webmcp_list/browser_webmcp_call— List and call the tools a page registers through the WebMCP API, letting the page do the work instead of driving its UI. When a page has WebMCP tools, the page status reports how many are available (#42613). WebMCP is experimental, see WebMCP in Chrome for how to enable it.
Other Changes
- New
--profile-dir-name <name>option (envPLAYWRIGHT_MCP_PROFILE_DIR_NAME) selects the Chrome profile to connect to in extension mode when the extension is installed in several profiles, for example"Profile 1"(#42527) - Headless browsers launched by the server are now closed after one hour without tool calls; the next tool call launches a new one. Use
--idle-timeout <ms>(configtimeouts.idle, envPLAYWRIGHT_MCP_IDLE_TIMEOUT) to change the timeout,0disables it. Headed and attached browsers are not closed unless a timeout is set explicitly (#42663, #42676) --image-responsesacceptsonly: a response that carries an image consists of the image parts alone, without the text part (#42672)
Bug Fixes
browser_closereturns an error when the browser context is shared (--shared-browser-context) instead of breaking the calling client's session. This supersedes the v0.0.80 change that dropped the backend afterbrowser_close(#42495)- With
--shared-browser-context,browser_start_recording/browser_stop_recording(opt-in via--caps=devtools) keep each client's recording separate instead of delivering one client's recorded actions to another (#42622, #42627) - The file access check follows symlinks, so a symlink inside the workspace can no longer be used to read or write files outside the allowed roots (#42628)
- Explicitly named output files in a nested directory (e.g.
sub/shot.png) no longer fail withENOENT;browser_file_uploadandbrowser_dropresolve relative paths against the workspace root (#42540) - In extension mode with
PLAYWRIGHT_MCP_EXTENSION_TOKENset, a connection that never completes (e.g. the token belongs to another Chrome profile) now fails after 30 seconds with a hint instead of hanging the tool call forever (#42525) - Disable the Chromium sandbox by default on Linux for the bundled Chromium build, which lacks the setuid sandbox helper (#42490)
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Playwright MCP
A Model Context Protocol (MCP) server that provides browser automation capabilities using Playwright. This server enables LLMs to interact with web pages through structured accessibility snapshots, bypassing the need for screenshots or visually-tuned models.
Playwright MCP vs Playwright CLI
This package provides MCP interface into Playwright. If you are using a coding agent, you might benefit from using the CLI+SKILLS instead.
-
CLI: Modern coding agents increasingly favor CLI–based workflows exposed as SKILLs over MCP because CLI invocations are more token-efficient: they avoid loading large tool schemas and verbose accessibility trees into the model context, allowing agents to act through concise, purpose-built commands. This makes CLI + SKILLs better suited for high-throughput coding agents that must balance browser automation with large codebases, tests, and reasoning within limited context windows.Learn more about Playwright CLI with SKILLS.
-
MCP: MCP remains relevant for specialized agentic loops that benefit from persistent state, rich introspection, and iterative reasoning over page structure, such as exploratory automation, self-healing tests, or long-running autonomous workflows where maintaining continuous browser context outweighs token cost concerns.
Key Features
- Fast and lightweight. Uses Playwright's accessibility tree, not pixel-based input.
- LLM-friendly. No vision models needed, operates purely on structured data.
- Deterministic tool application. Avoids ambiguity common with screenshot-based approaches.
Requirements
- Node.js 18 or newer
- VS Code, Cursor, Windsurf, Claude Desktop, Goose, Grok, Junie or any other MCP client
Getting started
First, install the Playwright MCP server with your client.
Standard config works in most of the tools:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Add via the Amp VS Code extension settings screen or by updating your settings.json file:
"amp.mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
Amp CLI Setup:
Add via the amp mcp add command below
amp mcp add playwright -- npx @playwright/mcp@latest
Add via the Antigravity settings or by updating your configuration file:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Use the Claude Code CLI to add the Playwright MCP server:
claude mcp add playwright npx @playwright/mcp@latest
Follow the MCP install guide, use the standard config above.
Follow the instruction in the section Configuring MCP Servers
Example: Local Setup
Add the following to your cline_mcp_settings.json file:
{
"mcpServers": {
"playwright": {
"type": "stdio",
"command": "npx",
"timeout": 30,
"args": [
"-y",
"@playwright/mcp@latest"
],
"disabled": false
}
}
}
Use the Codex CLI to add the Playwright MCP server:
codex mcp add playwright npx "@playwright/mcp@latest"
Alternatively, create or edit the configuration file ~/.codex/config.toml and add:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]
For more information, see the Codex MCP documentation.
Use the Copilot CLI to interactively add the Playwright MCP server:
/mcp add
Alternatively, create or edit the configuration file ~/.copilot/mcp-config.json and add:
{
"mcpServers": {
"playwright": {
"type": "local",
"command": "npx",
"tools": [
"*"
],
"args": [
"@playwright/mcp@latest"
]
}
}
}
For more information, see the Copilot CLI documentation.
Click the button to install:
Or install manually:
Go to Cursor Settings -> MCP -> Add new MCP Server. Name to your liking, use command type with the command npx @playwright/mcp@latest. You can also verify config or add command like arguments via clicking Edit.
Use the Factory CLI to add the Playwright MCP server:
droid mcp add playwright "npx @playwright/mcp@latest"
Alternatively, type /mcp within Factory droid to open an interactive UI for managing MCP servers.
For more information, see the Factory MCP documentation.
Follow the MCP install guide, use the standard config above.
Click the button to install:
Or install manually:
Go to Advanced settings -> Extensions -> Add custom extension. Name to your liking, use type STDIO, and set the command to npx @playwright/mcp. Click "Add Extension".
Use the Grok CLI to add the Playwright MCP server:
grok mcp add playwright -- npx @playwright/mcp@latest
Alternatively, create or edit the configuration file ~/.grok/config.toml and add:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]
For more information, see the Grok MCP documentation.
To add the Playwright MCP server in Junie CLI:
- Type
/mcp - Press
Ctrl+Ato add a new MCP server - Select Playwright from the list
Alternatively, add to .junie/mcp/mcp.json:
{
"mcpServers": {
"Playwright": {
"command": "npx",
"args": [
"-y",
"@playwright/mcp@latest"
]
}
}
}
For more information, see the Junie MCP configuration documentation.
Follow the MCP Servers documentation. For example in .kiro/settings/mcp.json:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Click the button to install:
Or install manually:
Go to Program in the right sidebar -> Install -> Edit mcp.json. Use the standard config above.
Follow the MCP Servers documentation. For example in ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"playwright": {
"type": "local",
"command": [
"npx",
"@playwright/mcp@latest"
],
"enabled": true
}
}
}
Open Qodo Gen chat panel in VSCode or IntelliJ → Connect more tools → + Add new MCP → Paste the standard config above.
Click Save.
Click the button to install:
Or install manually:
Follow the MCP install guide, use the standard config above. You can also install the Playwright MCP server using the VS Code CLI:
# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'
After installation, the Playwright MCP server will be available for use with your GitHub Copilot agent in VS Code.
Go to Settings -> AI -> Manage MCP Servers -> + Add to add an MCP Server. Use the standard config above.
Alternatively, use the slash command /add-mcp in the Warp prompt and paste the standard config from above:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Follow Windsurf MCP documentation. Use the standard config above.
Configuration
Playwright MCP server supports following arguments. They can be provided in the JSON configuration above, as a part of the "args" list:
| Option | Description |
|---|---|
| --allowed-hosts <hosts...> | comma-separated list of hosts this server is allowed to serve from. Defaults to localhost, loopback IPs and the host passed via --host; other hosts must be listed explicitly. Pass '*' to disable the host check.env PLAYWRIGHT_MCP_ALLOWED_HOSTS |
| --allowed-origins | semicolon-separated list of TRUSTED origins to allow the browser to request. Default is to allow all. Important: does not serve as a security boundary and does not affect redirects.env PLAYWRIGHT_MCP_ALLOWED_ORIGINS |
| --allow-unrestricted-file-access | allow access to files outside of the workspace roots. Also allows unrestricted access to file:// URLs. By default access to file system is restricted to workspace root directories (or cwd if no roots are configured) only, and navigation to file:// URLs is blocked.env PLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESS |
| --blocked-origins | semicolon-separated list of origins to block the browser from requesting. Blocklist is evaluated before allowlist. If used without the allowlist, requests not matching the blocklist are still allowed. Important: does not serve as a security boundary and does not affect redirects.env PLAYWRIGHT_MCP_BLOCKED_ORIGINS |
| --block-service-workers | block service workersenv PLAYWRIGHT_MCP_BLOCK_SERVICE_WORKERS |
| --browser | browser or chrome channel to use, possible values: chrome, firefox, webkit, msedge.env PLAYWRIGHT_MCP_BROWSER |
| --caps | comma-separated list of additional capabilities to enable, possible values: vision, pdf, devtools.env PLAYWRIGHT_MCP_CAPS |
| --cdp-endpoint | CDP endpoint to connect to.env PLAYWRIGHT_MCP_CDP_ENDPOINT |
| --cdp-header <headers...> | CDP headers to send with the connect request, multiple can be specified.env PLAYWRIGHT_MCP_CDP_HEADERS |
| --cdp-timeout | timeout in milliseconds for connecting to CDP endpoint, defaults to 30000msenv PLAYWRIGHT_MCP_CDP_TIMEOUT |
| --codegen | specify the language to use for code generation, possible values: "typescript", "python", "java", "csharp", "none". Default is "typescript".env PLAYWRIGHT_MCP_CODEGEN |
| --config | path to the configuration file.env PLAYWRIGHT_MCP_CONFIG |
| --console-level | level of console messages to return: "error", "warning", "info", "debug". Each level includes the messages of more severe levels.env PLAYWRIGHT_MCP_CONSOLE_LEVEL |
| --device | device to emulate, for example: "iPhone 15"env PLAYWRIGHT_MCP_DEVICE |
| --mobile | emulate a generic mobile device (Pixel 10 for Chromium, iPhone 17 for WebKit). Mobile pages are usually lighter, which saves tokens. Cannot be combined with --device.env PLAYWRIGHT_MCP_MOBILE |
| --executable-path | path to the browser executable.env PLAYWRIGHT_MCP_EXECUTABLE_PATH |
| --extension | Connect to a running browser instance (Edge/Chrome only). Requires the "Playwright Extension" to be installed.env PLAYWRIGHT_MCP_EXTENSION |
| --endpoint | Bound browser endpoint to connect to.env PLAYWRIGHT_MCP_ENDPOINT |
| --file-paths | how file paths are rendered in tool results, "relative" to the workspace root or "absolute". Default is "relative".env PLAYWRIGHT_MCP_FILE_PATHS |
| --grant-permissions <permissions...> | List of permissions to grant to the browser context, for example "geolocation", "clipboard-read", "clipboard-write".env PLAYWRIGHT_MCP_GRANT_PERMISSIONS |
| --headless | run browser in headless mode, headed by defaultenv PLAYWRIGHT_MCP_HEADLESS |
| --host | host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.env PLAYWRIGHT_MCP_HOST |
| --idle-timeout | close the browser after this many milliseconds without a completed tool call, the next tool call relaunches it. Defaults to one hour for headless browsers, never for headed ones, 0 disables.env PLAYWRIGHT_MCP_IDLE_TIMEOUT |
| --ignore-https-errors | ignore https errorsenv PLAYWRIGHT_MCP_IGNORE_HTTPS_ERRORS |
| --ignore-roots | do not ask the client for its workspace roots, use the current working directory as the workspace root instead. Use this with clients that advertise roots, but can not answer the roots request.env PLAYWRIGHT_MCP_IGNORE_ROOTS |
| --init-page <path...> | path to TypeScript file to evaluate on Playwright page objectenv PLAYWRIGHT_MCP_INIT_PAGE |
| --init-script <path...> | path to JavaScript file to add as an initialization script. The script will be evaluated in every page before any of the page's scripts. Can be specified multiple times.env PLAYWRIGHT_MCP_INIT_SCRIPT |
| --isolated | keep the browser profile in memory, do not save it to disk.env PLAYWRIGHT_MCP_ISOLATED |
| --image-responses | whether to send image responses to the client. Can be "allow", "omit" or "only". With "only", a response that carries an image consists of the image parts alone, without the text part. Defaults to "allow".env PLAYWRIGHT_MCP_IMAGE_RESPONSES |
| --no-sandbox | disable the sandbox for all process types that are normally sandboxed.env PLAYWRIGHT_MCP_NO_SANDBOX |
| --background | do not activate controlled tabs or focus the browser window when using --extension.env PLAYWRIGHT_MCP_BACKGROUND |
| --no-tab-group | do not group controlled tabs when using --extension.env PLAYWRIGHT_MCP_NO_TAB_GROUP |
| --no-webmcp | do not collect or expose the tools that a page registers through the WebMCP API.env PLAYWRIGHT_MCP_WEBMCP=false |
| --output-dir | path to the directory for automatically named output files, for example a screenshot taken without an explicit file name. Files with an explicit name are resolved against the workspace root instead and are not affected by this option.env PLAYWRIGHT_MCP_OUTPUT_DIR |
| --output-max-size | Threshold for evicting old output files, in bytes.env PLAYWRIGHT_MCP_OUTPUT_MAX_SIZE |
| --port | port to listen on for SSE transport.env PLAYWRIGHT_MCP_PORT |
| --profile-dir-name | name of the profile directory in the user data dir to connect to with --extension, for example "Profile 1". Defaults to the last used profile that has the extension installed.env PLAYWRIGHT_MCP_PROFILE_DIR_NAME |
| --proxy-bypass | comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"env PLAYWRIGHT_MCP_PROXY_BYPASS |
| --proxy-server | specify proxy server, for example "http://myproxy:3128", "http://user:password@myproxy:3128" or "socks5://myproxy:8080"env PLAYWRIGHT_MCP_PROXY_SERVER |
| --redact-url-params | comma-separated list of URL query and fragment parameter names, for example "access_token,code", whose values are replaced with in the tool responses.env PLAYWRIGHT_MCP_REDACT_URL_PARAMS |
| --sandbox | enable the sandbox for all process types that are normally not sandboxed.env PLAYWRIGHT_MCP_SANDBOX |
| --save-session | Whether to save the Playwright MCP session into the output directory.env PLAYWRIGHT_MCP_SAVE_SESSION |
| --secrets | path to a file containing secrets in the dotenv formatenv PLAYWRIGHT_MCP_SECRETS_FILE |
| --shared-browser-context | reuse the same browser context between all connected HTTP clients.env PLAYWRIGHT_MCP_SHARED_BROWSER_CONTEXT |
| --snapshot-boxes | include each element's bounding box as [box=x,y,width,height] in snapshots. Coordinates are viewport-relative, in CSS pixels.env PLAYWRIGHT_MCP_SNAPSHOT_BOXES |
| --snapshot-mode | when taking snapshots for responses, specifies the mode to use. Can be "full" or "none". Default is "full".env PLAYWRIGHT_MCP_SNAPSHOT_MODE |
| --storage-state | path to the storage state file for isolated sessions.env PLAYWRIGHT_MCP_STORAGE_STATE |
| --test-id-attribute | specify the attribute to use for test ids, defaults to "data-testid"env PLAYWRIGHT_MCP_TEST_ID_ATTRIBUTE |
| --timeout-action | specify action timeout in milliseconds, defaults to 5000msenv PLAYWRIGHT_MCP_TIMEOUT_ACTION |
| --timeout-navigation | specify navigation timeout in milliseconds, defaults to 60000msenv PLAYWRIGHT_MCP_TIMEOUT_NAVIGATION |
| --timeout-settle | how long to wait after each action for triggered work to settle, in milliseconds, defaults to 500msenv PLAYWRIGHT_MCP_TIMEOUT_SETTLE |
| --user-agent | specify user agent stringenv PLAYWRIGHT_MCP_USER_AGENT |
| --user-data-dir | path to the user data directory. If not specified, a temporary directory will be created.env PLAYWRIGHT_MCP_USER_DATA_DIR |
| --viewport-size | specify browser viewport size in pixels, for example "1280x720"env PLAYWRIGHT_MCP_VIEWPORT_SIZE |
User profile
You can run Playwright MCP with persistent profile like a regular browser (default), in isolated contexts for testing sessions, or connect to your existing browser using the browser extension.
Persistent profile
All the logged in information will be stored in the persistent profile, you can delete it between sessions if you'd like to clear the offline state.
Persistent profile is located at the following locations and you can override it with the --user-data-dir argument.
# Windows
%USERPROFILE%\AppData\Local\ms-playwright\mcp-{channel}-{workspace-hash}
# macOS
- ~/Library/Caches/ms-playwright/mcp-{channel}-{workspace-hash}
# Linux
- ~/.cache/ms-playwright/mcp-{channel}-{workspace-hash}
{workspace-hash} is derived from the MCP client's workspace root, so different projects get separate profiles automatically.
[!IMPORTANT] A persistent profile can only be used by one browser instance at a time, so concurrent MCP clients sharing the same workspace will conflict. To run several clients in parallel, start each additional client with
--isolatedor point it at a distinct--user-data-dir.
Isolated
In the isolated mode, each session is started in the isolated profile. Every time you ask MCP to close the browser,
the session is closed and all the storage state for this session is lost. You can provide initial storage state
to the browser via the config's contextOptions or via the --storage-state argument. Learn more about the storage
state here.
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--isolated",
"--storage-state={path/to/storage.json}"
]
}
}
}
Browser Extension
The Playwright MCP Chrome Extension allows you to connect to existing browser tabs and leverage your logged-in sessions and browser state. See microsoft/playwright › packages/extension for installation and setup instructions.
Initial state
There are multiple ways to provide the initial state to the browser context or a page.
For the storage state, you can either:
- Start with a user data directory using the
--user-data-dirargument. This will persist all browser data between the sessions. - Start with a storage state file using the
--storage-stateargument. This will load cookies and local storage from the file into an isolated browser context.
For the page state, you can use:
--init-pageto point to a TypeScript file that will be evaluated on the Playwright page object. This allows you to run arbitrary code to set up the page.
// init-page.ts
export default async ({ page }) => {
await page.context().grantPermissions(['geolocation']);
await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
await page.setViewportSize({ width: 1280, height: 720 });
};
--init-scriptto point to a JavaScript file that will be added as an initialization script. The script will be evaluated in every page before any of the page's scripts. This is useful for overriding browser APIs or setting up the environment.
// init-script.js
window.isPlaywrightMCP = true;
Configuration file
The Playwright MCP server can be configured using a JSON configuration file. You can specify the configuration file
using the --config command line option:
npx @playwright/mcp@latest --config path/to/config.json
{
/**
* The browser to use.
*/
browser?: {
/**
* The type of browser to use.
*/
browserName?: 'chromium' | 'firefox' | 'webkit';
/**
* Keep the browser profile in memory, do not save it to disk.
*/
isolated?: boolean;
/**
* Path to a user data directory for browser profile persistence.
* Temporary directory is created by default.
*/
userDataDir?: string;
/**
* Launch options passed to
* @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch-persistent-context
*
* This is useful for settings options like `channel`, `headless`, `executablePath`, etc.
*/
launchOptions?: playwright.LaunchOptions;
/**
* Context options for the browser context.
*
* This is useful for settings options like `viewport`.
*/
contextOptions?: playwright.BrowserContextOptions;
/**
* Chrome DevTools Protocol endpoint to connect to an existing browser instance in case of Chromium family browsers.
*/
cdpEndpoint?: string;
/**
* CDP headers to send with the connect request.
*/
cdpHeaders?: Record<string, string>;
/**
* Timeout in milliseconds for connecting to CDP endpoint. Defaults to 30000 (30 seconds). Pass 0 to disable timeout.
*/
cdpTimeout?: number;
/**
* Remote endpoint to connect to an existing Playwright server. May be a
* WebSocket URL string, or a [ConnectOptions] object that mirrors the
* `connectOptions` shape used by the test runner. When passed as an object,
* `exposeNetwork`, `headers`, `slowMo`, and `timeout` are forwarded to the
* underlying connect call.
*/
remoteEndpoint?: string | playwright.ConnectOptions & { endpoint: string };
/**
* Paths to TypeScript files to add as initialization scripts for Playwright page.
*/
initPage?: string[];
/**
* Paths to JavaScript files to add as initialization scripts.
* The scripts will be evaluated in every page before any of the page's scripts.
*/
initScript?: string[];
},
/**
* Connect to a running browser instance (Edge/Chrome only). If specified, `browser`
* config is ignored.
* Requires the "Playwright Extension" to be installed.
*/
extension?: boolean;
/**
* Group controlled tabs when using the extension. Defaults to true.
*/
tabGroup?: boolean;
/**
* Do not activate controlled tabs or focus the browser window when using the extension.
* Defaults to false.
*/
background?: boolean;
server?: {
/**
* The port to listen on for SSE or MCP transport.
*/
port?: number;
/**
* The host to bind the server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.
*/
host?: string;
/**
* The hosts this server is allowed to serve from. Defaults to localhost, loopback IPs and the host passed via --host; other hosts must be listed explicitly.
* This is not for CORS, but rather for the DNS rebinding protection.
*/
allowedHosts?: string[];
},
/**
* List of enabled tool capabilities. Possible values:
* - 'core': Core browser automation features.
* - 'pdf': PDF generation and manipulation.
* - 'vision': Coordinate-based interactions.
* - 'devtools': Developer tools features.
*/
capabilities?: ToolCapability[];
/**
* Whether to save the Playwright session into the output directory.
*/
saveSession?: boolean;
/**
* Whether to collect and expose the tools that a page registers through the
* experimental WebMCP API. Enabled by default.
*/
webmcp?: boolean;
/**
* Reuse the same browser context between all connected HTTP clients.
*/
sharedBrowserContext?: boolean;
/**
* Secrets are used to replace matching plain text in the tool responses to prevent the LLM
* from accidentally getting sensitive data. It is a convenience and not a security feature,
* make sure to always examine information coming in and from the tool on the client.
*/
secrets?: Record<string, string>;
/**
* Names of URL query and fragment parameters, for example `access_token` or `code`, whose values
* are replaced with `<redacted>` in the tool responses. Use it for session and grant values that
* are minted at runtime and cannot be listed in `secrets`. Like `secrets`, it is a convenience
* and not a security feature.
*/
redactUrlParams?: string[];
/**
* The directory for automatically named output files, for example a screenshot taken without an
* explicit file name. Files with an explicit name are resolved against the workspace root instead
* and are not affected by this option.
*/
outputDir?: string;
/**
* Threshold for evicting old output files, in bytes.
*/
outputMaxSize?: number;
console?: {
/**
* The level of console messages to return. Each level includes the messages of more severe levels. Defaults to "info".
*/
level?: 'error' | 'warning' | 'info' | 'debug';
},
network?: {
/**
* List of origins to allow the browser to request. Default is to allow all. Origins matching both `allowedOrigins` and `blockedOrigins` will be blocked.
*
* Supported formats:
* - Full origin: `https://example.com:8080` - matches only that origin
* - Wildcard port: `http://localhost:*` - matches any port on localhost with http protocol
*/
allowedOrigins?: string[];
/**
* List of origins to block the browser to request. Origins matching both `allowedOrigins` and `blockedOrigins` will be blocked.
*
* Supported formats:
* - Full origin: `https://example.com:8080` - matches only that origin
* - Wildcard port: `http://localhost:*` - matches any port on localhost with http protocol
*/
blockedOrigins?: string[];
};
/**
* Specify the attribute to use for test ids, defaults to "data-testid".
*/
testIdAttribute?: string;
timeouts?: {
/*
* Configures default action timeout: https://playwright.dev/docs/api/class-page#page-set-default-timeout. Defaults to 5000ms.
*/
action?: number;
/*
* Configures default navigation timeout: https://playwright.dev/docs/api/class-page#page-set-default-navigation-timeout. Defaults to 60000ms.
*/
navigation?: number;
/**
* Configures default expect timeout: https://playwright.dev/docs/test-timeouts#expect-timeout. Defaults to 5000ms.
*/
expect?: number;
/**
* How long to wait after each action for triggered work (navigations, requests) to settle before responding. Defaults to 500ms.
*/
settle?: number;
/**
* Close the browser after this many milliseconds without a tool call, and relaunch it on the next one.
* Defaults to one hour for headless browsers Playwright launched, and to no timeout for headed or attached ones. Pass 0 to disable.
* The CLI shuts the whole session down instead of relaunching.
*/
idle?: number;
};
/**
* Whether to send image responses to the client. Can be "allow", "omit", or "only". Defaults to "allow".
* With "only", a response that carries an image consists of the image parts alone, without the text part.
*/
imageResponses?: 'allow' | 'omit' | 'only';
/**
* How file paths are rendered in tool results. Can be "relative" to the workspace root or "absolute". Defaults to "relative".
*/
filePaths?: 'relative' | 'absolute';
snapshot?: {
/**
* When taking snapshots for responses, specifies the mode to use.
*/
mode?: 'full' | 'none';
/**
* Whether to include each element's bounding box as [box=x,y,width,height] in snapshots.
* Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect).
*/
boxes?: boolean;
};
/**
* allowUnrestrictedFileAccess acts as a guardrail to prevent the LLM from accidentally
* wandering outside its intended workspace. It is a convenience defense to catch unintended
* file access, not a secure boundary; a deliberate attempt to reach other directories can be
* easily worked around, so always rely on client-level permissions for true security.
*/
allowUnrestrictedFileAccess?: boolean;
/**
* Do not ask the client for its workspace roots, use the current working directory
* as the workspace root instead. Use this with clients that advertise roots, but
* can not answer the roots request.
*/
ignoreRoots?: boolean;
/**
* Specify the language to use for code generation.
*/
codegen?: 'typescript' | 'python' | 'java' | 'csharp' | 'none';
}
Standalone MCP server
When running headed browser on system w/o display or from worker processes of the IDEs,
run the MCP server from environment with the DISPLAY and pass the --port flag to enable HTTP transport.
npx @playwright/mcp@latest --port 8931
And then in MCP client config, set the url to the HTTP endpoint:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/mcp"
}
}
}
Security
Playwright MCP is not a security boundary. See MCP Security Best Practices for guidance on securing your deployment.
NOTE: The Docker implementation only supports headless chromium at the moment.
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "--pull=always", "mcr.microsoft.com/playwright/mcp"]
}
}
}
Or If you prefer to run the container as a long-lived service instead of letting the MCP client spawn it, use:
docker run -d -i --rm --init --pull=always \
--entrypoint node \
--name playwright \
-p 8931:8931 \
mcr.microsoft.com/playwright/mcp \
/app/cli.js --headless --browser chromium --no-sandbox --port 8931 --host 0.0.0.0
The server will listen on host port 8931 and can be reached by any MCP client.
You can build the Docker image yourself.
docker build -t mcr.microsoft.com/playwright/mcp .
import http from 'http';
import { createConnection } from '@playwright/mcp';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
http.createServer(async (req, res) => {
// ...
// Creates a headless Playwright MCP server with SSE transport
const connection = await createConnection({ browser: { launchOptions: { headless: true } } });
const transport = new SSEServerTransport('/messages', res);
await connection.connect(transport);
// ...
});
Tools
- browser_click
- Title: Click
- Description: Perform click on a web page
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string): Exact target element reference from the page snapshot, or a unique element selectordoubleClick(boolean, optional): Whether to perform a double click instead of a single clickbutton(string, optional): Button to click, defaults to leftmodifiers(array, optional): Modifier keys to press
- Read-only: false
- browser_close
- Title: Close browser
- Description: Close the page
- Parameters: None
- Read-only: false
- browser_console_messages
- Title: Get console messages
- Description: Returns all console messages
- Parameters:
level(string): Level of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info".all(boolean, optional): Return all console messages since the beginning of the session, not just since the last navigation. Defaults to false.filename(string, optional): File name to save the console messages to. Relative file names are resolved against the workspace root. If not provided, messages are returned as text.
- Read-only: true
- browser_drag
- Title: Drag mouse
- Description: Perform drag and drop between two elements
- Parameters:
startElement(string, optional): Human-readable source element description used to obtain the permission to interact with the elementstartTarget(string): Exact target element reference from the page snapshot, or a unique element selectorendElement(string, optional): Human-readable target element description used to obtain the permission to interact with the elementendTarget(string): Exact target element reference from the page snapshot, or a unique element selector
- Read-only: false
- browser_drop
- Title: Drop files or data onto an element
- Description: Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of "paths" or "data" must be provided.
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string): Exact target element reference from the page snapshot, or a unique element selectorpaths(array, optional): Absolute paths to files to drop onto the element.data(object, optional): Data to drop, as a map of MIME type to string value (e.g. {"text/plain": "hello", "text/uri-list": "https://example.com"}).
- Read-only: false
- browser_emulate_media
- Title: Emulate media features
- Description: Emulate CSS media features for the page, for example switch between the light and dark color scheme. Omitted parameters are left unchanged; null clears an override.
- Parameters:
colorScheme(optional): Emulates the prefers-color-scheme media featurereducedMotion(optional): Emulates the prefers-reduced-motion media featureforcedColors(optional): Emulates the forced-colors media featurecontrast(optional): Emulates the prefers-contrast media featuremedia(optional): Changes the CSS media type of the page
- Read-only: false
- browser_evaluate
- Title: Evaluate JavaScript
- Description: Evaluate JavaScript expression on page or element
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string, optional): Exact target element reference from the page snapshot, or a unique element selectorfunction(string): () => { /* code / } or (element) => { / code */ } when element is providedfilename(string, optional): File name to save the result to. Relative file names are resolved against the workspace root. If not provided, result is returned as text.
- Read-only: false
- browser_file_upload
- Title: Upload files
- Description: Upload one or multiple files
- Parameters:
paths(array, optional): The absolute paths to the files to upload. Can be single file or multiple files. If omitted, file chooser is cancelled.
- Read-only: false
- browser_fill_form
- Title: Fill form
- Description: Fill multiple form fields
- Parameters:
fields(array): Fields to fill in
- Read-only: false
- browser_find
- Title: Find in page snapshot
- Description: Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.
- Parameters:
text(string, optional): Plain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both.regex(string, optional): Regular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. "/error/i" for case-insensitive. Provide either text or regex, not both.maxResults(number, optional): Maximum number of matching items to return. Defaults to returning all matches.filename(string, optional): Save results to a file instead of returning them in the response. Relative file names are resolved against the workspace root.
- Read-only: true
- browser_handle_dialog
- Title: Handle a dialog
- Description: Handle a dialog
- Parameters:
accept(boolean): Whether to accept the dialog.promptText(string, optional): The text of the prompt in case of a prompt dialog.
- Read-only: false
- browser_hover
- Title: Hover mouse
- Description: Hover over element on page
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string): Exact target element reference from the page snapshot, or a unique element selector
- Read-only: false
- browser_navigate
- Title: Navigate to a URL
- Description: Navigate to a URL
- Parameters:
url(string): The URL to navigate to
- Read-only: false
- browser_navigate_back
- Title: Go back
- Description: Go back to the previous page in the history
- Parameters: None
- Read-only: false
- browser_network_request
- Title: Show network request details
- Description: Returns full details (headers and body) of a single network request, or a single part if
partis set. Use the number from browser_network_requests. - Parameters:
index(integer): 1-based index of the request, as printed by browser_network_requests.part(string, optional): Return only this part of the request. Omit to return full details.filename(string, optional): File name to save the result to. Relative file names are resolved against the workspace root. If not provided, output is returned as text.
- Read-only: true
- browser_network_requests
- Title: List network requests
- Description: Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.
- Parameters:
static(boolean): Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false.filter(string, optional): Only return requests whose URL matches this regexp (e.g. "/api/.*user").all(boolean, optional): Return all network requests since the beginning of the session, not just since the last navigation. Defaults to false.filename(string, optional): File name to save the network requests to. Relative file names are resolved against the workspace root. If not provided, requests are returned as text.
- Read-only: true
- browser_press_key
- Title: Press a key
- Description: Press a key on the keyboard
- Parameters:
key(string): Name of the key to press or a character to generate, such asArrowLeftora
- Read-only: false
- browser_resize
- Title: Resize browser window
- Description: Resize the browser window
- Parameters:
width(number): Width of the browser windowheight(number): Height of the browser window
- Read-only: false
- browser_run_code_unsafe
- Title: Run Playwright code (unsafe)
- Description: Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.
- Parameters:
code(string, optional): A JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example:async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }filename(string, optional): Load code from the specified file. Relative file names are resolved against the workspace root. If both code and filename are provided, code will be ignored.
- Read-only: false
- browser_select_option
- Title: Select option
- Description: Select an option in a dropdown
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string): Exact target element reference from the page snapshot, or a unique element selectorvalues(array): Array of values to select in the dropdown. This can be a single value or multiple values.
- Read-only: false
- browser_snapshot
- Title: Page snapshot
- Description: Capture accessibility snapshot of the current page, this is better than screenshot
- Parameters:
target(string, optional): Exact target element reference from the page snapshot, or a unique element selectorfilename(string, optional): Save snapshot to a file instead of returning it in the response. Relative file names are resolved against the workspace root.depth(number, optional): Limit the depth of the snapshot treeboxes(boolean, optional): Include each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect)
- Read-only: true
- browser_take_screenshot
- Title: Take a screenshot
- Description: Take a screenshot of the current page. Use browser_snapshot for actions by default. With the vision capability enabled, use screenshot coordinates with the coordinate-based mouse tools for elements not exposed in the accessibility snapshot.
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string, optional): Exact target element reference from the page snapshot, or a unique element selectortype(string, optional): Image format for the screenshot. If unset, inferred from the filename extension, otherwise png.filename(string, optional): File name to save the screenshot to. Relative file names are resolved against the workspace root. If not specified, the screenshot is saved into the output directory aspage-{timestamp}.{png|jpeg|webp}.fullPage(boolean, optional): When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.scale(string): Image resolution scale. "css" produces a screenshot sized in CSS pixels (smaller, consistent across devices). "device" produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css.
- Read-only: true
- browser_type
- Title: Type text
- Description: Type text into editable element
- Parameters:
element(string, optional): Human-readable element description used to obtain permission to interact with the elementtarget(string): Exact target element reference from the page snapshot, or a unique element selectortext(string): Text to type into the elementsubmit(boolean, optional): Whether to submit entered text (press Enter after)slowly(boolean, optional): Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once.
- Read-only: false
- browser_wait_for
- Title: Wait for
- Description: Wait for text to appear or disappear or a specified time to pass. When both text and textGone are provided, waits for the first one to happen
- Parameters:
time(number, optional): The time to wait in seconds, at most 30. When combined with text or textGone, serves as a timeout for them instead of the default action timeouttext(string, optional): The text to wait fortextGone(string, optional): The text to wait for to disappear
- Read-only: false
- browser_tabs
- Title: Manage tabs
- Description: List, create, close, or select a browser tab.
- Parameters:
action(string): Operation to performindex(number, optional): Tab index, used for close/select. If omitted for close, current tab is closed.url(string, optional): URL to navigate to in the new tab, used for new.isolatedContext(string, optional): Name of an isolated browser context to create the new tab in, used for new. Tabs in the same isolated context share cookies and storage, tabs in different contexts are fully isolated. If omitted or "default", the tab is created in the default context.
- Read-only: false
- browser_get_config
- Title: Get config
- Description: Get the final resolved config after merging CLI options, environment variables and config file.
- Parameters: None
- Read-only: true
- browser_network_state_set
- Title: Set network state
- Description: Sets the browser network state to online or offline. When offline, all network requests will fail.
- Parameters:
state(string): Set to "offline" to simulate offline mode, "online" to restore network connectivity
- Read-only: false
- browser_route
- Title: Mock network requests
- Description: Set up a route to mock network requests matching a URL pattern
- Parameters:
pattern(string): URL pattern to match (e.g., "/api/users", "/*.{png,jpg}")status(number, optional): HTTP status code to return (default: 200)body(string, optional): Response body (text or JSON string)contentType(string, optional): Content-Type header (e.g., "application/json", "text/html")headers(array, optional): Headers to add in "Name: Value" formatremoveHeaders(string, optional): Comma-separated list of header names to remove from request
- Read-only: false
- browser_route_list
- Title: List network routes
- Description: List all active network routes
- Parameters: None
- Read-only: true
- browser_unroute
- Title: Remove network routes
- Description: Remove network routes matching a pattern (or all routes if no pattern specified)
- Parameters:
pattern(string, optional): URL pattern to unroute (omit to remove all routes)
- Read-only: false
- browser_cookie_clear
- Title: Clear cookies
- Description: Clear all cookies
- Parameters: None
- Read-only: false
- browser_cookie_delete
- Title: Delete cookie
- Description: Delete a specific cookie (optionally only on a given domain/path)
- Parameters:
name(string): Cookie name to deletedomain(string, optional): Only delete the cookie on this domainpath(string, optional): Only delete the cookie on this path
- Read-only: false
- browser_cookie_get
- Title: Get cookie
- Description: Get a specific cookie by name
- Parameters:
name(string): Cookie name to get
- Read-only: true
- browser_cookie_list
- Title: List cookies
- Description: List all cookies (optionally filtered by domain/path)
- Parameters:
domain(string, optional): Filter cookies by domainpath(string, optional): Filter cookies by path
- Read-only: true
- browser_cookie_set
- Title: Set cookie
- Description: Set a cookie with optional flags (domain, path, expires, httpOnly, secure, sameSite)
- Parameters:
name(string): Cookie namevalue(string): Cookie valuedomain(string, optional): Cookie domainpath(string, optional): Cookie pathexpires(number, optional): Cookie expiration as Unix timestamphttpOnly(boolean, optional): Whether the cookie is HTTP onlysecure(boolean, optional): Whether the cookie is securesameSite(string, optional): Cookie SameSite attribute
- Read-only: false
- browser_localstorage_clear
- Title: Clear localStorage
- Description: Clear all localStorage
- Parameters: None
- Read-only: false
- browser_localstorage_delete
- Title: Delete localStorage item
- Description: Delete a localStorage item
- Parameters:
key(string): Key to delete
- Read-only: false
- browser_localstorage_get
- Title: Get localStorage item
- Description: Get a localStorage item by key
- Parameters:
key(string): Key to get
- Read-only: true
- browser_localstorage_list
- Title: List localStorage
- Description: List all localStorage key-value pairs
- Parameters: None
- Read-only: true
- browser_localstorage_set
- Title: Set localStorage item
- Description: Set a localStorage item
- Parameters:
key(string): Key to setvalue(string): Value to set
- Read-only: false
- browser_sessionstorage_clear
- Title: Clear sessionStorage
- Description: Clear all sessionStorage
- Parameters: None
- Read-only: false
- browser_sessionstorage_delete
- Title: Delete sessionStorage item
- Description: Delete a sessionStorage item
- Parameters:
key(string): Key to delete
- Read-only: false
- browser_sessionstorage_get
- Title: Get sessionStorage item
- Description: Get a sessionStorage item by key
- Parameters:
key(string): Key to get
- Read-only: true
- browser_sessionstorage_list
- Title: List sessionStorage
- Description: List all sessionStorage key-value pairs
- Parameters: None
- Read-only: true
- browser_sessionstorage_set
- Title: Set sessionStorage item
- Description: Set a sessionStorage item
- Parameters:
key(string): Key to setvalue(string): Value to set
- Read-only: false
- browser_set_storage_state
- Title: Restore storage state
- Description: Restore storage state (cookies, local storage) from a file. This clears existing cookies and local storage before restoring.
- Parameters:
filename(string): Path to the storage state file to restore from. Relative file names are resolved against the workspace root.
- Read-only: false
- browser_storage_state
- Title: Save storage state
- Description: Save storage state (cookies, local storage) to a file for later reuse
- Parameters:
filename(string, optional): File name to save the storage state to. Relative file names are resolved against the workspace root. If not specified, the storage state is saved into the output directory asstorage-state-{timestamp}.json.
- Read-only: true
- browser_annotate
- Title: Annotate the current page
- Description: Open the Playwright Dashboard in annotation mode for the current page and wait for the user to draw annotations. Returns the annotated screenshot, ARIA snapshot, and the list of annotations.
- Parameters: None
- Read-only: true
- browser_hide_highlight
- Title: Hide element highlight
- Description: Remove a highlight overlay previously added for the element.
- Parameters:
element(string, optional): Human-readable element description used when adding the highlight; must match the value passed to browser_highlight.target(string, optional): Exact target element reference from the page snapshot, or a unique element selector
- Read-only: **t