C#実践アプリ開発ラボ編」として、MCP(Model Context Protocol)サーバのC#開発を紹介します。

MCPは、LLM(大規模言語モデル)と外部ツール・データを接続するための標準プロトコルです。

本シリーズでは、C#でMCPサーバを開発し、Claude DesktopやVisual Studio GitHub Copilotで活用する方法を解説します。

以下のような方に役立つ内容となっています。

  • MCPサーバの開発仕組み理解に興味がある
  • C#でAI連携ツールを作りたい
  • Claude DesktopやGitHub Copilotを拡張したい

本記事では、MCPの基本概念から、C#による最小限のローカルMCPサーバ実装(現在時刻を返すツール)、Claude Desktopでの動作確認までを紹介します。

プロ太

MCPはAnthropicが提唱したオープンプロトコルで、OpenAI・Microsoft・Googleなど主要AIベンダーが採用を進めています。

C#で自分だけのMCPサーバを作れば、Claude DesktopやVisual Studio GitHub Copilotで自作ツールを呼び出せるようになります!

GitHubで作成したコードを公開しています。

動画も作成しています。

MCPの基本

MCPとは?

MCP(Model Context Protocol) は、LLMと外部ツール・データソースを接続するためのオープンな標準プロトコルです。2024年にAnthropicが提唱しました。

以下の特徴があります。

  • 標準化:一度MCPサーバを作れば、Claude Desktop、GitHub Copilot、ChatGPTなど様々なクライアントから利用可能
  • ベンダー非依存:オープンプロトコルなので、特定ベンダーにロックインされない
  • エコシステム拡大:ブラウザ操作(Playwright)、開発(GitHub)、ローカル操作(Filesystem)に加えて、Figma、Jira、Notion、Google Drive連携など公式・コミュニティ双方でMCPサーバの実装が活発
  • 主要ベンダーが採用:Anthropic、Microsoft、OpenAI、Googleなどが採用を表明
プロ美

一度作ったMCPサーバが、いろんなAIツールから使えるのは便利だね!

MCPのアーキテクチャ

MCPの構成は以下のようになります。

以下の特徴があります。

  • 1つのホストが複数のMCPサーバに接続できる
  • サーバ側が「Tools」「Resources」「Prompts」という3種類のプリミティブを提供する
  • MCPサーバはローカル/リモートの両方あり
  • 通信方式(トランスポート層)は抽象化されているのでSTDIO(ローカル)/Streamable HTTP(リモート)等を選べる
プロ太

例えば、ローカルMCPであれば、ホストがMCPサーバープロセスを起動し、STDIOで通信します。

Webサービスとして提供されているMCPサーバ(リモートMCPサーバ)ならば、Streamable HTTP等で接続します。

MCPサーバーは3種類の機能を提供できます。

  • Tools(ツール):AIが自分の判断で呼び出せる「関数」。外部APIへの問い合わせや計算処理などを実行
  • Resources(リソース):AIが参照できるデータソース。設定ファイルやドキュメントなどを読み取り専用で提供
  • Prompts(プロンプト):再利用可能なテンプレート。よく使う指示パターンを定型化して呼び出せる

今回はよく使われるToolsにフォーカスし、ローカルで動作するMCPサーバを実際に作ってみます。

C#でローカルMCPサーバを作る

「現在時刻を取得して返す」という簡単なローカルMCPサーバを作り、Claude Desktop上で動かしてみます。

手順1:プロジェクト作成とNuGetパッケージ導入

C#のコンソールアプリプロジェクトを作成し、作成したフォルダへ移動します。(Visual Studioの新規プロジェクト作成でもよいです)

dotnet new console -n MyFirstMcp
cd MyFirstMcp

次に公式のMCP開発SDKC#版(NuGetパッケージ)と、ホスティング用のパッケージを追加します。

dotnet add package ModelContextProtocol --prerelease
dotnet add package Microsoft.Extensions.Hosting
プロ太

AnthropicがMicrosoftと共同で開発している公式SDKです。現在、プレリリース版ですが、積極的に開発が進められています。

手順2:MCPサーバのコード作成

Program.csのコードは以下になります。SDK公式サイトのサンプルコードを参考として作ります。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;

// アプリケーションのホストビルダーを作成
var builder = Host.CreateApplicationBuilder(args);

// ログをコンソールに出力する設定
builder.Logging.AddConsole(consoleLogOptions =>
{
    // すべてのログレベルを標準エラー出力に出力
    // (【重要】通常の標準出力はMCPプロトコルの通信に使用されるため)
    consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});

// MCPサーバーの設定
builder.Services
    .AddMcpServer()              // MCPサーバをDIコンテナに登録
    .WithStdioServerTransport()  // 標準入出力でクライアントと通信
    .WithToolsFromAssembly();    // アセンブリ内のツールを自動登録

// アプリケーションを起動
await builder.Build().RunAsync();

// MCPサーバのツールとして登録するクラス
[McpServerToolType]
public static class CurrentTimeTool
{
    // 現在時刻を返すツール
    // Description属性でツールの説明を指定可能
    [McpServerTool, Description("現在の時刻を返します。")]
    public static string GetCurrentTime()
    {
        return DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");
    }
}

