by Microsoft (open source) Claude Desktop, Claude Code, OpenCode, любой MCP-клиент
Официальный MCP-сервер от Microsoft для управления браузером через Playwright. Использует accessibility tree вместо скриншотов — быстрее, точнее, не требует vision-модели. Идеален для web-автоматизации и тестирования. Возможности: - Навигация по URL, клики, ввод текста, скролл - Работа с формами, дропдаунами, чекбоксами - Снятие скриншотов страниц и элементов - Выполнение JavaScript в контексте страницы - Перехват и анализ сетевых запросов - Режим headed (с UI) и headless - Поддержка Chrome, Firefox, Safari
# Claude Desktop — claude_desktop_config.json:
```json
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}
```
# Claude Code (CLI):
```bash
claude mcp add playwright -- npx @playwright/mcp@latest
```
# OpenCode — ~/.config/opencode/opencode.json:
```json
{
"mcp": {
"playwright": {
"type": "local",
"command": ["npx", "@playwright/mcp@latest"]
}
}
}
```
Установить браузеры: `npx playwright install`
Для headless-режима добавьте аргумент `"--headless"` в args.
Сервер протокола контекста модели (MCP), обеспечивающий возможности автоматизации браузера с помощью Playwright. Этот сервер позволяет LLM взаимодействовать со веб-страницами через структурированные снимки доступности, обходя необходимость использования скриншотов или моделей, обученных на визуальных данных.
Этот пакет предоставляет интерфейс MCP для Playwright. Если вы используете кодирующего агента, вам может быть полезнее использовать CLI+SKILLS.
CLI: Современные кодирующие агенты все чаще предпочитают рабочие процессы, основанные на CLI и предоставляемые в виде SKILL'ов, а не MCP, поскольку вызовы CLI более эффективны с точки зрения токенов: они позволяют избежать загрузки больших схем инструментов и многословных деревьев доступности в контекст модели, позволяя агентам действовать через краткие, целевые команды. Это делает CLI + SKILL'и более подходящими для высокопроизводительных кодирующих агентов, которым необходимо сочетать автоматизацию браузера с большими кодовыми базами, тестами и рассуждениями в рамках ограниченного контекста.
Узнайте больше о Playwright CLI с SKILLS.
MCP: MCP остается актуальным для специализированных агентных циклов, которые выигрывают от постоянного состояния, богатой интроспекции и итеративного рассуждения над структурой страницы, такой как исследовательская автоматизация, самовосстанавливающиеся тесты или долгосрочные автономные рабочие процессы, где поддержание постоянного контекста браузера важнее затрат на токены.
Сначала установите сервер Playwright MCP с помощью вашего клиента.
Стандартная конфигурация работает в большинстве инструментов:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Amp
Добавьте через экран настроек расширения Amp для VS Code или обновив ваш файл settings.json:
"amp.mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
Настройка CLI для Amp:
Добавьте с помощью приведенной ниже команды amp mcp add
amp mcp add playwright -- npx @playwright/mcp@latest
Antigravity
Добавьте через настройки Antigravity или обновив ваш конфигурационный файл:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Claude Code
Используйте CLI Claude Code для добавления сервера Playwright MCP:
claude mcp add playwright npx @playwright/mcp@latest
Claude Desktop
Следуйте руководству по установке MCP, используйте стандартную конфигурацию выше.
Cline
Следуйте инструкциям в разделе Настройка серверов MCP
Пример: Локальная настройка
Добавьте следующее в ваш файл cline_mcp_settings.json:
{
"mcpServers": {
"playwright": {
"type": "stdio",
"command": "npx",
"timeout": 30,
"args": [
"-y",
"@playwright/mcp@latest"
],
"disabled": false
}
}
}
Codex
Используйте CLI Codex для добавления сервера Playwright MCP:
codex mcp add playwright npx "@playwright/mcp@latest"
Альтернативно, создайте или отредактируйте конфигурационный файл ~/.codex/config.toml и добавьте:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]
Для получения дополнительной информации см. документацию Codex MCP.
Copilot
Используйте CLI Copilot для интерактивного добавления сервера Playwright MCP:
/mcp add
Альтернативно, создайте или отредактируйте конфигурационный файл ~/.copilot/mcp-config.json и добавьте:
{
"mcpServers": {
"playwright": {
"type": "local",
"command": "npx",
"tools": [
"*"
],
"args": [
"@playwright/mcp@latest"
]
}
}
}
Для получения дополнительной информации см. документацию CLI Copilot.
Cursor
Перейдите в Cursor Settings -> MCP -> Add new MCP Server. Назовите его как угодно, используйте тип command с командой npx @playwright/mcp@latest. Вы также можете проверить конфигурацию или добавить аргументы команды, нажав Edit.
Factory
Используйте CLI Factory для добавления сервера Playwright MCP:
droid mcp add playwright "npx @playwright/mcp@latest"
Альтернативно, введите /mcp внутри Factory droid для открытия интерактивного интерфейса управления серверами MCP.
Для получения дополнительной информации см. документацию Factory MCP.
Gemini CLI
Следуйте руководству по установке MCP, используйте стандартную конфигурацию выше.
Goose
Перейдите в Advanced settings -> Extensions -> Add custom extension. Назовите его как угодно, используйте тип STDIO и установите command в npx @playwright/mcp. Нажмите "Add Extension".
Grok
Используйте CLI Grok для добавления сервера Playwright MCP:
grok mcp add playwright -- npx @playwright/mcp@latest
Альтернативно, создайте или отредактируйте конфигурационный файл ~/.grok/config.toml и добавьте:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]
Для получения дополнительной информации см. документацию Grok MCP.
Junie
Чтобы добавить сервер Playwright MCP в CLI Junie:
/mcpCtrl+A для добавления нового сервера MCPАльтернативно, добавьте в .junie/mcp/mcp.json:
{
"mcpServers": {
"Playwright": {
"command": "npx",
"args": [
"-y",
"@playwright/mcp@latest"
]
}
}
}
Для получения дополнительной информации см. документацию по конфигурации Junie MCP.
Kiro
Следуйте документации по серверам MCP. Например, в .kiro/settings/mcp.json:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
LM Studio
Перейдите в Program на правой боковой панели -> Install -> Edit mcp.json. Используйте стандартную конфигурацию выше.
opencode
Следуйте документации по серверам MCP. Например, в ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"playwright": {
"type": "local",
"command": [
"npx",
"@playwright/mcp@latest"
],
"enabled": true
}
}
}
Qodo Gen
Откройте панель чата Qodo Gen в VSCode или IntelliJ -> Подключить дополнительные инструменты -> + Add new MCP -> Вставьте стандартную конфигурацию выше.
Нажмите Сохранить.
VS Code
Следуйте руководству по установке MCP, используйте стандартную конфигурацию выше. Вы также можете установить сервер Playwright MCP с помощью CLI VS Code:
# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'
После установки сервер Playwright MCP будет доступен для использования с вашим агентом GitHub Copilot в VS Code.
Warp
Перейдите в Настройки -> AI -> Управление MCP-серверами -> + Добавить, чтобы добавить MCP-сервер. Используйте стандартную конфигурацию выше.
Или используйте команду /add-mcp в командной строке Warp и вставьте стандартную конфигурацию выше:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Windsurf
Следуйте документации Windsurf по MCP. Используйте стандартную конфигурацию выше.
Сервер Playwright MCP поддерживает следующие аргументы. Их можно указать в JSON-конфигурации выше как часть списка "args":
| Опция | Описание |
|---|---|
| --allowed-hosts | разделенный запятыми список хостов, которым разрешено обслуживать этот сервер. По умолчанию используется хост, к которому привязан сервер. Передайте '', чтобы отключить проверку хоста. env* PLAYWRIGHT_MCP_ALLOWED_HOSTS |
| --allowed-origins | разделенный точкой с запятой список ДОВЕРЕННЫХ источников, разрешенных для запросов браузером. По умолчанию разрешены все. Важно: не служит границей безопасности и не влияет на перенаправления. env PLAYWRIGHT_MCP_ALLOWED_ORIGINS |
| --allow-unrestricted-file-access | разрешает доступ к файлам за пределами корней рабочей области. Также разрешает неограниченный доступ к URL-адресам file://. По умолчанию доступ к файловой системе ограничен только корневыми директориями рабочей области (или текущей рабочей директорией, если корни не настроены), а переход по URL-адресам file:// заблокирован. env PLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESS |
| --blocked-origins | разделенный точкой с запятой список источников, заблокированных для запросов браузером. Блок-лист проверяется перед разрешающим списком. Если используется без разрешающего списка, запросы, не соответствующие блок-листу, по-прежнему разрешены. Важно: не служит границей безопасности и не влияет на перенаправления. env PLAYWRIGHT_MCP_BLOCKED_ORIGINS |
| --block-service-workers | блокирует воркеры обслуживания (service workers) env PLAYWRIGHT_MCP_BLOCK_SERVICE_WORKERS |
| --browser | используемый браузер или канал Chrome, возможные значения: chrome, firefox, webkit, msedge. env PLAYWRIGHT_MCP_BROWSER |
| --caps | разделенный запятыми список дополнительных возможностей для включения, возможные значения: vision, pdf, devtools. env PLAYWRIGHT_MCP_CAPS |
| --cdp-endpoint | конечная точка CDP для подключения. env PLAYWRIGHT_MCP_CDP_ENDPOINT |
| --cdp-header | заголовки CDP для отправки с запросом на подключение, можно указать несколько. env PLAYWRIGHT_MCP_CDP_HEADERS |
| --cdp-timeout | тайм-аут в миллисекундах для подключения к конечной точке CDP, по умолчанию 30000 мс env PLAYWRIGHT_MCP_CDP_TIMEOUT |
| --codegen | язык для генерации кода, возможные значения: "typescript", "none". По умолчанию "typescript". env PLAYWRIGHT_MCP_CODEGEN |
| --config | путь к файлу конфигурации. env PLAYWRIGHT_MCP_CONFIG |
| --console-level | уровень сообщений консоли для возврата: "error", "warning", "info", "debug". Каждый уровень включает сообщения более серьезных уровней. env PLAYWRIGHT_MCP_CONSOLE_LEVEL |
| --device | устройство для эмуляции, например: "iPhone 15" env PLAYWRIGHT_MCP_DEVICE |
| --mobile | эмулирует типичное мобильное устройство (Pixel 10 для Chromium, iPhone 17 для WebKit). Мобильные страницы обычно легче, что экономит токены. Не может использоваться вместе с --device. env PLAYWRIGHT_MCP_MOBILE |
| --executable-path | путь к исполняемому файлу браузера. env PLAYWRIGHT_MCP_EXECUTABLE_PATH |
| --extension | Подключается к запущенному экземпляру браузера (только Edge/Chrome). Требуется установка "Playwright Extension". env PLAYWRIGHT_MCP_EXTENSION |
| --endpoint | привязанная конечная точка браузера для подключения. env PLAYWRIGHT_MCP_ENDPOINT |
| --grant-permissions | список разрешений для предоставления контексту браузера, например "geolocation", "clipboard-read", "clipboard-write". env PLAYWRIGHT_MCP_GRANT_PERMISSIONS |
| --headless | запуск браузера в скрытом режиме, по умолчанию с интерфейсом env PLAYWRIGHT_MCP_HEADLESS |
| --host | хост для привязки сервера. По умолчанию localhost. Используйте 0.0.0.0 для привязки ко всем интерфейсам. env PLAYWRIGHT_MCP_HOST |
| --ignore-https-errors | игнорировать ошибки https env PLAYWRIGHT_MCP_IGNORE_HTTPS_ERRORS |
| --init-page | путь к файлу TypeScript для выполнения на объекте страницы Playwright env PLAYWRIGHT_MCP_INIT_PAGE |
| --init-script | путь к файлу JavaScript для добавления как скрипт инициализации. Скрипт будет выполняться на каждой странице перед любыми скриптами этой страницы. Можно указать несколько раз. env PLAYWRIGHT_MCP_INIT_SCRIPT |
| --isolated | хранит профиль браузера в памяти, не сохраняя его на диск. env PLAYWRIGHT_MCP_ISOLATED |
| --image-responses | отправлять ли изображения в ответах клиенту. Может быть "allow" или "omit", по умолчанию "allow". env PLAYWRIGHT_MCP_IMAGE_RESPONSES |
| --no-sandbox | отключает песочницу для всех типов процессов, которые обычно изолированы. env PLAYWRIGHT_MCP_NO_SANDBOX |
| --output-dir | путь к директории для выходных файлов. env PLAYWRIGHT_MCP_OUTPUT_DIR |
| --output-max-size | порог для удаления старых выходных файлов, в байтах. env PLAYWRIGHT_MCP_OUTPUT_MAX_SIZE |
| --output-mode | сохранять ли снимки, сообщения консоли, журналы сети в файл или в стандартный вывод. Может быть "file" или "stdout". По умолчанию "stdout". env PLAYWRIGHT_MCP_OUTPUT_MODE |
| --port | порт для прослушивания транспорта SSE. env PLAYWRIGHT_MCP_PORT |
| --proxy-bypass | разделенный запятыми список доменов для обхода прокси, например ".com,chromium.org,.domain.com" env PLAYWRIGHT_MCP_PROXY_BYPASS |
| --proxy-server | указывает сервер прокси, например "http://myproxy:3128" или "socks5://myproxy:8080" env PLAYWRIGHT_MCP_PROXY_SERVER |
| --sandbox | включает песочницу для всех типов процессов, которые обычно не изолированы. env PLAYWRIGHT_MCP_SANDBOX |
| --save-session | Сохранять ли сессию Playwright MCP в директории вывода. env PLAYWRIGHT_MCP_SAVE_SESSION |
| --secrets | путь к файлу, содержащему секреты в формате dotenv env PLAYWRIGHT_MCP_SECRETS_FILE |
| --shared-browser-context | повторно использовать один и тот же контекст браузера для всех подключенных HTTP-клиентов. env PLAYWRIGHT_MCP_SHARED_BROWSER_CONTEXT |
| --snapshot-mode | при создании снимков для ответов указывает используемый режим. Может быть "full" или "none". По умолчанию "full". env PLAYWRIGHT_MCP_SNAPSHOT_MODE |
| --storage-state | путь к файлу состояния хранилища для изолированных сессий. env PLAYWRIGHT_MCP_STORAGE_STATE |
| --test-id-attribute | указывает атрибут для использования в идентификаторах тестов, по умолчанию "data-testid" env PLAYWRIGHT_MCP_TEST_ID_ATTRIBUTE |
| --timeout-action | время ожидания действия в миллисекундах, по умолчанию 5000 мс env PLAYWRIGHT_MCP_TIMEOUT_ACTION |
| --timeout-navigation | время навигации в миллисекундах, по умолчанию 60000 мс env PLAYWRIGHT_MCP_TIMEOUT_NAVIGATION |
| --user-agent | указывает строку агента пользователя env PLAYWRIGHT_MCP_USER_AGENT |
| --user-data-dir | путь к директории пользовательских данных. Если не указано, будет создана временная директория. env PLAYWRIGHT_MCP_USER_DATA_DIR |
| --viewport-size | указывает размер области просмотра браузера в пикселях, например "1280x720" env PLAYWRIGHT_MCP_VIEWPORT_SIZE |
Вы можете запустить Playwright MCP с постоянным профилем как обычный браузер (по умолчанию), в изолированных контекстах для сессий тестирования или подключиться к существующему браузеру с помощью расширения браузера.
Постоянный профиль
Вся информация о входе будет сохранена в постоянном профиле; вы можете удалить его между сессиями, если хотите очистить автономное состояние.
Постоянный профиль находится по следующим путям, и вы можете переопределить его с помощью аргумента --user-data-dir.
# 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} вычисляется на основе корня рабочей области клиента MCP, поэтому различные проекты автоматически получают отдельные профили.
[!IMPORTANT] Постоянный профиль может использоваться только одним экземпляром браузера одновременно, поэтому одновременные клиенты MCP, разделяющие одну рабочую область, будут конфликтовать. Для запуска нескольких клиентов параллельно запускайте каждый дополнительный клиент с
--isolatedили укажите для него отдельный--user-data-dir.
Изолированный
В изолированном режиме каждая сессия запускается в изолированном профиле. Каждый раз, когда вы просите MCP закрыть браузер,
сессия закрывается, и всё состояние хранилища для этой сессии теряется. Вы можете предоставить начальное состояние хранилища
браузеру через contextOptions конфигурации или через аргумент --storage-state. Подробнее о состоянии
хранилища здесь.
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--isolated",
"--storage-state={path/to/storage.json}"
]
}
}
}
Расширение браузера
Расширение Playwright MCP для Chrome позволяет подключаться к существующим вкладкам браузера и использовать ваши сессии входа и состояние браузера. Инструкции по установке и настройке см. в microsoft/playwright › packages/extension.
Существует несколько способов предоставить начальное состояние контексту браузера или странице.
Для состояния хранилища вы можете:
- Начать с каталога пользовательских данных, используя аргумент --user-data-dir. Это сохранит все данные браузера между сессиями.
- Начать с файла состояния хранилища, используя аргумент --storage-state. Это загрузит файлы cookie и локальное хранилище из файла в изолированный контекст браузера.
Для состояния страницы вы можете использовать:
--init-page для указания на TypeScript-файл, который будет выполнен на объекте страницы Playwright. Это позволяет запускать произвольный код для настройки страницы.// 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 для указания на JavaScript-файл, который будет добавлен как скрипт инициализации. Скрипт будет выполняться на каждой странице до запуска любых скриптов этой страницы.
Это полезно для переопределения API браузера или настройки окружения.// init-script.js
window.isPlaywrightMCP = true;
Сервер Playwright MCP можно настроить с помощью JSON-файла конфигурации. Вы можете указать файл конфигурации
с помощью опции командной строки --config:
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;
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 the host server is bound to.
* 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;
/**
* 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>;
/**
* The directory to save output files.
*/
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;
};
/**
* Whether to send image responses to the client. Can be "allow", "omit", or "auto". Defaults to "auto", which sends images if the client can display them.
*/
imageResponses?: 'allow' | 'omit';
snapshot?: {
/**
* When taking snapshots for responses, specifies the mode to use.
*/
mode?: 'full' | 'none';
};
/**
* 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;
/**
* Specify the language to use for code generation.
*/
codegen?: 'typescript' | 'none';
}
При запуске видимого браузера в системе без дисплея или из процессов worker в IDE,
запускайте сервер MCP в среде с переменной DISPLAY и передайте флаг --port для включения HTTP-транспорта.
npx @playwright/mcp@latest --port 8931
А затем в конфигурации клиента MCP установите url на HTTP-эндпоинт:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/mcp"
}
}
}
Playwright MCP не является границей безопасности. Ознакомьтесь с рекомендациями по безопасности MCP для руководства по обеспечению безопасности вашего развертывания.
Docker
ПРИМЕЧАНИЕ: В настоящее время реализация Docker поддерживает только headless-версию Chromium.
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "--pull=always", "mcr.microsoft.com/playwright/mcp"]
}
}
}
Или, если вы предпочитаете запускать контейнер в качестве долгоживущего сервиса, а не позволять клиенту MCP создавать его, используйте:
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
Сервер будет слушать на порту хоста 8931 и будет доступен для любого клиента 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) => {
// ...
// 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);
// ...
});
Основная автоматизация
element (строка, необязательный): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снапшота страницы или уникальный селектор элементаdoubleClick (логический, необязательный): Выполнить двойной клик вместо одинарногоbutton (строка, необязательный): Кнопка для клика, по умолчанию — леваяmodifiers (массив, необязательный): Модификаторы для нажатияlevel (строка): Уровень сообщений консоли для возврата. Каждый уровень включает сообщения более серьёзных уровней. По умолчанию — "info".all (логический, необязательный): Возвращать все сообщения консоли с начала сессии, а не только с момента последней навигации. По умолчанию — false.filename (строка, необязательный): Имя файла для сохранения сообщений консоли. Если не указано, сообщения возвращаются в виде текста.startElement (строка, необязательный): Читаемое описание исходного элемента для получения разрешения на взаимодействие с элементомstartTarget (строка): Точная ссылка на целевой элемент из снапшота страницы или уникальный селектор элементаendElement (строка, необязательный): Читаемое описание конечного элемента для получения разрешения на взаимодействие с элементомendTarget (строка): Точная ссылка на целевой элемент из снапшота страницы или уникальный селектор элементаelement (строка, необязательный): Читаемое описание элемента для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снапшота страницы или уникальный селектор элементаpaths (массив, необязательный): Абсолютные пути к файлам для сброса на элемент.data (объект, необязательный): Данные для сброса, в виде отображения типа MIME на строковое значение (например, {"text/plain": "привет", "text/uri-list": "https://example.com"}).element (строка, необязательный): Читаемое описание элемента для получения разрешения на взаимодействие с элементомtarget (строка, необязательный): Точная ссылка на целевой элемент из снапшота страницы или уникальный селектор элементаfunction (строка): () => { / код / } или (element) => { / код / } при указании элементаfilename (строка, необязательный): Имя файла для сохранения результата. Если не указано, результат возвращается в виде текста.paths (массив, необязательный): Абсолютные пути к файлам для загрузки. Может быть один файл или несколько файлов. Если не указано, диалог выбора файла отменяется.fields (массив): Поля для заполненияtext (строка, необязательный): Обычный текст для поиска в снимке страницы (поиск подстроки без учёта регистра). Укажите либо text, либо regex, но не оба.regex (строка, необязательный): Регулярное выражение для поиска в снимке страницы. Совпадение по умолчанию чувствительно к регистру; чтобы добавить флаги, оберните паттерн в слэши, например "/error/i" для поиска без учёта регистра. Укажите либо text, либо regex, но не оба.accept (логический): Принять ли диалоговое окно.promptText (строка, необязательный): Текст запроса в случае диалогового окна запроса.element (строка, необязательный): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элемента.url (строка): URL-адрес для переходаpart. Используйте номер из browser_network_requests.index (целое число): Порядковый номер запроса, начиная с 1, как выведено в browser_network_requests.part (строка, необязательный): Вернуть только эту часть запроса. Опустите, чтобы вернуть полные детали.filename (строка, необязательный): Имя файла для сохранения результата. Если не указано, результат возвращается как текст.browser_network_request с указанием номера для получения полных деталей.static (логический): Включать ли успешные статические ресурсы, такие как изображения, шрифты, скрипты и т.д. По умолчанию false.filter (строка, необязательный): Возвращать только запросы, URL которых соответствует этому регулярному выражению (например, "/api/.*user").filename (строка, необязательный): Имя файла для сохранения сетевых запросов. Если не указано, запросы возвращаются как текст.key (строка): Имя клавиши для нажатия или символ для генерации, например ArrowLeft или awidth (число): Ширина окна браузераheight (число): Высота окна браузераcode (строка, необязательный): JavaScript-функция, содержащая код Playwright для выполнения. Она будет вызвана с одним аргументом, page, который вы можете использовать для любого взаимодействия со страницей. Например: async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }filename (строка, необязательный): Загрузить код из указанного файла. Если указаны оба параметра, code будет проигнорирован.element (строка, необязательный): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элемента.values (массив): Массив значений для выбора в выпадающем списке. Может быть одним значением или несколькими значениями.target (строка, необязательный): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элемента.filename (строка, необязательный): Сохранить снимок в markdown-файл вместо возврата в ответе.depth (число, необязательный): Ограничить глубину дерева снимка.boxes (логический, необязательный): Включить ограничивающий框 каждого элемента в формате [box=x,y,width,height] в снимок. Координаты относительно окна просмотра, в пикселях CSS (Element.getBoundingClientRect).browser_snapshot.element (строка, необязательный): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка, необязательный): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элемента.type (строка): Формат изображения для скриншота. По умолчанию png.filename (строка, необязательный): Имя файла для сохранения скриншота. По умолчанию page-{timestamp}.{png|jpeg}, если не указано. Рекомендуется использовать относительные имена файлов, чтобы оставаться в пределах каталога вывода.fullPage (логический, необязательный): Если true, делает скриншот всей прокручиваемой страницы, а не текущего видимого окна просмотра. Не может использоваться со скриншотами элементов.scale (строка): Масштаб разрешения изображения. "css" создает скриншот размером в пикселях CSS (меньший, согласованный на разных устройствах). "device" создает высокоточный скриншот с использованием пикселей устройства (больший, учитывает плотность пикселей устройства). По умолчанию css.element (строка, необязательный): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элемента.text (строка): Текст для ввода в элемент.submit (логический, необязательный): Отправить ли введенный текст (нажать Enter после).slowly (логический, необязательный): Вводить ли по одному символу за раз. Полезно для запуска обработчиков клавиш на странице. По умолчанию весь текст заполняется сразу.time (число, необязательный): Время ожидания в секундах.text (строка, необязательный): Текст для ожидания появления.textGone (строка, необязательный): Текст для ожидания исчезновения.Управление вкладками
action (строка): Операция для выполненияindex (число, необязательный): Индекс вкладки, используемый для закрытия/выбора. Если опущено для закрытия, закрывается текущая вкладка.url (строка, необязательный): URL-адрес для перехода на новой вкладке, используется для создания.Установка браузера
Конфигурация (включение по запросу через --caps=config)
Сеть (подключается через --caps=network)
state (строка): Значение "offline" для имитации оффлайн-режима, "online" для восстановления сетевого подключенияpattern (строка): Шаблон URL для сопоставления (например, "/api/users", "/*.{png,jpg}")status (число, необязательный): HTTP-код статуса для ответа (по умолчанию: 200)body (строка, необязательный): Тело ответа (текстовая или JSON-строка)contentType (строка, необязательный): Заголовок Content-Type (например, "application/json", "text/html")headers (массив, необязательный): Заголовки для добавления в формате "Имя: Значение"removeHeaders (строка, необязательный): Список имён заголовков через запятую для удаления из запросаpatternстрока, необязательный): Шаблон URL для удаления маршрута (опустите для удаления всех маршрутов)Хранилище (подключается через --caps=storage)
name (строка): Имя файла cookie для удаленияname (строка): Имя файла cookie для полученияdomain (строка, необязательный): Фильтровать файлы cookie по доменуpath (строка, необязательный): Фильтровать файлы cookie по путиname (строка): Имя файла cookievalue (строка): Значение файла cookiedomain (строка, необязательный): Домен файла cookiepath (строка, необязательный): Путь файла cookieexpires (число, необязательный): Срок истечения файла cookie в формате Unix-временной меткиhttpOnly (boolean, необязательный): Является ли файл cookie доступным только через HTTPsecure (boolean, необязательный): Является ли файл cookie безопаснымsameSite (строка, необязательный): Атрибут SameSite файла cookiekey (строка): Ключ для удаленияkey (строка): Ключ для полученияkey (строка): Ключ для установкиvalue (строка): Значение для установкиkey (строка): Ключ для удаленияkey (строка): Ключ для полученияkey (строка): Ключ для установкиvalue (строка): Значение для установкиfilename (строка): Путь к файлу состояния хранилища для восстановленияfilename (строка, необязательный): Имя файла для сохранения состояния хранилища. По умолчанию используется storage-state-{timestamp}.json, если не указано.DevTools (подключается через --caps=devtools)
element (строка, необязательный): Человекочитаемое описание элемента, использованное при добавлении подсветки; должно совпадать со значением, переданным в browser_highlight.target (строка, необязательный): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элементаelement (строка, необязательный): Человекочитаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элементаstyle (строка, необязательный): Дополнительные встроенные CSS-стили, применяемые к наложению подсветки, например "outline: 2px dashed red".step, установленным в true, выполнение будет снова приостановлено перед следующим действием.step (boolean, необязательный): Если true, выполнение будет снова приостановлено перед следующим действием, что позволяет проводить пошаговую отладку.location (строка, необязательный): Приостановить выполнение на определённом <файл>:<строка>, например "example.spec.ts:42".filename (строка, необязательно): Имя файла для сохранения видео.size (объект, необязательно): Размер видеоtitle (строка): Название главыdescription (строка, необязательно): Описание главыduration (число, необязательно): Продолжительность отображения карточки главы в миллисекундахduration (число, необязательно): Как долго каждая аннотация действия остается на экране, в миллисекундах. По умолчанию 500.position (строка, необязательно): Где разместить заголовок действия относительно страницы. По умолчанию top-right.cursor (строка, необязательно): Декорация курсора для действий указателя. "pointer" (по умолчанию) анимирует перемещение указателя мыши от точки предыдущего действия к следующей; "none" отключает декорацию курсора.На основе координат (подключается через --caps=vision)
x (число): Координата Xy (число): Координата Ybutton (строка, необязательно): Кнопка для нажатия, по умолчанию леваяclickCount (число, необязательно): Количество кликов, по умолчанию 1delay (число, необязательно): Время ожидания между нажатием и отпусканием кнопки мыши в миллисекундах, по умолчанию 0button (строка, необязательно): Кнопка для нажатия, по умолчанию леваяstartX (число): Начальная координата XstartY (число): Начальная координата YendX (число): Конечная координата XendY (число): Конечная координата Yx (число): Координата Xy (число): Координата Ybutton (строка, необязательно): Кнопка для отпускания, по умолчанию леваяdeltaX (число): Дельта по XdeltaY (число): Дельта по YГенерация PDF (подключается через --caps=pdf)
filename (строка, необязательно): Имя файла для сохранения pdf. Если не указано, используется page-{timestamp}.pdf. Рекомендуется использовать относительные имена файлов, чтобы оставаться в пределах каталога вывода.Проверки в тестах (подключается через --caps=testing)
element (строка, необязательно): Читаемое описание элемента, используемое для получения разрешения на взаимодействие с элементомtarget (строка): Точная ссылка на целевой элемент из снимка страницы или уникальный селектор элементаrole (строка): РОЛЬ элемента. Можно найти в снимке так: - {ROLE} "Доступное имя":accessibleName (строка): ДОСТУПНОЕ_ИМЯ элемента. Можно найти в снимке так: - role "{ДОСТУПНОЕ_ИМЯ}"element (строка): Читаемое описание спискаtarget (строка): Точная ссылка на целевой элемент, указывающая на списокitems (массив): Элементы для проверкиbrowser_verify_element_visible.text (строка): ТЕКСТ для проверки. Можно найти в снимке так: - role "Доступное имя": {ТЕКСТ} или так: - text: {ТЕКСТ}type (строка): Тип элементаelement (строка): Читаемое описание элементаtarget (строка): Точная ссылка на целевой элемент из снимка страницыvalue (строка): Значение для проверки. Для флажков используйте "true" или "false".