Secure Remote MCP Servers using Azure API Management について
このサンプルは Azure API Management を リモートサーバー向けの AI ゲートウェイとして使い、最新の MCP 認可仕様を実装しています。Azure 上にリモートサーバーを配置し、認証を一元管理したいチーム向けで、現時点では実験的なプロジェクトです。
主な機能
- 01リモートサーバーの前段に置く AI ゲートウェイとしての APIM
- 02OAuth 2.0 と PKCE による認可フロー
- 03Entra ID によるサインインと同意管理
- 04セッションキーの暗号化によるトークンのサーバー側保持
- 05Azure Functions 上で動作する Python 製 MCP サーバー
- 06azd up コマンドによる一括デプロイ
活用シーン
- 01OAuth で保護されたリモートサーバーを Azure に配置
- 02APIM が公開する SSE エンドポイントを MCP Inspector で検証
- 03社内の MCP サーバーへの認証とレート制限の共通適用
MCP 対応
本サンプルはリモートサーバーの前段に OAuth 層と SSE エンドポイント(/mcp/sse)を配置します。MCP クライアントは Entra ID による認可を完了してから、ゲートウェイ経由で バックエンドの Function App にアクセスします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Azure API Management を使用したセキュアなリモート MCP サーバー(実験的)

Azure API Management は、MCP サーバー向けのAI ゲートウェイとして機能します。
このサンプルでは、最新のMCP 認可仕様を実装しています。
フローを理解するには、こちらのシーケンス図をご覧ください。
Azure にリモート MCP サーバーをデプロイする
-
Microsoft.Appリソースプロバイダーを登録します。- Azure CLI を使用する場合は、
az provider register --namespace Microsoft.App --waitを実行します。 - Azure PowerShell を使用する場合は、
Register-AzResourceProvider -ProviderNamespace Microsoft.Appを実行します。その後、しばらくしてから(Get-AzResourceProvider -ProviderNamespace Microsoft.App).RegistrationStateを実行し、登録が完了しているか確認します。
- Azure CLI を使用する場合は、
-
次の azd コマンドを実行して、API Management サービス、Function App(コードを含む)、およびその他すべての必要な Azure リソースをプロビジョニングします。
azd up
MCP Inspector でテストする
-
新しいターミナルウィンドウで MCP Inspector をインストールして実行します。
npx @modelcontextprotocol/inspector -
アプリに表示された URL(例:http://127.0.0.1:6274/#resources)を Ctrl キーを押しながらクリックして、MCP Inspector の Web アプリを開きます。
-
トランスポートの種類を
SSEに設定します。 -
URL に、
azd upの実行後に表示された、実行中の API Management SSE エンドポイントを設定し、Connect をクリックします。https://<apim-servicename-from-azd-output>.azure-api.net/mcp/sse -
List Tools をクリックします。ツールを選択し、Run Tool をクリックします。
技術アーキテクチャの概要
このソリューションは、Azure 上にセキュアな MCP(Model Context Protocol)サーバーのインフラストラクチャをデプロイします。このアーキテクチャでは、多層セキュリティモデルを実装しており、Azure API Management がインテリジェントなゲートウェイとして機能して、認証、認可、リクエストのルーティングを処理します。

デプロイされる Azure リソース
インフラストラクチャでは、次の Azure リソースをプロビジョニングします。
コアゲートウェイインフラストラクチャ
- Azure API Management (APIM) - OAuth API と MCP API の両方を公開する、セキュリティの中核となるゲートウェイです。
- SKU:BasicV2(構成可能)
- ID:システム割り当てマネージド ID とユーザー割り当てマネージド ID
- 目的:認証フロー、リクエストの検証、バックエンドサービスへのセキュアなプロキシを処理します。
バックエンドコンピューティング
- Azure Function App - MCP サーバーの実装をホストします。
- ランタイム:Flex Consumption プラン上の Python 3.11
- 認証:マネージド ID と連携する関数レベルの認証
- 目的:MCP ツールと操作を実行します(この例ではスニペットの管理)。
ストレージとデータ
- Azure Storage Account - 複数のストレージ機能を提供します。
- 関数のホスティング:Function App のデプロイパッケージを保存します。
- アプリケーションデータ:スニペット保存用の Blob コンテナー
- セキュリティ:マネージド ID によるアクセスと、オプションのプライベートエンドポイントを構成します。
セキュリティと ID
-
ユーザー割り当てマネージド ID - サービス間のセキュアな認証を実現します。
- 目的:Function App がシークレットを使わずに Storage と Application Insights にアクセスできるようにします。
- 権限:Storage Blob Data Owner、Storage Queue Data Contributor、Monitoring Metrics Publisher
-
Entra ID アプリケーション登録 - 認証用の OAuth2/OpenID Connect クライアントです。
- 目的:MCP 仕様に基づくサードパーティ認可フローを実現します。
- 構成:カスタムリダイレクト URI を設定した、PKCE 対応のパブリッククライアント
監視と可観測性
- Application Insights - テレメトリと監視を提供します。
- Log Analytics Workspace - ログと分析を一元管理します。
オプションのネットワークセキュリティ
- Virtual Network(VNet) -
vnetEnabledが true の場合- Private Endpoints:Storage Account へのセキュアな接続
- Network Isolation:Functions とストレージがプライベートネットワーク経由で通信
これらのリソースを使用する理由
Azure API Management はセキュリティ境界として機能し、以下を実装します。
- MCP 仕様に準拠した OAuth 2.0/PKCE 認証フロー
- セキュアな API アクセスのためのセッションキーの暗号化/復号
- リクエストの検証とヘッダーの挿入
- レート制限とスロットリング機能
- ポリシーの一元管理
Azure Functions は以下を提供します。
- サーバーレスの従量課金型コンピューティングモデル
- Azure サービスとのネイティブな統合
- 需要に応じた自動スケーリング
- 組み込みの監視と診断
Managed Identities により、以下が不要になります。
- サービス認証情報の管理
- シークレットのローテーションプロセス
- 認証情報が漏えいするリスク
Azure API Management の構成の詳細
APIM インスタンスは、MCP 認可仕様を実装するために連携する、2 つの主要な API で構成されています。
OAuth API(/oauth/*)
この API は、MCP 仕様で必要とされる完全な OAuth 2.0 認可サーバー機能を実装します。
エンドポイントと操作
認可エンドポイント(GET /authorize)
- 目的:OAuth 2.0/PKCE フローを開始します
- ポリシーロジック:
- MCP クライアントのリクエストから PKCE パラメーターを抽出します
- 既存のユーザー同意を(Cookie を介して)確認します
- 同意が得られていない場合、同意ページにリダイレクトします
- Entra ID との通信に使用する新しい PKCE パラメーターを生成します
- 認証状態を APIM キャッシュに保存します
- 認証のためにユーザーを Entra ID にリダイレクトします
同意の管理(GET/POST /consent)
- 目的:MCP クライアントのアクセスに対するユーザーの同意を処理します
- 機能:セキュアな Cookie を使用した同意の永続化
OAuth メタデータエンドポイント(GET /.well-known/oauth-authorization-server)
- 目的:RFC 8414 に準拠した OAuth サーバー構成を公開します
- 戻り値:サポートされるエンドポイント、フロー、機能に関する JSON メタデータ
クライアント登録(POST /register)
- 目的:MCP 仕様に準拠した動的なクライアント登録をサポートします
トークンエンドポイント(POST /token)
- 目的:認可コードをアクセストークンに交換します
- ポリシーロジック:
- MCP クライアントから受け取った認可コードと PKCE 検証子を検証します
- Entra ID の認可コードをアクセストークンに交換します
- MCP API アクセス用の暗号化されたセッションキーを生成します
- アクセストークンとセッションキーの対応関係をキャッシュします
- 暗号化されたセッションキーを MCP クライアントに返します
名前付き値と構成
OAuth API では、構成にいくつかの APIM Named Values を使用します。
McpClientId- 登録済みの Entra ID アプリケーションのクライアント IDEntraIDFicClientId- トークン交換に使用するサービス ID のクライアント IDAPIMGatewayURL- コールバックおよびメタデータエンドポイントのベース URLOAuthScopes- 要求する OAuth スコープ(openid+ Microsoft Graph)EncryptionKey/EncryptionIV- セッションキーの暗号化に使用します
MCP API(/mcp/*)
この API は、セキュリティを適用した MCP プロトコルの実際のエンドポイントを提供します。
エンドポイントと操作
Server-Sent Events エンドポイント(GET /sse)
- 目的:MCP プロトコル用のリアルタイム通信チャネルを確立します
- セキュリティ:有効な暗号化済みセッショントークンが必要です
メッセージエンドポイント(POST /message)
- 目的:MCP プロトコルのメッセージとツール呼び出しを処理します
- セキュリティ:有効な暗号化済みセッショントークンが必要です
セキュリティポリシーの実装
MCP API は、すべての操作に包括的なセキュリティポリシーを適用します。
-
Authorization ヘッダーの検証
<check-header name="Authorization" failed-check-httpcode="401" failed-check-error-message="Not authorized" ignore-case="false" /> -
セッションキーの復号
- Authorization ヘッダーから暗号化されたセッションキーを抽出します
- 保存されているキーと IV を使用して AES で復号します
- トークンの形式と構造を検証します
-
トークンキャッシュの検索
<cache-lookup-value key="@($"EntraToken-{context.Variables.GetValueOrDefault("decryptedSessionKey")}")" variable-name="accessToken" /> -
アクセストークンの検証
- キャッシュされたアクセストークンが存在し、有効であることを確認します
- 無効な場合は、適切な WWW-Authenticate ヘッダーを付けて 401 を返します
-
バックエンド認証
<set-header name="x-functions-key" exists-action="override"> <value>{{function-host-key}}</value> </set-header>
セキュリティモデル
このソリューションでは、高度な多層セキュリティモデルを実装しています。
レイヤー 1:OAuth 2.0/PKCE 認証
- MCP クライアントは、Entra ID による完全な OAuth フローを完了する必要があります
- PKCE により、認可コードの傍受攻撃を防ぎます
- 永続的な設定を使用してユーザーの同意を管理します
レイヤー 2:セッションキーの暗号化
- アクセストークンが MCP クライアントに公開されることはありません
- 暗号化されたセッションキーにより、時間制限付きのアクセスが可能になります
- APIM で安全にキーを管理しながら AES 暗号化を使用します
レイヤー 3:関数レベルのセキュリティ
- 関数ホストキーにより、Azure Functions への直接アクセスを保護します
- マネージド ID により、サービス間の安全な通信を確保します
- VNet 統合によりネットワークを分離できます
レイヤー 4:Azure プラットフォームのセキュリティ
- すべての通信を転送中に暗号化します(TLS)
- マネージド ID を使用してストレージにアクセスします
- Application Insights を通じて監査ログを記録します
この多層アプローチにより、1 つのセキュリティ境界が侵害された場合でも、複数の追加保護が維持されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。