Skip to content

Commit 77e2a39

Browse files
committed
feat: v0.29.0 — check MCP tool, proxy metrics, Mermaid export
- Add `check` as 8th MCP tool: pre-install CVE lookup via OSV.dev with name@version parsing, @latest resolution, scoped npm support - Add ProxyMetrics: tool call counters, blocked call tracking, latency percentiles (p50/p95), JSONL summary on exit - Add Mermaid diagram export (--format mermaid): CVE → package → server → agent → credentials flowchart with severity styling - Wire mermaid into CLI as --format option with file output - Update all deployment artifacts to 8 tools: toolhive server.json, Dockerfile.sse, README.md, server card - Fix bump-version.py to not clobber SARIF "2.1.0" version strings - Bump version 0.28.1 → 0.29.0 across 17 locations - 801 tests passing, ruff clean
1 parent 264253d commit 77e2a39

File tree

18 files changed

+663
-37
lines changed

18 files changed

+663
-37
lines changed

Dockerfile.sse

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# MCP Server — Streamable HTTP transport for remote clients.
22
#
3-
# Exposes agent-bom's 7 MCP tools over streamable HTTP so that Smithery, Claude
3+
# Exposes agent-bom's 8 MCP tools over streamable HTTP so that Smithery, Claude
44
# Desktop (remote mode), and any other MCP client can connect via public URL.
55
#
66
# Build: docker build -f Dockerfile.sse -t agent-bom-sse .
@@ -13,7 +13,7 @@
1313

1414
FROM python:3.12-slim
1515

16-
ARG VERSION=0.28.1
16+
ARG VERSION=0.29.0
1717

1818
LABEL org.opencontainers.image.title="agent-bom MCP Server"
1919
LABEL org.opencontainers.image.description="AI supply chain security scanner — MCP server with streamable HTTP transport"

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ Unverified servers in your configs trigger a warning. Policy rules can block the
578578
|------|---------|----------|
579579
| Developer CLI | `agent-bom scan` | Local audit, pre-commit checks |
580580
| Pre-install check | `agent-bom check express@4.18.2 -e npm` | Before running any MCP server |
581-
| GitHub Action | `uses: msaad00/agent-bom@v0.28.1` | CI/CD gate + Security tab |
581+
| GitHub Action | `uses: msaad00/agent-bom@v0.29.0 | CI/CD gate + Security tab |
582582
| Docker | `docker run agentbom/agent-bom scan` | Isolated, reproducible scans |
583583
| REST API | `agent-bom api` | Dashboards, SIEM, scripting |
584584
| Dashboard | `agent-bom serve` | Team-visible security dashboard |
@@ -593,7 +593,7 @@ Use agent-bom directly in your CI/CD pipeline:
593593

594594
```yaml
595595
- name: AI supply chain scan
596-
uses: msaad00/agent-bom@v0.28.1
596+
uses: msaad00/agent-bom@v0.29.0
597597
with:
598598
severity-threshold: high
599599
upload-sarif: true
@@ -602,7 +602,7 @@ Use agent-bom directly in your CI/CD pipeline:
602602
Full options:
603603
604604
```yaml
605-
- uses: msaad00/agent-bom@v0.28.1
605+
- uses: msaad00/agent-bom@v0.29.0
606606
with:
607607
severity-threshold: high # fail on high+ CVEs
608608
policy: policy.json # policy-as-code gates
@@ -713,7 +713,7 @@ agent-bom mcp-server --transport sse # SSE (remote clients)
713713
| **ToolHive** | `thv run agent-bom` | [ToolHive registry entry](integrations/toolhive/server.json) — runs in isolated container |
714714
| **OpenClaw** | `clawhub install agent-bom` | [OpenClaw skill](integrations/openclaw/SKILL.md) — teaches agents to run security scans |
715715
| **MCP Registry** | `uvx agent-bom mcp-server` | [Registry entry](integrations/mcp-registry/server.json) — official MCP Registry |
716-
| **GitHub Actions** | `uses: msaad00/agent-bom@v0.28.1` | SARIF upload to Security tab, policy gating |
716+
| **GitHub Actions** | `uses: msaad00/agent-bom@v0.29.0 | SARIF upload to Security tab, policy gating |
717717

