Skip to main content
Glama
droidasc-mcp

droidasc-mcp

by cnlnn

droidasc-mcp

A small, defensive MCP server for Droid ASC, the fast on-demand Android APK decompiler.

droidasc-mcp exposes ASC's public CLI as typed, read-only MCP tools. Every analysis runs in an isolated subprocess group, accepts only input paths under configured roots, and returns paginated structured data instead of unbounded terminal output.

Community project. Not affiliated with or endorsed by the Droid ASC maintainers.

中文文档

Tools

Tool

Purpose

asc_ping

Show adapter/engine versions and effective runtime limits

asc_apk_info

Return size, SHA-256, manifest presence, and DEX entries

asc_list_apk_entries

Page archive contents or inventory a standalone DEX file

asc_read_apk_entry

Read bounded archive/DEX bytes and decode binary XML

asc_manifest_summary

Page structured components, filters and permission provenance

asc_signing_inventory

Inspect signature-container presence and certificate fingerprints, without signature verification

asc_inspect_artifact

Page container capabilities; optional compact manifest/native summary

asc_open_artifact_session

Snapshot selected container DEX into the existing session workflow

asc_diff_dex_sessions

Compare sorted class/member identities between hash-bound revisions

asc_secret_candidates

Search fixed DEX string patterns with redacted source locations

asc_get_manifest

Decode AndroidManifest.xml with line pagination

asc_list_classes

List class descriptors with prefix filtering and pagination

asc_get_class_source

Decompile one class with line pagination

asc_find_refs

Find string/type/method/field references; direct hierarchy queries

asc_analyze_dex

Analyze a bare DEX or explicit DEX set with source hashes

asc_open_dex_session

Snapshot validated DEX inputs into an immutable bounded session

asc_query_dex_session

Query that session with the original hashes and DEX provenance

asc_close_dex_session

Close the session and release its private files

Artifact workflow profiles

The opt-in DROIDASC_MCP_TOOL_PROFILE=artifact adds focused handle-oriented DEX tools: apk_list_classes, apk_list_methods, class outlines, exact method source/disassembly/calls, references, literal searches, hierarchy and bounded graphs. All use analysis_id from load_artifact. Each tool advertises only its relevant selectors. Exact methods accept a full method_descriptor, or an exact class_name/method_name with descriptor for an overloaded prototype. apk_search_references handles partial/fuzzy member targets separately. apk_find_type_instructions selects explicit type operands; apk_find_type_references retains the broader static relation scopes. The generic DEX selector remains callable but is not advertised in this profile. The default stays legacy.

The compatibility profile DROIDASC_MCP_TOOL_PROFILE=artifact_preview advertises load_artifact, close_artifact, apk_get_summary, apk_get_manifest, apk_list_entries, apk_get_resource_content and apk_get_signing_info, plus the status, DEX query, revision diff and secret-candidate bridges. Open an artifact once and use its analysis_id for metadata. Code queries use the same value as asc_query_dex_session.session_id; DEX preparation starts on the first code query. Close with close_artifact. Metadata and code share the immutable original hash, storage quota and lifetime. The default legacy profile and all old callable tools remain unchanged. This preview is not the final focused DEX tool surface.

Manifest and class resources also accept the handle at droidasc://analysis/{analysis_id}/manifest?offset=0&limit=100 and droidasc://analysis/{analysis_id}/class?class_name=...&offset=0&limit=100. URI query values must be percent-encoded. Existing resource URIs remain valid.

For AAB inputs, module defaults to base. Select one exact name, an explicit list such as ["base", "feature"], or "*" for every module on load_artifact, asc_inspect_artifact or asc_open_artifact_session. Union queries retain original module/DEX provenance and reject duplicate class definitions. Multi-module summaries return manifests, not a merged manifest. For a manifest read, pass one selected module to apk_get_manifest or use droidasc://analysis/{analysis_id}/module/{module}/manifest?offset=0&limit=100. Resources use their exact module-prefixed entry path. AAB protobuf XML decoding and nested split reconstruction remain unsupported; raw entry bytes stay readable.

Related MCP server: APK-MCP

Install

Version 0.2.5 adds selected string/type reference reuse, compact grouped pages, the opt-in artifact workflow, multi-module AAB analysis and original-byte native DEX 041 queries. Existing tools and matching defaults remain compatible. It retains checked native DEX references, discovery, structural views and lazy indexes. An optional C accelerator has an independent Python fallback; ASC remains the public Smali engine. The native-query validation records accuracy, workload-specific cold-query improvements and the remaining startup/first-result cost.

It also includes class search/outline/hierarchy, constant use sites, decoded instruction search/disassembly and source-token links through the existing DEX query tools. It also adds strict DEX 041 imports, first-level JVM JAR inventory/diffs, resumable archive byte pages, manifest/class resource templates, compare_versions and opt-in secret candidate values. The complete competitor source map records all 25 tools, two resources, three prompts and 87 parameters, including intentional interface differences. Functional parity does not establish universal performance superiority.

Container, signing and review workflows and their support boundaries are described in REVERSE_WORKFLOW.md. Release gates cover cross-platform, transport and clean-package execution.

Python 3.10 or newer is required. CI checks Linux and native Windows runners on Python 3.10-3.13, including all 18 tools over stdio/HTTP against a source-built acceptance APK and package installation. macOS remains unverified.

Install the version-pinned packages from Releases. CPython 3.11+ on x86-64 Linux:

python3.11 -m venv .venv
.venv/bin/python -m pip install --force-reinstall --no-cache-dir https://github.com/cnlnn/droidasc-mcp/releases/download/v0.2.5/droidasc_mcp-0.2.5-cp311-abi3-manylinux_2_34_x86_64.whl

CPython 3.11+ on Windows (PowerShell):

py -3.11 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --force-reinstall --no-cache-dir https://github.com/cnlnn/droidasc-mcp/releases/download/v0.2.5/droidasc_mcp-0.2.5-cp311-abi3-win_amd64.whl

For CPython 3.10, create the environment with python3.10 or py -3.10 and replace cp311-abi3 in the wheel URL with cp310-cp310. The stable-ABI wheels support CPython 3.11 and newer; the Linux wheels require glibc 2.34 or newer. The canonical source archive is droidasc_mcp-0.2.5.tar.gz. Source installation retains the Python fallback if no compiler is available. macOS remains unverified. If you installed a withdrawn 0.2.3-0.2.9 package, use --force-reinstall --no-cache-dir to replace it with this build. Withdrawn historical builds were consolidated into v0.2.3; current assets are built and validated separately. Windows uses .venv\Scripts\droidasc-mcp.exe for the server command. For development, clone this repository and run uv sync --locked --extra dev instead.

Connect

The default transport is stdio. Limit the server to directories that contain APKs:

export DROIDASC_MCP_ALLOWED_ROOTS=/absolute/path/to/apks
.venv/bin/droidasc-mcp

Codex

codex mcp add droidasc \
  --env DROIDASC_MCP_ALLOWED_ROOTS=/absolute/path/to/apks \
  -- /absolute/path/to/droidasc-mcp/.venv/bin/droidasc-mcp

Claude Desktop and compatible hosts

{
  "mcpServers": {
    "droidasc": {
      "command": "/absolute/path/to/droidasc-mcp/.venv/bin/droidasc-mcp",
      "env": {
        "DROIDASC_MCP_ALLOWED_ROOTS": "/absolute/path/to/apks"
      }
    }
  }
}

Streamable HTTP

DROIDASC_MCP_ALLOWED_ROOTS=/absolute/path/to/apks \
  .venv/bin/droidasc-mcp --transport streamable-http --host 127.0.0.1 --port 8000

The endpoint is http://127.0.0.1:8000/mcp. Keep it on loopback unless you add an authenticated, TLS-terminating reverse proxy.

Examples

Ask an MCP host to call:

asc_apk_info(apk_path="/samples/app.apk")
asc_manifest_summary(apk_path="/samples/app.apk", limit=20)
asc_list_apk_entries(apk_path="/samples/app.apk", kind="resource", limit=100)
asc_read_apk_entry(apk_path="/samples/app.apk", entry_path="res/xml/config.xml")
asc_list_classes(apk_path="/samples/app.apk", prefix="com.example", limit=100)
asc_find_refs(apk_path="/samples/app.apk", kind="string", value="Authorization")
asc_find_refs(apk_path="/samples/app.apk", kind="extends", value="android.app.Activity")
asc_find_refs(apk_path="/samples/app.apk", kind="impl", value="java.lang.Runnable")
asc_get_class_source(apk_path="/samples/app.apk", class_name="com.example.MainActivity")

APK contents and manifest triage

The three archive tools bind every successful result to apk_sha256. Match hashes before correlating resources, components and code. Inventory supports a category and a literal, case-sensitive path prefix; its CRC values are ZIP metadata, not integrity verification. Native rows report archive paths and ABI directories, not ELF analysis.

asc_read_apk_entry streams a bounded prefix without filesystem extraction. max_bytes defaults to 16 KiB, with a 128 KiB maximum before UTF-8/base64 encoding. XML decoding reads only complete inputs up to 4 MiB. decoded, decoding_status, decoding_warnings, truncated, content_complete and crc_verified distinguish successful decoding, decoder warnings, output truncation and incomplete raw reads. Resource-table values remain unresolved.

These two entry tools also accept a standalone .dex path. Use its returned basename as entry_path, then follow next_byte_offset with byte_offset for subsequent pages. Results retain artifact_sha256 and original bytes, including physical DEX 041 bytes. Raw files have no ZIP CRC fields; format_validation=not_performed distinguishes byte reads from validated code analysis through asc_open_dex_session.

asc_manifest_summary preserves raw namespaced declarations and component order, intent filters, metadata, provider path/URI-grant rules, and permission inheritance sources. Explicit empty permissions clear inherited requirements; an alias without its own permission requires none, rather than inheriting its target/application permission. Absent exported defaults and resource-dependent values remain unresolved. These are static declarations, not proof of runtime accessibility. Follow next_offset; reduce page size on an explicit response_limit. See archive workflow boundaries and acceptance.

Results include total, offset, limit, truncated, and next_offset. Use next_offset for the next request (null means done): the response budget can shorten a page. A single line that exceeds the budget produces an explicit error rather than silent truncation.

Reference fields are best-effort parsing of ASC CLI text. Embedded newlines can split records; total counts output lines, not semantic references. Reference lines are sorted before pagination. Values such as --help are query data, not CLI options. ASC's matching semantics still apply: string/type queries accept regular expressions, and invalid patterns return errors. The exact value --gui returns an explicit error because ASC reserves it before parsing CLI arguments. Exact method/field class names accept Java names or Dalvik descriptors; fuzzy class patterns retain their original meaning.

The extends and impl kinds query direct superclass/interface declarations, including interface-to-interface declarations. They require Droid ASC 0.1.2.post2 or newer (installed by the updated dependency requirement). Supply a Java name or Dalvik descriptor in value; class filters are rejected for these kinds. Records contain dex, class_name, relation, target, and raw, with relation_scope="direct". They are not transitive subclass searches or runtime dispatch graphs. Unrecognized text remains a raw-only record. The same queries work with asc_analyze_dex(operation="find_refs", ...).

Snapshots are decoded and sorted once, then cached for 60 seconds (up to 8 entries). The cache budget accounts for Python strings and tuple pointers, not just original output bytes. Identical concurrent queries share a single computation; unrelated queries and cache hits do not wait on a global computation lock. Snapshots are keyed by query and file identity/size/timestamps. Cache misses rerun ASC; this is not an immutable content-addressed evidence store. Do not modify APK files between pages.

Bare DEX analysis

Available in v0.2.3. It accepts 1-64 explicit .dex paths under the allowed roots, with a combined size bounded by DROIDASC_MCP_MAX_APK_BYTES. Directories, APKs and CompactDex are not accepted by this tool. DEX 041 containers are supported, with the combined limit of 64 logical DEX files.

asc_analyze_dex(dex_paths=["/samples/classes.dex", "/samples/classes2.dex"])
asc_analyze_dex(dex_paths=["/samples/classes.dex"], operation="list_classes", prefix="com.example")
asc_analyze_dex(dex_paths=["/samples/classes.dex"], operation="get_class_source", class_name="com.example.Main")
asc_analyze_dex(dex_paths=["/samples/classes.dex"], operation="find_refs", kind="string", value="Authorization")

operation defaults to info. Successful responses have status="ok" and a sources array mapping internal dex_entry names to original paths, SHA-256 hashes, sizes and class counts. Class/source results retain dex_entry; reference results retain ASC's best-effort dex field. Input order determines entry names. Keep both the order and file bytes stable between pages and compare the returned hashes. Each call imports and analyzes afresh; APK cross-request caching does not apply to this tool.

Standard little-endian DEX headers (035/037/038/039/040), fixed ID-table bounds, file size, SHA-1 signature and Adler-32 checksum are checked before analysis. Checksum validation does not prove method bodies or runtime coverage are complete. The tool preserves input bytes, creates private temporary analysis containers, and invokes ASC's public module entry point in the supervised worker. Containers are not installable APKs and are removed after success, failure, timeout or cancellation. Temporary disk usage can approach twice the combined input size, plus ZIP overhead.

DEX 041 inventory, focused references, discovery, structure and indexes read each logical header against the original physical bytes without Java. One physical snapshot backs the logical entries; snapshot_entry, stored_size_bytes, logical_header_offset and logical_size_bytes distinguish storage from logical ownership. The original physical SHA-256 is retained in sha256/container_sha256. Shared later pools are supported, and every logical header and checksum is validated before publication.

ASC class/Smali source uses a temporary selected-header view when needed, recording its separate source_view hash. Explicit Java source still uses JADX 1.5.5/JDK 17+ and a bounded, temporary dexlib2 standalone conversion; the JADX distribution supplies the required jars. The legacy operation="find_refs" adapter retains its previous standalone DEX 041 conversion and requires DROIDASC_MCP_DEXLIB_HOME (Google Smali 3.0.9) plus JDK 17+, not JADX. Use focused reference operations for native DEX 041 queries. Conversion views reserve up to seven times the original physical bytes plus metadata; they never replace the original snapshot.

Duplicate class definitions are rejected with status="error", code="duplicate_class" rather than selecting one silently (up to 20 conflicts are returned). get_manifest returns status="not_applicable", code="no_manifest". Invalid input/query and engine failures return diagnostic codes; a successful empty reference search is status="ok", total=0. Path policy, worker startup, timeout, memory and stream-limit failures remain MCP tool errors. Clients must inspect both MCP errors and the structured status.

This is post-export static analysis, not automatic unpacking or DEX repair. It does not recover missing code, decrypt runtime-only method bodies, or reconstruct the original manifest/resources. Every result is limited to supplied files (coverage="supplied_files_only"), with runtime completeness marked unknown. Untrusted dumps still require an isolated analysis environment.

Immutable sessions

Open with asc_open_dex_session(dex_paths=[...]), retain its session_id, then call asc_query_dex_session(session_id="...", operation="list_classes"). Query parameters match asc_analyze_dex. Close with asc_close_dex_session(session_id="...").

The input_id binds ordered DEX SHA-256 hashes, schema and ASC version. The UUID session ID identifies one private snapshot, not a global current sample. Changing/deleting original files does not mutate that snapshot. Cache keys include complete query options and backend identity, not merely the input ID; distinct queries cannot share a cached page. Reuse skips reimport, integrity checks and the duplicate-class scan; it does not retain a resident decompiler or promise warm engine latency. Method results identify the optional backend version separately. Sessions are local to this server process, not shared across hosts/restarts.

Idle sessions expire (swept at most every 30 seconds), and least-recently-used idle sessions can be evicted at capacity. Active queries pin storage. Closing an active session prevents new queries and returns cleanup_pending=true; the last active query releases the files. Normal MCP lifespan shutdown cleans sessions; abrupt host termination may leave OS temporary files. A lost handle returns session_not_found, never silently reloads changed evidence. Cancellation or failed opens release their reservations. Concurrent preparation has reserved disk/count capacity before starting.

Exact methods and Smali

Core focused DEX queries, discovery, indexes and structural views do not need Java or JADX. source_format=auto (the default) and smali use ASC 0.1.2.post3 directly. Set debug_info=true to include upstream debug directives.

Only explicit source_format=java needs the official JADX 1.5.5 distribution and a JDK 17 or newer. Set DROIDASC_MCP_JADX_HOME to its extracted directory (containing lib/). Set DROIDASC_MCP_JAVA to the JDK's java executable, or put it on PATH. A JRE alone cannot run the source bridge. The Python package does not bundle/download JADX or require Java for ASC tools.

asc_query_dex_session(session_id="...", operation="list_methods", class_name="com.example.Main")
asc_query_dex_session(session_id="...", operation="get_method_source", method_descriptor="Lcom/example/Main;->check(I)Z")
asc_analyze_dex(dex_paths=["/samples/classes.dex"], operation="get_method_source", method_descriptor="Lcom/example/Main;->check(I)Z", source_format="smali")

list_methods reads raw DEX definitions natively, including constructors, synthetic/bridge methods, native/abstract declarations, complete parameter types and return types. It sorts full descriptors before pagination. No method name, partial prototype, or overload index selects a body. get_method_source requires the exact full descriptor; an absent overload returns method_not_found. Class mismatches are rejected rather than choosing another owner.

source_format=auto returns ASC's exact-method Smali without attempting Java decompilation. Results carry format, fell_back, fallback_reason, backend version, original hashes and dex_entry. Explicit java returns java_unavailable instead of falling back when no exact Java method body is available; missing Java configuration returns backend_unavailable. Java error/warning counts are engine diagnostics, not proof of semantic correctness. Reference tools named find_refs still use ASC's best-effort name-level text.

