MCPクライアントにAPIキーを通さない — URL mode elicitationに学ぶ秘密情報の境界設計

AIエージェントが外部サービスを使うとき、APIキーや決済情報をチャット欄に入力させる設計は危険です。MCP(Model Context Protocol)の2025-11-25仕様は、この問題に対して「秘密情報をクライアントへ通さない」という明確な境界を示しました。新しいURL mode elicitationから、便利さと安全性を両立する設計を考えます。

Elicitationは「途中で人に聞く」仕組み

MCPのelicitationは、MCPサーバーが処理の途中でクライアントを介し、ユーザーへ追加情報や操作を求める仕組みです。2025-11-25仕様では、用途を2つのモードに分けています。

  • Form mode:名前、メールアドレス、選択肢などを、MCPクライアント内のフォームで受け取る
  • URL mode:認証、APIキー登録、決済などを、外部の安全なWebページで行う

重要なのは、単なるUIの違いではないことです。Form modeの入力内容はクライアントを通ります。一方、URL modeでは、URL以外の入力データをクライアントへ渡しません。つまり、情報の機密度に応じて経路そのものを分けています。

秘密情報をチャット経路から外す

MCP仕様は、Form modeでパスワード、APIキー、アクセストークン、決済認証情報を要求してはならず、こうした操作にはURL modeを使うよう定めています。

たとえば、AIエージェントがクラウドストレージへ接続するとします。安全な流れは次のようになります。

  1. MCPサーバーが「接続には認証が必要」とクライアントへ通知する
  2. クライアントが接続先ドメインと理由をユーザーに表示する
  3. ユーザーが同意して、ブラウザで公式の認証ページを開く
  4. 認証情報はブラウザからサービス側へ直接送る
  5. 完了後、MCPサーバーがクライアントへ完了通知を返す

この構成なら、秘密情報はLLMのコンテキスト、MCPクライアント、中間サーバーを通過しません。「AIに秘密を守らせる」のではなく、「AIが秘密を見られない経路にする」発想です。

「同意」と「完了」を分ける

URL modeでクライアントが返す action: "accept" は、ユーザーがURLを開くことに同意した、という意味です。認証や決済が完了したことまでは保証しません。

外部ページでの操作完了は、任意の notifications/elicitation/complete で通知できます。ただし仕様は、通知が届かない場合に備えて手動の再試行・キャンセル手段も用意することを推奨しています。

ここには実運用で重要な示唆があります。

  • 同意済み:外部ページを開くことを許可した
  • 処理中:ブラウザ側で操作している
  • 完了:サーバーが結果を確認した
  • 不明:通知が途切れ、状態を確定できない

この4状態を分けず、「同意=成功」と扱うと、未完了の処理を成功扱いする不具合につながります。車載開発でいえば、スイッチ入力とアクチュエーター作動完了を同じ信号にしないのと同じです。

実装で押さえる4つの境界

1. データ境界

通常情報はForm mode、秘密情報はURL modeへ分けます。判断基準は「漏れたらアクセス権や取引権限を与えるか」です。該当するならチャット経路へ載せません。

2. 表示境界

クライアントは、どのサーバーが要求しているか、どのドメインを開くか、なぜ必要かを明示します。URLを自動で開くのではなく、ユーザーの同意を挟むことがフィッシング対策になります。

3. 状態境界

各要求には一意の elicitationId を持たせます。完了通知は、要求を開始したクライアントだけへ返し、未知または完了済みのIDは無視します。サーバー側の状態はセッションIDだけに結び付けず、認証済みユーザーの識別情報と安全に関連付ける必要があります。

4. 復旧境界

ブラウザを閉じた、ネットワークが切れた、通知が届かなかった、といった失敗を前提にします。自動再試行だけに頼らず、「もう一度開く」「状態を確認する」「キャンセルする」を用意すると、途中状態から安全に復旧できます。

考察:AIの安全性はモデルの外で作る

秘密情報をプロンプトへ入れた後で、ログに残さない、学習に使わない、画面に再表示しない、と制御を積み重ねる方法もあります。しかし、経路に入った情報は、監視、デバッグ、トレース、プラグイン連携など多くの場所へ波及します。

URL mode elicitationの価値は、モデルを賢くして漏えいを防ぐことではありません。最初から秘密情報をAI経路へ入れず、認証や決済を専用の信頼境界に戻すことです。

PL視点では、これは責任分担の明確化でもあります。AIは「必要な操作を案内する」、クライアントは「接続先と同意を管理する」、サービス側は「秘密情報を受け取り保管する」。役割を分けるほど、異常時にどこを止め、どこを監査すべきかが見えやすくなります。

まとめ

  • MCPのelicitationはForm modeとURL modeを用途別に分けます
  • パスワード、APIキー、トークン、決済情報はForm modeで要求しません
  • URL modeは秘密情報をLLMやMCPクライアントへ通さない設計です
  • URLを開く同意と、外部操作の完了は別状態として扱います
  • 安全性は「AIに見せて守らせる」より「AIに見せない経路」で高められます

公式ソース