Skip to main content
Glama
higakikeita

remedify

by higakikeita

remedify

CI License: Apache-2.0 Python 3.9+ Zero dependencies PyPI

remedify is a last-mile vulnerability remediation planner. Detection is a solved problem — plenty of scanners tell you what is vulnerable and which version fixes it. What every team gets stuck on next is "how do I actually run that fix, here, on this OS?" remedify answers that — deterministically, for whatever scanner you already run.

remedify demo

90-second walkthrough: a Trivy/Sysdig finding → remedify → the exact apt/dnf/apk command → rescan & verify. Re-record with demo/demo.sh.

After triage, every team hits the same wall: "so what exact command do I run, on this OS, for each of these?" — and today the answer is "go read the Ubuntu / RHEL / Amazon Linux docs, package by package, by hand."

remedify closes that last-mile gap. It takes vulnerability scan results (Trivy, Grype, OSV-Scanner, or Sysdig — API, JSON, and CSV) and generates concrete, distro-aware remediation:

$ trivy rootfs --format json -o scan.json /
$ remedify scan.json
## libssl3  `HIGH`
- Installed: `3.0.2-0ubuntu1.15` -> Fix: `3.0.2-0ubuntu1.18`
- CVEs: CVE-2024-5535, CVE-2024-6119
- **Vendor backport (Ubuntu)**: the fixed version is a distro backport — it will
  not match the upstream version number. Trust the vendor advisory below.

    apt-get install --only-upgrade libssl3=3.0.2-0ubuntu1.18

