Azure FunctionsでMCP Appsをホストする機能が一般提供(GA)になりました。これにより、MCPサーバーの実行結果を文章やJSONだけで返すのではなく、グラフ、フォーム、ダッシュボードなどの対話型UIとして会話画面内に表示できます。(Microsoft Azure)
ただし、既存のFunction Appが自動的にMCP Appsへ変わるわけではありません。導入するには、MCPツールとUIリソースの関連付け、対応クライアントの確認、認証方式の選定、フロントエンド資産を含むデプロイ構成が必要です。
特に注意したいのは、MCP AppsのホスティングはGAでも、関連するすべての機能がGAとは限らないことです。本番展開前に、Microsoft Entra ID認証、コールドスタート、クライアント互換性まで確認する必要があります。
Azure FunctionsのAI/Copilot更新で何が変わるのか
2026年6月3日付の公式情報では、Azure FunctionsによるMCP Appsのホスティングが一般提供として案内されました。
MCP Appsは、MCPツールの実行結果を対話型のHTMLインターフェイスとして表示する仕組みです。Azure Functions MCP拡張機能のツールトリガーとリソーストリガーを組み合わせて実装します。(Microsoft Learn)
従来のテキスト中心のMCPサーバーとの違いは、次のとおりです。
| 比較項目 | 従来のMCPツール | MCP Apps |
|---|---|---|
| 主な出力 | テキスト、画像、JSONなど | HTML、JavaScriptを使った対話型UI |
| 操作方法 | 追加の指示を文章で入力 | ボタン、フォーム、フィルターなどを操作 |
| 得意な用途 | 検索、要約、単純な処理 | 可視化、設定、監視、複数手順の業務 |
| UIの配置 | 会話への文章出力 | MCPクライアントの会話画面内 |
| 必要な実装 | 主にツールトリガー | ツールトリガー、リソーストリガー、UIメタデータ |
| クライアント要件 | MCPツールに対応 | MCP Apps拡張にも対応している必要がある |
たとえば、Azureリソースの利用状況を調べるMCPツールの場合、従来は「東日本リージョンのコストは○円」と文章で返していました。MCP Appsでは、期間やリソースグループを切り替えられるグラフとして表示し、その場で条件を変更できます。
MCP Appsが表示される仕組み
Azure Functions上のMCP Appsは、概ね次の流れで動作します。
- MCPクライアントがツールを検出する
- ユーザーの指示に応じてツールトリガーが実行される
- ツールが構造化データを返す
- ツールのメタデータに指定された
ui://リソースをクライアントが取得する - リソーストリガーがHTMLとJavaScriptを返す
- クライアントが会話画面内にUIを描画する
ツール側では、UIリソースを次のようなメタデータで指定します。
{
"ui": {
"resourceUri": "ui://sales/dashboard.html"
}
}
リソーストリガー側では、同じURIを使用し、MCP App用のHTMLとして返します。
URI: ui://sales/dashboard.html
MIMEタイプ: text/html;profile=mcp-app
ツール側のURIとリソース側のURIが完全に一致していることが重要です。URIの大文字・小文字やパスが異なると、ツールは実行できてもUIだけ表示されない状態になります。(Microsoft Learn)
MCP Appsが効果を発揮する利用シーン
MCP Appsは、すべてのMCPツールを置き換えるものではありません。文章よりも画面操作のほうが理解や作業を早められる場面で効果を発揮します。
| 利用シーン | テキストだけの場合の課題 | MCP Appsで実現できること |
|---|---|---|
| データ分析 | 数値を比較しにくい | グラフ、地図、フィルターで探索する |
| Azure環境の構成 | 質問と回答を何度も繰り返す | リージョン、SKU、スケール設定をフォームで選ぶ |
| 障害対応 | 最新状態を何度も質問する | メトリックやログをダッシュボードで確認する |
| 承認業務 | 対象を一件ずつ文章で確認する | 内容を確認しながら承認・却下を操作する |
| 複数手順の作業 | 現在の進捗が分かりにくい | ステップ表示や入力内容を保持する |
| ファイルや画像の確認 | 内容を文章で説明する必要がある | PDFビューアーや画像プレビューを表示する |
一方、時刻の取得、単純な検索、短い要約などは、従来どおりテキストで返したほうが高速で実装も簡単です。
判断基準は、ユーザーが結果を読むだけか、結果を見ながら操作するかです。後者であればMCP Appsを検討する価値があります。
一般提供になった範囲とプレビュー機能を区別する
今回の発表で一般提供になったのは、Azure FunctionsによるMCP Appsのホスティングです。関連機能には、引き続きプレビューとして案内されているものがあります。
| 機能 | 状態 | 導入時の判断 |
|---|---|---|
| Azure Functions MCP拡張機能によるMCP Appsのホスティング | 一般提供 | 本番利用を検討可能 |
| Azureポータルから行うMCP認証のワンクリック構成 | プレビュー | 本番では変更点と制約を継続確認 |
| 公式MCP SDKで作ったサーバーをセルフホストする方式 | プレビュー | MCP AppsのGAとは別機能として評価 |
| MCP Appsの画面表示 | クライアントにより異なる | 利用予定クライアントで実機検証が必要 |
Azureポータルの「AI(プレビュー)」からMicrosoft Entra IDを設定するMCP向け認証機能は、公式ドキュメント上ではプレビューです。また、公式MCP SDKで構築したサーバーをAzure Functionsのカスタムハンドラーとして動かす方式も、MCP拡張機能を利用する方式とは提供状態が異なります。(Microsoft Learn)
「MCP AppsがGAになったので、関連する認証やホスティング方式もすべてGA」と判断しないようにしましょう。
影響を受ける利用者と必要な対応
通常のFunction Appを運用している場合
HTTPトリガーやTimerトリガーなど、MCPを使用していない既存のFunction Appに直接の移行作業はありません。
MCP Appsは、MCP拡張機能と専用トリガーを追加して利用する機能です。既存アプリへ自動適用される変更ではありません。
テキストベースのMCPサーバーを運用している場合
必須の移行ではありませんが、既存ツールにUIを追加できます。
安全に移行するには、既存ツールをすぐに置き換えるのではなく、次のように段階的に展開します。
- 既存の
getSalesSummaryは残す - UI付きの
getSalesDashboardを新設する - 対応クライアントではダッシュボードを利用する
- 未対応クライアントでは既存ツールを利用する
- 利用状況を確認後、統合や廃止を判断する
この方法なら、MCP Appsに対応していないクライアントからも従来機能を利用できます。
管理者の場合
管理者は、アプリそのものだけでなく、次の範囲を確認する必要があります。
- MCP Appsに対応するクライアントとバージョン
- MCPサーバーへの認証方式
- Microsoft Entra IDの許可対象
- Function Appのホスティングプラン
- UIが接続する外部ドメイン
- ツールがアクセスできるAzureリソース
- ログに記録される入力値と機密情報
- 組織内でのMCPサーバーの登録・公開方法
MCP AppsはMCPコア仕様の拡張機能であり、初期化時にクライアントとサーバーの双方が対応を宣言した場合に利用されます。そのため、サーバー側のデプロイだけではUIが表示されないことがあります。(Model Context Protocol)
既存MCPサーバーからMCP Appsへ移行する手順
利用予定のクライアントを先に決める
最初に確認すべきなのはAzure Functionsの設定ではなく、利用者が使うMCPクライアントです。
検証環境では、公式クイックスタートで案内されているVisual Studio CodeとGitHub Copilotを使うと、サーバー接続からツール実行まで確認しやすくなります。(Microsoft Learn)
クライアントごとに、次の項目を確認してください。
- MCP Apps拡張への対応
- リモートMCPサーバーへの接続可否
- Function KeyやOAuthへの対応
- UIからのツール再実行への対応
- 外部リンク、クリップボードなどの権限制御
- 管理ポリシーによるMCPサーバー接続制限
ツールの処理と画面表示を分離する
MCP Appsでは、業務処理とUIを一つの関数へ詰め込まないことが重要です。
推奨構成は次のとおりです。
- ツールトリガー:データ取得、検証、更新処理を担当
- リソーストリガー:HTML、CSS、JavaScriptを提供
- UI:ツールが返した構造化データを表示
- 外部ストレージ:長時間の処理状態やワークフロー状態を保存
ツールがHTML文字列を直接生成する設計よりも、JSONなどの構造化データを返し、UI側で表示する設計のほうがテストしやすくなります。テキスト表示へのフォールバックも実装しやすくなります。
UIリソースを追加する
既存のMCPツールに、次の要素を追加します。
- UIのHTMLとJavaScript
- UIを提供するMCPリソーストリガー
- ツールとUIを関連付けるメタデータ
- UIをビルドするCI/CD処理
- 生成されたファイルをデプロイパッケージへ含める設定
公式クイックスタートでも、Function Appを起動する前にnpm installとnpm run buildを実行し、UI資産を生成する手順が必要です。(Microsoft Learn)
よくある失敗は、ローカルにはdistフォルダーが存在するものの、CI環境ではUIをビルドしておらず、本番パッケージにHTMLが含まれないケースです。
テキスト表示のフォールバックを残す
クライアントがMCP Appsに対応していない場合やUIリソースの読み込みに失敗した場合に備えて、ツールの戻り値には最低限の内容を含めます。
たとえば売上ダッシュボードなら、UIとは別に次の情報を構造化データまたは短い文章で返します。
- 集計期間
- 売上合計
- 前期比
- 上位の地域
- UIを表示できなかった場合の案内
UIだけに重要な情報を持たせると、非対応クライアントでは結果を確認できません。
開発者が確認すべきランタイムと拡張機能
Azure Functions MCP拡張機能には、言語やプログラミングモデルに関する前提条件があります。
主な確認事項は次のとおりです。
- C#は分離ワーカーモデルを使用する
- JavaScript/TypeScriptはNode.jsプログラミングモデルv4を使用する
- Pythonはプログラミングモデルv2を使用する
- PowerShellアプリは現時点でMCP拡張機能の対象外
- GoもMCPバインドの対象外
- ローカル環境はAzure Functions Core Tools 4.0.7030以降を確認する
host.jsonの拡張機能バンドルを確認する
拡張機能バンドルを使用するプロジェクトでは、次のような設定が必要です。
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.0.0, 5.0.0)"
}
}
言語別パッケージの最低バージョンは、MCPバインド全体の概要と、リソーストリガーなどの個別ページで異なる場合があります。MCP Appsではリソーストリガーを利用するため、概要ページの最低要件だけで判断せず、採用した公式テンプレートの依存関係と個別バインドの要件を優先してください。(Microsoft Learn)
host.jsonで確認すべき設定
MCPサーバーの基本情報や承認レベルは、host.jsonのextensions.mcpで設定できます。
{
"version": "2.0",
"extensions": {
"mcp": {
"serverName": "ContosoOperations",
"serverVersion": "1.0.0",
"instructions": "Azure環境の状態確認と運用操作に使用します",
"encryptClientState": true,
"system": {
"webhookAuthorizationLevel": "System"
}
}
}
}
本番環境で確認したい項目は次のとおりです。
serverNameとserverVersion
利用者が識別できる名前と、リリース管理に使えるバージョンを設定します。
複数環境を運用する場合は、ContosoOperations-Devのように環境名を名前へ埋め込むより、接続設定やAPI Centerのメタデータで環境を区別したほうが誤接続を防ぎやすくなります。
encryptClientState
既定値はtrueです。デバッグ目的でfalseにできるものの、本番環境では推奨されていません。
webhookAuthorizationLevel
既定のSystemでは、MCPエンドポイントへの接続にシステムキーが必要です。
Microsoft Entra IDによる組み込み認証を利用する場合は、Function Keyによる認証を無効化するためAnonymousへ変更することがあります。ただし、先にMicrosoft Entra ID認証を有効化し、未認証アクセスが拒否されることを確認してから変更してください。設定順序を誤ると、一時的にMCPエンドポイントが公開される可能性があります。(Microsoft Learn)
MCPサーバーの接続先とトランスポート
Azure Functions MCP拡張機能の主なエンドポイントは次のとおりです。
https://<Function-App名>.azurewebsites.net/runtime/webhooks/mcp
新規構成では、Streamable HTTPを優先します。
| トランスポート | エンドポイント | 判断 |
|---|---|---|
| Streamable HTTP | /runtime/webhooks/mcp | 原則としてこちらを使用 |
| Server-Sent Events | /runtime/webhooks/mcp/sse | 既存クライアントが必要とする場合のみ |
SSEは新しいMCPプロトコルで非推奨となる方向が示されています。また、SSEを使用する場合は、AzureWebJobsStorageのAzure Queue Storageや、ID接続時のRBAC設定も確認する必要があります。(Microsoft Learn)
Function Keyを接続設定へ記述する場合は、Gitへ直接コミットしないでください。Visual Studio Codeの入力変数、CI/CDのシークレット、Key Vaultなどを利用します。
本番環境の認証方式を選ぶ
利用可能な認証方式は、主に次の3つです。
| 認証方式 | 向いている用途 | 注意点 |
|---|---|---|
| Function Key | 開発、限定的な検証 | 共有シークレットの漏えいとローテーションに注意 |
| Microsoft Entra ID/OAuth | 社内システム、本番環境 | アプリ登録、Audience、許可クライアントを設計 |
| 認証なし | 公開情報を返す読み取り専用ツール | 更新・削除操作には使用しない |
MCP拡張機能方式では、既定のシステムキー名はmcp_extensionです。Microsoftは、本番のMCPエンドポイントではFunction Keyだけに依存せず、Microsoft Entra IDまたはOAuthを検討するよう案内しています。(Microsoft Learn)
Microsoft Foundry Agent Serviceから接続する場合は、マネージドIDやOAuth Identity Passthroughも選択できます。利用者ごとの権限を引き継ぐ必要がある処理では、共有キーよりユーザーコンテキストを保持できる方式が適しています。
認証切り替え時の合格条件
本番展開前に、少なくとも次の状態を確認します。
- 認証情報なしの接続が401で拒否される
- 許可されていないユーザーまたはクライアントが拒否される
- 許可されたユーザーがツール一覧を取得できる
- 読み取り権限だけの利用者が更新ツールを実行できない
- Function Keyを無効化した後もEntra ID経由で接続できる
- トークンやキーがApplication Insightsへ記録されない
対話型UIでもバックエンドの安全性は別途必要
MCP AppsのUIは、対応クライアント上でサンドボックス化されたiframeとして表示されます。親画面のDOMやCookieへ直接アクセスできないように隔離され、ホストとの通信は制御されたメッセージ経由で行われます。(Model Context Protocol)
ただし、サンドボックスが保護するのは主にクライアント側です。Azure Functions上のツールが持つ権限まで自動的に制限するわけではありません。
次の対策が必要です。
- ツールの入力値をサーバー側で再検証する
- 更新や削除の前に対象と内容を明示する
- マネージドIDには必要最小限のRBACロールだけを付与する
- UIのJavaScriptへAPIキーや接続文字列を埋め込まない
- 外部スクリプトや通信先をCSPで制限する
- HTMLへ埋め込む業務データをエスケープする
- 二重送信されても問題が起きないよう冪等性を持たせる
- UI操作とツール実行結果を監査ログへ関連付ける
特に、「承認」「削除」「デプロイ」などのツールは、ボタンを一度押しただけで処理を確定させない設計が安全です。確認画面に対象リソース、変更前後の値、影響範囲を表示してから実行します。
ホスティングプランとコールドスタートを確認する
MCP Appsは画面を対話的に操作するため、通常のバックグラウンド処理よりも応答時間が利用者の体感に影響します。
小規模な検証ではFlex Consumptionを利用できますが、本番では次の選択肢を比較します。
- Flex ConsumptionでAlways Readyインスタンスを設定する
- Premiumプランで事前ウォーム済みインスタンスを利用する
- 利用頻度が低い場合はコールドスタートを許容する
- UI用JavaScriptと依存パッケージを小さくする
- 外部APIの呼び出しを直列化しすぎない
Microsoftのサービス選定ガイドでも、対話型MCPクライアントでコールドスタートを避けたい場合はPremiumプランが案内されています。Flex ConsumptionでもAlways Readyインスタンスを設定することで遅延を抑えられます。(Microsoft Learn)
デプロイ時に確認すべきポイント
UIのビルドをCI/CDへ組み込む
Function Appのビルドだけでは、MCP Appsのフロントエンドが生成されない構成があります。
CI/CDでは、次の順番を明示します。
依存関係の復元
↓
UIのnpm install
↓
UIのnpm run build
↓
Function Appのビルド
↓
UIのdistファイルが含まれているか検査
↓
テスト
↓
デプロイ
デプロイ前に、パッケージ内へindex.htmlやJavaScriptファイルが含まれているかを自動検査すると、UIだけ表示されない事故を防げます。
設定変更による再起動を考慮する
Function Appのアプリ設定を変更すると、通常はアプリが再起動します。
Flex Consumptionで停止を抑えたい場合は、siteUpdateStrategy.typeをRollingUpdateに設定する方法があります。既定のRecreateでは、デプロイ時に実行中の処理が終了する可能性があります。(Microsoft Learn)
ただし、RollingUpdateはカナリアテスト用の別環境を提供する機能ではありません。認証方式やツール仕様を大きく変える場合は、別のFunction Appへ先行デプロイし、一部の検証ユーザーだけを接続させる方法が安全です。
組織内でサーバーを登録する
MCPサーバーが増えると、接続先URLをチャットや文書で共有する運用では、所有者や本番・検証環境の区別が難しくなります。
Azure API Centerへ登録すると、組織内のリモートMCPサーバーをインベントリとして管理できます。(Microsoft Learn)
登録時には、少なくとも次の情報を管理します。
- サーバーの所有チーム
- 本番・検証の区分
- 提供するツール
- 認証方式
- データ分類
- 更新・削除操作の有無
- 問い合わせ先
- 廃止予定日
- 対応クライアント
本番展開前のテスト項目
| テスト項目 | 合格条件 |
|---|---|
| ツール検出 | クライアントから正しいツール名と説明を確認できる |
| UIリソース取得 | ui://リソースがエラーなく読み込まれる |
| 非対応クライアント | テキストまたは構造化データで結果を確認できる |
| 認証なしアクセス | 意図した場合を除き401または403になる |
| 権限制御 | 利用者の権限を超える操作が拒否される |
| UI再操作 | フィルター変更や再実行でデータが正しく更新される |
| 二重実行 | ボタン連打や再送で処理が重複しない |
| コールドスタート | 許容する応答時間内に初回画面が表示される |
| スケールアウト | インスタンスが変わっても処理状態が失われない |
| デプロイ | UI資産を含む新バージョンへ安全に更新できる |
| 監査 | 誰がどのツールを実行したか追跡できる |
| ロールバック | 旧バージョンまたは従来ツールへ戻せる |
導入時に起きやすい失敗
サーバーだけ更新してクライアントを確認していない
MCP Appsはクライアント側の対応も必要です。開発者の環境では表示できても、社内標準クライアントではテキストしか表示されない場合があります。
UIのビルド成果物がデプロイされていない
ツールは正常に動作する一方、リソーストリガーがindex.htmlを見つけられず、UIだけエラーになります。
ui.resourceUriが一致していない
ツールメタデータではui://sales/dashboard.html、リソース側ではui://sales/dashbord.htmlとなっているような誤記が典型例です。URIを定数として共通化すると防ぎやすくなります。
認証設定より先にAnonymousへ変更している
Function Keyを無効化した後、Microsoft Entra ID認証が正しく適用されていないと、エンドポイントが意図せず公開される可能性があります。
UIのサンドボックスだけで安全だと判断する
iframeが隔離されていても、背後のツールが強いAzure権限を持っていれば、誤操作や不正な入力による影響は残ります。
既存ツールを一度に置き換える
クライアント互換性やフォールバックを確認せず、テキスト版ツールを削除すると、利用できないユーザーが発生します。まずUI版を追加し、利用状況を確認してから統合します。
Azure FunctionsでMCP Appsを導入するための次の行動
Azure FunctionsのMCP Appsホスティングが一般提供になったことで、AIとの対話を文章中心から、実際に操作できる業務画面へ広げられるようになりました。
導入する場合は、次の順番で進めると安全です。
- 対話型UIが本当に必要な業務を一つ選ぶ
- 公式テンプレートから検証用Function Appを作成する
- 利用予定のMCPクライアントでUI表示を確認する
- Function KeyとMicrosoft Entra IDのどちらを使うか決める
- テキスト表示のフォールバックを実装する
- UIビルド、認証、監査をCI/CDとIaCへ組み込む
- 既存ツールを残したまま限定ユーザーへ展開する
最初の対象には、更新や削除を伴わない読み取り専用のダッシュボードが適しています。表示、認証、ログ、クライアント互換性を確認してから、設定変更や承認ワークフローへ広げると、MCP Appsの利点を生かしながら運用リスクを抑えられます。

コメント