mcp-ssrf-scan Cloud
Know which commit introduced the SSRF.
mcp-ssrf-scan is a free, open-source static scanner for MCP servers — it flags tool handlers that fetch a caller-controlled URL with no host validation, hardcoded secrets, and exec-injection. As a CI gate it fails the build on any HIGH finding. That's free and stays free.
A gate tells you something is wrong. It doesn't tell you what changed. Cloud uploads every CI scan and diffs it against the last one for that repo, so each run tells you:
- New findings — introduced since the previous scan, so you review the diff that caused them, not the whole repo
- Fixed findings — what the last change resolved
- History per repo — every scan, commit and branch, browsable on a dashboard for 90 days
Findings are matched by rule, severity, file and the flagged code — not line number — so unrelated edits that shift lines don't show up as "new", while a HIGH downgraded by added validation shows up as fixed.
Pricing
The CLI as a CI gate — fails the build on HIGH findings. No account, no upload.
npx @sms-florin/mcp-ssrf-scan ./src
Cloud: scan upload, new/fixed diff on every run, per-repo history and dashboard. Up to 10 repos. API key shown instantly after checkout. Cancel any time.
Subscribe — $15/mo →Setup (2 minutes)
Add the key from checkout as a CI secret named MCP_SSRF_SCAN_KEY, then add --upload:
GitHub Actions
- run: npx @sms-florin/mcp-ssrf-scan@latest ./src --upload
env:
MCP_SSRF_SCAN_KEY: ${{ secrets.MCP_SSRF_SCAN_KEY }}
GitLab CI
mcp-ssrf-scan:
image: node:22
script:
- npx @sms-florin/mcp-ssrf-scan@latest ./src --upload
Repo, branch and commit are read from the CI environment (GitHub Actions, GitLab CI) or from git. Only findings are uploaded — file path, line, rule, message and the flagged line of code — never your full source.
Why this exists
I found this exact bug class in my own production code before I ever thought of building a scanner for it. BlueRock scanned 8,000+ public MCP servers and found 36.7% with unbounded URI fetch / SSRF flaws. The scanner is a heuristic, not a proof — treat a HIGH as "go read this function".
Already subscribed? Open the dashboard.
Also from the same maker, for testing the signup flows your agents run into: receivemail.dev (disposable inboxes by API, codes pre-extracted or pushed to a webhook) and sms-florin (real UK numbers for SMS codes).