Skip to main content
Glama

Vestige

Evidence-driven reverse engineering for AI agents.

An open, independent MCP platform that lets compatible AI coding agents inspect authorized software artifacts, investigate their structure, and produce verifiable, evidence-linked technical reports.

CI Node.js TypeScript MCP License: MIT


Why Vestige

Most analysis tools answer questions. Vestige answers questions with receipts: every claim an agent makes about a binary or application is backed by a content-addressed evidence record that is re-authenticated whenever it is read. Accuracy is treated as a measurable engineering objective — benchmarks run against deterministic fixtures with embedded ground truth, and the results ship in docs/BENCHMARKS.md only after actually running.

Vestige is an independent project — inspired by the engineering patterns of morluto/rea (MIT), but with its own architecture, implementation, identity, and test suite. See docs/ASSESSMENT-REA.md for the full reference assessment and the improvement matrix that motivated this design.

Related MCP server: REA

Quick start

# Requires Node.js >= 20.19 (tested on 24.x)
npm install
npm run build
npm test          # 137+ tests: unit, integration, security, regression, e2e

# Register a target and analyze it via the CLI
node dist/cli/main.js register ./path/to/app --label "sample app"
node dist/cli/main.js providers
node dist/cli/main.js analyze <artifactId> --provider javascript
node dist/cli/main.js findings <artifactId>
node dist/cli/main.js doctor

MCP client configuration

stdio (recommended for local agents):

{
  "mcpServers": {
    "vestige": {
      "command": "node",
      "args": ["/absolute/path/to/vestige/dist/cli/main.js", "mcp"],
      "env": {
        "VESTIGE_DATA_DIR": "/absolute/path/to/vestige-data",
        "VESTIGE_LOG_LEVEL": "info"
      }
    }
  }
}

Streamable HTTP (opt-in, remote deployments):

VESTIGE_HTTP_TOKEN=$(openssl rand -hex 32) \
VESTIGE_HTTP_HOST=0.0.0.0 VESTIGE_HTTP_PORT=8420 \
node dist/cli/main.js mcp --http

HTTP requires a bearer token for any non-loopback bind (constant-time compared), validates Host headers against an allowlist (DNS-rebinding defense), and rejects disallowed Origins. Clients connect to http://host:8420/mcp with Authorization: Bearer <token>.

What it can analyze (today, with tests)

Provider

Formats

Capabilities

External tool?

javascript

JS/TS sources, directories, Electron apps

AST module graph (imports/exports/requires/dynamic), Electron IPC channels, express-style route inventory, manifest/dependency facts

No (in-process acorn)

native

ELF (32/64), PE (PE32/PE32+), Mach-O (incl. FAT)

Headers, sections, symbols/functions, PE imports & exports, Mach-O dylibs, strings with offsets

No (pure TypeScript)

ghidra

ELF, PE, Mach-O

Headless decompilation, function inventory, call graph

Yes — Ghidra 11.x + Java 21+ (optional; availability-checked with install guidance)

Unsupported formats are rejected honestly: Vestige never advertises a capability it cannot demonstrate. Provider availability is always queryable (vestige_list_providers, vestige doctor) and includes actionable installation guidance.

Evidence model

Every significant finding carries:

  • Finding ID (vf_…) and Evidence ID (ve_…) — content-derived, tamper-checked on read

  • Target artifact ID + SHA-256 commitment taken at registration

  • Provider name/version and external tool version when applicable

  • Method used to obtain the observation, timestamp, and typed location (file offset / virtual address / artifact path / section)

  • Confidence class with explicit semantics: observed-fact · static-inference · runtime-observation · ai-interpretation · hypothesis

  • Limitations declared up front by the provider

Evidence is stored content-addressed; re-analysis of identical content is served from a verified cache. Reports (markdown/JSON) are deterministic and reproducible.

Safety by default

  • Explicit registration required — nothing is analyzed unless the operator registered it

  • Read-only analysis — original artifacts are never modified; generated files live in an isolated workspace

  • Canonical path validation — realpath resolution, symlink policy, allowed-roots enforcement, traversal rejection

  • Never executes unknown targets — runtime observation is not implemented in v0.1 by design; static analysis is preferred

  • Shell-free process execution — argv arrays only, output caps, hard timeouts, SIGTERM→SIGKILL stop ladder, abort support

  • Central redaction — logs and captured output pass a secret-scrubbing layer before persistence

See docs/THREAT-MODEL.md and SECURITY.md.

Architecture (60-second tour)

graph TD
    CLI["CLI (src/cli)"] --> PLAT["Composition root (src/server/context.ts)"]
    MCP["MCP server (src/server): stdio + streamable HTTP"] --> PLAT
    subgraph services["Application services (src/services)"]
        AN["AnalysisService<br/>jobs · cache · routing"]
        TR["TargetRegistry<br/>admission + SHA-256 commitment"]
        ER["EvidenceStore<br/>content-addressed objects"]
        PR["ProviderRegistry<br/>capabilities + availability"]
    end
    PLAT --> services
    AN --> PROV
    subgraph PROV["Providers (src/providers) — depend on interfaces only"]
        JS["javascript<br/>acorn AST"]
        NAT["native<br/>ELF · PE · Mach-O"]
        GHI["ghidra<br/>headless bridge"]
    end
    PROV --> SEC["security: PathGuard · Workspace"]
    PROV --> PROC["process: runBounded (shell-free, bounded)"]
    PROV --> DOM["domain: Zod contracts · evidence · findings"]

