開催中の Ignite 2025 に合わせて Azure Functions の Easy Auth で OAuth 2.0 の Protected Resource Metadata に対応したので、MCP サーバーの認証として Entra ID が使いやすくなりました。
詳細は以下のブログで紹介されていますが、肝心な具体的な設定方法が見当たらないため、実際に Visual Studio Code から Entra ID 認証で保護された MCP サーバーにアクセスする部分まで試しました。
今回は Visual Studio Code が持っている Entra ID アプリケーションで認証を行い、Azure Functions でホスティングしている MCP サーバーを使うようにします。Entra ID は Dynamic Client Registration に対応していないので、その部分だけは注意する必要がありました。
Azure Functions で Entra ID 認証の構成を行う
まずは Azure Functions に対して組み込みの Authentication を使って Entra ID 認証を構成します。基本的な手順はこれまで通りなので、以下のドキュメントの通りに行っていけばよいですが、API だという点だけは頭に入れておくと良いです。
Azure Portal から Authentication を構成する手順は Microsoft を選んで進めれば問題ありません。Client Secret 周りもデフォルトで特に問題ないので進めていきます。

今回、追加で必要な設定は Additional checks にある Allowed client applications だけになります。ここに Visual Studio Code の Client Id である aebc6443-996d-45c2-90f0-388ff96faa56 を追加してあげます。

Visual Studio Code の Client Id は以下のドキュメントで見つけることが出来ました。
これで Azure Functions の Authentication が Visual Studio Code 経由で発行された Bearer Token を正しく受け付けられるようになります。
OAuth 2.0 PRM の設定を追加する
次に MCP クライアントが認証に必要な情報を把握できるようにするために、OAuth 2.0 Protected Resource Metadata の追加設定を行っていきます。この機能が今回追加されたものとなり、設定は App Settings に WEBSITE_AUTH_PRM_DEFAULT_WITH_SCOPES という名前でスコープ名を登録します。
登録するスコープ名は Authentication の設定時に自動で作成された Entra ID アプリケーションの Expose an API から確認出来ます。ひとまずドキュメントにもあるように、この値をそのまま使えば問題ありません。

コピーしてきたスコープ名を Azure Functions の App Settings に登録するだけなので、設定自体は非常に簡単です。この設定を行うと /.well-known/oauth-protected-resource でメタデータが公開されます。

実際に設定を行った Azure Functions に対してメタデータのパスにアクセスすると、以下のような内容が返ってきます。これでメタデータを使って VS Code は認証を行ってくれるようになります。

今回は Entra ID で確認していますが、他のプロバイダーも利用できるのかは確認していません。プレビュー中は Entra ID 限定で有効になっている可能性はあります。
Azure Functions でキー認証を無効化する
最後に Azure Functions にデプロイした MCP サーバーでキー認証を無効化しておきます。少し前のバージョンから host.json の webhookAuthorizationLevel を指定することで、デフォルトのキー認証を無効化出来るようになっています。
設定の値として Anonymous を指定するとキー認証が無効になるため、デプロイを行うと MCP サーバーの利用には Entra ID 認証が必須な状態となっています。
Visual Studio Code から MCP サーバーへアクセスする
これで全ての設定が完了したので Visual Studio Code に作成した MCP サーバーを追加して、認証を含めた動作を確認していきます。MCP サーバーの追加はコマンドパレットから行っていきますが、エンドポイントを入力すると以下のように認証を VS Code から要求されます。

このダイアログで Allow を選択すると、Microsoft アカウントや組織アカウントでのログイン処理が走って、以下のようなポップアップが表示されます。これは VS Code の Entra ID アプリケーション経由で MCP サーバーへのログインを行っています。

次へを選択すると MCP サーバーとして登録している Entra ID アプリケーションへのアクセスを許可するポップアップになるため、ここで承諾を選択すると Entra ID 認証が完了してトークンが無事に発行されます。
もちろんこれは最初の 1 回だけ表示されるポップアップになるので、次回のアクセスからは自動的に Entra ID 認証が完了するはずです。

無事に Entra ID 認証を使って MCP サーバーへのアクセスが行えれば、MCP ツールが認識されるはずです。以下のように 1 tools と表示されているので、問題なくアクセスが行えていることが分かりますね。

実際に Copilot Chat を使って MCP サーバーを使って処理を試してみましたが、以下のように正しく MCP ツールを呼び出して処理が行えています。

組み込みの Authentication を使っているので、MCP ツール側ではアクセスしているユーザーの情報は HTTP ヘッダーで取得出来ます。少し Entra ID 周りの知識が必要にはなりますが、扱いにくいマスターキーを使うことなく Bearer Token で認証が行えるのはかなり良いですね。
当然ながらクレームも MCP ツール側で取得出来るため、RBAC も簡単に実現できるかと思います。