/ ディレクトリ / プレイグラウンド / C# SDK
● 公式 modelcontextprotocol ⚡ 即起動

C# SDK

作者 modelcontextprotocol · modelcontextprotocol/csharp-sdk

.NETでMCPサーバーとクライアントを構築 — MCPチームとMicrosoftが共同メンテナンスする公式SDK。

公式の modelcontextprotocol/csharp-sdk です。[McpServerToolType][McpServerTool] などの属性を使ってMCPサーバーを作成したり、任意のMCPサーバーに接続するクライアントを構築できます。.NETの依存性注入、ログ、ホスティングと自然に統合されます。

なぜ使うのか

主な機能

ライブデモ

実際の動作

csharp-sdk.replay ▶ 準備完了
0/0

インストール

クライアントを選択

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

Claude Desktop → Settings → Developer → Edit Config を開く。保存後、アプリを再起動。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

Cursor は Claude Desktop と同じ mcpServers スキーマを使用。プロジェクト設定はグローバルより優先。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

Cline サイドバーの MCP Servers アイコンをクリックし、"Edit Configuration" を選択。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

Claude Desktop と同じ形式。Windsurf を再起動して反映。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "csharp-sdk",
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  ]
}

Continue はマップではなくサーバーオブジェクトの配列を使用。

~/.config/zed/settings.json
{
  "context_servers": {
    "csharp-sdk": {
      "command": {
        "path": "dotnet",
        "args": [
          "run",
          "--project",
          "./MyMcpServer"
        ]
      }
    }
  }
}

context_servers に追加。保存時に Zed がホットリロード。

claude mcp add csharp-sdk -- dotnet run --project ./MyMcpServer

ワンライナー。claude mcp list で確認、claude mcp remove で削除。

ユースケース

実用的な使い方: C# SDK

既存サービスを公開する.NET MCPサーバーを構築する

👤 社内APIを持つC#/.NETエンジニア ⏱ ~45 min intermediate

使うタイミング: .NETを使用しており、書き直しなしでビジネスロジックをエージェントに公開したい場合。

前提条件
  • .NET 8以上のSDKdotnet --version
フロー
  1. プロジェクトを作成する
    dotnet new console -n MyMcpServer. Add ModelContextProtocol NuGet. Use the minimal hosting template for MCP.✓ コピーしました
    → csproj + Program.csにMCPホステッドサービスが含まれる
  2. ツールを追加する
    Create a static class with [McpServerToolType]. Add a method GetOrder(string id) decorated with [McpServerTool(Description="...")] that calls my existing OrderService via DI.✓ コピーしました
    → ツールがコンパイルされ、説明が属性から取得される
  3. インスペクターでテストする
    Run the server as stdio. Launch the MCP Inspector via npx @modelcontextprotocol/inspector dotnet run. Call GetOrder.✓ コピーしました
    → ツール呼び出しが注文のJSONを返す

結果: 既存の.NETサービスとDIコンテナを再利用する、コンパイル済みで型安全なMCPサーバー。

注意点
  • クラスのインスタンスメソッドであるツールメソッドはDIが必要 — 所有クラスをServiceCollectionに登録してください。SDKがDI経由で解決します
  • 適切なキャンセルトークンのない非同期メソッドはシャットダウン時にハングする — すべてのツールの最後のパラメータとしてCancellationToken ctを受け取ってください — SDKが自動的に注入します

MCPサーバーを利用する.NETコンソールアプリを構築する

👤 社内自動化を構築するC#開発者 ⏱ ~30 min intermediate

使うタイミング: LLMループではなく、決定論的な.NETコードでMCPサーバーを呼び出したい場合 — 例:github + filesystem MCPを使うスケジュールジョブ。

フロー
  1. クライアントパッケージを追加する
    Create a console app. Reference ModelContextProtocol client. Add a config pointing at a stdio server (e.g. npx -y @modelcontextprotocol/server-github).✓ コピーしました
    → クライアントがビルドされる
  2. 接続して呼び出す
    Start the client, list tools, call list_repositories with my org name. Print the result.✓ コピーしました
    → リポジトリがコンソールに出力される
  3. スケジュールジョブとしてラップする
    Turn this into a Worker Service that runs nightly. Log metrics via ILogger.✓ コピーしました
    → Workerがdotnet runで実行され、正常にスケジュールされる

結果: MCPをチャットプラグインではなくライブラリとして使用 — 任意の.NETプロセス内で動作します。

注意点
  • Stdioサーバーの起動に時間がかかり、最初の呼び出しがタイムアウトする — アプリ起動時にクライアントを初期化して再利用してください。呼び出しごとに新規生成しないこと

