MCP server for .NET assembly analysis, decompilation, and debugging using dnSpy. Provides tools for inspecting PE headers, decompiling code, searching metadata, detecting anti-debug techniques, and managing virtual breakpoints.
This C# MCP server has 19 tools with explicit schemas and descriptions, but critical gaps prevent higher scores. Transport is UNKNOWN (hard cap 40). All tools have descriptions (10-200 chars, baseline 194), but many are terse and lack actionable context. Input schemas are present and typed, but output schemas are undocumented, LLMs cannot plan downstream calls. Error handling returns generic error objects without recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Naming is verb-first and clear (get_pe_info, decompile_method, search_strings), following pattern:tool conventions. Parameters are well-typed with descriptions, but lack constraints (enums, ranges, format hints). The server reads .NET assemblies safely (no secrets exposed), but lacks pagination, result limits, and composition guidance.
Clear breakpoints: by ID, by assembly, or all at once
Decompile the entire assembly to C# source code
Decompile a specific method to C# source code
Decompile a specific type to C# source code
Fast static detection of anti-debug techniques via raw binary byte search and PE header inspection. Checks P/Invoke declarations, managed API usage, TLS callbacks, thread hiding, timing checks, hardware breakpoint detection, and exception-based patterns. No decompilation — completes in milliseconds.
Dump IL (CIL) disassembly for the whole assembly, a type, or a specific method
Transport unknown, cannot verify remote accessibility. Makefile references Python daemon and Docker, but source shows C# with no explicit MCP transport binding visible. Hard cap at 40 until transport confirmed.
Output schemas undocumented. Tools return PEInfo, ResourceInfo, MetadataTokenResult, etc., but LLMs cannot see field names, types, or required fields. Agents cannot plan downstream calls or extract data reliably.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Find methods in the assembly, optionally filtered by name pattern
Get PE/COFF header information, assembly metadata, and target framework of a .NET assembly
List all manifest resources embedded in the assembly
Inspect a breakpoint in full detail: decompiled source, IL context, stack state, and callers
Inspect a specific method: signature, parameters, decompiled source, and optionally IL code
Inspect a type's structure: fields, methods, properties, interfaces, and optionally its decompiled source
List all virtual breakpoints, optionally filtered by assembly
List all P/Invoke (DllImport) declarations in the assembly
List all type definitions in the assembly
Resolve a metadata token (hex, e.g. '0x02000001') to its definition
Search for types, methods, fields, and properties by name pattern
Search for string literals in the assembly's decompiled source
Set a virtual breakpoint at an IL offset in a method. Returns deep decoded context about that point.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes. set_breakpoint and clear_breakpoints modify state but lack destructiveHint annotation.
No pagination or result limits. list_types, find_methods, search_strings, search_members could return thousands of results, blowing context windows. No limit parameter, no offset/cursor, no total count.
Error handling returns generic error objects without recovery guidance. Catch blocks return 'ERROR: {ex.Message}' in response fields (e.g., PEInfo with error string as architecture). LLMs cannot determine if error is retryable, user-fixable, or fatal.