Skip to main content
Glama

airgap-re

A security-first reverse-engineering MCP server. It gives an AI agent (Claude Code, Cursor, any MCP client) a small, read-only set of static reverse-engineering tools over a proven, auditable stack — and runs every untrusted sample inside a no-network bubblewrap chamber that never executes the target.

CI License: MIT Python 3.10+ MCP Isolation: bubblewrap

Status — v0.1.0, early but gated. The surface is small and the API may still move, but nothing merges unless the isolation proof runs green in CI. We would rather ship a narrow tool whose guarantees are real than a broad one whose guarantees are hopes.

Scope / lawful use. For software you own, in-scope bug-bounty targets, CTFs, abandonware, and interoperability research permitted by law. Read-only by design: it never patches, rebuilds, or executes the target. See SECURITY.md and the Threat Model.


Contents


Related MCP server: retriage

Why this exists (and where it does not compete)

A wave of "AI reverse-engineers anything over MCP" tooling is genuinely useful — broad, convenient, well-packaged. The best-known of them, morluto/rea, covers an impressively wide surface (native, mobile, web, firmware, network, WASM, managed code). On raw breadth, REA leads, and this project does not try to match it.

This project makes a different, narrower bet: when you point an analysis tool at a hostile binary, the thing that matters most is isolation and auditability, not feature count. That is exactly the axis where broad orchestrators tend to be weakest — many run their dynamic/runtime paths with your own user privileges and no container at all.

★ The honest one-liner: REA optimizes for breadth; airgap-re optimizes for safety and auditability on the native-static lane — the lane where you actually touch untrusted code.


What it is, precisely

A stdio MCP server (Python, one pinned dependency) that orchestrates a pre-existing RE stack:

Backend

Used for

Ghidra (headless)

per-function decompilation, function inventory

re_triage.py (capa · floss · sink-ranking · angr)

full static triage → ranked suspicious functions

r2 / rizin

fast symbol/import/string inventory

jadx / apktool (native-lib path)

Android APK native .so triage

bubblewrap (bwrap)

the isolation chamber for untrusted samples

It contains no RE logic of its own — it is a thin, auditable bridge. That is a deliberate feature: the whole server is small enough to read in one sitting (~1,200 lines of own code).

MCP tools exposed

Tool

What it does

re_capabilities

health check: which backends are present + versions

analyze_binary

full host-side static triage of a native binary (own/in-scope)

sandbox_analyze_binary

same triage, isolated (no network, cgroup caps) — for untrusted samples

sandbox_selftest

live proof of the isolation guarantees (no analysis target needed)

decompile_function

one function → C via Ghidra

list_symbols

fast r2/rizin inventory (functions / imports / strings)

analyze_apk

Android native-lib triage (sandboxed by default)


Architecture & trust boundary

The server holds no RE logic; it validates input, picks the trusted vs. sandboxed path, and shells out to a pre-existing backend stack. The sandbox boundary is the product — everything below bubblewrap is treated as hostile when the sample is third-party.

flowchart TD
    A[MCP client / AI agent] -->|tool call + path| B[re_mcp.server]
    B --> V{_validate<br/>abs path, is-file, size cap}
    V -->|invalid| E[JSON error]
    V -->|valid| P{trusted or untrusted?}

    P -->|own / in-scope| H[analyze_binary<br/>host-side triage]
    P -->|untrusted| S[sandbox_analyze_binary]

    subgraph chamber[bubblewrap chamber: --unshare-all, caps dropped, host read-only, cgroup caps]
        S --> T[re_triage.py]
        T --> G[Ghidra headless]
        T --> C[capa / floss]
        T --> N[angr optional]
    end

    H --> T2[re_triage.py host-side]
    B --> R[list_symbols: r2 / rizin]
    B --> D[decompile_function: Ghidra]
    B --> K[analyze_apk: native .so, sandboxed]

    T --> O[(ranked JSON<br/>via /out, host-temp)]
    chamber -.no network, no host write.-> X((egress impossible))

Full data flow, properties, and the trust boundary: docs/architektur.md.


The security guarantees — proven in CI, not asserted

Every claim below has a test that fails the build if the guarantee breaks (tests/test_sandbox_isolation.py). The tests drive the shipped script (engine/sandbox_analyze.sh --selftest), not a hand-rolled command — so the guard covers the exact code the server runs. Removing --unshare-all from the shipped script turns the egress test red (verified by sabotage).

  • No egress. The chamber runs bwrap --unshare-all, which removes the network namespace. An outbound connection is not blocked by policy — it is structurally impossible. → test_shipped_script_blocks_egress

  • Host filesystem is read-only, except one throwaway /out (a mktemp dir) that is removed on exit; writes to host paths fail. → test_shipped_script_host_readonly

  • Resource caps. A cgroup MemoryMax + MemorySwapMax=0 makes a memory-bomb OOM-killed instead of taking the host down. → test_cgroup_memory_cap_enforced

  • The target is never executed. The pipeline is purely static; the sample is mounted read-only and analysed as data.

