Security scanner for GitHub repos, MCP servers, AI agent packages, and local projects. One command. Any repo. Letter grade A through F.
SaferSkills independently audited gatekeeper (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
| name | description |
|---|---|
| gatekeeper | Full-stack security analysis for GitHub repos, MCP servers, AI agent packages, and local projects — by Simcha Brodsky (@simchabrodsky) |
Use this skill whenever the user wants to:
python3 ~/.claude/skills/security-scanner/gatekeeper.py <target>Targets can be:
https://github.com/user/repohttps://gitlab.com/user/repo/path/to/project/path/to/file.pyOptions:
--json — Output raw JSON report (for programmatic use)--sarif — Output SARIF v2.1.0 for CI/CD integration (GitHub Advanced Security, GitLab, VS Code)--skip-deps — Skip dependency audit (offline mode)--exclude "pattern,pattern" — Comma-separated glob patterns to skip (e.g. "vendor/**,*.min.js")--output /path/to/report.json — Save report to specific path instead of default location--quiet — Minimal output: grade and exit code only (for CI pipelines)--no-color — Disable ANSI colors (auto-detected when piped)--max-files N — Cap file count for large repos (default: 50,000)--verbose / -v — Verbose output with file-by-file progress--self-scan — Scan Gatekeeper's own source code (quick verification)--policy "critical=0,high<=5" — Policy-based pass/fail for CI pipelines--trust — Trust target code (enables inline suppression comments for remote repos)--baseline /path/to/baseline.json — Only report findings not present in baseline--save-baseline /path/to/baseline.json — Save current scan findings as baseline--disable-rules "GK-EXE-eval,..." — Comma-separated rule IDs to disable--token <git-token> — Git auth token for private repos (scoped to subprocess)--diff <base-ref> — Only scan files changed since base-ref (e.g. 'main')--timeout <seconds> — Set overall scan timeout (threading.Timer fallback on Windows)Every scan runs every check. No tiers, no "deep" mode. One scan catches everything.
| Category | What it catches |
|---|---|
| SECRET | API keys, tokens, passwords, private keys, database strings, JWT tokens (AWS, GitHub, Anthropic, OpenAI, Stripe, Slack, GCP, Azure, Twilio, SendGrid, Telegram) |
| EXECUTION | Shell execution, eval, dynamic code loading, dangerous deserialization, install hooks (Python, JS, Go, Rust, Java, Ruby, Shell) |
| NETWORK | Outbound HTTP calls, WebSocket connections, suspicious URLs, data exfiltration endpoints, tunneling services |
| FILESYSTEM | Sensitive path access, directory traversal, recursive deletion, symlink attacks, permission modification |
| INJECTION | Prompt injection in tool descriptions, CLAUDE.md poisoning, .cursorrules attacks, SQL injection, XSS patterns, GitHub Actions command injection |
| DEPENDENCY | Known CVEs (pip audit/npm audit), typosquatting, phantom dependencies (declared but never imported), lockfile drift, suspicious install scripts |
| PERMISSION | Root containers, privilege escalation, Docker socket mounts, SYS_ADMIN caps, setuid bits |
| OBFUSCATION | Base64 payloads, string concatenation evasion, dynamic imports, invisible Unicode characters, high-entropy strings, minified code, pre-compiled binaries |
| LICENSE | Missing or restrictive licenses (AGPL, GPL) |
| MCP | Tool shadowing, schema poisoning (beyond descriptions — parameters, defaults, required fields), rug pull indicators, config injection |
| CI/CD | GitHub Actions untrusted input injection, pull_request_target escalation, outdated actions |
| DOCKER | Running as root, secrets in build args, curl-pipe-bash, privileged containers, socket mounts, host network mode |
| KUBERNETES | Privileged pods, hostPath mounts, excessive RBAC permissions, missing security contexts |
The scanner produces raw findings. Your job is to apply context intelligence on top. Every scan follows this exact protocol — no shortcuts, no skipping phases.
Run the scanner and let the full output complete. Do NOT show the grade early or give your own pre-judgment. Let the scanner's output speak first.
python3 ~/.claude/skills/security-scanner/gatekeeper.py <target>For JSON analysis (when you need to inspect findings programmatically):
python3 ~/.claude/skills/security-scanner/gatekeeper.py <target> --jsonAfter the scan completes, perform deep context analysis on EVERY finding — not just CRITICAL and HIGH. MEDIUM and LOW findings can hide real problems that the scanner underweighted. A MEDIUM that got downgraded from HIGH by the verification pass might still be dangerous in context. A LOW in a file that shouldn't exist at all could be the most important signal in the scan. Miss nothing.
Start with CRITICAL and HIGH, then work through MEDIUM and LOW. This is where the real value is — the scanner finds patterns, you determine intent.
Your job is NOT to justify findings away. Your job is to determine the truth. If a finding looks dangerous, say so — even if the repo is popular. If a finding is clearly architectural, say that too. But never assume "well-known repo = safe" or "lots of findings = must be false positives." The scanner caught them for a reason. Verify each one independently.
For each finding, answer:
original_severity field. A downgraded finding is still a finding. If something was downgraded and you disagree with the downgrade, flag it.Run a second pass on every scan, not just C and below. An A-grade repo could still have a finding worth mentioning. A B-grade repo might have one HIGH that deserves deeper explanation. The second pass is where you catch what the first pass might have normalized away.
Second pass checklist — challenge your own assumptions:
suppressed_findings list. The verification pass is good but not perfect.After the second pass, deliver an honest verdict:
State the scanner's verdict. Note any minor findings if relevant. Done.
Summarize every CRITICAL and HIGH finding in plain English. For each one, explain what it does and whether it's justified by the tool's purpose. Include your second-pass analysis. Let the user decide with full context.
Explain exactly what's wrong. Be specific about the risks. Separate architectural patterns from genuine vulnerabilities. If the scanner says POTENTIALLY MALICIOUS, lead with that — tell the user what malicious patterns were found. If it says VULNERABLE, explain what holes exist and how they could be exploited. Include your second-pass analysis showing which findings you verified as genuinely dangerous.
'ev' + 'al' defeats every regex scanner; this one reconstructs and catches it~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.