Azure FunctionsでMCPサーバーを構築するためのはじめの一歩【MCP Extension v1.0.0版】

はじめに

こんにちは、サイオステクノロジーの佐藤 陽です。
今回はAzure Functionsを利用してMCPサーバーを構築する方法についてご紹介します。

Azure Functionsを利用してMCPサーバーを構築するためのExtensionである
Microsoft.Azure.Functions.Worker.Extensions.McpGA版(v1.0.0)が2025年10月9日にリリースされました!

今回のブログでは、このGA版を使った実装方法を解説していきます。

  • MCPサーバーって何?という方
  • Azure FunctionsでMCPサーバーを構築したい方
  • preview版からGA版への移行を検討している方

といった方は是非最後までご覧ください!

サンプルコード

今回解説するコードをGitHubにて公開しています。
DevContainerですぐ動くような形となっていますので、是非お試しください。

GitHubリポジトリ:azure-functions-mcp-server-sample

なお、元のDevContainerとしては、しばやんさん作成のTemplateを利用させていただいておりますmm

MCPとは

MCP(Model Context Protocol) は、AIモデルが外部のツールやデータソースとやり取りするための標準化されたプロトコルです。

MCPの詳細に関しては色々なところで分かりやすく解説されているので、今回の記事では説明を割愛します。
弊社の武井さんのYoutubeや、KAGのみのるんさんの資料などが非常に分かりやすいので、ぜひこちらご覧ください!

今回は、上記の記事でも紹介されているMCPサーバーをAzure Functions上で実装していきます。

環境構築

プロジェクトのセットアップ

サンプルコードを利用するする場合は、上述のクローン手順に従ってください。
一から作成する場合は、以下の手順で進めます。

新規プロジェクトの作成

Azure Functionsのプロジェクトを新規作成する

func init mcp-server --worker-runtime dotnet-isolated

これにより、.NET Isolated Workerを使用したAzure Functionsプロジェクトが作成されます。

必要なパッケージのインストール

MCP拡張機能パッケージをインストールする

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.0.0

注意点

GA版のMCP拡張機能を使用するには、Microsoft.Azure.Functions.Workerのバージョンを2.1.0以上にする必要があります。

プロジェクトファイル(.csproj)を確認し、以下のバージョンが設定されていることを確認してください:

<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Mcp" Version="1.0.0" />

変更後パッケージの復元を行います。

dotnet restore

実装

ここまでくれば環境構築完了です。
MCPサーバーの実装を始めていきましょう!

今回作成するMCPツールについて

今回は「MCPサーバーとは何か」「どう実装するか」を理解することにスポットに当て、非常にシンプルなツールを作成します。

私が普段YouTubeで配信している「ツール・ド・Azure」という技術解説シリーズがあるのですが、
今回のMCPツールでは、この各回のタイトル情報を取得する機能を実装します。

MCPトリガー関数の作成

それでは、実際にMCPツールとして公開する関数を作成していきます。
ベースとして一度HTTPトリガーの関数を追加し、それをベースにMCPトリガーに修正していくのが良いかと思います。

新しいファイル TourDeAzureTrigger.cs を作成し、以下のコードを記述します。

この関数は、AIエージェントが「ツール・ド・Azureの第N回のタイトルは何?」と質問したときに、適切なタイトルを返すツールを想定します。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Functions.Worker.Extensions.Mcp;

public class TourDeAzureTrigger
{
    private readonly ILogger<TourDeAzureTrigger> _logger;

    public TourDeAzureTrigger(ILogger<TourDeAzureTrigger> logger)
    {
        _logger = logger;
    }

    [Function(nameof(GetTourDeAzureTitle))]
    public string GetTourDeAzureTitle(
        [McpToolTrigger("get_tour_de_azure_title", "Gets title about the Tour de Azure.")]
            ToolInvocationContext context,
    [McpToolProperty("edition", "The edition number.", isRequired: true)] int edition)
    {

        return edition switch
        {
            1 => "AI Document Intelligenceに入門しよう!",
            2 => "Azure AI Searchのインデクシングに入門しよう!",
            3 => "Azure上にRAGシステムを構築しよう!",
            4 => "RAGの性能を評価しよう!",
            5 => "安全なAIアプリケーションを構築しよう",
            _ => "To Be Continued..."
        };
    }
}