Run the proof yourself:

pip install -e ".[dev]"
pytest -v          # includes the isolation proof (needs bubblewrap)

Non-goal (stated honestly)

No custom seccomp-BPF filter is applied. bwrap applies none by default, and a wrong filter would silently break Ghidra/Python. Isolation here rests on namespaces (--unshare-all) + capability drop + read-only binds + cgroup limits — not on a syscall filter we cannot verify. A reviewed seccomp profile is possible future work, not a current claim.


Honest comparison vs. REA (morluto/rea)

The left column is measured by benchmark/run_benchmark.py on this repo (see benchmark/REPORT.md). The right column is from REA's public repo / README and our 2026-10-12 tool review — external, not measured here.

Dimension

airgap-re

REA (morluto/rea)

Tool breadth

native + APK-native (focused)

very broad — REA leads

Untrusted-sample isolation

bwrap no-net + cgroup, never executed

no sandbox; runtime paths run with your user rights

Runtime dependencies

1 direct (mcp) / 27 transitive

~35 npm (per our review — different counting basis)

Setup footprint

local; does not write into your agent config

npx … setup writes into ~/.claude

Auditability

~1,200 lines of own code

large tree (~2,255 files, per our review)

License

MIT

MIT

If you need the widest possible toolbox on trusted inputs, REA is a strong choice. If you need to analyse someone else's binary without handing it your privileges, this is built for that.


Install

git clone https://github.com/NEO849/airgap-re
cd airgap-re
python -m venv .venv && . .venv/bin/activate
pip install -e .

# System tools (analysis backends — bring your own, like any RE tool):
#   bubblewrap (required for the sandbox), radare2/rizin, Ghidra (headless),
#   optional: capa, floss, jadx, apktool, angr venv.
sudo apt-get install -y bubblewrap radare2

Register with your MCP client (stdio). Example ~/.claude.json fragment:

{
  "mcpServers": {
    "airgap-re": {
      "type": "stdio",
      "command": "/path/to/.venv/bin/python",
      "args": ["-m", "re_mcp.server"],
      "env": { "REMCP_GHIDRA_HEADLESS": "/opt/ghidra/support/analyzeHeadless" }
    }
  }
}

All paths auto-discover from PATH and common install locations; override any via REMCP_* environment variables (see re_mcp/config.py). Confirm the wiring with the re_capabilities tool — it reports which backends are present and their versions.


Usage (workflow)

  1. re_capabilities — see what's available.

  2. list_symbols — fast overview, pick targets.

  3. analyze_binary (own/in-scope) or sandbox_analyze_binary (untrusted) — ranked triage.

  4. decompile_function — read the candidates.

Untrusted / third-party samples always go through sandbox_analyze_binary.


Project layout

re_mcp/        server.py (MCP tools) · config.py (env/auto-discovery)
engine/        re_triage.py · sandbox_analyze.sh · apk_native_triage.sh · ghidra_scripts/
tests/         test_validate.py · test_sandbox_isolation.py (the proof)
benchmark/     run_benchmark.py → REPORT.md
docs/          architektur.md (data-flow diagram)

See docs/architektur.md for the data-flow and trust boundaries, THREAT_MODEL.md for what the sandbox does and does not defend against, and CONTRIBUTING.md to hack on it.

License

MIT — see LICENSE.

Available Tools

7 tools
analyze_apkA

