Local-first security scanner for AI coding agents
✦ Offline · No code leaves your machine| Tool | What it does |
|---|---|
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 in one operation; 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 in Phase 2). |
get_config / update_config | Read and update the active session configuration. |
submit_feedback | Submit feedback on a finding: FALSE_POSITIVE / CONFIRMED / WONT_FIX. |
get_scan_history | Return the shown findings log with verification attempts. |
suppress_finding | Create a local suppression (does not affect CI gate in Phase 1). |
Add to ~/.claude/claude_dotfiles/claude.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","/path/to/project:/workspace:ro",
"-v","appsecgate-cache:/home/appsecgate/.cache",
"-v","appsecgate-data:/home/appsecgate/.appsecgate-mcp",
"moondoom/appsecgate-mcp:0.1.0"],
"env": {}
}
}
}.cursor/mcp.json:
{
"mcpServers": {
"appsecgate": {
"type": "docker",
"command": "moondoom/appsecgate-mcp:0.1.0",
"args": ["--transport","stdio","--project","/workspace"],
"volumes": [
{"host":"/path/to/project",
"container":"/workspace","mode":"ro"},
{"host":"appsecgate-cache",
"container":"/home/appsecgate/.cache"},
{"host":"appsecgate-data",
"container":"/home/appsecgate/.appsecgate-mcp"}
]
}
}
}.cline/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","/path/to/project:/workspace:ro",
"-v","appsecgate-cache:/home/appsecgate/.cache",
"-v","appsecgate-data:/home/appsecgate/.appsecgate-mcp",
"moondoom/appsecgate-mcp:0.1.0"],
"env": {}
}
}
}.continue/mcpServers/appsecgate.yaml:
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
- /path/to/project:/workspace:ro
- -v
- appsecgate-cache:/home/appsecgate/.cache
- -v
- appsecgate-data:/home/appsecgate/.appsecgate-mcp
- moondoom/appsecgate-mcp:0.1.0Agent calls scan_file, scan_diff, or scan_project. Semgrep (SAST), Gitleaks/TruffleHog (secrets), Trivy (SCA) run in isolated subprocesses.
Each finding gets a deterministic logical ID. Repeated scans never create duplicates. Suppressions and escalations stay attached across the finding's lifecycle.
Agent requests get_fix_context — receives the code window, rule docs, and raw finding. No LLM calls on the server — just structured data.
After fixing, verify_fix rescans and matches by logical ID. Results logged in shown_findings.db for audit.