Playwright MCP
官方官方 Playwright MCP 伺服器,用於瀏覽器自動化、頁面檢查、螢幕截圖,以及來自 Claude、Cursor 和其他 AI 代理的網頁互動。
你可以用 Playwright MCP 做什麼?
- 導航並與網頁互動 — 要求助理開啟 URL、點擊元素、填寫表單,或使用 Playwright 的瀏覽器自動化功能提取結構化的無障礙快照。
- 設定瀏覽器行為 — 透過
--browser、--device、--viewport-size和--user-agent參數設定瀏覽器類型、視窗大小、裝置模擬或用戶代理。 - 管理工作階段與驗證 — 使用持久化設定檔(
--user-data-dir)、隔離工作階段(--isolated)或儲存狀態檔案(--storage-state)來控制跨次執行的登入狀態。 - 連接到現有瀏覽器 — 使用
--extension旗標附加到正在執行的 Chrome 或 Edge 執行個體,以重複使用已登入的工作階段,無需重新驗證。 - 控制輸出與快照 — 使用
--output-dir、--output-mode和--snapshot-mode將主控台訊息、網路記錄和無障礙快照擷取到檔案或標準輸出。
文件
Playwright MCP
一個模型上下文協定 (MCP) 伺服器,使用 Playwright 提供瀏覽器自動化功能。此伺服器讓 LLM 能夠透過結構化的無障礙快照與網頁互動,無需依賴螢幕截圖或視覺調校模型。
Playwright MCP 與 Playwright CLI 的比較
此套件提供 Playwright 的 MCP 介面。如果您使用的是編碼代理,改用 CLI+SKILLS 可能會更有幫助。
-
CLI:現代的編碼代理越來越偏好以 SKILL 形式透過 CLI 工作流程而非 MCP,因為 CLI 調用更具 token 效率:它們避免了將大型工具架構和冗長的無障礙樹載入模型上下文,讓代理能透過簡潔、專用的指令來操作。這使得 CLI + SKILLS 更適合高吞吐量的編碼代理,這些代理必須在有限的上下文視窗內平衡瀏覽器自動化與大型程式碼庫、測試和推理。
了解更多關於 Playwright CLI with SKILLS。 -
MCP:MCP 對於受益於持久狀態、豐富的內省能力以及對頁面結構進行迭代推理的專業化代理循環仍然具有相關性,例如探索性自動化、自我修復測試或長時間運行的自主工作流程,在這些情境下,維持連續的瀏覽器上下文比 token 成本考量更為重要。
主要功能
- 快速且輕量。使用 Playwright 的無障礙樹,而非基於像素的輸入。
- LLM 友善。無需視覺模型,純粹基於結構化資料運作。
- 確定性的工具應用。避免了基於螢幕截圖方法常見的模糊性。
需求
- Node.js 18 或更新版本
- VS Code、Cursor、Windsurf、Claude Desktop、Goose、Grok、Junie 或任何其他 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"
]
}
}
Amp CLI 設定:
透過下方的 amp mcp add 指令新增
amp mcp add playwright -- npx @playwright/mcp@latest
Antigravity
透過 Antigravity 設定或更新您的設定檔來新增:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Claude Code
使用 Claude Code CLI 來新增 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
使用 Codex CLI 來新增 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
使用 Copilot CLI 以互動方式新增 Playwright MCP 伺服器:
/mcp add
或者,建立或編輯設定檔 ~/.copilot/mcp-config.json 並新增:
{
"mcpServers": {
"playwright": {
"type": "local",
"command": "npx",
"tools": [
"*"
],
"args": [
"@playwright/mcp@latest"
]
}
}
}
如需更多資訊,請參閱 Copilot CLI 文件。
Cursor
點擊按鈕安裝:
或手動安裝:
前往 Cursor Settings -> MCP -> Add new MCP Server。依喜好命名,使用 command 類型,指令為 npx @playwright/mcp@latest。您也可以透過點擊 Edit 來驗證設定或新增指令引數。
Factory
使用 Factory CLI 來新增 Playwright MCP 伺服器:
droid mcp add playwright "npx @playwright/mcp@latest"
或者,在 Factory droid 中輸入 /mcp 來開啟用於管理 MCP 伺服器的互動式 UI。
如需更多資訊,請參閱 Factory MCP 文件。
Gemini CLI
遵循 MCP 安裝指南,使用上述的標準配置。
Goose
點擊按鈕安裝:
或手動安裝:
前往 Advanced settings -> Extensions -> Add custom extension。依喜好命名,使用類型 STDIO,並將 command 設為 npx @playwright/mcp。點擊「Add Extension」。
Grok
使用 Grok CLI 來新增 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
在 Junie CLI 中新增 Playwright MCP 伺服器:
- 輸入
/mcp - 按下
Ctrl+A以新增 MCP 伺服器 - 從清單中選擇 Playwright
或者,新增至 .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"
]
}
}
}
opencode
遵循 MCP 伺服器文件。例如在 ~/.config/opencode/opencode.json 中:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"playwright": {
"type": "local",
"command": [
"npx",
"@playwright/mcp@latest"
],
"enabled": true
}
}
}
VS Code
點擊按鈕安裝:
或手動安裝:
遵循 MCP 安裝指南,使用上述的標準配置。您也可以使用 VS Code CLI 安裝 Playwright MCP 伺服器:
# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'
安裝後,Playwright MCP 伺服器將可在 VS Code 中與您的 GitHub Copilot 代理搭配使用。
Warp
前往 Settings -> AI -> Manage MCP Servers -> + Add 以新增 MCP 伺服器。使用上述的標準配置。
或者,在 Warp 提示字元中使用斜線指令 /add-mcp 並貼上上述的標準配置:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Windsurf
遵循 Windsurf MCP 文件。使用上述的標準配置。
配置
Playwright MCP 伺服器支援以下引數。它們可以在上述的 JSON 配置中,作為 "args" 清單的一部分提供:
| 選項 | 說明 |
|---|---|
| --allowed-hosts <hosts...> | 此伺服器允許提供服務的主機清單,以逗號分隔。預設為伺服器繫結的主機。傳遞 '*' 可停用主機檢查。 env PLAYWRIGHT_MCP_ALLOWED_HOSTS |
| --allowed-origins | 允許瀏覽器請求的受信任來源清單,以分號分隔。預設為允許所有來源。重要事項:並非作為安全邊界,也不影響重新導向。 env PLAYWRIGHT_MCP_ALLOWED_ORIGINS |
| --allow-unrestricted-file-access | 允許存取工作區根目錄以外的檔案。同時允許無限制地存取 file:// 網址。預設情況下,檔案系統的存取僅限於工作區根目錄(若未設定根目錄則為目前工作目錄),且會封鎖導覽至 file:// 網址。 env PLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESS |
| --blocked-origins | 封鎖瀏覽器請求的來源清單,以分號分隔。封鎖清單的評估優先於允許清單。若未搭配允許清單使用,不符合封鎖清單的請求仍會被允許。重要事項:並非作為安全邊界,也不影響重新導向。 env PLAYWRIGHT_MCP_BLOCKED_ORIGINS |
| --block-service-workers | 封鎖 Service Worker 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 <headers...> | 連線請求時要傳送的 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 | 模擬通用行動裝置(Chromium 為 Pixel 10,WebKit 為 iPhone 17)。行動頁面通常較輕量,可節省 Token。無法與 --device 合併使用。 env PLAYWRIGHT_MCP_MOBILE |
| --executable-path | 瀏覽器執行檔的路徑。 env PLAYWRIGHT_MCP_EXECUTABLE_PATH |
| --extension | 連線至正在執行的瀏覽器執行個體(僅限 Edge/Chrome)。需要安裝「Playwright 擴充功能」。 env PLAYWRIGHT_MCP_EXTENSION |
| --endpoint | 要連線的已繫結瀏覽器端點。 env PLAYWRIGHT_MCP_ENDPOINT |
| --grant-permissions <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 <path...> | 要在 Playwright 頁面物件上執行的 TypeScript 檔案路徑 env PLAYWRIGHT_MCP_INIT_PAGE |
| --init-script <path...> | 要新增為初始化指令碼的 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 | 指定用於測試 ID 的屬性,預設為 "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';
}
獨立 MCP 伺服器
在沒有顯示器的系統上或從 IDE 的工作處理程序執行有頭瀏覽器時,
請從具有 DISPLAY 的環境中執行 MCP 伺服器,並傳遞 --port 旗標以啟用 HTTP 傳輸。
npx @playwright/mcp@latest --port 8931
然後在 MCP 客戶端設定中,將 url 設定為 HTTP 端點:
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/mcp"
}
}
}
安全性
Playwright MCP 並非安全邊界。請參閱 MCP 安全最佳實務 以取得保護您部署的指引。
Docker
注意: Docker 實作目前僅支援無頭 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);
// ...
});
工具
核心自動化
- **browser_click**- 標題:點擊
- 描述:在網頁上執行點擊操作
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器doubleClick(布林值,可選):是否執行雙擊而非單擊button(字串,可選):要點擊的按鈕,預設為左鍵modifiers(陣列,可選):要按下的修飾鍵
- 唯讀:false
- browser_close
- 標題:關閉瀏覽器
- 描述:關閉頁面
- 參數:無
- 唯讀:false
- browser_console_messages
- 標題:取得主控台訊息
- 描述:回傳所有主控台訊息
- 參數:
level(字串):要回傳的主控台訊息層級。每個層級都包含更嚴重層級的訊息。預設為 "info"。all(布林值,可選):回傳自工作階段開始以來的所有主控台訊息,而不僅是上次導航之後的訊息。預設為 false。filename(字串,可選):用於儲存主控台訊息的檔案名稱。若未提供,訊息將以文字形式回傳。
- 唯讀:true
- browser_drag
- 標題:拖曳滑鼠
- 描述:在兩個元素之間執行拖放操作
- 參數:
startElement(字串,可選):用於取得與元素互動權限的人類可讀來源元素描述startTarget(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器endElement(字串,可選):用於取得與元素互動權限的人類可讀目標元素描述endTarget(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器
- 唯讀:false
- browser_drop
- 標題:將檔案或資料放置到元素上
- 描述:將檔案或 MIME 類型的資料放置到元素上,如同從頁面外部拖入。必須提供 "paths" 或 "data" 中的至少一個。
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器paths(陣列,可選):要放置到元素上的檔案的絕對路徑。data(物件,可選):要放置的資料,為 MIME 類型對應到字串值的映射(例如 {"text/plain": "hello", "text/uri-list": "https://example.com"})。
- 唯讀:false
- browser_evaluate
- 標題:執行 JavaScript
- 描述:在頁面或元素上執行 JavaScript 表達式
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串,可選):來自頁面快照的精確目標元素參照,或唯一的元素選擇器function(字串):() => { /* code / } 或當提供元素時的 (element) => { / code */ }filename(字串,可選):用於儲存結果的檔案名稱。若未提供,結果將以文字形式回傳。
- 唯讀:false
- browser_file_upload
- 標題:上傳檔案
- 描述:上傳一個或多個檔案
- 參數:
paths(陣列,可選):要上傳的檔案的絕對路徑。可以是單個檔案或多個檔案。若省略,則取消檔案選擇器。
- 唯讀:false
- browser_fill_form
- 標題:填寫表單
- 描述:填寫多個表單欄位
- 參數:
fields(陣列):要填寫的欄位
- 唯讀:false
- browser_find
- 標題:在頁面快照中尋找
- 描述:在當前頁面的無障礙快照中搜尋文字或正則表達式。回傳匹配的快照節點,並附帶幾行周圍的上下文(類似搜尋片段),每個節點都顯示在其從樹根開始的路徑下,這比在只需要定位元素及其參照時擷取整個快照更節省資源。
- 參數:
text(字串,可選):要在頁面快照中搜尋的純文字(不區分大小寫的子字串匹配)。提供 text 或 regex,不能同時提供兩者。regex(字串,可選):要在頁面快照中搜尋的正則表達式。預設匹配區分大小寫;將模式包裹在斜線中以新增旗標,例如 "/error/i" 表示不區分大小寫。提供 text 或 regex,不能同時提供兩者。
- 唯讀:true
- browser_handle_dialog
- 標題:處理對話框
- 描述:處理對話框
- 參數:
accept(布林值):是否接受對話框。promptText(字串,可選):在提示對話框中輸入的文字。
- 唯讀:false
- browser_hover
- 標題:滑鼠懸停
- 描述:將滑鼠懸停在頁面元素上
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器
- 唯讀:false
- browser_navigate
- 標題:導航到 URL
- 描述:導航到一個 URL
- 參數:
url(字串):要導航到的 URL
- 唯讀:false
- browser_navigate_back
- 標題:返回上一頁
- 描述:返回歷史記錄中的上一頁
- 參數:無
- 唯讀:false
- browser_network_request
- 標題:顯示網路請求詳細資訊
- 描述:回傳單個網路請求的完整詳細資訊(標頭和主體),或當
part設定時回傳單個部分。使用來自 browser_network_requests 的編號。 - 參數:
index(整數):請求的 1-based 索引,如 browser_network_requests 所列印。part(字串,可選):僅回傳請求的此部分。省略以回傳完整詳細資訊。filename(字串,可選):用於儲存結果的檔案名稱。若未提供,輸出將以文字形式回傳。
- 唯讀:true
- browser_network_requests
- 標題:列出網路請求
- 描述:回傳自載入頁面以來的編號網路請求列表。使用 browser_network_request 搭配編號以取得完整詳細資訊。
- 參數:
static(布林值):是否包含成功的靜態資源,例如圖片、字型、腳本等。預設為 false。filter(字串,可選):僅回傳 URL 符合此正則表達式的請求(例如 "/api/.*user")。filename(字串,可選):用於儲存網路請求的檔案名稱。若未提供,請求將以文字形式回傳。
- 唯讀:true
- browser_press_key
- 標題:按下按鍵
- 描述:按下鍵盤上的一個按鍵
- 參數:
key(字串):要按下的按鍵名稱或要產生的字元,例如ArrowLeft或a
- 唯讀:false
- browser_resize
- 標題:調整瀏覽器視窗大小
- 描述:調整瀏覽器視窗大小
- 參數:
width(數字):瀏覽器視窗的寬度height(數字):瀏覽器視窗的高度
- 唯讀:false
- browser_run_code_unsafe
- 標題:執行 Playwright 程式碼(不安全)
- 描述:執行 Playwright 程式碼片段。不安全:在 Playwright 伺服器程序中執行任意 JavaScript,相當於 RCE。
- 參數:
code(字串,可選):包含要執行的 Playwright 程式碼的 JavaScript 函式。它將以單個參數 page 被調用,您可以使用它進行任何頁面互動。例如:async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }filename(字串,可選):從指定的檔案載入程式碼。如果同時提供了 code 和 filename,則 code 將被忽略。
- 唯讀:false
- browser_select_option
- 標題:選擇選項
- 描述:在下拉式選單中選擇一個選項
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器values(陣列):要在下拉式選單中選擇的值陣列。這可以是單個值或多個值。
- 唯讀:false
- browser_snapshot
- 標題:頁面快照
- 描述:擷取當前頁面的無障礙快照,這比螢幕截圖更好
- 參數:
target(字串,可選):來自頁面快照的精確目標元素參照,或唯一的元素選擇器filename(字串,可選):將快照儲存到 markdown 檔案,而不是在回應中回傳。depth(數字,可選):限制快照樹的深度boxes(布林值,可選):在快照中包含每個元素的邊界框,格式為 [box=x,y,width,height]。座標相對於視埠,單位為 CSS 像素 (Element.getBoundingClientRect)
- 唯讀:true
- browser_take_screenshot
- 標題:擷取螢幕截圖
- 描述:擷取當前頁面的螢幕截圖。您無法根據螢幕截圖執行動作,請使用 browser_snapshot 來執行動作。
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串,可選):來自頁面快照的精確目標元素參照,或唯一的元素選擇器type(字串):螢幕截圖的圖片格式。預設為 png。filename(字串,可選):用於儲存螢幕截圖的檔案名稱。若未指定,預設為page-{timestamp}.{png|jpeg}。建議使用相對檔案名稱以保持在輸出目錄內。fullPage(布林值,可選):設為 true 時,擷取整個可滾動頁面的螢幕截圖,而非僅當前可見的視埠。不能與元素螢幕截圖一起使用。scale(字串):圖片解析度縮放。"css" 產生以 CSS 像素為單位的螢幕截圖(較小,跨裝置一致)。"device" 使用裝置像素產生高解析度螢幕截圖(較大,考慮裝置像素比)。預設為 css。
- 唯讀:true
- browser_type
- 標題:輸入文字
- 描述:將文字輸入到可編輯元素中
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參照,或唯一的元素選擇器text(字串):要輸入到元素中的文字submit(布林值,可選):是否提交輸入的文字(之後按下 Enter)slowly(布林值,可選):是否一次輸入一個字元。對於觸發頁面中的按鍵處理器很有用。預設情況下,整個文字會一次填入。
- 唯讀:false
- browser_wait_for
- 標題:等待
- 描述:等待文字出現或消失,或等待指定的時間經過
- 參數:
time(數字,可選):等待的時間(秒)text(字串,可選):要等待出現的文字textGone(字串,可選):要等待消失的文字
- 唯讀:false
分頁管理
- browser_tabs
- 標題:管理分頁
- 描述:列出、建立、關閉或選取瀏覽器分頁。
- 參數:
action(字串):要執行的操作index(數字,可選):分頁索引,用於關閉/選取。若關閉時省略,則關閉目前分頁。url(字串,可選):在新分頁中要導向的網址,用於建立新分頁。
- 唯讀:false
瀏覽器安裝
設定(透過 --caps=config 選擇加入)
- browser_get_config
- 標題:取得設定
- 描述:取得合併 CLI 選項、環境變數和設定檔後的最終解析設定。
- 參數:無
- 唯讀:true
網路(透過 --caps=network 選擇加入)
- browser_network_state_set
- 標題:設定網路狀態
- 描述:將瀏覽器網路狀態設為線上或離線。離線時,所有網路請求都會失敗。
- 參數:
state(字串):設為 "offline" 以模擬離線模式,設為 "online" 以恢復網路連線
- 唯讀:false
- browser_route
- 標題:模擬網路請求
- 描述:設定路由以模擬符合網址模式的網路請求
- 參數:
pattern(字串):要比對的網址模式(例如 "/api/users"、"/*.{png,jpg}")status(數字,可選):要回傳的 HTTP 狀態碼(預設:200)body(字串,可選):回應主體(文字或 JSON 字串)contentType(字串,可選):Content-Type 標頭(例如 "application/json"、"text/html")headers(陣列,可選):要以 "Name: Value" 格式新增的標頭removeHeaders(字串,可選):要從請求中移除的標頭名稱,以逗號分隔的清單
- 唯讀:false
- browser_route_list
- 標題:列出網路路由
- 描述:列出所有作用中的網路路由
- 參數:無
- 唯讀:true
- browser_unroute
- 標題:移除網路路由
- 描述:移除符合模式的路由(若未指定模式則移除所有路由)
- 參數:
pattern(字串,可選):要取消路由的網址模式(省略則移除所有路由)
- 唯讀:false
儲存空間(透過 --caps=storage 選擇加入)
- browser_cookie_clear
- 標題:清除 Cookie
- 描述:清除所有 Cookie
- 參數:無
- 唯讀:false
- browser_cookie_delete
- 標題:刪除 Cookie
- 描述:刪除特定的 Cookie
- 參數:
name(字串):要刪除的 Cookie 名稱
- 唯讀:false
- browser_cookie_get
- 標題:取得 Cookie
- 描述:依名稱取得特定的 Cookie
- 參數:
name(字串):要取得的 Cookie 名稱
- 唯讀:true
- browser_cookie_list
- 標題:列出 Cookie
- 描述:列出所有 Cookie(可選擇依網域/路徑篩選)
- 參數:
domain(字串,可選):依網域篩選 Cookiepath(字串,可選):依路徑篩選 Cookie
- 唯讀:true
- browser_cookie_set
- 標題:設定 Cookie
- 描述:設定 Cookie,可附帶選用旗標(domain、path、expires、httpOnly、secure、sameSite)
- 參數:
name(字串):Cookie 名稱value(字串):Cookie 值domain(字串,可選):Cookie 網域path(字串,可選):Cookie 路徑expires(數字,可選):Cookie 到期時間,Unix 時間戳記httpOnly(布林值,可選):Cookie 是否為 HTTP onlysecure(布林值,可選):Cookie 是否為 securesameSite(字串,可選):Cookie 的 SameSite 屬性
- 唯讀:false
- browser_localstorage_clear
- 標題:清除 localStorage
- 描述:清除所有 localStorage
- 參數:無
- 唯讀:false
- browser_localstorage_delete
- 標題:刪除 localStorage 項目
- 描述:刪除一個 localStorage 項目
- 參數:
key(字串):要刪除的鍵
- 唯讀:false
- browser_localstorage_get
- 標題:取得 localStorage 項目
- 描述:依鍵取得一個 localStorage 項目
- 參數:
key(字串):要取得的鍵
- 唯讀:true
- browser_localstorage_list
- 標題:列出 localStorage
- 描述:列出所有 localStorage 的鍵值對
- 參數:無
- 唯讀:true
- browser_localstorage_set
- 標題:設定 localStorage 項目
- 描述:設定一個 localStorage 項目
- 參數:
key(字串):要設定的鍵value(字串):要設定的值
- 唯讀:false
- browser_sessionstorage_clear
- 標題:清除 sessionStorage
- 描述:清除所有 sessionStorage
- 參數:無
- 唯讀:false
- browser_sessionstorage_delete
- 標題:刪除 sessionStorage 項目
- 描述:刪除一個 sessionStorage 項目
- 參數:
key(字串):要刪除的鍵
- 唯讀:false
- browser_sessionstorage_get
- 標題:取得 sessionStorage 項目
- 描述:依鍵取得一個 sessionStorage 項目
- 參數:
key(字串):要取得的鍵
- 唯讀:true
- browser_sessionstorage_list
- 標題:列出 sessionStorage
- 描述:列出所有 sessionStorage 的鍵值對
- 參數:無
- 唯讀:true
- browser_sessionstorage_set
- 標題:設定 sessionStorage 項目
- 描述:設定一個 sessionStorage 項目
- 參數:
key(字串):要設定的鍵value(字串):要設定的值
- 唯讀:false
- browser_set_storage_state
- 標題:還原儲存狀態
- 描述:從檔案還原儲存狀態(Cookie、localStorage)。這會在還原前清除現有的 Cookie 和 localStorage。
- 參數:
filename(字串):要從中還原的儲存狀態檔案路徑
- 唯讀:false
- browser_storage_state
- 標題:儲存儲存狀態
- 描述:將儲存狀態(Cookie、localStorage)儲存到檔案以供日後重複使用
- 參數:
filename(字串,可選):要儲存儲存狀態的檔案名稱。若未指定,預設為storage-state-{timestamp}.json。
- 唯讀:true
DevTools(透過 --caps=devtools 選擇加入)
- browser_annotate
- 標題:註解目前頁面
- 描述:以註解模式開啟目前頁面的 Playwright Dashboard,並等待使用者繪製註解。回傳已註解的螢幕截圖、ARIA 快照和註解清單。
- 參數:無
- 唯讀:true
- browser_hide_highlight
- 標題:隱藏元素醒目提示
- 描述:移除先前為該元素新增的醒目提示覆蓋層。
- 參數:
element(字串,可選):新增醒目提示時使用的、人類可讀的元素描述;必須與傳遞給 browser_highlight 的值相符。target(字串,可選):來自頁面快照的精確目標元素參考,或唯一的元素選擇器
- 唯讀:true
- browser_highlight
- 標題:醒目提示元素
- 描述:在頁面上的元素周圍顯示持續性的醒目提示覆蓋層。
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參考,或唯一的元素選擇器style(字串,可選):套用至醒目提示覆蓋層的額外內嵌 CSS,例如 "outline: 2px dashed red"。
- 唯讀:true
- browser_resume
- 標題:繼續暫停的腳本執行
- 描述:在腳本暫停後繼續執行。當以 step 設為 true 呼叫時,執行將在下一個動作前再次暫停。
- 參數:
step(布林值,可選):設為 true 時,執行將在下一個動作前再次暫停,允許逐步除錯。location(字串,可選):在特定的 : 暫停執行,例如 "example.spec.ts:42"。
- 唯讀:false
- browser_start_tracing
- 標題:開始追蹤
- 描述:開始追蹤記錄
- 參數:無
- 唯讀:true
- browser_start_video
- 標題:開始錄影
- 描述:開始錄影
- 參數:
filename(字串,可選):儲存影片的檔案名稱。size(物件,可選):影片尺寸
- 唯讀:true
- browser_stop_tracing
- 標題:停止追蹤
- 描述:停止追蹤記錄
- 參數:無
- 唯讀:true
- browser_stop_video
- 標題:停止錄影
- 描述:停止錄影
- 參數:無
- 唯讀:true
- browser_video_chapter
- 標題:影片章節
- 描述:在影片錄製中新增章節標記。顯示帶有模糊背景的全螢幕章節卡片。
- 參數:
title(字串):章節標題description(字串,可選):章節描述duration(數字,可選):顯示章節卡片的持續時間(毫秒)
- 唯讀:true
- browser_video_hide_actions
- 標題:隱藏動作覆蓋層
- 描述:停止註解在頁面上執行的動作。
- 參數:無
- 唯讀:true
- browser_video_show_actions
- 標題:顯示動作覆蓋層
- 描述:為頁面上後續執行的動作加上註解,以標註形式顯示動作名稱並醒目提示目標元素。在錄影或螢幕廣播時很有用。
- 參數:
duration(數字,可選):每個動作註解在畫面上停留的時間(毫秒)。預設為 500。position(字串,可選):動作標題相對於頁面的放置位置。預設為 top-right。cursor(字串,可選):指標動作的游標裝飾。"pointer"(預設)會以動畫方式顯示滑鼠指標從上一個動作點移動到下一個;"none" 則停用游標裝飾。
- 唯讀:true
基於座標的操作(透過 --caps=vision 選擇加入)
- browser_mouse_click_xy
- 標題:點擊
- 描述:在指定位置點擊滑鼠按鈕
- 參數:
x(數字):X 座標y(數字):Y 座標button(字串,可選):要點擊的按鈕,預設為左鍵clickCount(數字,可選):點擊次數,預設為 1delay(數字,可選):滑鼠按下與放開之間的等待時間(毫秒),預設為 0
- 唯讀:false
- browser_mouse_down
- 標題:按下滑鼠
- 描述:按下滑鼠按鈕
- 參數:
button(字串,可選):要按下的按鈕,預設為左鍵
- 唯讀:false
- browser_mouse_drag_xy
- 標題:拖曳滑鼠
- 描述:將滑鼠左鍵拖曳到指定位置
- 參數:
startX(數字):起始 X 座標startY(數字):起始 Y 座標endX(數字):結束 X 座標endY(數字):結束 Y 座標
- 唯讀:false
- browser_mouse_move_xy
- 標題:移動滑鼠
- 描述:將滑鼠移動到指定位置
- 參數:
x(數字):X 座標y(數字):Y 座標
- 唯讀:false
- browser_mouse_up
- 標題:放開滑鼠
- 描述:放開滑鼠按鈕
- 參數:
button(字串,可選):要放開的按鈕,預設為左鍵
- 唯讀:false
- browser_mouse_wheel
- 標題:滾動滑鼠滾輪
- 描述:滾動滑鼠滾輪
- 參數:
deltaX(數字):X 軸增量deltaY(數字):Y 軸增量
- 唯讀:false
PDF 生成(透過 --caps=pdf 選擇加入)
- browser_pdf_save
- 標題:儲存為 PDF
- 描述:將頁面儲存為 PDF
- 參數:
filename(字串,可選):儲存 PDF 的檔案名稱。若未指定,預設為page-{timestamp}.pdf。建議使用相對檔案名稱以保留在輸出目錄內。
- 唯讀:true
測試斷言(透過 --caps=testing 選擇加入)
- browser_generate_locator
- 標題:為元素建立定位器
- 描述:為指定元素生成定位器,用於測試
- 參數:
element(字串,可選):用於取得與元素互動權限的人類可讀元素描述target(字串):來自頁面快照的精確目標元素參考,或唯一的元素選擇器
- 唯讀:true
- browser_verify_element_visible
- 標題:驗證元素可見
- 描述:驗證元素在頁面上可見
- 參數:
role(字串):元素的 ROLE。可以在快照中找到,格式如下:- {ROLE} "Accessible Name":accessibleName(字串):元素的 ACCESSIBLE_NAME。可以在快照中找到,格式如下:- role "{ACCESSIBLE_NAME}"
- 唯讀:false
- browser_verify_list_visible
- 標題:驗證列表可見
- 描述:驗證列表在頁面上可見
- 參數:
element(字串):人類可讀的列表描述target(字串):指向該列表的精確目標元素參考items(陣列):要驗證的項目
- 唯讀:false
- browser_verify_text_visible
- 標題:驗證文字可見
- 描述:驗證文字在頁面上可見。若情況允許,建議優先使用 browser_verify_element_visible。
- 參數:
text(字串):要驗證的 TEXT。可以在快照中找到,格式如下:- role "Accessible Name": {TEXT}或如下:- text: {TEXT}
- 唯讀:false
- browser_verify_value
- 標題:驗證值
- 描述:驗證元素的值
- 參數:
type(字串):元素的類型element(字串):人類可讀的元素描述target(字串):來自頁面快照的精確目標元素參考value(字串):要驗證的值。對於核取方塊,請使用 "true" 或 "false"。
- 唯讀:false