overgrant v0.1
Find what your AI coding agents were granted that they should not have.
Scan local Claude Code, Codex, Cursor, and MCP configuration for risky settings. Python 3.12+, standard library only at runtime. No account or network is needed.
30-second quickstart
Run it without installing (needs uv):
uvx overgrant scan . # this repo
uvx overgrant scan . --home # plus your user config
Or install it: pipx install overgrant, then overgrant scan . --home.
From a source checkout: python3.12 -m overgrant.cli scan . --format sarif > report.sarif.
An installed package also provides overgrant scan. PATH defaults to the current
directory. --home explicitly adds user configuration. --format accepts text
(default), json, or SARIF 2.1.0 (sarif). Exit status is 0 below the threshold,
1 for a finding at or above --fail-on (high by default), and 2 for invalid
usage or an inaccessible repository directory. Thresholds: low, medium, high,
critical. Parse errors, unreadable files, and oversized files appear as notes;
they do not count as findings or change the exit status, so inspect notes before
treating a report as complete.
Repo scope reads only .claude/settings.json, .claude/settings.local.json,
.mcp.json, .codex/config.toml, .cursor/mcp.json, .cursor/permissions.json,
and .cursor/sandbox.json. Root .env* filenames are checked using metadata.
User scope adds ~/.claude/settings.json, ~/.claude.json,
~/.codex/config.toml, and those three Cursor files under ~/.cursor/.
For ~/.claude.json, only mcpServers and projects.*.mcpServers are scanned.
Each finding includes a rule ID, severity, file, JSON pointer or TOML key path,
one-sentence explanation, remediation, and source URL. MCP server commands/URLs
and Cursor sandbox boundaries are displayed with secrets redacted. SARIF maps
critical/high to error, medium to warning, low to note, preserving the
original severity and key path in result properties.
Rules
| ID | Severity | Detects |
|---|---|---|
| CC001 | critical | User permissions.defaultMode = bypassPermissions |
| CC002 | low | Repo defaultMode requests bypassPermissions or auto |
| CC003 | high | Bare Bash or broad shell/interpreter wildcard allow entries |
| CC004 | high | Repo hooks, which can run before trust in unattended/trusted-parent use |
| CC005 | high | Repo apiKeyHelper |
| CC006 | high | Repo _BASE_URL, proxy, or NODE_OPTIONS environment overrides |
| CC007 | medium | User enableAllProjectMcpServers: true |
| CC008 | low | Root .env* files without either documented Claude read denial |
| MCP001 | high | Literal secrets in MCP env, headers, or http_headers |
| MCP002 | medium | Unpinned npx, uvx, pipx run, bunx, or pnpm dlx packages |
| MCP003 | medium | Remote HTTP MCP URL, except localhost, 127.0.0.1, or ::1 |
| MCP004 | high | Repo .mcp.json or .cursor/mcp.json servers and their launches |
| CX001 | critical | Codex sandbox_mode = "danger-full-access" |
| CX002 | medium | Codex approval_policy = "never" |
| CX003 | high | Codex shell inherits all environment variables |
| CX004 | medium | Codex default or per-tool MCP auto-approval |
| CX005 | medium | Codex workspace sandbox network access |
| CX006 | low | Codex trusts / or the home directory |
| CX007 | high | Repo .codex/config.toml, loaded once the project is trusted |
| CU001 | high | Repo Cursor sandbox settings, including read boundaries/paths |
| CU002 | medium | Repo Cursor permissions |
| SEC001 | high | Known token prefixes anywhere in scoped config values; deduped with MCP001 |
| GEN001 | medium | Repo config path is a symlink |
Rule definitions and vendor references are in SPEC.md. Detection is static: it cannot prove that a token is valid, a command is safe, or an agent will apply a setting in a particular session.
What it never does
- Executes commands, hooks, helpers, imports, or package launchers from configs.
- Fetches URLs, makes network calls, installs packages, or contacts a service.
- Fixes files, changes permissions, writes reports itself, or modifies configs.
- Opens
.env*contents or recursively searches a repository or home directory. - Follows repo symlinks, including symlinked config directories.
- Reads more than 5 MB plus one size-check byte per config; larger files are skipped with a note (known oversized files are skipped before reading).
- Echoes malformed file contents or parser exception text.
- Prints literal detected secrets: output shows the first four characters,
…, and the value's length. Unrecognized secrets outside MCP secret fields are beyond these v0.1 rules; review reports before sharing them.
Development
The preinstalled development tools can run fully offline:
.venv/bin/pytest -q
.venv/bin/ruff check .
Fixtures are synthetic and created under pytest's tmp_path. Every test uses
a fake HOME and patched Path.home; tests never scan the operator's home.
Metadata
Release files for overgrant 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| overgrant-0.1.0.tar.gz | 31.4 kB | Without provenance | Details for overgrant-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| overgrant-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for overgrant-0.1.0-py3-none-any.whl |
Total release size: 48.3 kB
Release files / overgrant-0.1.0.tar.gz
| Download URL | overgrant-0.1.0.tar.gz |
|---|---|
| Size | 31.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
896a98203fc58f0defa43f125a988f7cce128e8681a4ba37efca704179e78080
|
|
BLAKE2b-256 checksum How to use checksums |
f276928231d54049c02d16b15c8fe5d36891f534505fac247b9058b7a33c4624
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / overgrant-0.1.0-py3-none-any.whl
| Download URL | overgrant-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d73501d355096c254a2ad5d9b456c64e2f75dbd5be08625e715a58380efa1d2
|
|
BLAKE2b-256 checksum How to use checksums |
02428ba4e0b0c2ef13aa50b448ce539df5a960b1bd77a4b2e0728eaea42c42ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for overgrant 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.