この記事では、Azure Functions でリモート モデル コンテキスト プロトコル (MCP) サーバーをホストする方法について説明します。 また、組み込みの認証を使用してサーバー エンドポイントの承認を構成し、AI ツールのセキュリティを強化する方法についても説明します。
Azure Functions でリモート MCP サーバーをホストするには、次の 2 つの方法があります。
| MCP サーバー オプション | Description | 最適なシナリオ |
|---|---|---|
| MCP 拡張サーバー | Azure Functions MCP 拡張機能を使用してカスタム MCP サーバーを作成します。この場合、拡張機能トリガーを使用してツール エンドポイントを定義できます。 これらのサーバーは、すべての Functions 言語でサポートされ、他の関数アプリとして開発、展開、および管理されます。 | Functions とその バインド ベースのプログラミング モデルについて既に理解している場合。 |
| セルフホステッド サーバー | Functions では、標準の MCP SDK を使用して作成された MCP サーバー プロジェクトをホストできます。 | 公式の MCP SDK を使用してサーバーを既に構築しており、Azure でイベントドリブン、サーバーレス、スケーラブルなホスティングを探している場合。 |
注
公式の MCP SDK を使用して作成した MCP サーバーを Azure Functions でホストする機能は、現在プレビュー段階です。
このチュートリアルでは、Functions でサポートされる両方の MCP サーバー オプションについて説明します。 シナリオに最適なタブを選択します。
このチュートリアルでは、Visual Studio Code を使用して次の操作を行います。
- MCP 拡張機能を使用して MCP サーバー プロジェクトを作成します。
- MCP サーバーをローカルで実行して確認します。
- Azure で関数アプリを作成します。
- MCP サーバー プロジェクトをデプロイします。
- 組み込み認証を有効にします。
Important
この記事では現在、C#、Python、TypeScript のみがサポートされています。 クイック スタートを完了するには、記事の上部にあるサポートされているこれらの言語のいずれかを選択します。
この記事は、Azure Functions の Node.js プログラミング モデルのバージョン 4 に対応しています。
この記事は、Azure Functions の Python プログラミング モデルのバージョン 2 に対応しています。
[前提条件]
Visual Studio Code と次の拡張機能:
Azure Functions 拡張機能。 この拡張機能には Azure Functions Core Tools が 必要であり、使用できない場合はインストールを試みます。
Azure CLI。 Azure Cloud Shell で Azure CLI コマンドを実行することもできます。
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
MCP サーバー プロジェクトを作成する
Visual Studio Code を使用して、任意の言語で MCP サーバー プロジェクトをローカルに作成します。
Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド
Azure Functions: Create New Project...を検索して実行します。プロジェクト ワークスペースのディレクトリの場所を選択し、[選択] を選択します。 新しいフォルダーを作成するか、プロジェクト ワークスペースの空のフォルダーを選択する必要があります。 ワークスペースに最初から含まれているプロジェクト フォルダーは選択しないでください。
プロンプトで、次の情報を入力します。
Prompt [選択] プロジェクトの種類を選択する [ C#] を選択します。Select a .NET runtime (.NET ランタイムを選択してください) [ .NET 8.0 LTS] を選択します。プロジェクトの最初の関数のテンプレートを選択します [ MCP Tool trigger] を選択します。関数に名前を指定します 「 McpTrigger」と入力します。名前空間を指定する 「 My.Functions」と入力します。承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。プロジェクトを開く方法を選択してください [ Open in current window] を選択します。
プロンプトで、次の情報を入力します。
Prompt [選択] プロジェクトの種類を選択する [ TypeScript] を選択します。プロジェクトの最初の関数のテンプレートを選択します [ MCP Tool trigger] を選択します。関数に名前を指定します 「 mcpToolTrigger」と入力します。承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。プロジェクトを開く方法を選択してください [ Open in current window] を選択します。
プロンプトで、次の情報を入力します。
Prompt [選択] プロジェクトの種類を選択する [ Python] を選択します。仮想環境を作成する Python インタープリターを選択する 任意の Python インタープリターを選択します。 オプションが表示されない場合は、Python バイナリの完全パスを入力してください。 プロジェクトの最初の関数のテンプレートを選択します [ MCP Tool trigger] を選択します。作成する関数の名前 「 mcp_trigger」と入力します。承認レベル リモート MCP サーバーに接続するときにアクセス キーが必要な FUNCTIONを選択します。プロジェクトを開く方法を選択してください [ Open in current window] を選択します。
この情報を使用して、Visual Studio Code は MCP サーバー トリガーのコード プロジェクトを生成します。 ローカル プロジェクト ファイルは、エクスプローラーで表示できます。
MCP サーバーをローカルで起動する
関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。
local.setting.jsonで、
"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド パレットで、
Azurite: Startを検索して選択します。下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。
ローカルでの実行を開始するには、 F5 キーを押します。
関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。
local.setting.jsonで、
"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド パレットで、
Azurite: Startを検索して選択します。下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。
ローカルでの実行を開始するには、 F5 キーを押します。
関数アプリを実行するには、ストレージ コンポーネントが必要です。 サーバーを起動する前に、ローカル ストレージ エミュレーターを起動します。
local.setting.jsonで、
"AzureWebJobsStorage": "UseDevelopmentStorage=true"があることを確認します。Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド パレットで、
Azurite: Startを検索して選択します。下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、サーバーをローカルで実行できるようになりました。
ローカルでの実行を開始するには、 F5 キーを押します。
サーバーをテストする
.vscodeディレクトリを見つけて、mcp.jsonを開きます。 エディターは、サーバーの接続情報を追加する必要があります。サーバー名の上にある [スタート ] ボタンを選択して、サーバーを起動します。
サーバーに接続すると、サーバー名の上に使用可能なツールの数が表示されます。
エージェント モードで Visual Studio Code Copilot チャットを開き、質問します。 たとえば、「#your-local-server-name に挨拶する」といった具合です。 この質問は、Copilot がサーバーを利用して答えることを確実にします。
Copilot がローカル MCP サーバーからツールの実行を要求したら、[許可] を選択 します。
[ 停止] を選択してテストが完了したら、サーバーから切断し、ローカルでの実行を停止
Cntrl+C。
ヒント
[Copilot チャット] ウィンドウで、下部にあるツール アイコンを選択して、チャットに使用できるサーバーとツールの一覧を表示します。 テスト時にローカル MCP サーバーがチェックされていることを確認します。
リモート MCP サーバーの承認
リモート MCP サーバー エンドポイントの不正使用を減らすか防止するには、次の 2 つの方法があります。
| メソッド | Description |
|---|---|
| 組み込みのサーバー認証 (プレビュー) | 関数には、MCP 承認仕様プロトコルの OAuth 要件を実装する組み込みの App Service 認証と承認が含まれています。 サーバーにアクセスしようとしているクライアントは、接続を許可される前に、認証のために構成済みの ID プロバイダー (Microsoft Entra ID など) にリダイレクトされます。 このメソッドは、ツール エンドポイントの最高レベルのセキュリティを提供します。 |
| キーベースの認証 | 既定では、Functions はアクセス キー要件を実装するため、MCP サーバー ツールを使用しようとしているクライアントは、要求ヘッダーに共有秘密鍵の値を提示する必要があります。 OAuth ベースの認証と同じレベルのセキュリティは提供されませんが、アクセス キーを使用すると、パブリック ツールへのアクセスが困難になります。
Anonymous アクセス レベルを使用して、OAuth ベースの認証を使用するときにサーバーのアクセス キーを無効にします。 |
注
このチュートリアルには、組み込みのサーバー承認と認証機能の詳細な構成手順が含まれています。これは、他の記事では App Service 認証 とも呼ばれます。 この機能の概要と使用ガイダンスについては、 組み込みのサーバー承認の構成 (プレビュー) に関する記事を参照してください。
キーベース認証を無効にする
組み込みのサーバー承認機能は、Azure Functions とは別のコンポーネントです。 サーバー認証を使用する場合は、最初に匿名アクセスを許可してキーベースの認証を無効にすることをお勧めします。
MCP サーバーでホスト ベースの認証を無効にするには、system.webhookAuthorizationLevelを Anonymous ファイル内のhost.jsonに設定します。
{
"version": "2.0",
"extensions": {
"mcp": {
...
"system": {
"webhookAuthorizationLevel": "Anonymous"
}
}
}
}
Azure に関数アプリを作成する
MCP サーバーをホストする関数アプリを Azure の Flex Consumption プランに作成します。
Azure portal で、メニューまたは [ホーム] ページから [リソースの作成] を選択します。
[作業の開始] を選択し、[関数アプリ] で [作成] を選択します。
[ホスティング オプションの選択] で、[Flex 従量課金]>[選択] の順に選択します。
[ 基本 ] ページで、次の表に示すように関数アプリの設定を使用します。
Setting 推奨値 Description Subscription あなたのサブスクリプション 新しい関数アプリを作成するサブスクリプション。 リソース グループ myResourceGroup 関数アプリを作成する新しいリソース グループの名前。 関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、 a-z(大文字と小文字の区別をしない)、0-9、および-です。リージョン 優先リージョン 自分の近く、または関数がアクセスできる他のサービスの近くのリージョンを選択します。 サポートされていないリージョンは表示されません。 詳細については、「現在サポートされているリージョンを表示する」を参照してください。 ランタイム スタック 優先言語 サポートされている言語ランタイム スタックのいずれかを選択します。 Web 用 Visual Studio Code を使用したポータル内編集は現在、Node.js、PowerShell、Python アプリでのみ使用できます。 C# クラス ライブラリ、Java の関数はローカルで開発する必要があります。 バージョン 言語バージョン サポートされているバージョンの言語ランタイム スタックを選択します。 インスタンス サイズ 既定値 アプリの各インスタンスに割り当てられるインスタンス メモリの量を決定します。 詳細については、「 インスタンスのサイズ」を参照してください。 [ ストレージ ] ページで、新しい既定の ホスト ストレージ アカウント を作成する既定の動作をそのまま使用するか、既存のストレージ アカウントを使用することを選択します。
[ 監視 ] ページで、[ Application Insights を有効にする] が選択されていることを確認します。 新しい Application Insights インスタンスを作成する場合は既定値をそのまま使用するか、既存のインスタンスを使用することを選択します。 Application Insights インスタンスを作成すると、Log Analytics ワークスペースの選択も求められます。
[ 認証 ] ページで、 認証の種類 をすべてのリソース のマネージド ID に変更します。 このオプションを使用すると、Microsoft Entra ID 認証を使用してこれらの Azure リソースにアクセスするためにアプリが使用するユーザー割り当てマネージド ID も作成されます。 Microsoft Entra ID を持つマネージド ID は、Azure リソースに接続するための最高レベルのセキュリティを提供します。
残りのタブの既定のオプションをそのまま使用し、[ 確認と作成 ] を選択して、選択したアプリ構成を確認します。
問題がなければ、[ 作成 ] を選択して、関数アプリと関連リソースをプロビジョニングしてデプロイします。
ポータルの右上隅の [通知] アイコンを選択し、"デプロイメントに成功しました" というメッセージが表示されるまで待ちます。
[リソースに移動] を選択して、新しい関数アプリを確認します。 また、ダッシュボードにピンを固定する を選択することもできます。 ピン留めすると、ダッシュボードからこの関数アプリ リソースに戻るのが容易になります。
MCP サーバー プロジェクトをデプロイする
Important
既存の関数アプリにデプロイすると、Azure にあるそのアプリの内容が常に上書きされます。
コマンド パレットで、入力して [Azure Functions: 関数アプリにデプロイする] を選択します。
作成したばかりの関数アプリを選びます。 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。
デプロイの完了後、[出力の表示] を選択すると、作成済みの Azure リソースなど、作成とデプロイの結果が表示されます。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。
Python アプリでは、次のアプリ設定を追加する必要もあります。
PYTHONPATH=/home/site/wwwroot/.python_packages/lib/site-packages。
これで、サーバー プロジェクトをデプロイできます。
Important
既存の関数アプリにデプロイすると、Azure にあるそのアプリの内容が常に上書きされます。
コマンド パレットで、入力して [Azure Functions: 関数アプリにデプロイする] を選択します。
作成したばかりの関数アプリを選びます。 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。
デプロイの完了後、[出力の表示] を選択すると、作成済みの Azure リソースなど、作成とデプロイの結果が表示されます。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。
デプロイが完了すると、サーバーへの接続に関する通知が Visual Studio Code に表示されます。 [ 接続 ] ボタンを選択して、エディターでサーバー接続情報を mcp.jsonに設定します。
組み込みのサーバー承認と認証を有効にする
次の手順では、サーバー アプリで組み込みの承認と認証機能を有効にし、Id プロバイダーとして Microsoft Entra ID を構成する方法を示します。 完了したら、Visual Studio Code でサーバーに接続してテストを行い、接続する前に認証を求めるメッセージが表示されることを確認します。
サーバー アプリで認証を構成する
Azure portal でサーバー アプリを開き、左側のメニューから >認証] を選択します。
ID プロバイダーとして [ID プロバイダーの追加>Microsoft] を選択します。
[ アプリケーションとそのユーザーのテナントを選択する] で、[ Workforce configuration (current tenant)]\(ワークフォース構成 (現在のテナント)\) を選択します。
[ アプリの登録] で、 次の設定を使用します。
Setting [選択] アプリの登録の種類 新しいアプリの登録を作成する 名前 アプリのわかりやすい名前を入力します クライアント シークレットの有効期限 推奨: 180 日 サポートされているアカウントの種類 現在のテナント - シングル テナント [ 追加のチェック:] の [ クライアント アプリケーション要件 ] で、[ 特定のクライアント アプリケーションからの要求を許可する] を選択し、鉛筆アイコンを選択し、Visual Studio Code クライアント ID
aebc6443-996d-45c2-90f0-388ff96faa56を追加して、[ OK] を選択します。 他のセクションはそのままにしておきます。App Service の認証設定で、次の設定を使用します。
Setting [選択] アクセスを制限する 認証を要求する 認証されていない要求 HTTP 401 未認証: API での使用に推奨 トークン ストア チェック ボックスをオンにすると、トークンの更新が許可されます [] を選択し、[] を追加します。 設定が反映されると、次の結果が表示されます。
Visual Studio Code をクライアントとして事前認証する
Microsoft の横にある Entra アプリの名前を選択 します。 このアクションにより、Entra アプリ リソースの 概要 が表示されます。
左側のメニューで、[ 管理] -> [API の公開] を探します。
[ 承認済みクライアント アプリケーション] で、[ +クライアント アプリケーションの追加] を選択します。
Visual Studio Code のクライアント ID:
aebc6443-996d-45c2-90f0-388ff96faa56を入力します。スコープの前にある
api://abcd123-efg456-hijk-7890123/user_impersonationのようなボックスを選択します。アプリケーション追加を選択します。
保護されたリソース メタデータを構成する (プレビュー)
同じ [API の公開 ] ビューで、[ スコープ ] セクションを見つけて、管理者とユーザーが Entra アプリに同意できるようにするスコープをコピーします。 この値は
api://abcd123-efg456-hijk-7890123/user_impersonationのようになります。前と同じコマンドを実行して、
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>"また、[ API の公開 ] ビューで、上部にある アプリケーション ID URI (
api://abcd123-efg456-hijk-7890123など) を見つけて、後の手順で保存します。
サーバーに接続する
mcp.json ディレクトリ内の.vscodeを開きます。
デプロイ後にポップアップで [接続 ] を選択すると、Visual Studio Code によってファイルにサーバー接続情報が入力されます。
この手順を実行しない場合は、 出力 (Ctrl/Cmd+Shift+U) を開いて、デプロイ ログの最後にあるインライン接続ボタンを見つけることもできます。
接続情報を手動で追加することもできます。
次のコマンドを実行して、サーバー ドメインを取得します。
az functionapp show --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --query "defaultHostName" --output tsvVisual Studio Code でコマンド パレットを開き、 MCP: サーバーの追加... コマンドを検索して実行し、次のプロンプトに従います。
Prompt 推奨事項 追加するサーバーの種類 HTTP MCP サーバーの URL https://<FUNCTION_APP_NAME>.azurewebsites.azurewebsites.net/runtime/webhooks/mcpサーバー名 remote-mcp-server サーバーをインストールする場所 Workspace Visual Studio Code が
mcp.json設定ファイルを開きます。
認証の構成方法に応じて、次のセクションの手順に従ってサーバーに接続します。
組み込みの認証と承認を使用する
サーバー名の上にある [スタート ] ボタンを選択して、リモート サーバーを起動します。
Microsoft での認証のプロンプトが表示されたら、[ 許可] を選択し、メール (Azure portal へのログインに使用されたもの) でサインインします。
サーバーに正常に接続すると、サーバー名の上に使用可能なツールの数が表示されます。
エージェント モードで Visual Studio Code Copilot チャットを開き、質問します。 たとえば、「
Greet with #your-remote-mcp-server-name」のように入力します。テストが完了したら、サーバーを停止します。
Visual Studio Code がリモート MCP サーバーに接続しようとするとどうなるかを詳しく理解するには、「 サーバー承認プロトコル」を参照してください。
アクセスキー付き
組み込みの認証と承認を有効にせず、代わりにアクセス キーを使用して 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 portal の関数アプリに移動します。 左側のメニューで、 Functions -> アプリ キーを見つけます。 [システム キー] セクションで、 mcp_extensionという名前のファイルを見つけます。
ヒント
接続ログを表示するには、サーバー名に移動し、 その他>出力を選択します。 クライアント (Visual Studio Code) とリモート MCP サーバーの間の相互作用の詳細については、歯車アイコンを選択し、[トレース] を選択 します。
ツールを使用するように Azure AI Foundry エージェントを構成する
Azure Functions でホストされている MCP サーバーによって公開されるツールを使用するように、 Azure AI Foundry 上のエージェントを構成できます。
Foundry ポータルで、Functions でホストされている MCP サーバーで構成するエージェントを見つけます。
[ ツール] で [ 追加 ] ボタンを選択し、[ + 新しいツールの追加] を選択します。
[ カスタム ] タブを選択し、[ モデル コンテキスト プロトコル (MCP)] と [ 作成 ] ボタンを選択します。
次の情報を入力します。
- 名前: サーバーの名前
- リモート MCP サーバー エンドポイント:
- MCP 拡張サーバー:
https://<server domain>/runtime/webhooks/mcp - セルフホステッド サーバー:
https://<server domain>/mcp
- MCP 拡張サーバー:
- 認証: [Microsoft Entra] を選択する
- 種類: [Project Managed Identity]\(プロジェクトマネージド ID\) を選択します
- 対象ユーザー: これは、保護されたリソース メタデータの構成からの Entra アプリ ID URI です
例えば次が挙げられます。
[接続] を選択します。
チャット ウィンドウのサーバー ツールの助けを借りて回答できる質問をしてテストします。
サーバー承認プロトコル
Visual Studio Code からのデバッグ出力には、MCP クライアントとサーバーが対話するときに一連の要求と応答が表示されます。 組み込みの MCP サーバー承認を使用すると、次の一連のイベントが表示されます。
- エディターは、初期化要求を MCP サーバーに送信します。
- MCP サーバーは、承認が必要であることを示すエラーで応答します。 応答には、アプリケーションの保護されたリソース メタデータ (PRM) へのポインターが含まれます。 組み込みの承認機能により、サーバー アプリの PRM が生成されます。
- エディターは PRM をフェッチし、それを使用して承認サーバーを識別します。
- エディターは、承認サーバー上の既知のエンドポイントから承認サーバー メタデータ (ASM) を取得しようとします。
- Microsoft Entra ID は既知のエンドポイントで ASM をサポートしていないため、エディターは OpenID Connect メタデータ エンドポイントを使用して ASM を取得するためにフォールバックします。 他のパス情報の前に既知のエンドポイントを挿入することで、これを検出しようとします。
- OpenID Connect の仕様では、実際には、既知のエンドポイントがパス情報の後にあると定義されており、Microsoft Entra ID でホストされています。 そのため、エディターはその形式でもう一度試みます。
- エディターは ASM を正常に取得します。 その後、この情報を独自のクライアント ID と共に使用してサインインを実行します。 この時点で、エディターによって、サインインしてアプリケーションに同意するように求められます。
- 正常にサインインして同意すると、エディターによって認証が完了します。 MCP サーバーに対して初期化要求が繰り返されます。今回は、要求に承認トークンが含まれます。 この再試行はデバッグ出力レベルでは表示されませんが、トレース出力レベルで確認できます。
- MCP サーバーはトークンを検証し、初期化要求に対する正常な応答で応答します。 標準の MCP フローはこの時点から継続され、最終的にこのサンプルで定義されている MCP ツールが検出されます。
トラブルシューティング
問題が発生した場合は、GitHub Copilot にヘルプを依頼してください。 トラブルシューティングのための具体的なアイデアを次に示します。
現時点では他のアイデアはありません。 発生したエラーについては、必ず Copilot チャットに問い合わせください。
次のステップ
Azure API Center で Azure Functions でホストされる MCP サーバーを登録する方法について説明します。