Cloudflare Agents SDKで、addMcpServerにより接続したMCPサーバーからのelicitationを処理できるようになった。ツール呼び出し中に追加情報や利用者同意が必要な場合、form modeまたはURL modeで人間へ確認を戻せる。

何が変わったか

MCPサーバーはelicitation/createを送り、クライアント側Agentが利用者へ入力や同意を求められる。form modeは非機密の構造化データ、URL modeは第三者認証や支払いなどモデルから隔離すべき外部フローへの同意に使う。Agents SDKではconfigureElicitationHandlersで対応モードを登録し、設定したモードだけをサーバーへ広告する。

変更前後の差

従来はツール実行中に追加入力が必要になると、独自プロトコルやエラー文で会話へ戻す実装が必要だった。新機能ではMCP標準のaccept、decline、cancelとform・URLの意味を保って扱える。URL modeのacceptは外部処理完了ではなく、URLを開くことへ同意した状態に過ぎず、認証や支払い完了は後続通知やアプリ状態で別に判定する。

誰に影響するか

MCP経由で人間の追加入力、承認、OAuth、決済を伴うツールを使うAgent開発者に影響する。MCPサーバー側もクライアントが広告するモードに応じたフォールバックを実装する必要がある。セキュリティ部門はモデルが見るメッセージと、人がブラウザーで入力する秘密情報の経路を分離できているか確認する。

対応期限

導入期限はない。既存接続はハンドラーを設定しなければelicitationを広告しないため、即時の互換性破壊ではない。ただし接続先サーバーがelicitationを前提に更新されると、利用者にはツールが止まったように見える可能性がある。サーバーごとの必須能力を確認し、更新前に対応可否を記録する。

必要な対応

form modeはrequestedSchemaに基づくUIを作り、利用者が値を確認・編集できるようにする。受理値はクライアント側でも検証し、パスワード、APIキー、アクセストークン、支払い資格情報を要求しない。URL modeは送信元サーバー、理由、ホスト、完全URLを表示し、同意前にprefetchせず、モデルが閲覧できないブラウザー文脈で開く。

実装・移行手順

  1. agentsパッケージを対応版へ更新する。
  2. onStart()で必要なハンドラーだけを登録する。
  3. MCPサーバーIDと要求理由をUIへ表示する。
  4. formはスキーマ検証する。
  5. URLはHTTPS、ホスト、完全URL、同意を確認する。
  6. accept、decline、cancel、タイムアウトを状態管理する。
  7. 休止復帰後の再装着を試験する。

失敗しやすい点

form modeで非表示入力欄なら安全と考え、パスワードやトークンを収集するのは誤りである。値はMCP応答として戻るため、秘密はURL modeの外部フローへ分離する。URLを自動で開く、短縮URLだけを表示する、acceptを支払い完了と解釈する、declineとcancelを同じ扱いにすることも避ける。

リスク

悪意あるMCPサーバーが認証画面を装うURLを提示する、過剰な個人情報をformで要求する、繰り返し同意を求めて利用者を疲弊させるリスクがある。サーバー許可リスト、要求回数制限、ホスト表示、監査記録が必要である。休止復帰や遅延で同じ要求を重複処理すると二重承認につながるため、elicitationIdで冪等性を持たせる。

評価方法

スキーマ不一致、未知フィールド、長い文字列、HTTP URL、別ホスト、リダイレクト、利用者拒否、画面閉鎖、タイムアウトをテストする。秘密値がモデルメッセージ、ツール結果、ログ、トレースへ出ないことを確認する。休止復帰後に広告モードとハンドラーが一致し、処理中要求が失われないことも評価する。

ロールバック

問題があれば該当モードのハンドラーを外し、MCP接続がelicitation能力を広告しない状態へ戻す。サーバー側は能力がないクライアント向けのエラーや別手順を返す。認証・決済は従来の明示リンクや管理画面から実行できる経路を残し、進行中要求はcancelとして終了する。

編集部の見解

elicitationはMCPツールを完全自動から必要な場面で人へ戻す構造へ変える。安全性は確認ダイアログの有無ではなく、非機密入力と秘密入力を技術的に分離できるかで決まる。URL modeを単なるリンク表示にせず、モデルから隔離された同意経路として実装し、acceptと外部完了を混同しないことが重要だ。

実務チェックリスト

  • 必要なモードだけを広告する
  • formで秘密情報を要求しない
  • requestedSchemaを検証する
  • 送信元、理由、ホスト、完全URLを表示する
  • 同意前にURLをprefetchしない
  • accept、decline、cancelを別記録する
  • 重複要求と休止復帰を試験する
  • ハンドラー無効化を用意する

一次情報