コードの詳細解説

実装したコードの各部分について詳しく見ていきましょう。

  1. McpToolTrigger属性

    [McpToolTrigger("get_tour_de_azure_title", "Gets title about the Tour de Azure.")]
    
    • 第1引数 (get_tour_de_azure_title): AIエージェントが呼び出すツール名
    • 第2引数: ツールの説明文(AIがこのツールの用途を理解するために重要)
  2. ToolInvocationContext

    • MCPツールの呼び出しコンテキスト情報を保持
  3. McpToolProperty属性

    [McpToolProperty("edition", "The edition number.", isRequired: true)]
    
    • edition: パラメータ名
    • "The edition number.": パラメータの説明文
    • isRequired: true: 必須パラメータとして設定

Program.csの設定

次に、Program.csでMCPツールの設定を行います。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

builder.Services
    .AddApplicationInsightsTelemetryWorkerService()
    .ConfigureFunctionsApplicationInsights();

builder
    .ConfigureMcpTool(nameof(TourDeAzureTrigger.GetTourDeAzureTitle))
    .WithProperty("edition",  "int", "The edition number.", required: true);

builder.Build().Run();

※preview版では、以下のメソッド呼び出しが必要でしたが、こちらがGA版では不要となりました。

builder.EnableMcpToolMetadata();

ConfigureMcpToolの詳細

  • 第1引数: 関数名(  nameof(TourDeAzureTrigger.GetTourDeAzureTitle) )
  • WithProperty: プロパティの詳細定義
    • パラメータ名
    • 型情報 ("int", "string" など)
    • 説明文
    • required: 必須かどうかのフラグ

動作確認

実装が完了したら、実際に動作確認を行っていきます!

Azuriteの起動

Azure Functionsはローカル実行時にAzure Storageが必要です。 ローカル環境ではストレージエミュレーター「Azurite」を使用します。

VSCodeの画面で 「Azurite: Start」 を実行します

Azure Functionsの起動

次に、Azure Functionsを起動します:

func start

正常に起動すると、コンソールに以下のような出力が表示されます。

エンドポイントが公開されていればOKです
この後、「http://localhost:7071/runtime/webhooks/mcp」のエンドポイントを利用しますので、こちらを控えておいておいてください。

Azure Functions Core Tools
Core Tools Version:       4.3.0+df07acf9d837d635d1efc2c973225f4f1c8a4333 (64-bit)
Function Runtime Version: 4.1042.100.25374

Found /workspaces/azure-functions-mcp-server-sample/mcp-server/mcp-server.csproj. Using for user secrets file configuration.
MCP server endpoint: http://localhost:7071/runtime/webhooks/mcp
MCP server legacy SSE endpoint: http://localhost:7071/runtime/webhooks/mcp/sse
Worker process started and initialized.

Functions:

        GetTourDeAzureTitle: mcpToolTrigger

For detailed output, run func with --verbose flag.

Postmanでの疎通確認

今回はPostmanを使って、MCPサーバーとの簡単な疎通確認を行います。

Postmanの設定手順

  1. Postmanを起動
  2. 新しいリクエストを作成し、プロトコルとして「MCP」を選択
  3. サーバーのURL(http://localhost:7071/runtime/webhooks/mcp)を入力し、接続ボタンを押す
  4. ツールの確認
    • Postmanにget_tour_de_azure_titleツールが表示されることを確認
  5. ツールの実行
    • パラメータ edition に値(例: 1)を設定
    • 実行ボタンをクリック

期待される結果

パラメータ edition=1 で実行した場合

{
    "content": [
        {
            "type": "text",
            "text": "AI Document Intelligenceに入門しよう!"
        }
    ]
}

 

これでローカル環境にMCPサーバーが立ち上がり、疎通できていることが確認できました。

まとめ

今回は、Azure FunctionsでMCPサーバーを構築する方法をご紹介しました。
ただし今回は「はじめの一歩」レベルであり、LLMも絡んでいませんし、Agentic感も一切ありません。

そこで次のステップとしては、以下のような取り組みを考えています

  • GitHub CopilotやClaude等のAIエージェントとの連携
  • 複数のMCPツールを組み合わせた複雑なワークフローの実装

これらについては、また別の機会にご紹介していきたいと思います。
ではまた!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です