718718
---
719719

@@ -835,7 +835,7 @@ These tools solve different problems and are **complementary**.
835835
- [x] Model binary file detection — .gguf, .safetensors, .onnx, .pt, .pkl security flags, 13 formats
836836
- [x] API server hardening — API key authentication, per-IP rate limiting, CORS tightening, job cleanup
837837
- [x] CLI tree labels — explicit 🤖 Agent / 🔌 MCP Server / 📦 Package prefixes with summary stats
838-
- [x] MCP server — expose scan, blast_radius, policy_check, registry_lookup, generate_sbom as MCP tools
838+
- [x] MCP server — 8 tools: scan, check, blast_radius, policy_check, registry_lookup, generate_sbom, compliance, remediate
839839
- [x] ToolHive integration — registry entry + MCP container for enterprise deployment
840840
- [x] OpenClaw skill — ClawHub-compatible skill for AI agent security scanning
841841
- [x] GitHub Action enhancements — image, config-dir, sbom, remediate inputs

integrations/mcp-registry/server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "io.github.msaad00/agent-bom",
44
"description": "AI supply chain security scanner — CVE scanning, blast radius analysis, policy enforcement, and SBOM generation for MCP servers and AI agents",
55
"title": "agent-bom",
6-
"version": "0.28.1",
6+
"version": "0.29.0",
77
"repository": {
88
"url": "https://github.com/msaad00/agent-bom",
99
"source": "github"
@@ -12,7 +12,7 @@
1212
{
1313
"registryType": "pypi",
1414
"identifier": "agent-bom",
15-
"version": "0.28.1",
15+
"version": "0.29.0",
1616
"transport": {
1717
"type": "stdio"
1818
},

integrations/openclaw/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: agent-bom
33
description: Scan AI agents and MCP servers for CVEs, generate SBOMs, map blast radius, enforce security policies
4-
version: 0.28.1
4+
version: 0.29.0
55
metadata:
66
openclaw:
77
requires:

integrations/toolhive/Dockerfile.mcp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
FROM python:3.12-slim
22

3-
ARG VERSION=0.28.1
3+
ARG VERSION=0.29.0
44

55
LABEL maintainer="agent-bom <261858605+agent-bom@users.noreply.github.com>"
66
LABEL description="agent-bom MCP Server: AI supply chain security scanning via MCP protocol"

integrations/toolhive/server.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
"name": "io.github.msaad00/agent-bom",
44
"description": "AI supply chain security scanner — CVE scanning, blast radius analysis, policy enforcement, and SBOM generation for MCP servers and AI agents",
55
"title": "agent-bom",
6-
"version": "0.28.1",
6+
"version": "0.29.0",
77
"repository": {
88
"url": "https://github.com/msaad00/agent-bom",
99
"source": "github"
1010
},
1111
"packages": [
1212
{
1313
"registryType": "oci",
14-
"identifier": "ghcr.io/msaad00/agent-bom:v0.28.1",
14+
"identifier": "ghcr.io/msaad00/agent-bom:v0.29.0",
1515
"transport": {
1616
"type": "stdio"
1717
},
@@ -28,7 +28,7 @@
2828
"_meta": {
2929
"io.modelcontextprotocol.registry/publisher-provided": {
3030
"io.github.msaad00": {
31-
"ghcr.io/msaad00/agent-bom:v0.28.1": {
31+
"ghcr.io/msaad00/agent-bom:v0.29.0": {
3232
"tier": "Community",
3333
"status": "Active",
3434
"tags": [
@@ -41,6 +41,7 @@
4141
],
4242
"tools": [
4343
"scan",
44+
"check",
4445
"blast_radius",
4546
"policy_check",
4647
"registry_lookup",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "agent-bom"
7-
version = "0.28.1"
7+
version = "0.29.0"
88
description = "AI Bill of Materials (AI-BOM) generator — CVE scanning, blast radius, enterprise remediation plans, OWASP LLM Top 10 + MITRE ATLAS + NIST AI RMF threat mapping, LLM-powered enrichment, OpenClaw discovery, MCP runtime introspection, and MCP registry for AI agents."
99
readme = "README.md"
1010
license = {text = "Apache-2.0"}

scripts/bump-version.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
("README.md", re.compile(r"(msaad00/agent-bom@v)[^\s\"]+"), r"\g<1>{v}"),
4040
# tests/test_core.py — version assertions
4141
("tests/test_core.py", re.compile(r'(assert\s+__version__\s*==\s*")[^"]+(")', re.M), r"\g<1>{v}\g<2>"),
42-
("tests/test_core.py", re.compile(r'(assert\s+data\["version"\]\s*==\s*")[^"]+(")', re.M), r"\g<1>{v}\g<2>"),
42+
# Only match version assertions that currently contain a semver pattern (avoids clobbering SARIF "2.1.0")
43+
("tests/test_core.py", re.compile(r'(assert\s+data\["version"\]\s*==\s*")0\.\d+\.\d+(")', re.M), r"\g<1>{v}\g<2>"),
4344
]
4445

4546

src/agent_bom/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
try:
66
__version__ = version("agent-bom")
77
except PackageNotFoundError:
8-
__version__ = "0.28.1"
8+
__version__ = "0.29.0"

src/agent_bom/cli.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def main():
9999
@click.option("--output", "-o", type=str, help="Output file path (use '-' for stdout)")
100100
@click.option(
101101
"--format", "-f", "output_format",
102-
type=click.Choice(["console", "json", "cyclonedx", "sarif", "spdx", "text", "html", "prometheus", "graph"]),
102+
type=click.Choice(["console", "json", "cyclonedx", "sarif", "spdx", "text", "html", "prometheus", "graph", "mermaid"]),
103103
default="console",
104104
help="Output format",
105105
)
@@ -1051,6 +1051,9 @@ async def _verify_all():
10511051
from agent_bom.output.graph import build_graph_elements
10521052
elements = build_graph_elements(report, blast_radii)
10531053
sys.stdout.write(json.dumps({"elements": elements, "format": "cytoscape"}, indent=2))
1054+
elif output_format == "mermaid":
1055+
from agent_bom.output.mermaid import to_mermaid
1056+
sys.stdout.write(to_mermaid(report, blast_radii))
10541057
else:
10551058
sys.stdout.write(json.dumps(to_json(report), indent=2))
10561059
sys.stdout.write("\n")
@@ -1142,6 +1145,12 @@ async def _verify_all():
11421145
Path(out_path).write_text(json.dumps({"elements": elements, "format": "cytoscape"}, indent=2))
11431146
con.print(f"\n [green]✓[/green] Graph JSON: {out_path}")
11441147
con.print(" [dim]Cytoscape.js-compatible element list — open with Cytoscape desktop or any JS graph library[/dim]")
1148+
elif output_format == "mermaid":
1149+
from agent_bom.output.mermaid import to_mermaid
1150+
out_path = output or "agent-bom-blast-radius.mmd"
1151+
Path(out_path).write_text(to_mermaid(report, blast_radii))
1152+
con.print(f"\n [green]✓[/green] Mermaid diagram: {out_path}")
1153+
con.print(" [dim]Render with: mermaid-cli, GitHub markdown, or mermaid.live[/dim]")
11451154
elif output_format == "text" and output:
11461155
Path(output).write_text(_format_text(report, blast_radii))
11471156
con.print(f"\n [green]✓[/green] Text report: {output}")

0 commit comments

Comments
 (0)