Deobfuscate MCP Server
# Deobfuscate MCP Server
An **LLM-Optimized** Model Context Protocol (MCP) server designed to help Large Language Models reverse-engineer, navigate, and understand minified and bundled JavaScript code.
## Why this Server?
Standard "beautifiers" only format code, leaving LLMs to struggle with massive, linear text files that overflow context windows. This server treats minified code as a **searchable database**, allowing LLMs to:
1. **De-obfuscate & Unbundle**: Uses `webcrack` to split Webpack/Browserify bundles into individual modules.
2. **See the Architecture**: Returns a JSON summary of the file's structure (exports, functions) before reading the code.
3. **Navigate Randomly**: Read specific modules on-demand (`get_module`) instead of the whole file.
4. **Search Semantically**: Find where specific strings or patterns exist across thousands of unbundled modules.
## Features
- **`deobfuscate`**: The entry point. Unpacks bundles and caches them in memory.
- **`returnCode`** (default `false`): Returns a summary by default to save context. Set to `true` to see the full code.
- **`skipVendor`**: Filter out `node_modules` and webpack boilerplate to focus on app code.
- **`mangle`**: Shorten variable names to save tokens.
- **`jsx`**: Restore React JSX syntax.
- **`analyze_structure`**: Returns a high-level AST summary (functions, classes, exports) to save tokens.
- **`list_modules`**: Lists all modules found in the unpacked bundle.
- **`list_functions`**: Scans cached modules to list defined functions/classes with signatures and parameters.
- **`get_call_graph`**: Generates a call graph for a specific function, identifying what it calls and what calls it.
- **`get_module`**: Fetches the formatted source code of a single module.
- **`get_symbol_source`**: Extracts only a specific function, class, or variable to save tokens.
- **`search_modules`**: Regex/String search across all modules.
- **`format_code`**: Standard Prettier formatting for JS/HTML/CSS.
- **`get_help`**: Returns detailed documentation for any tool.
## Installation & Setup
### Install from npm (Recommended)
```bash
npm install -g deobfuscate-mcp-server
```
### Build from source
```bash
git clone https://github.com/ricardodeazambuja/deobfuscate-mcp-server.git
cd deobfuscate-mcp-server
npm install
npm run build
```
### Pack and Install (Optional)
To create a distributable tarball and install it globally:
```bash
npm pack
npm install -g ./deobfuscate-mcp-server-1.0.0.tgz
```
## Client Configuration
To use this server with your favorite LLM client, add the following configuration.
### Claude Code
Run the following command in your terminal:
```bash
claude mcp add deobfuscate-mcp-server -- npx -y deobfuscate-mcp-server
```
Alternatively, edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"deobfuscate-mcp-server": {
"command": "npx",
"args": ["-y", "deobfuscate-mcp-server"]
}
}
}
```
### Gemini CLI
Run the following command in your terminal:
```bash
gemini mcp add deobfuscate-mcp-server npx -y deobfuscate-mcp-server
```
Alternatively, edit `~/.gemini/settings.json`:
```json
{
"mcpServers": {
"deobfuscate-mcp-server": {
"command": "npx",
"args": ["-y", "deobfuscate-mcp-server"]
}
}
}
```
### Antigravity
Run the following command in your terminal:
```bash
antigravity --add-mcp '{"deobfuscate-mcp-server": {"command": "npx", "args": ["-y", "deobfuscate-mcp-server"]}}'
```
Alternatively, edit `~/.antigravity/settings.json`:
```json
{
"mcpServers": {
"deobfuscate-mcp-server": {
"command": "npx",
"args": ["-y", "deobfuscate-mcp-server"]
}
}
}
```
### Development / Local Usage
If you are running the server from the source code, replace the command with:
```json
"command": "node",
"args": ["ABSOLUTE_PATH_TO_DIST/index.js"]
```
*(Replace `ABSOLUTE_PATH_TO_DIST` with the actual absolute path to the `dist` folder on your machine)*
## Usage
Start the server:
```bash
node dist/index.js
```
### Example Workflow for an LLM
1. **User**: "Analyze this minified file: `bundle.min.js`..."
2. **LLM**: Calls `deobfuscate(code="...", skipVendor=true)`.
* *Server*: "Deobfuscation complete. Unbundled 15 modules. Skipped 45 vendor modules..."
3. **LLM**: "Okay, I see the entry point requires module 42. What is that?"
4. **LLM**: Calls `get_module(id="42")`.
* *Server*: Returns code for module 42.
5. **LLM**: "Where is the 'login' function defined?"
6. **LLM**: Calls `search_modules(query="function login")`.
* *Server*: "Found in module 88."
7. **LLM**: "I just want to see the login function logic."
8. **LLM**: Calls `get_symbol_source(symbolName="login", moduleId="88")`.
* *Server*: Returns only the source for the 'login' function.
## Development
- **Build**: `npm run build`
- **Test**: `npm test`
## Limits
- **File Size**: The server accepts input files (bundles) up to **50MB**.
- **Memory**: Unbundled modules are cached in RAM. Very large bundles (hundreds of MBs unpacked) may exhaust the server's available memory depending on your environment.
TDQS
Scored across 10 tools
Most tools have distinct purposes, but some potential overlap exists between 'list_functions' and 'search_modules' (both involve scanning cached modules) and between 'get_symbol_source' and 'get_module' (both retrieve code from cache). Descriptions help clarify differences, but an agent might occasionally misselect between these pairs.
All tools follow a consistent verb_noun naming pattern (e.g., analyze_structure, deobfuscate, format_code, get_call_graph). There are no deviations in style or convention, making the set highly predictable and readable.
With 10 tools, the server is well-scoped for deobfuscation and code analysis tasks. Each tool serves a clear purpose, such as analyzing structure, deobfuscating, formatting, and retrieving cached data, without feeling bloated or sparse.
The toolset covers core deobfuscation workflows, including analysis, deobfuscation, formatting, and cache retrieval. A minor gap exists in lifecycle management, such as tools to clear or manage the cache, but agents can work around this with the provided tools.