Playwright MCP 是一个模型上下文协议(MCP)服务器,它借助 Playwright 提供浏览器自动化功能。该服务器使大语言模型(LLMs)能够通过结构化的无障碍快照与网页进行交互,无需使用截图或视觉调整模型。
首先,将 Playwright MCP 服务器与你的客户端一起安装。典型的配置如下:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
你也可以使用 VS Code 命令行界面(CLI)安装 Playwright MCP 服务器:
# 对于 VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'
安装完成后,Playwright MCP 服务器将可在 VS Code 中与你的 GitHub Copilot 代理一起使用。
前往 Cursor 设置 -> MCP -> 添加新的 MCP 服务器。你可以自行命名,使用 命令 类型并输入命令 npx @playwright/mcp。你还可以通过点击 编辑 来验证配置或添加命令参数。
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
遵循 Windsurf MCP 文档 进行操作。使用以下配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
遵循 MCP 安装 指南 进行操作,使用以下配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Playwright MCP 服务器支持以下参数。你可以在上述 JSON 配置中的 "args" 列表中提供这些参数:
> npx @playwright/mcp@latest --help
--allowed-origins 允许浏览器请求的源列表,以分号分隔。默认允许所有源。
--blocked-origins 阻止浏览器请求的源列表,以分号分隔。阻止列表在允许列表之前进行评估。如果仅使用阻止列表,不匹配阻止列表的请求仍然会被允许。
--block-service-workers 阻止服务工作者
--browser 要使用的浏览器或 Chrome 通道,可能的值:chrome、firefox、webkit、msedge。
--caps 要启用的功能列表,以逗号分隔,可能的值:tabs、pdf、history、wait、files、install。默认启用所有功能。
--cdp-endpoint 要连接的 CDP 端点。
--config 配置文件的路径。
--device 要模拟的设备,例如:"iPhone 15"
--executable-path 浏览器可执行文件的路径。
--headless 以无头模式运行浏览器,默认以有头模式运行
--host 服务器绑定的主机。默认是 localhost。使用 0.0.0.0 绑定所有接口。
--ignore-https-errors 忽略 HTTPS 错误
--isolated 将浏览器配置文件保存在内存中,不保存到磁盘。
--image-responses 是否向客户端发送图像响应。可以是 "allow"、"omit" 或 "auto"。默认是 "auto",如果客户端可以显示图像,则发送图像。
--no-sandbox 禁用通常会被沙盒化的所有进程类型的沙盒。
--output-dir 输出文件的目录路径。
--port SSE 传输监听的端口。
--proxy-bypass 绕过代理的域名列表,以逗号分隔,例如 ".com,chromium.org,.domain.com"
--proxy-server 指定代理服务器,例如 "http://myproxy:3128" 或 "socks5://myproxy:8080"
--save-trace 是否将会话的 Playwright 跟踪保存到输出目录。
--storage-state 隔离会话的存储状态文件的路径。
--user-agent 指定用户代理字符串
--user-data-dir 用户数据目录的路径。如果未指定,将创建一个临时目录。
--viewport-size 指定浏览器视口的大小(以像素为单位),例如 "1280, 720"
--vision 运行使用截图的服务器(默认使用 Aria 快照)
你可以使用持久配置文件(如常规浏览器,默认设置)运行 Playwright MCP,也可以在测试会话中使用隔离上下文运行。
所有登录信息将存储在持久配置文件中,如果你想清除离线状态,可以在会话之间删除该文件。持久配置文件位于以下位置,你可以使用 --user-data-dir 参数覆盖它:
# Windows
%USERPROFILE%\AppData\Local\ms-playwright\mcp-{channel}-profile
# macOS
- ~/Library/Caches/ms-playwright/mcp-{channel}-profile
# Linux
- ~/.cache/ms-playwright/mcp-{channel}-profile
在隔离模式下,每个会话都在隔离配置文件中启动。每次你要求 MCP 关闭浏览器时,会话将关闭,并且该会话的所有存储状态将丢失。你可以通过配置的 contextOptions 或 --storage-state 参数为浏览器提供初始存储状态。了解更多关于存储状态的信息 点击这里。
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--isolated",
"--storage-state={path/to/storage.json}"
]
}
}
}
Playwright MCP 服务器可以使用 JSON 配置文件进行配置。你可以使用 --config 命令行选项指定配置文件:
npx @playwright/mcp@latest --config path/to/config.json
{
// 浏览器配置
browser?: {
// 要使用的浏览器类型(chromium、firefox 或 webkit)
browserName?: 'chromium' | 'firefox' | 'webkit';
// 将浏览器配置文件保存在内存中,不保存到磁盘。
isolated?: boolean;
// 用于浏览器配置文件持久化的用户数据目录路径
userDataDir?: string;
// 浏览器启动选项(请参阅 Playwright 文档)
// @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch
launchOptions?: {
channel?: string; // 浏览器通道(例如 'chrome')
headless?: boolean; // 以无头模式运行
executablePath?: string; // 浏览器可执行文件的路径
// ... 其他 Playwright 启动选项
};
// 浏览器上下文选项
// @see https://playwright.dev/docs/api/class-browser#browser-new-context
contextOptions?: {
viewport?: { width: number, height: number };
// ... 其他 Playwright 上下文选项
};
// 用于连接现有浏览器的 CDP 端点
cdpEndpoint?: string;
// 远程 Playwright 服务器端点
remoteEndpoint?: string;
},
// 服务器配置
server?: {
port?: number; // 监听的端口
host?: string; // 绑定的主机(默认:localhost)
},
// 启用的功能列表
capabilities?: Array<
'core' | // 核心浏览器自动化
'tabs' | // 标签管理
'pdf' | // PDF 生成
'history' | // 浏览器历史记录
'wait' | // 等待实用工具
'files' | // 文件处理
'install' | // 浏览器安装
'testing' // 测试
>;
// 启用视觉模式(使用截图代替无障碍快照)
vision?: boolean;
// 输出文件的目录
outputDir?: string;
// 网络配置
network?: {
// 允许浏览器请求的源列表。默认允许所有源。同时匹配 `allowedOrigins` 和 `blockedOrigins` 的源将被阻止。
allowedOrigins?: string[];
// 阻止浏览器请求的源列表。同时匹配 `allowedOrigins` 和 `blockedOrigins` 的源将被阻止。
blockedOrigins?: string[];
};
/**
* 不向客户端发送图像响应。
*/
noImageResponses?: boolean;
}
当在没有显示器的系统上或从 IDE 的工作进程中运行有头浏览器时,从具有 DISPLAY 环境变量的环境中运行 MCP 服务器,并通过 --port 标志启用 SSE 传输。
npx @playwright/mcp@latest --port 8931
然后在 MCP 客户端配置中,将 url 设置为 SSE 端点:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/sse"
}
}
}
注意:目前 Docker 实现仅支持无头 Chromium。
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "--pull=always", "mcr.microsoft.com/playwright/mcp"]
}
}
}
你也可以自己构建 Docker 镜像。
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) => {
// ...
// 创建一个带有 SSE 传输的无头 Playwright MCP 服务器
const connection = await createConnection({ browser: { launchOptions: { headless: true } } });
const transport = new SSEServerTransport('/messages', res);
await connection.connect(transport);
// ...
});
工具提供两种模式:
要使用视觉模式,在启动服务器时添加 --vision 标志:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--vision"
]
}
}
}
视觉模式最适合与能够基于提供的截图在 X Y 坐标空间中与元素进行交互的计算机使用模型配合使用。
browser_snapshot
browser_click
element (字符串):用于获取与元素交互权限的人类可读元素描述ref (字符串):页面快照中确切的目标元素引用browser_drag
startElement (字符串):用于获取与源元素交互权限的人类可读元素描述startRef (字符串):页面快照中确切的源元素引用endElement (字符串):用于获取与目标元素交互权限的人类可读元素描述endRef (字符串):页面快照中确切的目标元素引用browser_hover
element (字符串):用于获取与元素交互权限的人类可读元素描述ref (字符串):页面快照中确切的目标元素引用browser_type
element (字符串):用于获取与元素交互权限的人类可读元素描述ref (字符串):页面快照中确切的目标元素引用text (字符串):要输入到元素中的文本submit (布尔值,可选):是否提交输入的文本(之后按 Enter 键)slowly (布尔值,可选):是否逐个字符输入。这对于触发页面中的按键处理程序很有用。默认情况下,整个文本会一次性填充。browser_select_option
element (字符串):用于获取与元素交互权限的人类可读元素描述ref (字符串):页面快照中确切的目标元素引用values (数组):要在下拉列表中选择的值数组。可以是单个值或多个值。browser_press_key
key (字符串):要按下的按键名称或要生成的字符,例如 ArrowLeft 或 abrowser_wait_for
time (数字,可选):等待的时间(以秒为单位)text (字符串,可选):要等待出现的文本textGone (字符串,可选):要等待消失的文本browser_file_upload
paths (数组):要上传的文件的绝对路径。可以是单个文件或多个文件。browser_handle_dialog
accept (布尔值):是否接受对话框。promptText (字符串,可选):在提示对话框的情况下,提示的文本。browser_navigate
url (字符串):要导航到的 URLbrowser_navigate_back
browser_navigate_forward
browser_take_screenshot
raw (布尔值,可选):是否返回未压缩的图像(PNG 格式)。默认是 false,返回 JPEG 图像。filename (字符串,可选):保存截图的文件名。如果未指定,默认是 page-{timestamp}.{png|jpeg}。element (字符串,可选):用于获取对元素进行截图权限的人类可读元素描述。如果未提供,将对视口进行截图。如果提供了 element,则必须同时提供 ref。ref (字符串,可选):页面快照中确切的目标元素引用。如果未提供,将对视口进行截图。如果提供了 ref,则必须同时提供 element。browser_pdf_save
filename (字符串,可选):保存 PDF 的文件名。如果未指定,默认是 page-{timestamp}.pdf。browser_network_requests
browser_console_messages
browser_install
browser_close
browser_resize
width (数字):浏览器窗口的宽度height (数字):浏览器窗口的高度browser_tab_list
browser_tab_new
url (字符串,可选):在新标签中要导航到的 URL。如果未提供,新标签将是空白的。browser_tab_select
index (数字):要选择的标签的索引browser_tab_close
index (数字,可选):要关闭的标签的索引。如果未提供,将关闭当前标签。name (字符串):测试的名称description (字符串):测试的描述steps (数组):测试的步骤browser_screen_capture
browser_screen_move_mouse
element (字符串):用于获取与元素交互权限的人类可读元素描述x (数字):X 坐标y (数字):Y 坐标browser_screen_click
element (字符串):用于获取与元素交互权限的人类可读元素描述x (数字):X 坐标y (数字):Y 坐标browser_screen_drag
element (字符串):用于获取与元素交互权限的人类可读元素描述startX (数字):起始 X 坐标startY (数字):起始 Y 坐标endX (数字):结束 X 坐标endY (数字):结束 Y 坐标browser_screen_type
text (字符串):要输入的文本submit (布尔值,可选):是否提交输入的文本(之后按 Enter 键)browser_press_key
key (字符串):要按下的按键名称或要生成的字符,例如 ArrowLeft 或 abrowser_wait_for
time (数字,可选):等待的时间(以秒为单位)text (字符串,可选):要等待出现的文本textGone (字符串,可选):要等待消失的文本browser_file_upload
paths (数组):要上传的文件的绝对路径。可以是单个文件或多个文件。browser_handle_dialog
accept (布尔值):是否接受对话框。promptText (字符串,可选):在提示对话框的情况下,提示的文本。