今回は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」のプロジェクトテンプレートを使用してアプリケーションを作成します。

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

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

NuGetパッケージマネージャーから以下のパッケージをインストールします。
- Microsoft.Azure.Functions.Worker.Extensions.Mcp(MCP C# SDKのAzure Functions用。現時点ではプレビューです)

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 Inspector」を使用して作成したMCPサーバーをテストします。
Visual Studioのメニューから「表示」-「ターミナル」をクリックします。開発者用コマンドプロンプトでnpx @modelcontextprotocol/inspector dotnet run
を入力してMCP Inspectorを実行します。

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

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

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

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

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

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

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": "<関数アプリのシステムキー>"
}
}
}
関数アプリのシステムキーはこちらで確認できます。

GitHub Copilot(エージェントモード)でMCPサーバーを使用する
GitHub Copilotのチャットを開き、ドロップダウンからエージェントモードを選択します。

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

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

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サーバーを作れるようになっているのは嬉しいポイントですね。