find_field_refs requires field_descriptor, for example Lcom/example/Config;->enabled:Z. Set field_access to all (default), read or write. Rows contain the exact caller and field descriptors, access, storage (static/instance), opcode, DEX provenance and code-unit offset. Filtering occurs before pagination, so totals and page cursors refer to the selected access kind. Same-name fields with different types are distinct; an unused or absent field returns zero matches, while references to external fields retain target_dex_entry=null. Definition lookup is literal: inherited field resolution is not performed. Reflection, JNI, method-handle targets and encoded initial values are not direct instruction accesses and are not claimed as reads or writes. This operation uses the native instruction scanner on one-shot inputs and sessions, without Java.

asc_query_dex_session(
    session_id="...",
    operation="find_field_refs",
    field_descriptor="Lcom/example/Config;->enabled:Z",
    field_access="write",
)

find_method_refs and get_method_calls are separate descriptor-exact operations on DEX inputs and sessions, using the native instruction scanner. Each result row carries full caller/callee descriptors, caller dex_entry, opcode, and instruction_offset in 16-bit code units from the method's first instruction, not a file offset. target_dex_entry and target_resolution describe whether the declared operand has a definition in the supplied files. Incoming queries may target external methods; outgoing queries require a definition. Rows sort by DEX entry, class, caller descriptor and instruction position before pagination.

asc_query_dex_session(session_id="...", operation="find_method_refs", method_descriptor="Lcom/example/Main;->check(I)Z")
asc_query_dex_session(session_id="...", operation="get_method_calls", method_descriptor="Lcom/example/Main;->check(I)Z")

These scan declared method operands, not resolved runtime targets. Counts report scanned methods and instructions, declarations without code, undefined operands and dynamic sites. Polymorphic calls preserve their call-site prototype; dynamic sites include at most 20 diagnostic examples. instruction_scan_complete means the selected scope was decoded, not that a runtime call graph is complete. Virtual dispatch, reflection, JNI and runtime-loaded code remain unresolved. Unknown instructions or decoding failures return an error rather than partial results marked complete.

Only explicit Java source queries start the optional JVM (512 MiB maximum heap), sharing the worker's timeout, aggregate memory, output and cancellation limits. Other JADX versions are rejected. Reference pages expose total, offset, limit, next_offset, truncated and has_more. For method references, field references, outgoing calls and fuzzy member references, limit is a maximum: a page can stop earlier at the same 256-KiB encoded DEX-response budget. Such pages report page_limited_by="response_bytes" and response_byte_limit; follow next_offset, not offset + limit, to retain every site. A complete row or metadata that cannot fit still returns response_limit. The API takes DEX inputs/sessions, not an APK path.

Development grouped references: asc_query_dex_session(reference_format="grouped") returns groups containing caller, dex_entry, target_field, first-appearance-ordered deduplicated matches, and every original evidence row. Each evidence row's target_index selects its target from matches; restore it under target_field. Restore caller/DEX and the optional shared offset_unit from the group header. This applies to method, field, outgoing, fuzzy member, literal string and explicit type-operand references. The default remains flat. In grouped mode limit counts caller groups, while total, offset, next_offset and returned_sites count individual sites. A large caller can span multiple byte-bounded pages. Continue with cursor=next_cursor, unchanged selectors and offset=0; the page limit may change. Cursors are versioned and bound to the session, query and immutable preparation/runtime identity; closing or expiring the session ends their lifetime. Group evidence in response order reconstructs the original flat stream, including duplicates. No new release or benchmark parity is implied by this development API.

Indexed investigation

operation="get_call_graph" explores an exact method_descriptor with direction="incoming"|"outgoing"|"both" (default both), depth=1..5 (default 2), max_nodes=1..500 (default 200) and max_edges=1..1000 (default 500). Without an existing session index it scans bounded BFS frontiers, validating every instruction without first materializing all APK call sites (backend="native-dex-frontier", no index field). Exact-page reuse is reported by query_cache.hit, not by a fabricated index flag. Existing calls-only or complete xref indexes remain reusable. Explicitly configuring the durable xref cache opts into the original calls-only build/restore path. Unusually dense frontiers fall back to an atomic disk-bounded calls-only index; no field/type index is built just for a graph. Preparation and either scan/index cost are included in cold measurements, not hidden in readiness. Nodes retain minimum hop distance and definition DEX; edges retain individual call sites including repeated calls, original opcode, offset and target provenance. Cycles and recursive calls terminate without duplicate call sites. External method operands can be roots too. Graph exploration has a 128 KiB content budget, separate from ordinary pagination. truncation_reasons distinguishes depth, node, edge and byte boundaries; traversal_complete_within_depth describes only the requested static neighborhood. Expand boundary descriptors as new roots or raise budgets to investigate further; node expansion_status identifies expanded, pending and depth/budget-boundary methods. offset must be zero and ordinary limit does not control graphs. Diagnostics count dynamic sites only in returned nodes (at most 20 examples), including unresolved invoke-custom targets; these do not become fabricated call edges. Runtime dispatch remains unresolved.

build_xref_index scans all supplied DEX files once and atomically publishes a bounded SQLite index. Subsequent exact method/field references reuse it without rescanning. find_type_refs builds/reuses it and separates type_relation=instruction|declaration|annotation|all, including nested annotation type values. Types and arrays match exactly, not by assignability or array component expansion. search_members discovers full method/field declarations without knowing their class first:

asc_query_dex_session(session_id="...", operation="search_members", kind="method", value="->check(")
asc_query_dex_session(
    session_id="...",
    operation="find_type_refs",
    type_descriptor="Lcom/example/Main;",
    type_relation="annotation",
)

Search uses a case-sensitive literal substring of the full descriptor, not a regex. An optional class_name restricts its exact owner. Feed returned descriptors unchanged into exact references or Smali queries. Searching declarations is not searching DEX string pools or runtime usages. Member discovery reads declarations only and does not build the full xref index. Use operation="search_strings", value="https://" for case-sensitive literal DEX string-pool search with dex_entry, string_index and value provenance; pool presence is not a use site. Both discovery operations return instruction_scan_complete=false.

Added in 0.2.4: pass a discovered string unchanged to operation="find_string_refs", value=... for literal const-string/jumbo use sites. It returns caller, opcode, string index and code-unit offset without building an index; case_sensitive=false enables case-insensitive substring matching. Pages retain a complete scan count; pool-only/encoded initial values are not instruction use sites. Existing find_refs remains the legacy regex/name-level interface.

Use search_refs for a single-pass union of matching reference sites, without first enumerating declarations or building a full index. For example:

asc_query_dex_session(
    session_id=sid,
    operation="search_refs",
    kind="method",
    class_name="java.lang",
    fuzzy_class=True,
    value="equal",
    member_match="name",
)
asc_query_dex_session(
    session_id=sid,
    operation="search_refs",
    kind="field",
    class_name="android.os.Build",
    target_descriptor="Ljava/lang/String;",
    access="read",
)

member_match selects name (literal substring), exact_name, prototype (method prototype substring), or descriptor (literal substring of the complete identity). case_sensitive defaults to true; fuzzy_class applies a literal owner substring rather than a regex. Omit value to select an owner; either a value or an owner is required. target_descriptor filters an exact method prototype or field type. matched_targets counts referenced identities, not unused declarations. Pagination spans the entire union, preserving exact descriptors and checked instruction boundaries.

Session preparation reports actual validation progress over MCP. It snapshots and checks input integrity and the class directory, but defers heavy indexes until requested. It does not hide unvalidated data behind a successful response or start background whole-program decompilation.

A resident cache holds up to 32 serialized pages / 4 MiB per session (256 KiB per page). It avoids worker startup for repeated exact pages, and invalidates on implementation, engine or index-file identity changes. It never retains parsed DEX or worker processes. Selected method, field, outgoing-call, fuzzy-reference, string and operand-only type queries also stream complete matched site sets to private session storage. Later pages reuse that checked set rather than scanning the input again. This cache reserves at most 32 MiB per session, with a 16-MiB entry/build limit, within DROIDASC_MCP_MAX_DEX_SESSION_BYTES. Reservation is lazy; insufficient space, oversized sets or cache failures preserve the normal scan path. Selected rows use independently compressed, bounded blocks; public flat rows and page offsets are unchanged. Compression does not relax entry, session or response-size limits. First-query cost includes writing and checking the complete selected set. Reuse reports query_cache.scope=selected_reference_set, its reserved budget and retained bytes. Input/backend changes invalidate reuse; session close/expiry removes the stored sets. All 18 tools expose typed MCP output schemas, including nested result rows and diagnostics.

Index construction costs time/disk upfront. Default per-session index quota is 512 MiB of disk, reserved from the session storage budget; large applications may need an explicitly larger index quota, session budget and timeout. Cancellation, malformed input or quota failures do not publish a partial index. Identity includes input hashes, schema and backend files. Close/expiry/server shutdown deletes the working copy. By default, one-shot indexes are temporary too.

To retain reusable indexes across sessions and server restarts, explicitly set DROIDASC_MCP_XREF_CACHE_DIR to a dedicated private directory (0700 on POSIX; private ACLs on Windows). This opt-in store retains derived identifiers and relationships, not the original APK. It is keyed by ordered input hashes, schema, index scope and native parser source hashes. Reopening still validates the supplied DEX files; a matching complete index is copied into the new session and checksum-verified before use. Exact references and member discovery restore an available index without rebuilding it. index.durable_cache reports stored, restored, not_accessed, disabled or too_large; session working copies still have session_lifetime.

The durable store defaults to 1 GiB (DROIDASC_MCP_MAX_XREF_CACHE_BYTES), 64 entries and seven idle days (DROIDASC_MCP_XREF_CACHE_TTL_SECONDS). These bytes are separate from the session reservation. Reads/writes serialize across processes; TTL/LRU cleanup runs on cache access. Checksums, incomplete-write cleanup and atomic publication protect against interrupted writes; eviction does not invalidate active session copies. Large indexes need sufficient limits in both stores. Cache misses keep the ordinary streamed discovery/reference path; they do not force a full build. Stop servers before manually removing the dedicated cache directory.

The server also exposes initialization instructions, droidasc://analysis-guide, and triage_apk / trace_exact_method prompts. Artifact contents remain untrusted query data. trace_exact_method accepts either a full method_descriptor or exact class_name plus method_name; optional target_descriptor selects an overload prototype. It normalizes selectors for direct query handoff and keeps ambiguous names explicit until resolved. See the source-backed competitor comparison for remaining gaps.

Optional Rust ASC

Run uv run python scripts/setup_rust.py with Rust installed, then set DROIDASC_MCP_RUST_ASC to the resulting artifacts/rust_ASC/target/release/rust_ASC (rust_ASC.exe on Windows). The setup script pins source and radguard revisions. Select backend="rust_asc" on the manifest, class-list, class-source or APK-reference tool. Python ASC remains the default; no silent fallback occurs. Rust does not provide our exact DEX index/Smali queries or extends/impl path. Its upstream reference scanner can discard per-DEX failures, so results explicitly report unverified coverage: zero hits are not absence proof. Both engines share scope/concurrency/process-tree budgets. See backend details.

Configuration

Environment variable

Default

Meaning

DROIDASC_MCP_ALLOWED_ROOTS

current directory

Allowed roots, separated by os.pathsep (: on Unix, ; on Windows)

DROIDASC_MCP_TOOL_PROFILE

legacy

legacy, opt-in artifact_preview (generic code bridge) or artifact (focused DEX tools); old calls stay valid

DROIDASC_MCP_TIMEOUT_SECONDS

180

Per-operation timeout

DROIDASC_MCP_MAX_APK_BYTES

2147483648

Maximum APK size or combined DEX input size

DROIDASC_MCP_MAX_OUTPUT_BYTES

67108864

Captured stdout limit and aggregate decoded snapshot budget

DROIDASC_MCP_MAX_WORKER_MEMORY_BYTES

2147483648

Worker-tree budget (Windows Job aggregate; POSIX per-process address-space cap plus aggregate RSS watchdog)

DROIDASC_MCP_MAX_PAGE_SIZE

1000

Maximum lines returned by one call

DROIDASC_MCP_MAX_PARALLEL

2

Maximum concurrent ASC subprocesses

DROIDASC_MCP_MAX_DEX_SESSIONS

4

Maximum open/preparing DEX sessions

DROIDASC_MCP_DEX_SESSION_TTL_SECONDS

1800

Idle session expiry

DROIDASC_MCP_MAX_DEX_SESSION_BYTES

4294967296

Session storage, index/reference-cache budgets and concurrent preparation reservations

DROIDASC_MCP_JADX_HOME

unset

Optional JADX 1.5.5 distribution directory

DROIDASC_MCP_DEXLIB_HOME

unset

Standalone Google Smali 3.0.9 JAR directory, for DEX 041 normalization only

DROIDASC_MCP_JAVA

java on PATH

Optional JDK 17+ executable

DROIDASC_MCP_MAX_XREF_INDEX_BYTES

536870912

Per-session index disk quota/reservation, not resident memory

DROIDASC_MCP_RUST_ASC

unset

Optional Rust ASC executable path

Design

  • Uses the public droidasc CLI module entry point; it does not import ASC private internals.

  • Never invokes a shell and does not expose a generic command tool.

  • Drains stdout and stderr concurrently with hard capture caps; no bulk output files are created.

  • Caps stderr at 64 KiB and budgets page content conservatively within 256 KiB.

  • Runs ZIP inspection and hashing in a supervised worker under the same concurrency budget.

  • On POSIX, kills the operation's process group on completion or failure, even if its leader exited.

  • On Windows, assigns the worker to a kill-on-close Job Object before starting ASC. Cleanup includes descendants even after the worker exits; Job setup failure prevents analysis from starting.

  • Propagates MCP request cancellation through queue/snapshot waits and active sync tools; cleanup completes before the cancelled server task exits, and the session can continue serving requests.

  • Applies the configured worker memory ceiling before importing ASC. Windows limits aggregate committed memory for the Job tree. POSIX applies an inherited per-process kernel RLIMIT_AS and samples aggregate tree RSS every 50 ms, terminating the tree if it crosses the same budget.

  • Resolves symlinks before checking the allowed-root policy.

ASC and its dependencies still parse untrusted binary input. Use a container or disposable VM for hostile APKs. This adapter is a process boundary, not a malware sandbox.

Native Windows CI checks live-parent and orphan cleanup, including grandchildren, successful completion, output overflow, reader termination, and repeated-operation handle counts. Capture buffers, snapshots being built, and active pages can coexist with the cache; this budget is not a hard MCP-host total-RSS cap. The POSIX aggregate tree check is a sampled watchdog, while the inherited per-process address-space ceiling is kernel-enforced. Dense outputs may hit the decoded-memory budget before the wire cap.

Development

See local acceptance checks for real-process tests, optional APK transport checks, measured outcomes, and the remaining verification limits.