ASP.NET CoreアプリからMCPエンドポイントを提供する

👤 .NETプラットフォームエンジニア ⏱ ~60 min advanced

使うタイミング: 既存のASP.NET Coreサービス内でMCPサーバーをホストし、同じ認証とイングレスの背後に配置したい場合。

前提条件
  • 既存のASP.NET Coreアプリ、または新規作成の意志dotnet new web
フロー
  1. MCPサービスとエンドポイントを追加する
    In Program.cs, builder.Services.AddMcpServer().WithToolsFromAssembly(). Then app.MapMcp('/mcp').✓ コピーしました
    → /mcpエンドポイントがSSEハンドシェイクに応答する
  2. アプリの他の部分と認証を共有する
    Put the /mcp endpoint behind my existing JWT bearer auth middleware. Verify unauth'd requests get 401.✓ コピーしました
    → 未認証は401、認証済みは200
  3. デプロイして接続する
    Deploy. Wire a teammate's Claude Desktop via mcp-remote https://myapp.com/mcp with their JWT.✓ コピーしました
    → チームメンバーがツールを確認できる

結果: 既存APIと同じデプロイ・同じ認証で動作するMCPエンドポイント。

注意点
  • KestrelがリバースプロキシのうしろでSSEレスポンスをバッファリングする — レスポンスバッファリングを無効にしてください。前段のIIS/nginx/Cloudflareでも/mcpのバッファリングを無効にすること
組み合わせ: cloud-run

組み合わせ

他のMCPと組み合わせて10倍の力を

csharp-sdk + cloud-run

.NET MCPサーバーを他のマイクロサービスと共にCloud Runにデプロイする

Containerize my .NET MCP server (mcr.microsoft.com/dotnet/aspnet base), deploy to Cloud Run with a min-instance=1 for cold-start mitigation.✓ コピーしました
csharp-sdk + fastmcp

多言語チーム向けの比較 — 異なるSDK、同じプロトコル

Our team has both Python and .NET services. Use FastMCP for Python APIs and csharp-sdk for .NET APIs — both behind one ContextForge gateway.✓ コピーしました

ツール

このMCPが提供する機能

ツール入力呼び出すタイミングコスト
[McpServerToolType] attribute on a class メソッドを公開するクラスをマークする free
[McpServerTool(Description)] attribute on a method エージェントに呼び出させたい各メソッドに付与 free
AddMcpServer() / WithToolsFromAssembly() fluent builder Program.csの起動時に使用 free
MapMcp('/path') ASP.NET endpoint ASP.NETホスティングの場合のみ free
IMcpClient stdio or SSE transport config クライアント側での使用時 free

コストと制限

運用コスト

APIクォータ
なし — これはSDKです
呼び出しあたりのトークン
MCPプロトコル以外のフレームワークオーバーヘッドなし
金額
無料、MITライセンス
ヒント
.NET組み込みのログとHealthChecksを使い、本番で問題が膨らむ前に検知してください

セキュリティ

権限、シークレット、影響範囲

認証情報の保管: 標準的な.NET方式: 開発時はuser-secrets、本番では環境変数またはKey Vault
データ送信先: ツールがアクセスできる範囲すべて

トラブルシューティング

よくあるエラーと対処法

Tool not appearing in inspector(ツールがインスペクターに表示されない)

WithToolsFromAssembly()は実行中のアセンブリのみをスキャンします。参照ライブラリ内のツールについては、Assemblyを明示的に渡してください: WithTools(typeof(MyTools).Assembly)

DI can't resolve my service in a tool method(ツールメソッドでDIがサービスを解決できない)

ツール型はコンテナに登録する必要があります。AddMcpServerの前にbuilder.Services.AddScoped<OrderService>()を追加してください。

ASP.NET MapMcp returns 404(ASP.NET MapMcpが404を返す)

app.Run()の後にマッピングしています — MapMcpをRunの前に移動してください。また、パスが他のエンドポイントと競合していないか確認してください。

JSON serialization fails on enums(enumのJSONシリアライズが失敗する)

SDKはSystem.Text.Jsonを使用しています。enumに[JsonStringEnumConverter]を付与するか、グローバルに設定してください。

代替案

C# SDK 他との比較

代替案代わりに使う場面トレードオフ
FastMCP (Python)Pythonを使用できる場合 — サンプルのエコシステムがより充実言語が異なる。チームのスキルセット次第
TypeScript MCP SDKNode / TypeScriptのチームの場合同様のDX、言語の選択の違い

その他

リソース

📖 GitHub の公式 README を読む

🐙 オープンな issue を見る

🔍 400以上のMCPサーバーとSkillsを見る