Skip to main content
Glama

JADX-MCP-SERVER (Part of Zin's Reverse Engineering MCP Suite)

⚑ Fully automated MCP server built to communicate with JADX-AI-MCP Plugin to analyze Android APKs using LLMs like Claude β€” uncover vulnerabilities, parse manifests, and reverse engineer effortlessly.

GitHub contributors JADX-AI-MCP GitHub contributors JADX-MCP-SERVER GitHub all releases GitHub release (latest by SemVer) Latest release Java 11+ Python 3.10+ License

⭐ Contributors

Thanks to these wonderful people for their contributions ⭐

ReadTheDocs:

  • We are now live at Read The Docs:


Download now: https://github.com/zinja-coder/jadx-ai-mcp/releases


πŸ€– What is JADX-MCP-SERVER?

JADX MCP Server is a standalone Python server that interacts with a modified version of jadx-gui (see: jadx-ai-mcp) via MCP (Model Context Protocol). It lets LLMs communicate with the decompiled Android app context live.

Related MCP server: Binary Ninja MCP Server

πŸ€– What is JADX-AI-MCP?

JADX-AI-MCP is a plugin for the JADX decompiler that integrates directly with Model Context Protocol (MCP) to provide live reverse engineering support with LLMs like Claude.

Think: "Decompile β†’ Context-Aware Code Review β†’ AI Recommendations" β€” all in real time.

High Level Sequence Diagram

sequenceDiagram
LLM CLIENT->>JADX MCP SERVER: INVOKE MCP TOOL
JADX MCP SERVER->>JADX AI MCP PLUGIN: INVOKE HTTP REQUEST
JADX AI MCP PLUGIN->>REQUEST HANDLERS: INVOKE HTTP REQUEST HANDLER
REQUEST HANDLERS->>JADX GUI: PERFORM ACTION/GATHER DATA
JADX GUI->>REQUEST HANDLERS: ACTION PERFORMED/DATA GATHERED
REQUEST HANDLERS->>JADX AI MCP PLUGIN: CRAFT HTTP RESPONSE
JADX AI MCP PLUGIN->>JADX MCP SERVER:HTTP RESPONSE
JADX MCP SERVER->>LLM CLIENT: MCP TOOL RESULT

Watch the demos!

  • Perform quick analysis

https://github.com/user-attachments/assets/b65c3041-fde3-4803-8d99-45ca77dbe30a

  • Quickly find vulnerabilities

https://github.com/user-attachments/assets/c184afae-3713-4bc0-a1d0-546c1f4eb57f

  • Multiple AI Agents Support

https://github.com/user-attachments/assets/6342ea0f-fa8f-44e6-9b3a-4ceb8919a5b0

  • Analyze The APK Resources

https://github.com/user-attachments/assets/f42d8072-0e3e-4f03-93ea-121af4e66eb1

  • Your AI Assistant during debugging of APK using JADX

https://github.com/user-attachments/assets/2b0bd9b1-95c1-4f32-9b0c-38b864dd6aec

It is combination of two tools:

  1. JADX-AI-MCP

  2. JADX MCP SERVER


Zin MCP Suite

Current MCP Tools

The following MCP tools are available:

Tools that return decompiled source strip Kotlin compiler metadata (@Metadata / @DebugMetadata, often 25-50% of a Kotlin dump) by default; pass slim=False for a raw dump. Stripping never changes line numbers, so with_line_numbers=True and add_comment(line=...) keep working.

  • fetch_current_class(slim=True) β€” Get the class name and full source of selected class

  • get_selected_text() β€” Get currently selected text

  • get_all_classes() β€” List all classes in the project

  • get_class_source(slim=True) β€” Get full source of a given class (with_line_numbers=True to number the lines for add_comment(line=...))

  • get_method_by_name(slim=True) β€” Fetch a method’s source

  • search_method_by_name() β€” Search method across classes

  • search_classes_by_keyword() β€” Search for classes whose source code contains a specific keyword (supports pagination)

  • get_methods_of_class() β€” List methods in a class

  • get_fields_of_class() β€” List fields in a class

  • get_smali_of_class() β€” Fetch smali of class

  • get_main_activity_class(slim=True) β€” Fetch main activity from jadx mentioned in AndroidManifest.xml file.

  • get_main_application_classes_code(slim=True) β€” Fetch all the main application classes' code based on the package name defined in the AndroidManifest.xml.

  • get_main_application_classes_names() β€” Fetch all the main application classes' names based on the package name defined in the AndroidManifest.xml.

  • get_android_manifest() β€” Retrieve and return the AndroidManifest.xml content.

  • get_manifest_component - Retrieve specific manifest component instead of whole manifest file

  • get_strings() : Fetches the strings.xml file

  • get_all_resource_file_names() : Retrieve all resource files names that exists in application

  • get_resource_file() : Retrieve resource file content

  • rename_variable() : Renames the variable within a method

  • add_comment() : Adds a comment to a class, method, field or a single code line (line=), shown in JADX-GUI and saved with the project (re-commenting the same target updates it, an empty comment removes it)

  • list_comments() : Lists the comments stored in the project, optionally filtered to one class

  • debug_get_stack_frames() : Get the stack frames from jadx debugger

  • debug_get_threads() : Get the insights of threads from jadx debugger

  • debug_get_variables() : Get the variables from jadx debugger

  • xrefs_to_class() : Find all references to a class (returns method-level and class-level references, supports pagination)

  • xrefs_to_method() : Find all references to a method (includes override-related methods, supports pagination)

  • xrefs_to_field() : Find all references to a field (returns methods that access the field, supports pagination)


Note: Tested on Claude Desktop. Support for other LLMs might be tested in future.

πŸ—’οΈ Sample Prompts

πŸ” Basic Code Understanding

"Explain what this class does in one paragraph."

"Summarize the responsibilities of this method."

"Is there any obfuscation in this class?"

"List all Android permissions this class might require."

πŸ›‘οΈ Vulnerability Detection

"Are there any insecure API usages in this method?"

"Check this class for hardcoded secrets or credentials."

"Does this method sanitize user input before using it?"

"What security vulnerabilities might be introduced by this code?"

πŸ› οΈ Reverse Engineering Helpers

"Deobfuscate and rename the classes and methods to something readable."

"Can you infer the original purpose of this smali method?"

"What libraries or SDKs does this class appear to be part of?"

πŸ“¦ Static Analysis

"List all network-related API calls in this class."

"Identify file I/O operations and their potential risks."

"Does this method leak device info or PII?"

πŸ€– AI Code Modification

"Refactor this method to improve readability."

"Add comments to this code explaining each step."

"Rewrite this Java method in Python for analysis."

πŸ“„ Documentation & Metadata

"Generate Javadoc-style comments for all methods."

"What package or app component does this class likely belong to?"

"Can you identify the Android component type (Activity, Service, etc.)?"

🐞 Debugger Assistant

   "Fetch stack frames, varirables and threads from debugger and provide summary"

   "Based the stack frames from debugger, explain the execution flow of the application"

   "Based on the state of variables, is there security threat?"

πŸ› οΈ Getting Started

READ HERE

Demo: Perform Code Review to Find Vulnerabilities locally

https://github.com/user-attachments/assets/4cd26715-b5e6-4b4b-95e4-054de6789f42

Advanced CLI Options β€” Understanding the Flags

There are two separate connections and each has its own host/port:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    --host / --port     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   --jadx-host / --jadx-port   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  LLM Client β”‚ ◄──────────────────►   β”‚  jadx-mcp-server β”‚ ──────────────────────────►   β”‚  JADX-GUI Plugin β”‚
β”‚  (Claude,   β”‚   Where the MCP server β”‚                  β”‚   Where the MCP server looks  β”‚  (jadx-ai-mcp)   β”‚
β”‚   Codex..)  β”‚   LISTENS for clients  β”‚                  β”‚   for the JADX plugin         β”‚                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Flag

Default

Controls

--http

off

Use HTTP transport instead of stdio

--host

127.0.0.1

Where the MCP server listens (bind address for LLM clients)

--port

8651

Which port the MCP server listens on

--jadx-host

127.0.0.1

Where to find the JADX plugin (the target JADX-GUI machine)

--jadx-port

8650

Which port the JADX plugin is on

Usage Examples

Scenario 1 β€” Everything on the same machine (most common):

# Default: MCP server on localhost:8651, connects to JADX plugin on localhost:8650
uv run jadx_mcp_server.py --http

Scenario 2 β€” Docker container or WSL (MCP server accessible from host network):

# MCP server listens on ALL interfaces so the host can reach it
# JADX plugin is still on the same machine
uv run jadx_mcp_server.py --http --host 0.0.0.0

Scenario 3 β€” JADX-GUI running on a different machine (e.g., remote VM):

# MCP server runs locally, but connects to JADX plugin on a remote machine
uv run jadx_mcp_server.py --http --jadx-host 192.168.1.100

Scenario 4 β€” Full remote setup (everything on different machines):

# MCP server listens on all interfaces on port 9999
# JADX plugin is on a different machine at 192.168.1.100:8652
uv run jadx_mcp_server.py --http --host 0.0.0.0 --port 9999 --jadx-host 192.168.1.100 --jadx-port 8652
CAUTION

⚠️ Security Warning β€” Remote Binding

When using --host 0.0.0.0 (or any non-localhost address), the MCP server binds to all network interfaces over plain HTTP with no authentication. This means:

  • Anyone on the network can connect and invoke all MCP tools

  • There is no TLS encryption β€” traffic can be intercepted

  • An attacker can use the server to read decompiled code, rename classes/methods, and access debug info

Mitigations:

  • Only bind to 0.0.0.0 on trusted, isolated networks (e.g., Docker bridge, local VM)

  • Use a firewall to restrict access to the MCP port

  • Consider an SSH tunnel instead: ssh -L 8651:127.0.0.1:8651 remote-host

Similarly, --jadx-host with a non-localhost address means the MCP server will make unauthenticated HTTP requests to that host. Ensure the target is trusted.

Driving the server from any OpenAI-compatible model

MCP-aware apps connect directly. For everything else that speaks POST /v1/chat/completions β€” OpenRouter, LiteLLM, vLLM, Ollama's OpenAI layer, OmniRoute, … β€” examples/openai_compatible_client.py is a reference adapter: it connects to a running jadx_mcp_server.py --http, converts the MCP tool list into OpenAI function-calling tools, and runs the call β†’ execute β†’ feed-back loop until the model answers.

# terminal 1
uv run jadx_mcp_server.py --http --host 127.0.0.1 --port 9000

# the example needs the openai SDK; the server itself does not
pip install -r examples/requirements.txt

# OpenAI
OPENAI_API_KEY=sk-... python examples/openai_compatible_client.py \
  --prompt "What does com.example.app.MainActivity do?"

# a local gateway (any placeholder key works)
OPENAI_BASE_URL=http://127.0.0.1:11434/v1 OPENAI_API_KEY=ollama OPENAI_MODEL=llama3.1 \
  python examples/openai_compatible_client.py

# show the tool schema the model is offered, without calling a model at all
python examples/openai_compatible_client.py --list-tools

--base-url, --api-key and --model (or the OPENAI_BASE_URL / OPENAI_API_KEY / OPENAI_MODEL environment variables) point it at any provider. --max-steps caps how many tool rounds a question may take and --max-tool-chars truncates a single result, so one large class dump cannot blow the model's context. Run it without --prompt for an interactive session.

πŸ›£οΈ Future Roadmap

  • Add Support for apktool

  • Add support for hermes code (ReactNative Application)

  • Add docker support

  • Add more useful MCP Tools

  • Make LLM be able to modify code on JADX

  • Add prompts templates, give llm access to Android APK Files as Resources

  • Build MCP Client to support Local LLM

  • END-GOAL : Make all android reverse engineering and APK modification tools Connect with single MCP server to make reverse engineering apk files as easy as possible purely from vibes.

NOTE For Contributors

  • The files related to JADX-AI-MCP can be found here

  • The files related to jadx-mcp-server can be found in this repository only.

πŸ™ Credits

This project is a plugin for JADX, an amazing open-source Android decompiler created and maintained by @skylot. All core decompilation logic belongs to them. I have only extended it to support my MCP server with AI capabilities.

πŸ“Ž Original README (JADX)

The original README.md from jadx is included here in this repository for reference and credit.

This MCP server is made possible by the extensibility of JADX-GUI and the amazing Android reverse engineering community.

Also huge thanks to @aaddrick for developing Claude desktop for Debian based linux.

And in last thanks to @anthropics for developing the Model Context Protocol and @FastMCP team

And all open source maintainers and contributors that makes libraries and dependencies which allows project like this possible.

Audited and Received Assessment Badge

Thank you Mseep.net for auditing and providing Assessment Badge.

Dependencies

This project uses following awesome libraries.

πŸ“„ License

This plugin inherits the Apache 2.0 License from the original JADX repository.

Disclaimer

The tools jadx-ai-mcp and jadx_mcp_server are intended strictly for educational, research, and ethical security assessment purposes. They are provided "as-is" without any warranties, expressed or implied. Users are solely responsible for ensuring that their use of these tools complies with all applicable laws, regulations, and ethical guidelines.

By using jadx-ai-mcp or jadx_mcp_server, you agree to use them only in environments you are authorized to test, such as applications you own or have explicit permission to analyze. Any misuse of these tools for unauthorized reverse engineering, infringement of intellectual property rights, or malicious activity is strictly prohibited.

The developers of jadx-ai-mcp and jadx_mcp_server shall not be held liable for any damage, data loss, legal consequences, or other consequences resulting from the use or misuse of these tools. Users assume full responsibility for their actions and any impact caused by their usage.

Use responsibly. Respect intellectual property. Follow ethical hacking practices.


πŸ™Œ Contribute or Support

  • Found it useful? Give it a ⭐️

  • Got ideas? Open an issue or submit a PR

  • Built something on top? DM me or mention me β€” I’ll add it to the README!


Built with ❀️ for the reverse engineering and AI communities.

Available Tools

32 tools
clear_cacheA

Clear the decompilation source cache and reset counters. Use when switching APKs or to free memory.

Inputs: no named parameters. Returns: object

debug_get_stack_framesB

Get current stack frames (call stack).

Inputs: no named parameters. Returns: object

debug_get_threadsA

Get all threads in the debugged process.

Inputs: no named parameters. Returns: object

debug_get_variablesA

Get current variables when process is suspended.

Inputs: no named parameters. Returns: object

fetch_current_classA

Fetch the currently selected class and its code from the JADX-GUI plugin.

Inputs: no named parameters. Returns: object

get_all_classesC

Returns a list of all classes in the project with pagination support.

Inputs: offset, count. Returns: object

get_all_resource_file_namesC

Retrieve all resource files names.

Inputs: offset, count. Returns: object

get_android_manifestA

Retrieve and return the AndroidManifest.xml content.

Inputs: no named parameters. Returns: object

get_cache_statsA

Get decompilation cache statistics: hits, misses, hit_rate, cached_classes, compressed_mb, compression_ratio.

Inputs: no named parameters. Returns: object

get_class_sourceB

Fetch the Java source of a specific class.

Inputs: class_name (required). Returns: object

get_fields_of_classB

List all field names in a class.

Inputs: class_name (required). Returns: object

get_main_activity_classA

Fetch the main activity class from AndroidManifest.xml.

Inputs: no named parameters. Returns: object

get_main_application_classes_codeB

Fetch main application classes' code with pagination.

Inputs: offset, count. Returns: object

get_main_application_classes_namesA

Fetch main application classes' names from Manifest package.

Inputs: no named parameters. Returns: object

get_manifest_componentA

Retrieve specified component data from AndroidManifest.xml, support filter exported components. Support standard Android components: activity, provider, service, receiver.

Inputs: component_type (required), only_exported. Returns: object

get_method_by_nameC

Fetch the source code of a method from a specific class.

Inputs: class_name (required), method_name (required). Returns: object

get_methods_of_classB

List all method names in a class.

Inputs: class_name (required). Returns: object

get_package_treeA

Get all packages in the APK sorted by class count. Shows total_classes, total_packages, and per-package name, class_count, is_likely_library. Use this first to understand the APK structure before searching.

Inputs: no named parameters. Returns: object

get_resource_fileC

Retrieve resource file content.

Inputs: resource_name (required). Returns: object

get_selected_textA

Returns the currently selected text in the decompiled code view.

Inputs: no named parameters. Returns: object

get_smali_of_classC

Fetch the smali representation of a class.

Inputs: class_name (required). Returns: object

get_stringsC

Retrieve contents of strings.xml files.

Inputs: offset, count. Returns: object

get_xrefs_to_classB

Find all references to a class.

Inputs: class_name (required), offset, count. Returns: object

get_xrefs_to_fieldC

Find all references to a field.

Inputs: class_name (required), field_name (required), offset, count. Returns: object

get_xrefs_to_methodC

Find all references to a method.

Inputs: class_name (required), method_name (required), offset, count. Returns: object

rename_classC

Renames a specific class.

Inputs: class_name (required), new_name (required). Returns: object

rename_fieldC

Renames a specific field.

Inputs: class_name (required), field_name (required), new_name (required). Returns: object

rename_methodD

Renames a specific method.

Inputs: method_name (required), new_name (required). Returns: object

rename_packageB

Renames a package and all its classes.

Inputs: old_package_name (required), new_package_name (required). Returns: object

rename_variableC

Renames a specific variable in a method.

Inputs: class_name (required), method_name (required), variable_name (required), new_name (required), +2 more. Returns: object

search_classes_by_keywordA

Search for classes containing a specific keyword with flexible filtering options.

This tool performs a comprehensive search across decompiled Android code, allowing you to:

  1. Search within specific packages by providing a package name

  2. Target specific search scopes (class names, method names, fields, code content, comments)

  3. Combine multiple search scopes for precise results

Inputs: search_term (required), package, search_in, offset, +1 more. Returns: object

search_method_by_nameC

Search for a method name across all classes.

Inputs: method_name (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 32 tools

    Disambiguation5/5

    Each tool targets a distinct action and resource, with clear separation between listing, searching, renaming, debugging, and cache management. No two tools appear to do the same thing.

    Naming Consistency4/5

    Naming follows a consistent verb_noun pattern within subdomains (get_, rename_, search_, debug_, clear_, fetch_). The debug_get_ prefix is slightly inconsistent but still readable.

    Tool Count2/5

    With 32 tools, the server exceeds the typical well-scoped range. While many tools are useful, the number feels excessive and could be streamlined into fewer, more general tools.

    Completeness5/5

    The tool surface covers the full lifecycle of APK analysis: class retrieval, field/method access, cross-references, renaming, manifest parsing, resource handling, debugging, and cache management. No obvious gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessUsually handled

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that enables Large Language Models to interact with Binary Ninja for reverse engineering tasks like viewing assembly code, decompiled code, renaming functions, and adding comments.
      3
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An Model Context Protocol server that enables LLMs to autonomously reverse engineer applications by exposing Ghidra's decompilation and analysis tools. It allows AI agents to list code structures, rename methods, and analyze binaries directly through MCP-compatible clients.
      Apache 2.0