Getting Started with Remote MCP Servers using Azure Functions (Python) について
Azure Functions を使ってリモート MCP サーバーを構築・デプロイする Python のクイックスタートテンプレートです。旅行関連ツールを含み、ローカルとクラウドでの設定に加え、HTTPS とキー認証、OAuth やネットワーク分離の選択肢を紹介します。
主な機能
- 01Python でリモート MCP サーバーを構築
- 02Azure Functions でローカル実行
- 03Azure Container Apps へデプロイ
- 04観光スポットとレビューの機能を公開
- 05キー、OAuth、ネットワーク分離の設定
活用シーン
- 01旅行情報 MCP サーバーの試作
- 02クライアントや Inspector で MCP ツールをローカル検証
- 03保護されたリモート MCP エンドポイントのデプロイ
MCP 対応
Azure Functions MCP 拡張機能により、注釈付き関数を SSE エンドポイント経由で MCP ツールとして公開します。クライアントはローカル環境またはデプロイ済みの Function アプリに接続し、クラウド利用時はキーを使用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Azure Functions(Python)を使用したリモート MCP サーバーのはじめ方
これは、Azure Functions と Python を使用して、カスタムのリモート MCP サーバーをクラウド上に簡単に構築してデプロイするためのクイックスタートテンプレートです。MCP サーバーはキーと HTTPS によって設計上安全に保護されており、組み込み認証や API Management を使用した OAuth の追加オプション、さらに VNET を使用したネットワーク分離にも対応しています。
注
大規模言語モデル(LLM)は非決定的であり、不正確な情報やリアルタイムの変更が生じる可能性があることに注意する必要があります。そのため、情報を再確認し、決定を下す前に検証することをおすすめします。
前提条件
- バージョン 3.11 以降の Python
- Azure Functions Core Tools
-
- Visual Studio Code を使用してローカルで実行およびデバッグする場合:
- Visual Studio Code
- Azure Functions 拡張機能
注:ここでは、旅行の詳細を呼び出して処理するために、Rapid API marketplace の Booking COM 旅行 API を使用しています。この API にはキーが必要です。そのため、キーを取得して使用するには、Booking COM API に登録する必要があります。
ローカル環境を準備する
このサンプルでは、Blob Storage からスニペットを保存および取得するため、Azure Storage エミュレーターが必要です。
-
Azurite を起動します
docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \ mcr.microsoft.com/azure-storage/azurite
注 VS Code 拡張機能から Azurite を使用する場合は、ここで
Azurite: Startを実行してください。実行しないとエラーが表示されます。
ターミナルから MCP サーバーをローカルで実行する
-
新しいターミナルウィンドウで src フォルダーに移動します:
cd src -
Python の依存関係をインストールします:
pip install -r requirements.txt -
Functions ホストをローカルで起動します:
func start
注 デフォルトでは、webhooks ルート
/runtime/webhooks/mcp/sseが使用されます。後ほど Azure では、クライアント/ホストからの呼び出しでキーを設定する際に、次のルートを使用します:/runtime/webhooks/mcp/sse?code=<system_key>
クライアント/ホストから MCP サーバーを使用する
VS Code - Copilot Edits
-
コマンドパレットから MCP サーバーを追加 を選択し、実行中の Function アプリの SSE エンドポイントの URL を追加します:
http://0.0.0.0:7071/runtime/webhooks/mcp/sse OR http://localhost:7071/runtime/webhooks/mcp/sse -
コマンドパレットから MCP サーバーを一覧表示 を選択し、サーバーを起動します
-
Copilot のチャットでエージェントモードを選択し、ツールを呼び出すプロンプトを入力します。例:コードを選択して、次のプロンプトを入力します
ここで選んだ場所の観光名所を教えてください<tour_name> のツアーのレビューを教えてください -
ツールの実行を求められたら、続行 をクリックして同意します
-
終了したら、ターミナルウィンドウで Ctrl+C を押して、Functions ホストのプロセスを停止します。
MCP Inspector
-
新しいターミナルウィンドウで MCP Inspector をインストールして実行します
npx @modelcontextprotocol/inspector -
CTRL キーを押しながらクリックして、アプリに表示された URL(例:http://0.0.0.0:5173/#resources)から MCP Inspector の Web アプリを開きます
-
トランスポートの種類を
SSEに設定します -
実行中の Function アプリの SSE エンドポイントの URL を設定し、接続 をクリックします:
http://0.0.0.0:7071/runtime/webhooks/mcp/sse -
ツールを一覧表示 を選択します。ツールをクリックし、ツールを実行 を選択します。
リモート MCP 用に Azure にデプロイする
このリンクに記載されている手順に従って、Azure Functions 用の新しい MCP 拡張機能を使用し、MCP Azure Functions サーバーをホストする Azure Container Apps リソースに Azure Functions をプロビジョニングします。
または
次の azd コマンドを実行して、必要な Azure リソースとともに関数アプリをプロビジョニングし、コードをデプロイします。
azd up
さらに、MCP サーバーのセキュリティとポリシーを強化するためにAPI Managementを使用できます。また、App Service の組み込み認証を使用して、Entra を含むお好みの OAuth プロバイダーを設定できます。
クライアントから関数アプリに接続する
新しくホストされた SSE エンドポイントを呼び出すには、クライアントにキーが必要です。エンドポイントは https://<function-name>.*****-****.<location>.azurecontainerapps.io の形式です。ホストされた関数では、デフォルトでシステムキーが必要です。このキーは、Storage account-> Blob containers -> azure-webjobs-secrets->host.json -> View/edit から取得できます。mcp_extension という名前のシステムキーの値を取得してください。
MCP Inspector の場合は、URL にキーを含めることができます。
`https://<function-name>.*****-****.<location>.azurecontainerapps.io/runtime/webhooks/mcp/sse?code=<your-mcp-extension-system-key>`.
VS Code 内の GitHub Copilot の場合は、代わりに mcp.json の x-functions-key ヘッダーとしてキーを設定し、URL には https://<function-name>.*****-****.<location>.azurecontainerapps.io/runtime/webhooks/mcp/sse を使用します。次の例では入力を使用しており、VS Code からサーバーを起動するときにキーの入力を求められます。
{
"inputs": [
{
"type": "promptString",
"id": "functions-mcp-extension-system-key",
"description": "Azure Functions MCP Extension System Key",
"password": true
}
],
"servers": {
"my-mcp-server": {
"type": "sse",
"url": "<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse",
"headers": {
"x-functions-key": "${input:functions-mcp-extension-system-key}"
}
}
}
}
ソースコード
get_attractions および get_attractions_reviews エンドポイントの関数コードは、src ディレクトリ内の Python ファイルで定義されています。MCP 関数アノテーションにより、これらの関数が MCP サーバーのツールとして公開されます。
以下は function_app.py ファイルの実際のコードです。
@app.generic_trigger(arg_name="context", type="mcpToolTrigger", toolName="hello",
description="Hello world.",
toolProperties="[]")
def hello_mcp(context) -> None:
"""
A simple function that returns a greeting message.
Args:
context: The trigger context (not used in this function).
Returns:
str: A greeting message.
"""
return "Hello I am MCPTool!"
@app.generic_trigger(
arg_name="context",
type="mcpToolTrigger",
toolName="get_attractions",
description="Retrieve attractions at a search location.",
toolProperties=tool_properties_get_attractions_json,
)
def get_attractions(context) -> str:
"""
Retrieves attractions at a search location using the RapidAPI endpoint.
Args:
context: The trigger context containing the input arguments.
Returns:
str: A JSON string containing the attractions or an error message.
"""
content = json.loads(context)
query = content["arguments"].get("query", "").strip()
language_code = content["arguments"].get("languagecode", "en-us").strip()
host.json ファイルには、この機能を使用するアプリに必要な、実験的なバンドルへの参照も含まれていることに注意してください。
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle.Experimental",
"version": "[4.*, 5.0.0)"
}
次のステップ
- MCP サーバーに API Management を追加する
- MCP サーバーに組み込み認証を追加する
- VNET_ENABLED=true フラグを使用して VNET を有効にする
- Microsoft の関連 MCP の取り組みについて詳しく確認する
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。