MCP server for headless Android APK analysis using JADX decompiler
jadx-headless-mcp has 19 well-structured tools with consistent naming (verb_noun pattern: jadx.open, jadx.list, jadx.close, jadx.search, jadx.xref.to, jadx.callgraph). All tools have descriptions (avg ~80 chars, within 10-1024 range). Input schemas are present with typed parameters and descriptions. However, output schemas are NOT documented, the gen_tools_doc.py script explicitly states 'MCP's tools/list only declares input schema, has no output schema' and '凭空写一份返回值文档等于给自己制造一个必然漂移的第二事实源' (writing return docs creates a second source of truth that drifts). This is a critical gap: LLMs cannot plan downstream calls without knowing what fields to expect. Error handling is minimal, no recovery guidance, no categorization of retryable vs fatal errors. Parameter descriptions are adequate but lack format/range constraints (e.g., max_bytes defaults to 32768 but no min/max declared). Session parameter semantics are documented in jadx.help output but not in schema itself.
Get overview information about the APK (manifest, entry points, statistics)
Get cache statistics or clear the cache
Get call graph information for a method
List methods and fields of a class
List all classes in the APK or a specific package
Close an APK session and release resources
Rename a class, method, field, or package in the current session
Output schemas not documented. Script explicitly states MCP tools/list has no output schema field, so return types are undocumented. LLMs cannot plan downstream calls or extract required fields without knowing response structure.
No error handling guidance. Tools return errors but do not categorize them as retryable/user-fixable/fatal or provide recovery suggestions. Agents cannot determine next steps on failure.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
Get all active renames in the current session
Get help and documentation for all available tools
List all currently open APK sessions
Get the AndroidManifest.xml content
Open an APK file for analysis in a new session
List all packages in the APK with class counts
Get content of a specific resource file
List all resource files in the APK
Get string resources from the APK
Search for classes by keyword or pattern
Get decompiled source code for a class
Find cross-references to a class, method, or field
Parameter constraints missing. max_bytes in jadx.source defaults to 32768 but has no min/max bounds declared. Pagination cursors lack format specification. Numeric parameters lack range constraints.
Session parameter semantics documented outside schema. jadx.help returns session semantics (required/optional/not-needed) but this critical information is not in the input schema itself. Agents must call jadx.help first to understand parameter requirements.
Pagination design inconsistent. Some tools use cursor+limit (jadx.packages, jadx.classes, jadx.search, jadx.xref.to, jadx.res.list, jadx.res.strings) but no total_count or next_cursor returned. Large result sets risk context window exhaustion.