【C# × MCP入門①】Claude Desktopで自作ツールを呼び出す ~MCPサーバ開発の始め方~【C#実践アプリ開発ラボ】
「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開発SDKのC#版(NuGetパッケージ)と、ホスティング用のパッケージを追加します。
dotnet add package ModelContextProtocol --prerelease
dotnet add package Microsoft.Extensions.HostingAnthropicがMicrosoftと共同で開発している公式SDKです。現在、プレリリース版ですが、積極的に開発が進められています。
C#やVisual Studioの使い方などの基本について、C#プログラミングの基礎などを参考にしてください。
手順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つだけですが、複数定義しておくことも可能です。
C#のホスティングの仕組みやDIコンテナの基本について、詳しくは以下の記事も参考にしてください。
コードができたら、ビルド(デバッグビルドでよい)を行い、実行用バイナリ(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#プログラミングについて一緒に学んでいきましょう!




