
Security News
Happy Birthday, Shai-Hulud
It has been one year since Shai-Hulud made its first appearance on npm.
grim-mcp
Advanced tools
Security audit MCP server: finds code, dependency, exposure, secrets, and active-compromise gaps across any stack
Security audit server for AI agents. Finds the code, dependency, exposure, secret, and active compromise gaps that other scanners miss.
Point it at a folder, a repository, or an archive. Get a prioritized, evidence backed report with fixes. Works on any stack, from a new small codebase to a large existing one.
MCP registry:
io.github.AbduljabbarBXR/grim-mcp(mcp-name: io.github.AbduljabbarBXR/grim-mcp)
Status: v0.6.2. Zero runtime dependencies (Python standard library only). Runs on Linux, macOS, Windows, and Termux. 279 tests passing across Python 3.10 to 3.13.
Run it directly with npm:
npx -y grim-mcp
Or install the Python package:
pip install grim-mcp
grim mcp
{
"mcpServers": {
"grim": { "command": "npx", "args": ["-y", "grim-mcp"] }
}
}
Or point directly at a local checkout:
{
"mcpServers": {
"grim": {
"command": "python3",
"args": ["-m", "grim", "mcp"],
"env": { "PYTHONPATH": "/path/to/grim/src" }
}
}
}
grim scan /path/to/app # one shot audit, Markdown report
grim scan backup.tar.gz --format json --out report.json
grim tool audit_exposure --path backup.tar.gz
grim diff old.tar.gz new.tar.gz # drift and active compromise
grim plan /path/to/app # ordered audit plan
grim watch /path/to/app --save # store a known good baseline
grim watch /path/to/app # diff the current state
grim endpoints /path/to/app # route inventory and auth risk
grim fix_plan /path/to/app # remediation steps and safe diffs
grim malware /path/to/app # heuristics, IoC, ClamAV, YARA
grim ci /path/to/app --fail-on high --format sarif
grim mcp # MCP server on stdio
GRIM is an orchestrator for security audits. It runs the right checks for the target, normalizes every result into one finding schema, ranks the findings, and hands an agent or a developer a plain language fix.
.env and backups, and directory listings.detector -> planner -> runner -> normalizer -> ranker -> report
\-> feeds (rules and indicators)
\-> policy (scope and safety)
| Tool | What it does |
|---|---|
detect_stack | Identify the stack and the web served directories. Run this first. |
plan | Ordered, explainable audit plan for a target. |
scan | One shot audit across the applicable engines. |
audit_exposure | Webshells, polyglots, ELF binaries, exposed config, and backups, including nested archives. |
scan_secrets | Credentials, tokens, private keys, and sensitive files, with optional git history. |
scan_code | Static analysis and taint flow across many languages. |
audit_deps | Known vulnerabilities through the live OSV database. |
inventory_endpoints | Routes with method, auth middleware, input surface, and risk. |
malware_scan | Built in heuristics and IoC hashes, plus ClamAV and YARA when installed. |
watch | Save a baseline and detect drift on later scans. |
diff_artifacts | Compare a baseline and a current tree or archive. |
scan_iocs | Match file hashes against a known bad indicator store. |
update_feeds | Sync detection rules and indicators from a JSON feed. |
check_live | Opt in live checks of headers, cookies, TLS, and allowlisted paths. |
ledger | Track findings as new, known, reopened, or resolved across audits. |
sbom | CycloneDX 1.5 or SPDX 2.3 bill of materials. |
fix_plan | Remediation steps with safe unified diffs. |
ci_scan | A CI gate that returns an exit code by severity. |
report | Render findings as Markdown, JSON, or SARIF. |
Static analysis and taint flow:
PHP, JavaScript, TypeScript, Python, Ruby, Go, Rust, Java, Kotlin, C#,
Dart, C, C++, Objective C, Swift, Scala, Groovy, Elixir, Erlang, Lua,
Perl, R, Julia, Nim, PowerShell, Shell, Terraform and HCL, Dockerfile,
Clojure, Haskell
Lockfiles and manifests:
npm, Composer, PyPI, Go modules, Cargo, Pub, Maven, NuGet, RubyGems
Endpoint frameworks: Express, Laravel, Django, Go, Next.js, and Astro.
{
"id": "GRIM-EXPOS-0007",
"severity": "critical",
"confidence": 0.99,
"category": "CWE-434",
"owasp": "A04:2021",
"title": "PHP file present in public upload directory",
"description": "Web executable code in a public path",
"location": { "file": "app/public/uploads/example.php", "line": 1 },
"evidence": "PHP code in a web served upload folder",
"remediation": "Remove the file, block PHP execution in upload dirs, and fix upload validation on the server",
"engine": "grim-exposure",
"first_seen": "2026-09-19T12:00:00+00:00",
"tags": ["webshell", "active-compromise"],
"mitre": ["T1505.003"]
}
Every finding also carries a MITRE ATT&CK technique when one applies.
Every limit is configurable through environment variables. A value of 0 means unlimited. When a limit is reached GRIM sets truncated: true, lists the reasons, adds an information finding, and prints a warning in Markdown reports. Unreadable archives are reported as errors and warnings, and they do not mark a scan as truncated.
| Variable | Default | Applies to |
|---|---|---|
GRIM_MAX_ARCHIVE_DEPTH | 5 | nested archive recursion depth |
GRIM_MAX_ARCHIVE_BYTES | 512 MB | total bytes spilled from nested archives |
GRIM_MAX_ARCHIVE_ENTRY_BYTES | 512 MB | per nested archive size cap |
GRIM_MAX_ENTRIES | 600000 | entries examined and manifest entries |
GRIM_MAX_CONTENT_READS | 60000 | per file content reads |
GRIM_MAX_FINDINGS | 3000 | exposure findings |
GRIM_MAX_FILES | 20000 | source files scanned |
GRIM_MAX_RULE_MATCHES | 10 | hits per rule per file |
GRIM_MAX_FILE_FINDINGS | 200 | findings per file |
GRIM_MAX_FLOW_FINDINGS | 400 | flow analysis findings |
GRIM_MAX_CODE_FILE_BYTES | 1 MB | per file code scan size |
GRIM_MAX_SECRET_FILE_BYTES | 10 MB | per file secrets scan |
GRIM_MAX_SECRET_FINDINGS | 800 | secrets findings |
GRIM_MAX_SECRET_FILES | 200000 | files scanned for secrets |
GRIM_MAX_PACKAGES | 3000 | dependency packages queried |
GRIM_MAX_SECONDS | 0 (off) | wall clock budget per scan |
GRIM_SECRET_WORKERS | 8 | secrets scan threads |
GRIM_OSV_WORKERS | 8 | OSV request threads |
GRIM_OSV_BUDGET_SECONDS | 60 | total OSV network budget |
GRIM_FEEDS_URL | unset | rule and indicator feed URL |
GRIM_RULES_CACHE | ~/.cache/grim/rules.json | synced rule overlay path |
GRIM_CLAMAV | from PATH | ClamAV binary for malware_scan |
GRIM_YARA | from PATH | YARA binary for malware_scan |
GRIM_YARA_RULES | unset | YARA rules file or directory |
The delta cache lives at ~/.cache/grim/code/findings.json. It is keyed by file path and content, invalidated by a rules hash, and written atomically.
grim.scope.json or inline:{
"authorization": { "declared_by": "owner or authorized party", "reference": "ticket id" },
"targets": [
{ "host": "example.com", "mode": "passive",
"max_requests_per_minute": 30, "paths_allowlist": ["/", "/api/health"] }
],
"deny": ["*/wp-admin/*"]
}
mode: active and the exact path is in paths_allowlist. Denied patterns are never touched.max_requests_per_minute.grim version
grim list
grim scan PATH [--format md|json|sarif] [--out FILE] [--tools ...] [--no-network] [--deep]
grim tool NAME --path P [--path-b P2] [--format md|json|sarif] [--raw]
grim diff A B [--format md|json|sarif] [--deep]
grim ci PATH [--fail-on critical|high|medium|low|info] [--format md|json|sarif] [--out FILE]
grim plan PATH [--no-network] [--deep]
grim sbom PATH [--format cyclonedx|spdx] [--out FILE]
grim watch PATH [--save|--status] [--baseline FILE] [--deep]
grim fix_plan PATH [--format md|json] [--no-patches]
grim endpoints PATH [--format md|json]
grim malware PATH [--deep]
grim check_live URL [--scope FILE] [--active] [--timeout N]
grim ledger PATH [--ledger FILE] [--tools ...]
grim iocs PATH [--deep]
grim update-feeds [--url URL]
grim mcp
grim-mcpgrim-mcpio.github.AbduljabbarBXR/grim-mcp, with both npm and PyPI packagesabdijabarboxer2009/grim-mcppython3 tests/run_all.py # runs every tests/test_*.py, no pytest needed
ruff check src tests # optional lint
python -m build # source and wheel
The test suite is Python standard library only and runs on Python 3.10 through 3.13. CI runs the full suite, lint, and a build and install smoke test.
grim/
├── README.md
├── LICENSE
├── pyproject.toml
├── .github/workflows/ci.yml
├── docs/
│ └── validation.md
├── src/grim/
│ ├── __main__.py
│ ├── tools.py
│ ├── sbom.py
│ ├── core/
│ ├── engines/
│ ├── feeds/
│ └── mcp/
├── npm/
└── tests/
Editors and agents:
Model providers:
GRIM because the things that get you are the things nobody was looking at.
FAQs
Security audit MCP server: finds code, dependency, exposure, secrets, and active-compromise gaps across any stack
We found that grim-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
It has been one year since Shai-Hulud made its first appearance on npm.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.

Security News
GitHub Actions now supports cache-mode, a least-privilege control on the Actions cache aimed at the cache poisoning technique behind recent compromises.