playwright-mcp

microsoftApache-2.0活跃维护

把 Playwright 浏览器自动化能力封装成 MCP 服务器,让 AI Agent 通过结构化接口操控网页、抓取页面内容,无需依赖截图识别。

Playwright MCP server

v0.0.85发布于 2026-11-09 18:28 UTC39,402star +118 / 7 天3,413fork同步于 2026-11-10 11:20 UTC

怎么上手

由 README 提炼,执行前请确认
npx @playwright/mcp@latest
硬件要求按 README 说明

README 未说明显存或 GPU 要求,仅要求 Node.js 18 或更新版本,以及 VS Code、Cursor、Windsurf、Claude Desktop 等任一 MCP 客户端

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

用 Playwright 给 LLM 提供浏览器自动化能力的 MCP 服务器,靠无障碍树而非截图操作网页

把 Playwright 浏览器自动化能力封装成 MCP 服务器,让 AI Agent 通过结构化接口操控网页、抓取页面内容,无需依赖截图识别。

核心能力

  • 基于 Playwright 无障碍树快照操作页面
  • 无需视觉模型,纯结构化数据交互
  • 工具调用确定性强,避免截图歧义
  • 通过标准 MCP 配置接入各类客户端

容易踩的坑

需 Node.js 18 或更新版本;需在客户端中按标准 mcpServers 配置接入,不能直接当命令行工具用;README 提示编码类 agent 可能更适合用 Playwright CLI+SKILLS 以节省 token

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.0.85
  1. 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 --background alongside --extension (config background: true, env PLAYWRIGHT_MCP_BACKGROUND=1) to leave the connected tab inactive and its window unfocused, and to open the client's new tabs in the background. With PLAYWRIGHT_MCP_EXTENSION_TOKEN set, 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-group alongside --extension (config tabGroup: false, env PLAYWRIGHT_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: true in the config file to restrict locators to visible elements, both in the target of element tools such as browser_click and in browser_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_snapshot now 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 as getByLabel('City'), and accessible names use the associated labels too. Both for attributes 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_snapshot no 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_evaluate returns readable representations of values such as BigInt, NaN, Infinity, undefined and circular objects instead of losing values or failing JSON serialization. JSON-compatible results keep their existing format (
  2. 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_tabs with action: "new" now accepts isolatedContext: "<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 (config redactUrlParams, env PLAYWRIGHT_MCP_REDACT_URL_PARAMS) replaces the named query and fragment parameter values with <redacted> in tool responses. Like secrets, 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_find accepts a positive integer maxResults, 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_requests accepts all: true to include retained history, keeping up to 200 requests from earlier navigations. Request indexes stay stable across navigations for browser_network_request. browser_console_messages also reports counts consistent with its existing all option. (microsoft/playwright#43526)
    • 🎯 Use locators in your language (#1797) — element tools such as browser_click now accept JavaScript, Python, Java and C# locators in target, alongside snapshot refs and CSS selectors. Invalid targets get an actionable error, including a reminder to pass the bare ref rather than button [ref=e5]. (microsoft/playwright#43539)
    • 📂 Skip unsupported workspace-root requests (#1798) — clients that advertise roots but cannot answer roots/list can stall the first tool call. Pass --ignore-roots (config ignoreRoots: true, env PLAYWRIGHT_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 optional domain and path filters 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, time is its timeout (capped at 30 seconds), not a delay before checking it. Supplying both text and textGone now 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
  3. v0.0.832026-09-28 · 2026-09-28 23:17 UTC
    查看更新说明

    Bug Fixes

  4. 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) takes fps, so fps: 60 records smooth 60 fps videos instead of the default 25, and cursor: true renders an animated mouse cursor that travels to each action point and stays visible between actions. browser_video_show_actions takes a style with point, highlight and title CSS 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 a tools/list_changed notification when it changes. This replaces browser_webmcp_list / browser_webmcp_call from 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 (config webmcp: false, env PLAYWRIGHT_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_media tool emulates media features on the fly: colorScheme, reducedMotion, forcedColors, contrast and the media type (screen / print). Omitted parameters are left unchanged, null clears 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 (config filePaths: "absolute", env PLAYWRIGHT_MCP_FILE_PATHS=absolute) to get absolute paths instead. (microsoft/playwright#42673)

    🐛 Fixes

    • fix(mcp): keep upload modal and reject bad headers — a failed browser_file_upload (e.g. a missing file) reports the error and keeps the file chooser open so it can be retried, and browser_route (opt-in via --caps=network) returns an error for a header that is not in the Name: Value form 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@latest pick this release up on the next client restart. To pin it:

    npx @playwright/[email protected]
    
  5. 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 (env PLAYWRIGHT_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> (config timeouts.idle, env PLAYWRIGHT_MCP_IDLE_TIMEOUT) to change the timeout, 0 disables it. Headed and attached browsers are not closed unless a timeout is set explicitly (#42663, #42676)
    • --image-responses accepts only: a response that carries an image consists of the image parts alone, without the text part (#42672)

    Bug Fixes

    • browser_close returns 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 after browser_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 with ENOENT; browser_file_upload and browser_drop resolve relative paths against the workspace root (#42540)
    • In extension mode with PLAYWRIGHT_MCP_EXTENSION_TOKEN set, 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)

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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:

    Install in Goose

    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:

    1. Type /mcp
    2. Press Ctrl+A to add a new MCP server
    3. 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.

    Add to Kiro

    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:

    Add MCP Server playwright to LM Studio

    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:

    OptionDescription
    --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-accessallow 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-workersblock 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
    --mobileemulate 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
    --extensionConnect 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
    --headlessrun 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-errorsignore https errorsenv PLAYWRIGHT_MCP_IGNORE_HTTPS_ERRORS
    --ignore-rootsdo 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
    --isolatedkeep 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-sandboxdisable the sandbox for all process types that are normally sandboxed.env PLAYWRIGHT_MCP_NO_SANDBOX
    --backgrounddo not activate controlled tabs or focus the browser window when using --extension.env PLAYWRIGHT_MCP_BACKGROUND
    --no-tab-groupdo not group controlled tabs when using --extension.env PLAYWRIGHT_MCP_NO_TAB_GROUP
    --no-webmcpdo 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
    --sandboxenable the sandbox for all process types that are normally not sandboxed.env PLAYWRIGHT_MCP_SANDBOX
    --save-sessionWhether 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-contextreuse the same browser context between all connected HTTP clients.env PLAYWRIGHT_MCP_SHARED_BROWSER_CONTEXT
    --snapshot-boxesinclude 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 --isolated or 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-dir argument. This will persist all browser data between the sessions.
    • Start with a storage state file using the --storage-state argument. This will load cookies and local storage from the file into an isolated browser context.

    For the page state, you can use:

    • --init-page to 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-script to 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 element
        • target (string): Exact target element reference from the page snapshot, or a unique element selector
        • doubleClick (boolean, optional): Whether to perform a double click instead of a single click
        • button (string, optional): Button to click, defaults to left
        • modifiers (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 element
        • startTarget (string): Exact target element reference from the page snapshot, or a unique element selector
        • endElement (string, optional): Human-readable target element description used to obtain the permission to interact with the element
        • endTarget (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 element
        • target (string): Exact target element reference from the page snapshot, or a unique element selector
        • paths (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 feature
        • reducedMotion (optional): Emulates the prefers-reduced-motion media feature
        • forcedColors (optional): Emulates the forced-colors media feature
        • contrast (optional): Emulates the prefers-contrast media feature
        • media (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 element
        • target (string, optional): Exact target element reference from the page snapshot, or a unique element selector
        • function (string): () => { /* code / } or (element) => { / code */ } when element is provided
        • filename (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 element
        • target (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 part is 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 as ArrowLeft or a
      • Read-only: false
    • browser_resize
      • Title: Resize browser window
      • Description: Resize the browser window
      • Parameters:
        • width (number): Width of the browser window
        • height (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 element
        • target (string): Exact target element reference from the page snapshot, or a unique element selector
        • values (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 selector
        • filename (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 tree
        • boxes (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 element
        • target (string, optional): Exact target element reference from the page snapshot, or a unique element selector
        • type (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 as page-{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 element
        • target (string): Exact target element reference from the page snapshot, or a unique element selector
        • text (string): Text to type into the element
        • submit (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 timeout
        • text (string, optional): The text to wait for
        • textGone (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 perform
        • index (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" format
        • removeHeaders (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 delete
        • domain (string, optional): Only delete the cookie on this domain
        • path (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 domain
        • path (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 name
        • value (string): Cookie value
        • domain (string, optional): Cookie domain
        • path (string, optional): Cookie path
        • expires (number, optional): Cookie expiration as Unix timestamp
        • httpOnly (boolean, optional): Whether the cookie is HTTP only
        • secure (boolean, optional): Whether the cookie is secure
        • sameSite (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 set
        • value (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 set
        • value (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 as storage-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