HexForge Gateway
HexForge Gateway is an API for AI-assisted APK reverse-engineering, letting you manage workspaces, run static/dynamic analysis tools, and chat with accumulated findings.
Workspace management: list workspaces, get-or-create by name, and store knowledge entries (reports, notes, summaries, chat history).
Static analysis of APKs:
Decompile with jadx to Java-like source (read-only).
Decode resources/smali with apktool (editable, rebuildable).
Rebuild APKs from decoded projects (unsigned output).
Fingerprint packers/obfuscators via APKiD.
Scan for hardcoded secrets (AWS/Google keys, tokens, JWTs).
Search decompiled code with regex.
File operations: read files (UTF-8/base64) and list directories (recursive option).
Dynamic device analysis (requires adb/frida):
List connected devices, run shell commands, install APKs, dump logcat.
List processes/apps via Frida and run bounded-time Frida traces with custom scripts.
AI-assisted workflows:
Chat with a workspace's ongoing multi-turn history to ask questions about findings.
Summarize arbitrary text using the gateway's AI provider.
Real-time updates: WebSocket endpoint streams task/job/workflow/knowledge/workspace status changes.
Allows connecting to a local Ollama server for AI-powered workspace chat and analysis without requiring cloud services.
Provides OpenAI-backed completions for AI-assisted chat and analysis within the reverse-engineering workspace.
Optional persistent backend for storing workspaces and knowledge entries in Supabase, with automatic fallback to local file storage.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HexForge GatewayDecompile app.apk with jadx and summarize its manifest and permissions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HexForge Gateway
AI-assisted APK reverse-engineering workspace API. Dispatches tasks to MCP agents (jadx, apktool, adb, frida, filesystem, MT Manager's APK MCP, AI providers) and streams updates over WebSocket. Runs entirely on-device (Termux + MT Manager on Android) or on a normal PC - no cloud required.
Flow: Workspace -> Workflow -> Jobs -> Tasks -> MCP Agents, with modules
talking through an Event Bus. MIT licensed. Contributing: run
npm run typecheck && npm run build && ./scripts/smoke-test.sh before a
PR - see CONTRIBUTING.md.
Getting started
npm install
cp .env.example .env
npm run devThe Gateway starts on http://localhost:8080 and prints a banner with your
workspaces and copy-pasteable commands. GET / returns the same as JSON -
the quickest way to see what's here.
Core endpoints (request/response shapes are in the linked docs):
GET /- live cheat sheet -GET /health- service + config statusPOST /workspaces/GET /workspaces[/:id]/PUT /workspaces/by-name/:name(idempotent get-or-create)POST /workspaces/:id/tasks- dispatch to an MCP agent, fire-and-forget; poll or watch/ws(AGENTS)POST /workspaces/:id/jobs//workflows//knowledge(ARCHITECTURE)POST|GET /workspaces/:id/chat(AI)GET /plugins(PLUGINS)WS /ws- real-timetask:update,job:update,workflow:update,knowledge:entry_created,workspace:status_changed
Related MCP server: Apktool MCP Server
Stack
Node.js 20+ / TypeScript, Fastify (+ @fastify/websocket), Zod. Storage is
local files by default; Supabase is opt-in (STORAGE_BACKEND=supabase). Auth
is an opt-in API key check, off by default (AUTH_ENABLED=false).
Documentation
Doc | Covers |
Requirements, auth, storage backend, running on PC and Android/Termux | |
Event Bus, Job Engine, Workflow Engine, Knowledge Engine | |
Every MCP agent - operations and examples | |
The AI provider layer (9 providers), the | |
Registering HexForge's agents as native tools in Claude Desktop/Code/Cursor | |
The Plugin System - contract, loader, reference plugins | |
| |
MT Manager's APK MCP setup, with screenshots and troubleshooting | |
Repo layout and how the pieces talk | |
What's done and what's still open |
Available Tools
19 toolsadb_devicesA
List connected Android devices/emulators. Requires adb on PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states the adb prerequisite, which is useful, and 'List' implies a read-only operation. However, it does not disclose output format, behavior when no devices are connected, or whether the adb server is started automatically.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the core action and then adds a concise prerequisite. Every word earns its place, and there is no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the description is adequate for a basic invocation, but with no output schema the description should say more about return content, such as device serials and states. It also leaves the workspace parameter's relevance unexplained, creating a small gap in complete context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the single 'workspace' parameter with 100% coverage, so the baseline is 3. The description adds no clarifying semantics about how or whether 'workspace' relates to device listing, which is slightly confusing, but the schema already explains the parameter's own behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'connected Android devices/emulators,' making the tool's function immediately clear. This also differentiates it from sibling tools like adb_shell, adb_install, and adb_logcat, which perform different device operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys when to use the tool—when you need to list connected devices/emulators—and includes a practical prerequisite: 'Requires adb on PATH.' It does not explicitly mention alternatives or when-not conditions, but the use case is specific enough for an agent to select it appropriately among Android-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adb_installB
Install an APK on a connected device via adb.
| Name | Required | Description | Default |
|---|---|---|---|
| apkPath | Yes | ||
| reinstall | No | Pass -r to allow reinstalling over an existing install | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| deviceSerial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of disclosing behavior. It only says 'install an APK', omitting important behavioral details like what happens if the app already exists, whether the installation is destructive to existing data, how device selection is determined, and what output or failure modes to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It states the verb and object immediately and stays appropriately short for a straightforward tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four parameters, no annotations, no output schema, and only 50% schema coverage, this description is not complete enough. It does not explain prerequisites like a connected device, how failures are reported, or the meaning of the workspace and deviceSerial parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description does not compensate. It adds no meaning for apkPath or deviceSerial, leaving the agent to guess whether apkPath is a local file path or a device path, and how deviceSerial is used to select among connected devices.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Install') and a specific resource ('an APK on a connected device via adb'). It is easily distinguishable from sibling tools like build_apk, decompile_apk, adb_shell, and adb_devices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: install an existing APK on a connected device. However, it gives no explicit guidance about when not to use it, nor does it mention alternatives such as build_apk for building the APK first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adb_logcatA
Dump and tail the current logcat buffer from a connected device (a snapshot, not a live stream).
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | How many lines to tail, default 200 | |
| filter | No | logcat filterspec, e.g. "MyTag:D *:S" | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| deviceSerial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses that the command returns a snapshot rather than a live stream, and implicitly that it is a read operation on the device. However, it does not mention output format, buffer behavior, or any device-selection caveats, which would add valuable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence front-loads the action and resource, then immediately clarifies the important non-live-stream behavior. There is no fluff or repetition, and the key semantic distinction is placed where it will be read first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only logcat tool, the description plus schema covers the core invocation details: buffer, device connection, snapshot semantics, lines, filter, and workspace. However, there is no output schema and no description of the return value, and the undocumented `deviceSerial` parameter weakens completeness for multi-device scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents three of four parameters, so the description does not need to deeply explain them. Still, the description adds no parameter-level meaning, and the `deviceSerial` parameter remains undocumented in both the schema and the description, creating a small gap that an agent must infer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource ('Dump and tail the current logcat buffer') and clarifies the non-live nature with 'a snapshot, not a live stream'. This distinguishes it from any potential streaming or shell-based log retrieval path, even though no sibling is logcat-specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: it reads from a connected device, acts on the current buffer, and explicitly excludes live streaming. It does not name an alternative tool or give explicit when-not-to-use guidance, but the snapshot-vs-live distinction is enough to guide an agent choosing between this and a shell-based approach.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adb_shellA
Run a shell command on a connected Android device via adb. As powerful as adb shell itself - only use against a device you control.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| deviceSerial | No | Only needed with more than one device connected |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden and does warn that the tool is as powerful as adb shell and should only be used on a controlled device. It does not detail side effects, output behavior, or failure modes, but the warning conveys the primary arbitrary-execution risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and a safety warning. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a straightforward tool: the command and device are specified, and the power is flagged. Missing context includes how output is returned, how to verify a device is connected (sibling adb_devices), and when deviceSerial is needed beyond the schema note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: command has no schema description, but the tool description identifies it as a shell command. workspace and deviceSerial are already documented in the schema, so the description adds little beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description specifies a concrete action ('Run a shell command on a connected Android device via adb') and clarifies scope with 'as powerful as adb shell itself'. This naturally distinguishes it from sibling tools like adb_install and adb_logcat, which are narrower operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for arbitrary command execution via adb, and adds a safety constraint ('only use against a device you control'). However, it does not explicitly state when to prefer this over siblings such as adb_install, adb_logcat, or frida_trace, nor does it describe exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_apkA
Rebuild an APK from an apktool-decoded (and possibly edited) project directory. The result is unsigned - sign it separately before installing. Requires apktool on PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| inputDir | Yes | The decoded project directory (from decode_apk), possibly edited | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| outputName | No | Output file name, e.g. "rebuilt.apk" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description supplies the essential caveats itself: the produced APK is unsigned and must be signed separately, and apktool must be on PATH. This covers the main behavioral risks (installing an unsigned build, missing dependency) better than most tools. It does not describe output location or failure behavior, but those are secondary for a build operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose, critical artifact caveat, and prerequisite. It is front-loaded with what the tool does and wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a build tool without annotations or output schema, the description covers the workflow context, artifact safety, and environment requirement. It does not state the output path or return value, but the schema already documents the parameters and the description gives enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have descriptions in the schema (100% coverage), so the baseline is 3. The description adds only the pipeline framing that inputDir is decoded and possibly edited, which is already in the schema's inputDir description. No extra parameter-level meaning is contributed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses the specific verb 'Rebuild' with a precise resource ('an APK from an apktool-decoded project directory') and is clearly the inverse of decode_apk among siblings. The unsigned-result caveat further disambiguates what the build artifact is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description positions the tool within the decode → edit → build → sign → install flow by calling the input an apktool-decoded project and warning to sign before installing. This implies use after decode_apk and before adb_install, though it never names those siblings explicitly. That is clear usage context without formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chat_with_workspaceA
Send a message in a workspace's ongoing chat and get a reply, with real multi-turn history (not a one-shot completion) - useful for asking questions about accumulated findings without re-explaining context every time.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals a key behavioral trait: the tool maintains real multi-turn history rather than treating each call as independent. This is meaningful context that goes beyond a simple 'chat' label, though it does not mention side effects around history persistence or workspace creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured sentence that front-loads the core action, then adds the key differentiator and a practical use case. Every clause earns its place; there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple two-parameter tool with no output schema, the description is largely complete: it states what the tool does, what the user gets back ('a reply'), and when it is useful. The remaining gaps, such as explicit mention of history persistence or workspace auto-creation behavior, are partly covered by the schema and are not critical for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with only the 'workspace' parameter described in the schema (name not id, auto-created, defaults to 'default'). The description adds general meaning to 'message' by framing it as the user's input to the ongoing chat, but it does not add detail beyond the schema for 'workspace'. The schema and description together are adequate but not rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Send a message'), a specific resource ('a workspace's ongoing chat'), and the expected result ('get a reply'). It further distinguishes itself from a one-shot completion by explicitly highlighting real multi-turn history, which helps an agent understand what makes this tool unique among the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is useful: 'asking questions about accumulated findings without re-explaining context every time.' It implies a multi-turn conversational use case, though it does not explicitly name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decode_apkA
Decode an APK's resources to editable XML and disassemble code to smali with apktool (unlike jadx, the result can be rebuilt). Requires apktool on PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| noRes | No | Skip decoding resources - smali only | |
| noSrc | No | Skip disassembling code - resources only, faster | |
| apkPath | Yes | Absolute path to the .apk file | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the output is rebuildable, that apktool is used, and that apktool must be installed. However, it does not mention side effects such as where files are written, how the workspace is used, or what happens on failure, leaving meaningful behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The core action is front-loaded, and each clause adds useful information: output type, tool, rebuildability, and the PATH prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema or annotations, the description covers purpose, output format, tool, and prerequisite. It does not, however, explain where decoded artifacts are written, how the workspace parameter factors in, or explicitly distinguish this tool from decompile_apk. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents apkPath, noRes, noSrc, and workspace. The description adds no parameter-specific details beyond the general mention of decoding resources and code, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Decode'), a resource (APK), concrete outputs ('editable XML' and 'smali'), and the engine (apktool). It is clear and informative, but it does not explicitly name or differentiate the sibling decompile_apk; the 'unlike jadx' phrase implies a contrast but leaves the sibling relationship implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete comparison ('unlike jadx, the result can be rebuilt') and states a prerequisite ('Requires apktool on PATH'), which helps an agent decide when this tool is appropriate. It stops short of explicitly saying when not to use it or naming decompile_apk as the alternative, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decompile_apkA
Decompile an APK to readable Java-like source with jadx, for reading and searching - unlike decode_apk, the output is read-only and cannot be rebuilt into an APK. Output lands under the workspace's jadx output directory. Requires jadx on PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| apkPath | Yes | Absolute path to the .apk file to decompile | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses meaningful behavioral traits: output is read-only in the sense that it cannot be rebuilt into an APK, output lands in a specific workspace jadx directory, and jadx must be installed. It does not mention failure modes, runtime duration, or that it writes files to disk, but the key safety and dependency information is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the core action and purpose, then adds the sibling distinction, output location, and prerequisite. Every sentence earns its place and an agent can parse it quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and no output schema, the description is largely complete: it explains what the tool does, when to prefer it, where output goes, and a critical dependency. The main gap is that it does not describe what the tool returns after decompilation, but since the output is written to a known directory and file-reading tools are available, this is a minor omission rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents apkPath and workspace. The description adds context about the output location and jadx dependency, but it does not add per-parameter meaning beyond what the schema already provides. A baseline score of 3 is appropriate because the description does not worsen or substantially improve parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Decompile an APK to readable Java-like source with jadx.' It also clearly states the intended use case ('for reading and searching') and distinguishes itself from decode_apk by noting the output is read-only and cannot be rebuilt. This makes the tool's purpose unmistakable and distinct from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives solid usage direction by contrasting with decode_apk: this tool produces read-only output that cannot be rebuilt, so it is appropriate for reading and searching rather than rebuild workflows. It does not explicitly say 'use decode_apk when you need a rebuildable APK,' but the contrast is strong enough for an agent to infer the right choice. It also notes the prerequisite that jadx must be on PATH.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frida_list_processesA
List running processes (or installed apps) on a device via Frida. Requires frida-tools on PATH and a matching frida-server on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| includeApps | No | List installed apps, not just running processes | |
| deviceSerial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states that it 'Requires frida-tools on PATH and a matching frida-server on the device,' which is a useful prerequisite and implies the tool may fail if these are absent. However, it does not disclose what happens on failure (e.g., throws an error, returns empty list), nor does it mention that 'workspace' might be created automatically, which is a side-effect. This is a moderate level of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 18 words, with the core purpose front-loaded and the key prerequisite appended. Every word is informative, and it avoids redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple read-only purpose with 3 optional parameters. The schema covers parameter details partially, and the description provides the necessary prerequisite. However, it lacks information on the return format (e.g., list of process names and PIDs) and does not clarify the 'deviceSerial' parameter's role. For a tool that may interact with specific devices, this is a gap, but given the simplicity, a 3 is reasonable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so two parameters ('workspace' and 'includeApps') have descriptions. The tool description does not add any additional meaning beyond the schema; it simply restates 'includeApps' as 'list installed apps' which is already in the schema. The 'deviceSerial' parameter has no description, and the tool description does not clarify it. Since the schema covers most, a baseline of 3 is appropriate; the description does not go beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'List running processes (or installed apps) on a device via Frida.' This distinguishes it from sibling tools like adb_devices (which lists devices) and frida_trace (which traces functions), and from file/system tools. The mention of 'via Frida' differentiates it from generic system process-listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to list processes or apps on a device, and it mentions the requirement of frida-tools and frida-server. It does not explicitly state when NOT to use it or mention alternatives (e.g., use adb_shell to run 'ps' if Frida isn't set up). The 'via Frida' qualifier hints at a dependency, but a clear exclusion or alternative is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frida_traceA
Spawn or attach to a process, inject a Frida script, and capture whatever it emits within a bounded time window (this isn't a real interactive Frida session - it runs the script, waits, then stops it). Requires frida-tools + a matching frida-server on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default spawn | |
| script | Yes | Raw Frida JavaScript to inject | |
| target | Yes | Package name (spawn mode) or PID/process name (attach mode) | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| deviceSerial | No | ||
| timeoutSeconds | No | Default 15, capped at 60 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool runs the script, waits, then stops it, and that it is not a real interactive session. It also mentions the bounded time window and the dependency on frida-tools/frida-server. This is good behavioral context, though it could mention side effects like process termination or output capture details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and the key caveat (not interactive). Every clause earns its place: the bounded time window, the non-interactive clarification, and the dependency requirement. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, 2 required, and no output schema, the description covers the essential behavioral context (non-interactive, bounded, dependency). It doesn't explain return values or output format, but with no output schema and a clear script-injection model, the agent can infer that output is whatever the script emits. The dependency note is valuable. Minor gap: no mention of how output is returned or what happens on timeout.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents most parameters. The description adds context about the bounded time window and the non-interactive nature, which helps understand timeoutSeconds and script. However, it doesn't add much beyond the schema for parameters like mode, target, or workspace. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (spawn or attach to a process, inject a Frida script, capture output) and the resource (a process via Frida). It also explicitly distinguishes itself from a real interactive Frida session, which helps differentiate it from potential sibling tools like frida_list_processes. The verb 'spawn or attach' is specific and the bounded time window is a key distinguishing trait.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the requirement (frida-tools + matching frida-server) and clarifies that it is not an interactive session, which implies when to use it (bounded script execution) vs alternatives. It doesn't explicitly name sibling alternatives or state when not to use it, but the context is clear enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_or_create_workspaceA
Get or create a workspace by name - idempotent, safe to call every time you start working on something.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| targetLabel | No | Defaults to the workspace name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It meaningfully discloses that the call is idempotent and safe to repeat, which is the most important behavioral trait for a get-or-create tool. It does not detail side effects like permissions or storage, but the core repeat-safe behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The core operation and the most important behavioral guidance are front-loaded, making it easy for an agent to grasp quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers invocation context and repeatability adequately. It does not specify the return value or describe what 'workspace' means, but these are relatively minor given the tool's simplicity and the clarity of the get-or-create pattern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description must partially compensate for the undocumented 'name' parameter; the phrase 'by name' does clarify that 'name' is the identifier. However, the description adds no meaning for 'targetLabel' beyond the schema's existing 'Defaults to the workspace name' explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact operation ('get or create a workspace by name') and the key behavioral property (idempotent). This clearly distinguishes it from sibling tools like list_workspaces, which only read, and chat_with_workspace, which operates within an existing workspace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'safe to call every time you start working on something' gives an explicit context for when to use it. It does not name alternative tools or state when not to use it, but the idempotent get-or-create semantics make the usage context clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identify_packerA
Fingerprint the compiler, packer, obfuscator, and anti-debug/anti-VM techniques used in an APK, via APKiD's YARA rules. Requires apkid on PATH (pip install apkid).
| Name | Required | Description | Default |
|---|---|---|---|
| apkPath | Yes | Absolute path to the .apk (or .dex) file | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| timeoutSeconds | No | Per-file YARA scan timeout, default 30 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral disclosure burden. It usefully discloses that it relies on APKiD and requires apkid on PATH, and 'Fingerprint' implies read-only analysis. However, it does not state what the tool returns, whether any workspace/side effects occur, or what happens when apkid is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: the first states the tool's purpose and mechanism, the second states the required dependency. There is no filler or repetition, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should clarify what kind of result the agent can expect; it only says 'Fingerprint...' without describing the return shape. Parameters are well covered by the schema, and the dependency is noted, but the missing output/side-effect context leaves a moderate gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents apkPath, workspace, and timeoutSeconds. The description adds no parameter-specific detail beyond the APK focus, but the baseline of 3 is appropriate because the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Fingerprint' and names the exact resource: compiler, packer, obfuscator, and anti-debug/anti-VM techniques in an APK. It also names the mechanism (APKiD's YARA rules), making it clearly distinguishable from sibling tools like decompile_apk, build_apk, and scan_secrets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when an agent needs to identify packing/obfuscation/anti-analysis techniques in an APK. It also provides a concrete prerequisite (apkid on PATH), but it does not explicitly state when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesA
List a directory's immediate contents (or every file beneath it, with recursive) - e.g. to see what decompile_apk or decode_apk produced before reading individual files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default/max 500 entries | |
| dirPath | Yes | Absolute path to the directory to list | |
| recursive | No | List every file under dirPath, not just its immediate children. Default false. | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it only restates the recursive behavior already present in the schema. It does not disclose potential edge cases like hidden files, symlinks, or output format, though as a read-only listing operation the risk is low. The description is adequate but adds no non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The core purpose is front-loaded in the first sentence, and the second provides a concrete example that earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with full schema coverage and no output schema, the description provides enough context: the tool's function, an example use case, and an implied relationship to other tools. It does not explicitly state return values, but the name and primary verb make that clear. Complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all parameters. The description references 'recursive' but adds no new meaning beyond the schema's parameter description. Baseline of 3 is appropriate because the schema handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('a directory's immediate contents'), and explicitly covers the recursive variant. The example referencing decompile_apk and decode_apk, along with 'before reading individual files', clearly distinguishes this from read_file and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage scenario: inspect outputs of decompile_apk or decode_apk before reading individual files. It does not explicitly list when not to use the tool or name alternative listing tools, but the context is sufficient for an agent to decide when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_knowledgeA
List a workspace's knowledge base entries - reports (auto-generated from finished workflows), notes, summaries, chat history.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It signals a read-only list operation and adds one useful detail: reports are auto-generated from finished workflows. It does not disclose side effects or edge behavior, though none are strongly implied for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every phrase adds useful scope, and the enumeration of content types is dense but clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with only two optional parameters and no output schema, the description is largely complete. It names the resource, the scope, and the content types. The only minor gap is that it does not explicitly say whether omitting 'type' returns all categories or only a default subset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description partially compensates by listing the exact enum categories in prose, clarifying what the 'type' parameter means. The workspace parameter is already documented in the schema, including auto-creation and default behavior. The description does not state what happens when 'type' is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('a workspace's knowledge base entries'), then enumerates the content categories: reports, notes, summaries, and chat history. This clearly differentiates it from siblings like list_workspaces, which return workspace metadata rather than knowledge entries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied by the verb and resource: you use this to list knowledge entries. However, it does not explicitly state when to prefer this over alternatives such as list_workspaces or chat_with_workspace, nor does it describe any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesA
List every workspace that exists on the Gateway.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden of behavioral disclosure. It does convey that this is a non-mutating list operation covering all workspaces, but it omits return format, pagination, ordering, and whether any side effects or permission requirements exist. For a zero-parameter read-only tool this is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It immediately identifies the action and scope, and every word adds meaning. This is an ideal length for such a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no annotations, and no output schema, the description provides the essential information an agent needs to invoke it correctly. It clearly states the operation and scope, though it could mention the expected return shape (e.g., a list of workspace IDs/names) for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4. The description reinforces this by saying 'every workspace', making clear there is no filtering or per-workspace input. There is nothing for the description to add beyond what the schema already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a concrete resource ('workspace'), and a precise scope ('every workspace that exists on the Gateway'). It clearly distinguishes this from siblings like get_or_create_workspace and chat_with_workspace, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives, nor does it mention exclusions. However, the intended usage is reasonably implied: call this when you need an enumeration of all workspaces. More explicit routing to siblings would improve this dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileA
Read a single file's contents by absolute path - e.g. a decompiled source file from decompile_apk's output, or a manifest from decode_apk's. Fails if the path is a directory (use list_files first) or doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| encoding | No | Default utf8; use base64 for binary files. | |
| filePath | Yes | Absolute path to the file to read | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses two failure modes (directory path and nonexistent path) and clarifies it reads a single file, but it does not state the return format, permissions, or size-related behavior. The failure guidance is valuable but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The main purpose is front-loaded, and the failure/alternative guidance is placed at the end without restating schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter read tool with no output schema, the description covers the important context: path examples, failure conditions, and the directory alternative. It does not explicitly describe the success return payload, but 'contents' and the encoding enum make the expected behavior reasonably clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine parameter context by giving concrete filePath examples from decompile_apk/decode_apk output and reinforcing the absolute-path constraint. Encoding and workspace still rely on the schema, preventing a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Read a single file's contents by absolute path') and gives concrete examples tied to sibling tools (decompile_apk and decode_apk). It is clearly distinguishable from list_files and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when the tool should not be used ('Fails if the path is a directory') and names the alternative ('use list_files first'). It also grounds the when-to-use context with examples of decompiled source files and decoded manifests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_secretsA
Recursively scan a directory (e.g. jadx/apktool output) for likely hardcoded secrets - AWS/Google API keys, private key headers, Slack/GitHub tokens, JWTs. A curated high-precision starting set, not exhaustive - not a replacement for a maintained secret-scanner on anything that actually matters.
| Name | Required | Description | Default |
|---|---|---|---|
| dirPath | Yes | Directory to scan, e.g. a jadx output directory | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| extensions | No | File extensions to include, e.g. [".java", ".xml"]. Omit to scan all non-binary-looking files. | |
| maxResults | No | Cap on results, default/max 200 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does the disclosure work and does characterize behavior: recursive scanning, curated high-precision matching, non-exhaustive coverage, and unsuitability for critical use. However, it does not mention side effects such as the workspace being auto-created or how results are delivered, which leaves some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the core purpose and immediately follow with a valuable precision/caveat. No filler or repetition; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool's purpose, scope, and limitations are clear, and all parameters are documented in the schema. However, with no output schema and no annotation safety profile, the description leaves the return format and workspace side effects implicit, so the agent does not fully know what to expect after invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents dirPath, workspace, extensions, and maxResults. The description adds useful context about what kinds of secrets are detected and that scans target decompiled output, but it does not add parameter-level semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and scope: recursively scan a directory for likely hardcoded secrets, and it enumerates concrete secret categories (AWS/Google API keys, private key headers, Slack/GitHub tokens, JWTs). This clearly differentiates it from general code-search or file-listing siblings like search_code and list_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the intended context (scanning jadx/apktool output), explicitly positions it as a high-precision starting set, and gives an explicit when-not: not a replacement for a maintained secret-scanner on anything that actually matters. This is actionable guidance for choosing it over more thorough alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeA
Search a directory tree for a regex pattern - e.g. permission strings in decompiled output.
| Name | Required | Description | Default |
|---|---|---|---|
| dirPath | Yes | Directory to search | |
| pattern | Yes | A regular expression | |
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| extensions | No | ||
| maxResults | No | Cap on results, default/max 200 | |
| caseSensitive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It correctly communicates a read-only search operation over a directory tree, but it does not disclose whether results are file paths, line matches, or capped, and it does not mention the side effect that specifying a new workspace creates it automatically. This is a meaningful gap, though the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no filler: the verb and resource are front-loaded, the matching criterion is explicit, and the example earns its place by grounding the abstract regex search in a concrete scenario. Every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, no annotations, and no output schema, the description is lean but minimally sufficient for basic invocation using defaults. It does not explain return value shape or the workspace-creation side effect, and it leaves optional behavior like case sensitivity and extensions to the schema. The description is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with descriptions for dirPath, pattern, workspace, and maxResults. The description reinforces that pattern is a regular expression and gives a concrete example of what to search for, but it adds no meaning for the undocumented extensions and caseSensitive parameters. Those are conventional enough that the gap is moderate rather than severe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Search'), a concrete scope ('a directory tree'), and a precise criterion ('regex pattern'), with a relevant example ('permission strings in decompiled output'). This clearly distinguishes it from sibling tools like list_files or read_file, which do not search contents, and from scan_secrets, which targets a narrower class of patterns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example ('e.g. permission strings in decompiled output') implies a common use case, giving some context for when to use the tool. However, there is no explicit when-to-use statement, no mention of what it should not be used for, and no comparison with alternatives such as scan_secrets or read_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_textA
Summarize arbitrary text (e.g. tool output) using the Gateway's configured AI provider.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| workspace | No | Workspace name (not id) - created automatically if it doesn't exist yet. Defaults to "default". | |
| instructions | No | Optional extra instructions for the summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses that the tool uses an external AI provider, implying a network call and potential nondeterminism, but it does not mention side effects, data handling, or privacy implications of sending arbitrary text to a provider. This is a moderate gap, though the non-destructive nature of summarization reduces the risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action and resource, includes a useful example, and identifies the underlying mechanism. There is no fluff or redundancy—every word contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward summarization tool, the description covers the purpose, input type, and mechanism. The return value (a summary) is implied, and no output schema exists to explain formatting. The main omission is a note about output format or potential limitations, but this is a minor gap for a tool of this simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'workspace' and 'instructions' parameters with descriptions, covering 67% of parameters. The 'content' parameter lacks a schema description, but the tool description's 'arbitrary text' clarifies its meaning. The description does not add further parameter-specific detail beyond what the schema provides, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Summarize') and a clear resource ('arbitrary text'), with a concrete example ('tool output') and the mechanism ('Gateway's configured AI provider'). This clearly differentiates it from workspace-scoped siblings like chat_with_workspace, which would handle workspace-specific context rather than arbitrary text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is intended for arbitrary text, especially tool output, implying it is for content not tied to a workspace. However, it does not explicitly name alternative tools or state conditions when it should not be used, stopping short of full usage 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.
3 tool updates
v1.3.1- Changed
decompile_apk1 field changed- changed
Input schema / properties / apkPath / descriptionPrevious value: -"Absolute path to the .apk file"New value: +"Absolute path to the .apk file to decompile"
- Changed
list_files2 fields changed- added
Input schema / properties / dirPath / descriptionAdded value: +"Absolute path to the directory to list" - added
Input schema / properties / recursive / descriptionAdded value: +"List every file under dirPath, not just its immediate children. Default false."
- Changed
read_file1 field changed- added
Input schema / properties / filePath / descriptionAdded value: +"Absolute path to the file to read"
19 tool updates
v1.3.0- First observed
adb_devices - First observed
adb_install - First observed
adb_logcat - First observed
adb_shell - First observed
build_apk - First observed
chat_with_workspace - First observed
decode_apk - First observed
decompile_apk - First observed
frida_list_processes - First observed
frida_trace - First observed
get_or_create_workspace - First observed
identify_packer - First observed
list_files - First observed
list_knowledge - First observed
list_workspaces - First observed
read_file - First observed
scan_secrets - First observed
search_code - First observed
summarize_text
TDQS
Scored across 19 tools
Every tool targets a distinct action and resource: decode vs decompile are clearly differentiated by rebuildability, adb_* tools each handle a specific adb operation, and frida_trace vs frida_list_processes cover different dynamic analysis aspects. No two tools appear to do the same thing.
The majority of tools follow a verb_noun snake_case pattern (decode_apk, build_apk, scan_secrets). Minor deviations like 'adb_devices' and 'chat_with_workspace' break the pure verb_noun pattern but are still understandable and predictable given the tool's domain.
With 19 tools, this is slightly on the high side of the ideal range, but each tool serves a distinct purpose in the APK analysis and dynamic instrumentation workflow. The count is justified by the breadth of static analysis, file management, ADB, and Frida capabilities, and none feel redundant.
The tool surface covers the full lifecycle of APK analysis: static decoding/decompiling, rebuilding, packer identification, secret scanning, code search, dynamic analysis via ADB and Frida, plus workspace and knowledge management. Minor gaps like a signing tool (explicitly noted as external) and perhaps a network capture tool prevent a perfect score, but the core workflows are well supported.
Maintenance
Related MCP Connectors
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for static security analysis of Android source code
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityBmaintenanceA Model Context Protocol server that connects to a custom JADX fork (JADX-AI) and enables local LLMs to interact with decompiled Android app code for live reverse engineering assistance.32790Apache 2.0
- AlicenseAqualityCmaintenanceAn MCP server that integrates with Apktool to provide live reverse engineering support for Android applications using Claude and other LLMs through the Model Context Protocol.16656Apache 2.0
- AlicenseAqualityBmaintenanceA minimal, secure MCP server for AI-assisted mobile development, enabling build, install, interact, and inspect Android/iOS apps.3311 npm9Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server for analyzing Android APK, DEX, or JAR files via a headless jadx engine, enabling LLM agents to query decompiled code, symbols, call graphs, and more.2GPL 3.0