TabbitBlog

OpenCodeでPlaywright MCPを設定する

ツールを登録し、引数の不一致とブラウザの起動失敗を切り分けます。

この記事の内容
  1. ローカルサーバーを登録する
  2. 読み取りだけのナビゲーションを試す
  3. 2つのモデルが送ったツール呼び出し
  4. 最初に失敗する箇所を探す

OpenCodeでは、プロジェクトにローカルサーバーを登録してPlaywright MCPを使えます。まず公開ページを読み取るだけのタスクで、ツール結果に見出しが出るか確認します。connectedはMCP接続が成立したことを示します。その後、モデルが正しい引数でツールを呼び、Playwrightがブラウザを起動してページを開きます。

OpenCode 1.18.16とPlaywright MCP 0.0.84で検証しました。ここでは 1.x の形式を使います。OpenCode V2のドキュメントでは、サーバー名は mcp.servers の下に入ります。設定をコピーする前に opencode --version を確認してください。

ローカルサーバーを登録する

プロジェクトのルートで opencode.json を作成するか編集します。mcp がある場合は、その中に playwright を追加し、ほかの設定を残します。コマンド配列、有効化、タイムアウトはOpenCode 1.xのMCPガイドに記載されています。

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "playwright": {
      "type": "local",
      "command": [
        "npx", "-y", "@playwright/mcp@0.0.84",
        "--browser", "firefox", "--headless", "--isolated"
      ],
      "enabled": true,
      "timeout": 45000
    }
  }
}

MCPサーバーが使うPlaywrightに対応したFirefoxを用意します。検証に使ったnpmパッケージのPlaywrightは 1.65.0-alpha-2026-10-30 です。

npx -y --package playwright@1.65.0-alpha-2026-10-30 playwright install firefox
opencode mcp list

別のキャッシュにインストールした場合は、MCPプロセスからも見えるようにします。検証では対応する実行ファイルを明示しました。更新時はパッケージとブラウザのリビジョンをそろえます。名前が同じ実行ファイルでも、以前の版とはプロトコルが異なる場合があります。

プロジェクトのルートで opencode mcp list を実行し、新しいセッションでツールを確認します。OpenCodeは複数の設定を統合します。切り分けには空のプロジェクトと別の設定・データディレクトリを使うと、既存の設定の影響を減らせます。優先順は設定リファレンスを参照してください。

読み取りだけのナビゲーションを試す

Seleniumの公開フォームはアカウントが不要で、見出しを目視で確認できます。

playwright_browser_navigateで次のURLだけを開いてください。
{"url":"https://www.selenium.dev/selenium/web/web-form.html"}
引数はurlの1つで、値は文字列のURLです。
ツール結果に表示された見出しを返してください。
クリック、入力、送信やほかのツールの呼び出しはしないでください。

トレースではツール名、引数オブジェクト、返った見出しを確認します。テストしたOpenCode 1.xでは playwright_browser_navigate と表示されました。独立したMCPクライアントにはサーバーの browser_navigate が見えます。アクセシビリティのスナップショットとブラウザオプションはMicrosoftのPlaywright MCPを参照できます。

モデル比較ではURL、指示、サーバー、ブラウザを固定します。現在のプロバイダーで構造化ツール呼び出しに対応するモデルを選んでください。テストではOpenAI互換プロバイダーの設定でローカルのOllamaに接続しました。外部のモデルアカウントは使っていません。最終回答が空でも、終了コードが0でも、ツールのイベントを確認します。

2つのモデルが送ったツール呼び出し

最初はキャッシュにあった古いFirefoxを指定しました。両モデルが正しいURLを送っても移動に失敗し、独立したMCPクライアントも同じ有効な入力でFirefoxのプロトコルエラーを返しました。対応するFirefox 158(リビジョン1569)に替えると、独立クライアントは Web form を読み取れました。この環境で url に数値を入れると、入力の検証エラーになりました。

対応するFirefoxでセッションを新しくし、両モデルに同じ明示的なJSONを与えました。ツールの結果とモデルの最終出力を分けて確認しました。

ローカルモデルナビゲーションの引数ツール結果最終出力
qwen3:0.6b正確な文字列のURLWeb form見出しの記載なし
qwen3.5:0.8b正確な文字列のURLWeb form見出しを含むテキストイベントなし

2つ目のモデルは1回の指示に対して追加で2回スナップショットを取りました。対応版で先に自然文の指示を試したときは、どちらもURLを正確に再現しませんでした。表の試行ではJSONを明示すると両方が移動できました。小規模なローカルテストです。独立クライアントでは25個のツールを確認し、browser_navigate.url が文字列であることを確かめ、ブラウザを閉じました。フォームは送信していません。

OpenCodeで2つのモデルを試した結果と独立したMCPプロトコルの確認

最初に失敗する箇所を探す

症状最初に調べる箇所次の確認
opencode mcp list にないか、接続失敗設定とMCPプロセスバージョン、作業ディレクトリ、コマンド、実行ファイル、タイムアウト
接続済みでモデルがテキストだけ返すモデル、プロバイダー、使用可能なツール一覧を見て、別の対応モデルで同じ呼び出しを1回試す
引数のキーや型が違う入力スキーマtools/list と実際の引数を照合する
引数は正しいが独立クライアントでも失敗起動、プロトコル、ネットワーク対応するブラウザで同じURLを再試行する
ツール結果には見出しがあるが、回答にはないモデルの結果読み取りツール結果を確認し、見出しだけを再度求める

引数に関する利用者報告では、ファイルシステムのサーバーが path を期待するのに filePath を受け取りました。OpenCodeのブラウザに関する投稿では不安定な動作が報告されていますが、設定の差は検証されていません。自分のセッションでツール名、引数、結果を見てから原因を切り分けます。

この例は新しいコンテキストを使います。ログイン済みのタブが必要なら既存ブラウザへの接続を参照してください。関連する手順はPlaywrightのブラウザ自動化、Claude CodeでのPlaywright MCP、CodexでのPlaywright MCP、オープンソースのコーディングエージェントにあります。タブを開くべきか迷う場合は、ウェブ検索とブラウザ操作とブラウザエージェントの仕組みも参照できます。Tabbitをダウンロードして同じ公開ページの読み取りを別の接続と比べることもできます。

よくある質問

OpenCodeでPlaywright MCPを使えますか?

はい。1.xではopencode.jsonのmcpにローカルサーバーを追加し、プロジェクトでopencode mcp listを実行します。V2は別のスキーマを使います。

モデルを替えてもブラウザツールを使えますか?

MCP設定はそのままにできます。小さな同一タスクで両方のモデルを試し、正しい引数で呼び出せるか、結果を読めるか確認します。

connectedなのに移動が失敗するのはなぜですか?

MCPの接続はブラウザ起動前にも成立します。ツール結果で起動、実行ファイル、プロトコル、ネットワークのエラーを確認します。

browser_navigateには何を渡しますか?

検証したバージョンではurlは文字列です。tools/listで確認し、クライアントに表示された正確なツール名を使います。

開いているタブに接続しますか?

例では隔離したコンテキストを起動します。開いているタブやログイン状態が必要なら、別の接続を設定します。

次のステップへ

Tabbit と一緒に仕事をしましょう。

タブをまたいで調査し、繰り返しのブラウザ作業を自動化し、あらゆる文脈を手の届くところに。