Android-APK-Triage: zieht native Libs (lib//.so) und jagt jede durch re_triage.py (Ghidra-Dekompilat -> capa/floss -> Sink-Rang). Deckt die native Schicht ab, die jadx/apktool nicht sehen. 'arch' optional, z.B. 'arm64-v8a' (sonst alle). 'sandbox' (Default True): läuft in der bwrap-Kammer (keine Ausführung, kein Netz). READ-ONLY, entpackt nur, führt NICHTS aus der APK aus. Eigene / in-scope APKs.

ParametersJSON Schema
NameRequiredDescriptionDefault
archNo
pathYes
sandboxNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it discloses READ-ONLY, no execution of APK contents, no network, and that sandbox=True runs inside a bwrap chamber by default. It stops short of describing output shape or any resource/rate considerations, but the critical safety profile is fully covered.

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?

Dense but front-loaded: the tool's identity and pipeline come first, then per-parameter notes, then the safety guarantees. No sentence is padding, and the telegraphic style keeps the whole definition compact.

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 explained, and the description covers behavior, parameters, and scope. The one real gap is disambiguation from the closely related sibling tools (analyze_binary, sandbox_analyze_binary), which an agent would have to infer.

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 0%, so the description must compensate and largely does: 'arch' is documented as optional with an example value and an 'else all' default, and 'sandbox' is explained as default-True with its execution semantics. Only 'path' is left undocumented, but its meaning is self-evident from the required field name.

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 chain: extracts native libs (lib/*/*.so) and runs each through re_triage.py (Ghidra -> capa/floss -> sink rank), explicitly scoping to the native layer jadx/apktool miss. The purpose is unambiguous, but it never differentiates itself from actual siblings like analyze_binary or sandbox_analyze_binary.

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?

The closing line 'Eigene / in-scope APKs' implies an authorization scope, and the native-layer framing hints at when this tool applies versus static APK unpackers. However, it never explicitly states when to choose this over analyze_binary or sandbox_analyze_binary, so the routing guidance is only implied.

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

analyze_binaryA

Volle statische Triage eines nativen Binaries (ELF/PE/Mach-O/.so) HOST-seitig via re_triage.py: Ghidra-Dekompilat -> capa-Capabilities -> floss-Strings (opt) -> Sink-Rang -> angr (opt). Liefert strukturiertes JSON (Top-verdächtige Funktionen, Capabilities, Strings). READ-ONLY. Für EIGENE / in-scope / CTF-Binaries. Fremde/untrusted Samples -> sandbox_analyze_binary. Kann mehrere Minuten dauern (Ghidra-Analyse).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
flossNo
symbolicNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden and does well: it declares READ-ONLY, discloses the multi-minute Ghidra runtime, and enumerates the analysis steps. It stops short of stating auth requirements or failure modes, but the safety and duration profile is unusually complete.

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-loaded with the pipeline and followed by return summary, safety, routing, and runtime. It is dense but every line earns its place; only the pipeline detail is slightly verbose.

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 description still summarizes them. Combined with safety, routing, and duration disclosure, this is nearly complete for a 3-param analysis tool; only parameter documentation 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 0%, so the description must compensate. It partially does by mapping 'floss-Strings (opt)' and 'angr (opt)' to the floss and symbolic boolean toggles, but the required 'path' parameter and its expected format are never addressed.

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+resource ('Volle statische Triage eines nativen Binaries') and enumerates supported formats (ELF/PE/Mach-O/.so). The pipeline (Ghidra -> capa -> floss -> sink ranking -> angr) makes the tool's exact scope unambiguous and distinguishable from siblings like decompile_function or re_capabilities.

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

Usage Guidelines5/5

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

Explicit when-to-use ('Für EIGENE / in-scope / CTF-Binaries') and a named alternative for the excluded case ('Fremde/untrusted Samples -> sandbox_analyze_binary'). This routes the agent correctly without inference.

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

decompile_functionA

Dekompiliert GENAU EINE Funktion (nach Name oder Entry-Adresse 0x...) via Ghidra-headless -> C-Text + Signatur. 'function' z.B. 'main', 'check_license' oder '0x401160'. READ-ONLY. Kann einige Minuten dauern.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
functionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full disclosure burden and does reasonably well: it flags READ-ONLY, warns of multi-minute latency, and states the output format. It omits preconditions such as whether the binary must be loaded/analyzed first, so there is a remaining gap but the core behavioral profile 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.

Conciseness4/5

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

Compact and front-loaded: purpose, argument form, safety note, and latency caveat in three short clauses. Slightly dense with parenthetical asides, but no sentence is wasted.

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 description covers the important callable details (exactly one target, argument forms, read-only, runtime). The only real omission is the undefined 'path' parameter and any load prerequisite.

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 0%, so the description must compensate. It does this well for 'function' by explaining accepted forms ('main', 'check_license', '0x401160'), but 'path' is left completely undefined in both schema and description. Partial compensation justifies the baseline 3.

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 ('Dekompiliert GENAU EINE Funktion'), names the underlying mechanism (Ghidra-headless) and the output form (C-Text + Signatur). The 'GENAU EINE' scope explicitly distinguishes it from bulk siblings like analyze_binary or analyze_apk.

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?

It clarifies the cardinality constraint ('exactly one function') and how to identify the target (name or 0x entry address), which is genuine routing guidance. However, it never states when to reach for this versus list_symbols or analyze_binary, nor any prerequisite (e.g. needing symbols first). Usage is only implied.

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

list_symbolsA

Schnelles Inventar via r2/rizin (ohne Ghidra, Sekunden). kind = 'functions' | 'imports' | 'strings'. Gut für den ersten Überblick / um Ziele für decompile_function zu finden. READ-ONLY.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNofunctions
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose two useful traits: it is READ-ONLY and fast (r2/rizin, seconds, no Ghidra). It does not mention output size limits, truncation, or failure modes for invalid paths, so the behavioral picture is only partially filled in.

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 telegraphic fragments, front-loaded with what the tool is and what it returns. Nothing is padded, though the clipped style costs a little 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?

An output schema exists, so return-value documentation is unnecessary, and the description supplies the allowed kind values, the read-only guarantee, and the intended workflow position. Only minor gaps remain around path semantics and result limits.

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 0% and the kind parameter has no enum, so the description's explicit 'kind = functions | imports | strings' is the only source of allowed values and is essential. The path parameter is left unexplained, but its meaning is obvious.

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 concrete resource (symbol inventory via r2/rizin, no Ghidra, seconds) and enumerates the three kinds of symbols it can return. It also implicitly distinguishes itself from the heavier sibling decompile_function, though it doesn't contrast with analyze_binary or analyze_apk.

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?

"Gut für den ersten Überblick / um Ziele für decompile_function zu finden" gives an explicit first-pass recon role and names the natural follow-up tool. It stops short of stating when NOT to use it (e.g., when decompilation or full analysis is needed instead).

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

re_capabilitiesA

Health-Check: welche RE-Backends sind verfügbar (Ghidra/r2/capa/floss/angr/jadx/apktool/bwrap)

  • Versionen. Immer zuerst aufrufen, wenn unklar ist, was geht.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden, and it does disclose the operation class (health check) and the returned content (available backends plus versions), implying a read-only, side-effect-free probe. It says nothing about permissions, latency, or failure behavior, but for a zero-argument probe the core behavior is well conveyed.

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?

Two short, front-loaded sentences with no filler: the first names the operation and output, the second states when to invoke it. Every clause earns its place.

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 the description need not explain return values, and with zero parameters there is no input semantics to cover. Purpose plus invocation timing is all an agent needs, and both are present.

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 per the rubric the baseline is 4; there is nothing for the description to disambiguate beyond that.

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 purpose: a health check that reports which reverse-engineering backends are available and their versions, and it enumerates those backends (Ghidra/r2/capa/floss/angr/jadx/apktool/bwrap). It is clear on its own, but it does not distinguish itself from the overlapping sibling sandbox_selftest, which is also a self-diagnostic tool.

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?

"Immer zuerst aufrufen, wenn unklar ist, was geht" gives an explicit trigger condition (call first, when the available tooling is unclear). It provides clear usage context but no explicit exclusions or named alternatives, so it falls just short of the top band.

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

sandbox_analyze_binaryA

Wie analyze_binary, aber ISOLIERT in einer bubblewrap-Wegwerfkammer: --unshare-all (KEIN Netz -> Egress strukturell unmöglich), keine Capabilities, cgroup Mem/PID/CPU-Limits, Host read-only, kein Host-Secret. Für UNTRUSTED / fremde Samples. Braucht bwrap (bubblewrap). READ-ONLY, Ziel wird NIE ausgeführt.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
flossNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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

No annotations provided, so the description carries the full burden and it delivers richly: unshare-all with no network, no capabilities, cgroup Mem/PID/CPU limits, read-only host, no host secrets, requires bwrap, target never executed. That covers safety profile, resource limits, prerequisites, and non-execution semantics — far beyond a typical tool description.

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-loaded with the key differentiator (ISOLIERT / bubblewrap), then a tight list of isolation properties, then the usage condition. Slightly dense with jargon but no wasted sentences.

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?

Behavioral and usage context is complete, and output schema covers returns. But with 0% parameter description coverage and no mention of path/floss semantics or the bwrap dependency failing, an agent calling this could be surprised. Adequate but with a clear gap.

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 0% for both parameters, so the description should compensate but does not mention path or floss at all. However, the parameter names are self-explanatory (path, floss boolean) and the output schema exists. Baseline 3 for partially self-documenting params with no description support.

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 (sandbox_analyze_binary = analyze a binary isolated), and explicitly contrasts with sibling analyze_binary ('Wie analyze_binary, aber ISOLIERT...'). But it's phrased as a comparison and the actual analysis performed is never enumerated; an agent knows it's analysis-in-a-sandbox but not what output to expect beyond the output schema.

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

Usage Guidelines5/5

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

Explicit routing rule: 'Für UNTRUSTED / fremde Samples' tells exactly when to prefer this over analyze_binary. The rest of the sentence describes the isolation guarantees that select this tool. Nothing left to inference.

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

sandbox_selftestA

Beweist LIVE die Isolations-Garantien der AUSGELIEFERTEN Sandbox (keine Analyse eines Ziels): ruft exakt engine/sandbox_analyze.sh --selftest auf — denselben bwrap-Aufbau (inkl. --unshare-all) wie die echte Analyse. (1) Netz-Zugriff schlägt fehl, (2) Host-Schreiben scheitert. PASS/FAIL je Check.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden and does so well: it names the exact invoked script and bwrap setup, and enumerates the two behaviors verified (network access fails, host writes fail) plus the PASS/FAIL-per-check output shape. It omits runtime/duration and any side effects of the selftest itself, keeping it at 4.

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 and the target-analysis exclusion are front-loaded, then the mechanism, then the enumerated checks. It is dense but every clause earns its place; only slight verbosity in the German compound phrasing keeps it from a 5.

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 an output schema present, the description need not explain return values, and it still previews the PASS/FAIL-per-check result format. For a zero-parameter verification tool, nothing an agent needs in order to decide or call it is missing.

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 the schema is trivially complete (100% coverage, empty properties) and the description has nothing to compensate for. Baseline 4 applies for a parameterless tool.

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+resource ("Beweist LIVE die Isolations-Garantien der AUSGELIEFERTEN Sandbox") and immediately scopes it against siblings with "keine Analyse eines Ziels", so an agent can distinguish it from sandbox_analyze_binary and the other analysis tools without opening a schema.

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 parenthetical "keine Analyse eines Ziels" tells the agent when this tool is NOT the right choice (target analysis), which routes it toward the analyze_* siblings. It stops short of explicitly naming an alternative or stating the trigger condition (e.g. "run after deploying the sandbox"), so a 4 rather than 5.

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. 7 tool updatesv0.1.0
    • First observedanalyze_apk
    • First observedanalyze_binary
    • First observeddecompile_function
    • First observedlist_symbols
    • First observedre_capabilities
    • First observedsandbox_analyze_binary
    • First observedsandbox_selftest

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation4/5

Most tools target clearly distinct operations (capability check, symbol inventory, single-function decompile, full triage, APK triage, sandbox selftest). The main ambiguity is analyze_binary vs sandbox_analyze_binary, whose names are nearly identical, but descriptions strongly disambiguate them via the host-vs-untrusted-sample rule. decompile_function also overlaps with the decompilation phase inside analyze_binary, though its single-target scope keeps it separable.

Naming Consistency4/5

Names follow a mostly predictable snake_case verb_noun pattern (decompile_function, list_symbols, analyze_binary, analyze_apk, sandbox_selftest). The sandbox_ prefix is used consistently as a qualifier. The only deviation is re_capabilities, which is a noun phrase with a domain prefix rather than a verb_noun action.

Tool Count5/5

Seven tools is well-scoped for a reverse-engineering server: each covers a distinct stage (backend discovery, fast inventory, targeted decompile, full host triage, sandboxed triage, sandbox verification, APK triage). No obvious redundancy or filler tools.

Completeness4/5

The surface covers the core static RE workflow: discover backends, inventory symbols, decompile a function, run full triage, and do so safely in a sandbox for untrusted samples including APKs. Minor gaps remain, e.g. no explicit cross-reference/call-graph query, no disassembly view, and no dynamic execution, but these are reasonable omissions for a static, read-only toolset.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables local AI models to perform defensive cybersecurity analysis through narrowly scoped read-only tools for host posture, Windows security operations, file/IOC triage, code scanning, and allowlisted filesystem/network access while enforcing boundaries and audit trails.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to run hardened, read-only radare2-based static binary triage tools, including disassembly, cross-reference following, string decoding, function renaming, and evidence-checked report generation without executing the sample.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to run cybersecurity reconnaissance and analysis tools through controlled containerized sandboxes, with input validation, policy allowlists, timeouts, structured JSON output, and immutable audit logging.
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables agents to reverse-engineer software across native binaries, managed code, Electron apps, websites, and live runtime behavior, returning findings linked to the evidence and limitations behind each conclusion. It also maintains a durable workspace where those behaviors can be inspected, questioned, compared against real execution, and exported as runnable handoffs.
    231,579 npm
    MIT