Model Context Protocol (MCP) Binding Extension を使用すると、Azure Functions をリモート MCP サーバーとして動作させることができます。この拡張機能には、MCP のツール、リソース、プロンプトを公開するための 3 種類のトリガーがあります。
3 種類の MCP トリガー
| トリガー | 役割 | MCP クライアントからの利用方法 | 主な用途 |
|---|---|---|---|
| MCP ツール トリガー | MCP クライアントからの要求に応じて関数を実行し、処理結果を返します | tools/list で検出し、tools/call で呼び出します |
データの保存や検索、外部 API の呼び出しなど、AI エージェントに実行させる処理 |
| MCP リソース トリガー | URI で識別される情報を MCP リソースとして公開します | resources/list で検出し、resources/read で取得します |
ファイルの内容、データベース スキーマ、API ドキュメント、MCP Apps のユーザー インターフェイスなど、モデルへ渡すコンテキスト |
| MCP プロンプト トリガー | 再利用可能なメッセージや指示を MCP プロンプトとして公開します | prompts/list で検出し、prompts/get で取得します |
コード レビューや要約など、利用者が選択して使用する定型プロンプト |
ツールは AI エージェントがタスクを実行するために使用し、リソースはモデルへ渡すコンテキストを提供します。一方、プロンプトは利用者が明示的に選択する再利用可能な指示です。なお、MCP プロンプト トリガーは 2026 年 9 月時点でパブリック プレビューです。
本記事で扱う範囲
本記事では、3 種類のうち MCP ツール トリガーを扱います。MCP ツール トリガーは、MCP クライアントからツールが呼び出されたタイミングで関数を実行するトリガーです。TypeScript / JavaScript / C# / Python / Java で実装した処理を MCP ツールとして公開できます。
本記事では、Azure Functions のサンプル リポジトリ remote-mcp-functions-typescript を使用し、TypeScript で MCP ツール トリガーを作成します。また、Azure へのデプロイ、VS Code と GitHub Copilot からツールを呼び出す手順を紹介します。
動作の仕組み
ここでは、本記事で使用する VS Code と GitHub Copilot を例に、利用者の操作と MCP ツール トリガーの動作を説明します。後述の手順で MCP サーバーを VS Code に登録すると、利用者は HTTP 要求を直接作成する必要はありません。Copilot チャットへ自然言語で依頼すると、GitHub Copilot が必要な MCP ツールを選択して呼び出します。
具体例として、本記事ではコード スニペットを保存・取得する MCP ツールを使用します。コード スニペットとは、配列を並べ替える関数や日付を変換する処理など、後から再利用できるように保存しておく短いソース コードのまとまりです。
サンプルには、コード スニペットを名前付きで Azure Blob Storage に保存する savesnippet ツールと、保存したコードを取得する getsnippets ツールが用意されています。以下では、TypeScript の配列を昇順に並べ替える関数を GitHub Copilot に生成させ、sortAscending という名前で保存してから、同じコードを取得します。
利用者の操作例
VS Code で、Windows の既定のキーボード ショートカット Ctrl+Alt+I を押して Chat view を開き、Agent Mode を選択します。タイトル バーのチャット アイコン、またはコマンド パレットの Chat: Open Chat から開くこともできます。
1 | TypeScript で配列を昇順ソートする関数を書いて、 |
GitHub Copilot は依頼内容からコードを生成し、MCP サーバーが公開している savesnippet ツールを選択します。ツールには、概ね次の引数が渡されます。
1 | snippetname: sortAscending |
MCP ツール トリガーによって Azure Functions の関数が実行され、サンプルではコードが Azure Blob Storage に保存されます。実行が完了すると、Copilot チャットにツールの実行結果と保存が完了した旨の回答が表示されます。
1 | 表示例: |
続けて、同じ Copilot チャットに次のように入力できます。
1 | "sortAscending" のスニペットを取得して |
今度は getsnippets ツールが呼び出されます。Azure Blob Storage に保存されている sortAscending のコードがツールの実行結果として返り、GitHub Copilot がその内容をチャットに表示します。
1 | // 表示例 |
実際のコードや回答の文言は、使用するモデルや会話の内容によって異なります。また、VS Code の設定によっては、ツールを実行する前に確認が表示されます。
操作の裏側で行われる処理
上記の操作では、概ね以下の処理が行われます。
- MCP サーバーへの接続: VS Code が
.vscode/mcp.jsonの設定を使用し、Function App の MCP エンドポイントへ接続します。 - 利用可能なツールの取得: VS Code が
tools/listを呼び出します。MCP Binding Extension は、savesnippetやgetsnippetsなどのツール名、説明、入力スキーマを返します。 - チャットへの依頼: 利用者が Copilot チャットへ自然言語で依頼します。GitHub Copilot はツールの説明と会話の内容から、実行するツールと引数を決定します。
- ツールの呼び出し: VS Code が
tools/callを使用して、選択されたツール名と引数を Function App へ送信します。 - 関数の実行: MCP Binding Extension が要求を対応する関数へルーティングします。関数はデータの保存や取得など、ツール固有の処理を実行します。
- チャットへの結果表示: 関数の戻り値が MCP のレスポンスとして VS Code へ返ります。GitHub Copilot は結果を受け取り、処理結果や取得したデータをチャットに表示します。
このように、利用者が操作する場所は Copilot チャットです。MCP Binding Extension が tools/list や tools/call などのプロトコル処理を担うため、関数コードではツール固有の処理に集中できます。
この環境を構築することで何ができるか
1. AI エージェントに独自ツールを提供できる
構築した MCP サーバーは、MCP に対応した AI クライアントから呼び出せるカスタムツール群として機能します。
| クライアント | 利用例 |
|---|---|
| VS Code + GitHub Copilot(Agent Mode) | .vscode/mcp.json にサーバーを登録し、Copilot チャットから自然言語でツールを呼び出す |
| その他の MCP 対応クライアント | Streamable HTTP トランスポートをサポートする任意のクライアント(一般的に公開されているサービス、自作エージェント 等)から接続できる |
2. 既存の Azure サービスを AI から操作できる
MCP ツール トリガーで実行する関数から、Azure Functions の入力・出力バインディングや Azure SDK を使用して Azure サービスへ接続できます。
本記事のサンプルでは、Copilot チャットから依頼すると、生成されたコードを Blob Storage に保存し、保存済みのコードを取得してチャットに表示できます。
3. サーバーレスの恩恵をそのまま受けられる
MCP サーバーを常時稼働のサーバーで運用する必要がありません。Azure Functions により以下のメリットが得られます。
- 自動スケーリング: リクエスト量に応じて自動でスケールアウト
- 従量課金: 実行時間分だけの課金(Flex Consumption プラン、Consumption プラン)
- メンテナンス不要: OS パッチ・ランタイム更新は Azure が管理
4. 社内システムや独自 API を AI から利用できる
MCP ツールのハンドラー関数は通常の関数であるため、社内 API や外部 REST API への呼び出しを含む任意のロジックを実装できます。(本記事では、任意の API の実装例は割愛させていただきます)
5. マルチモーダルなレスポンスを返せる
テキスト以外に、画像・QR コード・構造化データなど多様なコンテンツを AI クライアントに返すこともできます。以下に、今回使用するサンプルからの一例をご紹介します。
generateQrCodeツール ― テキストから QR コード PNG を生成して返すgetImageWithMetadataツール ― 画像と構造化メタデータを同時に返すresourceLinkツール ― リソースへの参照リンクを返す
MCP と Azure Functions の関係
Azure Functions の MCP サポートには 2 つの方式があります。
| 方式 | サポート状況 | 実装方法 |
|---|---|---|
| MCP Binding Extension(app.mcpTool を使用) | GA(一般提供) | Azure Functions のトリガー/バインディング |
| Self-hosted MCP servers(MCP SDK + Express) | パブリック プレビュー (2026/09 時点) | Custom Handlers + MCP SDK |
両方式の詳細な比較(サポート言語・ステートフル実行の対応状況など)は Azure Functions で AI ツールとモデルを使用する - リモート MCP サーバー を参照してください。
本記事では GA 提供の MCP Binding Extension 方式を扱います。
エンドポイント構成
デプロイした Function App には以下の MCP エンドポイントが自動的に作成されます。認証には mcp_extension システムキーを ?code=<key> クエリパラメータで渡します。
Streamable HTTP (推奨)https://<function-app-name>.azurewebsites.net/runtime/webhooks/mcp
SSEhttps://<function-app-name>.azurewebsites.net/runtime/webhooks/mcp/sse
作成手順
前提条件
以下のツールをインストールしてください。
| ツール | 用途 |
|---|---|
| Node.js | ランタイム (サンプルリポジトリの要件として v18 以上) |
| Azure Functions Core Tools | ローカル実行・デプロイ (サンプルリポジトリの要件として v4.0.7030 以上) |
| Azure Developer CLI(azd) | インフラプロビジョニング |
| Azure CLI(az) | リソース操作 |
| Git | リポジトリクローン |
| VS Code + GitHub Copilot 拡張機能 | MCP サーバーへの接続・ツール呼び出し(「VS Code + GitHub Copilot での接続」セクションのみ必須) |
また、アクティブな Azure サブスクリプションが必要です。
GitHub Copilot の料金について: GitHub Copilot は有料サービスです。ただし、GitHub 個人アカウントであれば無料枠 (Copilot Free) が利用可能で、MCP ツールの動作確認程度であれば無料枠で対応できます。詳細は GitHub Copilot の料金ページ を参照してください。
環境構築
Step 1: リポジトリのクローン
1 | git clone https://github.com/Azure-Samples/remote-mcp-functions-typescript.git |
注意: サンプルリポジトリのルートには複数のサンプルプロジェクトが含まれています。MCP Binding Extension を使う場合は
mcp-tools/サブディレクトリを使用します。
Step 2: 依存関係のインストールとビルド
1 | npm install |
ビルドが成功すると dist/ ディレクトリに JavaScript ファイルが生成されます。
Step 3: package.json と host.json の確認
package.json の main フィールドを確認します。
1 | { |
Azure Functions はこの index.js ファイルのみをエントリポイントとして読み込みます。独自の新しいツールを追加した場合は必ず src/index.ts に import を追記してください。
host.json で Extension Bundle のバージョンを確認します。
1 | { |
MCP Binding Extension を使用するには Microsoft.Azure.Functions.ExtensionBundle.Preview v4.x が必要です (通常版 Microsoft.Azure.Functions.ExtensionBundle ではありません)。
Step 4: Azure へデプロイ
1 | # Azure にログイン |
デプロイ後、作成された Function App 名を控えておきます。
Step 5: mcp_extension システムキーの取得
MCP エンドポイントへのアクセスには mcp_extension システムキーが必要です。Azure CLI または Azure Portal のいずれかで取得できます。
方法 A: Azure CLI
1 | az functionapp keys list --name <function-app-name> --resource-group <resource-group-name> --query "systemKeys.mcp_extension" -o tsv |
方法 B: Azure Portal
- Azure Portal を開く
- 対象の Function App を選択
- 左メニューの 「関数」 → 「アプリ キー」 を選択
- 「システム キー」 の
mcp_extensionにあるコピーボタンでキーをコピー
注意: ホスト キー(
default)では認証に失敗します。必ずシステム キーのmcp_extensionを使用してください。
このキーが MCP エンドポイントへのアクセスに必要な認証キーです。
実行状況を確認する
デプロイが完了すると、MCP サーバーが稼働している状態になります。VS Code と GitHub Copilot から接続してツールを実行します。
前提: 「環境構築手順」の Step 5 で取得した
mcp_extensionシステムキーが手元にあること。
VS Code + GitHub Copilot での接続
MCP サーバーを使いたいプロジェクト (ワークスペース) のルートフォルダに .vscode/mcp.json を作成します。これは VS Code がそのワークスペース専用の MCP サーバー設定を読み込むためのファイルです。
.vscodeフォルダが存在しない場合は新規作成してください。サンプルリポジトリ(remote-mcp-functions-typescript/mcp-tools)の中に作成しても、別の任意のプロジェクトフォルダに作成しても構いません。
.vscode/mcp.json に以下の内容を記述します。
1 | { |
注意: 認証キーをリポジトリにコミットしない:
.vscode/mcp.jsonに記載したmcp_extensionキーが Git リポジトリに混入しないよう、.gitignoreに.vscode/mcp.jsonを追加してください。
ファイルを保存すると VS Code が設定を読み込みます。接続後のツール実行方法については、冒頭の「利用者の操作例」を参照してください。
次の画像は、コード スニペットを保存した後、同じ Copilot チャットで「上記はどこに保存されましたか?」と続けて質問した例です。GitHub Copilot はそれまでの会話を踏まえ、Blob Storage の出力バインディングを確認し、保存先のコンテナー名とファイル名を回答しています。

このように、ツールの実行結果が表示された後も、同じチャットの入力欄から続けて質問や依頼を入力できます。「上記」のような表現で直前の結果を参照したり、取得や別の処理を依頼したりできます。実際の回答内容は、使用するモデルや会話の内容によって異なります。
その他の MCP クライアントからの接続
Azure Functions MCP サーバーは MCP プロトコルの Streamable HTTP トランスポートに準拠しています。そのため、VS Code + GitHub Copilot 以外にも、MCP プロトコルをサポートする任意のクライアントから接続できます。
接続に必要な情報は以下の 2 つです。
| 項目 | 設定値 |
|---|---|
| Transport Type | Streamable HTTP |
| URL | https://<function-app-name>.azurewebsites.net/runtime/webhooks/mcp?code=<key> |
よくお問い合わせいただく動作
MCP ツールの実行がタイムアウトする
プロンプトを入力した後、AI モデルが質問を解釈する、使用するツールを選択する、回答を生成するといった AI 側の処理時間は、MCP ツール トリガーから別の Azure Functions トリガーへ移譲できません。MCP ツール トリガーが実行されるのは、AI エージェントなどの MCP クライアントがツールを呼び出した後です。詳細は Azure Functions の MCP ツール トリガー を参照してください。
一方、ツールが呼び出された後に MCP ツール トリガーの関数内で行う処理は、Queue Storage や Service Bus へメッセージを送信し、Queue Storage トリガーや Service Bus トリガーで継続できます。たとえば、MCP ツール トリガーの関数から別の AI モデルや AI API を呼び出しており、その処理に時間がかかる場合は、この方式で移譲できます。
この場合、MCP ツールからは処理を受け付けたこととジョブ ID を返し、別の MCP ツールで状態や結果を取得する構成にします。元のツール呼び出しが、移譲先の処理完了後に自動的に最終結果を返すわけではありません。また、結果取得用ツールを MCP クライアントが自動的に再実行するかどうかは、利用するクライアントやエージェントの動作に依存します。
この構成は 非同期要求-応答パターン に相当します。Azure Functions で長時間実行される処理をキューへ渡して早く応答する考え方については、Azure Functions のパフォーマンスと信頼性の向上 - 実行時間の長い関数を回避する を参照してください。Azure Functions 自体の実行タイムアウトはホスティング プランによって異なるため、Azure Functions のスケールとホスティング - 関数アプリのタイムアウト期間 も確認してください。
追加したツールが tools/list に表示されない
TypeScript のサンプルでは、package.json の main で指定された dist/src/index.js がエントリ ポイントです。ツールを追加したファイルが src/index.ts から import されていることを確認し、再度ビルドしてからデプロイしてください。
MCP エンドポイントへの接続時に 401 が返る
次の点を確認してください。
- ホスト キーではなく、
mcp_extensionシステム キーを使用しているか - URL の
codeクエリ パラメーターにシステム キーを設定しているか - App Service Authentication / Authorization (Easy Auth) が要求を拒否していないか
応用: 独自ツールを追加する
app.mcpTool() を使って独自のビジネスロジックを持つツールを追加できます。本記事ではサンプルリポジトリと同様 TypeScript での手順を紹介させていただきましたが、他の言語でも実装いただけます。実装方法の詳細は以下の Microsoft 公式ドキュメントを参照してください。
- Azure Functions の MCP ツール トリガー リファレンス(TypeScript)
- クイックスタート: Azure Functions を使用してカスタム リモート MCP サーバーを構築する
まとめ
本記事では、MCP ツール トリガーの基本動作、TypeScript サンプルの作成とデプロイ、MCP クライアントからの動作確認、運用時の留意点を紹介しました。MCP Binding Extension を利用することで、プロトコル処理を個別に実装せず、Azure Functions の関数を AI エージェントから呼び出せるツールとして公開できます。
参考ドキュメント
Azure Functions MCP ツール トリガー リファレンス
https://learn.microsoft.com/azure/azure-functions/functions-bindings-mcp-tool-trigger?pivots=programming-language-typescriptクイックスタート: Azure Functions を使用してカスタム リモート MCP サーバーを構築する
https://learn.microsoft.com/ja-jp/azure/azure-functions/scenario-custom-remote-mcp-serverサンプルリポジトリ(TypeScript)
https://github.com/Azure-Samples/remote-mcp-functions-typescriptAzure Functions での AI ツールとモデルの使用(MCP Binding Extension と Self-hosted MCP servers の比較表を含む)
https://learn.microsoft.com/azure/azure-functions/functions-create-ai-enabled-apps
2026 年 9 月 7 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。