🚀 Playwright MCP
Playwright MCPは、Playwrightを使用してブラウザ自動化機能を提供するモデルコンテキストプロトコル(MCP)サーバーです。このサーバーを使用すると、LLM(大規模言語モデル)が構造化されたアクセシビリティスナップショットを通じてウェブページと対話でき、スクリーンショットや視覚調整モデルが不要になります。
✨ 主な機能
- 高速かつ軽量:Playwrightのアクセシビリティツリーを使用し、ピクセルベースの入力は必要ありません。
- LLMに優しい:ビジョンモデルは不要で、構造化データのみで動作します。
- 決定的なツール適用:スクリーンショットベースのアプローチで一般的な曖昧さを回避します。
📦 インストール
必要条件
- 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 Settings -> MCP -> Add new MCP Serverに移動します。好きな名前を付け、コマンドタイプでnpx @playwright/mcpを使用します。Editをクリックして設定を確認したり、コマンド引数を追加したりすることもできます。
{
"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"
]
}
}
}
📚 ドキュメント
設定
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。
--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 スクリーンショットを使用するサーバーを実行する(デフォルトはアクセシビリティスナップショットを使用)
ユーザープロファイル
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}"
]
}
}
}
設定ファイル
Playwright MCPサーバーは、JSON設定ファイルを使用して設定できます。--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.connect(transport);
});
💻 使用例
ツールの使用モード
ツールは2つのモードで使用できます。
- スナップショットモード(デフォルト): パフォーマンスと信頼性を向上させるためにアクセシビリティスナップショットを使用します。
- ビジョンモード: 視覚ベースの対話のためにスクリーンショットを使用します。
ビジョンモードを使用するには、サーバーを起動するときに--visionフラグを追加します。
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--vision"
]
}
}
}
ビジョンモードは、提供されたスクリーンショットに基づいてXY座標空間を使用して要素と対話できるコンピューター使用モデルで最適に動作します。
対話
- **browser_snapshot**
- タイトル: ページスナップショット
- 説明: 現在のページのアクセシビリティスナップショットをキャプチャします。これはスクリーンショットよりも優れています。
- パラメーター: なし
- 読み取り専用: **true**
-
browser_click
- タイトル: クリック
- 説明: ウェブページでクリックを実行します。
- パラメーター:
element (string): 要素との対話の許可を取得するために使用される人間が読める要素の説明
ref (string): ページスナップショットからの正確なターゲット要素の参照
- 読み取り専用: false
-
browser_drag
- タイトル: マウスをドラッグする
- 説明: 2つの要素間でドラッグアンドドロップを実行します。
- パラメーター:
startElement (string): 要素との対話の許可を取得するために使用される人間が読めるソース要素の説明
startRef (string): ページスナップショットからの正確なソース要素の参照
endElement (string): 要素との対話の許可を取得するために使用される人間が読めるターゲット要素の説明
endRef (string): ページスナップショットからの正確なターゲット要素の参照
- 読み取り専用: false
-
browser_hover
- タイトル: マウスをホバーする
- 説明: ページ上の要素にマウスをホバーします。
- パラメーター:
element (string): 要素との対話の許可を取得するために使用される人間が読める要素の説明
ref (string): ページスナップショットからの正確なターゲット要素の参照
- 読み取り専用: true
-
browser_type
- タイトル: テキストを入力する
- 説明: 編集可能な要素にテキストを入力します。
- パラメーター:
element (string): 要素との対話の許可を取得するために使用される人間が読める要素の説明
ref (string): ページスナップショットからの正確なターゲット要素の参照
text (string): 要素に入力するテキスト
submit (boolean, optional): 入力したテキストを送信するかどうか(後にEnterキーを押す)
slowly (boolean, optional): 1文字ずつ入力するかどうか。ページ内のキーハンドラーをトリガーするのに便利です。デフォルトでは、テキスト全体が一度に入力されます。
- 読み取り専用: false
-
browser_select_option
- タイトル: オプションを選択する
- 説明: ドロップダウンでオプションを選択します。
- パラメーター:
element (string): 要素との対話の許可を取得するために使用される人間が読める要素の説明
ref (string): ページスナップショットからの正確なターゲット要素の参照
values (array): ドロップダウンで選択する値の配列。単一の値または複数の値にすることができます。
- 読み取り専用: false
-
browser_press_key
- タイトル: キーを押す
- 説明: キーボードのキーを押します。
- パラメーター:
key (string): 押すキーの名前または生成する文字。例: ArrowLeft または a
- 読み取り専用: false
-
browser_wait_for
- タイトル: 待機する
- 説明: テキストの表示または非表示、または指定された時間の経過を待ちます。
- パラメーター:
time (number, optional): 待機する時間(秒)
text (string, optional): 待機するテキスト
textGone (string, optional): 非表示になるまで待機するテキスト
- 読み取り専用: true
-
browser_file_upload
- タイトル: ファイルをアップロードする
- 説明: 1つまたは複数のファイルをアップロードします。
- パラメーター:
paths (array): アップロードするファイルの絶対パス。単一のファイルまたは複数のファイルにすることができます。
- 読み取り専用: false
-
browser_handle_dialog
- タイトル: ダイアログを処理する
- 説明: ダイアログを処理します。
- パラメーター:
accept (boolean): ダイアログを受け入れるかどうか。
promptText (string, optional): プロンプトダイアログの場合のプロンプトのテキスト。
- 読み取り専用: false
ナビゲーション
- **browser_navigate**
- タイトル: URLに移動する
- 説明: URLに移動します。
- パラメーター:
- `url` (string): 移動するURL
- 読み取り専用: **false**
-
browser_navigate_back
- タイトル: 戻る
- 説明: 前のページに戻ります。
- パラメーター: なし
- 読み取り専用: true
-
browser_navigate_forward
- タイトル: 進む
- 説明: 次のページに進みます。
- パラメーター: なし
- 読み取り専用: true
リソース
- **browser_take_screenshot**
- タイトル: スクリーンショットを撮る
- 説明: 現在のページのスクリーンショットを撮ります。スクリーンショットに基づいてアクションを実行することはできません。アクションにはbrowser_snapshotを使用してください。
- パラメーター:
- `raw` (boolean, optional): 圧縮せずに返すかどうか(PNG形式)。デフォルトはfalseで、JPEG画像を返します。
- `filename` (string, optional): スクリーンショットを保存するファイル名。指定されない場合、デフォルトは`page-{timestamp}.{png|jpeg}`になります。
- `element` (string, optional): 要素のスクリーンショットを撮る許可を取得するために使用される人間が読める要素の説明。指定されない場合、ビューポートのスクリーンショットが撮られます。要素が指定された場合、refも指定する必要があります。
- `ref` (string, optional): ページスナップショットからの正確なターゲット要素の参照。指定されない場合、ビューポートのスクリーンショットが撮られます。refが指定された場合、要素も指定する必要があります。
- 読み取り専用: **true**
-
browser_pdf_save
- タイトル: PDFとして保存する
- 説明: ページをPDFとして保存します。
- パラメーター:
filename (string, optional): PDFを保存するファイル名。指定されない場合、デフォルトはpage-{timestamp}.pdfになります。
- 読み取り専用: true
-
browser_network_requests
- タイトル: ネットワークリクエストをリストする
- 説明: ページを読み込んでからのすべてのネットワークリクエストを返します。
- パラメーター: なし
- 読み取り専用: true
-
browser_console_messages
- タイトル: コンソールメッセージを取得する
- 説明: すべてのコンソールメッセージを返します。
- パラメーター: なし
- 読み取り専用: true
ユーティリティ
- **browser_install**
- タイトル: 設定で指定されたブラウザをインストールする
- 説明: 設定で指定されたブラウザをインストールします。ブラウザがインストールされていないというエラーが発生した場合は、これを呼び出してください。
- パラメーター: なし
- 読み取り専用: **false**
-
browser_close
- タイトル: ブラウザを閉じる
- 説明: ページを閉じます。
- パラメーター: なし
- 読み取り専用: true
-
browser_resize
- タイトル: ブラウザウィンドウをリサイズする
- 説明: ブラウザウィンドウをリサイズします。
- パラメーター:
width (number): ブラウザウィンドウの幅
height (number): ブラウザウィンドウの高さ
- 読み取り専用: true
タブ
- **browser_tab_list**
- タイトル: タブをリストする
- 説明: ブラウザのタブをリストします。
- パラメーター: なし
- 読み取り専用: **true**
-
browser_tab_new
- タイトル: 新しいタブを開く
- 説明: 新しいタブを開きます。
- パラメーター:
url (string, optional): 新しいタブで移動するURL。指定されない場合、新しいタブは空白になります。
- 読み取り専用: true
-
browser_tab_select
- タイトル: タブを選択する
- 説明: インデックスでタブを選択します。
- パラメーター:
index (number): 選択するタブのインデックス
- 読み取り専用: true
-
browser_tab_close
- タイトル: タブを閉じる
- 説明: タブを閉じます。
- パラメーター:
index (number, optional): 閉じるタブのインデックス。指定されない場合、現在のタブが閉じられます。
- 読み取り専用: false
テスト
- **browser_generate_playwright_test**
- タイトル: Playwrightテストを生成する
- 説明: 与えられたシナリオのPlaywrightテストを生成します。
- パラメーター:
- `name` (string): テストの名前
- `description` (string): テストの説明
- `steps` (array): テストの手順
- 読み取り専用: **true**
ビジョンモード
- **browser_screen_capture**
- タイトル: スクリーンショットを撮る
- 説明: 現在のページのスクリーンショットを撮ります。
- パラメーター: なし
- 読み取り専用: **true**