Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

.NET Debugger for MCP

NUGET · DOTNETDEBUGGER.MCP · SCANNED OCT 4

Give an AI agent a real .NET debugger: breakpoints, stepping, locals, expression evaluation.

−1 this week 75 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency45
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Build provenance not yet verified. View diagnostics → Unverified
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 18 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability75
  • AI-judged instruction clarity (good).Pass
  • Tool/resource definitions use about 3224 tokens (~97/item across 33 items; 33 tools + 0 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management77
  • Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage65
  • 97% of tools have a non-trivial description (not blank, and not just the tool's name).Partial
  • 0% of tool parameters carry a description.Fail
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_breakpoint" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 33 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Install

How do I install the .NET Debugger for MCP server?

.NET Debugger for MCP runs locally as a NuGet package, launched with dnx DotnetDebugger.Mcp@0.5.0 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

nuget · DotnetDebugger.Mcp

# add to Claude Code
claude mcp add nevse-dotnet-debugger-mcp -- dnx DotnetDebugger.Mcp@0.5.0 --yes
// .cursor/mcp.json
{
  "mcpServers": {
    "nevse-dotnet-debugger-mcp": {
      "command": "dnx",
      "args": [
        "DotnetDebugger.Mcp@0.5.0",
        "--yes"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "nevse-dotnet-debugger-mcp": {
      "command": "dnx",
      "args": [
        "DotnetDebugger.Mcp@0.5.0",
        "--yes"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add nevse-dotnet-debugger-mcp -- dnx DotnetDebugger.Mcp@0.5.0 --yes
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "nevse-dotnet-debugger-mcp": {
      "type": "local",
      "command": [
        "dnx",
        "DotnetDebugger.Mcp@0.5.0",
        "--yes"
      ],
      "enabled": true
    }
  }
}
# ~/.hermes/config.yaml
mcp_servers:
  nevse-dotnet-debugger-mcp:
    command: "dnx"
    args: ["DotnetDebugger.Mcp@0.5.0", "--yes"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "nevse-dotnet-debugger-mcp": {
      "Transport": "stdio",
      "Command": "dnx",
      "Arguments": [
        "DotnetDebugger.Mcp@0.5.0",
        "--yes"
      ]
    }
  }
}
// mcp.json
{
  "mcpServers": {
    "nevse-dotnet-debugger-mcp": {
      "command": "dnx",
      "args": [
        "DotnetDebugger.Mcp@0.5.0",
        "--yes"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Oct 26 −4
    • Stability: pass → 0.77 functional
  • 3 Oct 26 +1
    • Stability: 0.97 → pass security
  • 1 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 29 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 26 Sept 26 +1
    • Stability: 0.97 → pass security
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 8 Oct 2026 · Analysed nuget/DotnetDebugger.Mcp@0.5.0

Provenance Inconclusive

We could not complete the check, so nothing is claimed either way. This is a gap on our side, not a finding about the package.

Result Inconclusive
Ecosystem nuget
Reason Signature present, unverified

Signer

Signed as Repository signature, names nuget.org
Subject CN=NuGet.org Repository by Microsoft,O=NuGet.org Repository by Microsoft,L=Redmond,ST=Washington,C=US
Issuer CN=DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1,O=DigiCert\, Inc.,C=US
Valid from 23 Feb 2024
Valid until 18 May 2027
Service index https://api.nuget.org/v3/index.json
Owners nevse83

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

Registry declarations For information only

What the registry and the package's own manifest say about this version. The publisher or the registry writes these, nothing here is verified, and none of it affects the score.

Repository https://github.com/nevse/dotnet-debugger-mcp
Repository type git
Commit f4939f3669e1fd1b23e82ee59ed89b568d172eee
Project URL https://github.com/nevse/dotnet-debugger-mcp
MCP tools · 33 exposed · ~3,224 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
attach_to_process ~100

Attach the debugger to a .NET process by process ID. Attaching while another process is already being debugged opens a second session instead of failing, up to SHARPDBG_MAX_SESSIONS (one by default). The session_id in the response is what the other tools take to say which process they mean; it can be omitted while only one session is open.

NameTypeReqDescription
process_idintegeryes–
session_idinteger|null––

No output schema declared.

No examples provided.

build_mobile_app ~181

Build a .NET MAUI project for a device so that it can be debugged, which an ordinary 'dotnet build' does not produce: the app is built against CoreCLR rather than Mono and carries the remote debugging library inside it. Pass the project's .csproj and a device id from list_mobile_devices. Needs the remote CoreCLR debugger libraries, which are part of Visual Studio and are not shipped with this server - set SHARPDBG_VSDBG_LIBRARIES to the directory holding VsdbgRemoteCoreclrHost and VsdbgRemoteCoreclrTarget, or pass it as vsdbg_libraries_path. Then call launch_mobile_app.

NameTypeReqDescription
configurationstring––
device_idstringyes–
project_pathstringyes–
target_frameworkstring––
vsdbg_libraries_pathstring––

No output schema declared.

No examples provided.

close_session ~108

Close a debug session, detaching from its process if it is still attached. A program this session launched is killed, but the debugger does not always confirm it: program_may_be_running is true when it did not, and the program may have survived, so check it. An attached process the debugger never confirmed releasing stays suspended, and only the message says so. Use this to free a slot when SHARPDBG_MAX_SESSIONS has been reached.

NameTypeReqDescription
session_idintegeryes–

No output schema declared.

No examples provided.

continue_execution ~27

Continue execution until the next breakpoint or process exit

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

detach_from_process ~136

Detach the debugger from a session's process, leaving that process running. A program the session launched is killed instead: it exists only for this session. program_may_be_running is true when the debugger never confirmed the terminate, meaning the program may have survived - check it rather than assuming. The flag covers launched programs only: an attached process the debugger never confirmed releasing is left suspended rather than running, and only the message says so. The session stays open and free, so the next attach_to_process or launch_program reuses it rather than taking another slot; close_session removes it.

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

evaluate_expression ~94

Evaluate a C# expression in the context of a stack frame. An expression that runs code in the target - a property getter, ToString(), any method call - is allowed and does not cost the session. When the result is an object, variables_reference is non-zero and can be walked with expand_variable.

NameTypeReqDescription
expressionstringyes–
frame_idintegeryes–
session_idinteger|null––

No output schema declared.

No examples provided.

expand_variable ~73

Expand a variables_reference into its members, which may themselves carry references to expand further. References come from get_variables, from evaluate_expression and from this tool. Expand while still stopped - a reference only applies to the stop it was taken in.

NameTypeReqDescription
session_idinteger|null––
variables_referenceintegeryes–

No output schema declared.

No examples provided.

explain_icordebug_interface ~16

No description provided.

NameTypeReqDescription
interface_namestringyes–

No output schema declared.

No examples provided.

get_debugging_flow ~41

Get the step-by-step flow for a debugging operation such as 'setting a breakpoint' or 'evaluating an expression'

NameTypeReqDescription
operationstringyes–

No output schema declared.

No examples provided.

get_exception_info ~291

Read the exception the debuggee is stopped on: its type, message, the stack trace it carries and the exception it wraps. Nothing else reports these - a stop with stop_reason 'exception' names neither the type nor the message - so this is what turns one into something you can act on. Only works while stopped on an exception; omit thread_id to read the thread the stop was reported on. Note that set_exception_break_mode 'never' resumes exception stops before a caller can see them, so there is nothing to read in that mode. This is the one read that runs code inside the target - two property getters, three when the exception wraps another - so it is much slower than a stack trace or a variable read, and it gives up after SHARPDBG_EVAL_TIMEOUT_MS. inner_exception goes one level deep, and whether the program is going to handle this one is not reported at all: the debugger does not pass that on. For anything beyond these fields - a second level of inner exception, HResult, Source, Data, a property of your own exception type - the exception object itself is in scope as $exception, so evaluate_expression with '$exception.HResult' or '$exception.InnerException.InnerException' reads it, and get_variables on the frame lists it among the locals to expand.

NameTypeReqDescription
session_idinteger|null––
thread_idinteger|null––

No output schema declared.

No examples provided.

get_process_status ~48

Get the status of a debug session. Omit session_id unless more than one session is open, in which case list_sessions shows which is which.

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

get_program_output ~94

Read what the debuggee has written to stdout and stderr, oldest line first. Only a launched program's output is captured - a process attached to with attach_to_process keeps its own console, and nothing appears here. Returns at most max_lines (default 100) of the most recent output; the last 1000 lines are kept.

NameTypeReqDescription
max_linesinteger––
session_idinteger|null––

No output schema declared.

No examples provided.

get_stack_trace ~36

Get the call stack for a specific thread ID

NameTypeReqDescription
session_idinteger|null––
thread_idintegeryes–

No output schema declared.

No examples provided.

get_threads ~25

Get all threads in the attached process

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

get_variables ~35

Get local variables for a specific stack frame ID

NameTypeReqDescription
frame_idintegeryes–
session_idinteger|null––

No output schema declared.

No examples provided.

launch_mobile_app ~191

Prepare a built .NET MAUI app for debugging on a device without starting it yet, the way launch_program does for a desktop program: set breakpoints now - they will be in place before the app's first line runs - and then call start_program. Build it with build_mobile_app first, with the same project, device and configuration. start_program is where the time goes: it boots the emulator if it is cold, installs the app and launches it, which is minutes rather than seconds. Everything after that - breakpoints, stepping, variables, expressions - works exactly as it does for a local process.

NameTypeReqDescription
configurationstring––
device_idstringyes–
project_pathstringyes–
session_idinteger|null––
target_frameworkstring––
uninstall_appboolean––
vsdbg_libraries_pathstring––

No output schema declared.

No examples provided.

launch_program ~170

Launch a .NET program under the debugger without running it yet. This is the only way to debug what happens at startup: breakpoints set now are in place before the first line executes. Pass the built program - the .dll or the executable next to it - not a project file. Then set breakpoints and call start_program to run it. The program's output is captured rather than printed, and read with get_program_output. A program launched this way is killed when the session is detached or closed, though the debugger does not always confirm it - both report program_may_be_running when it did not.

NameTypeReqDescription
argsarray––
environmentobject––
program_pathstringyes–
session_idinteger|null––
working_directorystring––

No output schema declared.

No examples provided.

list_breakpoints ~29

List all breakpoints currently set in the debug session

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

list_debugging_concepts ~20

List all available debugging concepts organized by category

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_dotnet_processes ~61

List all .NET processes currently running on the system. owner tells you whether a process belongs to the user running this server: attaching is refused for 'other_user' and 'unknown' unless SHARPDBG_ALLOW_OTHER_USER_PROCESSES is set.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_mobile_devices ~109

List the devices, emulators and simulators a .NET MAUI app can be built for and debugged on: Android emulators and phones, iOS simulators and devices, and this Mac as a Mac Catalyst target. The id is what build_mobile_app and launch_mobile_app take. An Android emulator does not have to be running - the debugger boots a cold one itself - and is identified by its AVD name rather than by an adb serial, which it only has once booted.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_sessions ~60

List the open debug sessions, which is how you find the session_id to pass to the other tools. A session is created by attach_to_process or launch_program and lives until close_session or detach. started=false means the program is launched and waiting to run.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

pause_execution ~27

Pause execution (break into debugger at current location)

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

remove_breakpoint ~49

Remove a previously set breakpoint by its ID, whether it was set with set_breakpoint or set_function_breakpoint

NameTypeReqDescription
breakpoint_idintegeryes–
session_idinteger|null––

No output schema declared.

No examples provided.

search_debugging_concepts ~31

Search the .NET debugger documentation for concepts related to the query

NameTypeReqDescription
querystringyes–

No output schema declared.

No examples provided.

set_breakpoint ~220

Set a breakpoint at a specific file and line number. Optionally pass condition, a C# expression evaluated in the frame that must be true to stop, and/or hit_condition, a hit count in the form '5', '==5', '>5', '>=5', '<5', '<=5' or '%5' (every 5th hit). Hit counts include hits where condition was false, and are reset whenever any breakpoint in the same file is added, changed or removed. Calling this again for the same file and line replaces both conditions, so omitting one clears it. verified=false means the breakpoint is not bound: usually the path or line does not exist in the target, but a breakpoint in an assembly that has not been loaded yet binds by itself once it loads, so check list_breakpoints again rather than setting it repeatedly.

NameTypeReqDescription
conditionstring––
file_pathstringyes–
hit_conditionstring––
lineintegeryes–
session_idinteger|null––

No output schema declared.

No examples provided.

set_exception_break_mode ~308

Control which exceptions suspend the debuggee. mode 'always' (the default) stops on every throw, including ones the program catches itself, so a program that uses exceptions routinely suspends constantly. mode 'user_unhandled' stops only on exceptions that escape your own code, which is what a debugger normally defaults to and usually what you want. mode 'unhandled' stops only on exceptions that go on to kill the program - the cheapest quiet mode, since a crash cannot be hidden and nothing else is reported or resumed. mode 'never' reports nothing at all and resumes every stop, which costs a round trip per exception and is worth it only for exceptions_seen and exceptions_ignored: they are the sole sign that a program is throwing steadily behind a mode that shows nothing. Narrow 'always' or 'user_unhandled' to particular exception types with exception_types, one fully-qualified name per entry - 'System.IO.IOException', matched exactly, not by suffix. Set types_are_excluded to stop on everything except those instead. The list is one way or the other, never both at once, which is the debugger's rule. The two quiet modes take no types, because they report nothing to filter. Changing mode takes effect at once, and releases an exception stop already in progress if the new mode hides it.

NameTypeReqDescription
exception_typesarray––
modestringyes–
session_idinteger|null––
types_are_excludedboolean––

No output schema declared.

No examples provided.

set_function_breakpoint ~272

Set a breakpoint on a method by name, for when the method is known but the file and line are not. function_name accepts 'Method', 'Type.Method' or 'Namespace.Type.Method'; the type part matches by suffix, so 'Program.Work' matches 'MyApp.Program.Work'. Every method matching the name binds, which includes overloads and same-named methods in several assemblies - bound_locations reports each place it bound, so check it to see what was actually caught. Narrow it with a parameter list, 'Work(int, string)', where C# keywords, nullables and generics are understood ('int', 'string?', 'List<int>'), or by generic arity, 'Work<T>'. condition and hit_condition work as they do for set_breakpoint, and re-sending resets the hit counts of all function breakpoints. Like line breakpoints this needs portable PDBs for the target; verified=false with 'No functions matching' means the name matched nothing in the modules loaded so far, and it will bind by itself if a later assembly contains it. Remove it with remove_breakpoint, the same as a line breakpoint.

NameTypeReqDescription
conditionstring––
function_namestringyes–
hit_conditionstring––
session_idinteger|null––

No output schema declared.

No examples provided.

start_program ~90

Run the program prepared by launch_program. Returns as soon as it is running, which can be after it has already hit a breakpoint; use wait_for_stop to catch that. process_id is the program the debugger started, reported from the moment it exists; it is null if the debugger has not said so yet, and get_process_status has it once it does.

NameTypeReqDescription
session_idinteger|null––

No output schema declared.

No examples provided.

step_into ~35

Step into the current line (enter called methods)

NameTypeReqDescription
session_idinteger|null––
thread_idintegeryes–

No output schema declared.

No examples provided.

step_out ~36

Step out of the current method (execute until return)

NameTypeReqDescription
session_idinteger|null––
thread_idintegeryes–

No output schema declared.

No examples provided.

step_over ~41

Step over the current line (execute and stop at next line in same method)

NameTypeReqDescription
session_idinteger|null––
thread_idintegeryes–

No output schema declared.

No examples provided.

wait_for_stop ~170

Wait for the debuggee to stop and return the same fields as get_process_status. Blocks until a breakpoint is hit, a step completes, the process is paused or throws, or the process exits, and gives up after timeout_ms (default 10000, maximum 300000). Use this after continue_execution or a step instead of polling get_process_status in a loop. stopped=false means the process was still running when the wait expired, which is not an error - call again to keep waiting. stop_reason 'exited' means the process is gone and cannot be stepped or continued; exit_code is what it returned, and is null for a process attached to rather than launched, whose code the debugger cannot read.

NameTypeReqDescription
session_idinteger|null––
timeout_msinteger––

No output schema declared.

No examples provided.

Common questions

What is the .NET Debugger for MCP server?

.NET Debugger for MCP is listed in the public MCP registry as io.github.nevse/dotnet-debugger-mcp. Give an AI agent a real .NET debugger: breakpoints, stepping, locals, expression evaluation. This page covers its NuGet package (DotnetDebugger.Mcp).

Is the .NET Debugger for MCP server safe to use?

.NET Debugger for MCP scores 75 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the .NET Debugger for MCP server expose?

.NET Debugger for MCP exposes 33 tools: expand_variable, set_function_breakpoint, launch_program, attach_to_process, start_program, and 28 more. Their descriptions and schemas cost roughly 3,224 tokens of context every time the server is loaded.

Is the .NET Debugger for MCP server still maintained?

.NET Debugger for MCP is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the .NET Debugger for MCP server under?

.NET Debugger for MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.