scan
Run a security scan of a project and return the result, with progress on the way; calling it while a scan runs here attaches to that scan. Writes results into .security-scan/ and never modifies your source.
freshprofilebudget_sworkspace
io.github.MaverickHQPublished by GitHub account MaverickHQv1.6.1Updated Nov 1, 2026
Offline security scanning for AI-generated code: seven open-source scanners in one MCP server.
Runs offline security scans of a project with seven bundled open-source scanners and returns ranked, exploit-aware findings to an AI assistant.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
Offline security scanning for AI-generated code.
Seven open-source scanners and AI-specific checks, in one command and one ranked report.
[PyPI] [Python 3.11+] [CI] [OpenSSF Scorecard] [Licence: Apache-2.0]
Scorecard's Code-Review, Branch-Protection and Contributors checks need a second maintainer; valvur has one (MAINTAINERS.md).
Status:
1.6.1, the version this tree declares; the PyPI badge above shows whatpip install valvurserves, and the CHANGELOG what each version changed.
In Claude Code: /plugin marketplace add MaverickHQ/valvur, then /plugin install valvur@valvur, and ask it to scan the project.
From a terminal, with Docker or Podman running: uvx valvur scan.
run.json, beside what left
the machine: nothing. One command checks it.What it checks, rule by rule, and what it cannot see: how valvur works.
.env* files and agent configuration), fetches the public data it needs, and records
each fetch.A scan ends findings, clean or inconclusive. It never says clean when stale data,
an uninspected ecosystem or a Scanner that did not finish cannot support it, and it says why.
How much of what valvur claims it finds is measured as the Score: nine tracks scored by the OWASP Benchmark's formula, with a ratchet that no change may fall more than two points under. It is 74.1 out of 100, the same on Linux and on macOS.
Track 8 is precision on maintained code, where almost nothing is a vulnerability: 3 of its
171 findings are real. Track 9 measures the rules for model output reaching a sink: they
catch 30 of 34 generated flows with no false alarm, and none of five published advisories
in LangChain, LlamaIndex and Vanna, whose flows each cross a function. Each rule's
precision is in docs/RULES.md, and the method, the gates and what
valvur does not claim are in docs/EVALUATING.md. Read that one
sceptically.
The Claude Code plugin brings the MCP server, a skill that runs the workflow, and a hook
that asks you before the agent installs a package valvur flags. Kiro takes it as a power.
Any MCP client runs the server with uvx --from valvur valvur-mcp.
The agents' guide has the configuration for eleven clients, the seven
tools, and the permissions a don't ask mode needs.
The Scanners run in a container, so the machine needs Docker or Podman; valvur doctor
says what is missing.
The command-line guide has every command, what a first scan fetches, the Results Folder, and the settings files.
The action scans, uploads results.sarif to code scanning and gates the job.
The CI guide covers the gate, the image as a step of its own, and GitLab.
valvur builds no detection engine. Seven open-source Scanners do that and deserve the
credit; valvur adds one File Set, one findings model, exploit-aware ranking, and three
Checks of its own. All of them run in one container, fed a copy of the files. run.json
records the version of each that ran, and raw/ keeps what each said.
Exploit intelligence comes from CISA KEV and FIRST EPSS: public primary sources, auditable and mirrorable. No proprietary database, and nothing to lock you in.
Air-gapped? The database, the Name Index and its malicious list, KEV, EPSS and OSV's
databases all live outside the image, and each has a mirror setting. See
docs/AIR-GAPPED.md.
valvur collects nothing: no account, no API key, no telemetry, and no part of it reports on
you or your code. The results stay in .security-scan/, which ignores itself in git. What
the host fetches is public data, each fetch recorded in run.json.
python3 scripts/verify-offline.py checks it, and on Linux unshare -rn valvur scan proves
it (how).
valvur doctor --bundle writes: versions and the last run.json, never your
source, raw output or findings.clean included, goes
privately by SECURITY.md.Apache-2.0, see LICENSE; chosen over MIT for the explicit patent grant. Bundled Scanners keep their own licences, listed above and in NOTICE. valvur adds no GPL or AGPL component; the Alpine base carries GPL userland as every Linux container does, and the published SBOM discloses all of it (ADR-0005).
Source: README.md at commit 0213001
Run a security scan of a project and return the result, with progress on the way; calling it while a scan runs here attaches to that scan. Writes results into .security-scan/ and never modifies your source.
freshprofilebudget_sworkspaceThe last scan's findings, worst first and bounded: filter by `group`, `rule`, `path` or `status`, or give a `fingerprint` for that finding in full, with its evidence, exploitation, dependency path and the Scanners that reported it.
pathrulegrouplimitstatusinventoryworkspacefingerprintinclude_suppressedWhat the last scan actually did: which scanners ran, which failed, and whether the result is complete.
workspaceStop a running scan: its containers are killed, nothing is written, and the previous results (if any) stand. What Ctrl-C does on the command line.
workspaceFetch what a scan reads, now: the image if absent, the vulnerability database, the CISA KEV catalog and the package-name index, into this machine's cache; progress on the way, and the answer is what was fetched. Public data comes in; nothing of any workspace leaves.
if_staleCheck that this machine can scan, before scanning: the container runtime, the image, the vulnerability database, the package-name index, SELinux, TLS trust, and which MCP client configuration names valvur. One line per check with the fix on any that would fail a scan. Changes nothing but the containers of scans whose process ended, which it removes.
networkworkspaceBefore adding a dependency: whether each package exists on its registry, is one edit from a far more popular one, was published as malicious, or is exposed to dependency confusion by this project's registry configuration. Answered from this machine's cache; no registry is asked, because asking about a hallucinated name tells whoever watches what to register. Never add a flagged package, or a replacement for it, without asking the human.
packagesrequiredworkspace90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
.security-scan/ ← ignores itself in git, so it is never committed├── SUMMARY.md ← start here: the verdict, anything that failed, the top groups├── REMEDIATION.md ← a ranked proposal: you choose what to apply├── findings.json ← every finding, normalised, secrets redacted├── results.sarif ← SARIF 2.1.0, for code scanning and IDEs└── run.json ← what ran, what was fetched, and what left the machine: nothingpip install valvur # or: uv tool install valvurvalvur scan # offline by default; --profile full adds the registries' answersvalvur check npm left-pad # before an install: real, a near-miss, or malicious?valvur gate . --fail-on high --no-inconclusive- uses: MaverickHQ/valvur-action@16b19e275f843419887873ed536a71f872607e24 # v0.2 with: { fail-on: high, no-inconclusive: "true" }