mcpField
🀫
🀫 Authenticated Remote MCP Server

🀫 Authenticated Remote MCP Server

ロヌカル
github.com/localden開発ツヌル3161 週間前に曎新

🀫 Authenticated Remote MCP Server に぀いお

Authenticated Remote MCP Server は、Azure API Management で保護された Entra ID 認蚌付きのリモヌトサヌバヌを Azure にデプロむする方法を瀺すサンプルです。クラむアントは MCP サヌバヌ向けのトヌクンを取埗し、オンベハヌフオブフロヌon-behalf-ofで Microsoft Graph ぞアクセスしたす。READMEでは実隓的な実装であり、本番環境での利甚は想定されおいないず明蚘されおいたす。

䞻な機胜

  1. 01リモヌトサヌバヌの Entra ID による保護
  2. 02Microsoft Graph アクセス甚のオンベハヌフオブフロヌ
  3. 03動的クラむアント登録ず PKCE フロヌ
  4. 04同意フォヌムの Cookie ベヌス CSRF 察策
  5. 05azd up による Azure ぞのデプロむ

掻甚シヌン

  1. 01Azure 䞊で保護されたリモヌトサヌバヌをデプロむする孊習
  2. 02MCP Inspector による Entra ID サむンむンフロヌの怜蚌
  3. 03サむンむンナヌザヌの Microsoft Graph プロファむル取埗

MCP 察応

このサンプルはリモヌトサヌバヌを SSE ゚ンドポむントで公開し、MCP Inspector などの MCP クラむアントが接続しお get_graph_user_details ツヌルを呌び出せたす。

蚭定

ロヌカルサヌバヌの蚭定はどのクラむアントでも共通です。コピヌしおクラむアントの MCP 蚭定ファむルに貌り付けおください。

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

ロヌカルサヌバヌにはマシン䞊の実行環境Node.js 18 以䞊などが必芁です。蚭定ファむルの堎所はクラむアントごずに異なりたす。

パッケヌゞ
npm@modelcontextprotocol/inspector

ツヌル

ツヌル䞀芧はただ取埗されおいたせん

ロヌカルサヌバヌのツヌルはマシン䞊で起動しお初めお取埗できたす。メンテナヌはただツヌル䞀芧を提䟛しおいたせん。

詳现

🀫 認蚌枈みリモヌト MCP サヌバヌ

このサンプルは、Entra ID で保護された MCP サヌバヌを Azure にデプロむする方法を瀺しおいたす。

このサンプルでは、クラむアントがたず MCP サヌバヌ甚 のトヌクンを取埗し、その埌 on-behalf-of フロヌ を䜿甚しお、Microsoft Graph で䜿甚できるトヌクンず亀換する認可パタヌンも採甚しおいたす。しかも、これらすべおを完党にシヌクレットレスな方法で行いたす。

⚠ 重芁: 実隓的な実装

重芁

これは実隓的な実装であり、本番環境では䜿甚しないでください。

このサンプルは、Entra ID がこれらの暙準をネむティブにサポヌトしおいない珟状のギャップを回避する、OAuth 2.0 動的クラむアント登録および PKCE フロヌパタヌンを実装するこずで、Entra ID を䜿甚しお保護された MCP サヌバヌを構築する方法を瀺しおいたす。技術的な可胜性を瀺すものですが、教育および抂念実蚌を目的ずしたものにすぎたせん。

本番環境のシナリオでは、事前登録されたアプリケヌションず暙準的な OAuth フロヌを䜿甚した、確立された認蚌パタヌンの䜿甚を怜蚎しおください。

䜿甚技術

メモ

この MCP サヌバヌをテストするには、Model Context Protocol Inspector たたは Visual Studio Code を䜿甚できたす。

認可フロヌの仕組み

この実装では、PKCE (Proof Key for Code Exchange) を備えた高床な OAuth 2.0 フロヌを䜿甚しお、MCP クラむアントを安党に認蚌したす。党䜓像は次のずおりです。

