jadx-ai-mcp

zinja-coderApache-2.0活跃维护

给 JADX 反编译工具加装 MCP 服务端插件,让大模型能直接读取和分析反编译出的 Java 代码,辅助逆向工程与安全审计。

Plugin for JADX to integrate MCP server

v6.5.0发布于 2026-10-19 00:35 UTC3,007star +14 / 7 天282fork同步于 2026-11-10 17:44 UTC

怎么上手

由 README 提炼,执行前请确认
uv run jadx_mcp_server.py --http
硬件要求按 README 说明

README 未说明,仅要求 Java 11+ 与 Python 3.10+

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

给 JADX 反编译器的 MCP 插件,让 Claude 等 LLM 直接读取反编译结果做逆向分析

给 JADX 反编译工具加装 MCP 服务端插件,让大模型能直接读取和分析反编译出的 Java 代码,辅助逆向工程与安全审计。

核心能力

  • 通过 MCP 协议把 JADX 反编译上下文实时提供给 LLM
  • 支持 LLM 调用工具读取反编译代码、重命名类与方法
  • 提供 HTTP 与 stdio 两种传输模式对接不同客户端
  • 可配置 MCP 服务端与 JADX 插件各自的 host 和端口

容易踩的坑

需先在 JADX-GUI 中安装并启动插件,默认监听 8650 端口,MCP 服务端默认连 8651;用 --host 0.0.0.0 会以无认证明文 HTTP 暴露所有 MCP 工具,只应在可信隔离网络使用;stdio 模式下人类可读输出走 stderr,stdout 留给 JSON-RPC

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v6.5.0
  1. v6.5.0V6.5.0最新正式版2026-10-19 · 2026-10-19 00:35 UTC

    A feature release: Kotlin dumps get much smaller, the suite can now be driven from any OpenAI-compatible endpoint, and it carries the first batch of community work merged since 6.4.1.

    Huge thanks to everyone whose code and reports are in this release: @loaniloroze, @Imzl-zl, @vishalhabib99, @taekop, @fanrong1992, @pll177, @pateldarsh20, @anotherAwesomeKitten and @b4shful.

    One behaviour change, up front. Tools that return decompiled source now strip Kotlin compiler metadata by default, so a Kotlin class comes back 25-50% smaller. Every one of those tools takes slim=False and returns byte-for-byte what it returned before, so an existing workflow can be restored with a single argument.

    Kotlin metadata slimming (#70, #122)

    Kotlin stamps every compiled class with @Metadata(d1 = {...}, d2 = {...}), an encoded table of every name, signature and type in the class, and coroutines classes with @DebugMetadata(...) on top. JADX prints both into the decompiled source. They are compiler IR rather than code - unreadable to a human and useless to a model - yet they are a large share of a dump: measured across the 1270 Kotlin classes of a real APK they were 30% of all bytes, and 46% for kotlin.Pair alone, whose single metadata line was 1613 of the file's 3485 characters. Every one of those bytes lands in an agent's context window.

    Tools that return source now replace each annotation in place with /[slimmed: Kotlin metadata]/:

    ToolParameter
    get_class_sourceslim=True
    get_method_by_nameslim=True
    fetch_current_classslim=True
    get_main_activity_classslim=True
    get_main_application_classes_codeslim=True

    Design notes worth knowing:

    • The line count never changes, which is what makes this safe to turn on by default. add_comment(line=N) is resolved by the plugin against the same decompiled string split on newlines, so a dropped line would silently retarget a comment. Verified live: a number read from a slimmed numbered dump landed on exactly that line inside JADX.
    • The scan is string- and paren-aware, not a regex - the payload is full of quotes, braces and descriptors like (I)V. Checked over 3078 real decompiled sources: 0 line-count changes and 0 surviving annotation calls.
    • Real annotations (@Override, @Nullable, ...) and /* JADX INFO: ... */ notes are kept on purpose: the JADX INFO lines carry provenance (the original .kt file, the source dex).
    • Java dumps are unaffected, and the work happens in the server, so this needs no plugin update to take effect - installing the new server is enough.

    An example client for OpenAI-compatible endpoints (#71)

    The README only covered three MCP-aware desktop apps. Everything else speaks POST /v1/chat/completions - OpenRouter, LiteLLM, vLLM, Ollama's OpenAI layer, OmniRoute - and had no documented way in. examples/openai_compatible_client.py closes that gap: it connects to a running --http server, converts the MCP tool list into OpenAI function-calling tools (34 of them), and runs the call -> execute -> feed-back loop until the model answers.

    • --base-url / --api-key / --model (or the OPENAI_* environment variables) point it at any provider; --list-tools prints the offered schema without calling a model at all.
    • --max-steps and --max-tool-chars bound a session, so one large class dump cannot blow a small local model's context.
    • The server gains no dependency. The OpenAI SDK lives in examples/requirements.txt; the example still imports cleanly without it, and the conversion contract is covered by tests so CI does not need the SDK.

    Comment tools, both halves (plugin #117, server #66) - thanks @loaniloroze

    Agents could read, search and rename decompiled code but not annotate it. This release adds the missing direction, end

  2. V6.4.1v6.4.12026-08-06 · 2026-08-06 15:56 UTC
    查看更新说明

    Release Notes: JADX AI MCP v6.4.1

    A correctness and reliability patch release.

    Four community-reported bugs, two of which spanned both the Java plugin and the Python server. Huge thanks to @LYC-Android, @mhsjzsq, @1yearning1, @darkblack1234, @zbhello, and @Merrg1n for the detailed reports.

    No breaking changes. Every new parameter is optional and existing calls behave exactly as before.


    Bug Fixes

    rename_method could rename a method in the wrong class (#103)

    On obfuscated APKs, short names like a() repeat across hundreds of classes. handleRenameMethod walked every included class and renamed the first name match it found, so the rename frequently landed on an arbitrary unrelated class silently, with a success response. rename_method now accepts an optional class_name. When supplied, the plugin resolves that single class first and only searches within it, returning a proper 404 if the class doesn't exist or the method isn't in it. The matching logic moved into a tryRenameMethodInClass helper so the scoped and unscoped paths can't drift apart.

    # Now deterministic on obfuscated APKs
    await rename_method(
        method_name="a",
        new_name="decryptPayload",
        class_name="com.example.crypto.Helper",
    )
    
    Renaming a method made it unfindable afterwards (#106)

    The subtle one. MethodInfo builds its shortId once, from the original method name, and never refreshes it. JavaMethod.getName(), meanwhile, reports the current alias. The moment you renamed a method, those two disagreed so any signature carrying the new name stopped matching shortId, and the method appeared to have vanished. Rename it once and you could no longer address it.

    Signature matching now lives in a single MethodSignatures.matches() utility that compares against both getShortId() and the alias-aware makeSignature(true, true). A signature keeps resolving before and after a rename. Both rename_method and get_method_by_name use it, so the two tools can no longer disagree about whether a method exists.

    get_resource_file returned HTTP 500 on binary resources (#105, server #59)

    The handler called resFile.loadContent().getText().getCodeStr() unconditionally. For resources whose ResContainer wraps a ResourceFile rather than ICodeInfo - PNGs, fonts, arbitrary binary assets - getText() throws ClassCastException: ResourceFile cannot be cast to ICodeInfo. That surfaced as a hard HTTP 500 that aborted the tool call entirely.

    Content loading and text extraction now go through safeLoadContent() and safeExtractText(), which normalize decode failures to null. Non-text resources return a structured, stable response instead of an error:

    {
      "type": "resource/binary",
      "file": {
        "file_name": "res/drawable/icon.png",
        "content": "",
        "note": "Matched resource is not text-decodable by JADX"
      }
    }
    

    Nested-file lookup was also generalized: it previously only descended into resources.arsc, and now searches the subfiles of any container resource.

    Codex CLI could not load the MCP server over stdio (#104, server #60)

    FastMCP prints a startup banner to stdout. The stdio transport reserves stdout exclusively for MCP protocol frames, so the banner corrupted the stream and broke the initialize handshake before the client ever saw a tool.

    Worth calling out: show_banner=False had already been proposed in PR #51 and was lost during merge 605429d. This was a silent regression, not a new bug. The fix restores it on the stdio path and carries an inline comment explaining exactly why it must stay, so it doesn't get dropped a third time.

    Package install rejected Python 3.10–3.12 (server #63)

    pyproject.toml declared requires-python = ">=3.13", a va

  3. v6.4.0v6.4.0 Search Infrastructure Overhauled2026-05-28 · 2026-05-28 19:20 UTC
    查看更新说明

    What's Changed

    Release Notes: JADX AI MCP v6.4.0

    This major release focuses on drastically improving stability, performance, and reliability when analyzing massive Android applications. We've overhauled the search infrastructure to eliminate timeouts, fixed severe native memory leaks, and added precise refactoring capabilities for overloaded methods.

    A huge shoutout to @mostafaNazari702 for their massive contributions to the search timeout and progress tracking features in this release! 🎉

    What's New & Improved

    Performance & Stability (Handling Massive APKs)
    • Metadata-Based Search & Progress Polling: Resolved a critical issue where the MCP server would timeout while searching through extremely large APKs. The server now leverages metadata-based scanning instead of full decompilation and utilizes a dynamic polling mechanism (/search-progress) to keep the connection alive while reporting real-time progress back to the AI model. (Thanks to @mostafaNazari702! PRs #94, #54)
    • Native Memory Leak Fix: Fixed a severe native memory exhaustion bug by ensuring Deflater and Inflater streams within the DecompilationCache are explicitly closed (.end()).
    • Thread Contention Eliminated: Replaced Math.random() with UUID.randomUUID() for search ID generation, eliminating lock contention and collisions in parallel stream workers during heavy concurrent searches.
    • Cache Optimizations: Fixed a double-lookup bug in ClassRoutes that caused redundant CPU decompression overhead and artificially inflated cache hit statistics.
    Refactoring & Search Precision
    • Overloaded Method Disambiguation (Issue #89): The get_method_by_name and rename_method MCP tools now support an optional method_signature parameter. This allows AI models and users to precisely identify, read, and refactor specific methods when multiple overloads exist (e.g., distinguishing between onCreate(Bundle) and onCreate(Bundle, PersistableBundle)).

    Bug Fixes

    • Startup Proxy Crash (Issue #99): Fixed a bug where the MCP server would immediately crash on startup if the host system had a dirty no_proxy (or other proxy-related) environment variable containing non-printable characters or trailing newlines. The server now thoroughly sanitizes the environment before dependencies are loaded.

    Core Upgrades

    • Upgraded underlying dependency to JADX Core v1.5.5.

    New Contributors

    Full Changelog: https://github.com/zinja-coder/jadx-ai-mcp/compare/v6.3.0...v6.4.0

    Checksum SHA256:

    • jadx-mcp-server-6.4.0.zip: 4dcfa6137f090ae46f88ff5a190a7efc6f578172a68c4ba1dd85974ed9d3da9f
    • jadx-ai-mcp-6.4.0.jar: 46f1c76b3ebdfdf1d0e4792a0e1bc1bc404b29d79c00606e89e28a25726b67c7
  4. v6.3.0v6.3.0 - Remote Host Support2026-03-29 · 2026-03-29 16:31 UTC
    查看更新说明

    JADX-AI-MCP v6.3.0 Release Notes

    Announcing the release of JADX-AI-MCP v6.3.0, fundamentally improving the way the MCP Server connects with the JADX Plugin, enhancing security across the transport layer, and resolving critical bugs that affected remote/Docker workflows and JSON-RPC stability.

    Key Features & Architectural Changes

    1. Advanced Network Topologies (--host & --jadx-host) The architecture has been redesigned to support flexible deployments, such as running the server in Docker, WSL, or on a remote VM, separate from the JADX GUI.

      --host [IP]: The Python MCP server can now bind to any interface (e.g., 0.0.0.0), allowing LLM clients from external networks to connect over HTTP. --jadx-host [IP]: Replaces the hardcoded 127.0.0.1 plugin target. The MCP Server can now connect to a JADX plugin running on an entirely different machine.

    2. Deep Stdio Integrity (Fixing Claude Desktop & LM Studio) When running the server in stdio mode (used by Claude Desktop and Codex), any human-readable logging previously polluted stdout and fatally corrupted the JSON-RPC stream.

      • All application banners, startup checks, and internal logs are now strictly routed to stderr.
      • stdout is now 100% reserved for pure MCP communication.
    3. Advanced Tool Parameters Manifest Extraction: Added the get_manifest_component tool for targeted extraction of precise AndroidManifest XML components (Activities, Receivers, Services).

    🛡️ Security & Stability

    • Proxy Isolation (trust_env=False): The internal HTTP client routing traffic to the JADX plugin now ignores system proxy variables (http_proxy/https_proxy). This prevents OS-level VPNs and enterprise proxies from accidentally intercepting or breaking the internal 127.0.0.1 API loop.
    • Runtime Security Warnings: When binding --host to remote interfaces like 0.0.0.0, the server now issues immediate, unavoidable initialization warnings covering the risks of unencrypted/unauthenticated HTTP transport over open networks.

    Checksum SHA256:

    • jadx-mcp-server-6.3.0.zip: 36b7139e16f754b13c04d995b868eb1d33785e36944b9af65f311fc3f95c94bf
    • jadx-ai-mcp-6.3.0.jar: 5ccd9593eab85f69115647b3bfba84eb290b620fcd4015c5b8343a90701813d2

    New Contributors:

    • @bx33661
    • @Haicaji
    • @ChineseAStar

    Full Changelog: https://github.com/zinja-coder/jadx-ai-mcp/compare/v6.2.0...v6.3.0

  5. v6.2.02026-02-28 · 2026-02-28 17:08 UTC
    查看更新说明

    Fixed the Issues:

    • Fixed the following issue -> #81 The plugin server now reliably releases the port when JADX re-initializes plugins. The ServerSocketChannel extraction uses a robust multi-fallback reflection strategy compatible with Jetty 12's internal API changes, ensuring cross-classloader cleanup works correctly.

    What's Changed

    • Dependency Upgrades
      • Javalin 6.4.0 → 6.7.0 (JADX Plugin) — Updated to the latest Javalin 6.x release (Still supporting JVM 11)
      • FastMCP → 3.0.2 (Python MCP Server) — Updated to the latest FastMCP release
        • Replaced mcp[cli] dependency with fastmcp>=3.0.2 in pyproject.toml
        • Cleaned up requirements.txt (removed stdlib entries, added version pins)

    Full Changelog: https://github.com/zinja-coder/jadx-ai-mcp/compare/v6.1.0...v6.2.0

    Checksum SHA256:

    • jadx-ai-mcp-6.2.0.jar: fbd327a274c7afc3b736c20d43c9196e668bd94cd634fe3402661a9cf98e288a
    • jadx-mcp-server-v6.2.0.zip: d5af3480c42ce87e322ec0c08784e4f82ea7bf646af56b4a3a7540032159a6ce

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    JADX-AI-MCP (Part of Zin MCP Suite)

    ⚡ Fully automated MCP server + JADX plugin built to communicate with LLM through MCP to analyze Android APKs using LLMs like Claude — uncover vulnerabilities, analyze APK, 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 ⭐

    Read The Docs

    🤖 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

    • Run with your favorite LLM Client

    https://github.com/user-attachments/assets/b4a6b280-5aa9-4e76-ac72-a0abec73b809

    • 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

    🤖 What is JADX-MCP-SERVER?

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


    Other projects in Zin MCP Suite

    Current MCP Tools

    The following MCP tools are available:

    • fetch_current_class() — 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() — Get full source of a given class
    • get_method_by_name() — 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() — 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 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_class() : Renames the class name
    • rename_method() : Renames the method
    • rename_field() : Renames the field
    • rename_package() : Renames whole package
    • rename_variable() : Renames the variable within a method
    • add_comment() : Adds a comment to a class, method, field, or a single code line (line=, the 1-based line number of the decompiled source), 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)

    🗒️ 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?"
    
    "Tell me which classes contains code related to 'encryption'?"
    

    📦 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

    1. Download from Releases: https://github.com/zinja-coder/jadx-ai-mcp/releases

    [!NOTE]

    Download both jadx-ai-mcp-<version>.jar and jadx-mcp-server-<version>.zip files.

    # 0. Download the jadx-ai-mcp-<version>.jar and jadx-mcp-server-<version>.zip
    https://github.com/zinja-coder/jadx-ai-mcp/releases
    
    # 1. 
    unzip jadx-mcp-server-<version>.zip
    
    ├jadx-mcp-server/
      ├── jadx_mcp_server.py
      ├── requirements.txt
      ├── README.md
      ├── LICENSE
      ├── src/
      ├── static/
      ├── examples/
      └── test.sh
    
    ├jadx-ai-mcp-<version>.jar
    
    # 2. Install the plugin
    
    # For this you can follow two approaches:
    
    ## 1. One liner - execute below command in your shell
    jadx plugins --install "github:zinja-coder:jadx-ai-mcp"
    
    ## The above one line code will install the latest version of the plugin directly into the jadx, no need to download the jadx-ai-mcp's .jar file.
    ## 2. Or you can use JADX-GUI to install it by following images as shown below:
    
    ## 3. GUI method, download the .jar file and follow below steps shown in images
    

    img.png img_1.png img_2.png img_3.png

    # 3. Navigate to jadx-mcp-server directory
    cd jadx-mcp-server
    
    # 4. This project uses uv - https://github.com/astral-sh/uv instead of pip for dependency management.
        ## a. Install uv (if you dont have it yet)
    curl -LsSf https://astral.sh/uv/install.sh | sh
        ## b. OPTIONAL, if for any reasons, you get dependecy errors in jadx-mcp-server, Set up the environment
    uv venv
    source .venv/bin/activate  # or .venv\Scripts\activate on Windows
        ## c. OPTIONAL Install dependencies
    uv pip install httpx fastmcp
    
    # The setup for jadx-ai-mcp and jadx_mcp_server is done.
    

    🤖 2. Use Claude Desktop

    Make sure Claude Desktop is running with MCP enabled.

    For instance, I have used following for Kali Linux: https://github.com/aaddrick/claude-desktop-debian

    Configure and add MCP server to LLM file:

    nano ~/.config/Claude/claude_desktop_config.json
    

    For:

    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    And following content in it:

    {
        "mcpServers": {
            "jadx-mcp-server": {
                "command": "/<path>/<to>/uv", 
                "args": [
                    "--directory",
                    "</PATH/TO/>jadx-mcp-server/",
                    "run",
                    "jadx_mcp_server.py"
                ]
            }
        }
    }
    

    Replace:

    • path/to/uv with the actual path to your uv executable
    • path/to/jadx-mcp-server with the absolute path to where you cloned this repository

    Then, navigate code and interact via real-time code review prompts using the built-in integration.

    OR

    or you can install the jadx_mcp_server directly as executable directly using below command:

    uv tool install git+https://github.com/zinja-coder/jadx-mcp-server
    

    and then you can just provide jadx_mcp_server in command section of mcp configuration.

    3. Use Cherry Studio

    If you want to configure the MCP tool in Cherry Studio, you can refer to the following configuration.

    • Type: stdio
    • command: uv
    • argument:
    --directory
    path/to/jadx-mcp-server
    run
    jadx_mcp_server.py
    
    • path/to/jadx-mcp-server with the absolute path to where you cloned this repository

    4. Using LMStudio

    You can also use JADX AI MCP Server with LM Studio by configuring it's mcp.json file. Here's the video guide.

    https://github.com/user-attachments/assets/b4a6b280-5aa9-4e76-ac72-a0abec73b809

    5. Running in HTTP Stream Mode

    You can also use Jadx in HTTP Stream Mode using --http option with jadx_mcp_server.py as shown in following:

    uv run jadx_mcp_server.py --http
    
    OR
    
    uv run jadx_mcp_server.py --http --port 9999
    

    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         │                  │
    └─────────────┘                        └──────────────────┘                               └──────────────────┘
    
    FlagDefaultControls
    --httpoffUse HTTP transport instead of stdio
    --host127.0.0.1Where the MCP server listens (bind address for LLM clients)
    --port8651Which port the MCP server listens on
    --jadx-host127.0.0.1Where to find the JADX plugin (the target JADX-GUI machine)
    --jadx-port8650Which 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

    Stdio Mode Compatibility

    [!NOTE] When running in stdio mode (the default, without --http), all human-readable output (banner, health check) is written to stderr to keep stdout reserved for the MCP JSON-RPC stream. This ensures compatibility with Codex, Claude Desktop, and other stdio-based MCP clients.

    6. Custom port and host configuration for JADX AI MCP Plugin

    1. Configure Port: Configure the port on which the JADX AI MCP Plugin will listen on.
    2. Default Port: Revert back the changes and listen on default port.
    3. Restart Server: Force restart the JADX AI MCP Plugin server.
    4. Server Status: Check the status of JADX AI MCP Plugin server.

    To connect with JADX AI MCP Plugin running on custom port, the --jadx-port option will be used as shown in following:

    uv run jadx_mcp_server.py --jadx-port 8652
    

    If the JADX AI MCP Plugin is running on a different machine (e.g., JADX on a remote VM, MCP server on your local host), use the --jadx-host option:

    # Connect to JADX plugin on a remote host
    uv run jadx_mcp_server.py --jadx-host 192.168.1.100 --jadx-port 8650
    

    CLI Reference — 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         │                  │
    └─────────────┘                        └──────────────────┘                               └──────────────────┘
    
    FlagDefaultControls
    --httpoffUse HTTP transport instead of stdio
    --host127.0.0.1Where the MCP server listens (bind address for LLM clients)
    --port8651Which port the MCP server listens on
    --jadx-host127.0.0.1Where to find the JADX plugin (the target JADX-GUI machine)
    --jadx-port8650Which 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
    

    The MCP Configuration for custom jadx port will be as follows for claude:

    {
      "mcpServers": {
        "jadx-mcp-server": {
          "command": "/path/to/uv",
          "args": [
            "--directory",
            "/path/to/jadx-mcp-server/",
            "run",
            "jadx_mcp_server.py",
            "--jadx-port",
            "8652"
          ]
        }
      }
    }
    

    Give it a shot

    1. Run jadx-gui and load any .apk file

    img_1.png

    1. Start claude - You must see hammer symbol

    img2.png

    1. Click on the hammer symbol and you should you see somthing like following:

    img3.png

    1. Run following prompt:
    fetch currently selected class and perform quick sast on it
    

    img4.png

    1. Allow access when prompted:

    img_1.png

    1. HACK!

    img_2.png

    This plugin allows total control over the GUI and internal project model to support deeper LLM integration, including:

    • Exporting selected class to MCP
    • Running automated Claude analysis
    • Receiving back suggestions inline

    Troubleshooting

    Check here

    NOTE For Contributors

    • The files related to JADX-AI-MCP can be found under this repo.

    • The files related to jadx-mcp-server can be found here.

    To report bugs, issues, feature suggestion, Performance issue, general question, Documentation issue.

    • Kindly open an issue with respective template.

    • Tested on Claude Desktop Client, support for other AI will be tested soon!

    🙏 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

    Apart from this, huge thanks to all open source projects which serve as a dependencies for this project and which made this possible.

    Dependencies

    This project uses following awesome libraries.

    📄 License

    JADX-AI-MCP and all related projects 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!
    • Do you like my work and keep it going? Sponsor this project.

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