次の方法で共有


チュートリアル: Azure Functions で MCP サーバーをホストする

この記事では、リモート Model コンテキスト プロトコル (MCP) サーバーをAzure Functionsでホストする方法について説明します。 また、組み込みの認証を使用してサーバー エンドポイントの承認を構成し、AI ツールのセキュリティを強化する方法についても説明します。

Azure Functionsでリモート MCP サーバーをホストするには、次の 2 つの方法があります。

MCP サーバー オプション Description 最適なシナリオ
MCP 拡張サーバー Azure Functions MCP 拡張機能 を使用してカスタム MCP サーバーを作成します。ここで、拡張機能トリガーを使用してツール エンドポイントを定義できます。 これらのサーバーは、すべての Functions 言語でサポートされ、他の関数アプリとして開発、展開、および管理されます。 Functions とその バインド ベースのプログラミング モデルについて既に理解している場合。
セルフホステッド サーバー Functions では、標準の MCP SDK を使用して作成された MCP サーバー プロジェクトをホストできます。 公式の MCP SDK を使用してサーバーを既に構築しており、Azureでイベントドリブン、サーバーレス、スケーラブルなホスティングを探している場合。

Azure Functions が公式の MCP SDK を使用して作成した MCP サーバーをホストする能力は、現在プレビュー段階にあります。

このチュートリアルでは、Functions でサポートされる両方の MCP サーバー オプションについて説明します。 シナリオに最適なタブを選択します。

このチュートリアルでは、Visual Studio Codeを使用して次の操作を行います。

  • MCP 拡張機能を使用して MCP サーバー プロジェクトを作成します。
  • MCP サーバーをローカルで実行して確認します。
  • Azureで関数アプリを作成します。
  • MCP サーバー プロジェクトをデプロイします。
  • 組み込み認証を有効にします。

Important

この記事では現在、C#、Python、TypeScript のみがサポートされています。 クイック スタートを完了するには、記事の上部にあるサポートされているこれらの言語のいずれかを選択します。

この記事では、Azure Functionsの Node.js プログラミング モデルのバージョン 4 をサポートします。

この記事では、Azure FunctionsのPython プログラミング モデルのバージョン 2 をサポートします。

[前提条件]

MCP サーバー プロジェクトを作成する

Visual Studio Codeを使用して、任意の言語で MCP サーバー プロジェクトをローカルに作成します。

  1. Visual Studio Codeで、F1 を押してコマンド パレットを開きます。 コマンド Azure Functions: Create New Project... を検索して実行します。

  2. プロジェクト ワークスペースのディレクトリの場所を選択し、[選択] を選択します。 新しいフォルダーを作成するか、プロジェクト ワークスペースの空のフォルダーを選択する必要があります。 ワークスペースに最初から含まれているプロジェクト フォルダーは選択しないでください。

  1. プロンプトで、次の情報を入力します。

    Prompt [選択]
    プロジェクトの種類を選択する C# を選択します。
    .NET ランタイムを選択します .NET 8.0 LTS を選択します。
    プロジェクトの最初の関数のテンプレートを選択します MCP Tool trigger を選択します。
    関数に名前を指定します McpTrigger」と入力します。
    名前空間を指定する My.Functions」と入力します。
    承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。
    プロジェクトを開く方法を選択してください Open in current window を選択します。
  1. プロンプトで、次の情報を入力します。

    Prompt [選択]
    プロジェクトの種類を選択する TypeScript を選択します。
    プロジェクトの最初の関数のテンプレートを選択します MCP Tool trigger を選択します。
    関数に名前を指定します mcpToolTrigger」と入力します。
    承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。
    プロジェクトを開く方法を選択してください Open in current window を選択します。
  1. プロンプトで、次の情報を入力します。

    Prompt [選択]
    プロジェクトの種類を選択する Python を選択します。
    仮想環境を作成するPython インタープリターを選択します 任意のPythonインタープリターを選択します。 オプションが表示されない場合は、Python バイナリへの完全なパスを入力します。
    プロジェクトの最初の関数のテンプレートを選択します MCP Tool trigger を選択します。
    作成する関数の名前 mcp_trigger」と入力します。
    承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。
    プロジェクトを開く方法を選択してください Open in current window を選択します。

この情報を使用して、Visual Studio Code は MCP サーバー トリガーのコード プロジェクトを生成します。 ローカル プロジェクト ファイルは、エクスプローラーで表示できます。

MCP サーバーをローカルで起動する

関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。

  1. local.setting.jsonで、"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。

  2. Visual Studio Codeで、F1 を押してコマンド パレットを開きます。 コマンド パレットで、Azurite: Startを検索して選択します。

  3. 下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。

  4. ローカルでの実行を開始するには、 F5 キーを押します。

