🚀 Playwright MCP
Playwright MCP 是一个模型上下文协议(MCP)服务器,它借助 Playwright 提供浏览器自动化功能。该服务器允许大语言模型(LLMs)通过结构化的无障碍快照与网页进行交互,无需依赖截图或经过视觉调整的模型。
✨ 主要特性
- 快速轻量:使用 Playwright 的无障碍树,而非基于像素的输入。
- 对大语言模型友好:无需视觉模型,完全基于结构化数据运行。
- 工具应用具有确定性:避免了基于截图方法常见的模糊性。
📦 安装指南
环境要求
- Node.js 18 或更高版本
- VS Code、Cursor、Windsurf、Claude Desktop 或其他 MCP 客户端
安装步骤
首先,将 Playwright MCP 服务器与你的客户端一起安装。典型的配置如下:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
在 VS Code 中安装
你也可以使用 VS Code 命令行界面(CLI)安装 Playwright MCP 服务器:
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'
安装完成后,Playwright MCP 服务器即可在 VS Code 中与你的 GitHub Copilot 代理一起使用。
在 Cursor 中安装
点击按钮安装:

或者手动安装:
转到 Cursor 设置
-> MCP
-> 添加新的 MCP 服务器
。自定义名称,使用 命令
类型并输入命令 npx @playwright/mcp
。你还可以通过点击 编辑
验证配置或添加命令参数。
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
在 Windsurf 中安装
遵循 Windsuff MCP 文档。使用以下配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
在 Claude Desktop 中安装
遵循 MCP 安装 指南,使用以下配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
在 Claude Code 中安装
使用 Claude Code CLI 添加 Playwright MCP 服务器:
claude mcp add playwright npx @playwright/mcp@latest
在 Qodo Gen 中安装
在 VSCode 或 IntelliJ 中打开 Qodo Gen 聊天面板 -> 连接更多工具 -> + 添加新的 MCP -> 粘贴以下配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
点击 保存
。
🔧 配置说明
Playwright MCP 服务器支持以下参数。你可以在上述 JSON 配置中的 "args"
列表中提供这些参数:
> npx @playwright/mcp@latest --help
--allowed-origins <origins> 允许浏览器请求的源列表,用分号分隔。默认允许所有源。
--blocked-origins <origins> 阻止浏览器请求的源列表,用分号分隔。阻止列表在允许列表之前评估。如果仅使用阻止列表,不匹配阻止列表的请求仍然允许。
--block-service-workers 阻止服务工作者
--browser <browser> 要使用的浏览器或 Chrome 通道,可能的值:chrome、firefox、webkit、msedge。
--browser-agent <endpoint> 使用浏览器代理(实验性)。
--caps <caps> 要启用的功能列表,用逗号分隔,可能的值:tabs、pdf、history、wait、files、install。默认启用所有功能。
--cdp-endpoint <endpoint> 要连接的 CDP 端点。
--config <path> 配置文件的路径。
--device <device> 要模拟的设备,例如:"iPhone 15"
--executable-path <path> 浏览器可执行文件的路径。
--headless 以无头模式运行浏览器,默认是有头模式
--host <host> 服务器绑定的主机。默认是 localhost。使用 0.0.0.0 绑定所有接口。
--ignore-https-errors 忽略 HTTPS 错误
--isolated 将浏览器配置文件保存在内存中,不保存到磁盘。
--image-responses <mode> 是否向客户端发送图像响应。可以是 "allow"、"omit" 或 "auto"。默认为 "auto",如果客户端可以显示图像,则发送图像。
--no-sandbox 禁用通常需要沙盒化的所有进程类型的沙盒。
--output-dir <path> 输出文件的目录路径。
--port <port> SSE 传输监听的端口。
--proxy-bypass <bypass> 绕过代理的域名列表,用逗号分隔,例如 ".com,chromium.org,.domain.com"
--proxy-server <proxy> 指定代理服务器,例如 "http://myproxy:3128" 或 "socks5://myproxy:8080"
--save-trace 是否将会话的 Playwright 跟踪保存到输出目录。
--storage-state <path> 隔离会话的存储状态文件的路径。
--user-agent <ua string> 指定用户代理字符串
--user-data-dir <path> 用户数据目录的路径。如果未指定,将创建一个临时目录。
--viewport-size <size> 指定浏览器视口的大小(像素),例如 "1280, 720"
--vision 运行使用截图的服务器(默认使用 Aria 快照)
用户配置文件
你可以像使用常规浏览器一样,以持久配置文件运行 Playwright MCP(默认),也可以在测试会话中使用隔离上下文运行。
持久配置文件
所有登录信息将存储在持久配置文件中,如果你想清除离线状态,可以在会话之间删除该文件。持久配置文件位于以下位置,你可以使用 --user-data-dir
参数覆盖它:
%USERPROFILE%\AppData\Local\ms-playwright\mcp-{channel}-profile
- ~/Library/Caches/ms-playwright/mcp-{channel}-profile
- ~/.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}"
]
}
}
}
配置文件
可以使用 JSON 配置文件对 Playwright MCP 服务器进行配置。你可以使用 --config
命令行选项指定配置文件:
npx @playwright/mcp@latest --config path/to/config.json
配置文件架构
{
browser?: {
browserName?: 'chromium' | 'firefox' | 'webkit';
isolated?: boolean;
userDataDir?: string;
launchOptions?: {
channel?: string;
headless?: boolean;
executablePath?: string;
};
contextOptions?: {
viewport?: { width: number, height: number };
};
cdpEndpoint?: string;
remoteEndpoint?: string;
},
server?: {
port?: number;
host?: string;
},
capabilities?: Array<
'core' |
'tabs' |
'pdf' |
'history' |
'wait' |
'files' |
'install' |
'testing'
>;
vision?: boolean;
outputDir?: string;
network?: {
allowedOrigins?: string[];
blockedOrigins?: string[];
};
noImageResponses?: boolean;
}
独立 MCP 服务器
当在没有显示器的系统上或从 IDE 的工作进程中运行有头浏览器时,在具有 DISPLAY 的环境中运行 MCP 服务器,并传递 --port
标志以启用 SSE 传输。
npx @playwright/mcp@latest --port 8931
然后在 MCP 客户端配置中,将 url
设置为 SSE 端点:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/sse"
}
}
}
Docker
⚠️ 重要提示
目前 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) => {
const connection = await createConnection({ browser: { launchOptions: { headless: true } } });
const transport = new SSEServerTransport('/messages', res);
await connection.sever.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
或 a
- 只读:否
-
browser_wait_for
- 标题:等待
- 描述:等待文本出现或消失,或等待指定时间过去
- 参数:
time
(数字,可选):等待的时间(秒)
text
(字符串,可选):要等待出现的文本
textGone
(字符串,可选):要等待消失的文本
- 只读:是
-
browser_file_upload
- 标题:上传文件
- 描述:上传一个或多个文件
- 参数:
paths
(数组):要上传的文件的绝对路径。可以是单个文件或多个文件。
- 只读:否
-
browser_handle_dialog
- 标题:处理对话框
- 描述:处理对话框
- 参数:
accept
(布尔值):是否接受对话框。
promptText
(字符串,可选):如果是提示对话框,提示的文本。
- 只读:否
导航工具
-
browser_navigate
- 标题:导航到 URL
- 描述:导航到指定 URL
- 参数:
- 只读:否
-
browser_navigate_back
-
browser_navigate_forward
- 标题:前进
- 描述:前进到下一页
- 参数:无
- 只读:是
资源工具
-
browser_take_screenshot
- 标题:截图
- 描述:对当前页面进行截图。你不能基于截图执行操作,使用 browser_snapshot 进行操作。
- 参数:
raw
(布尔值,可选):是否返回未压缩的图像(PNG 格式)。默认是 false,返回 JPEG 图像。
filename
(字符串,可选):保存截图的文件名。如果未指定,默认为 page-{timestamp}.{png|jpeg}
。
element
(字符串,可选):用于获取对元素进行截图权限的人类可读元素描述。如果未提供,将截取视口的截图。如果提供了 element,则必须提供 ref。
ref
(字符串,可选):页面快照中确切的目标元素引用。如果未提供,将截取视口的截图。如果提供了 ref,则必须提供 element。
- 只读:是
-
browser_pdf_save
- 标题:保存为 PDF
- 描述:将页面保存为 PDF
- 参数:
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
- 标题:选择标签页
- 描述:按索引选择一个标签页
- 参数:
- 只读:是
-
browser_tab_close
- 标题:关闭标签页
- 描述:关闭一个标签页
- 参数:
index
(数字,可选):要关闭的标签页的索引。如果未提供,关闭当前标签页。
- 只读:否
测试工具
- browser_generate_playwright_test
- 标题:生成 Playwright 测试
- 描述:为给定场景生成 Playwright 测试
- 参数:
name
(字符串):测试的名称
description
(字符串):测试的描述
steps
(数组):测试的步骤
- 只读:是
视觉模式工具