Android REA
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| JAVA_HOME | Yes | JDK 21+ with JAVA_HOME set (required). | |
| GHIDRA_HOME | No | Set GHIDRA_HOME for native static analysis (Ghidra). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| framework_statusA | Read Android REA configuration and provider capabilities without starting Java, Python, Ghidra, ADB or an app. Installation checks are not device acceptance. |
| create_projectB | Create a persistent Android investigation with a question and an explicit evidence ledger. Does not choose or execute a target. |
| import_artifactA | Copy one explicit APK, DEX or ELF SO into a project under its SHA-256 identity. Does not install or execute it. Maximum 512 MiB; source changes are rejected. |
| inspect_projectB | Read one persistent investigation, its artifact identities, evidence references and analyst findings. Returned artifact paths resolve in the current workspace. |
| list_evidenceB | List bounded retained tool-result metadata. Optionally filter by investigation and exact operation; no analysis or device contact. |
| read_evidenceA | Read a retained result by evidence ID and RFC 6901 JSON pointer. Arrays and strings are paged. Large objects return keys for deeper queries; the complete original remains on disk. |
| record_findingB | Record an analyst-entered observation, inference or unknown with exact evidence references. This records the assertion and does not independently verify it. |
| export_workspaceA | Copy the quiescent workspace to a new directory with SHA-256 manifest for migration. Rejects active traces, symlinks and concurrent operations. Excludes the session lock; includes retained app data. |
| import_workspaceA | Verify every file of an exported workspace and restore it into a new directory. Never overwrites an existing workspace. Use that directory as output_dir in a new connection. |
| inspect_android_packageA | Inspect a local APK's package, SDK and permission declarations, decoded manifest and class/resource counts. Does not execute the APK or verify signatures. Requires a caller-supplied JADX MCP JAR and JDK; uses one worker in an isolated temporary workspace. |
| search_android_classesA | Search complete decompiler class-name rows in an explicit local APK by case-sensitive substring. Empty query inventories all rows. Repeated names remain repeated and appear in duplicate_names; the provider accepts only class names for lookup, so these rows do not identify which same-name class node a later lookup selects. Retains artifact and engine identity; no APK execution. |
| inspect_android_classA | Inspect one exact Android class's parsed methods, fields and inner classes, including synthetic members. Returns display signatures and explicit unknown DEX descriptors without generating source. Overload indices remain consistent within the artifact and engine session. |
| inspect_android_methodA | Decompile one Android method with smali fallback. Requires explicit overload_index when multiple methods share a name. Reports representation, fallback markers and source truncation; never treats display signatures as exact DEX identities. |
| trace_android_referencesA | Trace incoming static references to an exact Android class or unique method. Overloaded method reference queries are explicitly unsupported by the current engine. Source lines and DEX offsets remain unknown; no runtime calls are inferred. |
| inspect_apktool_clientA | Inspect the caller-selected apktool launcher: resolved command, selection source, and version. Decodes nothing. REA never installs Apktool or Java; select a launcher with REA_APKTOOL_COMMAND (absolute) or apktool on PATH. |
| decode_android_resourcesA | Decode one local APK's resources with |
| inspect_adb_clientA | Inspect the caller-selected adb client: resolved binary, version, and install path. Never contacts devices and never starts the adb server. REA never installs platform tools; select a binary with REA_ADB_PATH (absolute) or adb on PATH. |
| list_adb_devicesA | List attached devices exactly as |
| inspect_adb_deviceA | Inspect one device's build identity through a fixed |
| list_adb_packagesB | List installed packages on one device with each base APK's device path, optionally scoped to third-party or system packages. Paths are device filesystem paths, not host-local. Read-only. |
| pull_adb_packageA | Pull one installed package's complete APK set (base plus every split, as |
| read_adb_logcatA | Read a bounded dump of the device log ( |
| inspect_adb_packageB | Inspect one installed package through |
| pull_adb_fileA | Pull one absolute device path (a database, shared-preferences XML, or any readable file) into a caller-selected output directory, digesting it with SHA-256. The local copy must not already exist. Read-only with respect to the device. |
| push_adb_fileA | Push one local file to an absolute device path. The only device-mutating ADB tool: existing device files are refused unless overwrite is explicitly requested, and the transfer is verified by comparing the local digest with the device's own sha256sum when the device provides one. |
| capture_adb_screenA | Capture one frame of the device screen as a PNG ( |
| list_adb_processesB | List running processes exactly as |
| list_adb_directoryB | List one absolute device directory ( |
| list_adb_featuresB | List the device's declared hardware and software features ( |
| list_adb_servicesB | List the device's binder services with their interfaces ( |
| inspect_adb_displayB | Report the display's physical and any overridden size ( |
| inspect_adb_windowB | Report the window manager's current focus declarations ( |
| read_adb_settingB | Read one settings value ( |
| collect_adb_bugreportA | Collect one device-generated bugreport archive ( |
| resolve_adb_packagesA | Find installed packages by case-insensitive substring of the package name (e.g. |
| install_adb_packageA | Install one local APK on the device ( |
| uninstall_adb_packageA | Uninstall one package from the device ( |
| start_adb_appA | Start one installed app by launching its declared launcher activity: the component is resolved through |
| start_adb_activityA | Start an intent with |
| stop_adb_appA | Force-stop every process of one package ( |
| open_binaryA | Open one local ELF executable or shared library (.so) in an isolated Ghidra session. The input is copied, never executed or modified. Replaces the active ELF session after closing it. |
| close_binaryA | Close the active ELF session and remove its provider-owned temporary project. |
| binary_sessionB | Read the active ELF session state without starting a provider. |
| inspect_native_load_imageB | Inspect the active ELF load image, mapped segments and sections. |
| read_bytesC | Read bytes at an address in the active ELF analysis image. |
| address_to_file_offsetB | Resolve an ELF virtual address to its input file offset. |
| address_nameC | Read the symbol name at an address in the active ELF analysis. |
| list_documentsC | List documents in the current Ghidra ELF session. |
| list_namesC | List symbol names in the active ELF analysis. |
| list_proceduresA | List functions in the active ELF analysis. Open the .so with open_binary first. |
| list_segmentsC | List memory segments in the active ELF analysis. |
| list_stringsC | List recognized strings in the active ELF analysis. |
| procedure_addressC | Resolve an ELF function name or address to its entry address. |
| resolve_containing_procedureC | Find the ELF function containing an address. |
| search_proceduresC | Search ELF function names using a literal substring or regular expression. |
| search_stringsB | Search recognized ELF strings using a literal substring or regular expression. |
| inspect_native_data_typeC | Inspect a Ghidra data type by exact name or ELF address. |
| inspect_native_instructionC | Inspect the native instruction at an ELF address. |
| resolve_native_call_targetsC | Resolve static call targets of an instruction in the active ELF. |
| analyze_functionC | Read a function dossier from the active ELF analysis. |
| procedure_assemblyC | Disassemble one function in the active ELF analysis. |
| procedure_calleesC | List static callees of an ELF function. |
| procedure_callersC | List static callers of an ELF function. |
| procedure_infoC | Inspect an ELF function signature, body and metadata. |
| procedure_pseudo_codeB | Decompile one ELF function to Ghidra C-like pseudo-code. Use an entry address from list_procedures when a name identifies both a function body and a thunk. |
| read_function_instructionsC | Read the instruction sequence of an ELF function. |
| procedure_referencesC | Trace incoming or outgoing static references for an ELF function. |
| xrefsC | Read static references to and from an ELF address. |
| runtime_statusA | Inspect this local Android runtime integration and installed ADB/Frida versions. Does not install software or attach to an application. |
| capture_uiB | Capture an explicit Android device screen, current focus and UIAutomator hierarchy into a new snapshot. Returns node IDs, bounds and artifact hashes. Uses and deletes one owned temporary device XML file. Compose/WebView/custom rendering may expose only partial semantics. |
| read_ui_snapshotA | Read a retained local UI snapshot, paging its node list without touching the device. A snapshot node is a visual/semantic observation, not a Java handler identity. |
| perform_ui_actionA | Perform one explicit tap, validated snapshot-node tap, swipe, keyevent, ASCII text input or bounded wait. Captures before/after UI. Use trace_id or up to four trace_ids to mark the actual input across explicit processes, plus optional run_id to retain its result. Markers establish a time window, not causality. Every device/run binding is checked before input. |
| list_runtime_targetsA | List Frida process/application targets on one explicit device to choose an exact PID or app. This does not attach to or execute a target. |
| start_traceA | Start bounded Frida observation of an explicit Android PID or spawn package. Supports exact Java selectors with trace-local loaders, deferred hooks, explicit native decoding, View/JNI and scoped network/storage/Handler/Executor/IPC observers. Scoped observer features need their nonempty scopes. Optional java_deoptimize explicitly changes ART execution throughout this process; inspect java:deoptimization coverage. inspect_trace reports coverage. Up to four distinct explicit targets; no automatic child attachment. run_id must be a retained analysis run. Native decoding relies on caller-supplied ABI meaning; historical registrations and unobserved paths remain unknown. |
| get_trace_eventsB | Page retained events from this connection’s Frida trace. Distinguishes Java/native calls, JNI bindings, UI markers and diagnostics. Preserve truncation and coverage limits; module RVA is not file offset. |
| mark_traceA | Record a caller-labelled marker in an active trace. This provides a timing anchor, not proof of app-side cause and effect. |
| stop_traceA | Stop and detach one trace created by this connection, remove its hooks, and retain its JSONL evidence and summary. Does not force-stop an attached application or restore explicitly deoptimized ART execution. |
| map_native_addressA | Map an observed module-relative address into an explicit local ELF’s PT_LOAD segments for REA/Ghidra follow-up. Requires the target page size. Reports separate runtime address, module RVA, ELF virtual address and possible file offset. File identity remains unverified unless the caller supplies a matching runtime artifact digest. |
| inspect_traceA | Inspect one trace summary and paged hook coverage: installed, pending, failed and concrete overload/loader identities. Absence of events does not establish absence of execution. |
| search_javaA | Search loaded Java classes and optionally declared methods in an active trace; reports trace-local classloader identities and explicit truncation. An empty query inventories loaded classes. Discovery does not itself install hooks. |
| add_java_hooksA | Add exact Java selectors to the same active trace after search_java. Explicit loader IDs are trace-local and must not be copied between traces. Shared observer dispatch preserves original return/exception semantics. |
| create_analysis_runA | Create a run bound to an explicit ADB serial, Frida device ID and installed package. Collect build/ABI/page-size and up to 16 APK file hashes without launching the app; signature validity is separate. Does not attach or deploy frida-server. |
| read_analysis_runB | Read a retained run manifest, target identity, registered trace files and storage acquisitions without contacting a device. |
| start_trace_groupA | Start 1..4 explicit per-process configurations in one retained run, using a shared run_id. Validates all configurations first and detaches newly started traces if a later target fails. Spawned applications may have run; rollback is hook cleanup, not application-state undo. No implicit discovery or attachment to children. |
| get_run_timelineB | Merge retained run events and its explicitly registered Frida trace files by host receipt time, with pagination. Cross-process Binder entries are observations/candidates; timing and a shared run_id alone are not causal proof. |
| collect_storage_filesA | Read 1..16 exact files inside the selected run package data directories via ADB. With use_root, reuse an existing UID-0 ADB shell or verified su -c / su 0 sh -c; report the selected root_access method. Never restart adbd or change permissions. Can include existing SQLite WAL/SHM sidecars. Checks device hashes before/after; no force-stop. Sequential capture is not an atomic SQLite/device snapshot. Pass the returned logical_root directory to snapshot_storage; never infer consistency solely from a successful pull. |
| snapshot_storageA | Create a bounded local snapshot of explicit acquired files/directories, including hashes, preference XML and SQLite data. Works on owned copies with WAL handling; never modifies source files. For before/after acquisitions use paths=[each acquisition logical_root] so relative keys match. Reports consistency and truncation limits; device atomicity is not inferred. |
| read_storage_snapshotB | Page retained local storage snapshot file records without contacting a device. |
| diff_storageA | Compare two retained storage snapshots by stable relative keys, showing file, XML preference and SQLite changes with explicit truncation/consistency limitations. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| android-investigation | Evidence-based APK/UI/Java/JNI/SO investigation workflow |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 89 tools
The 89-tool surface has several overlapping clusters: ADB package inspection vs. Android package inspection vs. APK pulling, screen capture vs. UI capture, static native procedure/address tools vs. analysis tools, and trace/run/storage tools that are related but easy to confuse. Individual descriptions are detailed, but at set level an agent faces many similarly named read/inspect/list operations with subtle boundary differences.
Names mix several conventions: verb_noun (list_adb_packages, inspect_adb_device), noun_verb-like (procedure_callees, address_name), bare nouns (binary_session, xrefs), and inconsistent prefixes such as read_, inspect_, list_, get_, start_, create_, collect_, snapshot_, map_. The pattern is readable in places but not predictable across the whole set.
Eighty-nine tools is far beyond a well-scoped set for an MCP server, even for a complex Android reverse-engineering domain. Many capabilities are split into very granular operations, making discovery and selection burdensome rather than cohesive.
The surface covers an unusually complete Android RE lifecycle: projects and evidence, APK/resource inspection, ELF/native analysis, ADB device operations, Frida tracing, UI snapshots/actions, storage acquisition/diffing, and workspace export/import. Minor gaps exist around mutating settings or deleting projects, but the major workflows are covered.