ASP.NET Core Debugger — MCP Server for AI Agents について
AI エージェント向けに、netcoredbg と DAP を介して .NET/ASP.NET Core アプリをデバッグする MCP サーバーです。基本的なデバッグ操作に加え、例外分析、ハング診断、リクエスト追跡のツールを備えています。
主な機能
- 01デバッグセッションの起動・接続
- 02各種ブレークポイントの設定
- 03スレッド、スタック、変数の確認
- 04式の評価と状態の変更
- 05例外とスレッドハングの分析
- 06リクエスト呼び出し経路の追跡
活用シーン
- 01API応答異常時の実行時値の確認
- 02例外やデッドロックの調査
- 03コードを編集せず状態変更を検証
- 04リクエスト内の遅い処理の特定
MCP 対応
stdioとJSON-RPCでMCPクライアントに接続し、.NETデバッグ用ツールを公開します。Debug Adapter Protocolを介してnetcoredbgを利用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ASP.NET Core デバッグ MCP サーバー
クロスプラットフォーム対応の .NET デバッグ MCP — Linux、macOS、Windows で動作します。
MIT ライセンスの MCP サーバーです。AI エージェント(Claude など)が .NET / ASP.NET Core アプリをデバッグできます。netcoredbg はすべてのプラットフォーム向けに同梱されているため、追加のインストールは不要です。
*「バグは 42 行目あたりだと思います。これを試してください」*と提案する代わりに、エージェントはコードを実行して一時停止し、実際のランタイム値を読み取り、修正を試すために状態を変更して、実際に確認した内容に基づいて回答します。
目次
- 動作を見る — エージェントの動作を示す 5 つの会話
- 仕組み — アーキテクチャ図
- 3 ステップで利用する — Claude へのインストールと登録
- プラットフォーム — 対応 OS / アーキテクチャ一覧
- ツール(27) — 用途別に分類した全ツール
- 比較 — 他の .NET / DAP MCP との比較
- ドキュメント — インストール、使用例、ツールリファレンス、制限事項
- ライセンス
動作を見る
EF Core のクエリが空の結果を返すのはなぜ?
あなた
GET /users/activeは[]を返しますが、DB にアクティブなユーザーがいることはわかっています。実際にはどのようなクエリが実行されていますか?
Claude
UserRepository.GetActiveAsync内で一時停止して、EF Core が実際に送信した内容を読み取ります。SELECT u.* FROM Users AS u WHERE u.IsActive = 1 AND u.TenantId = @__tenantId_0 @__tenantId_0 = 0SQL は正しいですが、パラメーターが間違っています。テナント ID は 1 から始まるのに、
TenantId = 0になっています。リポジトリのコンストラクターでICurrentUser.TenantIdを読み取っていますが、リクエストスコープが解決される前です。修正方法:コンストラクターで取得するのではなく、クエリ内でテナントを読み取るか、IHttpContextAccessorを使ってHasQueryFilterで適用します。
JWT 認証が 401 を返すのはなぜ?
あなた
Anna の
/admin/usersが 401 になりますが、トークンは有効に見えます。認証ハンドラーは実際に何を確認していますか?
Claude
Anna のリクエストを受け取った後、
JwtBearerHandler.HandleAuthenticateAsync内でブレークします。Token signature: ✓ valid Claims built: name : anna role : User iss : https://auth.staging.example aud : app-api exp : 2026-05-26T14:12:00Z (not expired)トークンの検証自体は問題ありません。しかし、クレームは
role=Userです。エンドポイントには[Authorize(Roles="Admin")]が指定されています。そのため、401 は正しい動作です。Anna はまだ上流で管理者になっていません。IdP のレコードを更新するか、このポリシーを見直す必要があります。
再起動せずに修正をテストする
あなた
discountの上限を 100 にすればバグが直ると思います。私がコードに触れずに、その仮説をテストしてください。
Claude
次のチェックアウトで
ApplyDiscountの中に一時停止し、discountをその場で変更します。PricingService.cs:47 で一時停止 discount = 250 ← バグ:2つのプロモーションが重複適用 discount = 100 に設定し、再開しました。 結果: subtotal = $400 final = $300 refund-service complaints: 0上限を 100 にすると、後続の処理が正常に進みます。仮説は確認できました。次は実際に変更を加え、上限をどこに設けるか(
ApplyDiscount自体か、上流のPromoEngineか)を決めましょう。
アプリがハングしています — 実際に何がブロックしているのでしょうか?
あなた
ステージング環境で
/reportsがいつまでも応答しません。アタッチして原因を教えてください。
Claude
アタッチして、
hang_analyzeを実行しました。Thread 12 (HTTP request) → blockedOnTask at ReportService.cs:38 T#14 の Task.Wait() で待機中 Thread 14 (worker) → blockedOnMonitor at SqlConnectionPool.cs:91 SqlConnection を待機中 (プールの最大数=5、使用中=5)よくある同期処理と非同期処理の混在によるデッドロックです。Thread 12 は、別の
SqlConnectionを開く必要があるタスクに対して.Wait()を呼び出していますが、プールはすべて使用中です。保持している接続はタスクが完了するまで解放できず、タスクは接続が空くまで先に進めません。対処法は、ReportServiceの最後までawaitを使うか、await呼び出しの間に接続を保持しないことです。
遅いリクエストの時間は、実際にはどこで費やされているのでしょうか?
あなた
GET /order/42に 800ms かかっています。あちこちにブレークポイントを設定したくありません。どこで時間がかかっているのかだけ見せてください。
Claude
注文処理パイプラインを自動計測して、リクエストを実行します。各処理の開始時にタイムスタンプと引数を記録してから再開するため、コードは通常に近い速度で動作します。
[+ 4ms] → OrderController.GetOrder() id=42 [+ 6ms] --→ OrderService.LookupOrder() id=42 [+ 9ms] ----→ OrderRepository.FetchById() id=42 [+ 14ms] ------→ SqlClient.ExecuteQuery() sql="SELECT * FROM orders WHERE id=42" [+ 287ms] ----→ EnrichmentService.Enrich() raw="rows(...)" [+ 781ms] ------→ HttpClient.PostAsync() url="https://crm.internal/enrich"時間がかかっているのは CRM のデータ補完 HTTP 呼び出しで、
HttpClient.PostAsync内に 500ms かかっています。DB 自体は 5ms でした。EnrichmentService.Enrichの結果をキャッシュするか、リクエスト処理の外に移すとよいでしょう。
仕組み
Claude (MCP client)
│ MCP (stdio / JSON-RPC)
▼
aspnetcore-debugger-mcp ← this server
│ DAP (Debug Adapter Protocol)
▼
netcoredbg ← Samsung's MIT-licensed .NET debugger, child process
│ ICorDebug
▼
target .NET process
エージェントに使いやすい複合ツール(exception_autopsy、stack_explore、hang_analyze、トレースツール)を備えたプロトコルブリッジです。複数の DAP リクエストを 1 回のツール呼び出しにまとめます。
3 ステップで使う
- ツールをインストールする — .NET 10 SDK が必要です。
パッケージにはdotnet tool install -g AspNetCoreDebuggerMcp --prereleaselinux-x64、linux-arm64、win-x64、osx-x64、osx-arm64用のビルド済みnetcoredbgが含まれているため、別途インストールする必要はありません。 - Claude に登録する — 手早く済ませるには、次の CLI コマンドを実行します。
…またはclaude mcp add aspnetcore-debugger -- aspnetcore-debugger-mcp.mcp.json(プロジェクト単位)/~/.claude.json(グローバル)/claude_desktop_config.json(Claude Desktop)を直接編集します。{ "mcpServers": { "aspnetcore-debugger": { "command": "aspnetcore-debugger-mcp" } } } - Claude に話しかけるだけです。
/mcpで接続を確認できます。あとは、「このエンドポイントが null を返すのはなぜですか」 のように説明すれば、エージェントが適切なツールを選びます。
プラットフォーム
ビルド済みの netcoredbg バイナリが実行時に選択されるため、プラットフォームごとにインストールする必要はありません。
| OS | アーキテクチャ | 状態 |
|---|---|---|
| Linux | x64、arm64 | ✅ 対応(Samsung のビルド済みバイナリ) |
| macOS | Intel(x64)、Apple Silicon(arm64) | ✅ 対応(Samsung が提供していないため、arm64 は当プロジェクトでビルド) |
| Windows | x64 | ✅ 対応(Samsung のビルド済みバイナリ) |
ホストには .NET 10 SDK が必要です。MCP サーバー自体はクロスプラットフォーム対応の .NET グローバルツールで、どの環境でも同じインストールコマンドを使えます。
ツール(27)
| カテゴリ | ツール | 用途 |
|---|---|---|
| セッション | debug_launch, debug_attach, debug_disconnect, debug_state | デバッグセッションを開始、アタッチ、または停止します |
| 実行 | debug_continue, debug_pause, debug_step, breakpoint_wait | デバッグ対象を実行し、停止するまで待機します |
| ブレークポイント | breakpoint_set, breakpoint_set_function, breakpoint_set_exception, breakpoint_set_data, breakpoint_remove, breakpoint_list | 行、関数、例外、データのブレークポイントを設定します |
| 検査 | threads_list, stacktrace_get, variables_get, variables_set, evaluate, stack_explore | プログラムの状態を調べ、変更します |
| 例外の詳細分析 | exception_autopsy | 1 回の呼び出しで、例外チェーン+上位フレーム+ローカル変数+ソースコードの抜粋を取得します |
| ハング/デッドロック | hang_analyze | 自動的に一時停止し、各スレッドのブロックパターン(Monitor/Task/Semaphore/async/…)を分類します |
| リクエストトレース | trace_start, trace_get, trace_stop | サーバー側のリクエストトレース — 呼び出しチェーンを自動計測し、各エントリで引数を取得します |
| プロセス I/O | process_read_output | デバッグ対象の stdout/stderr を読み取ります |
| ヘルスチェック | debugger_health | netcoredbg が読み込まれ、同梱バイナリにアクセスできることをすばやく確認します |
比較
| プロジェクト | ライセンス | プラットフォーム | アプローチ | .NET |
|---|---|---|---|---|
| aspnetcore-debugger-mcp (これ) | MIT | Linux + macOS + Windows | DAP 経由の netcoredbg、ASP.NET 向けの複合機能(リクエストトレース、ハング分析) | ネイティブ、.NET 10 |
| debug-mcp | AGPL-3.0 | Linux のみ(Win/macOS は予定) | ICorDebug への直接アクセス、Roslyn によるコードナビゲーション | ネイティブ、.NET 10 |
| mcp-debugger | — | クロスプラットフォーム | DAP | 外部デバッガー経由 |
| dap-mcp | — | クロスプラットフォーム | DAP | 外部デバッガー経由 |
| LLDB MCP | NCSA | クロスプラットフォーム | ネイティブ LLDB | なし |
それぞれに得意分野があります。このプロジェクトは、DAP の上に ASP.NET 向けの複合機能を備えた、MIT ライセンスのクロスプラットフォームな選択肢です。debug-mcp は ICorDebug を通じてランタイム内部をより深く扱えますが、現時点では Linux のみで、ライセンスは AGPL です。
ドキュメント
- インストールと設定 — Claude Code と Desktop の両方に対応した 3 ステップの手順、トラブルシューティング
- できること — Claude に依頼できる 7 つのこと
- 全ツールのリファレンス — すべてのツールの全パラメーター
- 既知の制限 — このツールを使わないほうがよい場合、アダプターとトレースの制限
- macOS Apple Silicon — netcoredbg のビルド
- コントリビューション — リポジトリの構成、テスト、開発サイクル
ライセンス
MIT — LICENSE を参照してください。netcoredbg(MIT)および ModelContextProtocol SDK(MIT)を基盤としています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。