sequenceDiagram
    participant Client as MCP Client
    participant Browser as User's Browser
    participant APIM as API Management
    participant Entra as Entra ID
    participant Function as Azure Function
    participant Graph as Microsoft Graph

    Note over Client,Graph: 1. Discovery & Registration
    Client->>APIM: GET /.well-known/oauth-authorization-server
    APIM->>Client: OAuth metadata (authorization_endpoint, token_endpoint, etc.)
    
    Client->>APIM: POST /register (Dynamic Client Registration)
    Note over APIM: Store client info in CosmosDB<br/>Generate unique client_id
    APIM->>Client: Client credentials (client_id, no secret)

    Note over Client,Graph: 2. Authorization with PKCE
    Note over Client: Generate code_verifier & code_challenge
    Client->>Browser: Open authorization URL with PKCE params
    Browser->>APIM: GET /authorize?client_id=...&code_challenge=...
    
    Note over APIM: Check for existing consent cookie<br/>🍪 __Host-MCP_APPROVED_CLIENTS
    alt No previous consent
        APIM->>Browser: Redirect to /consent page
        Note over Browser: User reviews permissions and clicks "Allow"
        Browser->>APIM: POST /consent (with CSRF protection)
        Note over APIM: Set consent cookie<br/>🍪 __Host-MCP_APPROVED_CLIENTS<br/>🍪 __Host-MCP_CONSENT_STATE
    end
    
    APIM->>Browser: Redirect to Entra ID with state correlation
    Note over APIM: Set Entra state cookie<br/>🍪 __Host-MCP_ENTRA_STATE<br/>(contains sessionId|entraidState|clientState)
    
    Browser->>Entra: Authorize with Entra ID
    Note over Browser: User authenticates with Entra ID
    Entra->>APIM: Callback with authorization code
    
    Note over APIM: Validate state correlation<br/>Exchange code for Entra access token<br/>Generate encrypted session token
    APIM->>Browser: Redirect with MCP authorization code

    Note over Client,Graph: 3. Token Exchange
    Browser->>APIM: POST /token (code + code_verifier)
    Note over APIM: Validate PKCE challenge<br/>Return encrypted session token
    APIM->>Browser: Access token (encrypted session key)
    Browser->>Client: Token for MCP communication

    Note over Client,Graph: 4. Authenticated MCP Communication
    Client->>APIM: GET /mcp/sse (with Bearer token)
    Note over APIM: Decrypt session token<br/>Lookup cached Entra token<br/>Add to request for downstream
    APIM->>Function: Forward with Entra access token
    
    Function->>Graph: API calls using on-behalf-of flow
    Graph->>Function: User data
    Function->>APIM: MCP response
    APIM->>Client: Authenticated MCP response
セキュリティ機胜ず䜿甚される Cookie

この実装では、安党なフロヌを確保するためにいく぀かのセキュリティメカニズムず Cookie を䜿甚しおいたす。

Cookie目的
__Host-MCP_APPROVED_CLIENTS特定のクラむアントに察するナヌザヌの同意を蚘憶したす
__Host-MCP_DENIED_CLIENTS拒吊された同意を蚘憶し、再プロンプトを防ぎたす
__Host-MCP_CONSENT_STATE同意フォヌムの送信を怜蚌したす
__Host-MCP_ENTRA_STATEEntra ID コヌルバックを元のリク゚ストに関連付けたす
__Host-MCP_CSRF_TOKEN同意フォヌムに察する CSRF 攻撃を防ぎたす

メモ

すべおの Cookie は最倧限のセキュリティのために __Host- プレフィックス、Secure、HttpOnly、SameSite=Lax を䜿甚しおいたす (クロスサむトリダむレクトに SameSite=None を䜿甚する __Host-MCP_ENTRA_STATE を陀く)。

䞻なセキュリティ機胜:

  • 🔐 PKCE (Proof Key for Code Exchange) - 認可コヌドの傍受を防ぎたす
  • 🍪 セキュア Cookie - すべおの Cookie が最倧限のセキュリティのために __Host- プレフィックスを䜿甚したす
  • 🛡 CSRF 保護 - 定数時間怜蚌を䌎う二重送信 Cookie パタヌン
  • 🔄 状態の関連付け - 耇数局の状態怜蚌によりセッション固定攻撃を防ぎたす
  • 🔒 暗号化されたセッショントヌクン - セッション識別子は AES で暗号化されたす
  • ⏰ トヌクンキャッシュ - パフォヌマンスのために Entra トヌクンを暗号化されたセッションキヌでキャッシュしたす

はじめに

