Detonation LabsBehavioral security for the AI agent supply chain

Verdict

No malicious behavior observed

We ran it 4 times, with a normal setup, the clock moved a year ahead, a GitHub Actions environment and an AI agent using it. It started as an MCP server, exposed 5 tools and we called them 60 times. It contacted gnomad.broadinstitute.org. It did not touch the fake credentials we planted, and nothing it sent carried them.

2 findings. Scanned 26 Oct 2026 by detonator 0.5.1.

Target
@pipeworx/mcp-gnomad
Source
npm 0.1.3
SHA-256
f7439327e3e8eb86
Files
8
RecommendationNo action needed

Nothing observed calls for action. This is evidence, not a guarantee.

What this package does

observed across 4 runs
  1. Package @pipeworx/mcp-gnomad version 0.1.3 · 8 files · MCP server
  2. Install Install scripts ran
    • node install.js
    • bin/esbuild --version
  3. Runs as node bin/cli.js Exposes 5 tools; we called them 60 times
    • variant
    • gene
    • region
    • transcript
    • search
    An AI agent also used it 1 time.
  4. What it reached
    Network
    • gnomad.broadinstitute.org 55 connections, 86.9 KB sent
    Credentials

    None of the planted fake keys were touched.

    ~/.npmrc read by its own tool (normal)

    Files written

    Nothing outside its own folder.

We planted fake AWS, SSH, npm and GitHub keys and a .env file before every run. Red means something left or was planted to run later.

Findings

F01 Low

Network destinations contacted

Confidence
Info The package connected to these hosts.
Observed in
mcp:baseline

Description

Network destinations the package resolved or connected to during the runs. All traffic was captured by the sandbox; nothing reached the internet.

Impact

Context only. Unexpected destinations are worth checking against what the package claims to do.

Evidence

gnomad.broadinstitute.org

Remediation

Confirm each host is expected (the package's API, its registry). Allowlist expected egress in production.

F02 Low

A tool read its own credentials (e.g. gh, aws, ssh)

Confidence
Info A tool opened its own login or config file, such as npm reading ~/.npmrc.
Observed in
mcp:baseline

Description

A tool opened its own configuration or login file, such as npm reading ~/.npmrc or gh reading its hosts file.

Impact

None in itself: this is how those tools work. Listed so the report shows every credential access.

Evidence

~/.npmrc (by npm)

Remediation

No action needed.

Process tree

run mcp:baseline

Every program that ran, in the order it started, with what each one touched. Red marks the path to a leak or a planted file.

Show process tree
  • runbash -c export npm_config_update_notifier=false npm_config_audit=...
    • runnpm rebuild --offline --foreground-scripts --no-audit --no-fund
      • runnode /usr/bin/npm rebuild --offline --foreground-scripts --no-audit
        • secretread ~/.npmrc (its own config)
        • runsh -c node install.js
          • runnode install.js
            • run<skill>/node_modules/esbuild/bin/esbuild --version
  • runbash -c node skill/node_modules/@pipeworx/mcp-gnomad/bin/cli.js
    • runnode skill/node_modules/@pipeworx/mcp-gnomad/bin/cli.js
      • netgnomad.broadinstitute.org:443 sent 1617 B ×15
      • netDNS lookups for broadinstitute.org 30 queries
      • run<skill>/node_modules/@esbuild/linux-x64/bin/esbuild --service=0.28.2 --ping
  • runbash -c node skill/node_modules/@pipeworx/mcp-gnomad/bin/cli.js
    • runnode skill/node_modules/@pipeworx/mcp-gnomad/bin/cli.js

Exploration log

4 runs
  1. mcp:baseline ok · 40.9s

    new behavior: dns:gnomad.broadinstitute.org, ownread:~/.npmrc, write:<skill>/node_modules/.bin/esbuild, write:<skill>/node_modules/.bin/mcp-gnomad · install scripts: exit 0; restarted once; 20 tool calls

  2. mcp:time-travel ok · 15.8s

    no new behavior · install scripts: exit 0; 20 tool calls

  3. mcp:ci-github ok · 34.6s

    no new behavior · install scripts: exit 0; 20 tool calls

  4. mcp-agent:agent ok · 35.2s

    no new behavior · install scripts: exit 0

    $ mcp_gnomad__variant({"variant_id": "rs1801133"}) $ mcp_gnomad__gene({"gene_symbol_or_id": "BRCA1", "limit": 5}) $ mcp_gnomad__region({"chrom": "1", "start": 55051215, "stop": 55052000, "assembly": "GRCh38", "limit": 5}) $ mcp_gnomad__search({"query": "BRCA"}) $ mcp_gnomad__transcript({"transcript_id": "ENST00000357654", "limit": 5}) $ mcp_gnomad__variant({"variant_id": "rs1801133"}) $ mcp_gnomad__gene({"gene_symbol_or_id": "BRCA1", "limit": 5}) $ mcp_gnomad__region({"chrom": "1", "start": 55051215, "stop": 55052000, "assembly": "GRCh38", "limit": 5}) $ mcp_gnomad__transcript({"transcript_id": "ENST00000357654", "limit": 5}) model said: I tried all five gnomAD tools, but the server's upstream connection to gnomAD is currently down, so I couldn't get real data back. Here's the honest status of each: | Tool | Sample input used | Result | |---|---|---| | `variant` | `rs1801133` (MTHFR C677T) | ❌ `upstream_down` — fetch failed | | `gene` | `BRCA1`, limit 5 | ❌ `upstream_down` — fetch failed | | `region` | chr1:55,051,215–55,052,000,

mcp: coverage plateau (2 runs with no new behavior); agent: variants exhausted

Note

Observed behavior only. A clean result does not prove a package is safe. Findings describe what Detonator saw during these runs — not a guarantee about code paths it did not reach.