Answers what to fix first, from your committed security descriptor rather than an invented scope.
Model Context Protocol (MCP) Server: dev.draugr/draugr
The MCP server dev.draugr/draugr provides answers about what to fix first, using your committed security descriptor rather than an invented scope. Its purpose is to guide prioritization for fixes based on existing security context.
π οΈ Key Features
Answers βwhat to fix firstβ
Uses a committed security descriptor as the basis
π Use Cases
Prioritizing remediation steps from existing security descriptor content
β‘ Developer Benefits
Grounded recommendations tied to committed security information
Avoids relying on an invented or hypothetical scope
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 security controls apply, runs the
right scanner 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. Every result
is normalized to SARIF.
This is the open-source core engine.
See it in action
Draugr scanning a repository with zero config
draugr scan . on the demo sandbox β no descriptor, just a prioritized verdict:
text
Draugr β FAIL (draugr-demo 0.0.0)
Priorities: P1 21 P2 25 P3 13 P4 0
Controls:
iac FAIL 4 high 5 medium 12 low
sast FAIL 7 high 12 medium
sca FAIL 3 critical 6 high 8 medium 1 low
secrets FAIL 1 high
Fix first:
Priority Severity Score Rule Control Scanner Location
P1 critical 9.8 CVE-2019-20477 sca trivy-fs app/requirements.txt:4
P1 critical 9.8 CVE-2020-14343 sca trivy-fs app/requirements.txt:4
P1 high 8.0 KSV-0014 iac trivy-config deploy/pod.yaml:8
P1 high 8.0 KSV-0118 iac trivy-config deploy/pod.yaml:6
P1 high 7.5 CVE-2018-1000656 sca trivy-fs app/requirements.txt:2
β¦
β¦ and 49 more finding(s). Use --format json for the full report, or -o <dir> for report.json + results.sarif.
On a terminal the verdict, priorities, and severities are color-coded (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.
Status
π§ Early, and moving fast. Working today:
Controls:images (Trivy), sca (Trivy fs), 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).
See the integrations catalog.
Prioritization: declare a component's 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.
Discovery ("the Ravens"):survey for Kubernetes images and GitHub org repositories.
Zero-config & scaffolding:scan . scans the current repo with no descriptor
(sca/secrets/sast/iac); init scaffolds a stack-detected draugr.saga.yaml to customize.
Preflight & tooling: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).
More controls (SBOM, infrastructure, threat intelligence) are on the roadmap. See
controls & scanners for what maps to what.
Quickstart
Requirements: the external scanners for the controls you use β
Trivy (images, sca, iac),
Gitleaks (secrets),
Semgrep (sast); git for repo scans. Or run
draugr tools install to fetch pinned, verified copies. Go 1.26+ only to build from source.
Install from a release (recommended):
bash
tag=$(curl -fsSLI -o /dev/null -w '%{url_effective}' \
https://github.com/draugr-dev/draugr/releases/latest | sed 's#.*/tag/##')
curl -fsSL "https://github.com/draugr-dev/draugr/releases/download/${tag}/draugr_${tag#v}_$(uname -s | tr A-Z a-z)_amd64.tar.gz" \
| tar -xz draugr
sudomv draugr /usr/local/bin/ && draugr version
Releases are cosign-signed with SBOMs and SLSA build provenance β see
install & verifying downloads for the verifying curl recipe.
Once installed, update in place with draugr self-update.
Or build from source:
bash
git clone https://github.com/draugr-dev/draugr.git
cd draugr && make build # produces ./bin/draugr
./bin/draugr version
Fastest path β zero config. Point Draugr at a repo and go; no descriptor needed:
bash
draugr scan . # scans the current repo: sca, secrets, sast, iac
draugr init # or scaffold a draugr.saga.yaml (stack-detected) to customize
For full control, write a Saga β any *.saga.yaml file (see examples/):
Your editor can help you write it. Draugr publishes a
JSON Schema for the Saga, so VS Code,
JetBrains and Neovim complete field and control names, show what each one means on hover, and
flag typos as you type. draugr init wires it up automatically; for an existing file, add:
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):
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:
yaml
permissions:contents:readsecurity-events:write# upload SARIF to code scanningsteps:-uses:actions/checkout@v4-id:draugruses:draugr-dev/draugr@v0# latest v0.x; pin @vX.Y.Z for reproducible CI (installs Draugr for you)with:saga:draugr.saga.yamltools:true# provision the scanners the controls needfail-on:warning# optional gate (default: error)-if:always()# publish findings even when the gate failsuses:github/codeql-action/upload-sarif@v3with:sarif_file:${{steps.draugr.outputs.sarif}}
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.
Use from an AI coding assistant
Ask a coding assistant "is this safe to ship?" and it answers either way β usually by running
whatever scanner it can find, over a scope it invented, 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:
bash
claude mcp add draugr -- draugr mcp
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.
Documentation
Full documentation index β (grouped by task, with a "building blocks"
glossary of Saga / Norn / Skald / the Ravens).
Quickstart β install, first scan, first survey, CI usage
Concepts β Saga, controllers, scanners, surveyors, the pipeline, verdicts
Pipeline stages β each stage in depth, incl. how the Norn (gate) works
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).
make build # build ./bin/draugr
make gate # full local gate: fmt, vet, golangci-lint, race tests + coverage, govulncheck
make test# run tests
Observability
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.