dotnet-mcp-builder について
公式の ModelContextProtocol パッケージを使い、C#/.NET で MCP サーバーと基本的なクライアントを構築するためのスキルです。安定版 2.x API、現行仕様、トランスポート設定、トラブルシューティングを扱います。
主な機能
- 01サーバーとクライアントの実装ガイド
- 02STDIO と HTTP のトランスポート設定
- 03ツール、プロンプト、リソース
- 04現行 SDK と仕様のガイド
- 05テストとトラブルシューティングの資料
活用シーン
- 01.NET MCP サーバーの構築
- 02C# プロジェクトへの MCP プリミティブ追加
- 03トランスポートや登録の問題の調査
MCP 対応
公式 .NET SDK を使った MCP サーバーと基本的なクライアントの実装を案内し、トランスポート設定やプロトコル機能を扱います。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ awesome-copilot --skill dotnet-mcp-builderインストール後、Claude Code で/dotnet-mcp-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/client.mdelicitation.mdmcp-apps.mdpackages.mdprompt-primitive.mdresource-primitive.mdroots.mdsampling.mdserver-features.mdtesting.mdtool-primitive.mdtransport-http.mdtransport-stdio.md詳細
.NET で MCP サーバーを構築する
このスキルは、Microsoft と MCP プロジェクトがメンテナンスする公式の ModelContextProtocol NuGet パッケージを使用して、C#/.NET で本番品質の MCP サーバーと基本的なクライアントを作成するのに役立ちます。安定版 2.x 系列と、現行仕様(2026-07-28)を対象としています。
このスキルが役立つ場面
.NET MCP SDK は 1.0 に到達するまで何年もプレビュー版パッケージ(0.x-preview)が提供されており、v2 では複数のデフォルト設定が変更されました。支援なしでは、モデルは次のような間違いをしがちです。
- 現行のサンプルではコンパイルできない古いプレビュー版を固定する。
- v2 で逆になった 1.x 時代のデフォルト設定を適用する(HTTP はステートフルがデフォルトでしたが、2.x では
Statelessのデフォルトがtrueです)。 - 2026-07-28 仕様で非推奨となった機能(roots、sampling、MCP チャネルのロギング。現在は
[Obsolete]となり、警告MCP9005が出ます)を推奨する。 - 最近の仕様機能を見落とす(複数回のやり取りに対応する
input_required、発見優先のネゴシエーション、MCP Apps/Tasks 拡張パッケージ、elicitation の URL モード、構造化コンテンツブロック)。 - HTTP トランスポートの詳細を誤る(ステートフル/ステートレス、プロキシのバッファリング、OAuth の接続)。
- STDIO の標準出力/標準エラーの落とし穴を忘れる。
タスクがこれらのいずれかに当てはまる場合は、該当するリファレンスを読み込み、その指示に従ってください。本当に単純な作業(例:「このツールメソッドの名前を変更する」)であれば、すべてを読む必要はありません。以下の基本ルールだけは必ず確認してください。
30 秒でわかる基本モデル
.NET MCP サーバーは、DI を通じて MCP サーバーを構成する通常の Microsoft.Extensions.Hosting(または WebApplication)アプリです。
builder.Services
.AddMcpServer()
.WithStdioServerTransport() // OR .WithHttpTransport(...)
.WithToolsFromAssembly() // discover [McpServerToolType] classes
.WithPrompts<MyPrompts>() // optional
.WithResources<MyResources>(); // optional
プリミティブは、属性([McpServerToolType] と [McpServerTool]、[McpServerPromptType] と [McpServerPrompt]、[McpServerResourceType] と [McpServerResource])を付けたクラス上の通常の C# メソッドです。パラメーターは JSON-RPC からバインドされ、SDK はシグネチャと [Description] 属性から JSON Schema を構築します。
エリシテーション、進行状況通知、そして現在は非推奨となったサンプリング/roots/ログ通知といった、サーバーからクライアントへの機能は、注入された IMcpServer のメソッドとして提供されます。
判断ツリー → 読み込むリファレンス
新しいプロジェクトを作成する場合、または現在のパッケージバージョンが不明な場合は、必ず references/packages.md を読み込んでください。
| タスク | 読み込むもの |
|---|---|
| 新しい STDIO サーバー | references/transport-stdio.md |
| 新しい HTTP(Streamable)サーバー | references/transport-http.md |
| ツールの追加/変更 | references/tool-primitive.md |
| プロンプトの追加/変更 | references/prompt-primitive.md |
| リソースの追加/変更 | references/resource-primitive.md |
| ツールの実行中にユーザーへ質問する | references/elicitation.md |
| ツールからクライアントの LLM を呼び出す(2026-07-28 に非推奨) | references/sampling.md |
| ユーザーのプロジェクトルートを読み取る(2026-07-28 に非推奨) | references/roots.md |
| インタラクティブ UI を返す | references/mcp-apps.md |
| 引数の補完、ログ/進行状況通知、フィルター、サーバー指示 | references/server-features.md |
| MCP サーバーを利用する .NET プログラムの作成 | references/client.md |
| MCP Inspector、インメモリテスト、モック、CI | references/testing.md |
複数のプリミティブに関わるタスクでは、複数のリファレンスをまとめて読み込んでください。既存ファイルへの単純な変更であれば、通常はどれも必要ありません。
最優先のルール(常に適用してください。最も頻繁に起きる問題を防ぎます)
- プレビュー版ではなく、現在の安定版パッケージを固定してください。
ModelContextProtocol/ModelContextProtocol.AspNetCore/ModelContextProtocol.Coreの最新の 2.x を使用してください。0.3-previewまたは0.4-previewと書こうとしている場合は、いったん止めて NuGet を確認してください。プレビュー API には破壊的変更が含まれています。1.x も引き続き動作しますが、2026-07-28 の仕様より前のものです。 - STDIO サーバーは stdout に書き込んではいけません。 stdout は JSON-RPC チャネルです。まず何よりも先に
LogToStandardErrorThreshold = LogLevel.Traceを設定し、ツールからConsole.WriteLineを呼び出さないでください。 - 2.x では HTTP はデフォルトでステートレスです(v1.x のデフォルトはステートフルでした。v2 における最も影響の大きい破壊的変更です)。2026-07-28 の改訂版では HTTP セッションがなくなりました。
Stateless = falseを設定すると、サーバーはその改訂版を拒否し、レガシーのinitializeフォールバックを介してクライアントにサービスを提供します。現在のプロトコルの HTTP で「ツールの実行中にユーザーに何かを尋ねる」場合は、複数回の往復を行うInputRequiredExceptionパターンを使用してください。ステートフル HTTP(または STDIO)は、レガシーのElicitAsync/サンプリング/ルートの経路や、プッシュ通知のために確保してください。 - SSE のみの方式は非推奨です。 Streamable HTTP を使用してください。レガシー SSE(
EnableLegacySse = true)は、サポートが必須の古いクライアントがある場合にのみ有効にし、その旨を明記してください。 - 非推奨の機能を中心に新しいサーバーを設計しないでください。 2026-07-28 の仕様では、ルート、サンプリング、MCP チャネルのロギングが非推奨になり、SDK では
[Obsolete](警告MCP9005)としてマークされています。古いクライアントとの互換性は引き続きありますが、新しい設計では複数回の往復を行うinput_requiredパターンとILoggerロギングを優先してください。MCP9005の抑制は、移行期間中の措置として文書化する場合に限ってください。 - ツールとパラメーターには必ず
[Description]を付けてください。 LLM はこれを見て、呼び出すツールと呼び出し内容を決定します。説明が曖昧なのは、ツールが使われない最大の理由です。 - プリミティブを追加するたびに、登録行を必ず示してください。
.WithPrompts<...>()(または.WithPromptsFromAssembly())を追加していない[McpServerPromptType]クラスは認識されません。 - 存在しない API を作り出さないでください。 メソッドが存在するか確信が持てない場合は、その旨を伝えて API リファレンス を確認してください。メソッド名を間違えると、エラーが表面化しないまま失敗する原因になります。新しい v2 拡張パッケージ(
ModelContextProtocol.Extensions.Tasks、ModelContextProtocol.Extensions.Apps)では、特に注意が必要です。これらを使ったコードを書く前にドキュメントを確認してください。
作業スタイル
- 最小限の追加変更にとどめてください。 プロジェクトを再構成するのではなく、既存のツールクラスにメソッドを追加してください。
- 複雑なセットアップでは
dotnet buildを実行してください。 ユーザーが問題に気付く前に、using の不足、属性の誤記、TFM の不一致を検出できます。 - コンテキストから明らかでない場合は、ひな形を作成する前にトランスポート、.NET のバージョン、プリミティブを確認してください。 新しいプロジェクトでは、デフォルトで .NET 10 を使用してください。
ユーザーが行き詰まった場合
推測する前に、次のチェックリストを確認してください。
- STDIO: stdout に何かが書き込まれています(ロガーの出力先、
Console.WriteLine、ライブラリのバナー)。 - HTTP 404: パスが一致していません。
app.MapMcp()はルートにマッピングし、app.MapMcp("/mcp")は/mcp配下に配置します。 - ツールが表示されない: クラスに
[McpServerToolType]がないか、.WithToolsFromAssembly()/.WithTools<T>()が登録されていません。 - 引数がバインドされない: パラメーター名は JSON-RPC の
argumentsキーと一致する必要があります。複合型はSystem.Text.Jsonを介してバインドされます。 - サンプリング/エリシテーション/ルートが機能しない: これらのレガシーなサーバーからクライアントへの呼び出しは、現行プロトコルの HTTP では実行できません。複数回の往復を行う
InputRequiredExceptionパターンに移行するか、(レガシーなパスに限り)Stateless = falseを設定してください。ただし、その場合、HTTP クライアントは旧バージョンのinitializeリビジョンに固定されます。また、クライアントが実際にその機能を通知していることも確認してください。 - 2.x へのアップグレード後に
MCP9005のビルド警告が表示される: コードで非推奨のルート/サンプリング/ログ記録 API が使用されています。移行を計画し、抑制は一時的なものにとどめてください。
それでも解決しない場合は、ユーザーに EverythingServer のサンプルを案内してください。すべての機能を試せます。