今回、標準入出力を使って通信を行うため、余計なログ出力が標準出力で出力されないように注意しましょう。

登録するメソッドのDescription属性として、役割を明確に記述しましょう。これはAIがこのメソッドを呼び出すかどうかの判断材料になるためです。

プロ美

これだけでMCPサーバとして動くんだ!

プロ太

C#のホスティング(アプリの定型的な骨格を作る仕組み)と、MCPサーバSDKのおかげで、コードは最小限で済みますね。

今回メソッドは1つだけですが、複数定義しておくことも可能です。

コードができたら、ビルド(デバッグビルドでよい)を行い、実行用バイナリ(MyFirstMcp.exe)を作っておきます。

手順3:Claude Desktop導入とMCPサーバ設定

Claudeのアカウント登録(無料版でOKです)と、Claude Desktopのインストールと初期設定(Claudeアカウント連携)を行います。

そして次に、Claude Desktopの設定ファイルでMCPサーバを登録します。

Windowsですと、「%APPDATA%\Claude」フォルダ内の「claude_desktop_config.json」ファイルへ以下のようにmcpServersを追記します。
(ファイルがなければ新規作成します)

{
  "mcpServers": {
    "MyFirstMcp": {
      "command": "D:/data/projects/00apps/MyFirstMcp/bin/Debug/net10.0/MyFirstMcp.exe"
    }
  }
 ...
}

commandでは、起動するMCPサーバのパスを指定します。今回は、手順2で作成した「MyFirstMcp.exe」が置いてあるパスです。

プロ太

今回、実験として簡単に動かすため、Debugビルドした実行ファイルをそのまま使います。

手順4:ClaudeDesktopで動かしてみる

設定ファイルを編集して保存した後に、Claude Desktopを起動します。

左のメニューで「開発者」を選び、「ローカルMCPサーバ」の項目で以下のように「MyFirstMcp」が追加されていることを確認しましょう。

チャットで、現在時刻についてAIへ聞いてみましょう。以下のように、登録したMCPを使って回答してよいかを確認されるので、許可しましょう。

次のように、自作したMCPの時刻取得機能(GetCurrentTimeメソッド)を使って回答してくれました!

プロ美

MCPサーバは動作したね!(思ったより簡単だった)

これで、色々メソッド用意すると、ローカル内の色々な情報を参照して回答するようなAIが作れるんだね!

プロ太

その通りです!使い方次第で、いろいろと面白いことができると思います。

ただ、ローカルへのアクセスを許すことになるため、権限を最小化するなどセキュリティに注意は必要ですね。

おまけ:Visual Studio GitHub CopilotでMCPサーバを動かしてみる

今回作ったMCPサーバは、他のクライアントで動かすこともできます。

Visual Studio GitHub Copilotで動かす場合は、例えば以下のようにソリューションフォルダ配下に「.mcp.json」というファイルを配置します。

{
  "servers": {
    "MyFirstMcp": {
      "type": "stdio",
      "command": "D:/data/projects/00apps/MyFirstMcp/bin/Debug/net10.0/MyFirstMcp.exe",
      "args": []
    }
  }
}

そして、そのソリューションをVisual Studioで開き、Copilotのチャットウィンドウを開きます。

右下のツールアイコンを開き、「MyFirstAcp>get_current_time」にチェックをつけましょう。これで登録したMCPサーバの機能が使えるようになります。

現在時刻を取得するように指示をすると、以下のようにMCPサーバの機能を使って取得してくれます。

プロ太

このように、MCPサーバを作ると様々なクライアント(AIツール)から呼び出せるようになります!

まとめ

本記事では、以下の内容を解説しました。

  • MCPの基本概念:LLMと外部ツールを接続するための標準プロトコル
  • MCPのアーキテクチャ:ホスト・クライアント・サーバの関係、Tools/Resources/Promptsの3機能
  • C#でのMCPサーバー実装ModelContextProtocolパッケージを使った最小実装
  • Claude Desktopでの動作確認:設定ファイルの編集と実行

このように、C#で簡単にMCPサーバを作成し、Claude DesktopやVisual Studio GitHub Copilotで活用できることがお分かりいただけたかと思います。

例えば、自社のAPIや社内システムをMCPサーバ化すれば、AIアシスタントが業務データにアクセスして回答する、といったことも可能になります。

次回は、Roslyn(C#のコンパイラ基盤)を使ったC#コード実行MCPサーバを作成します。

  • Claude DesktopからC#コードを送信
  • MCPサーバーでRoslynによる動的コンパイル・実行
  • 実行結果をClaudeに返す

これにより、ClaudeのチャットAIが自分で書いたC#コードをその場で実行・検証できるようになります!

プロ太

引き続き、MCP活用やC#プログラミングについて一緒に学んでいきましょう!

ABOUT ME
プロ太
ソフトウェア開発を楽しく、効率的に行う方法を追求しています。 開発者の視点から技術的課題に向き合い、「純粋な技術的興味に基づく探求」と「実践的な課題解決」という二つの柱を両輪として活動しています。