2025-03-21 10:58:58 -07:00
## Playwright MCP
2025-03-21 13:16:30 -07:00
A Model Context Protocol (MCP) server that provides browser automation capabilities using [Playwright ](https://playwright.dev ). This server enables LLMs to interact with web pages through structured accessibility snapshots, bypassing the need for screenshots or visually-tuned models.
### Key Features
2025-03-25 10:36:16 -07:00
- **Fast and lightweight**: Uses Playwright's accessibility tree, not pixel-based input.
2025-03-21 13:16:30 -07:00
- **LLM-friendly**: No vision models needed, operates purely on structured data.
- **Deterministic tool application**: Avoids ambiguity common with screenshot-based approaches.
### Use Cases
- Web navigation and form-filling
- Data extraction from structured content
- Automated testing driven by LLMs
- General-purpose browser interaction for agents
2025-04-29 15:29:56 -07:00
<!--
// Generate using?:
node utils/generate_links.js
-->
[<img src="https://img.shields.io/badge/VS_Code-VS_Code?style=flat-square&label=Install%20Server&color=0098FF" alt="Install in VS Code"> ](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522playwright%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522%2540playwright%252Fmcp%2540latest%2522%255D%257D ) [<img alt="Install in VS Code Insiders" src="https://img.shields.io/badge/VS_Code_Insiders-VS_Code_Insiders?style=flat-square&label=Install%20Server&color=24bfa5"> ](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522playwright%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522%2540playwright%252Fmcp%2540latest%2522%255D%257D )
2025-03-21 10:58:58 -07:00
2025-04-29 15:29:56 -07:00
### Example config
2025-04-21 20:26:50 -04:00
2025-03-21 10:58:58 -07:00
```js
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
2025-03-24 11:36:28 -07:00
"@playwright/mcp@latest "
2025-03-21 10:58:58 -07:00
]
}
}
}
```
2025-04-29 15:29:56 -07:00
### Table of Contents
2025-03-25 10:36:16 -07:00
2025-04-29 15:29:56 -07:00
- [Installation in VS Code ](#installation-in-vs-code )
- [Command line ](#command-line )
- [User profile ](#user-profile )
- [Configuration file ](#configuration-file )
- [Running on Linux ](#running-on-linux )
- [Docker ](#docker )
- [Programmatic usage ](#programmatic-usage )
- [Tool modes ](#tool-modes )
2025-03-26 15:37:51 -07:00
2025-04-29 15:29:56 -07:00
### Installation in VS Code
2025-03-26 15:37:51 -07:00
2025-04-29 15:29:56 -07:00
You can install the Playwright MCP server using the VS Code CLI:
2025-03-25 10:36:16 -07:00
```bash
# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest "]}'
2025-03-25 18:46:19 +01:00
```
2025-03-25 10:36:16 -07:00
After installation, the Playwright MCP server will be available for use with your GitHub Copilot agent in VS Code.
2025-04-29 15:29:56 -07:00
### Command line
2025-04-01 10:26:48 -07:00
The Playwright MCP server supports the following command-line options:
- `--browser <browser>` : Browser or chrome channel to use. Possible values:
- `chrome` , `firefox` , `webkit` , `msedge`
- Chrome channels: `chrome-beta` , `chrome-canary` , `chrome-dev`
- Edge channels: `msedge-beta` , `msedge-canary` , `msedge-dev`
- Default: `chrome`
2025-04-04 17:14:30 -07:00
- `--caps <caps>` : Comma-separated list of capabilities to enable, possible values: tabs, pdf, history, wait, files, install. Default is all.
2025-04-01 10:26:48 -07:00
- `--cdp-endpoint <endpoint>` : CDP endpoint to connect to
- `--executable-path <path>` : Path to the browser executable
- `--headless` : Run browser in headless mode (headed by default)
2025-04-29 15:29:56 -07:00
- `--user-data-dir <path>` : Path to the user data directory
2025-04-01 10:26:48 -07:00
- `--port <port>` : Port to listen on for SSE transport
2025-04-24 14:04:00 +08:00
- `--host <host>` : Host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.
2025-04-01 10:26:48 -07:00
- `--vision` : Run server that uses screenshots (Aria snapshots are used by default)
2025-04-29 15:29:56 -07:00
- `--config <path>` : Path to the configuration file
2025-04-01 10:26:48 -07:00
2025-04-29 15:29:56 -07:00
### User profile
2025-03-26 16:03:46 -07:00
2025-04-01 10:26:48 -07:00
Playwright MCP will launch the browser with the new profile, located at
2025-03-26 16:03:46 -07:00
```
2025-04-29 13:34:56 -07:00
- `%USERPROFILE%\AppData\Local\ms-playwright\mcp-{channel}-profile` on Windows
- `~/Library/Caches/ms-playwright/mcp-{channel}-profile` on macOS
- `~/.cache/ms-playwright/mcp-{channel}-profile` on Linux
2025-03-26 16:03:46 -07:00
```
2025-03-31 17:33:38 +09:00
All the logged in information will be stored in that profile, you can delete it between sessions if you'd like to clear the offline state.
2025-03-26 16:03:46 -07:00
2025-04-29 15:29:56 -07:00
### Configuration file
2025-03-21 13:16:30 -07:00
2025-04-29 15:29:56 -07:00
The Playwright MCP server can be configured using a JSON configuration file. Here's the complete configuration format:
2025-03-21 10:58:58 -07:00
2025-04-29 15:29:56 -07:00
```typescript
2025-03-21 10:58:58 -07:00
{
2025-04-29 15:29:56 -07:00
// Browser configuration
browser?: {
// Browser type to use (chromium, firefox, or webkit)
browserName?: 'chromium' | 'firefox' | 'webkit';
// Path to user data directory for browser profile persistence
userDataDir?: string;
// Browser launch options (see Playwright docs)
launchOptions?: {
channel?: string; // Browser channel (e.g. 'chrome')
headless?: boolean; // Run in headless mode
executablePath?: string; // Path to browser executable
// ... other Playwright launch options
};
// Browser context options
contextOptions?: {
viewport?: { width: number, height: number };
// ... other Playwright context options
};
// CDP endpoint for connecting to existing browser
cdpEndpoint?: string;
// Remote Playwright server endpoint
remoteEndpoint?: string;
},
// Server configuration
server?: {
port?: number; // Port to listen on
host?: string; // Host to bind to (default: localhost)
},
// List of enabled capabilities
capabilities?: Array<
'core' | // Core browser automation
'tabs' | // Tab management
'pdf' | // PDF generation
'history' | // Browser history
'wait' | // Wait utilities
'files' | // File handling
'install' // Browser installation
>;
// Enable vision mode (screenshots instead of accessibility snapshots)
vision?: boolean;
// Directory for output files
outputDir?: string;
// Tool-specific configurations
tools?: {
browser_take_screenshot?: {
// Disable base64-encoded image responses
omitBase64?: boolean;
2025-03-21 10:58:58 -07:00
}
}
}
```
2025-04-29 15:29:56 -07:00
You can specify the configuration file using the `--config` command line option:
```bash
npx @playwright/mcp@latest --config path/to/config.json
```
### Running on Linux
When running headless without DISPLAY, pass `--headless` command line argument.
2025-03-21 10:58:58 -07:00
When running headed browser on system w/o display or from worker processes of the IDEs,
2025-03-27 18:23:30 +01:00
run the MCP server from environment with the DISPLAY and pass the `--port` flag to enable SSE transport.
2025-03-21 10:58:58 -07:00
2025-03-27 18:23:30 +01:00
```bash
npx @playwright/mcp@latest --port 8931
2025-03-21 10:58:58 -07:00
```
2025-03-27 18:23:30 +01:00
And then in MCP client config, set the `url` to the SSE endpoint:
2025-03-21 10:58:58 -07:00
```js
{
"mcpServers": {
"playwright": {
2025-03-27 18:23:30 +01:00
"url": "http://localhost:8931/sse"
2025-03-21 10:58:58 -07:00
}
}
}
```
2025-04-29 15:29:56 -07:00
### Docker
2025-04-24 14:04:00 +08:00
2025-04-29 15:29:56 -07:00
**NOTE:** The Docker implementation only supports headless chromium at the moment.
2025-04-24 14:04:00 +08:00
```js
{
"mcpServers": {
"playwright": {
2025-04-29 15:29:56 -07:00
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "mcp/playwright"]
2025-04-24 14:04:00 +08:00
}
}
}
```
2025-04-29 15:29:56 -07:00
You can build the Docker image yourself.
2025-04-21 17:31:18 -07:00
2025-04-29 15:29:56 -07:00
```
docker build -t mcp/playwright .
```
### Programmatic usage
2025-04-24 16:30:35 +08:00
2025-04-21 17:31:18 -07:00
```js
2025-04-29 15:29:56 -07:00
import http from 'http';
import { createServer } 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 mcpServer = await createServer({ headless: true });
const transport = new SSEServerTransport('/messages', res);
await mcpServer.connect(transport);
// ...
});
2025-04-21 17:31:18 -07:00
```
2025-04-29 15:29:56 -07:00
### Tool modes
2025-03-21 10:58:58 -07:00
The tools are available in two modes:
1. **Snapshot Mode** (default): Uses accessibility snapshots for better performance and reliability
2. **Vision Mode** : Uses screenshots for visual-based interactions
To use Vision Mode, add the `--vision` flag when starting the server:
```js
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
2025-03-21 13:33:24 -07:00
"@playwright/mcp@latest ",
2025-03-21 10:58:58 -07:00
"--vision"
]
}
}
}
```
Vision Mode works best with the computer use models that are able to interact with elements using
X Y coordinate space, based on the provided screenshot.
2025-03-25 14:46:39 -07:00
2025-04-21 20:22:57 +02:00
<!-- - Generated by update - readme.js -->
2025-04-04 15:22:00 -07:00
### Snapshot-based Interactions
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
- **browser_snapshot**
- Description: Capture accessibility snapshot of the current page, this is better than screenshot
- Parameters: None
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_click**
- Description: Perform click on a web page
- Parameters:
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `ref` (string): Exact target element reference from the page snapshot
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_drag**
- Description: Perform drag and drop between two elements
- Parameters:
2025-04-21 20:22:57 +02:00
- `startElement` (string): Human-readable source element description used to obtain the permission to interact with the element
2025-03-21 10:58:58 -07:00
- `startRef` (string): Exact source element reference from the page snapshot
2025-04-21 20:22:57 +02:00
- `endElement` (string): Human-readable target element description used to obtain the permission to interact with the element
2025-03-21 10:58:58 -07:00
- `endRef` (string): Exact target element reference from the page snapshot
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
- **browser_hover**
- Description: Hover over element on page
- Parameters:
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `ref` (string): Exact target element reference from the page snapshot
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_type**
- Description: Type text into editable element
- Parameters:
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `ref` (string): Exact target element reference from the page snapshot
- `text` (string): Text to type into the element
2025-04-04 15:22:00 -07:00
- `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.
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-26 13:53:56 +09:00
- **browser_select_option**
2025-04-04 15:22:00 -07:00
- Description: Select an option in a dropdown
2025-03-26 13:53:56 +09:00
- Parameters:
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `ref` (string): Exact target element reference from the page snapshot
2025-04-04 15:22:00 -07:00
- `values` (array): Array of values to select in the dropdown. This can be a single value or multiple values.
2025-03-26 13:53:56 +09:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_take_screenshot**
- Description: Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.
2025-03-27 20:49:57 +01:00
- Parameters:
2025-04-04 15:22:00 -07:00
- `raw` (boolean, optional): Whether to return without compression (in PNG format). Default is false, which returns a JPEG image.
2025-04-21 20:22:57 +02:00
- `element` (string, optional): Human-readable element description used to obtain permission to screenshot the element. If not provided, the screenshot will be taken of viewport. If element is provided, ref must be provided too.
- `ref` (string, optional): Exact target element reference from the page snapshot. If not provided, the screenshot will be taken of viewport. If ref is provided, element must be provided too.
2025-03-27 20:49:57 +01:00
2025-04-04 15:22:00 -07:00
### Vision-based Interactions
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
- **browser_screen_capture**
- Description: Take a screenshot of the current page
- Parameters: None
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_screen_move_mouse**
- Description: Move mouse to a given position
2025-03-21 10:58:58 -07:00
- Parameters:
2025-04-04 15:22:00 -07:00
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `x` (number): X coordinate
- `y` (number): Y coordinate
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
2025-04-04 15:22:00 -07:00
- **browser_screen_click**
- Description: Click left mouse button
- Parameters:
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `x` (number): X coordinate
- `y` (number): Y coordinate
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_screen_drag**
- Description: Drag left mouse button
2025-03-27 07:27:34 -07:00
- Parameters:
2025-04-04 15:22:00 -07:00
- `element` (string): Human-readable element description used to obtain permission to interact with the element
- `startX` (number): Start X coordinate
- `startY` (number): Start Y coordinate
- `endX` (number): End X coordinate
- `endY` (number): End Y coordinate
2025-03-27 07:27:34 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_screen_type**
- Description: Type text
2025-03-21 10:58:58 -07:00
- Parameters:
2025-04-21 20:22:57 +02:00
- `text` (string): Text to type into the element
2025-04-04 15:22:00 -07:00
- `submit` (boolean, optional): Whether to submit entered text (press Enter after)
2025-03-21 10:58:58 -07:00
2025-04-04 15:22:00 -07:00
### Tab Management
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_tab_list**
- Description: List browser tabs
2025-03-21 10:58:58 -07:00
- Parameters: None
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_tab_new**
- Description: Open a new tab
- Parameters:
- `url` (string, optional): The URL to navigate to in the new tab. If not provided, the new tab will be blank.
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_tab_select**
- Description: Select a tab by index
- Parameters:
- `index` (number): The index of the tab to select
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_tab_close**
- Description: Close a tab
- Parameters:
- `index` (number, optional): The index of the tab to close. Closes current tab if not provided.
### Navigation
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_navigate**
- Description: Navigate to a URL
- Parameters:
- `url` (string): The URL to navigate to
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_navigate_back**
2025-03-21 10:58:58 -07:00
- Description: Go back to the previous page
- Parameters: None
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_navigate_forward**
2025-03-21 10:58:58 -07:00
- Description: Go forward to the next page
- Parameters: None
2025-04-04 15:22:00 -07:00
### Keyboard
2025-03-21 10:58:58 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_press_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`
2025-04-15 18:01:59 -07:00
### Console
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-15 18:01:59 -07:00
- **browser_console_messages**
- Description: Returns all console messages
- Parameters: None
2025-04-04 15:22:00 -07:00
### Files and Media
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 17:14:30 -07:00
- **browser_file_upload**
2025-04-21 20:22:57 +02:00
- Description: Upload one or multiple files
2025-03-27 20:49:57 +01:00
- Parameters:
- `paths` (array): The absolute paths to the files to upload. Can be a single file or multiple files.
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_pdf_save**
2025-03-21 10:58:58 -07:00
- Description: Save page as PDF
- Parameters: None
2025-04-04 15:22:00 -07:00
### Utilities
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
- **browser_close**
- Description: Close the page
- Parameters: None
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
- **browser_wait**
- Description: Wait for a specified time in seconds
- Parameters:
2025-04-21 20:22:57 +02:00
- `time` (number): The time to wait in seconds
<!-- NOTE: This has been generated via update - readme.js -->
2025-03-21 10:58:58 -07:00
2025-04-17 14:49:22 -07:00
- **browser_resize**
- Description: Resize the browser window
- Parameters:
2025-04-21 20:22:57 +02:00
- `width` (number): Width of the browser window
- `height` (number): Height of the browser window
2025-04-17 14:49:22 -07:00
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
2025-04-04 15:22:00 -07:00
- **browser_install**
- Description: Install the browser specified in the config. Call this if you get an error about the browser not being installed.
- Parameters: None
2025-04-21 20:22:57 +02:00
<!-- NOTE: This has been generated via update - readme.js -->
- **browser_handle_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.
<!-- - End of generated section -->