ブラウザ自動化MCPを自作した話 — 制作日誌 #2
公式の Claude Chrome 拡張は便利だが、claude.ai のチャット UI に閉じている。Claude Code CLI からも、他のローカルプロセスからも、自分の Chrome を AI に触らせたい。そのために MCP を自作した経緯。
前回 はこのブログ自体の制作話を書いた。今回は、その制作の中で自作することになったブラウザ自動化 MCP サーバーの話。
MCP(Model Context Protocol)は Anthropic が公式に出している「AI に外部ツールを使わせる」ための共通プロトコル。
ブラウザ自動化については、最近 Anthropic が Claude Chrome 拡張 を出していて、これは普段使いの Chrome に直接インストールして使う。ログイン済みの状態をそのまま引き継いで操作してくれる、よく出来た製品だ。
ただ、自分の用途には合わなかった。なぜなのか、どう自作したのかを書く。
公式 Chrome 拡張がフィットしなかった理由
1. 動かせる場所が「claude.ai のチャット UI 内」に限定される
公式 Chrome 拡張は、claude.ai のチャットインターフェイスから呼び出すツール。とても便利だが、
- Claude Code CLI からは呼び出せない
- ローカルで走らせている別のスクリプト・cron ジョブ・自作エージェントからも呼び出せない
- 「AI に PC 全体を操作してもらう」ような統合的なフローに組み込めない
自分が作りたかったのは「朝のルーチンを Claude Code に丸投げする」「夜に走る自動化ジョブの一部としてブラウザ操作を含める」みたいな、バックエンド側からブラウザを動かす用途。Chrome 拡張だと、人間がチャットに入力するという「フロント側からの起動」しかない。
2. ローカルファイルとの行き来が薄い
業務自動化の現場では、**「ブラウザで何か入力 → ファイルを取り出す → ローカルで加工 → 別のブラウザに入れる」**みたいな鎖がよく出てくる。これを Chrome 拡張で完結させるのは厳しい。AI 側の「ファイルシステムを触る MCP」と「ブラウザを触る Chrome 拡張」のレイヤーが分断しているからだ。
ローカル側に閉じた MCP として両方を出した方が、AI が一連の流れとして扱える。
3. Microsoft の Playwright MCP は別物として使い分けたい
ブラウザ自動化 MCP では Microsoft 提供の Playwright MCP が事実上のスタンダードで、これも良くできている。実際このブログでも別用途で使っている。
ただ Playwright は基本的に毎回フレッシュな Chromium インスタンスを起動する前提のツール。これはこれで「テスト目的」「クロール目的」には正しいのだけど、
- 普段使いのアカウントセッションが使えない
- 拡張機能(パスワードマネージャ、検索補助、業務系ツール)が使えない
- 結果として、ログイン状態でしか操作できないサービスを触れない
要するに、用途で分かれる。
使い分けの整理
- Playwright MCP: ログイン不要なクロール、定型サイトのテスト自動化
- 自作 MCP: 普段ログインしているアカウントセッションを使いたい用途
- 公式 Chrome 拡張: claude.ai 内で手早くブラウザ作業を頼みたいとき
k-chrome の設計 — 既存プロファイルをそのまま使う
設計は最小限。普段使っている Chrome を --remote-debugging-port 付きで起動するだけ。
chrome.exe --remote-debugging-port=9222 \
--user-data-dir="C:\path\to\my-real-profile"
これで、自分の普段のブラウザが Chrome DevTools Protocol(CDP)経由で操作可能になる。MCP サーバーから localhost:9222 の WebSocket に接続して、Page.navigate Runtime.evaluate Input.dispatchMouseEvent を必要なだけ叩く。
このアプローチの何が良いかと言うと、
- 普段使っているアカウントセッションがそのまま使える(Google、各種 SaaS、業務ツール、何でも)
- 2要素認証は事前に1回だけ済ませておけば、それ以降は不要(セッションが残るため)
- 拡張機能も生きている
特殊なことはしていない。ただ、AI から「自分のブラウザ」を触れる窓口を1個開けただけ。
提供している MCP ツール
k-chrome として AI 側に公開しているのは、最小限のセット:
navigate— URL に移動get_content— テキスト or HTML 取得evaluate— 任意の JavaScript を実行して結果を返すclick— セレクタ or 座標でクリックtype_text/fill_form— 入力scroll/press_key— 補助操作screenshot— スクリーンショットset_file_input—<input type="file">にローカルファイルを投入list_tabs/new_tab/close_tab— タブ管理
「人間が普段使ってる操作の最小公倍数」をそのまま並べただけ。
特に効くのは evaluate。AI が DOM を観察したあと「この button.btn-primary をクリック」みたいに具体的なセレクタを生成してくれるので、座標クリックよりも安定して動く。ボタン位置が変わっても壊れにくい。
詰まりどころと回避策
1ヶ月運用して見えてきたコツ。
1. 同じ操作が2回続いたら Playwright 化する
ブラウザ自動化 MCP は便利だが、毎回 AI に DOM を観察させて操作させるのはトークンを食う。同じサイトで同じ手順を週次・日次で繰り返すなら、Playwright スクリプトに落とすのが正解。
その判断のために、CLAUDE.md には「繰り返す k-chrome 操作は Playwright 化(明示依頼なしでも提案)」とルールを書いてある。これにより AI 側から「これは Playwright に落としませんか?」と提案してくれる。
2. DOM 観察はトークン重い
get_content で HTML 丸ごと取ると数千トークンを消費する。大事なのは、「最初に1回観察 → セレクタを取得 → 以後は evaluate だけで完結させる」運用に倒すこと。
3. セッションの寿命
普段使いのブラウザでも、サービスによってはセッションが数日〜数週間で切れる。切れたら AI 操作の途中で「ログイン画面に飛ばされる」事態になる。これに備えて、各タスクの先頭に「現在ログイン状態か確認」のステップを入れておくと事故が減る。
学んだこと
このプロジェクトで掴んだ大事な感覚は、**「公式と自作は競合しない」**ということ。
- 公式 Chrome 拡張は claude.ai でサッと使いたいときに最強
- Playwright MCP は テスト・クロール・ヘッドレス用途に最強
- 自作 k-chrome は 既存セッションを Claude Code から扱いたい用途に必要
3つ全部入れて、用途に応じてどれを呼ぶか AI に選ばせている。
つまり公式の制約は妥協ではなく設計判断で、自分の用途と噛み合わないだけ。自作 MCP の意義は「公式が想定していない用途を埋める」ことにある。
次回予告
次回は 「Gmail 周りの自作 MCP の話」。公式や third-party 連携でも Gmail は扱えるが、「ローカルで完結させたい」「OAuth トークンを自分で握りたい」という個人開発者の要望を、自作でどう解決したか。
まとめ
- 公式 Claude Chrome 拡張は良くできているが、claude.ai の中でしか動かせない
- バックエンドや Claude Code CLI から触りたいなら、別の MCP が要る
- Playwright MCP は テスト・クロール用途 に向く
- 自作 k-chrome は 既存ログイン済みプロファイルを CDP 経由で使う仕組み
- 公式と自作は競合せず、用途で使い分けが正解
コメント (0)
まだコメントはありません。最初の一言を残しませんか?