MCP server that lets AI agents (Claude, Cursor) debug your .NET / ASP.NET Core app
ASP.NET Core Debugging MCP Server
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
The cross-platform .NET debugging MCP — runs on **Linux**, **macOS**, and **Windows**.
**An MIT-licensed MCP server that lets an AI agent (Claude, etc.) debug your .NET / ASP.NET Core app — netcoredbg bundled for every platform, nothing extra to install.**
Instead of *"I think the bug is around line 42, try this"*, the agent runs your code, pauses it,
reads the actual runtime values, mutates state to test a fix, and answers grounded in what it
actually saw.
Contents
- See it in action — 5 conversations showing the agent at work
- How it works — architecture diagram
- Use it in 3 steps — install + register with Claude
- Platforms — supported OS / architecture matrix
- Tools (27) — full tool surface grouped by purpose
- How this compares — vs. other .NET / DAP MCPs
- Docs — install, examples, tool reference, limits
- License
See it in action
Why is my EF Core query returning empty?
**You**
> GET /users/active returns [], but I know there are active users in the DB. What's the
> query actually doing?
**Claude**
> I'll pause inside UserRepository.GetActiveAsync and read what EF Core actually sent.
>
>
>
> The SQL is correct; the parameter is wrong. TenantId = 0, but your tenants start at 1.
> ICurrentUser.TenantId is being read in the repository constructor — before the request
> scope resolves it. Fix: read the tenant inside the query (or apply it via HasQueryFilter
> with IHttpContextAccessor) instead of capturing it at construction.
Why is my JWT auth returning 401?
**You**
> /admin/users is 401-ing for Anna, but her token looks valid to me. What does the auth
> handler actually see?
**Claude**
> I'll break inside JwtBearerHandler.HandleAuthenticateAsync after her request lands.
>
>
>
> The token validates fine — but the claim is role=User. Your endpoint is
> [Authorize(Roles="Admin")]. So the 401 is correct: Anna isn't actually an admin yet
> upstream. Either her IdP record needs updating, or this policy is wrong.
Test a fix without restarting
**You**
> I think capping discount at 100 fixes the bug. Test that hypothesis without me touching
> the code.
**Claude**
> I'll pause inside ApplyDiscount on the next checkout and mutate discount in place.
>
>
>
> Capping at 100 unblocks the flow downstream. Hypothesis confirmed — time to make the edit
> for real and decide where the cap belongs (ApplyDiscount itself, or upstream in
> PromoEngine).
My app is hung — what's actually blocking?
**You**
> /reports hangs forever in staging. Attach and tell me why.
**Claude**
> Attached. Ran hang_analyze.
>
>
>
> Classic sync-over-async deadlock. Thread 12 calls .Wait() on a task that itself needs to
> open another SqlConnection from a fully-held pool. The connection it's holding can't be
> released until the task completes; the task can't proceed until a connection frees up. Fix:
> await all the way down in ReportService, or don't hold a connection across the awaited
> call.
Where is a slow request actually spending its time?
**You**
> GET /order/42 takes 800ms. I don't want to set breakpoints all over — just show me where
> the time is going.
**Claude**
> I'll auto-instrument your order pipeline and fire the request. Each entry logs the
> timestamp + arguments, then resumes — the code runs near-normal speed.
>
>
>
> Time is in the CRM enrichment HTTP call — 500ms inside HttpClient.PostAsync. DB itself
> was 5ms. Worth caching EnrichmentService.Enrich or moving it off the request path.