Azure FunctionsのMCP AppsホスティングがGA|変更点・移行・管理者の確認事項

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は、概ね次の流れで動作します。

  1. MCPクライアントがツールを検出する
  2. ユーザーの指示に応じてツールトリガーが実行される
  3. ツールが構造化データを返す
  4. ツールのメタデータに指定されたui://リソースをクライアントが取得する
  5. リソーストリガーがHTMLとJavaScriptを返す
  6. クライアントが会話画面内に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ツールに、次の要素を追加します。

  1. UIのHTMLとJavaScript
  2. UIを提供するMCPリソーストリガー
  3. ツールとUIを関連付けるメタデータ
  4. UIをビルドするCI/CD処理
  5. 生成されたファイルをデプロイパッケージへ含める設定

公式クイックスタートでも、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との対話を文章中心から、実際に操作できる業務画面へ広げられるようになりました。

導入する場合は、次の順番で進めると安全です。

  1. 対話型UIが本当に必要な業務を一つ選ぶ
  2. 公式テンプレートから検証用Function Appを作成する
  3. 利用予定のMCPクライアントでUI表示を確認する
  4. Function KeyとMicrosoft Entra IDのどちらを使うか決める
  5. テキスト表示のフォールバックを実装する
  6. UIビルド、認証、監査をCI/CDとIaCへ組み込む
  7. 既存ツールを残したまま限定ユーザーへ展開する

最初の対象には、更新や削除を伴わない読み取り専用のダッシュボードが適しています。表示、認証、ログ、クライアント互換性を確認してから、設定変更や承認ワークフローへ広げると、MCP Appsの利点を生かしながら運用リスクを抑えられます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次