- ⚠️ Restart services that link against OpenSSL (nginx, sshd, etc.).
- Advisories: [Ubuntu USN](https://ubuntu.com/security/notices/USN-6986-1)

Why remedify

  • It's its own category — not a scanner add-on. Input is abstracted across Trivy, Grype, OSV-Scanner, and Sysdig (JSON / CSV / API), plus an MCP server: the scanner is interchangeable, the plan is the product. remedify is not "a Trivy tool".

  • Deterministic, never generative. remedify never asks an AI to invent a fix. Every command is derived from the scanner's fix version and distro packaging rules, so the same input always yields the same plan. AI's job is to explain the plan and wire it into your workflow — never to guess the patch. That division of labor is the durable differentiator, and why you can paste the output straight into a change ticket.

  • Built for the people who triage findings — Security / SOC / vulnerability-management teams who need to hand developers or SREs the exact remediation, not another list of CVEs.

  • Scope, honestly. copa patches container images in place; remedify tells you how to patch everything else — hosts, VMs, and images alike — and stops at the plan. It never applies changes itself.

Related MCP server: VulScan-MCP

Quick start

pip install remedify          # from PyPI
# or zero-install: git clone https://github.com/higakikeita/remedify && cd remedify

# 1. From Trivy
trivy image --format json -o scan.json nginx:latest
python3 remedify.py scan.json                             # Markdown report
python3 remedify.py scan.json --format shell > fix.sh     # reviewable fix script
python3 remedify.py scan.json --min-severity HIGH --format json   # for CI/automation

# Silence findings you've already triaged (kept out of the plan, listed as
# Suppressed with a reason — never silently dropped):
python3 remedify.py scan.json --vex openvex.json          # OpenVEX not_affected/fixed
python3 remedify.py scan.json --ignore .remedifyignore    # CVE- or package-scoped

# 2. Straight from the Sysdig VM API (needs a Secure API token)
export SYSDIG_API_TOKEN=<token>
python3 remedify.py --from-sysdig --api-url https://us2.app.sysdig.com
python3 remedify.py --from-sysdig --api-url ... --limit 20   # 20 workloads, one report

# 2b. From Grype or OSV-Scanner
grype myapp:1.0 -o json | python3 remedify.py -
osv-scanner --format json -r . | python3 remedify.py -

# 3. From a Sysdig vulnerability report CSV export
python3 remedify.py report.csv --os ubuntu:22.04

As a Trivy plugin

Run remedify directly from Trivy — findings flow straight into a remediation plan:

trivy plugin install github.com/higakikeita/remedify

# Trivy scans, then pipes the report to remedify (output-plugin mode):
trivy image --format json --output plugin=remedify nginx:latest

# pass remedify flags through --output-plugin-arg:
trivy image --format json --output plugin=remedify \
  --output-plugin-arg "--format=shell" nginx:latest > fix.sh

# or hand it a saved scan:
trivy remedify scan.json

Zero-dependency: the plugin is the same single Python file, so it installs on any platform without a build step.

No dependencies — any Python 3.9+ runs it as-is.

Why not just use copa?

Copacetic is excellent — for container images. It patches an image directly by adding a patch layer, no rebuild needed. remedify covers what copa doesn't:

copa

remedify

Container images

✅ patches directly

✅ deterministic plan

Hosts / VMs / bare metal

✅ per-distro commands

Backport explanation (fixed version ≠ upstream)

Reboot / service-restart guidance

Language packages (Java/npm/Go…)

✅ update + rebuild steps

Ansible playbook / CI gate output

They are complementary: containers with a registry workflow → copa; hosts, language packages, and automation pipelines → remedify.

Features

  • Inputs (auto-detected): Trivy JSON (trivy image|fs|rootfs --format json), Sysdig scan-result JSON (sysdig-cli-scanner / VM API), Grype JSON, OSV-Scanner JSON, Sysdig vulnerability report CSV exports (header names matched flexibly — pass --os ubuntu:22.04 if your export lacks an OS column), or live from the Sysdig VM API (--from-sysdig --api-url https://us2.app.sysdig.com with SYSDIG_API_TOKEN; validated against a live tenant)

  • Priority signals: findings carry Sysdig runtime context — 🚨 CISA KEV (known exploited), public exploit available, and package in use at runtime — and steps are sorted by severity + these signals, so you fix what attackers can actually reach first

  • Application dependencies (lang-pkgs): Java/npm/pip/Go/Ruby/PHP/Rust/.NET findings get ecosystem-specific fix instructions (update pom.xml / npm install pkg@ver / etc. + rebuild) — the class of finding neither OS package managers nor copa can fix

  • Distro-aware commands: apt (Ubuntu/Debian), dnf/yum (RHEL/Rocky/Alma/Amazon/Fedora), apk (Alpine), zypper (SUSE)

  • Consolidated steps: binary packages from one source package (e.g. e2fsprogs + libcom-err2 + libext2fs2 + libss2) become one command, not four

  • "No fix available" section: findings without a fixed version are reported with their vendor status (affected, will_not_fix, end_of_life) — never silently dropped

  • EOL awareness: detects end-of-life distro versions and warns when fixes require ESM enrollment or an OS migration

  • Backport detection: flags vendor backports (~ubuntu, .el9, .amzn2, +esm, +deb) and explains why the version won't match upstream

  • Operational hints: kernel → reboot required; glibc → reboot recommended; OpenSSL → restart linked services

  • Advisory surfacing: vendor sources first (USN, RHSA, ALAS, DSA), NVD as fallback, near-duplicates collapsed

  • Three output formats: Markdown report, executable shell script, JSON

  • Zero dependencies: single-file Python, stdlib only

What you get

1. A prioritized Markdown report — consolidated steps instead of per-package noise:

# Remediation plan: `prod-web-host (ubuntu 18.04)`

- **Remediation steps**: 1 (covering 4 packages)
- **No fix available**: 1 packages

> ⚠️ **EOL**: Ubuntu 18.04 standard repositories no longer receive security
> updates. Fixes for many CVEs require Ubuntu Pro (ESM).

## e2fsprogs (+3 related packages)  `MEDIUM`

- Packages: `e2fsprogs`, `libcom-err2`, `libext2fs2`, `libss2` (same source, one update)
- Installed: `1.44.1-1ubuntu1.1` -> Fix: `1.44.1-1ubuntu1.2`
- **Vendor backport (Ubuntu)**: fixed version won't match upstream — trust the advisory.

    apt-get install --only-upgrade e2fsprogs=1.44.1-1ubuntu1.2 libcom-err2=1.44.1-1ubuntu1.2 ...

- Advisories: [Ubuntu USN](https://ubuntu.com/security/notices/USN-4142-1)

## No fix available

- **bash** `LOW` (CVE-2019-18276) — No vendor fix released yet

2. A reviewable shell script (--format shell) — commented, set -euo pipefail, reboot reminder at the end:

#!/usr/bin/env bash
# Review before running. Run as root or with sudo.
apt-get update

# e2fsprogs, libcom-err2, ... 1.44.1-1ubuntu1.1 -> 1.44.1-1ubuntu1.2 [MEDIUM] CVE-2019-5094
#   NOTE: Ubuntu vendor backport — version differs from upstream
apt-get install --only-upgrade e2fsprogs=1.44.1-1ubuntu1.2 ...

3. Machine-readable JSON (--format json) — feed it to your ticketing system, chatbot, or AI agent.

Use from AI agents (MCP)

remedify ships an MCP server (remedify_mcp.py, zero dependencies) so AI agents get deterministic remediation plans instead of generating their own commands. Claude Desktop config:

"mcpServers": {
  "remedify": {
    "command": "python3",
    "args": ["/path/to/remedify/remedify_mcp.py"],
    "env": { "SYSDIG_API_TOKEN": "..." }
  }
}

Tools: generate_remediation_plan (pass scan content) and fetch_sysdig_plan (live from the Sysdig VM API, with fleet summary). The agent reasons and talks; remedify computes the plan — same input, same output, every time.

Security note: MCP tool arguments are assembled by the agent, so the server never reads arbitrary local paths. scan_content is the recommended input. scan_path is disabled unless you set REMEDIFY_MCP_ALLOWED_DIR, and even then only reads files that resolve inside that directory.

CLI reference

Option

Values

Default

Purpose

--format

markdown shell json

markdown

Output format

--min-severity

LOW MEDIUM HIGH CRITICAL

show all

Filter remediation steps (unfixed findings are never hidden)

--input

auto trivy grype osv sysdig-csv sysdig-json

auto

Input format

--context

auto host image

auto

Patch in place (host) vs. rebuild advice (image)

--baseline BEFORE

file

Verify mode: diff BEFORE vs. the after-scan and prove fixes landed

--check-eol

off

Use live endoflife.date data (network, cached ~24h) instead of the built-in table

--os

e.g. ubuntu:22.04

from input

OS override for inputs lacking OS metadata

--from-sysdig

Fetch runtime results from Sysdig VM API

--limit

N

1

With --from-sysdig: N most recent workloads in one report

--api-url / --result-id / --filter

Sysdig API endpoint / specific result / filter

--version

Print version

Input via file path or stdin (-).

Supported distros

Family

Package manager

Backport detection

EOL detection

Ubuntu / Debian

apt

✅ (~ubuntu, +deb, +esm)

✅ (ESM guidance)

RHEL / Rocky / Alma / Oracle / Fedora

dnf

✅ (.el9)

CentOS

dnf

✅ (migration guidance)

Amazon Linux

yum (AL2) / dnf

✅ (.amzn2)

✅ (AL1)

Alpine

apk

SUSE / openSUSE

zypper

Anything else

degrades gracefully: findings listed without commands

Try it with the bundled examples:

python3 remedify.py examples/trivy-real-ubuntu1804.json   # real Trivy output: grouping + EOL + no-fix
python3 remedify.py examples/trivy-rhel.json --min-severity HIGH
python3 remedify.py examples/trivy-amazon2.json           # yum + ALAS advisories
python3 remedify.py examples/trivy-alpine.json            # apk
python3 remedify.py examples/trivy-centos7-eol.json       # EOL + will_not_fix / end_of_life
python3 remedify.py examples/sysdig-report.csv           # Sysdig CSV export
python3 remedify.py examples/sysdig-scan-result.json     # Sysdig scan JSON: OS + Java/npm (Spring4Shell)
python3 remedify.py examples/trivy-ubuntu.json --format shell > fix.sh

Architecture

 scan results        parser          normalized        generators          renderers
┌────────────┐   ┌───────────┐   ┌──────────────┐   ┌──────────────┐   ┌────────────┐
│ Trivy JSON │──▶│  one per  │──▶│ Finding      │──▶│ apt / dnf /  │──▶│ markdown   │
│ Grype JSON │   │  scanner  │   │  pkg,        │   │ apk / zypper │   │ shell      │
│ OSV/Sysdig │   │           │   │  fix ver,    │   │ + backport   │   │ json       │
└────────────┘   └───────────┘   │  CVEs, refs  │   │ + hints      │   │ sarif 🔜   │
                                 └──────────────┘   └──────────────┘   └────────────┘

Each stage is pluggable: new scanners are parsers, new distros are generators, new outputs are renderers.

Roadmap

Shipped

  • Inputs: Trivy, Grype, OSV-Scanner, and Sysdig (scan JSON, report CSV, and Vulnerability Management API)

  • Language packages: pip/npm/Maven/Go/etc. findings surfaced as upgrade-and-rebuild steps (OS package managers can't fix them)

  • Outputs: markdown, shell script, JSON, Ansible playbook

  • verify: closed-loop before/after diff — proof a fix actually landed, with a CI gate (--fail-on)

  • Suppression: OpenVEX (--vex) and ignore-lists (--ignore) keep already-triaged findings out of the plan — decided mechanically, never by an AI, and surfaced with their reason (never silently dropped)

  • EOL detection and prioritization (in-use / exploitable / KEV)

  • MCP server (remedify_mcp.py) so AI agents can call it

  • Trivy plugin: trivy remedify / --output plugin=remedify

Next

  • Enrichment: query vendor security data (Ubuntu OVAL/USN, Red Hat CSAF/errata, ALAS) for "not affected / needs-restart" precision

  • Integration: GitHub Action, --format sarif

  • Windows: KB articles / winget

  • Rewrite in Go once the interface stabilizes (single static binary, same ecosystem as copa/trivy)

Non-goals

  • remedify does not apply patches. It generates the plan; a human (or your automation) executes it. Auto-apply is deliberately out of scope for v0.x.

  • Not a scanner. Bring your own (Trivy/Grype/Sysdig).

Status

Alpha — usable today, interfaces may change before v1.0. Published on PyPI (pip install remedify) with a comprehensive test suite (190+ tests, property tests against real dpkg, fuzzing, and schema canaries). Feedback and contributions welcome — see CONTRIBUTING.md.

License

Apache-2.0.

Available Tools

2 tools
fetch_sysdig_planA

Fetch recent runtime scan results from the Sysdig Vulnerability Management API and generate remediation plans, with a fleet summary ('one fix -> N workloads') when multiple workloads are requested. Requires the SYSDIG_API_TOKEN environment variable.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of most recent workloads (default 1).
filterNoSysdig runtime-results filter expression.
api_urlYesSysdig API base URL, e.g. https://us2.app.sysdig.com
min_severityNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description discloses the need for an environment variable and describes fleet summary behavior. It implies a read-only fetch operation but does not explicitly state whether the tool has side effects or other behavioral constraints (e.g., rate limits, data modification).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences clearly state the core action, required environment variable, and a notable behavior (fleet summary). No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, description should provide expectations about the plan output, but it only mentions fleet summary. Does not cover error cases, response format, or other important context for a tool that generates plans. Could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so baseline is 3. Description adds no additional insight beyond what the schema already provides for each parameter. The term 'multiple workloads' is mentioned but not tied to a specific parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it fetches runtime scan results and generates remediation plans, with a specific mention of fleet summary for multiple workloads. Distinguishes from sibling tool 'generate_remediation_plan' by implying it both fetches and generates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions required environment variable (SYSDIG_API_TOKEN) and describes special behavior for multiple workloads. However, does not explicitly state when to use this tool versus the sibling or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_remediation_planA

Turn vulnerability scan results into a deterministic, actionable remediation plan: per-distro fix commands (apt/yum/dnf/apk/zypper), vendor-backport explanations, reboot/service-restart hints, language-package (Java/npm/Go/...) rebuild instructions, and a 'no fix available' section. Accepts Trivy JSON, Grype JSON, Sysdig scan-result JSON, or Sysdig report CSV (auto-detected).

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOS override like 'ubuntu:22.04' (for CSVs without an OS column).
formatNoOutput format (default markdown).
scan_pathNoPath to a scan file (alternative to scan_content). Disabled unless the server sets REMEDIFY_MCP_ALLOWED_DIR; only files inside that directory can be read. Prefer scan_content.
min_severityNoOnly include fixes at or above this severity.
scan_contentNoRaw scan file content (JSON or CSV).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the burden. It discloses that scan_path is disabled unless a server directory permission is set, and that auto-detection of input format occurs. It does not mention whether the tool is read-only or if it modifies any state, but the generative nature (producing a plan) implies no side effects. The transparency is good but could be improved by explicitly stating read-only behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence that packs significant detail. While concise, it could be restructured into multiple sentences for better readability. It front-loads the core action and output components effectively.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers input formats (with examples), output structure, and important constraints (file path security). Even without an output schema, it provides a thorough list of what the plan contains. Given the tool's moderate complexity and no output schema, the description is remarkably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All five parameters are described in the schema (100% coverage). The tool description adds value by explaining the interplay between scan_content and scan_path, the purpose of OS override for CSVs, and the default output format (markdown). This goes beyond the schema descriptions, enhancing the agent's understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: converting vulnerability scan results into a deterministic remediation plan. It specifies the input formats (Trivy, Grype, Sysdig JSON/CSV) and output components (fix commands, vendor-backport explanations, reboot hints, etc.). The verb 'turn...into' and the detailed output list make the function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lacks explicit when-to-use or when-not-to-use guidance. It does not compare with the sibling tool 'fetch_sysdig_plan', leaving the agent to infer differences. However, it does mention auto-detection of input formats and a preference for scan_content over scan_path, which provides some usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.12.0
    • First observedfetch_sysdig_plan
    • First observedgenerate_remediation_plan

TDQS

A4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: one generates a plan from various scan result formats, while the other fetches results from a specific API and then generates a plan. They do not overlap.

Naming Consistency5/5

Both tool names use a consistent verb_noun pattern with snake_case: 'generate_remediation_plan' and 'fetch_sysdig_plan'. The naming is predictable and uniform.

Tool Count3/5

With only 2 tools, the server feels minimal. While the core functionality of generating remediation plans is covered, the count is low for a typical MCP server, though not extreme.

Completeness3/5

The server covers generation and fetching of plans, but lacks tools for exporting, applying, or managing remediation plans. There are notable gaps in the lifecycle.

Maintenance

ActivityStale
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP security server for AI coding agents. 12 tools: pre-install guardian, vulnerability audit, supply-chain attack detection via static code analysis, and CycloneDX 1.6 SBOM generation. Zero runtime dependencies.
    14
    9 npm
    15
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Unifies NVD, EPSS, CISA KEV, GitHub Advisory, and OSV into a single MCP server, enabling AI agents to query vulnerability intelligence conversationally with 23 tools for incident response, prioritization, dependency audits, and threat monitoring.
    41
    308 npm
    27
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A local MCP server that scans repository dependencies for known vulnerabilities (CVEs) using OSV.dev, enriches findings with NVD and CISA KEV data, and supports triage, remediation, and accepted risk management directly from an AI coding assistant.
    6
    26 npm
    1
    MIT