Skip to main content
Glama
Perufitlife

web-exposure-mcp

by Perufitlife
README.md
# web-exposure-mcp

> An **MCP server** that lets an AI agent point at a **live deployed URL** and confirm whether sensitive files are actually being served to the public β€” exposed `.git`, `.env` secrets, JavaScript source maps, backup/SQL dumps, directory listing, and dotfiles β€” by **fetching the bytes and validating the content**. Other tools give you a checklist of *maybes*; this reports only what is genuinely reachable, with evidence.

> ⚑ **Run it in one line, no install, no API key:**
> ```bash
> npx web-exposure-mcp        # MCP server (stdio) for your AI client
> npx -p web-exposure-mcp web-exposure-scan --url https://your-site.com   # one-shot CLI
> ```

> 🀝 **Want it done for you?** [Fixed-scope external-exposure audit β€” $99 / 24h](https://buy.stripe.com/3cIeVdgikfj47yx9LkcAo0m): I verify every finding live and send a written report with the exact fixes and which credentials to rotate.

[![npm](https://img.shields.io/npm/v/web-exposure-mcp?color=red)](https://www.npmjs.com/package/web-exposure-mcp) [![downloads](https://img.shields.io/npm/dw/web-exposure-mcp)](https://www.npmjs.com/package/web-exposure-mcp) ![license](https://img.shields.io/badge/license-MIT-green) ![node](https://img.shields.io/badge/node-%3E%3D18-blue) ![deps](https://img.shields.io/badge/dependencies-0-brightgreen)

```
$ npx -p web-exposure-mcp web-exposure-scan --url https://demo.example.com
2 critical, 2 high, 1 medium β€” 5 CONFIRMED via anonymous fetch (39 requests)
  CRITICAL  /.git/config   valid .git served β€” full source history downloadable
  CRITICAL  /.env          5 env vars served β€” API_KEY, DATABASE_URL, JWT_SECRET…
  HIGH      /main.js.map   valid source map β€” 142 original sources reconstructable
  HIGH      /backup.sql    SQL dump content served
  MEDIUM    /uploads/      directory listing enabled (Index of /uploads)
```

## Why this exists

Publicly-served `.git` and `.env` files are routinely called *one of the most
common high-impact findings in external attack-surface management* β€” Acunetix,
Invicti and Legba all ship dedicated detections, and live HackerOne reports for
exposed `.git`/`.env` are filed continuously. June 2026 saw record
leaked-credential dumps, a large share sourced from **live, misconfigured
servers** rather than breached databases.

The MCP ecosystem already covers SSL, CORS, security-headers, SEO audits, and
**code/commit** secret scanning (GitHub MCP, GitGuardian) β€” but **no MCP server
probes a *deployed URL* for publicly-served secret files.** This fills that gap:
your agent can audit the live edge of any deployment, the way an attacker
actually sees it.

The hard part isn't requesting `/.env` β€” it's avoiding false positives. Most
modern sites answer `200 OK` with `index.html` for *every* unknown path (SPA
catch-all). `web-exposure-mcp` therefore **reads the bytes and fingerprints the
content** (e.g. `.git/config` must parse as a git config, `.env` must contain
`KEY=VALUE` secret lines, an archive must start with the real magic bytes) β€”
so it flags facts, not guesses.

## Tools (MCP)

| Tool | What it does |
|---|---|
| `scan_web_exposure` | Probe a live URL and return only the secret files genuinely served, with evidence. Args: `url` (required), `only` (optional check filter), `timeout_ms`. |
| `list_exposure_checks` | List every check id, severity and the paths it probes β€” feed ids into `only`. |

## What it confirms

| Check id | Severity | Confirmed by |
|---|---|---|
| `git_exposed` | critical | `/.git/config` parses as a git config, or `/.git/HEAD` is a valid ref/sha |
| `env_exposed` | critical | dotenv served with β‰₯2 `KEY=VALUE` secret lines (not HTML) |
| `source_map` | high | `.js.map` parses as a source map with a `sources[]` array |
| `backup_artifact` | high | SQL-dump fingerprints, or ZIP/gzip **magic bytes** in the body |
| `directory_listing` | medium | the autoindex signature (`Index of /…`) is returned |
| `dotfile_served` | high | `.htpasswd` hashes, `.npmrc`/`.netrc` tokens, `.aws/credentials`, `.ssh/id_rsa`, `.DS_Store`, docker auth |

Every check fires **at most once** and only when the served bytes prove it.
Read-only: the scanner never writes anything to the target, follows no
redirects into other hosts, and reads at most 64 KB per file (so it fingerprints
a multi-GB backup without downloading it).

## Add to your AI client

Claude Desktop / Cursor / any MCP client β€” add to your `mcpServers` config:

```json
{
  "mcpServers": {
    "web-exposure": {
      "command": "npx",
      "args": ["-y", "web-exposure-mcp"]
    }
  }
}
```

Then ask your agent: *β€œScan https://staging.myapp.com for publicly exposed
secret files.”*

## CLI usage

```bash
# Probe a live deployment
npx -p web-exposure-mcp web-exposure-scan --url https://your-site.com

# Run only specific checks
npx -p web-exposure-mcp web-exposure-scan --url https://your-site.com --only git_exposed,env_exposed

# Tighter per-request timeout
npx -p web-exposure-mcp web-exposure-scan --url https://your-site.com --timeout 8000
```

Output is JSON on stdout (pipe into CI) and a one-line summary on stderr.

## Install (optional)

```bash
npm i -g web-exposure-mcp
web-exposure-mcp                       # start the MCP server (stdio)
web-exposure-scan --url https://site.com   # one-shot scan
```

Zero dependencies, pure Node β‰₯18. Every request goes straight from the tool to
the target you name β€” nothing leaves your machine.

## Sister tools

Same active-probe philosophy β€” confirm the real issue by fetching it, not by
trusting a checklist. All MIT:

[supabase-security](https://github.com/Perufitlife/supabase-security-skill) Β·
[strapi-security](https://github.com/Perufitlife/strapi-security) Β·
[pocketbase-security](https://github.com/Perufitlife/pocketbase-security-skill) Β·
[firebase-security](https://github.com/Perufitlife/firebase-security-skill) Β·
[appwrite-security](https://github.com/Perufitlife/appwrite-security-skill) Β·
[nhost-security](https://github.com/Perufitlife/nhost-security-skill)

## License

MIT Β© [Renzo Madueno](https://github.com/Perufitlife)

---

πŸ“š Part of [**Awesome Backend Security Auditors**](https://github.com/Perufitlife/awesome-backend-security) β€” the full collection of keyless active-probe auditors.

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools are entirely distinct: one lists available checks, the other runs the scan. There is no overlap or ambiguity.

Naming Consistency5/5

Both tools follow the consistent verb_noun pattern (list_exposure_checks, scan_web_exposure), making their purpose immediately clear.

Tool Count4/5

With only two tools, the server is minimal but well-scoped. Each tool serves a clear function; no superfluous or missing core operations.

Completeness5/5

The tool set covers the full workflow: discover available checks, then run a targeted scan. No obvious gaps for the stated purpose of checking web exposure.

Maintenance

ActivityStale
ResponsivenessNo issues