MCPサーバーを安全に運用する方法は、導入時の審査だけに頼らず、資産、権限、変更、監視、事故対応を継続して管理することです。ツール、データ、資格情報、SDK、接続先は稼働後も変わります。本稿では、接続試験を終えたサーバーの日常監視、アクセス棚卸し、更新、停止と復旧を一つの運用体系へまとめます。
守る対象をサーバープロセスだけに限定しない
MCP運用で管理する資産は、実行ファイルだけではありません。サーバーが公開するTools、Resources、Prompts、実行ユーザー、資格情報、データソース、外部通信先、接続クライアント、ログ保存先、SDKと依存パッケージを一組として扱います。どれか一つが台帳から抜けると、権限の棚卸しや事故時の影響調査が途中で止まります。
たとえば、ツールのコードが変わっていなくても、参照先のフォルダーへ機密文書が追加されれば取得可能な情報は増えます。クライアントの利用部門が広がれば、同じ機能でも誤操作の頻度と問い合わせ経路が変わります。セキュリティレビューの単位をソースコードだけにすると、このような運用上の変化を検知できません。
| 列 | 記録例 | 確認元 | 更新契機 |
|---|---|---|---|
| サーバー識別子 | sales-readonly-mcp、本番v1.4.2 | 配布物とロックファイル | リリース時 |
| 公開機能 | 顧客候補検索、案件概要取得 | Tools・Resources一覧 | 説明やスキーマの変更時 |
| データ分類 | 社外秘、個人情報を含む | 情報資産台帳 | 参照範囲の変更時 |
| 権限と秘密 | 読取専用DBロール、保管庫のキー名 | IAMとシークレット管理 | 付与、更新、失効時 |
| 接続経路 | 社内HTTP、許可クライアント3種 | 構成管理とFW設定 | 経路や利用者の追加時 |
| 責任者 | 所有者、運用当番、データ管理者 | 組織台帳 | 異動や委託変更時 |
台帳の内容は、サーバー自身から取得した発見結果と照合します。設計書に二つのツールしか書かれていないのに実行環境では三つ見えるなら、台帳を直す前に未承認機能として扱います。現物を正と決め打ちせず、承認済み構成との差を変更管理へ戻すことが重要です。
運用対象とはMCPサーバーという製品名ではなく、そのサーバーが、誰の権限で、どの情報と操作へ到達できるかという実行可能な経路全体です。
所有者、運用者、データ管理者の判断を分離する
一人の実装担当者が、機能追加、権限付与、ログ閲覧、リリース承認まで担う構成は避けます。小規模な試験でも、少なくとも業務上の必要性を判断するサービス所有者と、技術変更を行う実装・運用担当を分けます。機密データを扱う場合はデータ管理者、外部公開や高リスク操作ではセキュリティ責任者を承認経路へ加えます。
| 活動 | サービス所有者 | 実装・運用 | データ管理者 | セキュリティ |
|---|---|---|---|---|
| ツール追加の必要性判断 | A/R | C | C | C |
| コードと依存関係の更新 | I | A/R | I | C |
| 参照データ範囲の変更 | C | C | A/R | C |
| 資格情報の発行・失効 | I | R | C | A |
| 重大事故での停止 | A | R | C | R |
| 復旧と再開承認 | A | R | C | C |
Aは最終責任、Rは実行、Cは相談、Iは共有を表します。表を作る目的は記号を埋めることではなく、深夜の事故で誰が停止できるか、データ範囲の拡大を誰が拒否できるかを明確にすることです。連絡不能時の代理者も設定し、個人名だけでなく職務名と当番経路を併記します。
内部ルールには、許可するトランスポート、実行場所、データ分類、更新操作の可否、ログ保持、資格情報の保管、外部送信の審査条件を含めます。全サーバーに同じ統制を課すのではなく、読み取り専用の低機密ローカル利用、社内HTTP、高機密または更新系の三段階などに分けると、必要な審査を集中できます。
リスク区分を決める際は、ツールの数ではなく最悪時の業務影響を見ます。たとえば一つの送金ツールは、十個の公開情報検索より厳しい統制が必要です。更新操作の取消可能性、対象データの機密度、外部公開、利用者数、下流権限を採点し、区分を上げる条件を規程へ書きます。例外承認には終了日と代替統制を付け、恒久的な抜け道にしません。
委託先が運用する場合も、責任は契約先という一語で終わらせません。誰がサーバー版を確認し、誰が秘密を更新し、どの重大度で何分以内に連絡するかを作業分担へ落とします。委託終了時のアカウント失効、ログ返却、モデルや設定の削除を開始時に決めておくと、担当変更で管理不能になるのを防げます。
停止条件:所有者が不明、失効できない共用資格情報を使用、公開機能の一覧を取得できない、または参照データの分類が決まっていないサーバーは、本番利用を継続しません。
権限をツール名ではなく下流操作まで追跡する
検索ツールという名前でも低リスクとは限りません。検索先が全社ファイル、顧客DB、管理者APIなら、サーバーの表示上は読み取り専用でも大きな情報へ到達します。ツールごとに、呼び出せる下流API、DBロール、ファイル範囲、ネットワーク宛先を展開し、業務上必要な最小集合と比較します。
ローカルstdioサーバーは、起動ユーザーの権限を暗黙に引き継ぎやすい点に注意します。ホームディレクトリ全体やクラウドCLIの資格情報へ到達できる状態で、出所が不明なサーバーを起動してはいけません。専用ユーザー、許可ディレクトリ、コンテナー、送信先制限を使い、MCPの公式セキュリティ文書が示すローカルサーバーのサンドボックス化を実装条件へ落とします[1]。
Streamable HTTPでは、サーバーの認可に加えて下流サービスの認可も確認します。受け取ったトークンを検証せず下流へそのまま渡すトークンパススルーは、MCP認可仕様で禁じられています。サーバー自身を対象とするトークンを検証し、別サービスへアクセスする必要があるなら、明示的な委任またはサーバー用資格情報を設計します[2]。
# Linuxで実行ユーザーとプロセスを確認する例ps -o user,pid,ppid,args -C pythonid mcp-sales# コンテナー運用なら実効ユーザーとマウントを確認docker inspect sales-mcp --format '{{.Config.User}}'docker inspect sales-mcp --format '{{json .Mounts}}'
資格情報には所有者、用途、対象環境、有効期限、ローテーション方法、緊急失効手順を付けます。90日ごとといった周期だけでは、漏えい時に直ちに止められるか分かりません。シークレット保管庫のキー名を台帳へ記録し、値そのものはチケット、設定ファイル、ログへ複製しないようにします。
棚卸しでは、最終使用時刻だけで不要と判断しません。利用頻度が低い月次業務もあるため、サービス所有者が業務根拠を再承認します。根拠がない資格情報と未使用ツールは無効化し、復旧依頼が来た場合に改めて必要性を審査する方が、永続的な過大権限を残しません。
MCP層と業務層を分けて監視する
プロセスが起動しているだけでは、利用者にとって正常とは言えません。監視は、プロセス・通信、MCP契約、下流依存、業務結果の四層に分けます。CPUやメモリだけを見ていると、ツール一覧の欠落、認可失敗、検索結果の空振り増加を見逃します。一方で、業務データの全文をログへ入れると、新たな漏えい経路になります。
アラートは重要度と対応先を結び付けます。全ツールの一時的な失敗率上昇は運用当番へ、機密Resourceの大量取得や未承認ツールはセキュリティ当番へ通知します。通知本文に入力やトークンを入れず、相関IDから権限のある担当者だけが詳細へ移れる構成にします。通知が届いたか、夜間の代理者へ渡るかを定期的にテストします。
ログ欠損そのものも監視対象です。呼び出しがあるのに監査イベントが途絶えた場合、正常率を計算できません。時計ずれは認可の時刻判定と事故調査の両方を壊すため、ホストの時刻同期状態も確認します。サーバー、クライアント、下流APIで時刻帯を統一し、保存時はUTC、表示時は利用者の地域時刻などの規則を決めます。
| 層 | 代表イベント | 指標・判定 | ログへ残さないもの |
|---|---|---|---|
| 実行基盤 | 起動、終了、再起動、資源枯渇 | 異常終了率、再起動回数、飽和 | 環境変数の値 |
| MCP契約 | 発見、呼び出し、入力拒否、方式不一致 | 成功率、分類別件数、応答時間 | アクセストークン、完全な引数 |
| 下流依存 | DBやAPIのタイムアウト、権限拒否 | 依存先別失敗率、遮断時間 | SQL本文、個人情報を含む応答 |
| 業務結果 | 該当なし、承認拒否、取消 | 用途別の異常な増減 | 顧客本文、添付ファイル |
指標には分母を持たせます。呼び出し失敗率は「失敗件数 ÷ 全呼び出し件数 × 100」で計算し、低トラフィックでは一件の影響が大きいことを注記します。たとえば一時間に20件しかない環境で2件失敗すれば10%ですが、一律の割合だけでページングすると夜間の不要な呼び出しが増えます。件数、継続時間、重要ツールかどうかを組み合わせます。
応答時間は平均値だけでなくp50、p95、最大値を用途別に確認します。ここでp95が2秒以内などの値を置く場合は、実測前の想定目標と明記します。利用者が対話中に待てる時間、下流APIの契約、タイムアウトと再試行の総時間から決め、検証後に更新します。根拠のない業界標準値として扱ってはいけません。
相関IDは、クライアント、MCPサーバー、下流サービスで追跡できる形にします。ただしHTTPの認証情報やユーザー入力をそのままIDに含めません。ログアクセスも権限管理し、閲覧・エクスポートの操作を監査します。監視基盤へ集めた時点で安全になるわけではなく、保持期間と削除手順まで決める必要があります。
SDK、依存関係、設定を同じ変更管理へ載せる
MCPサーバーの挙動は、アプリケーションコード以外にも左右されます。SDK、JSONスキーマ処理、HTTPライブラリ、認証ライブラリ、ランタイム、コンテナー、クライアント側の更新を変更対象へ含めます。設定ファイルだけの変更でも、公開ツール、通信先、資格情報、ログ量が変わるならコード変更と同じ審査が必要です。
供給網の確認では、アプリケーションのSBOMと実際の配布イメージを照合します。ビルド時にはあったが本番へ入らない開発依存と、ベースイメージに含まれるOSパッケージを区別します。脆弱性スキャナーの結果だけでなく、該当コードへ外部入力が到達するか、回避設定が本番で有効かを技術記録へ残します。
更新後の監視期間は、通常の呼び出し量が一巡する長さで決めます。月次機能を更新翌日だけ見ても評価できません。高リスク変更は利用者を一部へ絞り、旧版へ戻す条件を事前に設定します。データ形式を変更する場合は、旧版が新データを読めるか、戻す際にデータ損失がないかを実ファイルの複製で試します。
まず稼働環境から実版を取得します。Pythonならpython --versionとuv tree、Node.jsならnode --versionとロックファイル、コンテナーならイメージのダイジェストを保存します。担当者の端末にある版ではなく、実際の本番プロセスが使う版を記録します。
python --versionuv run python -c "import importlib.metadata as m; print(m.version('mcp'))"uv tree# 更新候補を別ブランチで反映した後uv lock --upgrade-package mcpuv run pytest# イメージは可変タグではなくダイジェストも記録docker image inspect example/mcp-server:1.4.2 --format '{{index .RepoDigests 0}}'
更新の優先度は、脆弱性の深刻度だけで決めません。到達可能性、公開範囲、利用権限、悪用条件、代替統制を加味します。CVSSが高くても該当機能を使っていない場合と、点数が低くても認証を回避できる場合では対応が異なります。判断根拠、暫定対策、期限、例外承認者をチケットへ残します。
現行MCP仕様の更新に追随するときは、サーバーだけを先行させません。2026-07-28版ではHTTPの要求メタデータやトランスポートの前提が以前と異なるため、利用中クライアントとの互換試験が欠かせません。固定されたステージング環境で発見、Tools・Resources・Prompts、認可、エラー、長時間処理を再試験し、ロールバック先のイメージと設定を保持します[3]。
依存関係の一覧はSBOMとして出力し、脆弱性情報と照合できるようにします。CISAのSBOM資料群は、SBOMをソフトウェア構成要素の透明性とリスク管理に使うための情報を集約しています。MCP固有の合格証ではありませんが、配布物に何が含まれるかを更新前後で比較する根拠になります[4]。
緊急パッチでも省略しない項目:変更内容、対象資産、実版、最低限の契約試験、データ移行の有無、戻し方、承認者、適用後の監視期間を一つの変更記録へ残します。
異常を技術エラーとセキュリティ事象に分類する
すべての失敗をインシデントにすると運用は疲弊し、すべてを通常エラーにすると侵害を見逃します。入力検証エラー、下流タイムアウト、資格情報失効は通常運用で起こり得ます。一方、短時間の大量列挙、未承認ツールの出現、普段使わないデータへの連続アクセス、Origin不一致、トークンの対象不一致、深夜の権限変更は調査対象です。
検知ルールは、単発の文字列一致ではなく資産台帳と関連付けます。たとえば同じ100件の呼び出しでも、公開FAQ検索と人事ファイル取得では意味が違います。利用者、クライアント、ツール、データ分類、時間帯、結果件数を機密性に配慮した形で組み合わせ、通常時の分布から外れた動きを調べます。
| 事象 | 初動 | 停止判断 | 保存する証跡 |
|---|---|---|---|
| 入力不正の小幅増加 | リリースや利用画面変更を確認 | 通常は継続 | 件数、分類、版、相関ID |
| 認可失敗の急増 | 発行元、対象、時刻同期、失効を確認 | 誤設定拡散なら遮断 | トークン値を除く検証結果 |
| 未承認ツールの発見 | 対象サーバーを隔離し差分取得 | 原則停止 | 配布物ハッシュ、設定、発見結果 |
| 機密データの異常取得 | 秘密を失効し、経路を遮断 | 即時停止 | 監査ログ、時刻、対象範囲 |
| 依存物の改ざん疑い | 新規起動を止め正常版と照合 | 影響資産を隔離 | ロック、SBOM、ダイジェスト |
MCPのセキュリティ文書は、混乱した代理人問題、SSRF、トークンの対象検証、ローカルサーバーの安全性など、実装と運用の両面に関わる脅威を整理しています。チェック項目を写すのではなく、自社構成で攻撃者がどの入口からどの権限へ移れるかを図示し、監視イベントへ変換します[1]。
NIST Cybersecurity Framework 2.0は、特定製品の設定集ではなく、Govern、Identify、Protect、Detect、Respond、Recoverの機能でサイバーリスク管理を整理します。MCP運用では、台帳をIdentify、最小権限をProtect、監視をDetect、初動をRespond、再構築と再開をRecoverへ対応させると、既存の全社プロセスへ接続しやすくなります[5]。
停止、封じ込め、復旧を事前に演習する
事故時に最初から原因を特定しようとすると、被害が続くことがあります。重大な情報取得や不正操作が疑われる場合は、サーバーの新規呼び出し停止、資格情報の失効、ネットワーク経路の遮断を優先します。証拠保全のためにプロセスやログを残す必要がある場合でも、利用者から到達できる状態を維持する必要はありません。
証拠保全では、ログを個人PCへコピーして共有しません。取得者、取得時刻、対象期間、元システム、ハッシュ、保管場所、閲覧者を記録します。クラウドや委託先のログが短期間で消えるなら、平時にエクスポート手順と権限を確認します。事故発生後に初めて管理画面の契約や保持期間を調べると、必要な証跡が失われます。
外部への報告、本人通知、監督機関への対応が必要かは、法務・プライバシー担当へ速やかに渡します。技術チームが影響なしと独自判断して閉じず、取得された可能性のあるデータ、対象人数、期間、暗号化、悪用可能性を事実と未確認に分けて提示します。原因分析の完了を待たず、期限のある判断を先行させます。
- 宣言:事象番号、指揮者、時刻、対象資産、暫定重大度を決める。
- 封じ込め:入口を止め、関連資格情報を失効し、影響サーバーを隔離する。
- 範囲特定:ツール、利用者、データ、期間、下流サービスを台帳とログから突き合わせる。
- 除去:脆弱な版、設定、漏えいした秘密、未承認機能を取り除く。
- 復旧:クリーンな配布物で再構築し、契約・認可・業務結果を確認する。
- 再開:サービス所有者とセキュリティ担当が残存リスクを承認する。
- 振り返り:検知時間、停止時間、統制の欠落を改善計画へ移す。
復旧はプロセスが起動した時点で終えません。漏えいした可能性がある資格情報をすべて更新し、旧資格情報が拒否されることを確認します。変更されたツール一覧、データアクセス権、ネットワーク宛先を承認済み台帳と比較し、代表業務の結果を人が確認します。原因が不明なまま同じイメージを再起動するのは復旧ではありません。
演習では、実データを使わずに「未承認ツールが表示された」「読取資格情報が外部へ流出した疑い」などのシナリオを用意します。停止権限がある人、失効操作に必要な承認、ログ取得時間を計測します。以下は実績ではない試算例です。検知から遮断まで30分を目標にするなら、式は「遮断完了時刻 − 最初の検知時刻」です。実測が60分なら、目標を達成したことにせず、連絡や権限の待ち時間を分解します。
再開してはいけない状態:影響範囲が確定していない、侵害された資格情報が有効、正常な配布物の由来を確認できない、監視が復旧していない、または再発防止の暫定統制がない場合です。
定期レビューと変更トリガーを組み合わせる
年一回の棚卸しだけでは、短期間で変わるMCP環境に追いつきません。月次で異常傾向と期限切れを確認し、四半期ごとに権限・利用者・公開機能を再承認する、といった周期をリスクに応じて決めます。ただし周期を待たず、ツール追加、データ分類変更、外部公開、認証方式変更、重大なSDK更新、所有者交代があれば臨時レビューを開始します。
年次予算では、ライセンスだけでなく監視保存量、脆弱性対応、回帰試験、当番、廃止作業を見積もります。運用費を確保できないサーバーは、新年度も惰性で残さず、利用停止または機能統合を選びます。安全な運用を個人の善意と時間外対応へ依存させないことが、継続承認の条件です。
利用者からの報告も監視へ含めます。モデルが不要なツールを繰り返し呼ぶ、同じ操作を二重実行する、見えてはいけないResource名が表示される、といった現象は基盤指標だけでは分かりません。報告フォームにはサーバー名を利用者へ選ばせず、発生時刻、画面、相関IDから運用側が特定できるようにします。
教育はMCPの概念説明だけで終えず、許可されたデータ、更新操作の確認画面、誤結果の報告、緊急停止の連絡先を演習します。管理者には秘密の失効と旧版復旧、サービス所有者にはツール追加の影響判定を訓練します。受講記録より、模擬事象で正しい連絡と停止ができたかを確認します。
新しい利用部門を追加するときは、既存承認の横展開にしません。同じサーバーでも、部門が扱う顧客、法的根拠、端末、勤務時間、問い合わせ先が違います。利用目的とデータ範囲を再確認し、必要ならResourceを分離します。利用者数の増加に応じてログ容量、レート制限、当番体制も見直します。
レビュー会議には未処理件数だけでなく、期限超過の理由とリスク受容者を出します。脆弱性対応が毎回テスト環境待ちで遅れるなら、個別チケットを閉じても運用能力の問題は残ります。検証環境の再構築時間、承認待ち、ロールバック演習の未実施など、繰り返す遅延を改善計画へ移します。
監査では規程の存在より、サーバーを無作為に選び、台帳から実版、公開機能、権限、ログ、直近変更、責任者まで追えるかを確かめます。記録と現物が違う場合は更新漏れとして軽く扱わず、他サーバーにも同じ管理欠陥がないか範囲を広げます。統制の有効性は文書量ではなく、差分を検出して止められるかで判断します。
| 確認テーマ | 根拠 | 判定 | 期限付き対応 |
|---|---|---|---|
| 構成差分 | 発見結果、配布物、設定の前回比較 | 承認済み / 要調査 | 差分の所有者と隔離期限 |
| 権限 | IAM、秘密、最終使用、業務根拠 | 維持 / 縮小 / 失効 | 実施日と検証者 |
| 監視 | 成功率、異常、ログ欠損、誤検知 | 有効 / 改修 | ルール変更と再評価日 |
| 脆弱性・更新 | SBOM、助言、固定版、到達可能性 | 適用 / 緩和 / 例外 | 期限と例外承認者 |
| 継続価値 | 利用業務、代替手段、運用負荷 | 継続 / 統合 / 廃止 | 移行・データ削除計画 |
運用指標には安全性と持続可能性の両方を含めます。例として、期限内パッチ率は「期限内に完了した対象更新数 ÷ 期限が到来した対象更新数 × 100」、権限再承認率は「根拠を確認した権限数 ÷ 棚卸し対象権限数 × 100」です。数値が高くても、対象から高リスク資産が漏れていれば意味がないため、分母の完全性を監査します。
廃止も運用の一部です。クライアント設定から削除するだけでなく、プロセス停止、資格情報失効、DNS・経路削除、ログとデータの保持判断、台帳の廃止記録を行います。所有者不明のサーバーを念のため残すと、更新されない権限経路になります。代替が確認できた時点で、期限を決めて閉じます。
この運用体系が重すぎる低リスク用途では、そもそも常設サーバーにしない選択があります。承認済みデータだけを扱う短期の隔離検証に限定し、終了時に環境ごと破棄します。反対に、高機密・更新系・外部公開では本稿の最低線だけで足りず、組織のインシデント対応、委託先管理、法務・プライバシー審査と統合する必要があります。
次に取る行動は、稼働中のMCPサーバーを一つ選び、公開機能、実行ユーザー、資格情報、下流接続、利用部門、停止担当を台帳と現物で照合することです。差分が一つでもあれば新規利用者の追加を止め、所有者と修正期限を決めてから権限再承認へ進みます。
参考文献・一次情報
- Model Context Protocol公式『Security Best Practices』(2026-07-30確認)
- MCP公式仕様『Authorization 2026-07-28』(2026-07-30確認)
- Model Context Protocol公式『Specification 2026-07-28』(2026-07-30確認)
- CISA公式『Software Bill of Materials Resources』(2026-07-30確認)
- NIST公式『Cybersecurity Framework 2.0』(2026-07-30確認)