Skip to main content
Glama
BROKENISTXD

ILSpy MCP Server

by BROKENISTXD
README.md
# ILSpy MCP Server

A production-grade MCP server that exposes all major ILSpy CLI features as separate tools for decompiling .NET assemblies.

## Features

- **10 MCP Tools**: Decompile, export projects, extract IL, list types/methods, resolve references, and more
- **Workflow Orchestration**: Automated end-to-end processing of .NET assemblies
- **Structured Output**: JSON reports with metadata, types, methods, and logs
- **Forward Compatible**: Raw ilspycmd tool for unsupported features
- **Cross-Platform**: Works on Windows, Linux, and macOS

## Prerequisites

- Python 3.10+
- ILSpy CLI (ilspycmd) installed and available in PATH
  - Download from: https://github.com/icsharpcode/ILSpy/releases
  - Or install via: `dotnet tool install -g ilspycmd`

## Installation

```bash
pip install -r requirements.txt
```

## Usage

### Option 1: MCP Server Mode

Start the MCP server and use it with any MCP-compatible client:

```bash
python server.py
```

The server communicates via stdio using JSON-RPC. Configure it in your MCP client using `config.json`.

### Option 2: Direct Orchestrator Usage

Process assemblies directly using the orchestrator:

```bash
# Single assembly
python orchestrator.py assembly.dll

# Multiple assemblies
python orchestrator.py assembly1.dll assembly2.dll assembly3.exe

# With options
python orchestrator.py assembly.dll --langver:11 --nullable --no-records
```

### Option 3: Python API

Use the orchestrator programmatically:

```python
from orchestrator import process_assemblies, save_report
from pathlib import Path

report = process_assemblies(
    ["assembly.dll"],
    language_version="11",
    nullable_enabled=True,
    handle_records=True,
)

save_report(report, Path("work/report.json"))
```

## Tools

1. **decompile_file** - Decompile assembly to C# files
   - Supports: `--langver`, `--nullable`, `--with-records`, etc.

2. **export_project** - Export compilable C# project
   - Includes: References, metadata, project files

3. **get_il** - Extract IL code
   - View intermediate language instead of decompiled C#

4. **list_types** - List all types in assembly
   - Returns: Namespace-qualified type names

5. **list_methods** - List methods for a type
   - Input: Full type name (e.g., `Namespace.ClassName`)

6. **resolve_references** - Analyze external references
   - Extracts: Package references, assembly references

7. **set_language_version** - Control C# language version
   - Versions: 9, 10, 11, 12, etc.

8. **enable_nullable_context** - Enable/disable nullable reference types
   - Options: `true` or `false`

9. **handle_records_init_only** - Handle record types properly
   - Ensures: Records and init-only setters decompile correctly

10. **raw_ilspycmd** - Run arbitrary ilspycmd commands
    - Forward-compatible with all future ILSpy features

## Output Structure

```
work/
  input/              # Input assemblies (optional)
  output/
    decompile/        # Decompiled C# files
      <assembly>/
        *.cs files
    project/          # Exported projects
      <assembly>/
        *.csproj
        *.cs files
    il/               # IL code output
      <assembly>/
        *.il files
  report.json         # Final structured JSON report
```

## JSON Report Format

The orchestrator generates a structured JSON report:

```json
{
  "assemblies": [
    {
      "assembly": "example.dll",
      "status": "success",
      "paths": {
        "decompiled": "work/output/decompile/example/",
        "project": "work/output/project/example/",
        "il": "work/output/il/example/"
      },
      "types": [
        {
          "name": "Namespace.MyClass",
          "methods": ["Main", "DoSomething"],
          "il_size": {"Main": 123, "DoSomething": 42}
        }
      ],
      "references": ["System", "System.Linq"],
      "flags_used": ["--langver:11", "--nullable"],
      "logs": {
        "stdout": "...",
        "stderr": "..."
      }
    }
  ]
}
```

## Workflow

The orchestrator follows this workflow for each assembly:

1. **Decompile** → Generate C# source files
2. **Export Project** → Create compilable project with references
3. **Extract IL** → Get intermediate language code
4. **List Types** → Discover all types in assembly
5. **List Methods** → For each type, extract methods
6. **Resolve References** → Analyze dependencies
7. **Apply Settings** → Language version, nullable context, records
8. **Generate Report** → Collect all metadata into JSON

## Error Handling

- All tools return structured JSON with `returncode`, `stdout`, and `stderr`
- Failed operations are marked with `status: "error"` in the report
- Full error logs are included in the report for debugging
- Tools are idempotent - safe to run multiple times

## Examples

See `example_usage.py` for complete examples of:
- Processing single assemblies
- Processing multiple assemblies
- Using different language versions
- Enabling/disabling nullable context
- Custom flags and options

## License

This project wraps ILSpy CLI. Please refer to ILSpy's license for usage terms.