mcpField
S
Secure Remote MCP Servers using Azure API Management

Secure Remote MCP Servers using Azure API Management

ローカル
github.com/Azure-Samples開発ツール13056 週間前に更新

Secure Remote MCP Servers using Azure API Management について

このサンプルは Azure API Management を リモートサーバー向けの AI ゲートウェイとして使い、最新の MCP 認可仕様を実装しています。Azure 上にリモートサーバーを配置し、認証を一元管理したいチーム向けで、現時点では実験的なプロジェクトです。

主な機能

  1. 01リモートサーバーの前段に置く AI ゲートウェイとしての APIM
  2. 02OAuth 2.0 と PKCE による認可フロー
  3. 03Entra ID によるサインインと同意管理
  4. 04セッションキーの暗号化によるトークンのサーバー側保持
  5. 05Azure Functions 上で動作する Python 製 MCP サーバー
  6. 06azd up コマンドによる一括デプロイ

活用シーン

  1. 01OAuth で保護されたリモートサーバーを Azure に配置
  2. 02APIM が公開する SSE エンドポイントを MCP Inspector で検証
  3. 03社内の MCP サーバーへの認証とレート制限の共通適用

MCP 対応

本サンプルはリモートサーバーの前段に OAuth 層と SSE エンドポイント(/mcp/sse)を配置します。MCP クライアントは Entra ID による認可を完了してから、ゲートウェイ経由で バックエンドの Function App にアクセスします。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"remote-mcp-apim-functions-python": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/inspector"
]
}
}
}
起動コマンドnpx -y @modelcontextprotocol/inspector

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@modelcontextprotocol/inspector

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Azure API Management を使用したセキュアなリモート MCP サーバー(実験的)

図

Azure API Management は、MCP サーバー向けのAI ゲートウェイとして機能します。

このサンプルでは、最新のMCP 認可仕様を実装しています。

フローを理解するには、こちらのシーケンス図をご覧ください。

Azure にリモート MCP サーバーをデプロイする

  1. Microsoft.App リソースプロバイダーを登録します。

    • Azure CLI を使用する場合は、az provider register --namespace Microsoft.App --wait を実行します。
    • Azure PowerShell を使用する場合は、Register-AzResourceProvider -ProviderNamespace Microsoft.App を実行します。その後、しばらくしてから (Get-AzResourceProvider -ProviderNamespace Microsoft.App).RegistrationState を実行し、登録が完了しているか確認します。
  2. 次の azd コマンドを実行して、API Management サービス、Function App(コードを含む)、およびその他すべての必要な Azure リソースをプロビジョニングします。

    azd up
    
MCP Inspector でテストする
  1. 新しいターミナルウィンドウで MCP Inspector をインストールして実行します。

    npx @modelcontextprotocol/inspector
    
  2. アプリに表示された URL(例:http://127.0.0.1:6274/#resources)を Ctrl キーを押しながらクリックして、MCP Inspector の Web アプリを開きます。

  3. トランスポートの種類を SSE に設定します。

  4. URL に、azd up の実行後に表示された、実行中の API Management SSE エンドポイントを設定し、Connect をクリックします。

    https://<apim-servicename-from-azd-output>.azure-api.net/mcp/sse
    
  5. 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 フローを開始します
  • ポリシーロジック:
    1. MCP クライアントのリクエストから PKCE パラメーターを抽出します
    2. 既存のユーザー同意を(Cookie を介して)確認します
    3. 同意が得られていない場合、同意ページにリダイレクトします
    4. Entra ID との通信に使用する新しい PKCE パラメーターを生成します
    5. 認証状態を APIM キャッシュに保存します
    6. 認証のためにユーザーを Entra ID にリダイレクトします

同意の管理(GET/POST /consent)

  • 目的:MCP クライアントのアクセスに対するユーザーの同意を処理します
  • 機能:セキュアな Cookie を使用した同意の永続化

OAuth メタデータエンドポイント(GET /.well-known/oauth-authorization-server)

  • 目的:RFC 8414 に準拠した OAuth サーバー構成を公開します
  • 戻り値:サポートされるエンドポイント、フロー、機能に関する JSON メタデータ

クライアント登録(POST /register)

  • 目的:MCP 仕様に準拠した動的なクライアント登録をサポートします

トークンエンドポイント(POST /token)

  • 目的:認可コードをアクセストークンに交換します
  • ポリシーロジック:
    1. MCP クライアントから受け取った認可コードと PKCE 検証子を検証します
    2. Entra ID の認可コードをアクセストークンに交換します
    3. MCP API アクセス用の暗号化されたセッションキーを生成します
    4. アクセストークンとセッションキーの対応関係をキャッシュします
    5. 暗号化されたセッションキーを MCP クライアントに返します
名前付き値と構成

OAuth API では、構成にいくつかの APIM Named Values を使用します。

  • McpClientId - 登録済みの Entra ID アプリケーションのクライアント ID
  • EntraIDFicClientId - トークン交換に使用するサービス ID のクライアント ID
  • APIMGatewayURL - コールバックおよびメタデータエンドポイントのベース URL
  • OAuthScopes - 要求する OAuth スコープ(openid + Microsoft Graph)
  • EncryptionKey / EncryptionIV - セッションキーの暗号化に使用します
MCP API(/mcp/*)

この API は、セキュリティを適用した MCP プロトコルの実際のエンドポイントを提供します。

エンドポイントと操作

Server-Sent Events エンドポイント(GET /sse)

  • 目的:MCP プロトコル用のリアルタイム通信チャネルを確立します
  • セキュリティ:有効な暗号化済みセッショントークンが必要です

メッセージエンドポイント(POST /message)

  • 目的:MCP プロトコルのメッセージとツール呼び出しを処理します
  • セキュリティ:有効な暗号化済みセッショントークンが必要です
セキュリティポリシーの実装

MCP API は、すべての操作に包括的なセキュリティポリシーを適用します。

  1. Authorization ヘッダーの検証

    <check-header name="Authorization" failed-check-httpcode="401" 
                  failed-check-error-message="Not authorized" ignore-case="false" />
    
  2. セッションキーの復号

    • Authorization ヘッダーから暗号化されたセッションキーを抽出します
    • 保存されているキーと IV を使用して AES で復号します
    • トークンの形式と構造を検証します
  3. トークンキャッシュの検索

    <cache-lookup-value key="@($"EntraToken-{context.Variables.GetValueOrDefault("decryptedSessionKey")}")" 
                        variable-name="accessToken" />
    
  4. アクセストークンの検証

    • キャッシュされたアクセストークンが存在し、有効であることを確認します
    • 無効な場合は、適切な WWW-Authenticate ヘッダーを付けて 401 を返します
  5. バックエンド認証

    <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 つのセキュリティ境界が侵害された場合でも、複数の追加保護が維持されます。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。