JADX-MCP-SERVER
Provides tools for analyzing Android APKs, including fetching class sources, searching methods, retrieving AndroidManifest.xml, inspecting resources, and performing reverse engineering tasks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@JADX-MCP-SERVER Parse the manifest from app.apk and report all exported activities."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
⭐ 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: JADX-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 RESULTWatch 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:
JADX MCP SERVER
Zin MCP Suite
Current MCP Tools
The following MCP tools are available:
fetch_current_class()— Get the class name and full source of selected classget_selected_text()— Get currently selected textget_all_classes()— List all classes in the projectget_class_source()— Get full source of a given classget_method_by_name()— Fetch a method’s sourcesearch_method_by_name()— Search method across classessearch_classes_by_keyword()— Search for classes whose source code contains a specific keyword (supports pagination)get_methods_of_class()— List methods in a classget_fields_of_class()— List fields in a classget_smali_of_class()— Fetch smali of classget_main_activity_class()— Fetch main activity from jadx mentioned in AndroidManifest.xml file.get_main_application_classes_code()— 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 fileget_strings(): Fetches the strings.xml fileget_all_resource_file_names(): Retrieve all resource files names that exists in applicationget_resource_file(): Retrieve resource file contentrename_variable(): Renames the variable within a methoddebug_get_stack_frames(): Get the stack frames from jadx debuggerdebug_get_threads(): Get the insights of threads from jadx debuggerdebug_get_variables(): Get the variables from jadx debuggerxrefs_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
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 |
| off | Use HTTP transport instead of stdio |
|
| Where the MCP server listens (bind address for LLM clients) |
|
| Which port the MCP server listens on |
|
| Where to find the JADX plugin (the target JADX-GUI machine) |
|
| 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 --httpScenario 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.0Scenario 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.100Scenario 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⚠️ 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.0on 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.
🛣️ 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 LLMEND-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.
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.
Plugin - Java
Javalin - https://javalin.io/ - Apache 2.0 License
SLF4J - https://slf4j.org/ - MIT License
org.w3c.dom - https://mvnrepository.com/artifact/org.w3c.dom - W3C Software and Document License
MCP Server - Python
FastMCP - https://github.com/jlowin/fastmcp - Apache 2.0 License
httpx - https://www.python-httpx.org - BSD-3-Clause (“BSD licensed”)
📄 License
This plugin inherits the Apache 2.0 License from the original JADX repository.
⚖️ Legal Warning
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 toolsclear_cacheClear 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_framesDebug Get Stack FramesB
Get current stack frames (call stack).
Inputs: no named parameters. Returns: object
debug_get_threadsDebug Get ThreadsA
Get all threads in the debugged process.
Inputs: no named parameters. Returns: object
debug_get_variablesDebug Get VariablesA
Get current variables when process is suspended.
Inputs: no named parameters. Returns: object
fetch_current_classFetch Current ClassA
Fetch the currently selected class and its code from the JADX-GUI plugin.
Inputs: no named parameters. Returns: object
get_all_classesGet All ClassesC
Returns a list of all classes in the project with pagination support.
Inputs: count, offset. Returns: object
get_all_resource_file_namesGet All Resource File NamesC
Retrieve all resource files names.
Inputs: count, offset. Returns: object
get_android_manifestGet Android ManifestB
Retrieve and return the AndroidManifest.xml content.
Inputs: no named parameters. Returns: object
get_cache_statsGet Cache StatsA
Get decompilation cache statistics: hits, misses, hit_rate, cached_classes, compressed_mb, compression_ratio.
Inputs: no named parameters. Returns: object
get_class_sourceGet Class SourceC
Fetch the Java source of a specific class.
Inputs: class_name (required). Returns: object
get_fields_of_classGet Fields Of ClassC
List all field names in a class.
Inputs: class_name (required). Returns: object
get_main_activity_classGet Main Activity ClassA
Fetch the main activity class from AndroidManifest.xml.
Inputs: no named parameters. Returns: object
get_main_application_classes_codeGet Main Application Classes CodeC
Fetch main application classes' code with pagination.
Inputs: count, offset. Returns: object
get_main_application_classes_namesGet Main Application Classes NamesB
Fetch main application classes' names from Manifest package.
Inputs: no named parameters. Returns: object
get_manifest_componentGet 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_nameGet Method By NameC
Fetch the source code of a method from a specific class.
Inputs: class_name (required), method_name (required), method_signature. Returns: object
get_methods_of_classGet Methods Of ClassC
List all method names in a class.
Inputs: class_name (required). Returns: object
get_package_treeGet 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_fileGet Resource FileC
Retrieve resource file content.
Inputs: resource_name (required). Returns: object
get_selected_textGet Selected TextB
Returns the currently selected text in the decompiled code view.
Inputs: no named parameters. Returns: object
get_smali_of_classGet Smali Of ClassC
Fetch the smali representation of a class.
Inputs: class_name (required). Returns: object
get_stringsGet StringsC
Retrieve contents of strings.xml files.
Inputs: count, offset. Returns: object
get_xrefs_to_classGet Xrefs To ClassC
Find all references to a class.
Inputs: class_name (required), count, offset. Returns: object
get_xrefs_to_fieldGet Xrefs To FieldC
Find all references to a field.
Inputs: class_name (required), field_name (required), count, offset. Returns: object
get_xrefs_to_methodGet Xrefs To MethodC
Find all references to a method.
Inputs: class_name (required), method_name (required), count, offset. Returns: object
rename_classRename ClassC
Renames a specific class.
Inputs: new_name (required), class_name (required). Returns: object
rename_fieldRename FieldC
Renames a specific field.
Inputs: new_name (required), class_name (required), field_name (required). Returns: object
rename_methodRename MethodD
Renames a specific method.
Inputs: new_name (required), method_name (required), method_signature. Returns: object
rename_packageRename PackageC
Renames a package and all its classes.
Inputs: new_package_name (required), old_package_name (required). Returns: object
rename_variableRename VariableC
Renames a specific variable in a method.
Inputs: new_name (required), class_name (required), method_name (required), variable_name (required), +2 more. Returns: object
search_classes_by_keywordSearch Classes By KeywordB
Search for classes containing a specific keyword with flexible filtering options.
This tool performs a comprehensive search across decompiled Android code, allowing you to:
Search within specific packages by providing a package name
Target specific search scopes (class names, method names, fields, code content, comments)
Combine multiple search scopes for precise results
Inputs: search_term (required), count, offset, package, +1 more. Returns: object
search_method_by_nameSearch 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
Scored across 32 tools
Most tools target a distinct resource plus action (class source vs. smali vs. methods vs. fields vs. xrefs), and the rename_* family is cleanly scoped per symbol. A few pairs are close: fetch_current_class vs. get_class_source, and get_method_by_name vs. search_method_by_name, but the descriptions (fetch one method by class/name vs. search names across all classes) resolve them adequately. get_main_application_classes_names vs. get_all_classes is also slightly fuzzy but the manifest-package scope distinguishes it.
Predominantly consistent snake_case verb_noun (get_class_source, get_fields_of_class, search_classes_by_keyword, rename_method). Minor deviations: a fetch_ vs. get_ mix, and the debug tools use a debug_ prefix group rather than the verb_noun form used elsewhere. Still highly predictable overall.
32 tools is on the heavy side and the surface spans four sub-domains (code retrieval, search, resources/manifest, rename refactoring, plus a debugger). There is some redundancy, e.g. get_android_manifest, get_manifest_component, get_main_activity_class, and get_main_application_classes_names/code all read from the same manifest and could be consolidated. Each area is individually justified, but the set feels broader than a single coherent scope.
Coverage is strong for reverse-engineering workflows: class/method/field retrieval, smali, three kinds of xrefs, keyword search, resources, manifest, rename refactoring, and cache management. Gaps exist in the debugger subset, which only exposes read-only inspection (stack frames, threads, variables) with no continue/step/breakpoint control, and there is no smali-for-method or export/dump operation. These are workable gaps rather than dead ends.
Maintenance
Related MCP Connectors
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
An MCP server that gives your AI access to the source code and docs of all public github repos
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseBqualityCmaintenanceAn MCP server that allows LLMs to autonomously reverse engineer applications by exposing Ghidra functionality, enabling decompilation, analysis, and automatic renaming of methods and data.3011,870Apache 2.0
- AlicenseBqualityBmaintenanceA Model Context Protocol server that connects to a custom JADX fork (JADX-AI) and enables local LLMs to interact with decompiled Android app code for live reverse engineering assistance.32840Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that integrates with Apktool to provide live reverse engineering support for Android applications using Claude and other LLMs through the Model Context Protocol.16707Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAn enterprise-grade MCP server for AI-powered reverse engineering. Enables AI agents to perform comprehensive binary analysis through natural language commands.81 PyPI220MIT