関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。

  1. local.setting.jsonで、"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。

  2. Visual Studio Codeで、F1 を押してコマンド パレットを開きます。 コマンド パレットで、Azurite: Startを検索して選択します。

  3. 下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。

  4. ローカルでの実行を開始するには、 F5 キーを押します。

関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。

  1. local.setting.jsonで、"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。

  2. Visual Studio Codeで、F1 を押してコマンド パレットを開きます。 コマンド パレットで、Azurite: Startを検索して選択します。

  3. 下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。

  4. ローカルでの実行を開始するには、 F5 キーを押します。

サーバーをテストする

  1. .vscode ディレクトリを見つけて、mcp.jsonを開きます。 エディターは、サーバーの接続情報を追加する必要があります。

  2. サーバー名の上にある [スタート ] ボタンを選択して、サーバーを起動します。

  3. サーバーに接続すると、サーバー名の上に使用可能なツールの数が表示されます。

  4. エージェント モードVisual Studio Code Copilotチャットを開き、質問します。 たとえば、「#your-local-server-name に挨拶する」といった具合です。 この質問は、Copilotが質問に答える際にサーバーを必ず使用することを確認します。

  5. CopilotがローカルMCPサーバーからツールを実行するよう要求する場合は、Allow を選択します。

  6. [ 停止] を選択してテストが完了したら、サーバーから切断し、ローカルでの実行を停止 Cntrl+C

ヒント

Copilotチャット ウィンドウで、下部にあるツール アイコンを選択して、チャットに使用できるサーバーとツールの一覧を表示します。 テスト時にローカル MCP サーバーがチェックされていることを確認します。

リモート MCP サーバーの承認

リモート MCP サーバー エンドポイントの不正使用を減らすか防止するには、次の 2 つの方法があります。

メソッド Description
組み込みのサーバー認証 (プレビュー) 関数には、MCP 承認仕様プロトコルの OAuth 要件を実装する組み込みの App Service 認証と承認が含まれています。 サーバーにアクセスしようとしているクライアントは、接続を許可される前に認証のために、Microsoft Entra IDなどの構成済みの ID プロバイダーにリダイレクトされます。 このメソッドは、ツール エンドポイントの最高レベルのセキュリティを提供します。
キーベースの認証 既定では、Functions はアクセス キー要件を実装するため、MCP サーバー ツールを使用しようとしているクライアントは、要求ヘッダーに共有秘密鍵の値を提示する必要があります。 OAuth ベースの認証と同じレベルのセキュリティは提供されませんが、アクセス キーを使用すると、パブリック ツールへのアクセスが困難になります。 Anonymous アクセス レベルを使用して、OAuth ベースの認証を使用するときにサーバーのアクセス キーを無効にします。

このチュートリアルには、組み込みのサーバー承認と認証機能の詳細な構成手順が含まれています。これは、他の記事では App Service 認証 とも呼ばれます。 この機能の概要と使用ガイダンスについては、 組み込みのサーバー承認の構成 (プレビュー) に関する記事を参照してください。

キーベース認証を無効にする

組み込みのサーバー承認機能は、Azure Functionsとは別のコンポーネントです。 サーバー認証を使用する場合は、最初に匿名アクセスを許可してキーベースの認証を無効にすることをお勧めします。

MCP サーバーでホスト ベースの認証を無効にするには、system.webhookAuthorizationLevelAnonymous ファイル内のhost.jsonに設定します。

{
  "version": "2.0",
  "extensions": {
    "mcp": {
      ...
      "system": {
        "webhookAuthorizationLevel": "Anonymous"
      }
    }    
  }
}

Azureで関数アプリを作成する

