MCP C# SDKを使用してMCPサーバー(Azure Functions)を作成、GitHub Copilotから動作を確認してみる

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はMCP C# SDKを使用してリモート環境(Azure Functions)にMCPサーバーを作成し、GitHub Copilot(エージェントモード)から動作を確認する方法についてお届けします。

前回の記事では、C# MCP SDKを使用してリモート環境(Azure App Service)で動作するMCPサーバーを作成し、GitHub CopilotのエージェントモードからMCPサーバーの動作を確認しました。

本記事では、MCP C# SDKを使用してAzure Functionsの関数アプリケーションにMCPサーバーを実装する方法と、このMCPサーバーをAzureにデプロイしてVisual Studio CodeのGitHub Copilot(エージェントモード)から利用する方法について紹介します。

MCPサーバーを作成する

アプリケーションの作成

Visual Studioで「Azure Functions」のプロジェクトテンプレートを使用してアプリケーションを作成します。

MCPサーバーを作成する

プロジェクト名は「AzureFunctionMcpServerApp1」とします。

MCPサーバーを作成する

こちらに記載のように、MCP C# SDKは分離ワーカーモデルのみサポートしているので、「.NET 8 Isolated (長期的なサポート)」を設定します。

MCPサーバーを作成する

NuGetパッケージマネージャーから以下のパッケージをインストールします。

MCPサーバーを作成する

