Major update with new capabilities:
- Rename package from ilspy_mcp_server to mcilspy
- Add 6 new dnfile-based tools that work without ilspycmd:
- search_methods, search_fields, search_properties
- list_events, list_resources, get_metadata_summary
- Add installation/diagnostic tools:
- check_ilspy_installation: verify toolchain status
- install_ilspy: platform-aware installer with auto-detection
for pacman, apt, dnf, zypper, homebrew, winget, chocolatey
- Fix metadata_reader bugs:
- Use _get_row_index helper consistently for dnfile compatibility
- Handle HeapItemBinary conversion for public key tokens
- Update documentation with all 14 tools
426 lines
12 KiB
Markdown
426 lines
12 KiB
Markdown
# mcilspy
|
|
|
|
A Model Context Protocol (MCP) server that provides .NET assembly decompilation capabilities using ILSpy.
|
|
|
|
## Features
|
|
|
|
### ILSpy-based Tools (requires ilspycmd)
|
|
- **Decompile Assemblies**: Convert .NET assemblies back to readable C# source code
|
|
- **List Types**: Enumerate classes, interfaces, structs, delegates, and enums in assemblies
|
|
- **Search Types**: Find types by name pattern with regex support
|
|
- **Search Strings**: Find hardcoded strings in assembly code (URLs, credentials, etc.)
|
|
- **Generate Diagrammer**: Create interactive HTML visualizations of assembly structure
|
|
- **Assembly Information**: Get metadata about .NET assemblies (version, target framework, etc.)
|
|
|
|
### Direct Metadata Tools (no ilspycmd required)
|
|
- **Search Methods**: Find methods by name pattern directly from metadata tables
|
|
- **Search Fields**: Find fields and constants in assemblies
|
|
- **Search Properties**: Find properties by name pattern
|
|
- **List Events**: Enumerate all events defined in an assembly
|
|
- **List Resources**: List embedded resources (files, images, etc.)
|
|
- **Metadata Summary**: Get comprehensive assembly metadata with statistics
|
|
|
|
### Installation & Diagnostics
|
|
- **Check Installation**: Verify ilspycmd and dotnet CLI status
|
|
- **Install ILSpy**: Automatically install or update ilspycmd
|
|
|
|
## Prerequisites
|
|
|
|
1. **ILSpy Command Line Tool**: Install the global dotnet tool:
|
|
```bash
|
|
dotnet tool install --global ilspycmd
|
|
```
|
|
|
|
2. **Python 3.10+**: Required for running the MCP server
|
|
|
|
## Installation
|
|
|
|
Install from PyPI:
|
|
|
|
```bash
|
|
pip install mcilspy
|
|
```
|
|
|
|
Or for development:
|
|
|
|
```bash
|
|
git clone https://github.com/Borealin/mcilspy.git
|
|
cd mcilspy
|
|
pip install -e .
|
|
```
|
|
|
|
## Usage
|
|
|
|
### MCP Client Configuration
|
|
|
|
Configure your MCP client (e.g., Claude Desktop) to use the server:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"ilspy": {
|
|
"command": "python",
|
|
"args": ["-m", "mcilspy.server"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Available Tools
|
|
|
|
#### 1. `decompile_assembly`
|
|
Decompile a .NET assembly to C# source code. This is the primary tool for reverse-engineering .NET binaries.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `output_dir` (optional): Output directory for decompiled files
|
|
- `type_name` (optional): Fully qualified type name to decompile (e.g., "MyNamespace.MyClass")
|
|
- `language_version` (optional): C# language version (default: "Latest")
|
|
- `create_project` (optional): Create a compilable project structure
|
|
- `show_il_code` (optional): Show IL bytecode instead of C#
|
|
- `remove_dead_code` (optional): Remove unreachable code during decompilation
|
|
- `remove_dead_stores` (optional): Remove unused variable assignments
|
|
- `show_il_sequence_points` (optional): Include debugging sequence points in IL output
|
|
- `nested_directories` (optional): Use nested directories for namespaces
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "decompile_assembly",
|
|
"arguments": {
|
|
"assembly_path": "/path/to/MyAssembly.dll",
|
|
"type_name": "MyNamespace.MyClass",
|
|
"language_version": "CSharp10_0"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 2. `list_types`
|
|
List types in a .NET assembly. Typically the **first tool to use** when analyzing an unknown assembly.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `entity_types` (optional): Types to include (accepts full names or single letters):
|
|
- `"class"` or `"c"` (default)
|
|
- `"interface"` or `"i"`
|
|
- `"struct"` or `"s"`
|
|
- `"delegate"` or `"d"`
|
|
- `"enum"` or `"e"`
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "list_types",
|
|
"arguments": {
|
|
"assembly_path": "/path/to/MyAssembly.dll",
|
|
"entity_types": ["class", "interface"]
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 3. `search_types`
|
|
Search for types by name pattern. Essential for finding specific classes in large assemblies.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `pattern` (required): Search pattern to match against type names
|
|
- `namespace_filter` (optional): Only search in namespaces containing this string
|
|
- `entity_types` (optional): Types to search (default: all types)
|
|
- `case_sensitive` (optional): Case-sensitive matching (default: false)
|
|
- `use_regex` (optional): Treat pattern as regular expression (default: false)
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "search_types",
|
|
"arguments": {
|
|
"assembly_path": "/path/to/MyAssembly.dll",
|
|
"pattern": "Service",
|
|
"namespace_filter": "MyApp.Services"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 4. `search_strings`
|
|
Search for string literals in assembly code. Crucial for reverse engineering - finds hardcoded URLs, credentials, configuration, etc.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `pattern` (required): String pattern to search for
|
|
- `case_sensitive` (optional): Case-sensitive matching (default: false)
|
|
- `use_regex` (optional): Treat pattern as regular expression (default: false)
|
|
- `max_results` (optional): Maximum matches to return (default: 100)
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "search_strings",
|
|
"arguments": {
|
|
"assembly_path": "/path/to/MyAssembly.dll",
|
|
"pattern": "api.example.com"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 5. `generate_diagrammer`
|
|
Generate an interactive HTML diagram showing assembly type relationships.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `output_dir` (optional): Output directory for the diagrammer
|
|
- `include_pattern` (optional): Regex pattern for types to include
|
|
- `exclude_pattern` (optional): Regex pattern for types to exclude
|
|
|
|
#### 6. `get_assembly_info`
|
|
Get metadata and version information about an assembly.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
|
|
Returns: Assembly name, version, target framework, signing status, and debug info availability.
|
|
|
|
### Direct Metadata Tools
|
|
|
|
These tools use direct PE/metadata parsing via [dnfile](https://github.com/malwarefrank/dnfile) and don't require ilspycmd to be installed.
|
|
|
|
#### 7. `search_methods`
|
|
Search for methods in an assembly by name pattern. Useful for finding entry points, event handlers, and API endpoints.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `pattern` (required): Search pattern to match against method names
|
|
- `type_filter` (optional): Only search methods in types containing this string
|
|
- `namespace_filter` (optional): Only search in namespaces containing this string
|
|
- `public_only` (optional): Only return public methods (default: false)
|
|
- `case_sensitive` (optional): Case-sensitive matching (default: false)
|
|
- `use_regex` (optional): Treat pattern as regular expression (default: false)
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"name": "search_methods",
|
|
"arguments": {
|
|
"assembly_path": "/path/to/MyAssembly.dll",
|
|
"pattern": "Handle",
|
|
"public_only": true
|
|
}
|
|
}
|
|
```
|
|
|
|
#### 8. `search_fields`
|
|
Search for fields and constants in an assembly. Useful for finding configuration values and magic numbers.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `pattern` (required): Search pattern to match against field names
|
|
- `type_filter` (optional): Only search fields in types containing this string
|
|
- `namespace_filter` (optional): Only search in namespaces containing this string
|
|
- `public_only` (optional): Only return public fields (default: false)
|
|
- `constants_only` (optional): Only return constant (literal) fields (default: false)
|
|
- `case_sensitive` (optional): Case-sensitive matching (default: false)
|
|
- `use_regex` (optional): Treat pattern as regular expression (default: false)
|
|
|
|
#### 9. `search_properties`
|
|
Search for properties in an assembly by name pattern. Useful for finding data model fields and configuration properties.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `pattern` (required): Search pattern to match against property names
|
|
- `type_filter` (optional): Only search properties in types containing this string
|
|
- `namespace_filter` (optional): Only search in namespaces containing this string
|
|
- `case_sensitive` (optional): Case-sensitive matching (default: false)
|
|
- `use_regex` (optional): Treat pattern as regular expression (default: false)
|
|
|
|
#### 10. `list_events`
|
|
List all events defined in an assembly. Useful for understanding event-driven architecture and observer patterns.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
- `type_filter` (optional): Only list events in types containing this string
|
|
- `namespace_filter` (optional): Only list events in namespaces containing this string
|
|
|
|
#### 11. `list_resources`
|
|
List all embedded resources in an assembly. Finds embedded files, images, localization data, etc.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
|
|
#### 12. `get_metadata_summary`
|
|
Get a comprehensive metadata summary with statistics. More accurate than `get_assembly_info` for metadata counts.
|
|
|
|
**Parameters:**
|
|
- `assembly_path` (required): Path to the .NET assembly file
|
|
|
|
Returns: Assembly identity, type/method/field/property/event/resource counts, and referenced assemblies.
|
|
|
|
### Installation & Diagnostics Tools
|
|
|
|
#### 13. `check_ilspy_installation`
|
|
Check if ilspycmd and dotnet CLI are installed and working. Use this to diagnose issues.
|
|
|
|
**Parameters:** None
|
|
|
|
Returns: Installation status with version information and troubleshooting tips.
|
|
|
|
#### 14. `install_ilspy`
|
|
Install or update ilspycmd automatically. Detects your platform and package manager for optimal installation experience.
|
|
|
|
**Parameters:**
|
|
- `update` (optional): If true, update to the latest version even if already installed (default: false)
|
|
- `install_dotnet_sdk` (optional): If true, attempt to install .NET SDK when missing (default: false). Supports automatic detection for:
|
|
- **Arch Linux**: `pacman`
|
|
- **Ubuntu/Debian**: `apt`
|
|
- **Fedora/RHEL**: `dnf`
|
|
- **openSUSE**: `zypper`
|
|
- **macOS**: `homebrew`
|
|
- **Windows**: `winget` or `chocolatey`
|
|
|
|
**Example - Update ilspycmd:**
|
|
```json
|
|
{
|
|
"name": "install_ilspy",
|
|
"arguments": {
|
|
"update": true
|
|
}
|
|
}
|
|
```
|
|
|
|
**Example - Full installation (SDK + ilspycmd):**
|
|
```json
|
|
{
|
|
"name": "install_ilspy",
|
|
"arguments": {
|
|
"install_dotnet_sdk": true
|
|
}
|
|
}
|
|
```
|
|
|
|
### Available Prompts
|
|
|
|
#### 1. `analyze_assembly`
|
|
Analyze a .NET assembly and provide insights about its structure.
|
|
|
|
#### 2. `decompile_and_explain`
|
|
Decompile a specific type and provide explanation of its functionality.
|
|
|
|
## Supported Assembly Types
|
|
|
|
- .NET Framework assemblies (.dll, .exe)
|
|
- .NET Core/.NET 5+ assemblies
|
|
- Portable Executable (PE) files with .NET metadata
|
|
|
|
## Supported C# Language Versions
|
|
|
|
- CSharp1 through CSharp12_0
|
|
- Preview
|
|
- Latest (default)
|
|
|
|
## Quick Start
|
|
|
|
1. **Install the package**:
|
|
```bash
|
|
pip install mcilspy
|
|
```
|
|
|
|
2. **Configure your MCP client** (Claude Desktop example):
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"ilspy": {
|
|
"command": "python",
|
|
"args": ["-m", "mcilspy.server"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
3. **Use the tools** in your MCP client:
|
|
- Ask to decompile a .NET assembly
|
|
- List types in an assembly
|
|
- Generate interactive diagrams
|
|
- Get assembly information
|
|
|
|
## Error Handling
|
|
|
|
The server provides detailed error messages for common issues:
|
|
- Assembly file not found
|
|
- Invalid assembly format
|
|
- ILSpyCmd not installed or not in PATH
|
|
- Permission issues
|
|
- Decompilation failures
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
- `LOGLEVEL`: Set logging level (DEBUG, INFO, WARNING, ERROR). Default: INFO
|
|
|
|
### MCP Client Examples
|
|
|
|
**Claude Desktop** (`config.json`):
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"ilspy": {
|
|
"command": "python",
|
|
"args": ["-m", "mcilspy.server"],
|
|
"env": {
|
|
"LOGLEVEL": "INFO"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Development/Testing**:
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"ilspy": {
|
|
"command": "python",
|
|
"args": ["-m", "mcilspy.server"],
|
|
"env": {
|
|
"LOGLEVEL": "DEBUG"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **"ILSpyCmd not found"**:
|
|
```bash
|
|
dotnet tool install --global ilspycmd
|
|
```
|
|
|
|
2. **"Assembly file not found"**:
|
|
- Check the file path is correct
|
|
- Ensure the file has .dll or .exe extension
|
|
|
|
3. **Permission errors**:
|
|
- Ensure read access to assembly files
|
|
- Check output directory permissions
|
|
|
|
### Debug Mode
|
|
|
|
Enable debug logging to see detailed operation info:
|
|
```json
|
|
{
|
|
"env": {
|
|
"LOGLEVEL": "DEBUG"
|
|
}
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the LICENSE file for details.
|
|
|
|
## Acknowledgments
|
|
|
|
- **Original project by [Borealin](https://github.com/Borealin/ilspy-mcp-server)** - Thank you for creating the foundation for this MCP server!
|
|
- Built on top of the excellent [ILSpy](https://github.com/icsharpcode/ILSpy) decompiler
|
|
- Uses the [Model Context Protocol](https://modelcontextprotocol.io/) for integration |