MCP サーバーをホストする関数アプリを Azure の Flex Consumption プランに作成します。

  1. Azure ポータルのメニューまたは Home ページで、リソースの作成を選択します。

  2. [作業の開始] を選択し、[関数アプリ][作成] を選択します。

  3. [ホスティング オプションの選択] で、[Flex 従量課金]>[選択] の順に選択します。

  4. [ 基本 ] ページで、次の表に示すように関数アプリの設定を使用します。

    Setting 推奨値 Description
    Subscription あなたのサブスクリプション 新しい関数アプリを作成するサブスクリプション。
    リソース グループ myResourceGroup 関数アプリを作成する新しいリソース グループの名前。
    関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    リージョン 優先リージョン 自分の近く、または関数がアクセスできる他のサービスの近くのリージョンを選択します。 サポートされていないリージョンは表示されません。 詳細については、「現在サポートされているリージョンを表示する」を参照してください。
    ランタイム スタック 優先言語 サポートされている言語ランタイム スタックのいずれかを選択します。 Visual Studio Code for the Web を使用したポータル内編集は、現在、Node.js、PowerShell、およびPython アプリでのみ使用できます。 C# クラス ライブラリとJava関数は、ローカルで開発する必要があります。
    バージョン 言語バージョン サポートされているバージョンの言語ランタイム スタックを選択します。
    インスタンス サイズ 既定値 アプリの各インスタンスに割り当てられるインスタンス メモリの量を決定します。 詳細については、「 インスタンスのサイズ」を参照してください。
  5. [ ストレージ ] ページで、新しい既定の ホスト ストレージ アカウント を作成する既定の動作をそのまま使用するか、既存のストレージ アカウントを使用することを選択します。

  1. [ 監視 ] ページで、[ Application Insights を有効にする] が選択されていることを確認します。 新しい Application Insights インスタンスを作成する場合は既定値をそのまま使用するか、既存のインスタンスを使用することを選択します。 Application Insights インスタンスを作成するときに、Log Analytics Workspace を選択するように求められます。

  2. [ 認証 ] ページで、 認証の種類 をすべてのリソース のマネージド ID に変更します。 このオプションを使用すると、ユーザー割り当てマネージド ID も作成されます。アプリは、Microsoft Entra ID認証を使用してこれらのAzure リソースにアクセスするために使用します。 Microsoft Entra IDを使用するマネージド ID は、Azure リソースに接続するための最高レベルのセキュリティを提供します。

  3. 残りのタブの既定のオプションをそのまま使用し、[ 確認と作成 ] を選択して、選択したアプリ構成を確認します。

  4. 問題がなければ、[ 作成 ] を選択して、関数アプリと関連リソースをプロビジョニングしてデプロイします。

  5. ポータルの右上隅の [通知] アイコンを選択し、"デプロイメントに成功しました" というメッセージが表示されるまで待ちます。

  6. [リソースに移動] を選択して、新しい関数アプリを確認します。 また、ダッシュボードにピンを固定する を選択することもできます。 ピン留めすると、ダッシュボードからこの関数アプリ リソースに戻るのが容易になります。

    デプロイの通知のスクリーンショット。

MCP サーバー プロジェクトをデプロイする

Important

既存の関数アプリにデプロイすると、常にAzure内のアプリの内容が上書きされます。

  1. コマンド パレットで、「Azure Functions: Function App にデプロイするを入力して選択します。

  2. 作成したばかりの関数アプリを選びます。 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。

  3. デプロイが完了したら、View Output を選択して、作成したAzure リソースを含む作成とデプロイの結果を表示します。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。

    [出力の表示] ウィンドウのスクリーンショット。

  1. Pythonアプリでは、次のアプリ設定を追加する必要もあります。

    PYTHONPATH=/home/site/wwwroot/.python_packages/lib/site-packages

これで、サーバー プロジェクトをデプロイできます。

Important

既存の関数アプリにデプロイすると、常にAzure内のアプリの内容が上書きされます。

  1. コマンド パレットで、「Azure Functions: Function App にデプロイするを入力して選択します。

  2. 作成したばかりの関数アプリを選びます。 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。

  3. デプロイが完了したら、View Output を選択して、作成したAzure リソースを含む作成とデプロイの結果を表示します。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。

    [出力の表示] ウィンドウのスクリーンショット。


デプロイが完了すると、サーバーへの接続に関する通知がVisual Studio Codeに表示されます。 [ 接続 ] ボタンを選択して、エディターでサーバー接続情報を mcp.jsonに設定します。

組み込みのサーバー承認と認証を有効にする

次の手順では、サーバー アプリで組み込みの承認と認証機能を有効にし、id プロバイダーとしてMicrosoft Entra IDを構成する方法を示します。 完了したら、Visual Studio Codeでサーバーに接続してテストし、接続する前に認証を求めるメッセージが表示されることを確認します。

