Repository navigation
What's new
Feature 069: MCP Surface Modernization
A full-surface upgrade to MCP SDK 2.2.0's newer capabilities, applied across all 39 tools. No new debugging capability — this is about making every existing tool behave better as a long-running, machine-readable, cancellable, timed API.
Progress reporting for long operations
resharper_inspect_solution, resharper_inspect_project, batch_evaluate, debug_launch, and code_load now report named progress stages (e.g. acquiring engine → running inspection → parsing report) through the MCP SDK's standard progress channel. A client that never asked for progress sees no difference — reports are silently discarded server-side when no progress token was supplied.
Deferred results via MCP Tasks
The same five tools support the MCP Tasks extension: a client that declares the tasks capability gets back a pollable, cancellable handle instead of blocking the request on the whole operation — useful for resharper_inspect_solution's first-run ~180 MB engine download, or a large batch_evaluate run. A client that doesn't opt in gets the exact byte-for-byte result it always did.
Every tool returns typed structured output
All 39 tools now return a typed C# record (UseStructuredContent = true) instead of a hand-built JSON string. The SDK derives both the tool's outputSchema and its structuredContent from that type by reflection, so schema and payload can no longer drift apart. Every tool shares one envelope ({success, ...fields, error?}), one error shape ({code, message, details?}), and — for the 14 tools that can return large collections — one truncation shape ({returned, available, reason}) applied under a 256 KB response budget.
{
"success": false,
"error": { "code": "TIMEOUT", "message": "debug_launch did not complete within 30000ms" }
}Deterministic (model-free) exception ranking
exception_get_context and stacktrace_get now carry a ranking field: frames scored by 5 documented, constant-weight heuristics (a null-valued local, an external frame with no symbols, the innermost user frame, an exception message referencing a variable, an empty-collection argument) — no LLM call, no network, fully reproducible. Validated against a 10-fixture fault corpus (tests/DebugTestApp/FaultScenarios/) covering null dereferences, nested call chains, async-boundary faults, aggregate exceptions, and a no-symbols case, which correctly reports RankingUnavailable instead of guessing.
Per-call timeouts
31 of the 39 tools — every one that waits on the debuggee, a build, a symbol server, or the ReSharper engine — now accept an optional timeout parameter with a documented default (30 seconds for most; ReSharper's tools keep their own 300-second default). Exhausting the budget returns a TIMEOUT error naming the elapsed time and leaves the session usable for the next call. The 8 tools that only read already-captured, in-memory state don't get one — there's nothing external to bound.
Dependency modernization
- MCP SDK 1.3.0 → 2.2.0 — the upgrade that unlocked everything above.
- ClrDebug 0.4.0 → 0.4.2 — three upstream fixes to the native ICorDebug interop layer (COM GUID marshalling, missing
[PreserveSig]annotations, a dropped parameter on remote runtime startup). - Roslyn / MSBuild aligned to the installed .NET SDK (5.9.0 / 18.9.6) — keeps
MSBuildWorkspace(used bycode_load) in sync with what the SDK actually loads at runtime. - FluentAssertions → AwesomeAssertions 9.6.0 — FluentAssertions 8+ moved to a commercial license; AwesomeAssertions is the same lineage under Apache-2.0. Test-only change, no production code affected.
- ReSharper engine 2026.1.2 → 2026.2.1.
QA
Fixed three CI-only flaky tests surfaced while validating this release on GitHub Actions' macOS/Windows runners (fixed-duration timing races under scheduler contention); all now poll for the real event instead of racing a clock. No functional change.