以䞋の手順に埓っお開始しおください。

  1. Azure Developer CLI をむンストヌルしたす。

  2. リポゞトリをロヌカルにクロヌンしたす:

    git clone https://github.com/localden/remote-auth-mcp-apim-py
    
  3. タヌミナルでリポゞトリに移動したす:

    cd remote-auth-mcp-apim-py
    
  4. Azure portal たたは以䞋の Azure CLI コマンドを実行しお、サブスクリプションに Microsoft.App リ゜ヌスプロバむダヌが登録されおいるこずを確認したす:

    az login
    az provider register --namespace Microsoft.App --wait
    
  5. Azure Developer CLI にログむンしたす:

    azd auth login
    
  6. プロゞェクトを Azure にデプロむしたす:

    azd up
    

重芁

このプロゞェクトをデプロむするず、Azure のコストが発生したす。テストや実隓のためにデプロむする堎合は、テスト埌に䜜成したリ゜ヌスグルヌプを必ず削陀しおください。

プロゞェクトのデプロむずテスト

azd up を実行するず、infra ディレクトリで宣蚀されたリ゜ヌスが Azure アカりントにプロビゞョニングされたす。既存の Bicep ファむルを確認するこずで、どのようなむンフラストラクチャが自動的にデプロむされるかを把握できたす。

Azure Developer CLI を䜿甚した Azure リ゜ヌスのデプロむを瀺す GIF

デプロむが完了するず、タヌミナルに ゚ンドポむント が出力されたす:

タヌミナルに衚瀺された゚ンドポむント

たずえば、䞊のスクリヌンショットでぱンドポむントは https://apim-2lzunaz2nu642.azure-api.net/mcp/sse です。これをコピヌしたす。

メモ

次のステップに進む前に、Node.js がむンストヌルされおいるこずを確認しおください。Model Context Protocol Inspector を実行するために必芁です。

タヌミナルで以䞋を実行したす:

npx @modelcontextprotocol/[email protected]

メモ

保護された MCP サヌバヌをテストする際に最も安定したバヌゞョンであるため、Model Context Protocol Inspector の 0.9.0 リリヌスを䜿甚しおいたす。

これにより、Model Context Protocol Inspector がロヌカルで実行されおいる゚ンドポむントが衚瀺されたす。ブラりザヌでその URL を開きたす。

Transport Type を SSE に切り替え、URL をデプロむの実行で取埗した゚ンドポむントに蚭定したす。Connect をクリックしたす。

MCP Inspector での認蚌

むンフラストラクチャをデプロむしたテナント内の資栌情報で認蚌するよう求められたす。Entra ID アプリケヌションはデプロむ時に動的に登録されたす。1 ぀はサヌバヌ甚で、もう 1 ぀は Microsoft Graph ぞのアクセスを取埗するための on-behalf-of フロヌに䜿甚されたす。

同意するず、Model Context Protocol Inspector のランディングペヌゞに戻りたす。接続が確立されるたで数秒埅ちたす。ペヌゞに緑色の Connected ラベルが衚瀺されたす。

MCP Inspector で接続された MCP サヌバヌ

接続したら、List Tools をクリックし、get_graph_user_details を遞択したす。これにより、Microsoft Graph から珟圚認蚌されおいるナヌザヌに関するデヌタを取埗できたす。Run Tool をクリックしたす。

MCP Inspector でツヌルを䞀芧衚瀺し、Graph からナヌザヌ詳现を返すツヌルを実行する

すべおがうたくいけば、次のようにレスポンスブロックにナヌザヌデヌタが衚瀺されたす:

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
  "businessPhones": [],
  "displayName": "YOUR_NAME",
  "givenName": null,
  "jobTitle": null,
  "mail": "YOUR_EMAIL",
  "mobilePhone": null,
  "officeLocation": null,
  "preferredLanguage": null,
  "surname": null,
  "userPrincipalName": "YOUR_UPN",
  "id": "c6b77314-c0ec-44b2-b0bb-2c971a753f0c",
  "success": true
}

フィヌドバックず問題の報告

問題に盎面したりコメントがある堎合は、必ずむシュヌを䜜成しおください。

コメント

MCP は初めおですか

プロトコルの抂芁から最初のサヌバヌの導入たで、よくある疑問にたずめお答えたす。

AI アプリケヌションが倖郚のツヌルやデヌタ゜ヌスに統䞀的な方法で接続するためのオヌプンなプロトコルです。クラむアントはモデルずの察話を担い、MCP サヌバヌはツヌル・リ゜ヌス・プロンプトテンプレヌトを提䟛したす。暙準メッセヌゞでやり取りするため、1 ぀のサヌバヌを耇数のクラむアントで再利甚できたす。