Visual Studio 2026 で C# を使用し、カスタム MCP Server を開発する

2026/04/15
★★★

C# によるカスタム MCP Server 開発

MCP(Model Context Protocol) を実装するために MCP プロジェクトからオフィシャル SDK が提供されています。

各言語の SDK は以下から確認できます。

C# 向けにも MCP C# SDK が提供されており、ソースコードは、以下で公開されています。

この SDK を使用すれば、MCP クライアント、MCP サーバーを容易に実装できます。

HTTP ベースの MCP Server を実装するには、ModelContextProtocol.AspNetCore ライブラリを使用します。

NuGet にもパッケージが公開されています。

この記事記載時点での最新版は、1.2.0 です。

MCP Server プロジェクト テンプレート

これまでは、ASP.NET Core プロジェクトを作成し、MCP C# SDK をインストールし、カスタムの MCP Server を作成していましたが、現在では、MCP Server プロジェクト テンプレートが利用できます。

MCP Server プロジェクト テンプレートを以下のコマンドでインストールします。

dotnet new install Microsoft.McpServer.ProjectTemplates

MCP Server プロジェクトの作成

プロジェクト テンプレートは、Visual Studio Code でも使用できますが、今回は、Visual Studio 2026 を使用してカスタム MCP Server を開発していきます。

Visual Studio 2026 を起動し、[新しいプロジェクトの作成] を選択します。

[新しいプロジェクトの作成] ダイアログの検索ボックスに MCP と入力すると、一覧に、MCP Server App という項目が見つかります。

MCP Server App を選択し、[次へ] を選択します。

新しいプロジェクトの作成ダイアログで MCP Server App を選択した画面

[プロジェクト名] を入力し、[次へ] を選択します。 プロジェクト名を入力するダイアログ画面

[the MCP Server transport type to use] - [remote] を選択し、[作成] を選択します。

MCP Server の transport type を remote に選択する画面 ここで、[local] を選択した場合は、トランスポートに stdio(標準入出力) が使用されます。MCP クライアントと MCP サーバーを同一環境で実行する場合には、こちらを選択します。[remote] を選択した場合は、トランスポートに Streamable HTTP が使用され、リモート呼び出し可能な MCP サーバーを開発できます。

MCP Server プロジェクト テンプレート ベースのプロジェクトが作成されます。 作成された MCP Server プロジェクトのファイル構造

MCP Server プロジェクトの構成

ここでは、MCP Server プロジェクト テンプレートで出力されたコードを見ていきます。

プロジェクト ファイル(*.csproj) は、以下のように出力されます。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <RuntimeIdentifiers>win-x64;win-arm64;osx-arm64;linux-x64;linux-arm64;linux-musl-x64</RuntimeIdentifiers>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>774e637b-4e9f-48ee-bdbd-0658628ed106</UserSecretsId>


    <!-- Set up the MCP server to be a self-contained application that does not rely on a shared framework -->
    <SelfContained>true</SelfContained>
    <PublishSelfContained>true</PublishSelfContained>

    <!-- Set up the MCP server to be a single file executable -->
    <PublishSingleFile>true</PublishSingleFile>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="ModelContextProtocol.AspNetCore" Version="1.2.0" />
  </ItemGroup>

</Project>

プロジェクトの SDK としては、Microsoft.NET.Sdk.Web が設定されおり、ASP.NET Core Web アプリケーションと同様の方法で、デバッグ実行等の各操作を行うことができます。

また、Project/ItemGroup/PackageReference ノードを見ると、MCP C# SDK がインストールされていることが分かります。

次に、Project 直下 Tools/RandomNumberTools.cs ファイルは以下の通りです。

using ModelContextProtocol.Server;
using System.ComponentModel;

/// <summary>
/// Sample MCP tools for demonstration purposes.
/// These tools can be invoked by MCP clients to perform various operations.
/// </summary>
internal class RandomNumberTools
{
	[McpServerTool]
	[Description("Generates a random number between the specified minimum and maximum values.")]
	public int GetRandomNumber(
		[Description("Minimum value (inclusive)")] int min = 0,
		[Description("Maximum value (exclusive)")] int max = 100)
	{
		return Random.Shared.Next(min, max);
	}
}

このファイルで、MCP Server のツールが定義されています。 RandomNumberTools クラス GetRandomNumber メソッドは、min と max を引数にとり、その範囲で乱数を生成して返します。

この GetRandomNumber メソッドには、属性が設定されています。McpServerTool 属性をメソッドに付与することで、MCP Server のツールとして公開することができます。Description 属性に設定されている文字列は、ツールの説明で、エージェントから参照され、ツールの選択基準として使用されます。メソッドの引数でも Description 属性で引数の説明ができ、エージェントが引数を設定する際に参照されます。

最後に、Program.cs ファイルは以下の通りです。

var builder = WebApplication.CreateBuilder(args);

// Add the MCP services: the transport to use (http) and the tools to register.
builder.Services
	.AddMcpServer()
	.WithHttpTransport(options =>
	{
		// Stateless mode is recommended for servers that don't need
		// server-to-client requests like sampling or elicitation.
		// See https://csharp.sdk.modelcontextprotocol.io/concepts/transports/transports.html for details.
		options.Stateless = true;
	})
	.WithTools<RandomNumberTools>();

var app = builder.Build();
app.MapMcp();
app.UseHttpsRedirection();