Full details, module boundaries, and dependency rules: docs/ARCHITECTURE.md.

Documentation

Document

Contents

docs/ARCHITECTURE.md

Modules, dependency direction, data flow

docs/MCP-CONTRACTS.md

Tool/resource/prompt reference with schemas

docs/PROVIDERS.md

Provider guides, Ghidra setup, troubleshooting

docs/THREAT-MODEL.md

Assets, attackers, mitigations, residual risks

docs/BENCHMARKS.md

Measured accuracy & latency (from actual runs)

docs/COMPATIBILITY.md

Tested vs intended platform support

docs/ASSESSMENT-REA.md

Reference repository assessment & improvement matrix

SECURITY.md

Security policy and responsible use

CHANGELOG.md

Version history

CONTRIBUTING.md

Development workflow and quality gates

Verification status (this checkout)

The following were actually executed in the development environment (Linux x64, Node 24.22.1):

Gate

Command

Result

Type check

npm run typecheck

✅ pass (strict)

Build

npm run build

✅ pass

Tests

npm test

✅ 137 passed / 0 failed (unit 62, integration 17, security 12, regression 5, e2e 1, fixtures & parsers 40)

Benchmarks

npm run bench:record

✅ recorded in docs/BENCHMARKS.md

Platform notes: Windows and macOS are intended targets with platform-neutral code paths, but only Linux was exercised in this checkout — see docs/COMPATIBILITY.md.

License

MIT — see LICENSE. Third-party notices: THIRD_PARTY_NOTICES.md. Vestige is not affiliated with, endorsed by, or an official release of the REA project.

Available Tools

11 tools
vestige_analyzeStart analysis jobA
Read-only

Start an asynchronous analysis job on a registered target. Returns a jobId immediately; poll vestige_job_status. Progress notifications are sent when the client supplies a progressToken in _meta.

Inputs: artifactId (required), provider, capabilities.

vestige_diagnosticsRun self-diagnosticsA
Read-only

Report versions, configuration facts, data directories, and provider availability. Never contains secrets.

Inputs: no named parameters.

vestige_export_reportExport analysis reportB
Read-only

Export a deterministic markdown or JSON report for a target into the Vestige workspace and return its absolute path.

Inputs: artifactId (required), format.

vestige_get_evidenceGet evidence recordA
Read-only

Fetch one evidence record by id. Records are re-authenticated against their content digest before being served.

Inputs: evidenceId (required).

vestige_get_targetGet target metadataC
Read-only

Get one registered target's metadata plus which providers support it.

Inputs: artifactId (required).

vestige_job_cancelCancel analysis jobB
Read-only

Cancel a queued or running analysis job. Evidence already persisted is retained and the job becomes 'cancelled'.

Inputs: jobId (required).

vestige_job_statusGet job statusB
Read-only

Get the status, progress, and result counts of an analysis job.

Inputs: jobId (required).

vestige_list_findingsList findingsB
Read-only

List evidence-linked findings for a target, optionally filtered by kind or confidence, with pagination.

Inputs: artifactId (required), kind, limit, offset, +1 more.

vestige_list_providersList analysis providersA
Read-only

List providers with capabilities and live availability (including installation guidance when a tool like Ghidra is missing).

Inputs: no named parameters.

vestige_list_targetsList registered targetsA
Read-only

List all registered analysis targets with identity digests.

Inputs: no named parameters.

vestige_register_targetRegister analysis targetA
Read-only

Register a file or directory for analysis. Validates the path (canonicalization, symlink policy, allowed roots), computes SHA-256, and identifies the format. Read-only: the artifact is never modified.

Inputs: path (required), label.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 11 tools

    Disambiguation5/5

    Each tool targets a distinct resource or action: target registration/listing/retrieval, provider discovery, asynchronous analysis, job status/cancellation, findings listing, evidence retrieval, report export, and diagnostics. Boundaries are clear, especially between starting an analysis and checking its job status.

    Naming Consistency4/5

    Most tools use the consistent vestige_ prefix with verb_noun naming (register_target, list_targets, get_target, list_providers, list_findings, get_evidence, export_report). Minor deviations appear in vestige_analyze, vestige_diagnostics, and noun-first job operations (vestige_job_status, vestige_job_cancel), but the set remains predictable.

    Tool Count5/5

    Eleven tools is well-scoped for an artifact analysis workflow, covering registration, provider discovery, asynchronous job control, findings/evidence access, reporting, and diagnostics without obvious padding.

    Completeness4/5

    The surface covers the core lifecycle from target registration through analysis, job monitoring, evidence/finding inspection, and report export. Minor gaps exist around target lifecycle management such as unregistering/removing registered targets, but agents can work around this.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI clients to inspect local software structure, code, and runtime behavior through evidence-backed analysis, including sources, coverage, and limitations.
      1
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI agents to inspect and reverse engineer local software targets, including binaries, JavaScript/Electron apps, .NET assemblies, and websites, returning evidence-backed findings for understanding and building similar features.
      362,686 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables MCP-compatible AI assistants to inspect local application internals by analyzing JavaScript/Electron/ASAR and .NET artifacts, tracing dependencies, interfaces, and data flows, and preserving traceable evidence.
      14
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Connects AI agents to local analysis tools that inspect native binaries, JavaScript/Electron apps, .NET assemblies, and websites without source code, so features can be explained, traced, and rebuilt. Every finding is returned with its supporting evidence and stated limitations.
      362,686 npm
      1
      MIT