webmcp について
webmcp は、エージェントがページ機能を呼び出せるよう、ブラウザー Web アプリに WebMCP ツールを統合する手順を案内するスキルです。命令型・宣言型の登録、安全な操作、検証を扱い、安全なブラウザーウィンドウ内での実行を前提とします。
主な機能
- 01ブラウザーアプリの統合箇所を特定
- 02命令型または宣言型 API の選択
- 03WebMCP ツールの登録と管理
- 04キャンセル、検証、エラーへの対応
- 05ユーザー確認と認可フローの維持
- 06ツールのライフサイクルと呼び出しのテスト
活用シーン
- 01既存の JavaScript 機能をツールとして登録
- 02HTML フォームの操作をエージェントに公開
- 03ルートやページ状態に応じたツール管理
- 04ツール登録や実行の問題を調査
MCP 対応
ブラウザー側で WebMCP ツールを登録・実行し、エージェントが Web アプリの機能を呼び出すための手順を案内します。命令型・宣言型 API の選択や、ツールの説明とパラメーター定義を扱います。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ webmaxru/ web-ai-agent-skills --skill webmcpインストール後、Claude Code で/webmcpを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/model-context-registry.template.tsreferences/compatibility.mddeclarative-api.mdtroubleshooting.mdwebmcp-reference.mdscripts/find-webmcp-targets.mjs詳細
WebMCP
手順
ステップ 1:ブラウザーとの統合箇所を特定する
- ワークスペースを調べて、ブラウザーのエントリーポイント、UI ハンドラー、および既存のアプリ状態管理やフォーム処理のレイヤーを確認します。
- Node ランタイムを利用できる場合は、
node scripts/find-webmcp-targets.mjs .を実行して、フロントエンドと思われるファイルと既存の WebMCP マーカーを一覧表示します。 - Node ランタイムを利用できない場合は、最も近い
package.json、HTML エントリーポイント、およびフレームワークのブートストラップファイルを手動で調べて、ブラウザーアプリの境界を特定します。 - ワークスペースに複数のフロントエンドアプリがある場合は、アクティブなルート、コンポーネント、またはユーザーが指定した機能の領域を含むアプリを優先します。
- 一覧を確認しても有力なフロントエンドの候補が複数残る場合は、作業を中断し、どのアプリに WebMCP を統合するかユーザーに尋ねます。
- プロジェクトがブラウザー向け Web アプリでない場合は、作業を中断し、このスキルが適用されないことを説明します。
ステップ 2:WebMCP の形式を選択する
- コードを書く前に、
references/webmcp-reference.mdを読みます。 - 機能を HTML フォームのフローとして表現できる場合、またはエージェントが呼び出す送信処理が必要な場合は、
references/declarative-api.mdを読みます。 - ネイティブ機能の利用可否、Chrome のプレビュー設定、またはドラフト版とプレビュー版の挙動が重要な場合は、
references/compatibility.mdを読みます。 - 登録、スキーマのシリアル化、またはエージェント主導のフォーム実行に失敗した場合は、
references/troubleshooting.mdを読みます。 - 統合がセキュアなウィンドウのブラウジングコンテキストで実行されることを確認します。
- 機能をサーバー、ワーカー、または表示可能なブラウジングコンテキストのないヘッドレス環境で実行する必要がある場合は、作業を中断し、プラットフォーム上の制約を説明します。
- 既存の JavaScript ロジックをツールでラップする場合、動的な登録が必要な場合、または実行のキャンセルに対応する必要がある場合は、命令型 API を選択します。
- ユーザーフローをフォーム送信にそのまま対応させられ、エージェントの操作中もページ上の人間向けフォームを同期できる場合は、宣言型 API を選択します。
- ツール名、説明、パラメーターは具体的かつ肯定的な表現にし、相互に重複するバリエーションより、単一機能に絞ったツールを優先します。 ステップ 3:ツールの登録を実装する
- 命令型 API を使用する場合は、
assets/model-context-registry.template.tsを読み、ワークスペースのフレームワーク、状態モデル、ファイル構成に合わせて調整します。 - 特徴検出パターン
const modelContext = document.modelContext || navigator.modelContext;を使ってモデルコンテキストを解決し、その存在を確認してから後続の登録を行います。document.modelContext(現在のサーフェス)を優先し、navigator.modelContextは Chrome 146~149 の旧ビルド向けのフォールバックとしてのみ残します。 - 命令型ツールは、安定した
name(ASCII の英数字、_、-、.のいずれかからなる 1~128 文字)、肯定的なdescription、オブジェクト形式のinputSchema、およびexecuteコールバックを使い、try/catch内でmodelContext.registerTool()をawaitして登録します。Chrome 151 以降では、この呼び出しはフレームツリー全体でツールが利用可能になると解決するPromise<void>を返します。awaitを使用すれば、同期的に登録していた旧ビルドでも同じコードを利用できます。 - 状態を変更しないツールに限り、
annotations.readOnlyHintをtrueに設定します。 - Chrome
154.0.8017.0以降では、旅行の予約、資金の送金、購入、データの削除など、重大な結果を伴う、取り消し不能な、または現実世界での操作を行うツールにannotations.consequentialHintをtrueに設定します。これにより、エージェントは実行前にユーザーの明示的な確認を求めるようになります。 - Chrome
156.0.8067.0以降では、Chrome DevTools の AI 支援など、検査、診断、テストフレームワーク、開発者向けツールを特に目的とするツールに限り、annotations.debuggingをtrueに設定します。これにより、汎用エージェントやエンドユーザー向けエージェントが開発者向けツールを識別し、除外できるようになります。 - ツールの出力に信頼できないソースのデータが含まれる可能性がある場合は、
annotations.untrustedContentHintをtrueに設定します。 - スキーマが厳密であっても、ツールの実装内でビジネスルールを検証し、エージェントが入力を修正して再試行できるよう、内容の分かるエラーを返します。
- UI とアプリケーションの状態にツールの効果が反映されてから、ツールの結果を返します。
- Chrome 153 以降では、常に存在する
{ signal }をexecuteの第 2 引数として受け取り、fetch()など、キャンセル可能な処理に渡します。この実行シグナルは登録シグナルとは別に扱います。 - ツールの利用可否がルート、選択状態、またはページの状態に依存する場合は、有効な間だけツールを登録し、
registerTool()に渡したシグナルを持つAbortControllerを中断して、古くなったツールの登録を解除します。Chrome 148 への移行期間中は、中断する前にオプショナルチェーンを使ってmodelContext.unregisterTool?.()も呼び出します。 - 宣言型ツールでは、対象の
<form>にtoolnameとtooldescriptionを指定し、フォームコントロールでパラメーターの範囲を定義します。 - 宣言型フィールドのパラメーターを明確に説明するには、ラベルまたは
toolparamdescriptionを使用します。 - エージェントがフォームに入力した後、ページを自動的に送信する必要がある場合に限り、
toolautosubmitを使用します。 ステップ 4:エージェント主導の UX を安全に組み込む - ページがエージェントによる呼び出しに対応していても、通常の人間による操作経路を維持します。
- ツールで明示的な確認やユーザー向けのステップが必要な場合は、アプリケーションの可視 UI と既存の認可チェックを経由させます。現在の
execute(input, { signal })コントラクトでは、クライアントコールバックを利用できません。 - 宣言型の送信処理をカスタマイズする場合は、
respondWith()の前にpreventDefault()を呼び出し、エージェントから呼び出された送信に対して構造化された検証エラーを返します。 toolactivated、toolcancel、agentInvokedなどのプレビュー専用イベントや WebMCP フォームの疑似クラスは、互換性を考慮した UI ロジックの中でのみ使用します。toolactivatedとtoolcancelについては、references/declarative-api.mdを読み、古いビルド向けにwindowにフォールバックする前に、document.modelContext上のon*プロパティを機能検出します。annotations.consequentialHintがtrueの場合でも、破壊的な操作や機密性の高い操作には、可視のユーザー確認と既存の認可チェックを必ず適用します。このアノテーションはエージェントに情報を伝えるものであり、アプリケーションのセキュリティを強制するものではありません。- UI の状態を同期し、人間の入力とツール呼び出しのどちらによって変更が生じた場合も、同じページに正確に反映されるようにします。
ステップ 5:動作を検証する
- 重複名の防止と、ルートや状態の変更時のクリーンアップを含め、登録と登録解除のライフサイクルをテストします。
- 無効または不完全な入力をテストし、ツールが暗黙に失敗するのではなく、修正を促すエラーを返すことを確認します。
- 宣言型ツールでは、生成されたパラメーターの説明、必須フィールド、送信動作、およびカスタムの
respondWith()処理を検証します。 - 対象環境が現在の Chrome プレビューである場合は、実行時の失敗をアプリケーションのバグと判断する前に、
references/compatibility.mdで必要なバージョンとフラグの状態を確認します。 executeTool()に渡されたシグナルを中断して実行のキャンセルをテストし、ツールの登録解除に頼らず、長時間実行される処理が停止することを確認します。- Model Context Tool Inspector または同等のプレビュー用ツールは、検証の補助としてのみ使用し、実行時の依存関係にはしないでください。
- まず、登録済みツールの一覧を調べ、プレビュー用ツールが利用できる場合は代表的な引数でツールを手動実行して、決定論的な実行を検証します。
- 決定論的な実行が正しいことを確認した後、説明とパラメーターの形式がエージェントを適切なツールへ誘導することを検証し、自然言語によるルーティングを確認します。
- 影響の大きい操作、取り消せない操作、または現実世界に作用する命令的なツールでは、
annotations.consequentialHint: trueが宣言されていることを確認します。また、アプリケーションの確認および認可フローが引き続き適用されることも確認します。 - 検査、診断、テスト、または開発者向けツール専用のツールでは、
annotations.debugging: trueが宣言されていることを確認します。ユーザー向けのツールでは、この設定を未指定またはfalseにします。 - 編集後に、ワークスペースのビルド、型チェック、またはテストを実行します。
エラー処理
document.modelContextとnavigator.modelContextの両方が存在しない場合は、安全なブラウザーウィンドウのコンテキストでコードが実行されていることを確認し、references/compatibility.mdのプレビュー要件を確認してください。navigator.modelContextだけが存在する場合は、ページが古い Chrome 146–149 のプレビュービルドで実行されています。document.modelContext || navigator.modelContextのフォールバックは維持しつつ、非推奨期間が終了したらnavigator.modelContextを削除する計画を立ててください。registerTool()はtry/catchの中でawaitしてください。Chrome151.0.7922.0以降では、失敗時にリジェクトされるPromise<void>を返します。それ以前のビルドでは同期的に返され、例外がスローされていました。同じawaitとtry/catchで両方を捕捉できるため、以下のエラーチェックは、失敗が同期的な例外として発生する場合と、Promise のリジェクションとして発生する場合のどちらにも適用されます。registerTool()がInvalidStateErrorをスローする場合は、名前の重複、空のnameまたはdescriptionの値、128 文字を超えるツール名、または使用できない文字を含むツール名がないか確認してください(使用できるのは ASCII の英数字、_、-、.のみです)。registerTool()がNotAllowedErrorをスローする場合は、toolsPermissions Policy の機能が拒否されていないか確認してください。クロスオリジンの iframe では、埋め込み元のドキュメントにallow="tools"が必要です。registerTool()がTypeErrorまたは JSON シリアル化エラーをスローする場合は、シリアル化できない値や循環参照を含むinputSchemaを、プレーンな JSON 互換オブジェクトに置き換えてください。- 古いデモや記事で
provideContext、clearContext、toolparamtitleに言及している場合は、これらのインターフェースは現在の実装では廃止されているものとして扱ってください。 - 宣言型の実行でページが正しく更新されない場合は、ツールの契約を変更する前に
references/declarative-api.mdとreferences/troubleshooting.mdを確認してください。
コメント
Markdown 対応