- Category
- Cybersecurity
- Rank
- No. 1222Tools index
Previous survey · No. 1198 ·
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Security & Identity
- Interfaces
- CLI
- GitHub
- 167 stars
- Latest release
- v0.4.0
- Date
About
Geiger is a dependency-free CLI that scans a machine's configs and directories to inventory every installed AI agent, MCP server, plugin, hook, and browser/editor AI extension, labeling each with plain-language exposure tags like EXECUTES, HOLDS-SECRETS, and BROAD-FILESYSTEM. It supports JSON/HTML reporting and a baseline-diff mode to flag newly escalated risk over time, and detects credentials by shape without ever exposing their values.
What it does
Run one command and geiger walks the known config locations for coding agents, chat clients, IDE extensions, and browsers, then prints what it found. Each item gets a plain tag for what it can do: run commands, reach far beyond a single folder, talk to the network, or hold a credential. It recognizes when one agent wraps another as a policy layer and reports both instead of hiding the inner one. Nothing is installed and nothing is sent anywhere; the only file it writes is the report you ask for by name.
Why it's ranked here
The case for this listing is architectural discipline paired with breadth. Zero dependencies means nothing new gets installed to audit what's already installed, and every scan is read-only except the report file you name. Coverage runs wide, not just Claude Code and Cursor but a long tail of CLIs, JetBrains plugins, and AI-native browsers. Secrets are matched by regex shape and never printed, with a redaction pass applied to all output as a second layer. Releases build from GitHub Actions with signed npm provenance, so the published package traces to the exact commit it came from. Small honest surface, wide coverage: that combination is uncommon in this category.
What's good
Findings carry origin as well as exposure: a registry package, a local script, or a remote URL, each labeled by how far you can trust it. A local script tied to nothing published gets its own separate flag rather than blending into an ordinary dependency. Policy wrappers in front of an MCP server are unwrapped, not hidden: the tool reports the real server and the enforcement layer as two findings instead of one. A config file that fails to parse still gets scanned for credential shapes and flagged when it looks like it declares servers or hooks, instead of being silently skipped.
Tradeoffs
The scan only checks known locations, so an agent in a nonstandard path, inside a container, or reached through WSL from the Windows side won't show up. It reads configuration, not behavior: a finding says what a plugin's position allows, not what it did. Origin tracing stops at where a package came from; a registry-published server can still be malicious, and geiger can't tell you that. AI browsers and desktop apps are flagged by presence at medium confidence rather than parsed configuration, and the macOS paths for two of them are described as best-effort guesses. Coverage of any given tool depends on someone having added a detector for it.
How to use it well
Run it once, read the plain-language exposure tags, remove anything unrecognized, and rotate any credential it flags. Save that clean state as a baseline JSON file, then run again with diff and strict enabled from cron or CI: the job fails only when something new can execute code or hold a secret, not on the inventory you reviewed. For a fleet, the same JSON output per machine turns individual audits into a queue of ongoing drift. It tells you what is installed and what it can reach, not whether any of it is safe, so treat a clean scan as a starting inventory, not clearance.
Technical notes+
engine.js's assessMcpServer() classifies each MCP entry by command shape: an npx or bunx invocation gets origin type registry with the package name, a docker command gets origin registry with the image reference, and a bare node, python or sh invocation gets EXECUTES plus UNKNOWN-ORIGIN because nothing ties it to a published artifact. When a command line contains a -- separator, everything before it is treated as a policy-wrapper agent (the binary name is split from its path) and everything after it as the real server, with a note appended rather than the wrapper being dropped. redact.js matches nine credential shapes (Anthropic, OpenAI-style, GitHub, AWS, Slack, Google, Stripe, PEM private-key blocks, JWT) through scanEnvObject() and classifyValue(), plus a generic key-name fallback that flags any string over eight characters under a credential-shaped key as an opaque credential value; redact() then runs over all --json and --html output as a second pass. Detector registration is a flat array in index.js, and engine.js wraps each detector's run() in try/catch so a throwing detector becomes a diagnostics entry instead of aborting the scan. common.js's unparseableFinding() scans the raw text of a broken config for credential shapes and checks it against a regex for mcpServers, servers, context_servers, mcp, hooks and apiKeyHelper keys before flagging it as low confidence. platform.js centralizes per-OS path tables for app-data directories, npm global roots, Firefox profiles and Chromium-family browser roots, including Arc, Comet, Dia and ChatGPT Atlas, with the Dia and ChatGPT Atlas paths marked best-effort in a comment since neither vendor documents them. known-agents.json is a flat, PR-editable table of VS Code extension ids, npm package names and browser-extension keywords that the detectors read instead of hardcoding.
Observed
- License
- MIT
- Runtime dependencies
- Zero declared dependencies in package.json
- Language
- JavaScript, published as an ES module (type: module) for Node.js 18 or newer
- Interfaces
- CLI only, run via npx geiger-scan; no library, MCP, or web API surface
- Platform support
- Windows, macOS, and Linux path tables defined in src/platform.js
- Output formats
- Prints a terminal report by default; writes a file only when --json or --html is passed
- Detector architecture
- Ten ecosystem detectors registered in src/detectors/index.js, each run inside a try/catch in src/engine.js
Read from README.md, package.json, src/detectors/index.js, bin/geiger.js, src/engine.js, src/platform.js, src/redact.js, data/known-agents.json, src/detectors/ai-apps.js, src/detectors/claude-code.js, src/detectors/common.js, src/detectors/hooks.js, src/detectors/mcp-hosts.js, LICENSE.
What it can do
Scan machine configs and directories to inventory installed AI agents, MCP servers, plugins, hooks, and browser/editor AI extensions
Machine configs and directories → Inventory list
Label discovered items with exposure tags such as EXECUTES, HOLDS-SECRETS, and BROAD-FILESYSTEM
Inventoried items → Exposure tags
Generate reports in JSON or HTML format
Scan results → JSON or HTML report
Compare scans over time to flag newly escalated risk
Previous and current scan results → Baseline diff highlighting new risks
Detect credentials by shape without exposing their values
Configs and files → Credential detection flags
Provide remediation guidance for identified exposures
Scan findings → Remediation guidance
Tags
Tech Stack
Media
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.