A .NET debugging MCP server providing breakpoint management, batch evaluation of expressions, and code analysis across a C# workspace
The server demonstrates solid tooling fundamentals with proper schema definition, tool annotations, and structured error handling via ToolResult envelopes. However, descriptions vary significantly in quality, some are comprehensive (batch_evaluate, breakpoint_set), while others are sparse (breakpoint_enable, breakpoint_remove). Parameter descriptions are consistently present but could better explain constraints, defaults, and mutual exclusivity. The tool set is well-composed around debugging concerns, but descriptions lack LLM-optimized guidance on when to use each tool vs. similar ones. No evidence of pagination support or result limits for collection-returning tools (code_find_usages, code_find_assignments). Output schemas are partially documented in descriptions but lack formal JSON Schema definitions in the visible code.
Submit a batch of up to 20 micro-experiments in one call. Each experiment specifies a source location trigger, optional variable capture expressions, an optional condition, and a max hit count. Pre-existing breakpoints are disabled during the batch and restored after. Returns a structured summary with all captured variable values, hit timestamps, and a completion reason. Example response: {"success": true, "completion_reason": "all_triggered", "triggered": 2, "not_triggered": 0, "experiments": [{"index": 0, "status": "triggered", "hit_count": 1, "hits": [{"thread_id": 1, "values": {"counter": "42"}}]}]}
Enable or disable a breakpoint by ID
Remove a breakpoint by ID
Set a breakpoint at a source location (file and line). The debugger will pause execution when this line is reached. If a debug session is active, the breakpoint is verified immediately; otherwise it stays pending until a session starts. Supports optional column targeting for lambdas and conditional expressions. Returns: breakpoint object with id (bp-{guid}), location, state (verified/pending/error), enabled, verified, condition, hitCount. Use breakpoint_list to see all breakpoints, breakpoint_remove to delete. Example response: {"success": true, "breakpoint": {"id": "bp-a1b2c3", "location": {"file": "Program.cs", "line": 42}, "state": "verified", "enabled": true, "hitCount": 0}}
Sparse descriptions for enable/disable/remove breakpoint tools (25 chars or fewer). These descriptions do not explain WHEN to use these tools, what they return, or their effect on debugging state. LLMs cannot distinguish between breakpoint_enable and breakpoint_remove without better guidance.
No formal output schema definitions visible in source code. While batch_evaluate includes an example response in the description, other tools (breakpoint_set, code_find_usages, code_find_assignments) do not document their output structure. LLMs cannot plan downstream tool calls without knowing what fields to extract.
Collection-returning tools (code_find_usages, code_find_assignments) lack pagination parameters (limit, offset, page, cursor) and do not document result limits. A search for a widely-used symbol could return hundreds of results, bloating context. No indication of whether results are truncated or capped.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2025-06-18+ | v2 |
| 2026-03-09 | C | 60 | - | v1 |
Set an exception breakpoint to break when specific exception types are thrown
Find all assignments to a variable, field, or property. Includes simple assignments, compound (+=, -=), increment/decrement (++, --), and out/ref parameters.
Find all usages of a symbol across the workspace. Specify either name (fully qualified) or file+line+column location.
Parameter descriptions lack constraint metadata (ranges, allowed formats, regex patterns). For example, timeoutSeconds and timeoutMs do not specify minimum/maximum bounds. LLMs may pass absurd values (negative timeouts, excessive hits). The rubric baseline expects 'page_size 1 - 100, days 1 - 365' style clarity.
No mutual exclusivity documentation. code_find_usages and code_find_assignments both accept (name) OR (file+line+column), but descriptions do not explicitly state 'Mutually exclusive with file/line/column' clearly enough. LLMs will pass both unless told not to.