Skip to main content
Glama
idachev

MCP Java Decompiler Server

by idachev
README.md
# MCP Java Decompiler Server (v1.2.4)

A Model Context Protocol (MCP) server for decompiling Java class files. This server allows AI assistants and tools that implement the MCP protocol to decompile Java bytecode into readable source code.

## Features

- Decompile Java .class files from file path
- Decompile Java classes from package name (e.g., java.util.ArrayList)
- Decompile Java classes from JAR files
- Specify which class to extract from JAR files
- Full MCP-compatible API
- Stdio transport for seamless integration
- Clean error handling
- Temporary file management

## Prerequisites

- Node.js 16+ 
- npm
- No Java requirement (using JavaScript port of CFR decompiler)

## Installation

### Option 1: Using npx (Recommended)

You can run the server directly with npx without installing:

```bash
# Run the server
npx -y @idachev/mcp-javadc
```


### Option 2: Global Installation

```bash
# Install globally
npm install -g @idachev/mcp-javadc

# Run the server
mcpjavadc
```

### Option 3: From Source

```bash
# Clone the repository
git clone https://github.com/idachev/mcp-javadc.git
cd mcp-javadc

# Install dependencies
npm install

# Run the server
npm start
```

## Usage

### Quick Start

The easiest way to run the server:

```bash
npm start
```

### Integrating with MCP Clients

To use with an MCP client (like Claude or another MCP-compatible AI assistant):

```bash
# Configure the MCP client to use this server
npx some-mcp-client --server "node /path/to/mcp-javadc/index.js"
```

### Adding to Claude Code

To add this tool to Claude Code:

```bash
claude mcp add javadc -s project -- npx -y @idachev/mcp-javadc
```

Example MCP client configuration:

```json
{
  "mcpServers": {
    "javaDecompiler": {
      "command": "npx",
      "args": ["-y", "@idachev/mcp-javadc"],
      "env": {
        "CLASSPATH": "/path/to/java/classes"
      }
    }
  }
}
```

## MCP Tools

The server provides three main tools:

### 1. decompile-from-path

Decompiles a Java .class file from a file path.

Parameters:
- `classFilePath`: Absolute path to the Java .class file

Example request:
```json
{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "mcp.tool.execute",
  "params": {
    "tool": "decompile-from-path",
    "args": {
      "classFilePath": "/path/to/Example.class"
    }
  }
}
```

### 2. decompile-from-package

Decompiles a Java class from a package name.

Parameters:
- `packageName`: Fully qualified Java package and class name (e.g., java.util.ArrayList)
- `classpath`: (Optional) Array of classpath directories to search

Example request:
```json
{
  "jsonrpc": "2.0",
  "id": "2",
  "method": "mcp.tool.execute",
  "params": {
    "tool": "decompile-from-package",
    "args": {
      "packageName": "java.util.ArrayList",
      "classpath": ["/path/to/rt.jar", "/path/to/classes"]
    }
  }
}
```

### 3. decompile-from-jar

Decompiles a Java class from a JAR file.

Parameters:
- `jarFilePath`: Absolute path to the JAR file (required)
- `className`: Fully qualified class name to extract from the JAR (required) (e.g., "com.example.MyClass")

Example request:
```json
{
  "jsonrpc": "2.0",
  "id": "3",
  "method": "mcp.tool.execute",
  "params": {
    "tool": "decompile-from-jar",
    "args": {
      "jarFilePath": "/path/to/example.jar",
      "className": "com.example.MyClass"
    }
  }
}
```

## Known Issues

### Java Class Decompilation

The CFR decompiler (@run-slicer/cfr) is a JavaScript port of the popular CFR Java decompiler. It works well with:

1. Standard Java class files
2. Classes that are part of a known package structure
3. Modern Java features (all Java versions)
4. JAR files containing Java classes

If you encounter issues with a specific class file, try:
- Using the `decompile-from-package` tool with explicit classpath
- Using the `decompile-from-jar` tool with explicit class name
- Ensuring the class file is a valid Java bytecode file
- Checking for corrupt class files or JAR archives

### Maven Repository Usage

When working with JAR files from Maven repositories:
- Use the `find ~/.m2 -name "*dependency-name*jar"` command to locate JAR files
- Filter out source and javadoc JARs using `grep -v source | grep -v javadoc`
- Use `jar tf your-jar-file.jar | grep .class` to list available classes in a JAR
- Check that class names match the package structure in the JAR


## Configuration

### Environment Variables

- `CLASSPATH`: Java classpath for finding class files (used when no classpath is specified)

## Development

```bash
# Run in development mode
npm run dev

# Create test fixtures (creates sample Java class for testing)
npm run test:setup

# Run tests 
npm test

# Run linting
npm run lint

# Fix linting issues
npm run lint:fix

# Format code
npm run format

# Run with MCP Inspector for interactive testing
npx @modelcontextprotocol/inspector node ./index.js
```

## Testing with MCP Inspector

You can use the official MCP Inspector tool to test the server functionality interactively:

```bash
# Install and run the MCP Inspector with the decompiler server
npx @modelcontextprotocol/inspector node ./index.js
```

The Inspector provides a user-friendly web interface that allows you to:
- List all available tools
- Execute the decompilation tools with custom parameters
- View and explore the decompiled output
- Test different inputs and error scenarios

This is especially useful for debugging and understanding the MCP server's capabilities before integrating it with other applications.

## How It Works

1. The server uses the CFR decompiler (@run-slicer/cfr - a JavaScript port of the popular CFR Java decompiler)
2. When a decompile request is received, the server:
   - Reads the class file data directly or extracts it from a JAR file
   - Processes the class file with CFR decompiler
   - Returns the formatted source code
3. For JAR files, the server:
   - Creates a temporary directory for extraction
   - Extracts the JAR contents
   - Decompiles the specified class (or first class if none specified)
   - Cleans up the temporary directory

## License

ISC

TDQS

A3.9/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct input source: file path, package name, and JAR file. The purposes are clearly separated with no overlap, so an agent can accurately select the correct tool.

Naming Consistency5/5

All tool names follow the exact same pattern: 'decompile-from-' followed by the source type. This consistent verb_noun structure makes the API predictable and easy to learn.

Tool Count5/5

With only 3 tools, the server is tightly scoped to the core decompilation task. Each tool earns its place by covering a different input method, and the count is well within the ideal range.

Completeness4/5

The server covers the primary decompilation sources (file, package, JAR), which handles most use cases. However, there is no batch operation or way to list classes within a package/JAR, requiring manual workarounds or repeated calls for larger tasks.

Maintenance

ActivityInactive
ResponsivenessUnresponsive