サーバー アプリで認証を構成する

  1. Azure ポータルでサーバー アプリを開き、左側のメニューから Settings>Authentication を選択します。

  2. ID プロバイダーとして [ID プロバイダーの追加>Microsoft] を選択します。

  3. [ アプリケーションとそのユーザーのテナントを選択する] で、[ Workforce configuration (current tenant)]\(ワークフォース構成 (現在のテナント)\) を選択します。

  4. [ アプリの登録] で、 次の設定を使用します。

    Setting [選択]
    アプリの登録の種類 新しいアプリの登録を作成する
    名前 アプリのわかりやすい名前を入力します
    クライアント シークレットの有効期限 推奨: 180 日
    サポートされているアカウントの種類 現在のテナント - シングル テナント
  5. <c0>追加チェック:</c0>で、<c1>クライアント アプリケーション要件</c1>の項目で、

  6. App Service の認証設定で、次の設定を使用します。

    Setting [選択]
    アクセスを制限する 認証を要求する
    認証されていない要求 HTTP 401 未認証: API での使用に推奨
    トークン ストア チェック ボックスをオンにすると、トークンの更新が許可されます
  7. [] を選択し、[] を追加します。 設定が反映されると、次の結果が表示されます。

    [認証が必要] が選択され、認証されていない要求に対して [HTTP 401 Unauthorized] が設定されていることを示す App Service 認証設定のスクリーンショット。

Visual Studio Codeをクライアントとして事前認証する

  1. Microsoft の横にある Entra アプリの名前を選択 します。 このアクションにより、Entra アプリ リソースの 概要 が表示されます。

  2. 左側のメニューで、[ 管理] -> [API の公開] を探します。

  3. [ 承認済みクライアント アプリケーション] で、[ +クライアント アプリケーションの追加] を選択します。

  4. Visual Studio Codeのクライアント ID aebc6443-996d-45c2-90f0-388ff96faa56 を入力します。

  5. スコープの前にある api://abcd123-efg456-hijk-7890123/user_impersonationのようなボックスを選択します。

  6. アプリケーション追加を選択します。

