Answers what to fix first, from your committed security descriptor rather than an invented scope.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Run Trivy, Semgrep, Gitleaks and more from one file. Get one SARIF report and one verdict.
Describe your app. Draugr figures out the rest.
Wiring SAST, SCA, secret, IaC and container scanners into a pipeline by hand means five tools to configure, five outputs to read, and no answer to "can this ship?". Draugr consolidates them: one descriptor, one SARIF report, one pass/fail gate.
You declare what you know about your software β where the repos are, what container
images it builds, what endpoints it exposes, what infrastructure it runs on β in a single
descriptor (draugr.saga.yaml). Draugr infers which checks apply, runs the right tool for
each, and produces pass/fail evidence you can trust. Swap scanners freely β use the tools
you already pay for, or Draugr's open-source defaults.
Findings are ranked, not just listed: the same CVE is act-now on an internet-facing
service and backlog on an internal tool, because Draugr knows which is which. And
draugr diff gates a pull request on new findings only, so
inheriting a repository with two hundred existing ones does not block every change.
Both questions asked before a release ships, from the same descriptor and the same gate: the security one β SAST, SCA, secrets, IaC, DAST, TLS, headers β and the compliance one, starting with a Software Bill of Materials of everything you actually ship.
This is the open-source core engine.
Quickstart Β· See it in action Β· Status Β· Use in CI Β· From an AI assistant Β· Documentation Β· What Draugr doesn't promise Β· Security Β· Development

