questions permissions mcp interaction_ja - kkamegawa/vsextensionforcodex GitHub Wiki

質問・権限・MCP 対話 — Issue #154

English

追跡: 親 #154(#149 の子)です。子 issue: Issue #165: 契約と要求ライフサイクル、Issue #166: 質問カードと権限範囲、Issue #167: MCP elicitation と認証回復、Issue #168: Gateway OAuth と統合検証。

背景と決定

現行拡張は Worker 契約 v19 を使用します。v19 から開始し、実装の merge 時点で次に利用可能な version(途中変更がなければ v20)を割り当てます。CLI 0.159.1 を対象、0.155.1 を回帰比較とし、CLI/SDK/runtime/package の version は維持します。

  • 安全な分離入力経路がないため、secret 要求は UI 投影前に理由を示して拒否します。
  • CLI 0.159.1 の本人確認 provider は macOS のみ対応し、この拡張 client は上流の対象外です。成功経路を延期し、要求を拒否して capability を宣言しません。
  • Gateway OAuth は read 起動ゲート後のローカル stdio だけで扱います。Remote は状態/案内の読み取りだけです。
  • MCP の UI 取消はサーバー認証の取消を意味しません。失敗したツール呼び出しを自動再送しません。
  • 添付 metadata の上限付き復旧は Issue #153、添付操作と表示は Issue #155 が担当し、Phase 5 は添付動作を追加しません。

契約とライフサイクル

質問、権限、コマンド承認、MCP elicitation、Gateway OAuth、未対応本人確認を型付き要求/応答で扱います。要求種別、owner、接続世代、元の JSON-RPC ID を共通レジストリに保持し、turn ID のない MCP 要求も管理します。回答を検証後、完了権を原子的に取得します。回答、キャンセル、timeout、切断、resolved、二重操作、旧世代の競合でも応答は最大1回です。古い/解決済み要求には答えず、配送結果不明の応答は再送しません。

質問と権限 UI

通常 composer と独立した複数の質問カードを表示します。blocking/non-blocking、自由入力、「その他」を扱います。明示 Submit を必須とし、選択、既定値、focus は表示状態に限ります。表示文を安全化し、選択 ID は Worker 内で元値に対応付けます。

要求された権限の部分集合だけを返します。既定は turn scope、session 保存は明示操作です。要求外権限を拒否します。コマンド承認の全選択肢と追加権限を表示し、ルール変更は独立した選択肢として保ち、破壊的操作には既存の承認ポリシーを適用します。

MCP form と認証回復

string、number、integer、boolean、単一/複数選択の form field を扱います。required/型/長さ/範囲/形式/選択数を UI と Worker で検証します。未対応拡張 schema は理由付きで拒否し、拡張フォーム capability を宣言しません。URL を Worker で検証し、明示操作だけでブラウザーを開きます。

mcpServer/oauth/login、mcpServer/oauthLogin/completed、起動状態通知を連携します。期限切れ、失効、reauthenticationRequired は案内を表示して古い elicitation を終了します。再認証後は新たな明示的ツール呼び出しを要求し、失敗した呼び出しを自動再試行しません。

Gateway OAuth と本人確認

ローカル stdio の各接続で explicitGatewayOauth を宣言し、initialize 後、認証が必要な RPC の前に account/gatewayOAuth/read を成功させます。その後 login/cancel/changed 通知と明示的なブラウザー起動を扱います。通知を接続と owner に結び付け、login 待ちで他 RPC を止めません。未対応または read 失敗時は認証 RPC を止め、自動ブラウザー認証へ切り替えません。

Remote profile は状態とサインイン案内だけを表示し、capability 宣言や login/cancel 呼び出しをしません。

ネイティブ本人確認は宣言・転送しません。要求を理由付きで拒否し、challenge/proof/credential を UI、会話、ログ、設定、診断、例外に露出させません。

検証と完了条件

複数カードと composer 独立性、明示 Submit、投影前の秘密要求拒否、一回答競合、権限部分集合と範囲、コマンド選択肢、対応/未対応 MCP form、ブラウザー/再認証結果、自動再送ゼロ、Gateway 起動順序/通知/cancel/再接続、Remote 読み取り専用、本人確認拒否と非開示を検証します。

Fake App Server と固定 0.159.1 契約、Core/UI 全テスト、警告ゼロ Debug/Release build、VSIX と埋め込み XAML を検査します。Experimental Instance で Light/Dark/High Contrast、狭い幅、キーボード/screen reader、複数質問カード、認証状態を確認します。スクリーンショットと結果を記録し、取得できない場合は未完了のままとします。

⚠️ **GitHub.com Fallback** ⚠️