保護されたリソース メタデータを構成する (プレビュー)

  1. 同じ [API の公開 ] ビューで、[ スコープ ] セクションを見つけて、管理者とユーザーが Entra アプリに同意できるようにするスコープをコピーします。 この値は api://abcd123-efg456-hijk-7890123/user_impersonationのようになります。

  2. 前と同じコマンドを実行して、 WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPES設定を追加します。

    az functionapp config appsettings set --name <function-app-name> --resource-group <resource-group-name> --settings "WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPES=<scope>"
    
  3. また、[ API の公開 ] ビューで、上部にある アプリケーション ID URI ( api://abcd123-efg456-hijk-7890123 など) を見つけて、後の手順で保存します。

サーバーに接続する

mcp.json ディレクトリ内の.vscodeを開きます。

展開後のポップアップで Connect を選択すると、Visual Studio Codeサーバー接続情報がファイルに入力されます。

この手順を実行しない場合は、 出力 (Ctrl/Cmd+Shift+U) を開いて、デプロイ ログの最後にあるインライン接続ボタンを見つけることもできます。

接続情報を手動で追加することもできます。

  1. 次のコマンドを実行して、サーバー ドメインを取得します。

    az functionapp show --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --query "defaultHostName" --output tsv
    
  2. Visual Studio Codeでコマンド パレットを開き、MCP: Add Server... を検索して実行します。 コマンドを実行し、次のプロンプトに従います。

    Prompt 推奨事項
    追加するサーバーの種類 HTTP
    MCP サーバーの URL https://<FUNCTION_APP_NAME>.azurewebsites.azurewebsites.net/runtime/webhooks/mcp
    サーバー名 remote-mcp-server
    サーバーをインストールする場所 Workspace
  3. Visual Studio Code は mcp.json 設定ファイルを開きます。

認証の構成方法に応じて、次のセクションの手順に従ってサーバーに接続します。

組み込みの認証と承認を使用する

  1. サーバー名の上にある [スタート ] ボタンを選択して、リモート サーバーを起動します。

  2. Microsoftでの認証に関するメッセージが表示されたら、Allowを選択し、Azureポータルにログインに使用したメールアドレスでサインインしてください。

  3. サーバーに正常に接続すると、サーバー名の上に使用可能なツールの数が表示されます。

  4. エージェント モードVisual Studio Code Copilotチャットを開き、質問します。 たとえば、「 Greet with #your-remote-mcp-server-name 」のように入力します。

  5. テストが完了したら、サーバーを停止します。

Visual Studio Codeがリモート MCP サーバーに接続しようとするとどうなるかを詳しく理解するには、Server 承認プロトコルを参照してください。

アクセスキー付き

組み込みの認証と承認を有効にせず、代わりにアクセス キーを使用して MCP サーバーに接続する場合、 mcp.json には、サーバー登録の要求ヘッダーに Functions アクセス キーが含まれている必要があります。

Visual Studioサーバーを起動すると、アクセス キーが自動的に設定されます。

mcp.json ファイルは次の例のようになります。

{
	"servers": {
		"remote-mcp-server": {
			"type": "http",
			"url": "https://${input:functionapp-domain}/runtime/webhooks/mcp",
			"headers": {
				"x-functions-key": "${input:functions-key}"
			}
		}
	},
	"inputs": [
		{
			"type": "promptString",
			"id": "functions-key",
			"description": "Functions App Key",
			"password": true
		},
		{
			"type": "promptString",
			"id": "functionapp-domain",
			"description": "The domain of the function app.",
			"password": false
		}
	]
}

アクセス キーを自分で見つけたい場合は、Azure ポータルで Function アプリに移動します。 左側のメニューで、 Functions -> アプリ キーを見つけます。 [システム キー] セクションで、 mcp_extensionという名前のファイルを見つけます。

ヒント

接続ログを表示するには、サーバー名に移動し、 その他>出力を選択します。 クライアント (Visual Studio Code) とリモート MCP サーバー間の相互作用の詳細については、歯車アイコンを選択し、Trace を選択します。

選択されている _Trace_ ログ レベルを示す MCP サーバー設定のスクリーンショット。

ツールを使用するように Microsoft Foundry エージェントを構成する

Foundry でagent を構成して、Azure Functionsでホストされている MCP サーバーによって公開されるツールを使用できます。

  1. Foundry ポータルで、Functions でホストされている MCP サーバーで構成するエージェントを見つけます。

  2. [ ツール] で [ 追加 ] ボタンを選択し、[ + 新しいツールの追加] を選択します。

  3. [ カスタム ] タブを選択し、[ モデル コンテキスト プロトコル (MCP)] と [ 作成 ] ボタンを選択します。

  4. 次の情報を入力します。

    • 名前: サーバーの名前
    • リモート MCP サーバー エンドポイント:
      • MCP 拡張サーバー: https://<server domain>/runtime/webhooks/mcp
      • セルフホステッド サーバー: https://<server domain>/mcp
    • 認証: [Microsoft Entra] を選択します
    • 種類: [Project Managed Identity]\(プロジェクトマネージド ID\) を選択します
    • 対象ユーザー: これは、保護されたリソース メタデータの構成からの Entra アプリ ID URI です

    例えば次が挙げられます。

    MCP サーバーに接続するための Foundry エージェントの構成を示す図。

  5. 接続を選択します。

  6. チャット ウィンドウのサーバー ツールの助けを借りて回答できる質問をしてテストします。

サーバー承認プロトコル

Visual Studio Codeからのデバッグ出力には、MCP クライアントとサーバーが対話するときに一連の要求と応答が表示されます。 組み込みの MCP サーバー承認を使用すると、次の一連のイベントが表示されます。

  1. エディターは、初期化要求を MCP サーバーに送信します。
  2. MCP サーバーは、承認が必要であることを示すエラーで応答します。 応答には、アプリケーションの保護されたリソース メタデータ (PRM) へのポインターが含まれます。 組み込みの承認機能により、サーバー アプリの PRM が生成されます。
  3. エディターは PRM をフェッチし、それを使用して承認サーバーを識別します。
  4. エディターは、承認サーバー上の既知のエンドポイントから承認サーバー メタデータ (ASM) を取得しようとします。
  5. Microsoft Entra IDは既知のエンドポイントで ASM をサポートしていないため、エディターは OpenID Connect メタデータ エンドポイントを使用して ASM を取得するためにフォールバックします。 他のパス情報の前に既知のエンドポイントを挿入することで、これを検出しようとします。
  6. OpenID Connect 仕様では、実際には、既知のエンドポイントがパス情報の後にあると定義されており、ここでMicrosoft Entra IDがホストします。 そのため、エディターはその形式でもう一度試みます。
  7. エディターは ASM を正常に取得します。 その後、この情報を独自のクライアント ID と共に使用してサインインを実行します。 この時点で、エディターによって、サインインしてアプリケーションに同意するように求められます。
  8. 正常にサインインして同意すると、エディターによって認証が完了します。 MCP サーバーに対して初期化要求が繰り返されます。今回は、要求に承認トークンが含まれます。 この再試行はデバッグ出力レベルでは表示されませんが、トレース出力レベルで確認できます。
  9. MCP サーバーはトークンを検証し、初期化要求に対する正常な応答で応答します。 標準の MCP フローはこの時点から継続され、最終的にこのサンプルで定義されている MCP ツールが検出されます。

トラブルシューティング

問題が発生した場合は、GitHub Copilotにお問い合わせください。 トラブルシューティングのための具体的なアイデアを次に示します。

現時点では他のアイデアはありません。 発生したエラーについては、Copilotチャットに問い合わせるようにしてください。

次のステップ

Azure FunctionsホストされているMCPサーバーをAzure APIセンターで登録する方法を学ぶ。