The verdict, priorities and severities are color-coded on a terminal (disable with NO_COLOR).
Findings are ranked by priority (P1βP4) = severity Γ the component's exposure & criticality;
severity (critical/high/medium/low) comes from the CVSS score when a scanner provides one,
else from the finding's level. The gate and --format json/sarif still use SARIF levels.
draugr-dev/draugr-demo is an intentionally vulnerable sample app wired to Draugr. Every control lights up, the findings are prioritized P1βP4, and results land in the repo's Security β Code scanning tab β a safe sandbox to see exactly what Draugr delivers before pointing it at your own code. The example PRs there also show the new-vs-fixed PR diff and the sticky comment.
π§ Early, and moving fast. Working today:
images (Trivy), sca (Trivy fs), licenses (Trivy licence scanner),
secrets (Gitleaks), sast (Semgrep, plus opt-in gosec for Go), iac (Trivy config),
headers (native HTTP-header analyzer), dast (Nuclei), tls (native TLS/certificate probe),
threats (abuse.ch URLhaus β whether your hosts are already known to serve malware),
infrastructure (CIS Kubernetes Benchmark β read through the Kubernetes API by default, with
kube-bench and an in-cluster Job available for the node sections).
See the integrations catalog.scan (plan β scan β judge β report), content-hash caching,
tunable parallelism (-j), results normalized to SARIF.exposure and criticality and Draugr ranks
every finding P1βP4 (--min-priority to focus, --fail-on-priority to gate);
optional KEV/EPSS enrichment for real-world exploitability.config.gate.controls holds each control to its own threshold, and
config.exclude suppresses a finding with a required reason β it stays in the report,
marked, rather than disappearing.config.sbom emits an SBOM per repository and image (SPDX or CycloneDX, via
Syft); reports render as console, Markdown, HTML, JUnit, JSON or SARIF. The HTML report is
self-contained and carries its own SARIF and TSV downloads.survey for Kubernetes images, the cluster itself, and GitHub org repositories
β and the descriptor it writes enables the controls for what it found.scan . uses the draugr.saga.yaml there, or scans the repo
with sensible defaults when there is none
(sca/secrets/sast/iac); init scaffolds a stack-detected draugr.saga.yaml to customize.validate (schema-check a Saga), doctor (which scanner tools are
present/missing), tools install (fetch pinned, checksum- and cosign-verified scanners β
and cosign itself β into ~/.draugr/bin), and self-update (update draugr itself, verified).threats (threat intelligence) is on the roadmap. See
controls & scanners for what maps to what.
Requirements: the external scanners for the controls you use β
Trivy (images, sca, iac, licenses),
Gitleaks (secrets),
Semgrep (sast),
Nuclei (dast),
kube-bench with kubectl (infrastructure);
git for repo scans, and Syft for config.sbom. headers
and tls need no external tool. threats needs no tool either, but does need a free
abuse.ch key in URLHAUS_AUTH_KEY β and their free tier is
non-commercial, so read their terms first.
draugr doctor tells you which of these your Saga actually needs and whether they are present;
draugr tools install fetches pinned, verified copies of the ones Draugr packages. Go 1.26+ only
to build from source.
Install (recommended):
Detects your OS and architecture and installs to ~/.local/bin β no sudo. It verifies before
it installs and says which checks ran: the archive's SHA-256 against the release's
checksums.txt always, plus the cosign signature on checksums.txt when
cosign is on your PATH. Nothing is installed if a check
fails.
Piping a script into a shell means trusting the host that served it. The script is
readable in the repo, and
install & verifying downloads has the manual steps, the
DRAUGR_* knobs, and Homebrew. Once installed, update in place with draugr self-update.
Or build from source:
Fastest path β zero config. Point Draugr at a repo and go; no descriptor needed:
For full control, write a Saga β any *.saga.yaml file (see examples/):
Scan it:
Your editor already knows this file. Draugr's
JSON Schema is registered with
SchemaStore, which VS Code's YAML extension and JetBrains IDEs
consult by default β so any *.saga.yaml gets completion, hover docs and typo warnings on open,
with nothing to configure. For an editor that doesn't use the catalog, draugr init also writes:
draugr schema -o .saga.schema.json writes the copy embedded in your binary instead, if you'd
rather validate offline or pin to exactly the version you run. See
editor support.
Compare two scans to see what a change introduced (and gate a PR on new findings only):
Let discovery write the descriptor for you:
Full walkthrough: docs/getting-started/quickstart.md.
Add Draugr to a repository's CI and code scanning with the first-party action. It downloads a cosign-verified Draugr release, runs the scan, and hands the merged SARIF to GitHub code scanning β one clean Draugr tool in the Security tab:
With tools: true the action provisions the scanners each control needs (Trivy, Gitleaks,
Semgrep). See the GitHub Action guide for the full workflow and
all inputs.
Ask an assistant to check a change for security problems and it will β by running whatever scanner it can find, over a scope it chose for itself, and reading the raw output. That answer has no relationship to the one your pipeline will give.
draugr mcp serves Draugr over the Model Context Protocol,
so the assistant reads your committed Saga instead:
It can list the controls that exist, hand back the descriptor schema your build enforces,
validate a Saga before you write it, and rank an existing report by priority. Every
*.saga.yaml nearby is exposed as a resource, so the assistant reads the real scope rather than
guessing at one.
Scanning is off by default β it clones repositories and runs external tools. Turn it on with
--scan=ask to approve each call, or --scan=always for a sandbox. See
use Draugr from an AI coding assistant.
Full documentation index β (grouped by task, with a "building blocks" glossary of Saga / Norn / Skald).
A passing verdict means the controls you configured found nothing they were looking for. It is not a statement that your software is secure β it's silent about anything your descriptor doesn't declare, controls you didn't enable, and whatever the underlying scanners miss. Licence findings are information, not legal advice. Draugr is provided under Apache-2.0 without warranty.
The details, including whose terms the bundled scanners carry and your responsibility for authorisation when scanning live endpoints: scope and disclaimer.
A security tool should hold itself to what it checks. Draugr does:
Standard output β every finding is normalized to SARIF 2.1.0 (OASIS), so results flow into GitHub / GitLab / Azure DevOps code scanning and any SARIF-aware tool.
Signed releases + provenance β release archives' checksums.txt is keyless-signed with
cosign (Sigstore) into a checksums.txt.sigstore.json bundle, and each release publishes
SLSA build-provenance attestations (gh attestation verify β¦); verify before installing
(recipe).
SBOMs β a Syft SBOM is published for every release archive.
Verified tooling β draugr tools install fetches scanners pinned by SHA-256 and, where
the upstream signs them, verifies the cosign signature too β and cosign itself is
installable, so verification is self-sufficient.
We scan ourselves β Draugr runs on its own repo every PR (dogfood self-scan), and we track our supply-chain posture with the OpenSSF Scorecard (badge above).
That card reports SAST: 0, and it is worth saying why we are leaving it there. Static
analysis does run on this repository: Semgrep and gosec through Draugr's own sast control on
every scan, and gosec again inside golangci-lint on every pull request. Scorecard looks for a
specific set of tools it recognises, and ours are not in it.
Adding a third static analyser purely to move the number would be the same thing as writing tests that touch code without asserting anything β a metric improved without the property behind it improving. We would rather the score be wrong and the analysis be real. If you want to check the analysis rather than the score, the findings are in the repository's Security tab, uploaded by the scan itself.
Report a vulnerability β see SECURITY.md.
Requires Go 1.26+.
Draugr uses Cobra for the CLI, log/slog for
logging (human-readable and colorized by default; --log-format json for structured logs in
CI/observability pipelines), and OpenTelemetry
for traces and metrics. Telemetry is opt-in via the standard OTEL_* environment variables
(e.g. OTEL_EXPORTER_OTLP_ENDPOINT) β a no-op with zero overhead when unset. Logs and spans
never carry secrets.
Draugr is licensed under the Apache License 2.0.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/draugr)<a href="https://allmcps.com/mcp/draugr"><img src="https://allmcps.com/api/badge/draugr?style=directory" alt="Draugr on AllMCPs" /></a>