MCP のセキュリティと認可
MCP は、機能がどのように記述され、呼び出されるかを標準化します。どの機能をエージェントが受け取るべきか、またはユーザーがどの副作用を承認したかは決定しません。
4 つの分離された判断
- 接続認証 — このクライアントはこのサーバーに接続してよいか?
- 機能の可視性 — モデルはどのツールとリソースを見てよいか?
- 実行認可 — この ID は今、このリソースに対してこの特定のアクションを実行してよいか?
- 人間の承認 — 影響の大きいアクションについて、正確な入力と効果を人が確認する必要があるか?
これらの判断を、autoApprove の設定リストにまとめてしまわないでください。
ローカル stdio サーバー
ローカルの子プロセスは、アプリケーションホスト内で強力な立場を継承します。
- 絶対パスで、レビュー済みの実行可能ファイルパスを使用する。
- パッケージとバイナリのバージョンを固定し、
latestタグは避ける。 - 必要な環境変数だけを渡す。
- コマンドライン引数に秘密情報を入れない。
- ファイルシステムのルートと作業ディレクトリを制限する。
- サーバーが信頼できない入力を処理する場合は、OS のサンドボックスプロファイルを適用する。
- サーバーの説明、リソース、結果は信頼できないコンテンツとして扱う。
JSON 読み込みと実行時の add/update パスは、サーバー ID を検証します。
McpServerManager は、設定されたコマンドをサンドボックス化しません。
リモートの Streamable HTTP
McpHttpClientBuilder では次を適用できます。
- bearer token;
- 呼び出し側が選択した API-key ヘッダー;
- 任意のレビュー済みヘッダー;
- 固定の OAuth 2.0 クライアント認証情報によるトークン取得;
- リクエストのタイムアウト; そして
- 期限切れセッション応答の後に 1 回だけ行う、境界付きのセッション再初期化。
OAuth2Config は完全な MCP 認可フローではありません。保護リソースのメタデータ探索、認可サーバー探索、ブラウザー認可、PKCE、または resource-indicator のネゴシエーションは行いません。デプロイメントでそのフローが必要な場合は、rmcp の認可 APIs または ID コンポーネントを使用してください。
遅い認可サーバーや到達不能な認可サーバーが接続セットアップを停止させないよう、トークン要求を境界付けてください。また、クライアントはクライアントシークレットを決してそのまま返さないことに注意してください — トークンエンドポイントのエラー本文は、ログに届く前にマスクされます:
use adk_tool::mcp::OAuth2Config;
use std::time::Duration;
let auth = OAuth2Config::new(client_id, token_url)
.with_secret(client_secret)
.with_scopes(vec!["mcp.read".into(), "mcp.invoke".into()])
.with_timeout(Duration::from_secs(10)); // token request timeout
デフォルトのトークン要求タイムアウトは 30 秒です。
ツールの公開と実行
with_tools または with_filter を使用して、不要な機能がモデルリクエストに入らないようにします。その後、実行時に ADK-Rust のツール認可と確認を適用します。
影響の大きいツールについては、次のことを行います。
- 最終的に解決された引数を人に示す;
- 一度だけ許可と永続的なポリシーを区別する;
- 承認を正確な function-call ID に結び付けたままにする;
- 可能な場合は外部書き込みを冪等にする;
- 承認判断とツール結果をまとめて保存する; そして
- 返された証拠を確認せずに、成功したプロトコル応答を成功したビジネス結果の証拠とみなさない。
プロンプトの聞き取り
聞き取りは、より多くの情報を求めるサーバーからの要求であり、アプリケーションが従うべき指示ではありません。メッセージ、URL、要求されたフィールド、メタデータを確認してください。未対応または予期しない要求は拒否してください。受け入れたすべてのフォーム値は、使用前に検証してください。
ログと秘密情報
環境変数、認可ヘッダー、API キー、聞き取りへの回答、機密性の高いツール引数はマスクしてください。代わりに、サーバー ID、ツール名、タスク ID、ステータス、タイミング、承認、および境界付きの結果要約を記録してください。