Program.csを以下のように更新します。EnableMcpToolMetadataで関数に追加したMCPツールを有効にします。また、前回と同じくHttpClientクラスを使用して外部のWeb API(天気予報API、https://weather.tsukumijima.net/)から天気予報を取得するMCPツールを実装するのでAddHttpClientを追加します。

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.EnableMcpToolMetadata();

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

builder.Build().Run();

Function1.csを以下のように更新します。関数GetWeatherForecastFunctionでは、この関数をMCPクライアントから呼び出すためのトリガー属性McpToolTriggerを設定します。また、入力バインドとしてMcpToolPropertyを設定して関数の実行時にMCPクライアントからの入力を渡します。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Mcp;
using System.Text.Json;

namespace AzureFunctionMcpServerApp1;

public class Function1(IHttpClientFactory httpClientFactory)
{
    private readonly HttpClient client = httpClientFactory.CreateClient();

    [Function("GetWeatherForecastFunction")]
    public async Task<string> GetWeatherForecastCity(
        [McpToolTrigger("getweatherforcastcity", "指定された場所の天気予報を取得")] ToolInvocationContext context,
        [McpToolProperty("citycode", "string", "地域別に定義されたID番号(https://weather.tsukumijima.net/primary_area.xml)")] string citycode)
    {
        // 天気予報API(https://weather.tsukumijima.net/)にHTTP GETリクエストを送信
        using HttpResponseMessage response = await client.GetAsync($"https://weather.tsukumijima.net/api/forecast?city={citycode}");

        // レスポンスを確認
        response.EnsureSuccessStatusCode();

        // レスポンスの内容をストリームとして取得
        using Stream content = await response.Content.ReadAsStreamAsync();

        // 天気予報を取得
        using JsonDocument jsonDocument = await JsonDocument.ParseAsync(content);

        string title = jsonDocument.RootElement
            .GetProperty("title")
            .GetString() ?? string.Empty;

        string weatherforecast = jsonDocument.RootElement
            .GetProperty("description")
            .GetProperty("bodyText")
            .GetString() ?? string.Empty;

        return $"{title}:{weatherforecast}";
    }
}

デバッグ実行するとターミナルで以下のように出力されます。MCP server SSE endpoint: http://localhost:7068/runtime/webhooks/mcp/sseとMCPサーバーのエンドポイントが表示されており、起動していることを確認できます。

MCPサーバーを作成する

MCPサーバーをテストする

MCPサーバーをテストするためのツール「MCP Inspector」を使用して作成したMCPサーバーをテストします。

Visual Studioのメニューから「表示」-「ターミナル」をクリックします。開発者用コマンドプロンプトでnpx @modelcontextprotocol/inspector dotnet runを入力してMCP Inspectorを実行します。

MCPサーバーをテストする

ブラウザを開いてターミナルに表示されているURLにアクセスします。「Transport Type」にSSE、「URL」にMCPサーバーのエンドポイント(http://localhost:7068/runtime/webhooks/mcp/sse)を設定します。[Connect]をクリックしてサーバーに接続します。

MCPサーバーをテストする

[List Tools]をクリックしてMCPツールのリストを表示します。「GetWeatherForecastCity」をクリックしてMCPツールの詳細が表示されるのを確認します。

MCPサーバーをテストする

天気予報APIを呼び出す際のパラメータ「citycode」には、本APIのページで公開されている全国の地点定義表内での「一次細分区域(cityタグ)」のIDを設定します。今回は仙台のコード「040010」を設定して[Run Tool]をクリックします。ツールが起動し、実行結果が表示されます。

MCPサーバーをテストする

MCPサーバーをAzureにデプロイする

作成したMCPサーバーをAzureへデプロイします。現時点ではWindows OSでホストしていると動作しないので、「Azure Funcition App (Linux)」にデプロイします。

MCPサーバーをAzureにデプロイする

デプロイが完了すると以下のようにMCPサーバーを実装した関数が表示されます。

MCPサーバーをAzureにデプロイする

Visual Studio CodeでMCPサーバーを使う

MCPサーバーを設定する

Visual Studio Codeで「ファイル」-「ユーザー設定」-「設定」をクリックします。「mcp」を入力してMCP関連の設定項目を表示します。「settings.json で編集」をクリックして設定ファイルを開きます。

Visual Studio CodeでMCPサーバーを使う

serversフィールドで以下のようにAzureにデプロイしたMCPサーバーのエンドポイントを追加します。

"servers": {
            "azure-mcp-server-test": {
                "type": "sse",
                // "url": "https://azure-mcp-server-test-hhfyata3gua3fmc4.japaneast-01.azurewebsites.net/sse"
                "url": "https://<関数アプリのドメイン>/runtime/webhooks/mcp/sse",
                "headers": {
                    "x-functions-key": "<関数アプリのシステムキー>"
                }
            }
        }

関数アプリのシステムキーはこちらで確認できます。

MCPサーバーをAzureにデプロイする

GitHub Copilot(エージェントモード)でMCPサーバーを使用する

GitHub Copilotのチャットを開き、ドロップダウンからエージェントモードを選択します。

GitHub Copilot(エージェントモード)でMCPサーバーを使用する

使用可能なツールのリストを表示するには「ツールを選択する」ボタンを選択します。

GitHub Copilot(エージェントモード)でMCPサーバーを使用する

チャット入力ボックスにプロンプ​​トを入力するとMCPツール「GetWeatherForecastCity」が自動的に呼び出されます。適切なcitycodeが設定されているか確認(必要に応じて修正)して[続行]をクリックしてMCPツールを実行します。

GitHub Copilot(エージェントモード)でMCPサーバーを使用する

MCPツールの実行結果が確認できます。

GitHub Copilot(エージェントモード)でMCPサーバーを使用する

さいごに

今回はMCP C# SDKを使用してAzure FunctionでMCPサーバーを実装する方法と、GitHub Copilot(エージェントモード)からAzureにデプロイしたMCPサーバーを利用する方法について紹介しました。MCP C# SDKを使用することで、MCPサーバーをC#で作成してAIアプリケーションと連携させることができます。

前々回のコンソールアプリケーションによるローカル環境でのMCPサーバー構築、前回のASP.NET Coreと今回のAzure Functionsによるリモート環境でのMCPサーバー構築といったように、要件にあわせてMCPサーバーを作れるようになっているのは嬉しいポイントですね。

\  この記事をシェアする  /