Guardx Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Guardx Mcp (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.
<div align="center">
A keyless, defensive (blue-team) code-security auditor for the [Model Context Protocol](https://modelcontextprotocol.io). Let your AI assistant scan codebases for secrets, audit dependencies for known CVEs, and check passwords against breach data — all from natural language.
</div>
⚠️ Defensive use only. Every tool is read-only, privacy-preserving, and needs no API keys. Use it only on code and credentials you own or are authorized to assess.
Unlike offensive recon tools that probe live websites, this server inspects your own code and credentials — making it the blue-team companion to your red-team tooling.
requirements.txt (PyPI), package.json (npm), and go.mod (Go modules) against the free OSV.dev vulnerability database.<p align="center"> <img src="assets/scan_secrets.png" alt="scan_secrets output" width="800"> </p>
<p align="center"> <img src="assets/audit_dependencies.png" alt="audit_dependencies output" width="800"> </p>
<p align="center"> <img src="assets/check_pwned_password.png" alt="check_pwned_password output" width="800"> </p>
git clone https://github.com/harshzagade/Guardx-mcp.git
cd Guardx-mcp
# (recommended) create a virtual environment
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS / Linux:
source .venv/bin/activate
pip install -r requirements.txtRequirements: Python 3.10+ and the mcp + httpx packages (installed via requirements.txt).
GuardX runs locally over stdio, so any MCP-capable client can launch it. In every example below, replace /absolute/path/to/guardx-mcp/server.py with the real path on your machine. If you used a virtual environment, point command at that env's Python (e.g. .venv/bin/python or .venv\Scripts\python.exe) instead of python.
💡 First, confirm the server starts on its own (it then waits for a client on stdin — pressCtrl+Cto exit): ``bash python server.py``
<details open> <summary><b>Claude Code</b> (CLI)</summary>
Register the server with one command:
claude mcp add guardx -- python /absolute/path/to/guardx-mcp/server.py--scope project to write it to a shared .mcp.json in your repo.claude mcp list, then use /mcp inside Claude Code.</details>
<details> <summary><b>Claude Desktop</b> (app)</summary>
Edit your claude_desktop_config.json:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"guardx": {
"command": "python",
"args": ["/absolute/path/to/guardx-mcp/server.py"]
}
}
}Restart Claude Desktop; GuardX appears under the 🔌 tools menu.
</details>
<details> <summary><b>Gemini CLI</b> (& Gemini Code Assist)</summary>
Edit ~/.gemini/settings.json (global) or .gemini/settings.json (per-project). The Gemini Code Assist IDE extension reads the same file:
{
"mcpServers": {
"guardx": {
"command": "python",
"args": ["/absolute/path/to/guardx-mcp/server.py"]
}
}
}Then run gemini and use /mcp to confirm the server is connected.
</details>
<details> <summary><b>OpenAI Codex</b> (CLI & IDE extension)</summary>
Codex uses TOML and shares config between the CLI and the IDE extension. Either run:
codex mcp add guardx -- python /absolute/path/to/guardx-mcp/server.py…or hand-edit ~/.codex/config.toml ( note the underscore in mcp_servers):
[mcp_servers.guardx]
command = "python"
args = ["/absolute/path/to/guardx-mcp/server.py"]Codex only supports local stdio MCP servers — perfect for GuardX.
</details>
<details> <summary><b>Cursor</b> / <b>VS Code</b></summary>
Create .cursor/mcp.json in your project (or the global ~/.cursor/mcp.json):
{
"mcpServers": {
"guardx": {
"command": "python",
"args": ["/absolute/path/to/guardx-mcp/server.py"]
}
}
}VS Code (with MCP support) uses the same mcpServers shape in its settings.
</details>
Windows tip: in JSON, write paths with forward slashes (C:/Users/you/guardx-mcp/server.py) or escaped backslashes (C:\\Users\\you\\...).
Once connected, just ask your assistant in plain language:
| You say... | Tool used |
|---|---|
| "Scan `./my-project` for hardcoded secrets" | scan_secrets |
| "Audit `requirements.txt` for known vulnerabilities" | audit_dependencies |
| "Has the password `password123` been pwned?" | check_pwned_password |
Real output from running the tools (secrets shown are intentionally fake):
`scan_secrets("demo-project")`
Secret scan of demo-project
Files scanned: 1
Findings: 2 (HIGH: 2, MED: 0, LOW: 0)
Unique secrets: 2
[HIGH] AWS Access Key ID
demo-project/app.py:1
match: AKIA...LE (len 20)
[HIGH] Stripe Secret Key
demo-project/app.py:2
match: sk_l...Ab (len 33)
Note: these are heuristic matches and may include false positives. Rotate any real secret that is committed to source control.`audit_dependencies("requirements.txt")` — with requests==2.28.0 and urllib3==1.26.0 pinned:
Dependency audit of requirements.txt
Ecosystem: PyPI
Dependencies checked: 2
Vulnerable packages: 2
[!] requests==2.28.0 -> 8 known vuln(s)
- GHSA-9hjg-9r4m-mvj7 (CVE-2024-47081, PYSEC-2026-1872): Requests vulnerable to .netrc credentials leak via malicious URLs
- GHSA-9wx4-h78v-vm56 (CVE-2024-35195, PYSEC-2026-1873): Requests `Session` object does not verify requests after making first request with verify=False
- GHSA-gc5v-m9x4-r6x2 (CVE-2026-25645, PYSEC-2026-2275): Requests has Insecure Temp File Reuse in its extract_zipped_paths() utility function
...
[!] urllib3==1.26.0 -> 24 known vuln(s)
- GHSA-2xpw-w6gg-jr37 (CVE-2025-66471, PYSEC-2026-1994): urllib3 streaming API improperly handles highly compressed data
...`check_pwned_password("password123")`
WARNING: this password has appeared in known breaches 2,266,543 times. [!]
Do not use it. Choose a unique, strong password and enable MFA.
(Only the SHA-1 prefix was sent; the password never left this machine.)A password not found in any breach returns Good news: this password was NOT found in any known breach. [OK].
check_pwned_password follows the k-anonymity model recommended by Have I Been Pwned:
Add-Padding: true, so every response is padded to thesame size — a network observer cannot infer which prefix you looked up from the response length.
➡️ Your password and its full hash never leave your machine.
audit_dependencies queries the OSV.dev API live on every run — there is no local vulnerability database to download or refresh, so results reflect the latest published advisories at query time. Each query sends only {package name, version, ecosystem}. Freshness caveat: advisories appear in OSV as it ingests them from upstream sources (NVD, GitHub Security Advisories, PyPA, …), so a brand-new CVE may take a little while to show up. Internet access is required; lookups that fail (network error or non-200 response) are reported in the output rather than silently dropped.check_pwned_password uses the Have I Been Pwned Pwned Passwords API with k-anonymity (see above). Internet access is required. The breach corpus is maintained by HIBP and refreshed as new breaches are added — the breach counts you see reflect the corpus at query time, not a fixed snapshot.| Tool | Signature | Description |
|---|---|---|
| Secret scanner | scan_secrets(path, max_findings=200, exclude=None, json_output=False, baseline=None) | Recursively scans a file or directory for hardcoded secrets. Skips binaries and common ignore dirs (.git, node_modules, …), and honours a .gitignore at the scan root (basename patterns at any depth, root-anchored patterns, trailing-slash dir patterns, ! negations — last match wins). A comma-separated exclude glob list (e.g. "*.min.js,fixtures/*") skips extra noisy paths on top. Long minified lines are scanned in overlapping windows instead of being skipped. Findings are graded HIGH/MED/LOW and the report header carries per-severity counts plus a "Unique secrets" count — the number of distinct secret values across the whole scan, so one key committed in twelve files shows as one unique secret. The header also lists per-file finding counts (most-affected file first), mirrored as per_file_counts in JSON output. Lines no known pattern matches are also checked for long high-entropy quoted strings (at least 20 characters, entropy at least 4.0 bits/char), reported as LOW "High-Entropy String" findings for custom token formats. With json_output=True the report is returned as machine-readable JSON (file, line, type, severity, masked match per finding) for CI pipelines. A .guardx-baseline file at the scan root (or an explicit baseline= path) suppresses acknowledged findings: each line holds the SHA-256 hash of one finding (relative path + type + secret value, line numbers excluded so suppression survives edits), and suppressed findings are counted in the header and as suppressed_count in JSON output instead of being reported — so CI stays green on reviewed false positives while new findings still surface. In config files (.env, .ini, YAML, JSON, TOML, …), a credential-named key (last name token password/secret/token/…) with a non-placeholder value is also reported as a MED "Config Credential" finding, catching unquoted values and : assignments the generic pattern misses; placeholder values (changeme, ${VAR} references, masked ***) stay clean. Values are masked so reports are safe to share. |
| Dependency auditor | audit_dependencies(path) | Parses a requirements.txt, package.json, or go.mod and checks each pinned dependency against OSV.dev. Returns CVE/GHSA ids and summaries. |
| Pwned-password check | check_pwned_password(password) | Checks a password against HIBP via k-anonymity. Reports breach count without transmitting the password. Retries twice with jittered backoff on transient network failures. |
guardx-mcp/
├── server.py # MCP server + the three tools
├── tests/ # pytest suite (stdlib-only, no extra installs)
│ ├── test_scan_secrets.py
│ ├── test_config_credentials.py
│ ├── test_baseline.py
│ ├── test_pwned_password.py
│ └── test_gitignore.py
├── requirements.txt # runtime dependencies (mcp, httpx)
├── assets/ # README screenshots
├── README.md
├── CHANGELOG.md
├── LICENSE # MIT
└── .gitignoremcp 2.x, which renamed FastMCP to MCPServer. GuardX targets the 1.x SDK, so pin it in your venv: pip install "mcp<2" httpxContributions are welcome! Ideas: more secret patterns, additional ecosystems (Cargo, Maven), or an SBOM export. Please keep all contributions defensive in nature. Open an issue or a pull request.
Released under the MIT License.
<div align="center"> <sub>Built as a defensive blue-team companion. Scan responsibly. 🛡️</sub> </div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.