Sign inSign up

moondoom/appsecgate-mcp

By moondoom

•Updated about 12 hours ago

Local-first AppSec MCP server for AI agents. Scans code offline, no LLM calls.

Image
Security
Integration & delivery
Developer tools
1

170

moondoom/appsecgate-mcp repository overview

⁠AppSecGate MCP

Local-first security scanning for AI coding agents.

AI agents ship code faster than security can review it. AppSecGate is an MCP server that scans files, diffs, and whole projects right inside Claude Code, Cursor, Cline, or Continue — offline, without sending your code anywhere.

Findings are normalized, deduplicated by fingerprint, tracked between scans, and returned to the agent as fix contexts. The server itself never calls an LLM.

⁠What it does

  • Scans with Semgrep (SAST), Gitleaks + TruffleHog (secrets), and Trivy (SCA) — all bundled, no network access needed.
  • Normalizes and deduplicates findings by deterministic fingerprint across scans.
  • Tracks shown findings in shown_findings.db — so CI can later distinguish "new" from "ignored".
  • Returns fix contexts to your agent via get_fix_context and verifies fixes via verify_fix. The server only ships data, never prompts.
  • Runs offline — --network=none, no outbound calls, ever.

⁠When to use

  • You build with an AI agent (Claude Code, Cursor, Cline, Continue) and want every diff scanned before it lands.
  • You want findings tracked across scans, not a pile of reports.
  • You need to stay offline: no code leaves your machine.
  • You want your agent to see the context needed to fix a finding and to verify the fix later.

⁠When NOT to use

  • You need CI blocking — Phase 1 is warn-only locally. CI gating comes in Phase 2.
  • You need centralized policy, team dashboards, or ASOC sync — that is the Master Server (Phase 2).
  • You need large-scale GUI triage.

⁠Quick Start

Pull the image:

docker pull moondoom/appsecgate-mcp:0.1.0
⁠Cline

Add to ~/.cline/data/settings/cline_mcp_settings.json:

{
  "mcpServers": {
    "appsecgate": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "--rm", "-i", "--network=none", "--read-only",
        "--tmpfs=/tmp:size=100M,mode=1777", "--cap-drop=ALL",
        "--security-opt=no-new-privileges:true",
        "-v", "/absolute/path/to/your/project:/workspace:ro",
        "-v", "appsecgate-cache:/home/appsecgate/.cache",
        "-v", "appsecgate-data:/home/appsecgate/.appsecgate-mcp",
        "moondoom/appsecgate-mcp:0.1.0",
        "--transport", "stdio", "--project", "/workspace"
      ],
      "disabled": false,
      "timeout": 600
    }
  }
}
⁠Cursor

Add to <project>/.cursor/mcp.json:

{
  "mcpServers": {
    "appsecgate": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i", "--network=none", "--read-only",
        "--tmpfs=/tmp:size=100M,mode=1777", "--cap-drop=ALL",
        "--security-opt=no-new-privileges:true",
        "-v", ".:/workspace:ro",
        "-v", "appsecgate-cache:/home/appsecgate/.cache",
        "-v", "appsecgate-data:/home/appsecgate/.appsecgate-mcp",
        "moondoom/appsecgate-mcp:0.1.0",
        "--transport", "stdio", "--project", "/workspace"
      ]
    }
  }
}
⁠Claude Code
claude mcp add appsecgate -- docker run --rm -i --network=none --read-only \
  --tmpfs=/tmp:size=100M,mode=1777 --cap-drop=ALL \
  --security-opt=no-new-privileges:true \
  -v .:/workspace:ro \
  -v appsecgate-cache:/home/appsecgate/.cache \
  -v appsecgate-data:/home/appsecgate/.appsecgate-mcp \
  moondoom/appsecgate-mcp:0.1.0 --transport stdio --project /workspace

Full configs for all four clients (including Continue) and troubleshooting: https://github.com/moondoom/appsecgate-mcp/blob/main/docs/deploy-agents.md⁠

⁠Verify the install

Restart your client, then call get_config or scan_file on any file. Tools appear with the mcp__appsecgate__ prefix.

⁠MCP tools (14)

  • scan_file — scan a single file and return normalized findings.
  • scan_diff — scan staged + unstaged + untracked changes in the current git repository.
  • scan_project — scan the entire project or a specific directory inside it.
  • get_fix_context — return the ContextPack for a finding (finding + code window + rule doc).
  • get_fix_context_batch — return ContextPacks for multiple findings (limit 20).
  • verify_fix — verify a single finding: rescan the file and match by logical ID.
  • verify_fix_batch — verify up to 20 findings; each file is rescanned once.
  • query_findings_db — read-only SELECT on public views (v_findings, v_summary, v_projects).
  • export_snapshot — export a snapshot of findings in ndjson format (parquet — Phase 2).
  • get_config — return the active (merged) session configuration.
  • update_config — deep-merge updates into .appsecgate-mcp/config.yaml and reload the session.
  • submit_feedback — submit feedback on a finding (FALSE_POSITIVE / CONFIRMED / WONT_FIX).
  • get_scan_history — return the shown findings log (shown_findings.db) with verification attempts.
  • suppress_finding — create a local suppression (does not affect CI gate in Phase 1).

⁠Scanners (Phase 1)

  • SAST — Semgrep, with bundled offline rules. No registry access needed.
  • Secrets — Gitleaks, TruffleHog. Values are redacted before they are stored.
  • SCA — Trivy, with the vulnerability DB seeded at image build time.

Every scanner runs as a separate subprocess (no shell). Planned for later phases: Bandit, ESLint (SAST); OSV-Scanner, Dependency-Track (SCA); Checkov, KICS (IaC); OWASP ZAP (DAST).

⁠Security model

  • Read-only project. Mounted :ro, the server never writes to source files.
  • Offline by default. --network=none, no outbound calls, ever.
  • No LLM calls. Your agent's own model generates the fix; the server only ships context data, never prompts.
  • Secrets redacted at write time, not at read time.
  • Hardened container. Non-root UID 1000, read-only rootfs, cap-drop=ALL, no-new-privileges.

⁠Configuration

Per-project settings live in .appsecgate-mcp/config.yaml and are deep-merged over the image defaults:

version: 1
stack:
  languages: [python, typescript]
  frameworks: [fastapi, react]

scanners:
  sast:
    enabled: true
    tool: semgrep
  secrets:
    enabled: true
    tool: gitleaks
  sca:
    enabled: true
    tool: trivy
    severity_threshold: HIGH

gates:
  block_on: [CRITICAL, HIGH]
  warn_on: [MEDIUM]

⁠Image size

The image is large (~3 GB) because it bundles the Semgrep rules, Trivy vulnerability DB, Gitleaks, and TruffleHog for fully offline operation. The first pull will take a while; subsequent runs are fast.

⁠Status

Phase 1 MVP — local, warn-only, no CI gate yet (that's Phase 2). See the product vision and roadmap:

⁠Tags

  • 0.1.0 — Phase 1 MVP, immutable.
  • latest — points to the most recent stable release.

⁠License

MIT. Bundled scanner rules are third-party — see the third-party notices in the repository: https://github.com/moondoom/appsecgate-mcp/blob/main/mcp-server/rules/THIRD_PARTY_NOTICES.md⁠

Tag summary

Content type

Image

Digest

sha256:2af1624fd…

Size

405.1 MB

Last updated

about 12 hours ago

docker pull moondoom/appsecgate-mcp