uv sync --locked --extra dev
uv run ruff check .
uv run pytest --cov --cov-report=term-missing
uv run python scripts/validate_corpus.py /path/to/one.apk /path/to/another.apk
uv run python scripts/stability_check.py /path/to/one.apk --duration 300 --workers 2
uv build
# Python 3.12+; use fresh dist outputs matching the current version:
uv run python scripts/verify_dist.py dist/droidasc_mcp-0.2.5.tar.gz dist/*.whl

License

Apache License 2.0. Droid ASC is a separate upstream project and retains its own copyright and license.

Available Tools

18 tools
asc_analyze_dexA
Read-only

Analyze 1-64 standard DEX files with source hashes and per-DEX provenance.

Returns status=ok, error, or not_applicable. Errors carry a diagnostic code; duplicate class definitions are rejected. Manifest is not applicable to DEX. Coverage is limited to supplied files; this tool does not unpack applications. Native instruction/declaration queries need no JVM or JADX; Smali uses ASC. Explicit source_format=java alone selects the optional compatibility backend. find_method_refs/get_method_calls return declared instruction targets, not runtime dispatch. Use a full method_descriptor, e.g. Lpkg/C;->name(I)Ljava/lang/String;. Or supply exact class_name and method_name for a declared method; target_descriptor optionally selects its prototype. Ambiguous names fail without choosing an overload. find_field_refs requires field_descriptor (Lpkg/C;->name:I). field_access filters reads/writes; inheritance and reflective accesses are not resolved. find_type_refs reports static type relations. type_relation=operand selects explicit instruction type operands without an index; type_match optionally selects substrings. build_xref_index builds a bounded complete static index; one-shot indexes are temporary. get_call_graph uses bounded frontiers or an index for multi-hop static exploration. Graph depth/node/edge/byte boundaries and unresolved dynamic sites are explicit. search_members scans declarations without building an index; kind=method/field. find_string_refs accepts a literal value and returns const-string/jumbo use sites. value is a case-sensitive literal substring of the full descriptor, not regex. class_name restricts exact owner. search_strings scans DEX string-pool values using a case-sensitive literal value, not instruction use sites. source_format=auto uses ASC exact-method Smali without Java/JADX; source_format=java explicitly opts into the optional JADX compatibility backend. java never silently falls back, smali always disassembles that exact method.

NameRequiredDescriptionDefault
kindNoReference category; search_members accepts method or field onlystring
depthNoGraph hop bound; bounded frontiers or an on-demand calls-only index.
limitNoMaximum result page size in rows or source lines, server-capped
valueNoLiteral value (classes: Dalvik or dotted); exact extends/impl parent
offsetNoZero-based result offset; graph traversal requires zero
prefixNoLiteral class/package prefix, case-sensitive
threadsNoPositive ASC worker count; requested values above 32 are capped
dex_pathsYesOrdered standard DEX file paths; combined bytes are server-bounded
directionNoGraph direction; edges retain caller-to-callee orientation.both
max_edgesNoGraph call-site budget; repeated calls remain separate edges.
max_nodesNoCall-graph node budget including the root.
operationNoStatic DEX operation; method selection preserves exact overload identityinfo
class_nameNoExact owner class; for legacy fuzzy references, a literal owner substring
debug_infoNoInclude debug line/local metadata for explicit method Smali only
type_matchNoCase-sensitive type matching; substring requires type_relation=operandexact
fuzzy_classNoLegacy owner substring matching; exact member tools require false
method_nameNoExact declared method name with class_name, instead of method_descriptor; overloads require target_descriptor
field_accessNoInstruction field-access filter, for find_field_refsall
member_matchNoLiteral identity or name; search_refs also accepts exact_name and prototypedescriptor
source_formatNoExact method source; auto has explicit fallback diagnosticsauto
type_relationNooperand selects explicit type operands without an index; instruction includes member types and catchesall
case_sensitiveNoLiteral discovery matching case; false ignores case
type_descriptorNoDEX type including array dimensions; operand scope also accepts dotted names or literal substrings
field_descriptorNoFull field identity: Lpkg/C;->name:type
method_descriptorNoFull method identity: Lpkg/C;->name(args)return; preserves overloads
target_descriptorNoExact prototype for method_name selection; search_refs prototype or field-type filter

Output Schema

NameRequiredDescription
codeNo
depthNo
edgesNo
indexNo
itemsNo
limitNo
nodesNo
totalNo
formatNo
groupsNo
moduleNo
offsetNo
sourceNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
dex_entryNo
directionNo
max_edgesNo
max_nodesNo
span_unitNo
truncatedNo
apk_sha256No
class_nameNo
edge_countNo
input_kindNo
limit_unitNo
node_countNo
session_idNo
source_endNo
superclassNo
total_unitNo
type_matchNo
edge_countsNo
field_countNo
limitationsNo
method_nameNo
next_cursorNo
next_offsetNo
query_cacheNo
scan_errorsNo
access_flagsNo
has_manifestNo
method_countNo
source_startNo
stored_bytesNo
artifact_pathNo
dynamic_sitesNo
source_sha256No
type_relationNo
engine_versionNo
returned_sitesNo
artifact_sha256No
backend_versionNo
candidate_countNo
cleanup_pendingNo
page_limited_byNo
scanned_methodsNo
type_descriptorNo
definition_countNo
field_descriptorNo
idle_ttl_secondsNo
reference_formatNo
selected_modulesNo
unresolved_sitesNo
member_referencesNo
method_descriptorNo
truncation_reasonsNo
unresolved_matchesNo
reference_semanticsNo
response_byte_limitNo
methods_without_codeNo
reserved_index_bytesNo
runtime_completenessNo
scanned_instructionsNo
hierarchy_cycle_detectedNo
instruction_scan_completeNo
runtime_target_resolutionNo
unresolved_sites_truncatedNo
traversal_complete_within_depthNo

TDQS

A3.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/non-destructive annotations, the description discloses substantial behavioral traits: duplicate class definitions are rejected, errors carry diagnostic codes, coverage is limited to supplied files, no JVM/JADX is needed, ambiguous overloads fail, inheritance and reflective accesses are not resolved, one-shot indexes are temporary, and graph boundaries/unresolved dynamic sites are explicit. It also clarifies that java never silently falls back and smali always disassembles the exact method.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately scoped for a 26-parameter, 24-operation tool, but it is a semicolon-heavy wall of text with no headings or operation-level structure. The source_format behavior is repeated in two places ("Explicit source_format=java..." and "source_format=auto... source_format=java..."), which wastes space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the nuanced operations (method/field/type refs, string refs, call graph, indexes, source formats) reasonably well, and the output schema handles return values. However, for a tool exposing 24 operations, many operations (info, list_classes, get_class_source, list_methods, search_classes, get_class_outline, get_class_hierarchy, get_string_constants, search_method_bodies, disassemble_method, get_class_source_metadata) receive no description at all, leaving the agent to infer their behavior from names alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3. The description adds some cross-parameter meaning (find_field_refs requires field_descriptor; type_match requires type_relation=operand; search_members accepts only kind=method/field), but most of these constraints are already stated in the schema descriptions, so the added value over structured fields is marginal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: "Analyze 1-64 standard DEX files with source hashes and per-DEX provenance." It is clear this is a static DEX analysis tool with many operations, but it does not differentiate itself from siblings such as asc_list_classes, asc_get_class_source, or asc_find_refs, which overlap with its operation list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides parameter-level guidance ("Use a full method_descriptor...", "Explicit source_format=java alone selects...") but never states when to use this tool instead of the dedicated sibling tools. The only scope exclusion is "this tool does not unpack applications," which concerns APK tools, not the overlapping DEX siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_apk_infoB
Read-only

Inspect APK size, SHA-256, manifest presence, and top-level DEX entries.

NameRequiredDescriptionDefault
apk_pathYesAPK file path within configured allowed roots
include_sha256NoCompute a full input SHA-256 when true

Output Schema

NameRequiredDescription
sha256No
apk_pathYes
size_bytesYes
dex_entriesYes
has_manifestYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that the tool reports size, hash, manifest presence and top-level DEX entries, but says nothing about cost, truncation of DEX listings, or behavior when the APK is malformed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with an explicit verb and an enumerated output list; nothing redundant and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover safety, so the description does not need to explain return values. However, for a tool sitting in a dense cluster of APK/DEX inspection siblings, the absence of any routing guidance leaves the agent to guess which entry point to call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both apk_path and include_sha256 are already documented in the schema. The description's mention of SHA-256 loosely signals that hashing is part of the output and therefore toggleable, but adds no syntax or default details beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Inspect) plus resource (APK) and an enumerated set of outputs: size, SHA-256, manifest presence, top-level DEX entries. That is enough to know it is a lightweight overview tool, but it never distinguishes itself from siblings like asc_manifest_summary, asc_list_apk_entries, or asc_analyze_dex, which cover overlapping ground.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus the many overlapping siblings (asc_manifest_summary, asc_list_apk_entries, asc_analyze_dex) nor any exclusions or prerequisites. The word 'top-level' hints at a shallow scan, but the agent must infer that.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_close_dex_sessionA

Close a DEX session; active queries finish before its stored files are removed.

NameRequiredDescriptionDefault
session_idYesImmutable open DEX session ID returned by an open tool

Output Schema

NameRequiredDescription
codeNo
depthNo
edgesNo
indexNo
itemsNo
limitNo
nodesNo
totalNo
formatNo
groupsNo
moduleNo
offsetNo
sourceNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
dex_entryNo
directionNo
max_edgesNo
max_nodesNo
span_unitNo
truncatedNo
apk_sha256No
class_nameNo
edge_countNo
input_kindNo
limit_unitNo
node_countNo
session_idNo
source_endNo
superclassNo
total_unitNo
type_matchNo
edge_countsNo
field_countNo
limitationsNo
method_nameNo
next_cursorNo
next_offsetNo
query_cacheNo
scan_errorsNo
access_flagsNo
has_manifestNo
method_countNo
source_startNo
stored_bytesNo
artifact_pathNo
dynamic_sitesNo
source_sha256No
type_relationNo
engine_versionNo
returned_sitesNo
artifact_sha256No
backend_versionNo
candidate_countNo
cleanup_pendingNo
page_limited_byNo
scanned_methodsNo
type_descriptorNo
definition_countNo
field_descriptorNo
idle_ttl_secondsNo
reference_formatNo
selected_modulesNo
unresolved_sitesNo
member_referencesNo
method_descriptorNo
truncation_reasonsNo
unresolved_matchesNo
reference_semanticsNo
response_byte_limitNo
methods_without_codeNo
reserved_index_bytesNo
runtime_completenessNo
scanned_instructionsNo
hierarchy_cycle_detectedNo
instruction_scan_completeNo
runtime_target_resolutionNo
unresolved_sites_truncatedNo
traversal_complete_within_depthNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false; the description adds real lifecycle semantics beyond that, namely that in-flight queries are allowed to finish before stored files are deleted. It stops short of stating idempotency or behavior when session_id is invalid or already closed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact clause pair with the action first and the completion guarantee second; no padding and nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the single param is covered by the schema. The remaining gap is error/edge-case behavior for an invalid or already-closed session, which slightly limits completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is fully documented as an immutable session ID returned by an open tool. The description adds nothing further about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Close a DEX session') and the scope is unambiguous. An agent can distinguish it from asc_open_dex_session and asc_query_dex_session without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the session lifecycle rather than stated: nothing explicitly says when to close versus when to leave a session open, nor whether closing is required before opening another. The sibling set makes the intent inferable but no alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_diff_dex_sessionsA

Compare class/member identities with full descriptors and old/new source hashes.

Uses native DEX declarations without Java or an instruction index. Unchanged identities say nothing about changed behavior, access flags, annotations or bodies. Inventory is bounded to 1M identities and 64 MiB of cumulative declaration records.

NameRequiredDescriptionDefault
kindNoDeclaration identity kind to compareall
limitNoChanged declaration page size, server-capped
changeNoChange filter applied before pagingall
offsetNoZero-based offset in sorted changed descriptors
new_session_idYesOpen immutable candidate revision session ID
old_session_idYesOpen immutable baseline session ID

Output Schema

NameRequiredDescription
codeNo
itemsNo
limitNo
scopeNo
totalNo
countsNo
moduleNo
offsetNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
limitationsNo
new_sourcesNo
next_offsetNo
old_sourcesNo
new_input_idNo
old_input_idNo
artifact_pathNo
new_session_idNo
old_session_idNo
artifact_sha256No
backend_versionNo
selected_modulesNo
behavior_comparisonNo
declaration_attributes_comparisonNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: the no-Java/no-instruction-index basis and the hard caps of 1M identities and 64 MiB of cumulative declaration records. However, annotations declare readOnlyHint=false for what reads like a pure comparison over already-open immutable sessions, and the description never explains any side effect or session-state requirement, leaving that inconsistency unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first sentence and follows with scope-limiting caveats. Three short sentences with little waste, though the caveats could be tighter and the bound sentence sits apart from the usage warning it belongs with.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, all parameters are described, and annotations cover safety. The description supplies the resource bounds and the semantic limitation of identity-only diffs, so an agent has nearly everything needed; only the readOnlyHint=false discrepancy and the lack of a named alternative are gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter (kind, change, limit, offset, session IDs) is documented inline, so the schema carries the load. The description mentions only the comparison subject and hash fields, adding no semantics for filtering, paging, or sort order beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: compare class/member identities, with full descriptors and old/new source hashes across two sessions. This distinguishes it from query/analyze siblings, though it never explicitly contrasts itself with asc_analyze_dex or asc_query_dex_session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: it uses native DEX declarations without Java or an instruction index, and warns that unchanged identities say nothing about changed bodies, access flags or annotations. That implies when it is insufficient, but no alternative tool is named for the cases it cannot cover.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_find_refsA
Read-only

Find cross-DEX references or direct subclasses/interface implementors.

extends/impl use an exact class in value and return direct declarations only. Optional rust_asc supports string/type/method/field only and has unverified coverage.

NameRequiredDescriptionDefault
kindYesReference category; search_members accepts method or field only
limitNoMaximum result page size in rows or source lines, server-capped
valueNoLiteral value (classes: Dalvik or dotted); exact extends/impl parent
offsetNoZero-based result offset; graph traversal requires zero
backendNoEngine; rust_asc is opt-in and reports unverified coveragedroidasc
threadsNoPositive ASC worker count; requested values above 32 are capped
apk_pathYesAPK file path within configured allowed roots
class_nameNoExact owner class; for legacy fuzzy references, a literal owner substring
fuzzy_classNoLegacy owner substring matching; exact member tools require false

Output Schema

NameRequiredDescription
xmlNo
codeNo
kindNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
sourceNo
statusNo
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
class_nameNo
session_idNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds genuine behavioral context beyond them: results are non-transitive ('direct declarations only') and the rust_asc backend has 'unverified coverage'. Pagination/offset behavior and server-side caps are left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler, and the core capability is front-loaded. The phrasing is telegraphic and slightly awkward ('extends/impl use an exact class in value'), which costs a point but not readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full parameter documentation, the description only needs to convey the cross-kind behavioral differences, which it does. Minor gaps remain around graph-traversal constraints and result shape, but both are covered by schema fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all nine parameters are already documented, establishing a baseline of 3. The description reinforces the `value` semantics for extends/impl and the kind restrictions on rust_asc, but largely restates what the schema already says rather than adding new constraints or formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Find') and two concrete resources: cross-DEX references, and direct subclasses/interface implementors. The kind semantics (extends/impl vs. member references) make it distinguishable from a plain class lister, though no sibling tool is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful selection rules within the tool — extends/impl take an exact class in `value` and return direct declarations only, and rust_asc is limited to string/type/method/field. It never says when to choose this over asc_list_classes or asc_get_class_source, so cross-tool routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_get_class_sourceA
Read-only

Locate and decompile one class, returning a bounded page of source lines.

NameRequiredDescriptionDefault
limitNoMaximum result page size in rows or source lines, server-capped
offsetNoZero-based result offset; graph traversal requires zero
backendNoEngine; rust_asc is opt-in and reports unverified coveragedroidasc
threadsNoPositive ASC worker count; requested values above 32 are capped
apk_pathYesAPK file path within configured allowed roots
class_nameYesExact class descriptor or Java dotted class name

Output Schema

NameRequiredDescription
xmlNo
codeNo
kindNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
sourceNo
statusNo
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
class_nameNo
session_idNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and closed-world scope, so the safety profile is covered. The description adds useful context that results are paginated and bounded, but says nothing about decompilation cost, failure modes for an unknown class, or backend trade-offs that the schema hints at.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the core action and the paged return are both delivered up front.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema, return-value documentation is unnecessary, and the description covers scope and pagination adequately. It could go further on error behavior for missing classes and on the backend choice, but nothing essential to a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are documented in the schema itself, establishing a baseline of 3. The phrase "bounded page of source lines" reinforces the limit/offset semantics but adds no syntax or constraint detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource pair ("decompile one class") and the return shape ("bounded page of source lines"). The singular framing implicitly distinguishes it from asc_list_classes, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the tool for pulling the source of a specific class rather than enumerating classes. There is no explicit when-to-use/when-not or pointer to alternatives like asc_find_refs or asc_list_classes, and no mention of what to do if the class is not found.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_get_manifestB
Read-only

Decode AndroidManifest.xml and return a bounded page of XML lines.

NameRequiredDescriptionDefault
limitNoMaximum result page size in rows or source lines, server-capped
offsetNoZero-based result offset; graph traversal requires zero
backendNoEngine; rust_asc is opt-in and reports unverified coveragedroidasc
apk_pathYesAPK file path within configured allowed roots

Output Schema

NameRequiredDescription
xmlNo
codeNo
kindNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
sourceNo
statusNo
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
class_nameNo
session_idNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare this is a safe read-only operation, and the description adds that results are a bounded page of decoded XML lines. It does not add much about paging behavior, backend tradeoffs, or failure modes beyond what the schema and annotations already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted wording. It communicates the core operation and result shape immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety, an output schema, and full parameter documentation, the description is largely complete for calling the tool. Its main gap is the lack of explicit routing guidance against manifest-summary siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all four parameters are already documented in the input schema. The description mentions bounded paging, which relates to limit/offset, but adds no syntax or selection guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: decode AndroidManifest.xml and return XML lines. It is clear enough to distinguish from a summary-style tool, though it does not explicitly name asc_manifest_summary as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool returns but gives no explicit guidance on when to use it instead of siblings such as asc_manifest_summary or asc_read_apk_entry. Any usage context is only implied by the output format.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_inspect_artifactB
Read-only

Inspect container capabilities before selecting a DEX analysis workflow.

JVM classes and nested APK splits are inventory-only. First-level JAR class names are included. compare_to compares JVM identities; DEX declarations use session diff. AAB selects base, an exact module, an explicit list or * for all modules. Nested APKs are not reconstructed. include_summary describes the input artifact, including when compare_to is set. Manifest diagnostics are separate from inventory status; AAB protobuf XML is not decoded.

NameRequiredDescriptionDefault
limitNoEntry page size, server-capped
moduleNoAAB exact module, 1-100 distinct names, or * for all; omitted selects base
offsetNoZero-based offset in sorted capability entries
compare_toNoOptional newer artifact for JVM class inventory comparison
class_queryNoCase-insensitive literal substring of JVM class names
class_prefixNoJVM class prefix in dotted or Dalvik form
artifact_pathYesAPK/JAR/AAR/AAB/APKS/XAPK/ZIP path within allowed roots
include_summaryNoInclude compact manifest header, entry count and native ABI inventory
max_uncompressed_bytesNoNested JAR and optional manifest byte budget; input limit applies

Output Schema

NameRequiredDescription
codeNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
messageNo
modulesNo
sourcesNo
summaryNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
dex_entriesNo
limitationsNo
next_offsetNo
dex_analysisNo
artifact_kindNo
artifact_pathNo
artifact_sha256No
backend_versionNo
jvm_class_countNo
selected_moduleNo
nested_apk_countNo
selected_modulesNo
jvm_decompilationNo
split_reconstructionNo

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/destructive=false, so safety is covered; the description goes further with real limitations: nested APK splits are inventory-only and not reconstructed, first-level JAR class names only, AAB protobuf XML is not decoded, and manifest diagnostics are separate from inventory status. These are non-obvious scope boundaries an agent could not get from the schema, though the phrasing is terse and omits any note on result ordering/paging behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short, but it reads as a stack of decontextualized caveat fragments ("First-level JAR class names are included.") with no lead sentence establishing the primary behavior. Facts are present but not front-loaded by importance, so the agent must assemble the mental model itself.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be spelled out, and the caveats cover many edge cases. However, for a 9-parameter tool the description never states the core output (per-artifact capability inventory) or how inventory and summary outputs relate, leaving a gap in the agent's ability to predict results before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter descriptions are already detailed (module semantics, limit/offset paging, compare_to), so the baseline is 3. The description reinforces module selection and adds that include_summary still describes the input artifact when compare_to is set, but most statements (AAB base/exact/list/*) simply restate the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a verb and rough resource ("Inspect container capabilities"), and the artifact_path schema clarifies the container types. But it never plainly says what the tool returns (a capability/entry inventory per artifact) and never distinguishes it from close siblings like asc_apk_info, asc_list_apk_entries, or asc_list_classes, so an agent must infer the split.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"before selecting a DEX analysis workflow" implies a positioning step, and "compare_to compares JVM identities; DEX declarations use session diff" gives one routing rule toward asc_diff_dex_sessions. There is no explicit when-to-use/when-not guidance against the other artifact-inspection siblings, leaving the main selection decision unresolved.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_list_apk_entriesA
Read-only

List archive contents or a standalone DEX file without extracting files.

SHA-256 binds this page to the input. Standalone DEX entries use the original basename and bytes, without code validation or ZIP CRC metadata. Archive CRCs are declarations. Native rows are an archive inventory, not ELF analysis. Follow next_offset for more.

NameRequiredDescriptionDefault
kindNoEntry category; omit for all file entries
limitNoPage size, capped by server limits
offsetNoZero-based offset in sorted filtered entries
prefixNoCase-sensitive literal ZIP path prefix
apk_pathYesArchive or standalone DEX path within allowed roots

Output Schema

NameRequiredDescription
codeNo
entryNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
contentNo
decodedNo
messageNo
sourcesNo
apk_pathNo
coverageNo
encodingNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
entry_pathNo
session_idNo
xml_formatNo
byte_offsetNo
limitationsNo
next_offsetNo
crc_verifiedNo
artifact_pathNo
returned_bytesNo
artifact_sha256No
backend_versionNo
decoding_statusNo
content_completeNo
next_byte_offsetNo
selected_modulesNo
decoding_warningsNo
format_validationNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/destructive annotations by disclosing data-trust caveats: CRC values are declarations not verified, standalone DEX entries lack code validation and ZIP CRC metadata, and native rows are an archive inventory rather than ELF analysis. It also explains that SHA-256 binds each page to the input for stable pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every sentence carries useful caveat or pagination information. Some sentences are telegraphic fragments ('Archive CRCs are declarations.') that could be marginally clearer, but there is no wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage, an output schema, and explicit safety annotations, the description fills the remaining gaps: no extraction, stable pagination, and caveats about CRC and native-row interpretation. An agent has enough context to call it correctly and interpret the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaning to kind, prefix, apk_path, or the paging parameters beyond what the schema already documents; 'Follow next_offset' refers to an output field rather than clarifying inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List archive contents or a standalone DEX file'. The phrase 'without extracting files' contrasts with read/extract behaviour, but no sibling tool is named, so the differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides pagination guidance ('Follow next_offset for more') and notes SHA-256 binding across pages, but never states when to choose this tool over alternatives such as asc_read_apk_entry, asc_apk_info, or asc_inspect_artifact. Usage is implied, not prescribed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_list_classesC
Read-only

List class descriptors, optionally filtered by package or class prefix.

NameRequiredDescriptionDefault
limitNoMaximum result page size in rows or source lines, server-capped
offsetNoZero-based result offset; graph traversal requires zero
prefixNoLiteral class/package prefix, case-sensitive
backendNoEngine; rust_asc is opt-in and reports unverified coveragedroidasc
threadsNoPositive ASC worker count; requested values above 32 are capped
apk_pathYesAPK file path within configured allowed roots

Output Schema

NameRequiredDescription
xmlNo
codeNo
kindNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
sourceNo
statusNo
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
class_nameNo
session_idNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of pagination behavior, result caps, backend tradeoffs, or the fact that a fresh APK read may occur; it merely restates the filter capability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, which is well sized for a simple enumeration tool. It is efficient but borders on under-specified rather than maximally informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full schema coverage, the description needn't explain return values. However, for a six-parameter listing tool on an APK analysis surface it omits how prefix matching interacts with package versus class names and how this list relates to the sibling source/ref tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all six parameters including prefix, backend, limit and offset are documented in the schema with semantics like case-sensitivity and server caps. The description only echoes that prefix filtering exists and adds no format or syntax detail, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List class descriptors') plus the optional filter scope, so an agent knows exactly what comes back. It does not differentiate itself from siblings like asc_get_class_source or asc_find_refs, which likely operate on the same class universe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use context, no exclusions, and never names an alternative. An agent cannot tell from this text whether to enumerate classes here versus resolving source via asc_get_class_source or refs via asc_find_refs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_manifest_summaryA
Read-only

Read structured Manifest components, filters, metadata and permission inheritance.

Raw declarations are preserved separately. Unspecified exported defaults and resource values remain unresolved. Provider path rules and URI grants need separate review; permission inheritance is static triage, not a runtime accessibility or vulnerability test.

NameRequiredDescriptionDefault
limitNoComponent page size, server-capped
offsetNoZero-based component offset in manifest order
apk_pathYesAPK path within the configured allowed roots

Output Schema

NameRequiredDescription
sdkNo
codeNo
entryNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
applicationNo
limitationsNo
next_offsetNo
declarationsNo
package_nameNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo
application_metadataNo
declared_permissionsNo
resource_values_resolvedNo
exported_defaults_resolvedNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/non-destructive annotations, it discloses real interpretive limits: exported defaults and resource values stay unresolved, and permission inheritance is 'static triage, not a runtime accessibility or vulnerability test'. That tells the agent exactly how much confidence to place in results, which no annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The capability statement is front-loaded and each following clause carries a distinct caveat, so no sentence is filler. Phrasing is terse to the point of fragmentation, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained; the description instead spends its budget on scope and epistemics, which is what's missing at this complexity. Combined with full parameter documentation, an agent has enough to call it and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and limit/offset/apk_path are each documented in the schema, including server capping and allowed roots. The description adds nothing about parameter behavior beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb (Read) plus enumerated resources (components, filters, metadata, permission inheritance) so the agent knows the output shape. It implicitly distinguishes itself from a raw-dump sibling via 'Raw declarations are preserved separately', but never names asc_get_manifest, so the differentiation stays inferential.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'Raw declarations are preserved separately' and 'need separate review' hint at when this tool stops and another begins, but no sibling is named and no explicit when-to-use condition is given. The agent must infer that asc_get_manifest covers the raw case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_open_artifact_sessionA

Snapshot selected direct DEX into an immutable reusable session with container hashes.

Direct DEX at arbitrary archive paths, AAR classes.jar DEX and selected AAB modules are supported. Pure JVM classes and nested split APKs stay inventory-only. Duplicate classes are rejected. Query and close the resulting ID with the existing DEX session tools.

NameRequiredDescriptionDefault
moduleNoAAB exact module, 1-100 distinct names, or * for all; omitted selects base
artifact_pathYesAPK/JAR/AAR/AAB/APKS/XAPK/ZIP input within allowed roots
max_uncompressed_bytesNoExpanded JAR/DEX bytes; disk reservation scales with this budget

Output Schema

NameRequiredDescription
codeNo
depthNo
edgesNo
indexNo
itemsNo
limitNo
nodesNo
totalNo
formatNo
groupsNo
moduleNo
offsetNo
sourceNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
dex_entryNo
directionNo
max_edgesNo
max_nodesNo
span_unitNo
truncatedNo
apk_sha256No
class_nameNo
edge_countNo
input_kindNo
limit_unitNo
node_countNo
session_idNo
source_endNo
superclassNo
total_unitNo
type_matchNo
edge_countsNo
field_countNo
limitationsNo
method_nameNo
next_cursorNo
next_offsetNo
query_cacheNo
scan_errorsNo
access_flagsNo
has_manifestNo
method_countNo
source_startNo
stored_bytesNo
artifact_pathNo
dynamic_sitesNo
source_sha256No
type_relationNo
engine_versionNo
returned_sitesNo
artifact_sha256No
backend_versionNo
candidate_countNo
cleanup_pendingNo
page_limited_byNo
scanned_methodsNo
type_descriptorNo
definition_countNo
field_descriptorNo
idle_ttl_secondsNo
reference_formatNo
selected_modulesNo
unresolved_sitesNo
member_referencesNo
method_descriptorNo
truncation_reasonsNo
unresolved_matchesNo
reference_semanticsNo
response_byte_limitNo
methods_without_codeNo
reserved_index_bytesNo
runtime_completenessNo
scanned_instructionsNo
hierarchy_cycle_detectedNo
instruction_scan_completeNo
runtime_target_resolutionNo
unresolved_sites_truncatedNo
traversal_complete_within_depthNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose that this is not read-only, not destructive, and closed-world; the description adds useful context that it creates an immutable reusable session with hashes. It also discloses that duplicate classes are rejected and that some inputs stay inventory-only. It does not mention permission requirements or other operational constraints beyond the schema's byte budget.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core action, and each additional sentence adds useful scope or follow-up information. There is no redundant restatement of the tool name or schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, 100% schema coverage, and an output schema, the description provides enough context to invoke the tool correctly. It covers supported inputs, limitations, duplicate handling, and how to use the resulting session ID.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context for artifact_path and module by explaining supported artifact forms, selected AAB modules, and inventory-only cases. It does not add much beyond the schema for max_uncompressed_bytes, but the schema already documents that parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it snapshots selected direct DEX into an immutable reusable session with container hashes. It also scopes supported artifact types and limitations. It does not explicitly distinguish this from the sibling asc_open_dex_session, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly indicates supported contexts: direct DEX at archive paths, AAR classes.jar DEX, and selected AAB modules, while noting that pure JVM classes and nested split APKs remain inventory-only. It also says to query and close the resulting ID with existing DEX session tools. It does not explicitly name when to prefer asc_open_dex_session instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_open_dex_sessionA

Validate and snapshot DEX inputs once; return an immutable hash-bound session.

Reuses the validated bundle, not a resident engine. Idle sessions expire and may be evicted at capacity. Source file changes require opening a new session.

NameRequiredDescriptionDefault
dex_pathsYesOrdered standard DEX file paths; combined bytes are server-bounded

Output Schema

NameRequiredDescription
codeNo
depthNo
edgesNo
indexNo
itemsNo
limitNo
nodesNo
totalNo
formatNo
groupsNo
moduleNo
offsetNo
sourceNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
dex_entryNo
directionNo
max_edgesNo
max_nodesNo
span_unitNo
truncatedNo
apk_sha256No
class_nameNo
edge_countNo
input_kindNo
limit_unitNo
node_countNo
session_idNo
source_endNo
superclassNo
total_unitNo
type_matchNo
edge_countsNo
field_countNo
limitationsNo
method_nameNo
next_cursorNo
next_offsetNo
query_cacheNo
scan_errorsNo
access_flagsNo
has_manifestNo
method_countNo
source_startNo
stored_bytesNo
artifact_pathNo
dynamic_sitesNo
source_sha256No
type_relationNo
engine_versionNo
returned_sitesNo
artifact_sha256No
backend_versionNo
candidate_countNo
cleanup_pendingNo
page_limited_byNo
scanned_methodsNo
type_descriptorNo
definition_countNo
field_descriptorNo
idle_ttl_secondsNo
reference_formatNo
selected_modulesNo
unresolved_sitesNo
member_referencesNo
method_descriptorNo
truncation_reasonsNo
unresolved_matchesNo
reference_semanticsNo
response_byte_limitNo
methods_without_codeNo
reserved_index_bytesNo
runtime_completenessNo
scanned_instructionsNo
hierarchy_cycle_detectedNo
instruction_scan_completeNo
runtime_target_resolutionNo
unresolved_sites_truncatedNo
traversal_complete_within_depthNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (non-read-only, non-destructive, closed-world), and the description adds real behavioral facts beyond them: the session is a validated snapshot, not a resident engine, it is hash-bound and immutable, idle sessions expire, capacity eviction is possible, and invalidation requires a new session. These are exactly the lifecycle facts an agent needs to avoid stale-handle failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and result, followed by the reuse model and invalidations. No filler; each sentence carries a distinct fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and it covers the parts an agent would otherwise get wrong (expiry, eviction, invalidation). A small gap is that it never points to the related lifecycle siblings asc_query_dex_session / asc_close_dex_session, leaving the follow-up path implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single dex_paths parameter is already documented (ordered, max 64, server-bounded byte total). The description adds only implicit meaning, that ordering matters because the session is hash-bound; it contributes no format or precedence detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb plus resource plus result: 'Validate and snapshot DEX inputs once; return an immutable hash-bound session.' The DEX-inputs scope cleanly distinguishes it from the artifact-oriented sibling asc_open_artifact_session, and the returned handle (a session) is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Source file changes require opening a new session' gives an explicit trigger condition for calling this tool, and the first sentence implies call-once-then-reuse. What's missing is an explicit alternative (e.g. asc_open_artifact_session for non-DEX artifacts) or a pointer that this is a prerequisite for asc_query_dex_session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_pingB
Read-only

Report server, engine, path-scope, and pagination configuration.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
codeNo
limitNo
totalNo
moduleNo
offsetNo
serverYes
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
limitationsNo
next_offsetNo
dex_sessionsYes
rust_backendYes
allowed_rootsYes
artifact_pathNo
max_page_sizeYes
method_backendYes
server_versionYes
artifact_inputsYes
artifact_sha256No
backend_versionNo
timeout_secondsYes
droidasc_versionYes
selected_modulesNo
max_worker_memory_bytesYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds only the categories of configuration reported, which overlaps what the output schema would carry; it discloses nothing extra about cost, failure modes, or latency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tersely constructed sentence with no filler, and the scope enumeration is front-loaded. It is efficient, though the single sentence is dense with comma-separated nouns rather than structured clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the tool is a trivial zero-parameter read. What remains missing is only the framing that this is a health/connectivity check, which is a small but real gap for a tool named ping.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no semantics to explain; baseline 4 applies. The description's mention of pagination configuration is the only parameter-adjacent hint and is harmless.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Report" is a weak verb, and the description never says this is a ping/connectivity-health check, which is what the name implies. It does enumerate the config domains returned (server, engine, path-scope, pagination), giving partial specificity, but an agent must infer that the tool is a liveness/config probe rather than a data-fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement about when to call this versus the many session/analysis siblings (asc_open_dex_session, asc_apk_info, etc.). No prerequisites, no mention that it is a safe first call to validate connectivity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_query_dex_sessionA

Query an immutable DEX session in a supervised worker, with original provenance.

Native instruction/declaration queries need no JVM or JADX; Smali uses ASC. search_refs combines literal owner/name/prototype filters without global preprocessing. find_string_refs accepts a literal value and returns const-string/jumbo use sites. target_descriptor optionally filters exact prototypes/field types. find_method_refs/get_method_calls return declared instruction targets, not runtime dispatch. method_descriptor is the full DEX class->name(args)return identity. Or supply exact class_name and method_name for a declared method; target_descriptor optionally selects its prototype. Ambiguous names fail without choosing an overload. find_field_refs requires field_descriptor (Lpkg/C;->name:I). field_access filters reads/writes; inheritance and reflective accesses are not resolved. build_xref_index persists an atomic static index for this session's lifetime. get_call_graph uses bounded frontiers or an index for multi-hop static exploration. Inspect truncation_reasons and unresolved_sites; graph edges are declared operands. An optional configured durable cache restores matching indexes across server restarts. find_type_refs with type_relation=operand scans explicit type operands without an index, using exact or literal substring type_match. Other type scopes build/reuse the index. instruction includes member-type and catch relations; exact matching preserves arrays. search_members scans declarations or reuses an existing index; kind=method/field. value is a case-sensitive literal substring of the full descriptor, not regex. class_name restricts exact owner. search_strings scans DEX string-pool values using a case-sensitive literal value, not instruction use sites. Identical discovery and non-indexed reference pages reuse a bounded session cache. Reference pages can stop at the byte budget before limit; continue with next_offset. reference_format=grouped returns groups with matches/evidence for instruction references. In grouped format limit counts caller groups; total/offset/returned_sites count sites. Continue with next_cursor and identical selectors; a large caller may span pages. source_format=auto uses ASC exact-method Smali, never JADX. source_format=java explicitly selects the optional compatibility backend.

NameRequiredDescriptionDefault
kindNoReference category; search_members accepts method or field onlystring
depthNoHop bound; bounded frontiers or an on-demand calls-only index.
limitNoMaximum result page size in rows or source lines, server-capped
valueNoLiteral value (classes: Dalvik or dotted); exact extends/impl parent
cursorNoGrouped next_cursor for the same session/query; leave offset at zero
offsetNoZero-based result offset; graph traversal requires zero
prefixNoLiteral class/package prefix, case-sensitive
threadsNoPositive ASC worker count; requested values above 32 are capped
directionNoGraph direction; edges retain caller-to-callee orientation.both
max_edgesNoGraph call-site budget; repeated calls remain separate edges.
max_nodesNoCall-graph node budget including the root.
operationNoSession operation; graph frontiers and type indexes run on demandinfo
class_nameNoExact owner class; for legacy fuzzy references, a literal owner substring
debug_infoNoInclude debug line/local metadata for explicit method Smali only
session_idYesImmutable open DEX session ID returned by an open tool
type_matchNoCase-sensitive type matching; substring requires type_relation=operandexact
fuzzy_classNoLegacy owner substring matching; exact member tools require false
method_nameNoExact declared method name with class_name, instead of method_descriptor; overloads require target_descriptor
field_accessNoInstruction field-access filter, for find_field_refsall
member_matchNoLiteral identity or name; search_refs also accepts exact_name and prototypedescriptor
source_formatNoExact method source; auto has explicit fallback diagnosticsauto
type_relationNooperand selects explicit type operands without an index; instruction includes member types and catchesall
case_sensitiveNoLiteral discovery matching case; false ignores case
type_descriptorNoDEX type including array dimensions; operand scope also accepts dotted names or literal substrings
field_descriptorNoFull field identity: Lpkg/C;->name:type
reference_formatNoReference rows or caller groups with complete evidence; default flatflat
method_descriptorNoFull method identity: Lpkg/C;->name(args)return; preserves overloads
target_descriptorNoExact prototype for method_name selection; search_refs prototype or field-type filter

Output Schema

NameRequiredDescription
codeNo
depthNo
edgesNo
indexNo
itemsNo
limitNo
nodesNo
totalNo
formatNo
groupsNo
moduleNo
offsetNo
sourceNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
dex_entryNo
directionNo
max_edgesNo
max_nodesNo
span_unitNo
truncatedNo
apk_sha256No
class_nameNo
edge_countNo
input_kindNo
limit_unitNo
node_countNo
session_idNo
source_endNo
superclassNo
total_unitNo
type_matchNo
edge_countsNo
field_countNo
limitationsNo
method_nameNo
next_cursorNo
next_offsetNo
query_cacheNo
scan_errorsNo
access_flagsNo
has_manifestNo
method_countNo
source_startNo
stored_bytesNo
artifact_pathNo
dynamic_sitesNo
source_sha256No
type_relationNo
engine_versionNo
returned_sitesNo
artifact_sha256No
backend_versionNo
candidate_countNo
cleanup_pendingNo
page_limited_byNo
scanned_methodsNo
type_descriptorNo
definition_countNo
field_descriptorNo
idle_ttl_secondsNo
reference_formatNo
selected_modulesNo
unresolved_sitesNo
member_referencesNo
method_descriptorNo
truncation_reasonsNo
unresolved_matchesNo
reference_semanticsNo
response_byte_limitNo
methods_without_codeNo
reserved_index_bytesNo
runtime_completenessNo
scanned_instructionsNo
hierarchy_cycle_detectedNo
instruction_scan_completeNo
runtime_target_resolutionNo
unresolved_sites_truncatedNo
traversal_complete_within_depthNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false on a tool named 'query', and the description explains why: build_xref_index 'persists an atomic static index for this session's lifetime' and an optional durable cache restores indexes across restarts. It also discloses failure modes and limits beyond the schema — truncated pages stopping 'at the byte budget before limit', ambiguity failing rather than guessing an overload, and unresolved_sites/truncation_reasons to inspect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in sentence one, but the remainder is an unstructured wall of one-clause statements hopping between operations with no headings or grouping. Given 23 operations some length is warranted, yet several lines (e.g., the instruction/catch and array-matching note) read as spec fragments rather than selection guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shapes need not be explained. However, for a dispatcher with 23 enum values, many operations (info, list_classes, get_class_source, list_methods, search_classes, get_class_outline, get_class_hierarchy, search_method_bodies, disassemble_method, get_class_source_metadata) are never described anywhere except the bare enum list, so the description is only partially complete for the tool's actual surface.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description does add some meaning beyond the schema — grouped format making 'limit counts caller groups' while 'total/offset/returned_sites count sites', and source_format=auto never falling back to JADX — but most of the 28 parameters get no mention, and the added detail is selective rather than compensatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Query an immutable DEX session in a supervised worker, with original provenance') and the body enumerates many of the 23 operations it dispatches. It stops short of differentiating this multi-op tool from overlapping siblings such as asc_list_classes, asc_get_class_source, and asc_find_refs, so an agent cannot tell from the text alone which entry point to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is substantial operation-level guidance ('find_field_refs requires field_descriptor', 'Or supply exact class_name and method_name... Ambiguous names fail', 'search_strings scans DEX string-pool values ... not instruction use sites'), which is genuinely useful. But the tool-selection question — when to use this dispatcher versus the dedicated sibling tools that expose the same operations — is never addressed, leaving the most important routing decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_read_apk_entryA
Read-only

Read bounded entry bytes as UTF-8 or base64, with input hash and entry provenance.

Binary XML decoding and returned-content truncation are separate statuses. Partial raw reads do not verify CRC. Resource IDs are not resolved; no filesystem extraction occurs. Standalone DEX bytes remain original, including 041 headers; code validation is separate.

NameRequiredDescriptionDefault
apk_pathYesArchive or standalone DEX path within allowed roots
max_bytesNoMaximum returned content bytes before encoding
decode_xmlNoDecode complete XML entries up to 4 MiB; false reads raw bytes
entry_pathYesExact entry path or standalone DEX basename from inventory
byte_offsetNoByte offset in raw or fully decoded content; follow next_byte_offset

Output Schema

NameRequiredDescription
codeNo
entryNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
contentNo
decodedNo
messageNo
sourcesNo
apk_pathNo
coverageNo
encodingNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
entry_pathNo
session_idNo
xml_formatNo
byte_offsetNo
limitationsNo
next_offsetNo
crc_verifiedNo
artifact_pathNo
returned_bytesNo
artifact_sha256No
backend_versionNo
decoding_statusNo
content_completeNo
next_byte_offsetNo
selected_modulesNo
decoding_warningsNo
format_validationNo

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe read, and the description goes well beyond them: it discloses that XML-decode and truncation are reported as separate statuses, that partial raw reads do not verify CRC, that standalone DEX bytes (including 041 headers) are returned unmodified, and that no extraction occurs. These are exactly the operational caveats an agent needs before trusting the returned bytes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the opening sentence and every following sentence carries a distinct caveat with no filler. Some fragments are elliptical ('separate statuses' separate from what?), which slightly blunts the density, but overall the length is well matched to the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations, a full output schema, and 100% parameter coverage, the description only needs to supply behavioral caveats, and it does so thoroughly (CRC, truncation, no extraction, DEX header preservation). The one gap is not pointing at asc_list_apk_entries as the source of valid entry_path values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so apk_path, entry_path, max_bytes, byte_offset, and decode_xml are already documented. The description adds only indirect context — that truncation and decoding are distinct statuses and that partial reads skip CRC — without explaining encoding selection or how byte_offset interacts with decoded versus raw content. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource — read bounded entry bytes from an APK/DEX archive — and adds the return encodings (UTF-8 or base64) plus provenance. It is clearly distinct from asc_list_apk_entries by being a read rather than an inventory operation, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through negative scoping: no resource-ID resolution, no filesystem extraction, code validation is separate. There is no positive routing such as 'use asc_list_apk_entries first to obtain entry_path', even though the schema's 'from inventory' phrasing gestures at it. An agent can infer scope but must work for it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_secret_candidatesA

Find redacted candidate secrets in DEX strings with exact pool indices and fingerprints.

Uses native DEX string pools without Java/JADX. Values are redacted unless include_values=true. Candidate validity and instruction use sites remain untested. Strings over 64K UTF-16 units are skipped explicitly; per-pattern/string matches cap at 20, total strings at 2M. Assets, native code, runtime values and arbitrary encodings are outside this scan.

NameRequiredDescriptionDefault
limitNoRedacted candidate page size, server-capped
offsetNoZero-based candidate offset in DEX/string/pattern order
patternNoFixed candidate pattern family, not arbitrary regexall
session_idYesOpen immutable DEX or artifact session ID
include_valuesNoExplicit opt-in to return sensitive matched candidate values
max_scan_bytesNoCumulative decoded UTF-8 string-pool byte budget

Output Schema

NameRequiredDescription
codeNo
itemsNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
messageNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
pattern_versionNo
scanned_stringsNo
values_includedNo
selected_modulesNo
coverage_completeNo
scanned_utf8_bytesNo
credential_validityNo
instruction_use_sitesNo
skipped_oversize_stringsNo
capped_pattern_string_pairsNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the thin annotations by disclosing the default redaction posture, the include_values opt-in, hard caps (20 matches per pattern/string, 2M strings), the explicit 64K UTF-16 skip, and the byte budget. It also flags the key caveat that findings are unvalidated candidates, which an agent needs to avoid over-reporting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first sentence, then layers caveats and caps. Dense but every sentence carries information; the mid-sentence line breaks are cosmetic noise rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters, an output schema present, and full schema coverage, the description supplies the behavioral context the schema cannot (redaction, caps, exclusions). It omits only that an immutable DEX/artifact session must already be open, which the session_id field description covers instead.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning on top: it explains the redaction default tied to include_values, the capped match volume that governs limit/offset semantics, and the skip threshold relevant to max_scan_bytes. It doesn't elaborate on pattern-family ordering used by offset.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ("Find redacted candidate secrets in DEX strings") plus the distinguishing output ("exact pool indices and fingerprints"). No sibling tool scans for secrets, so an agent can route here unambiguously, and the mention of native DEX string pools separates it from the source/ref-oriented siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly delimits scope by exclusion: assets, native code, runtime values and arbitrary encodings are "outside this scan," and it warns that candidate validity and instruction use sites "remain untested," implying a follow-up tool is needed. It does not name the sibling to use for those follow-ups (e.g. asc_get_class_source / asc_find_refs), so routing beyond this tool is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_signing_inventoryA
Read-only

Inventory v1/v2/v3 containers and certificate fingerprints; detect v3.1 block presence.

Container presence is independent of cryptographic validity. APK digests, signatures, trust, rotation lineage and v4 sidecars remain unverified. Malformed containers produce explicit diagnostics. v1 certificates are a PKCS7 bag, not resolved signer identities.

NameRequiredDescriptionDefault
apk_pathYesAPK path within configured allowed roots

Output Schema

NameRequiredDescription
codeNo
limitNo
totalNo
moduleNo
offsetNo
statusYes
backendNo
messageNo
schemesNo
sourcesNo
apk_pathNo
coverageNo
has_moreNo
input_idNo
truncatedNo
apk_sha256No
session_idNo
v4_sidecarNo
diagnosticsNo
limitationsNo
next_offsetNo
artifact_pathNo
artifact_sha256No
backend_versionNo
selected_modulesNo
certificate_trustNo
apk_content_integrityNo
unknown_signing_block_idsNo
cryptographic_verificationNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/destructive annotations, the description discloses substantive behavioral traits: presence is independent of cryptographic validity, digests and v4 sidecars stay unverified, malformed containers yield explicit diagnostics, and v1 certificates are a raw PKCS7 bag rather than resolved signer identities. These caveats directly shape how an agent should interpret results and are not derivable from the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The capability statement is front-loaded in the first sentence, followed by a compact list of limitations, with no filler. The caveat block is dense and slightly fragmented across line breaks, but every clause carries distinct informational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details are not required, and the description covers scope, limitations, and malformed-input behavior. It could go slightly further on error conditions for unreadable paths, but for a one-parameter read-only inventory tool it is essentially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single apk_path parameter is fully documented in the schema (100% coverage, including the allowed-roots constraint). The description adds no additional semantics about the path argument, so the schema does the work and the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource: inventory v1/v2/v3 containers, certificate fingerprints, and v3.1 block presence. That is clearly distinguishable from siblings like asc_apk_info and asc_inspect_artifact, which cover broader artifact metadata, even though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second paragraph effectively scopes the tool by stating what it does NOT do — no digest, signature, trust, or rotation-lineage verification — which implicitly routes verification work elsewhere. It stops short of naming an alternative tool or an explicit 'use this when' condition, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 17 tool updatesv0.2.5
    • Changedasc_analyze_dex27 fields changed
      • changedInput schema / properties / type_descriptor / description
        Previous value: -"Exact DEX type including array dimensions, for find_type_refs"New value: +"DEX type including array dimensions; operand scope also accepts dotted names or literal substrings"
      • addedInput schema / properties / type_match
        Added value: +{
        +  "default": "exact",
        +  "description": "Case-sensitive type matching; substring requires type_relation=operand",
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • changedInput schema / properties / type_relation / description
        Previous value: -"Static type relation filter applied before pagination"New value: +"operand selects explicit type operands without an index; instruction includes member types and catches"
      • changedInput schema / properties / type_relation / enum
        Previous value: -[
        -  "all",
        -  "instruction",
        -  "declaration",
        -  "annotation"
        -]New value: +[
        +  "all",
        +  "instruction",
        +  "declaration",
        +  "annotation",
        +  "operand"
        +]
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReferenceGroup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "caller": {
        +      "title": "Caller",
        +      "type": "string"
        +    },
        +    "dex_entry": {
        +      "title": "Dex Entry",
        +      "type": "string"
        +    },
        +    "evidence": {
        +      "items": {
        +        "$ref": "#/$defs/DexRow"
        +      },
        +      "title": "Evidence",
        +      "type": "array"
        +    },
        +    "matches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Matches",
        +      "type": "array"
        +    },
        +    "offset_unit": {
        +      "title": "Offset Unit",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "target_field": {
        +      "enum": [
        +        "callee",
        +        "field_descriptor",
        +        "value",
        +        "type_descriptor"
        +      ],
        +      "title": "Target Field",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "dex_entry",
        +    "caller",
        +    "target_field",
        +    "matches",
        +    "evidence"
        +  ],
        +  "title": "ReferenceGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / groups
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ReferenceGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit_unit
        Added value: +{
        +  "const": "caller_groups",
        +  "title": "Limit Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "title": "Next Cursor",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / page_limited_by / const
        Removed value: -"response_bytes"
      • addedOutput schema / properties / page_limited_by / enum
        Added value: +[
        +  "response_bytes",
        +  "caller_groups"
        +]
      • addedOutput schema / properties / reference_format
        Added value: +{
        +  "const": "grouped",
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned_sites
        Added value: +{
        +  "title": "Returned Sites",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_unit
        Added value: +{
        +  "const": "reference_sites",
        +  "title": "Total Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_match
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_relation
        Added value: +{
        +  "title": "Type Relation",
        +  "type": "string"
        +}
    • Changedasc_close_dex_session23 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReferenceGroup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "caller": {
        +      "title": "Caller",
        +      "type": "string"
        +    },
        +    "dex_entry": {
        +      "title": "Dex Entry",
        +      "type": "string"
        +    },
        +    "evidence": {
        +      "items": {
        +        "$ref": "#/$defs/DexRow"
        +      },
        +      "title": "Evidence",
        +      "type": "array"
        +    },
        +    "matches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Matches",
        +      "type": "array"
        +    },
        +    "offset_unit": {
        +      "title": "Offset Unit",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "target_field": {
        +      "enum": [
        +        "callee",
        +        "field_descriptor",
        +        "value",
        +        "type_descriptor"
        +      ],
        +      "title": "Target Field",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "dex_entry",
        +    "caller",
        +    "target_field",
        +    "matches",
        +    "evidence"
        +  ],
        +  "title": "ReferenceGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / groups
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ReferenceGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit_unit
        Added value: +{
        +  "const": "caller_groups",
        +  "title": "Limit Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "title": "Next Cursor",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / page_limited_by / const
        Removed value: -"response_bytes"
      • addedOutput schema / properties / page_limited_by / enum
        Added value: +[
        +  "response_bytes",
        +  "caller_groups"
        +]
      • addedOutput schema / properties / reference_format
        Added value: +{
        +  "const": "grouped",
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned_sites
        Added value: +{
        +  "title": "Returned Sites",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_unit
        Added value: +{
        +  "const": "reference_sites",
        +  "title": "Total Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_match
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_relation
        Added value: +{
        +  "title": "Type Relation",
        +  "type": "string"
        +}
    • Changedasc_diff_dex_sessions11 fields changed
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_find_refs12 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_get_class_source12 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_get_manifest12 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_inspect_artifact18 fields changed
      • changedInput schema / properties / module / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / module / description
        Previous value: -"Exact AAB module; omitted selects base, other formats omit"New value: +"AAB exact module, 1-100 distinct names, or * for all; omitted selects base"
      • addedOutput schema / $defs / ArtifactSummary / properties / manifests
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ManifestHeader"
        +  },
        +  "title": "Manifests",
        +  "type": "array"
        +}
      • changedOutput schema / $defs / ArtifactSummary / properties / native_scope / enum
        Previous value: -[
        -  "archive",
        -  "selected_module"
        -]New value: +[
        +  "archive",
        +  "selected_module",
        +  "selected_modules"
        +]
      • changedOutput schema / $defs / ArtifactSummary / required
        Previous value: -[
        -  "entry_count",
        -  "native_scope",
        -  "native_library_count",
        -  "native_abis",
        -  "native_abi_count",
        -  "native_abis_truncated",
        -  "manifest"
        -]New value: +[
        +  "entry_count",
        +  "native_scope",
        +  "native_library_count",
        +  "native_abis",
        +  "native_abi_count",
        +  "native_abis_truncated"
        +]
      • addedOutput schema / $defs / Entry / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / ManifestHeader / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_list_apk_entries12 fields changed
      • addedOutput schema / $defs / Entry / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_list_classes12 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_manifest_summary12 fields changed
      • addedOutput schema / $defs / Entry / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_open_artifact_session25 fields changed
      • changedInput schema / properties / module / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / module / description
        Previous value: -"Exact AAB module; omitted selects base"New value: +"AAB exact module, 1-100 distinct names, or * for all; omitted selects base"
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReferenceGroup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "caller": {
        +      "title": "Caller",
        +      "type": "string"
        +    },
        +    "dex_entry": {
        +      "title": "Dex Entry",
        +      "type": "string"
        +    },
        +    "evidence": {
        +      "items": {
        +        "$ref": "#/$defs/DexRow"
        +      },
        +      "title": "Evidence",
        +      "type": "array"
        +    },
        +    "matches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Matches",
        +      "type": "array"
        +    },
        +    "offset_unit": {
        +      "title": "Offset Unit",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "target_field": {
        +      "enum": [
        +        "callee",
        +        "field_descriptor",
        +        "value",
        +        "type_descriptor"
        +      ],
        +      "title": "Target Field",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "dex_entry",
        +    "caller",
        +    "target_field",
        +    "matches",
        +    "evidence"
        +  ],
        +  "title": "ReferenceGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / groups
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ReferenceGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit_unit
        Added value: +{
        +  "const": "caller_groups",
        +  "title": "Limit Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "title": "Next Cursor",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / page_limited_by / const
        Removed value: -"response_bytes"
      • addedOutput schema / properties / page_limited_by / enum
        Added value: +[
        +  "response_bytes",
        +  "caller_groups"
        +]
      • addedOutput schema / properties / reference_format
        Added value: +{
        +  "const": "grouped",
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned_sites
        Added value: +{
        +  "title": "Returned Sites",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_unit
        Added value: +{
        +  "const": "reference_sites",
        +  "title": "Total Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_match
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_relation
        Added value: +{
        +  "title": "Type Relation",
        +  "type": "string"
        +}
    • Changedasc_open_dex_session23 fields changed
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReferenceGroup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "caller": {
        +      "title": "Caller",
        +      "type": "string"
        +    },
        +    "dex_entry": {
        +      "title": "Dex Entry",
        +      "type": "string"
        +    },
        +    "evidence": {
        +      "items": {
        +        "$ref": "#/$defs/DexRow"
        +      },
        +      "title": "Evidence",
        +      "type": "array"
        +    },
        +    "matches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Matches",
        +      "type": "array"
        +    },
        +    "offset_unit": {
        +      "title": "Offset Unit",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "target_field": {
        +      "enum": [
        +        "callee",
        +        "field_descriptor",
        +        "value",
        +        "type_descriptor"
        +      ],
        +      "title": "Target Field",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "dex_entry",
        +    "caller",
        +    "target_field",
        +    "matches",
        +    "evidence"
        +  ],
        +  "title": "ReferenceGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / groups
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ReferenceGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit_unit
        Added value: +{
        +  "const": "caller_groups",
        +  "title": "Limit Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "title": "Next Cursor",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / page_limited_by / const
        Removed value: -"response_bytes"
      • addedOutput schema / properties / page_limited_by / enum
        Added value: +[
        +  "response_bytes",
        +  "caller_groups"
        +]
      • addedOutput schema / properties / reference_format
        Added value: +{
        +  "const": "grouped",
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned_sites
        Added value: +{
        +  "title": "Returned Sites",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_unit
        Added value: +{
        +  "const": "reference_sites",
        +  "title": "Total Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_match
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_relation
        Added value: +{
        +  "title": "Type Relation",
        +  "type": "string"
        +}
    • Changedasc_ping11 fields changed
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_query_dex_session29 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 1024,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Grouped next_cursor for the same session/query; leave offset at zero",
        +  "title": "Cursor"
        +}
      • addedInput schema / properties / reference_format
        Added value: +{
        +  "default": "flat",
        +  "description": "Reference rows or caller groups with complete evidence; default flat",
        +  "enum": [
        +    "flat",
        +    "grouped"
        +  ],
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • changedInput schema / properties / type_descriptor / description
        Previous value: -"Exact DEX type including array dimensions, for find_type_refs"New value: +"DEX type including array dimensions; operand scope also accepts dotted names or literal substrings"
      • addedInput schema / properties / type_match
        Added value: +{
        +  "default": "exact",
        +  "description": "Case-sensitive type matching; substring requires type_relation=operand",
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • changedInput schema / properties / type_relation / description
        Previous value: -"Static type relation filter applied before pagination"New value: +"operand selects explicit type operands without an index; instruction includes member types and catches"
      • changedInput schema / properties / type_relation / enum
        Previous value: -[
        -  "all",
        -  "instruction",
        -  "declaration",
        -  "annotation"
        -]New value: +[
        +  "all",
        +  "instruction",
        +  "declaration",
        +  "annotation",
        +  "operand"
        +]
      • addedOutput schema / $defs / DexRow / properties / target_index
        Added value: +{
        +  "title": "Target Index",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReferenceGroup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "caller": {
        +      "title": "Caller",
        +      "type": "string"
        +    },
        +    "dex_entry": {
        +      "title": "Dex Entry",
        +      "type": "string"
        +    },
        +    "evidence": {
        +      "items": {
        +        "$ref": "#/$defs/DexRow"
        +      },
        +      "title": "Evidence",
        +      "type": "array"
        +    },
        +    "matches": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Matches",
        +      "type": "array"
        +    },
        +    "offset_unit": {
        +      "title": "Offset Unit",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "target_field": {
        +      "enum": [
        +        "callee",
        +        "field_descriptor",
        +        "value",
        +        "type_descriptor"
        +      ],
        +      "title": "Target Field",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "dex_entry",
        +    "caller",
        +    "target_field",
        +    "matches",
        +    "evidence"
        +  ],
        +  "title": "ReferenceGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / groups
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/ReferenceGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit_unit
        Added value: +{
        +  "const": "caller_groups",
        +  "title": "Limit Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "title": "Next Cursor",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / page_limited_by / const
        Removed value: -"response_bytes"
      • addedOutput schema / properties / page_limited_by / enum
        Added value: +[
        +  "response_bytes",
        +  "caller_groups"
        +]
      • addedOutput schema / properties / reference_format
        Added value: +{
        +  "const": "grouped",
        +  "title": "Reference Format",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned_sites
        Added value: +{
        +  "title": "Returned Sites",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
      • addedOutput schema / properties / total_unit
        Added value: +{
        +  "const": "reference_sites",
        +  "title": "Total Unit",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_match
        Added value: +{
        +  "enum": [
        +    "exact",
        +    "substring"
        +  ],
        +  "title": "Type Match",
        +  "type": "string"
        +}
      • addedOutput schema / properties / type_relation
        Added value: +{
        +  "title": "Type Relation",
        +  "type": "string"
        +}
    • Changedasc_read_apk_entry12 fields changed
      • addedOutput schema / $defs / Entry / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_secret_candidates11 fields changed
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
    • Changedasc_signing_inventory11 fields changed
      • addedOutput schema / $defs / Source / properties / container_sha256
        Added value: +{
        +  "title": "Container Sha256",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / container_size_bytes
        Added value: +{
        +  "title": "Container Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_header_offset
        Added value: +{
        +  "title": "Logical Header Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / logical_size_bytes
        Added value: +{
        +  "title": "Logical Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Source / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / normalization
        Added value: +{
        +  "title": "Normalization",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / original_dex_version
        Added value: +{
        +  "title": "Original Dex Version",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / snapshot_entry
        Added value: +{
        +  "title": "Snapshot Entry",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Source / properties / stored_size_bytes
        Added value: +{
        +  "title": "Stored Size Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / module
        Added value: +{
        +  "title": "Module",
        +  "type": "string"
        +}
      • addedOutput schema / properties / selected_modules
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Selected Modules",
        +  "type": "array"
        +}
  2. 17 tool updatesv0.2.4
    • Changedasc_analyze_dex19 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / without_code / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / without_code / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • addedOutput schema / $defs / QueryCache / properties / budget_bytes
        Added value: +{
        +  "title": "Budget Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / QueryCache / properties / stored_bytes
        Added value: +{
        +  "title": "Stored Bytes",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / page_limited_by
        Added value: +{
        +  "const": "response_bytes",
        +  "title": "Page Limited By",
        +  "type": "string"
        +}
      • addedOutput schema / properties / response_byte_limit
        Added value: +{
        +  "title": "Response Byte Limit",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / superclass / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / superclass / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_close_dex_session18 fields changed
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / without_code / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / without_code / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • addedOutput schema / $defs / QueryCache / properties / budget_bytes
        Added value: +{
        +  "title": "Budget Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / QueryCache / properties / stored_bytes
        Added value: +{
        +  "title": "Stored Bytes",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / page_limited_by
        Added value: +{
        +  "const": "response_bytes",
        +  "title": "Page Limited By",
        +  "type": "string"
        +}
      • addedOutput schema / properties / response_byte_limit
        Added value: +{
        +  "title": "Response Byte Limit",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / superclass / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / superclass / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_diff_dex_sessions6 fields changed
      • removedOutput schema / $defs / DiffRow / properties / new_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DiffRow / properties / new_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DiffRow / properties / old_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DiffRow / properties / old_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_find_refs9 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_get_class_source9 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_get_manifest9 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_inspect_artifact11 fields changed
      • addedInput schema / properties / include_summary
        Added value: +{
        +  "default": false,
        +  "description": "Include compact manifest header, entry count and native ABI inventory",
        +  "title": "Include Summary",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / max_uncompressed_bytes / description
        Previous value: -"Nested classes.jar byte budget; server input limit also applies"New value: +"Nested JAR and optional manifest byte budget; input limit applies"
      • addedOutput schema / $defs / ArtifactSummary
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "entry_count": {
        +      "title": "Entry Count",
        +      "type": "integer"
        +    },
        +    "manifest": {
        +      "$ref": "#/$defs/ManifestHeader"
        +    },
        +    "native_abi_count": {
        +      "title": "Native Abi Count",
        +      "type": "integer"
        +    },
        +    "native_abis": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Native Abis",
        +      "type": "array"
        +    },
        +    "native_abis_truncated": {
        +      "title": "Native Abis Truncated",
        +      "type": "boolean"
        +    },
        +    "native_library_count": {
        +      "title": "Native Library Count",
        +      "type": "integer"
        +    },
        +    "native_scope": {
        +      "enum": [
        +        "archive",
        +        "selected_module"
        +      ],
        +      "title": "Native Scope",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "entry_count",
        +    "native_scope",
        +    "native_library_count",
        +    "native_abis",
        +    "native_abi_count",
        +    "native_abis_truncated",
        +    "manifest"
        +  ],
        +  "title": "ArtifactSummary",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / Entry / properties / abi / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Entry / properties / abi / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / $defs / ManifestHeader
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "application_name": {
        +      "title": "Application Name",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "code": {
        +      "title": "Code",
        +      "type": "string"
        +    },
        +    "decoding_warnings": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Decoding Warnings",
        +      "type": "array"
        +    },
        +    "entry": {
        +      "title": "Entry",
        +      "type": "string"
        +    },
        +    "message": {
        +      "title": "Message",
        +      "type": "string"
        +    },
        +    "min_sdk": {
        +      "title": "Min Sdk",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "package_name": {
        +      "title": "Package Name",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "resource_values_resolved": {
        +      "const": false,
        +      "title": "Resource Values Resolved",
        +      "type": "boolean"
        +    },
        +    "status": {
        +      "enum": [
        +        "ok",
        +        "error",
        +        "not_applicable"
        +      ],
        +      "title": "Status",
        +      "type": "string"
        +    },
        +    "target_sdk": {
        +      "title": "Target Sdk",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "version_code": {
        +      "title": "Version Code",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "version_name": {
        +      "title": "Version Name",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "xml_format": {
        +      "enum": [
        +        "text_xml",
        +        "android_binary_xml"
        +      ],
        +      "title": "Xml Format",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "entry"
        +  ],
        +  "title": "ManifestHeader",
        +  "type": "object"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / properties / selected_module / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / selected_module / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / summary
        Added value: +{
        +  "$ref": "#/$defs/ArtifactSummary"
        +}
    • Changedasc_list_apk_entries8 fields changed
      • changedInput schema / properties / apk_path / description
        Previous value: -"APK path within the configured allowed roots"New value: +"Archive or standalone DEX path within allowed roots"
      • removedOutput schema / $defs / Entry / properties / abi / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Entry / properties / abi / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / format_validation
        Added value: +{
        +  "const": "not_performed",
        +  "title": "Format Validation",
        +  "type": "string"
        +}
      • removedOutput schema / properties / next_byte_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_byte_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_list_classes9 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_manifest_summary18 fields changed
      • removedOutput schema / $defs / Component / properties / effective_enabled / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Component / properties / effective_enabled / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / $defs / Component / properties / enabled / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Component / properties / enabled / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / $defs / Component / properties / exported / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Component / properties / exported / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / $defs / Component / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Component / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / Component / properties / target_activity / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Component / properties / target_activity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / Entry / properties / abi / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Entry / properties / abi / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / Permission / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Permission / properties / value / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / properties / package_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / package_name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_open_artifact_session18 fields changed
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / without_code / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / without_code / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • addedOutput schema / $defs / QueryCache / properties / budget_bytes
        Added value: +{
        +  "title": "Budget Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / QueryCache / properties / stored_bytes
        Added value: +{
        +  "title": "Stored Bytes",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / page_limited_by
        Added value: +{
        +  "const": "response_bytes",
        +  "title": "Page Limited By",
        +  "type": "string"
        +}
      • addedOutput schema / properties / response_byte_limit
        Added value: +{
        +  "title": "Response Byte Limit",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / superclass / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / superclass / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_open_dex_session18 fields changed
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / without_code / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / without_code / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • addedOutput schema / $defs / QueryCache / properties / budget_bytes
        Added value: +{
        +  "title": "Budget Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / QueryCache / properties / stored_bytes
        Added value: +{
        +  "title": "Stored Bytes",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / page_limited_by
        Added value: +{
        +  "const": "response_bytes",
        +  "title": "Page Limited By",
        +  "type": "string"
        +}
      • addedOutput schema / properties / response_byte_limit
        Added value: +{
        +  "title": "Response Byte Limit",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / superclass / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / superclass / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_ping4 fields changed
      • addedOutput schema / $defs / Capabilities / properties / max_entry_bytes
        Added value: +{
        +  "title": "Max Entry Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / Capabilities / properties / selected_reference_cache
        Added value: +{
        +  "$ref": "#/$defs/Capabilities"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_query_dex_session19 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Positive result page size in rows or source lines, server-capped"New value: +"Maximum result page size in rows or source lines, server-capped"
      • removedOutput schema / $defs / DexRow / properties / instruction_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / instruction_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / offset_unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / offset_unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / DexRow / properties / target_dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / DexRow / properties / target_dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / dex_entry / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / dex_entry / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / $defs / GraphNode / properties / without_code / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / GraphNode / properties / without_code / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • addedOutput schema / $defs / QueryCache / properties / budget_bytes
        Added value: +{
        +  "title": "Budget Bytes",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / QueryCache / properties / stored_bytes
        Added value: +{
        +  "title": "Stored Bytes",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / page_limited_by
        Added value: +{
        +  "const": "response_bytes",
        +  "title": "Page Limited By",
        +  "type": "string"
        +}
      • addedOutput schema / properties / response_byte_limit
        Added value: +{
        +  "title": "Response Byte Limit",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / superclass / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / superclass / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedasc_read_apk_entry9 fields changed
      • changedInput schema / properties / apk_path / description
        Previous value: -"APK path within the configured allowed roots"New value: +"Archive or standalone DEX path within allowed roots"
      • changedInput schema / properties / entry_path / description
        Previous value: -"Exact relative ZIP entry path from inventory"New value: +"Exact entry path or standalone DEX basename from inventory"
      • removedOutput schema / $defs / Entry / properties / abi / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Entry / properties / abi / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / format_validation
        Added value: +{
        +  "const": "not_performed",
        +  "title": "Format Validation",
        +  "type": "string"
        +}
      • removedOutput schema / properties / next_byte_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_byte_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_secret_candidates2 fields changed
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
    • Changedasc_signing_inventory6 fields changed
      • removedOutput schema / $defs / Certificate / properties / public_key_bits / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / Certificate / properties / public_key_bits / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / $defs / SigningScheme / properties / container_present / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / $defs / SigningScheme / properties / container_present / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / properties / next_offset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_offset / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
  3. 18 tool updatesv0.2.3
    • Addedasc_analyze_dex
    • Changedasc_apk_info5 fields changed
      • addedInput schema / properties / apk_path / description
        Added value: +"APK file path within configured allowed roots"
      • addedInput schema / properties / include_sha256 / description
        Added value: +"Compute a full input SHA-256 when true"
      • addedOutput schema / properties
        Added value: +{
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "dex_entries": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Dex Entries",
        +    "type": "array"
        +  },
        +  "has_manifest": {
        +    "title": "Has Manifest",
        +    "type": "boolean"
        +  },
        +  "sha256": {
        +    "title": "Sha256",
        +    "type": "string"
        +  },
        +  "size_bytes": {
        +    "title": "Size Bytes",
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "apk_path",
        +  "size_bytes",
        +  "dex_entries",
        +  "has_manifest"
        +]
      • changedOutput schema / title
        Previous value: -"asc_apk_infoDictOutput"New value: +"ApkInfoResult"
    • Addedasc_close_dex_session
    • Addedasc_diff_dex_sessions
    • Changedasc_find_refs13 fields changed
      • addedInput schema / properties / apk_path / description
        Added value: +"APK file path within configured allowed roots"
      • addedInput schema / properties / backend
        Added value: +{
        +  "default": "droidasc",
        +  "description": "Engine; rust_asc is opt-in and reports unverified coverage",
        +  "enum": [
        +    "droidasc",
        +    "rust_asc"
        +  ],
        +  "title": "Backend",
        +  "type": "string"
        +}
      • addedInput schema / properties / class_name / description
        Added value: +"Exact owner class; for legacy fuzzy references, a literal owner substring"
      • addedInput schema / properties / fuzzy_class / description
        Added value: +"Legacy owner substring matching; exact member tools require false"
      • addedInput schema / properties / kind / description
        Added value: +"Reference category; search_members accepts method or field only"
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "string",
        -  "type",
        -  "method",
        -  "field"
        -]New value: +[
        +  "string",
        +  "type",
        +  "method",
        +  "field",
        +  "extends",
        +  "impl"
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Positive result page size in rows or source lines, server-capped"
      • addedInput schema / properties / offset / description
        Added value: +"Zero-based result offset; graph traversal requires zero"
      • addedInput schema / properties / threads / description
        Added value: +"Positive ASC worker count; requested values above 32 are capped"
      • addedInput schema / properties / value / description
        Added value: +"Literal value (classes: Dalvik or dotted); exact extends/impl parent"
      • addedOutput schema / $defs
        Added value: +{
        +  "DexRow": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "access": {
        +        "enum": [
        +          "read",
        +          "write"
        +        ],
        +        "title": "Access",
        +        "type": "string"
        +      },
        +      "access_flags": {
        +        "title": "Access Flags",
        +        "type": "integer"
        +      },
        +      "call_site_prototype": {
        +        "title": "Call Site Prototype",
        +        "type": "string"
        +      },
        +      "callee": {
        +        "title": "Callee",
        +        "type": "string"
        +      },
        +      "caller": {
        +        "title": "Caller",
        +        "type": "string"
        +      },
        +      "class_name": {
        +        "title": "Class Name",
        +        "type": "string"
        +      },
        +      "descriptor": {
        +        "title": "Descriptor",
        +        "type": "string"
        +      },
        +      "detail": {
        +        "title": "Detail",
        +        "type": "string"
        +      },
        +      "dex": {
        +        "title": "Dex",
        +        "type": "string"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dispatch_kind": {
        +        "title": "Dispatch Kind",
        +        "type": "string"
        +      },
        +      "field_descriptor": {
        +        "title": "Field Descriptor",
        +        "type": "string"
        +      },
        +      "has_code": {
        +        "title": "Has Code",
        +        "type": "boolean"
        +      },
        +      "instruction": {
        +        "title": "Instruction",
        +        "type": "string"
        +      },
        +      "instruction_offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Instruction Offset"
        +      },
        +      "kind": {
        +        "title": "Kind",
        +        "type": "string"
        +      },
        +      "matched": {
        +        "title": "Matched",
        +        "type": "string"
        +      },
        +      "method": {
        +        "title": "Method",
        +        "type": "string"
        +      },
        +      "method_descriptor": {
        +        "title": "Method Descriptor",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "offset_unit": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Offset Unit"
        +      },
        +      "opcode": {
        +        "title": "Opcode",
        +        "type": "string"
        +      },
        +      "parameter_types": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Parameter Types",
        +        "type": "array"
        +      },
        +      "raw": {
        +        "title": "Raw",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "title": "Reason",
        +        "type": "string"
        +      },
        +      "relation": {
        +        "title": "Relation",
        +        "type": "string"
        +      },
        +      "return_type": {
        +        "title": "Return Type",
        +        "type": "string"
        +      },
        +      "source": {
        +        "title": "Source",
        +        "type": "string"
        +      },
        +      "storage": {
        +        "enum": [
        +          "static",
        +          "instance"
        +        ],
        +        "title": "Storage",
        +        "type": "string"
        +      },
        +      "string": {
        +        "title": "String",
        +        "type": "string"
        +      },
        +      "string_index": {
        +        "title": "String Index",
        +        "type": "integer"
        +      },
        +      "target": {
        +        "title": "Target",
        +        "type": "string"
        +      },
        +      "target_dex_entry": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Target Dex Entry"
        +      },
        +      "target_resolution": {
        +        "title": "Target Resolution",
        +        "type": "string"
        +      },
        +      "type_descriptor": {
        +        "title": "Type Descriptor",
        +        "type": "string"
        +      },
        +      "value": {
        +        "title": "Value",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DexRow",
        +    "type": "object"
        +  },
        +  "Source": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "container_entry": {
        +        "title": "Container Entry",
        +        "type": "string"
        +      },
        +      "declared_class_count": {
        +        "title": "Declared Class Count",
        +        "type": "integer"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dex_version": {
        +        "title": "Dex Version",
        +        "type": "string"
        +      },
        +      "path": {
        +        "title": "Path",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "title": "Sha256",
        +        "type": "string"
        +      },
        +      "size_bytes": {
        +        "title": "Size Bytes",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Source",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "apk_sha256": {
        +    "title": "Apk Sha256",
        +    "type": "string"
        +  },
        +  "artifact_path": {
        +    "title": "Artifact Path",
        +    "type": "string"
        +  },
        +  "artifact_sha256": {
        +    "title": "Artifact Sha256",
        +    "type": "string"
        +  },
        +  "backend": {
        +    "title": "Backend",
        +    "type": "string"
        +  },
        +  "backend_version": {
        +    "title": "Backend Version",
        +    "type": "string"
        +  },
        +  "class_name": {
        +    "title": "Class Name",
        +    "type": "string"
        +  },
        +  "code": {
        +    "title": "Code",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "title": "Coverage",
        +    "type": "string"
        +  },
        +  "has_more": {
        +    "title": "Has More",
        +    "type": "boolean"
        +  },
        +  "input_id": {
        +    "title": "Input Id",
        +    "type": "string"
        +  },
        +  "items": {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "$ref": "#/$defs/DexRow"
        +        }
        +      ]
        +    },
        +    "title": "Items",
        +    "type": "array"
        +  },
        +  "kind": {
        +    "title": "Kind",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "title": "Limit",
        +    "type": "integer"
        +  },
        +  "limitations": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Limitations",
        +    "type": "array"
        +  },
        +  "message": {
        +    "title": "Message",
        +    "type": "string"
        +  },
        +  "next_offset": {
        +    "anyOf": [
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "title": "Next Offset"
        +  },
        +  "offset": {
        +    "title": "Offset",
        +    "type": "integer"
        +  },
        +  "session_id": {
        +    "title": "Session Id",
        +    "type": "string"
        +  },
        +  "source": {
        +    "title": "Source",
        +    "type": "string"
        +  },
        +  "sources": {
        +    "items": {
        +      "$ref": "#/$defs/Source"
        +    },
        +    "title": "Sources",
        +    "type": "array"
        +  },
        +  "status": {
        +    "enum": [
        +      "ok",
        +      "partial",
        +      "error",
        +      "not_applicable"
        +    ],
        +    "title": "Status",
        +    "type": "string"
        +  },
        +  "total": {
        +    "title": "Total",
        +    "type": "integer"
        +  },
        +  "truncated": {
        +    "title": "Truncated",
        +    "type": "boolean"
        +  },
        +  "xml": {
        +    "title": "Xml",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / title
        Previous value: -"asc_find_refsDictOutput"New value: +"LegacyResult"
    • Changedasc_get_class_source9 fields changed
      • addedInput schema / properties / apk_path / description
        Added value: +"APK file path within configured allowed roots"
      • addedInput schema / properties / backend
        Added value: +{
        +  "default": "droidasc",
        +  "description": "Engine; rust_asc is opt-in and reports unverified coverage",
        +  "enum": [
        +    "droidasc",
        +    "rust_asc"
        +  ],
        +  "title": "Backend",
        +  "type": "string"
        +}
      • addedInput schema / properties / class_name / description
        Added value: +"Exact class descriptor or Java dotted class name"
      • addedInput schema / properties / limit / description
        Added value: +"Positive result page size in rows or source lines, server-capped"
      • addedInput schema / properties / offset / description
        Added value: +"Zero-based result offset; graph traversal requires zero"
      • addedInput schema / properties / threads / description
        Added value: +"Positive ASC worker count; requested values above 32 are capped"
      • addedOutput schema / $defs
        Added value: +{
        +  "DexRow": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "access": {
        +        "enum": [
        +          "read",
        +          "write"
        +        ],
        +        "title": "Access",
        +        "type": "string"
        +      },
        +      "access_flags": {
        +        "title": "Access Flags",
        +        "type": "integer"
        +      },
        +      "call_site_prototype": {
        +        "title": "Call Site Prototype",
        +        "type": "string"
        +      },
        +      "callee": {
        +        "title": "Callee",
        +        "type": "string"
        +      },
        +      "caller": {
        +        "title": "Caller",
        +        "type": "string"
        +      },
        +      "class_name": {
        +        "title": "Class Name",
        +        "type": "string"
        +      },
        +      "descriptor": {
        +        "title": "Descriptor",
        +        "type": "string"
        +      },
        +      "detail": {
        +        "title": "Detail",
        +        "type": "string"
        +      },
        +      "dex": {
        +        "title": "Dex",
        +        "type": "string"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dispatch_kind": {
        +        "title": "Dispatch Kind",
        +        "type": "string"
        +      },
        +      "field_descriptor": {
        +        "title": "Field Descriptor",
        +        "type": "string"
        +      },
        +      "has_code": {
        +        "title": "Has Code",
        +        "type": "boolean"
        +      },
        +      "instruction": {
        +        "title": "Instruction",
        +        "type": "string"
        +      },
        +      "instruction_offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Instruction Offset"
        +      },
        +      "kind": {
        +        "title": "Kind",
        +        "type": "string"
        +      },
        +      "matched": {
        +        "title": "Matched",
        +        "type": "string"
        +      },
        +      "method": {
        +        "title": "Method",
        +        "type": "string"
        +      },
        +      "method_descriptor": {
        +        "title": "Method Descriptor",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "offset_unit": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Offset Unit"
        +      },
        +      "opcode": {
        +        "title": "Opcode",
        +        "type": "string"
        +      },
        +      "parameter_types": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Parameter Types",
        +        "type": "array"
        +      },
        +      "raw": {
        +        "title": "Raw",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "title": "Reason",
        +        "type": "string"
        +      },
        +      "relation": {
        +        "title": "Relation",
        +        "type": "string"
        +      },
        +      "return_type": {
        +        "title": "Return Type",
        +        "type": "string"
        +      },
        +      "source": {
        +        "title": "Source",
        +        "type": "string"
        +      },
        +      "storage": {
        +        "enum": [
        +          "static",
        +          "instance"
        +        ],
        +        "title": "Storage",
        +        "type": "string"
        +      },
        +      "string": {
        +        "title": "String",
        +        "type": "string"
        +      },
        +      "string_index": {
        +        "title": "String Index",
        +        "type": "integer"
        +      },
        +      "target": {
        +        "title": "Target",
        +        "type": "string"
        +      },
        +      "target_dex_entry": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Target Dex Entry"
        +      },
        +      "target_resolution": {
        +        "title": "Target Resolution",
        +        "type": "string"
        +      },
        +      "type_descriptor": {
        +        "title": "Type Descriptor",
        +        "type": "string"
        +      },
        +      "value": {
        +        "title": "Value",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DexRow",
        +    "type": "object"
        +  },
        +  "Source": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "container_entry": {
        +        "title": "Container Entry",
        +        "type": "string"
        +      },
        +      "declared_class_count": {
        +        "title": "Declared Class Count",
        +        "type": "integer"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dex_version": {
        +        "title": "Dex Version",
        +        "type": "string"
        +      },
        +      "path": {
        +        "title": "Path",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "title": "Sha256",
        +        "type": "string"
        +      },
        +      "size_bytes": {
        +        "title": "Size Bytes",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Source",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "apk_sha256": {
        +    "title": "Apk Sha256",
        +    "type": "string"
        +  },
        +  "artifact_path": {
        +    "title": "Artifact Path",
        +    "type": "string"
        +  },
        +  "artifact_sha256": {
        +    "title": "Artifact Sha256",
        +    "type": "string"
        +  },
        +  "backend": {
        +    "title": "Backend",
        +    "type": "string"
        +  },
        +  "backend_version": {
        +    "title": "Backend Version",
        +    "type": "string"
        +  },
        +  "class_name": {
        +    "title": "Class Name",
        +    "type": "string"
        +  },
        +  "code": {
        +    "title": "Code",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "title": "Coverage",
        +    "type": "string"
        +  },
        +  "has_more": {
        +    "title": "Has More",
        +    "type": "boolean"
        +  },
        +  "input_id": {
        +    "title": "Input Id",
        +    "type": "string"
        +  },
        +  "items": {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "$ref": "#/$defs/DexRow"
        +        }
        +      ]
        +    },
        +    "title": "Items",
        +    "type": "array"
        +  },
        +  "kind": {
        +    "title": "Kind",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "title": "Limit",
        +    "type": "integer"
        +  },
        +  "limitations": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Limitations",
        +    "type": "array"
        +  },
        +  "message": {
        +    "title": "Message",
        +    "type": "string"
        +  },
        +  "next_offset": {
        +    "anyOf": [
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "title": "Next Offset"
        +  },
        +  "offset": {
        +    "title": "Offset",
        +    "type": "integer"
        +  },
        +  "session_id": {
        +    "title": "Session Id",
        +    "type": "string"
        +  },
        +  "source": {
        +    "title": "Source",
        +    "type": "string"
        +  },
        +  "sources": {
        +    "items": {
        +      "$ref": "#/$defs/Source"
        +    },
        +    "title": "Sources",
        +    "type": "array"
        +  },
        +  "status": {
        +    "enum": [
        +      "ok",
        +      "partial",
        +      "error",
        +      "not_applicable"
        +    ],
        +    "title": "Status",
        +    "type": "string"
        +  },
        +  "total": {
        +    "title": "Total",
        +    "type": "integer"
        +  },
        +  "truncated": {
        +    "title": "Truncated",
        +    "type": "boolean"
        +  },
        +  "xml": {
        +    "title": "Xml",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / title
        Previous value: -"asc_get_class_sourceDictOutput"New value: +"LegacyResult"
    • Changedasc_get_manifest7 fields changed
      • addedInput schema / properties / apk_path / description
        Added value: +"APK file path within configured allowed roots"
      • addedInput schema / properties / backend
        Added value: +{
        +  "default": "droidasc",
        +  "description": "Engine; rust_asc is opt-in and reports unverified coverage",
        +  "enum": [
        +    "droidasc",
        +    "rust_asc"
        +  ],
        +  "title": "Backend",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit / description
        Added value: +"Positive result page size in rows or source lines, server-capped"
      • addedInput schema / properties / offset / description
        Added value: +"Zero-based result offset; graph traversal requires zero"
      • addedOutput schema / $defs
        Added value: +{
        +  "DexRow": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "access": {
        +        "enum": [
        +          "read",
        +          "write"
        +        ],
        +        "title": "Access",
        +        "type": "string"
        +      },
        +      "access_flags": {
        +        "title": "Access Flags",
        +        "type": "integer"
        +      },
        +      "call_site_prototype": {
        +        "title": "Call Site Prototype",
        +        "type": "string"
        +      },
        +      "callee": {
        +        "title": "Callee",
        +        "type": "string"
        +      },
        +      "caller": {
        +        "title": "Caller",
        +        "type": "string"
        +      },
        +      "class_name": {
        +        "title": "Class Name",
        +        "type": "string"
        +      },
        +      "descriptor": {
        +        "title": "Descriptor",
        +        "type": "string"
        +      },
        +      "detail": {
        +        "title": "Detail",
        +        "type": "string"
        +      },
        +      "dex": {
        +        "title": "Dex",
        +        "type": "string"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dispatch_kind": {
        +        "title": "Dispatch Kind",
        +        "type": "string"
        +      },
        +      "field_descriptor": {
        +        "title": "Field Descriptor",
        +        "type": "string"
        +      },
        +      "has_code": {
        +        "title": "Has Code",
        +        "type": "boolean"
        +      },
        +      "instruction": {
        +        "title": "Instruction",
        +        "type": "string"
        +      },
        +      "instruction_offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Instruction Offset"
        +      },
        +      "kind": {
        +        "title": "Kind",
        +        "type": "string"
        +      },
        +      "matched": {
        +        "title": "Matched",
        +        "type": "string"
        +      },
        +      "method": {
        +        "title": "Method",
        +        "type": "string"
        +      },
        +      "method_descriptor": {
        +        "title": "Method Descriptor",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "offset_unit": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Offset Unit"
        +      },
        +      "opcode": {
        +        "title": "Opcode",
        +        "type": "string"
        +      },
        +      "parameter_types": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Parameter Types",
        +        "type": "array"
        +      },
        +      "raw": {
        +        "title": "Raw",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "title": "Reason",
        +        "type": "string"
        +      },
        +      "relation": {
        +        "title": "Relation",
        +        "type": "string"
        +      },
        +      "return_type": {
        +        "title": "Return Type",
        +        "type": "string"
        +      },
        +      "source": {
        +        "title": "Source",
        +        "type": "string"
        +      },
        +      "storage": {
        +        "enum": [
        +          "static",
        +          "instance"
        +        ],
        +        "title": "Storage",
        +        "type": "string"
        +      },
        +      "string": {
        +        "title": "String",
        +        "type": "string"
        +      },
        +      "string_index": {
        +        "title": "String Index",
        +        "type": "integer"
        +      },
        +      "target": {
        +        "title": "Target",
        +        "type": "string"
        +      },
        +      "target_dex_entry": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Target Dex Entry"
        +      },
        +      "target_resolution": {
        +        "title": "Target Resolution",
        +        "type": "string"
        +      },
        +      "type_descriptor": {
        +        "title": "Type Descriptor",
        +        "type": "string"
        +      },
        +      "value": {
        +        "title": "Value",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DexRow",
        +    "type": "object"
        +  },
        +  "Source": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "container_entry": {
        +        "title": "Container Entry",
        +        "type": "string"
        +      },
        +      "declared_class_count": {
        +        "title": "Declared Class Count",
        +        "type": "integer"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dex_version": {
        +        "title": "Dex Version",
        +        "type": "string"
        +      },
        +      "path": {
        +        "title": "Path",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "title": "Sha256",
        +        "type": "string"
        +      },
        +      "size_bytes": {
        +        "title": "Size Bytes",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Source",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "apk_sha256": {
        +    "title": "Apk Sha256",
        +    "type": "string"
        +  },
        +  "artifact_path": {
        +    "title": "Artifact Path",
        +    "type": "string"
        +  },
        +  "artifact_sha256": {
        +    "title": "Artifact Sha256",
        +    "type": "string"
        +  },
        +  "backend": {
        +    "title": "Backend",
        +    "type": "string"
        +  },
        +  "backend_version": {
        +    "title": "Backend Version",
        +    "type": "string"
        +  },
        +  "class_name": {
        +    "title": "Class Name",
        +    "type": "string"
        +  },
        +  "code": {
        +    "title": "Code",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "title": "Coverage",
        +    "type": "string"
        +  },
        +  "has_more": {
        +    "title": "Has More",
        +    "type": "boolean"
        +  },
        +  "input_id": {
        +    "title": "Input Id",
        +    "type": "string"
        +  },
        +  "items": {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "$ref": "#/$defs/DexRow"
        +        }
        +      ]
        +    },
        +    "title": "Items",
        +    "type": "array"
        +  },
        +  "kind": {
        +    "title": "Kind",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "title": "Limit",
        +    "type": "integer"
        +  },
        +  "limitations": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Limitations",
        +    "type": "array"
        +  },
        +  "message": {
        +    "title": "Message",
        +    "type": "string"
        +  },
        +  "next_offset": {
        +    "anyOf": [
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "title": "Next Offset"
        +  },
        +  "offset": {
        +    "title": "Offset",
        +    "type": "integer"
        +  },
        +  "session_id": {
        +    "title": "Session Id",
        +    "type": "string"
        +  },
        +  "source": {
        +    "title": "Source",
        +    "type": "string"
        +  },
        +  "sources": {
        +    "items": {
        +      "$ref": "#/$defs/Source"
        +    },
        +    "title": "Sources",
        +    "type": "array"
        +  },
        +  "status": {
        +    "enum": [
        +      "ok",
        +      "partial",
        +      "error",
        +      "not_applicable"
        +    ],
        +    "title": "Status",
        +    "type": "string"
        +  },
        +  "total": {
        +    "title": "Total",
        +    "type": "integer"
        +  },
        +  "truncated": {
        +    "title": "Truncated",
        +    "type": "boolean"
        +  },
        +  "xml": {
        +    "title": "Xml",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / title
        Previous value: -"asc_get_manifestDictOutput"New value: +"LegacyResult"
    • Addedasc_inspect_artifact
    • Addedasc_list_apk_entries
    • Changedasc_list_classes9 fields changed
      • addedInput schema / properties / apk_path / description
        Added value: +"APK file path within configured allowed roots"
      • addedInput schema / properties / backend
        Added value: +{
        +  "default": "droidasc",
        +  "description": "Engine; rust_asc is opt-in and reports unverified coverage",
        +  "enum": [
        +    "droidasc",
        +    "rust_asc"
        +  ],
        +  "title": "Backend",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit / description
        Added value: +"Positive result page size in rows or source lines, server-capped"
      • addedInput schema / properties / offset / description
        Added value: +"Zero-based result offset; graph traversal requires zero"
      • addedInput schema / properties / prefix / description
        Added value: +"Literal class/package prefix, case-sensitive"
      • addedInput schema / properties / threads / description
        Added value: +"Positive ASC worker count; requested values above 32 are capped"
      • addedOutput schema / $defs
        Added value: +{
        +  "DexRow": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "access": {
        +        "enum": [
        +          "read",
        +          "write"
        +        ],
        +        "title": "Access",
        +        "type": "string"
        +      },
        +      "access_flags": {
        +        "title": "Access Flags",
        +        "type": "integer"
        +      },
        +      "call_site_prototype": {
        +        "title": "Call Site Prototype",
        +        "type": "string"
        +      },
        +      "callee": {
        +        "title": "Callee",
        +        "type": "string"
        +      },
        +      "caller": {
        +        "title": "Caller",
        +        "type": "string"
        +      },
        +      "class_name": {
        +        "title": "Class Name",
        +        "type": "string"
        +      },
        +      "descriptor": {
        +        "title": "Descriptor",
        +        "type": "string"
        +      },
        +      "detail": {
        +        "title": "Detail",
        +        "type": "string"
        +      },
        +      "dex": {
        +        "title": "Dex",
        +        "type": "string"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dispatch_kind": {
        +        "title": "Dispatch Kind",
        +        "type": "string"
        +      },
        +      "field_descriptor": {
        +        "title": "Field Descriptor",
        +        "type": "string"
        +      },
        +      "has_code": {
        +        "title": "Has Code",
        +        "type": "boolean"
        +      },
        +      "instruction": {
        +        "title": "Instruction",
        +        "type": "string"
        +      },
        +      "instruction_offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Instruction Offset"
        +      },
        +      "kind": {
        +        "title": "Kind",
        +        "type": "string"
        +      },
        +      "matched": {
        +        "title": "Matched",
        +        "type": "string"
        +      },
        +      "method": {
        +        "title": "Method",
        +        "type": "string"
        +      },
        +      "method_descriptor": {
        +        "title": "Method Descriptor",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "offset_unit": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Offset Unit"
        +      },
        +      "opcode": {
        +        "title": "Opcode",
        +        "type": "string"
        +      },
        +      "parameter_types": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Parameter Types",
        +        "type": "array"
        +      },
        +      "raw": {
        +        "title": "Raw",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "title": "Reason",
        +        "type": "string"
        +      },
        +      "relation": {
        +        "title": "Relation",
        +        "type": "string"
        +      },
        +      "return_type": {
        +        "title": "Return Type",
        +        "type": "string"
        +      },
        +      "source": {
        +        "title": "Source",
        +        "type": "string"
        +      },
        +      "storage": {
        +        "enum": [
        +          "static",
        +          "instance"
        +        ],
        +        "title": "Storage",
        +        "type": "string"
        +      },
        +      "string": {
        +        "title": "String",
        +        "type": "string"
        +      },
        +      "string_index": {
        +        "title": "String Index",
        +        "type": "integer"
        +      },
        +      "target": {
        +        "title": "Target",
        +        "type": "string"
        +      },
        +      "target_dex_entry": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "title": "Target Dex Entry"
        +      },
        +      "target_resolution": {
        +        "title": "Target Resolution",
        +        "type": "string"
        +      },
        +      "type_descriptor": {
        +        "title": "Type Descriptor",
        +        "type": "string"
        +      },
        +      "value": {
        +        "title": "Value",
        +        "type": "string"
        +      }
        +    },
        +    "title": "DexRow",
        +    "type": "object"
        +  },
        +  "Source": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "container_entry": {
        +        "title": "Container Entry",
        +        "type": "string"
        +      },
        +      "declared_class_count": {
        +        "title": "Declared Class Count",
        +        "type": "integer"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dex_version": {
        +        "title": "Dex Version",
        +        "type": "string"
        +      },
        +      "path": {
        +        "title": "Path",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "title": "Sha256",
        +        "type": "string"
        +      },
        +      "size_bytes": {
        +        "title": "Size Bytes",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Source",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "apk_sha256": {
        +    "title": "Apk Sha256",
        +    "type": "string"
        +  },
        +  "artifact_path": {
        +    "title": "Artifact Path",
        +    "type": "string"
        +  },
        +  "artifact_sha256": {
        +    "title": "Artifact Sha256",
        +    "type": "string"
        +  },
        +  "backend": {
        +    "title": "Backend",
        +    "type": "string"
        +  },
        +  "backend_version": {
        +    "title": "Backend Version",
        +    "type": "string"
        +  },
        +  "class_name": {
        +    "title": "Class Name",
        +    "type": "string"
        +  },
        +  "code": {
        +    "title": "Code",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "title": "Coverage",
        +    "type": "string"
        +  },
        +  "has_more": {
        +    "title": "Has More",
        +    "type": "boolean"
        +  },
        +  "input_id": {
        +    "title": "Input Id",
        +    "type": "string"
        +  },
        +  "items": {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "$ref": "#/$defs/DexRow"
        +        }
        +      ]
        +    },
        +    "title": "Items",
        +    "type": "array"
        +  },
        +  "kind": {
        +    "title": "Kind",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "title": "Limit",
        +    "type": "integer"
        +  },
        +  "limitations": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Limitations",
        +    "type": "array"
        +  },
        +  "message": {
        +    "title": "Message",
        +    "type": "string"
        +  },
        +  "next_offset": {
        +    "anyOf": [
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "title": "Next Offset"
        +  },
        +  "offset": {
        +    "title": "Offset",
        +    "type": "integer"
        +  },
        +  "session_id": {
        +    "title": "Session Id",
        +    "type": "string"
        +  },
        +  "source": {
        +    "title": "Source",
        +    "type": "string"
        +  },
        +  "sources": {
        +    "items": {
        +      "$ref": "#/$defs/Source"
        +    },
        +    "title": "Sources",
        +    "type": "array"
        +  },
        +  "status": {
        +    "enum": [
        +      "ok",
        +      "partial",
        +      "error",
        +      "not_applicable"
        +    ],
        +    "title": "Status",
        +    "type": "string"
        +  },
        +  "total": {
        +    "title": "Total",
        +    "type": "integer"
        +  },
        +  "truncated": {
        +    "title": "Truncated",
        +    "type": "boolean"
        +  },
        +  "xml": {
        +    "title": "Xml",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / title
        Previous value: -"asc_list_classesDictOutput"New value: +"LegacyResult"
    • Addedasc_manifest_summary
    • Addedasc_open_artifact_session
    • Addedasc_open_dex_session
    • Changedasc_ping4 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ArtifactInputs": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "dex_sessions": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Dex Sessions",
        +        "type": "array"
        +      },
        +      "direct_dex_paths": {
        +        "title": "Direct Dex Paths",
        +        "type": "string"
        +      },
        +      "inventory_only": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Inventory Only",
        +        "type": "array"
        +      },
        +      "revision_diff": {
        +        "title": "Revision Diff",
        +        "type": "string"
        +      },
        +      "secret_candidates": {
        +        "title": "Secret Candidates",
        +        "type": "string"
        +      },
        +      "signing": {
        +        "title": "Signing",
        +        "type": "string"
        +      },
        +      "v31": {
        +        "title": "V31",
        +        "type": "string"
        +      }
        +    },
        +    "title": "ArtifactInputs",
        +    "type": "object"
        +  },
        +  "Capabilities": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "configured": {
        +        "title": "Configured",
        +        "type": "boolean"
        +      },
        +      "default": {
        +        "title": "Default",
        +        "type": "boolean"
        +      },
        +      "durable_index_cache": {
        +        "$ref": "#/$defs/Capabilities"
        +      },
        +      "enabled": {
        +        "title": "Enabled",
        +        "type": "boolean"
        +      },
        +      "idle_ttl_seconds": {
        +        "title": "Idle Ttl Seconds",
        +        "type": "integer"
        +      },
        +      "limitation": {
        +        "title": "Limitation",
        +        "type": "string"
        +      },
        +      "max_bytes": {
        +        "title": "Max Bytes",
        +        "type": "integer"
        +      },
        +      "max_count": {
        +        "title": "Max Count",
        +        "type": "integer"
        +      },
        +      "max_disk_bytes": {
        +        "title": "Max Disk Bytes",
        +        "type": "integer"
        +      },
        +      "max_index_bytes_per_session": {
        +        "title": "Max Index Bytes Per Session",
        +        "type": "integer"
        +      },
        +      "memory_page_cache_bytes_per_session": {
        +        "title": "Memory Page Cache Bytes Per Session",
        +        "type": "integer"
        +      },
        +      "memory_page_cache_max_entries": {
        +        "title": "Memory Page Cache Max Entries",
        +        "type": "integer"
        +      },
        +      "operations": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Operations",
        +        "type": "array"
        +      },
        +      "reference_kinds": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "title": "Reference Kinds",
        +        "type": "array"
        +      },
        +      "scope": {
        +        "title": "Scope",
        +        "type": "string"
        +      },
        +      "tested_commit": {
        +        "title": "Tested Commit",
        +        "type": "string"
        +      }
        +    },
        +    "title": "Capabilities",
        +    "type": "object"
        +  },
        +  "Source": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "container_entry": {
        +        "title": "Container Entry",
        +        "type": "string"
        +      },
        +      "declared_class_count": {
        +        "title": "Declared Class Count",
        +        "type": "integer"
        +      },
        +      "dex_entry": {
        +        "title": "Dex Entry",
        +        "type": "string"
        +      },
        +      "dex_version": {
        +        "title": "Dex Version",
        +        "type": "string"
        +      },
        +      "path": {
        +        "title": "Path",
        +        "type": "string"
        +      },
        +      "sha256": {
        +        "title": "Sha256",
        +        "type": "string"
        +      },
        +      "size_bytes": {
        +        "title": "Size Bytes",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Source",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "allowed_roots": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Allowed Roots",
        +    "type": "array"
        +  },
        +  "apk_path": {
        +    "title": "Apk Path",
        +    "type": "string"
        +  },
        +  "apk_sha256": {
        +    "title": "Apk Sha256",
        +    "type": "string"
        +  },
        +  "artifact_inputs": {
        +    "$ref": "#/$defs/ArtifactInputs"
        +  },
        +  "artifact_path": {
        +    "title": "Artifact Path",
        +    "type": "string"
        +  },
        +  "artifact_sha256": {
        +    "title": "Artifact Sha256",
        +    "type": "string"
        +  },
        +  "backend": {
        +    "title": "Backend",
        +    "type": "string"
        +  },
        +  "backend_version": {
        +    "title": "Backend Version",
        +    "type": "string"
        +  },
        +  "code": {
        +    "title": "Code",
        +    "type": "string"
        +  },
        +  "coverage": {
        +    "title": "Coverage",
        +    "type": "string"
        +  },
        +  "dex_sessions": {
        +    "$ref": "#/$defs/Capabilities"
        +  },
        +  "droidasc_version": {
        +    "title": "Droidasc Version",
        +    "type": "string"
        +  },
        +  "has_more": {
        +    "title": "Has More",
        +    "type": "boolean"
        +  },
        +  "input_id": {
        +    "title": "Input Id",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "title": "Limit",
        +    "type": "integer"
        +  },
        +  "limitations": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "title": "Limitations",
        +    "type": "array"
        +  },
        +  "max_page_size": {
        +    "title": "Max Page Size",
        +    "type": "integer"
        +  },
        +  "max_worker_memory_bytes": {
        +    "title": "Max Worker Memory Bytes",
        +    "type": "integer"
        +  },
        +  "message": {
        +    "title": "Message",
        +    "type": "string"
        +  },
        +  "method_backend": {
        +    "$ref": "#/$defs/Capabilities"
        +  },
        +  "next_offset": {
        +    "anyOf": [
        +      {
        +        "type": "integer"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "title": "Next Offset"
        +  },
        +  "offset": {
        +    "title": "Offset",
        +    "type": "integer"
        +  },
        +  "rust_backend": {
        +    "$ref": "#/$defs/Capabilities"
        +  },
        +  "server": {
        +    "title": "Server",
        +    "type": "string"
        +  },
        +  "server_version": {
        +    "title": "Server Version",
        +    "type": "string"
        +  },
        +  "session_id": {
        +    "title": "Session Id",
        +    "type": "string"
        +  },
        +  "sources": {
        +    "items": {
        +      "$ref": "#/$defs/Source"
        +    },
        +    "title": "Sources",
        +    "type": "array"
        +  },
        +  "status": {
        +    "const": "ok",
        +    "title": "Status",
        +    "type": "string"
        +  },
        +  "timeout_seconds": {
        +    "title": "Timeout Seconds",
        +    "type": "integer"
        +  },
        +  "total": {
        +    "title": "Total",
        +    "type": "integer"
        +  },
        +  "truncated": {
        +    "title": "Truncated",
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "status",
        +  "server",
        +  "server_version",
        +  "droidasc_version",
        +  "allowed_roots",
        +  "timeout_seconds",
        +  "max_worker_memory_bytes",
        +  "max_page_size",
        +  "artifact_inputs",
        +  "rust_backend",
        +  "method_backend",
        +  "dex_sessions"
        +]
      • changedOutput schema / title
        Previous value: -"asc_pingDictOutput"New value: +"PingResult"
    • Addedasc_query_dex_session
    • Addedasc_read_apk_entry
    • Addedasc_secret_candidates
    • Addedasc_signing_inventory
  4. 6 tool updatesv0.1.1
    • First observedasc_apk_info
    • First observedasc_find_refs
    • First observedasc_get_class_source
    • First observedasc_get_manifest
    • First observedasc_list_classes
    • First observedasc_ping

TDQS

B3.4/5.0

Scored across 18 tools

Disambiguation3/5

The set has notable overlap: asc_analyze_dex and asc_query_dex_session expose many of the same reference/member/string query capabilities, and the simple asc_list_classes/asc_get_class_source/asc_find_refs tools partially duplicate session-query behavior. Descriptions clarify session vs one-shot and artifact vs DEX contexts, but an agent can still hesitate between several tools.

Naming Consistency4/5

Names consistently use the asc_ prefix and snake_case, with mostly predictable verb_noun patterns such as asc_list_classes, asc_get_class_source, and asc_open_dex_session. A few are noun phrases or state/report style (asc_apk_info, asc_manifest_summary, asc_secret_candidates), which is a minor deviation.

Tool Count3/5

Eighteen tools is on the heavy side for a single MCP server, and the overlap between one-shot DEX analysis, session queries, and artifact inspection suggests some could be consolidated. The Android/DEX analysis domain is complex enough to justify many capabilities, but the surface feels borderline bloated rather than tightly scoped.

Completeness4/5

The surface covers a broad static-analysis lifecycle: class/source discovery, references, sessions, manifests, signing inventory, APK entries, artifact inspection, DEX diffing, and secret candidates. Missing native/ELF analysis, resource resolution, and dynamic/runtime verification are acknowledged scope limits rather than silent gaps.

Maintenance

ActivityMaintained
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI agents with a unified MCP interface for Android APK reverse engineering, metadata analysis, Smali/resource editing, rebuilding, signing, verification, and ADB device testing.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes the ASC APK-as-database analysis engine as MCP tools, enabling AI clients to run fast cross-reference searches, string/secret recon, class and member inspection, manifest and component extraction, and parallel batch queries across many APKs without full decompilation. All tools are stateless and process-isolated, so multiple clients can query single or multiple APK analysis sessions concurrently.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to locally inspect Android APKs over MCP by decompiling Java, decoding resources, searching classes and methods, tracing references, and producing evidence reports with limitations.
    5
    MIT