app.Run();

AddMcpServer 拡張メソッドで、MCP Server 機能を追加しています。WithHttpTransport 拡張メソッドで、トランスポートとして Streamable HTTP を使用するように設定しています。トランスポートとして、stdio を使用する場合は、代わりに WithStdioServerTransport 拡張メソッドを使用します。

WithTools 拡張メソッドは、ツールとして公開するメソッドを含むクラスを設定しています。

WithTools 拡張メソッドはチェーン可能なので、ツールが含まれる複数のクラスを追加する場合は、以下のようにします。

builder.Services
	.AddMcpServer()
	.WithHttpTransport()
	.WithTools<RandomNumberTools>()
	.WithTools<SampleToolsA>()
	.WithTools<SampleToolsB>();

ツール公開の別の方法として、WithToolsFromAssembly 拡張メソッドも使用できます。

builder.Services
	.AddMcpServer()
	.WithHttpTransport()
	.WithToolsFromAssembly();	

WithToolsFromAssembly 拡張メソッドを使用した場合は、McpServerToolType 属性が付与されたクラスを自動検出し、検出したクラスの McpServerTool 属性が設定されたメソッドをツールとして公開します。

WithToolsFromAssembly 拡張メソッドを使用して、ツールを公開する場合は、以下のようにクラスに McpServerToolType 属性を設定します。

[McpServerToolType]
internal class RandomNumberTools
{
	[McpServerTool]
	[Description("Generates a random number between the specified minimum and maximum values.")]
	public int GetRandomNumber(
		[Description("Minimum value (inclusive)")] int min = 0,
		[Description("Maximum value (exclusive)")] int max = 100)
	{
		return Random.Shared.Next(min, max);
	}
}

MapMcp 拡張メソッドは、MCP 用の HTTP エンドポイントを公開します。引数なしの場合は、ルートに公開されますが、引数でパスを指定することもできます。

https://server-name/mcp に MCP サーバーを公開したい場合は、以下のようにパスを引数に設定します。

var app = builder.Build();
app.MapMcp("/mcp");

カスタム MCP サーバーの実行

[デバッグ] - [デバッグ実行] を選択し、プロジェクトをデバッグ実行します。

コンソールが起動し、Now listening on: https://localhost:port というログで、MCP サーバーのホスト Web サーバーの待機 URL が確認できます。

デバッグ実行時のコンソールログ画面

私の環境では、https://localhost:5206 とログされています。

MCP Inspector による動作確認

MCP Inspector を使用してカスタム MCP Server の動作を確認します。

現時点では、MCP Inspector は、Node.js 22.7.5 以上が必要となります。必要に応じてセットアップを行ってください。

MCP Inspector を起動します。

npx @modelcontextprotocol/inspector

しばらくするとブラウザで MCP Inspector が起動します。 MCP Inspector のブラウザ起動画面

コマンドを実行したコンソールで、[Ctr + C] を押下し MCP Inspector を停止します。

以下の記事にもありますが、node.js のデフォルト設定では、自己署名証明書がサポートされません。

Visul Studio デバッグ実行時の Web サーバーでは、自己署名証明書が使用されます。

今回の動作確認に限って、証明書の検証を無効にするため以下のように環境変数 NODE_TLS_REJECT_UNAUTHORIZED0 に設定してから、MCP Inspector を起動します。

set NODE_TLS_REJECT_UNAUTHORIZED=0
npx @modelcontextprotocol/inspector

ブラウザで MCP Inspector が起動したら以下の設定を行います。

  • [Transport Type] - [Streamable HTTP] を選択します。
  • [URL] には、MCP Server HTTP エンドポイントを設定します。デバッグ実行時に確認した MCP サーバーのホスト Web サーバーの待機 URL を設定します。 app.MapMcp でパスを設定した場合は、パスまでいれて設定します。
  • [Connection Type] - [Via Proxy] を設定します。

[Connect] を選択し、Visual Studio でデバッグ実行中のカスタム MCP Server へ接続します。

MCP Inspector の接続設定画面 [Tools] - [List Tools] を選択します。この時、MCP Inspector から MCP Server へ tools/list 要求が送信され、MCP Server で提供されるツールのメタデータの一覧が返されます。

必要に応じて、[History] で要求と応答を確認できます。 MCP Inspector の History タブ画面

[Tools] に MCP Server で提供されているツールが一覧されています。get_random_number を選択します。

MCP Inspector のツール一覧画面

[min], [max] 任意を値を設定、[Run Tool] を選択します。[Tool Result] 以下にカスタム MCP サーバーから返却された値が表示されていることを確認します。

MCP Inspector のツール実行結果画面

これで、Visual Studio 2026 で開発したカスタム MCP Server をデバッグ実行し、MCP Inspector でその動作を確認することできました。

まとめ

今回は、Visual Studio 2026 を使用して C# でカスタム MCP Server を開発する方法を説明しました。MCP(Model Context Protocol) を活用することで、AI エージェントと外部ツールとの連携を実現できます。

MCP Server プロジェクト テンプレートでも使用されている MCP C# SDK を使用したカスタム MCP サーバー開発は、ASP.NET Core をベースとしているため、これまでの Web アプリケーション開発で蓄積された資産、スキルを流用、活用できることがメリットと考えています。

参考リンク

コメント (0)

コメントの投稿