Chromeで動かす、WebMCP最小実装。

読み取り専用の検索ツールを登録し、通常UIと同じ処理を使って結果を返すところまで進めます。

このサイトのトップで実際に使っています

search_guidesはWebMCP対応環境ならツールとして登録され、未対応環境では通常UIとして動きます。

要点まとめ

このガイドでやることは、次の3つです。

  • Chromeの試験的な設定で、WebMCPツールを登録できる状態にします。
  • document.modelContext.registerTool()で、検索ツールを登録します。
  • 通常の検索フォームと処理を共有し、未対応のブラウザでも動くようにします。

1. 準備する

Chrome公式ドキュメントで、対象バージョンと検証方法を確認します。ローカル検証用フラグは試験的な機能です。業務で使うChromeプロファイルと分けると安全です。

  1. 検証用Chromeを用意する
  2. chrome://flags/#enable-webmcp-testingを確認する
  3. DevToolsのWebMCP表示で登録結果を確認する

2. ツールを登録する

ツール名は短く動詞から始め、説明には「何をするか」「いつ使うか」「何が変わるか」を書きます。AIから渡される値は、種類(文字列か数値か)だけでなく、長さや許容できる値の範囲も検証します。

JavaScriptImperative API
const controller = new AbortController();

await document.modelContext.registerTool(
  {
    name: "search_guides",
    title: "WebMCPガイドを検索",
    description:
      "公開済みの日本語ガイドを検索する。変更や送信は行わない。",
    inputSchema: {
      type: "object",
      properties: {
        query: {
          type: "string",
          description: "検索するトピック"
        }
      },
      required: ["query"],
      additionalProperties: false
    },
    annotations: {
      readOnlyHint: true,
      untrustedContentHint: false
    },
    execute: async ({ query }) => {
      if (typeof query !== "string" || query.length > 80) {
        throw new Error("queryは80文字以内で指定してください");
      }

      const results = await searchGuides(query);
      renderSearchResults(results);
      return { count: results.length, results };
    }
  },
  { signal: controller.signal }
);

通常UIと処理を共有する

searchGuides()を検索フォームとWebMCPの両方から呼びます。WebMCPだけが特別なデータへアクセスする構成を避けると、結果の不一致とセキュリティ差を減らせます。

不要になったら登録解除する

controller.abort();

画面遷移や権限変更で使えなくなったツールは、速やかに登録解除します。

3. 検証する

  • 正しい依頼でツールが選ばれる
  • 空文字、長すぎる文字列、不正な型を拒否する
  • 画面と返り値が一致する
  • 未対応ブラウザでも通常UIが動く
  • 登録解除後はツールが利用できない

4. 本番化する前に

機密情報をSchemaや返り値に含めない

認証済み画面でも、ツールに必要な最小限の情報だけを渡します。監査ログ内の個人情報もマスキングします。

まず検索や候補取得などの読み取りから始めます。送信や予約確定へ広げる場合は、同じ処理が二重に実行されない工夫(冪等性)、不正な送信を防ぐ対策(CSRF対策)、権限の確認、人間による最終確認を個別に設計してください。

関連ガイド

安全なツール設計の基本

副作用のある操作を公開する前の判断基準を確認します。

安全設計へ