Metadata-Version: 2.4
Name: agent-bom
Version: 0.108.2
Summary: Open security scanner and self-hosted control plane for AI, MCP, and cloud infrastructure.
Author-email: Wagdy Saad <andwgdysaad@gmail.com>
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/msaad00/agent-bom
Project-URL: Repository, https://github.com/msaad00/agent-bom
Project-URL: Issues, https://github.com/msaad00/agent-bom/issues
Project-URL: Changelog, https://github.com/msaad00/agent-bom/releases
Project-URL: Documentation, https://github.com/msaad00/agent-bom#readme
Project-URL: Security Policy, https://github.com/msaad00/agent-bom/blob/main/SECURITY.md
Project-URL: Trust & Permissions, https://github.com/msaad00/agent-bom/blob/main/PERMISSIONS.md
Keywords: ai-bom,sbom,mcp,mcp-server,security,ai-agents,vulnerability,supply-chain,owasp,mitre-atlas,nist-ai-rmf,blast-radius,cve,llm-security,remediation,mcp-introspection,openclaw,ai-enrichment,credential-exposure,config-security,ai-supply-chain,ai-infrastructure,gpu-security,cuda,pytorch,openssf-scorecard,malicious-package-detection,runtime-monitoring,model-provenance
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Environment :: Console
Classifier: Topic :: Security
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: click>=8.0
Requires-Dist: rich>=13.0
Requires-Dist: httpx>=0.28.1
Requires-Dist: httpcore<2,>=1.0.9
Requires-Dist: pydantic>=2.0
Requires-Dist: cyclonedx-python-lib>=11.6
Requires-Dist: packageurl-python>=0.17
Requires-Dist: packaging>=24.0
Requires-Dist: pathspec>=1.1
Requires-Dist: regex>=2026.9.10
Requires-Dist: toml>=0.10
Requires-Dist: pyyaml>=6.0
Requires-Dist: jsonschema>=4.0
Requires-Dist: psutil>=5.9
Requires-Dist: mcp<2,>=1.26
Requires-Dist: jinja2>=3.1.6
Requires-Dist: werkzeug>=3.1.9
Requires-Dist: flask>=3.1.3
Requires-Dist: requests>=2.33.0
Requires-Dist: urllib3>=2.8.0
Requires-Dist: pyjwt>=2.15.0
Requires-Dist: tornado>=6.5.10
Requires-Dist: cryptography>=50.0.0
Requires-Dist: tree-sitter>=0.26.0
Requires-Dist: tree-sitter-javascript>=0.25.0
Requires-Dist: tree-sitter-typescript>=0.23.2
Requires-Dist: cvss<4,>=3.6
Provides-Extra: api
Requires-Dist: fastapi!=0.136.3,>=0.115; extra == "api"
Requires-Dist: uvicorn[standard]>=0.49.0; extra == "api"
Requires-Dist: sse-starlette>=2.1; extra == "api"
Requires-Dist: zstandard>=0.23; extra == "api"
Provides-Extra: otel
Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
Requires-Dist: opentelemetry-sdk>=1.43.0; extra == "otel"
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.20; extra == "otel"
Requires-Dist: protobuf>=6.33.5; extra == "otel"
Provides-Extra: ui
Requires-Dist: agent-bom[api]; extra == "ui"
Provides-Extra: aws
Requires-Dist: boto3>=1.34; extra == "aws"
Provides-Extra: azure
Requires-Dist: azure-identity>=1.15; extra == "azure"
Requires-Dist: azure-mgmt-resource>=23.0; extra == "azure"
Requires-Dist: azure-mgmt-authorization>=4.0; extra == "azure"
Requires-Dist: azure-mgmt-cognitiveservices>=13.5; extra == "azure"
Requires-Dist: azure-mgmt-web>=7.2; extra == "azure"
Requires-Dist: azure-mgmt-appcontainers>=3.0; extra == "azure"
Requires-Dist: azure-mgmt-containerinstance>=10.1; extra == "azure"
Requires-Dist: azure-mgmt-containerservice>=41.3.0; extra == "azure"
Requires-Dist: azure-mgmt-machinelearningservices>=1.0; extra == "azure"
Requires-Dist: azure-ai-ml>=1.34; extra == "azure"
Requires-Dist: azure-ai-projects>=1.0; extra == "azure"
Requires-Dist: azure-mgmt-compute>=30.0; extra == "azure"
Requires-Dist: azure-mgmt-storage>=21.0; extra == "azure"
Requires-Dist: azure-mgmt-network>=25.0; extra == "azure"
Requires-Dist: azure-mgmt-msi>=7.0; extra == "azure"
Requires-Dist: azure-mgmt-monitor>=6.0; extra == "azure"
Requires-Dist: azure-mgmt-security>=7.0; extra == "azure"
Requires-Dist: azure-mgmt-keyvault>=10.3; extra == "azure"
Requires-Dist: azure-keyvault-keys>=4.8; extra == "azure"
Requires-Dist: azure-keyvault-secrets>=4.7; extra == "azure"
Requires-Dist: azure-mgmt-sql>=3.0; extra == "azure"
Requires-Dist: azure-mgmt-rdbms>=10.1; extra == "azure"
Requires-Dist: azure-mgmt-containerregistry>=15.0.0; extra == "azure"
Requires-Dist: azure-containerregistry>=1.2; extra == "azure"
Requires-Dist: azure-mgmt-cosmosdb>=9.5; extra == "azure"
Requires-Dist: azure-mgmt-managementgroups>=1.0; extra == "azure"
Requires-Dist: azure-mgmt-eventhub>=11.0; extra == "azure"
Requires-Dist: azure-mgmt-servicebus>=8.2; extra == "azure"
Requires-Dist: azure-mgmt-redis>=14.3; extra == "azure"
Requires-Dist: azure-mgmt-frontdoor>=1.1; extra == "azure"
Requires-Dist: azure-mgmt-apimanagement>=4.0; extra == "azure"
Requires-Dist: azure-storage-queue>=12.9; extra == "azure"
Requires-Dist: azure-storage-blob>=12.19; extra == "azure"
Requires-Dist: oauthlib>=4.0.0; extra == "azure"
Requires-Dist: six>=1.17.0; extra == "azure"
Provides-Extra: gcp
Requires-Dist: google-cloud-aiplatform>=1.38; extra == "gcp"
Requires-Dist: google-cloud-asset>=3.30; extra == "gcp"
Requires-Dist: google-cloud-functions>=1.16; extra == "gcp"
Requires-Dist: google-cloud-container>=2.36; extra == "gcp"
Requires-Dist: google-cloud-run>=0.10; extra == "gcp"
Requires-Dist: google-cloud-resource-manager>=1.12; extra == "gcp"
Requires-Dist: google-cloud-compute>=1.14; extra == "gcp"
Requires-Dist: google-cloud-iam>=2.19; extra == "gcp"
Requires-Dist: google-cloud-storage>=2.10; extra == "gcp"
Requires-Dist: google-cloud-logging>=3.5; extra == "gcp"
Requires-Dist: google-cloud-pubsub>=2.18; extra == "gcp"
Requires-Dist: google-api-python-client>=2.100; extra == "gcp"
Requires-Dist: google-cloud-bigquery>=3.14; extra == "gcp"
Requires-Dist: google-cloud-api-gateway>=1.9; extra == "gcp"
Requires-Dist: google-cloud-artifact-registry>=1.11; extra == "gcp"
Requires-Dist: google-cloud-org-policy>=1.11; extra == "gcp"
Provides-Extra: coreweave
Provides-Extra: databricks
Requires-Dist: databricks-sdk>=0.20; extra == "databricks"
Provides-Extra: snowflake
Requires-Dist: snowflake-connector-python>=3.6; extra == "snowflake"
Provides-Extra: nebius
Requires-Dist: requests>=2.33.0; extra == "nebius"
Provides-Extra: huggingface
Requires-Dist: huggingface-hub>=0.20; extra == "huggingface"
Provides-Extra: wandb
Requires-Dist: wandb>=0.16; extra == "wandb"
Provides-Extra: openai
Requires-Dist: openai>=1.12; extra == "openai"
Provides-Extra: ai-enrich
Requires-Dist: litellm>=1.83.14; extra == "ai-enrich"
Requires-Dist: python-dotenv>=1.2.2; extra == "ai-enrich"
Requires-Dist: aiohttp>=3.13.4; extra == "ai-enrich"
Requires-Dist: openai>=2.30.0; extra == "ai-enrich"
Provides-Extra: graph
Requires-Dist: networkx>=3.0; extra == "graph"
Requires-Dist: numpy>=1.26; extra == "graph"
Requires-Dist: scipy>=1.13; extra == "graph"
Provides-Extra: pdf
Provides-Extra: postgres
Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
Requires-Dist: psycopg-pool>=3.1; extra == "postgres"
Requires-Dist: alembic>=1.13; extra == "postgres"
Requires-Dist: sqlalchemy>=2.0; extra == "postgres"
Provides-Extra: watch
Requires-Dist: watchdog>=4.0; extra == "watch"
Provides-Extra: runtime
Requires-Dist: cryptography>=50.0.0; extra == "runtime"
Provides-Extra: visual
Requires-Dist: Pillow>=10.0; extra == "visual"
Requires-Dist: pytesseract>=0.3.10; extra == "visual"
Provides-Extra: mcp-server
Requires-Dist: smithery>=0.4; extra == "mcp-server"
Provides-Extra: lake
Requires-Dist: pyarrow>=15.0; extra == "lake"
Requires-Dist: pyiceberg>=0.11.1; extra == "lake"
Provides-Extra: snyk
Provides-Extra: interactive
Requires-Dist: prompt-toolkit>=3.0; extra == "interactive"
Provides-Extra: oidc
Requires-Dist: PyJWT>=2.15.0; extra == "oidc"
Requires-Dist: cryptography>=50.0.0; extra == "oidc"
Provides-Extra: saml
Requires-Dist: python3-saml>=1.16.0; extra == "saml"
Provides-Extra: cloud
Requires-Dist: agent-bom[aws]; extra == "cloud"
Requires-Dist: agent-bom[azure]; extra == "cloud"
Requires-Dist: agent-bom[gcp]; extra == "cloud"
Requires-Dist: agent-bom[databricks]; extra == "cloud"
Requires-Dist: agent-bom[snowflake]; extra == "cloud"
Requires-Dist: agent-bom[nebius]; extra == "cloud"
Requires-Dist: agent-bom[huggingface]; extra == "cloud"
Requires-Dist: agent-bom[wandb]; extra == "cloud"
Requires-Dist: agent-bom[openai]; extra == "cloud"
Provides-Extra: all
Requires-Dist: agent-bom[ai-enrich]; extra == "all"
Requires-Dist: agent-bom[cloud]; extra == "all"
Requires-Dist: agent-bom[graph]; extra == "all"
Requires-Dist: agent-bom[interactive]; extra == "all"
Requires-Dist: agent-bom[mcp-server]; extra == "all"
Requires-Dist: agent-bom[oidc]; extra == "all"
Requires-Dist: agent-bom[otel]; extra == "all"
Requires-Dist: agent-bom[postgres]; extra == "all"
Requires-Dist: agent-bom[runtime]; extra == "all"
Requires-Dist: agent-bom[saml]; extra == "all"
Requires-Dist: agent-bom[ui]; extra == "all"
Requires-Dist: agent-bom[visual]; extra == "all"
Requires-Dist: agent-bom[watch]; extra == "all"
Provides-Extra: docs
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
Requires-Dist: mkdocstrings[python]>=0.24; extra == "docs"
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
Requires-Dist: ruff>=0.16.7; extra == "dev"
Requires-Dist: mypy>=1.0; extra == "dev"
Requires-Dist: types-PyYAML>=6.0; extra == "dev"
Requires-Dist: types-requests>=2.31; extra == "dev"
Requires-Dist: types-toml>=0.10.8.20260518; extra == "dev"
Requires-Dist: bandit>=1.9; extra == "dev"
Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
Requires-Dist: pytest-benchmark>=5.2.3; extra == "dev"
Requires-Dist: pytest-xdist>=3.5; extra == "dev"
Requires-Dist: pytest-randomly>=3.15; extra == "dev"
Requires-Dist: fastapi!=0.136.3,>=0.115; extra == "dev"
Requires-Dist: starlette<2,>=1.3.1; extra == "dev"
Provides-Extra: dev-all
Requires-Dist: agent-bom[dev]; extra == "dev-all"
Requires-Dist: agent-bom[ui]; extra == "dev-all"
Requires-Dist: agent-bom[mcp-server]; extra == "dev-all"
Requires-Dist: agent-bom[graph]; extra == "dev-all"
Requires-Dist: agent-bom[postgres]; extra == "dev-all"
Dynamic: license-file

# agent-bom

<!-- mcp-name: io.github.msaad00/agent-bom -->

**Open security scanner and self-hosted control plane for AI, MCP, and cloud infrastructure.**

Start with the repository in front of you, then choose the entrypoint that
matches your next job: image scan, cloud posture, fix plan, dashboard, MCP
tools, or runtime review.

```text
better-sqlite3@9.0.0  (npm package)
  |── OSV/GHSA finding  (critical · advisory-backed)
  |── sqlite-mcp  (MCP Server · unverified · root)
       |── Cursor IDE  (Agent · 4 servers · 12 tools)
       |── ANTHROPIC_KEY, DB_URL, AWS_SECRET  (Credential env names visible)
       |── query_db, read_file, write_file, run_shell  (Reachable tools)

 Fix: upgrade better-sqlite3 → 11.7.0
```

Blast radius is the core idea: `package -> vulnerability finding -> MCP server (tools + credential env names) -> connected agents`. This schematic explains the model; emitted findings are backed by the configured advisory sources.

Scan local agent configs, MCP servers, instruction files, lockfiles, containers, cloud estate, AI models/datasets, non-human identities, LLM cost, GPU surfaces, and runtime evidence.

```bash
pip install agent-bom
agent-bom scan .
```

The scan prints inventory, findings, reachable impact, evidence coverage, and
the next remediation step. Run `agent-bom doctor` if the first scan cannot
start.

For a deterministic sample, use the built-in offline demo. It deliberately
contains blocking findings, so status `1` is the expected security verdict;
the printed report is complete.

```bash
agent-bom scan --demo --offline
```

The demo uses a curated sample for reproducible output within a release; advisory and severity updates can change later releases.

If you want an inspectable sample before scanning your own repo:

```bash
agent-bom samples first-run
agent-bom scan --inventory agent-bom-first-run/inventory.json -p agent-bom-first-run --enrich
```

The bundled first-run stack includes agent inventory, MCP server definitions,
placeholder credential environment variable names, Python/npm manifests, and a
prompt file. See `docs/FIRST_RUN.md` in the repository for the guided flow.

<details>
<summary><b>See the terminal demo</b></summary>

![agent-bom demo](https://raw.githubusercontent.com/msaad00/agent-bom/main/docs/images/demo-latest.gif)

</details>

## Follow one component

In the self-hosted dashboard, open **Inventory → component → Findings → Compliance**.
The views retain the exact component and scan snapshot, expose recorded relationships
and source evidence, and export loaded evidence with completeness receipts. Control
mappings do not establish evaluated passes or certification.

From a source checkout, [run the connected-BOM example](https://github.com/msaad00/agent-bom/tree/main/examples/connected-bom).
It retains before/after SQLite snapshots: a changed dependency input removes one
pinned advisory finding while an unrelated synthetic cloud check remains failed.
This bounded example does not change a deployment or qualify a cloud account.

## Recommended starting points

```bash
pip install agent-bom

agent-bom scan .                                 # Repo + MCP + package blast radius
agent-bom quickstart --dry-run --offline          # Sample-data and API/UI next steps
agent-bom samples first-run                      # Inspectable sample AI stack
agent-bom check flask@2.2.0 --ecosystem pypi     # Pre-install package verdict
agent-bom image nginx:latest                     # Container image scan
agent-bom scan . --remediate remediation.md       # Fix-first remediation plan
pip install 'agent-bom[ui]'                      # once, if you want the dashboard
agent-bom serve --persist ~/.agent-bom/control-plane.db  # restart-safe local control plane
```

The base wheel is the scanner/CLI path and includes MCP server mode
(`agent-bom mcp server`). Install optional surfaces explicitly:
`pip install 'agent-bom[ui]'` for the local API/dashboard process. Use
`pip install 'agent-bom[all]'` for supported first-run extras; MLflow remains
separate until its upstream CVE backlog is fixed. If an extra is missing, the
command exits with the matching install hint.

Self-hosted pilot:

```bash
curl -fsSL https://raw.githubusercontent.com/msaad00/agent-bom/main/deploy/docker-compose.pilot.yml -o docker-compose.pilot.yml
docker compose -f docker-compose.pilot.yml up -d
# Dashboard -> http://localhost:3000
```

Production chart from a checked-out repo:

```bash
helm upgrade --install agent-bom deploy/helm/agent-bom \
  --namespace agent-bom --create-namespace \
  -f deploy/helm/agent-bom/examples/eks-production-values.yaml
```

## Product views

### Dashboard

![agent-bom dashboard overview](https://raw.githubusercontent.com/msaad00/agent-bom/main/docs/images/dashboard-live.png)

### Agent mesh graph

![agent-bom agent mesh graph](https://raw.githubusercontent.com/msaad00/agent-bom/main/docs/images/mesh-live.png)

## What it scans

- **Agents + MCP** — MCP clients, servers, tools, transports, trust posture
- **Skills + instructions** — `CLAUDE.md`, `AGENTS.md`, `.cursorrules`, `.windsurfrules`, `skills/*`
- **Package risk** — supply-chain scanning across 15 package ecosystems (including `mix.lock` / `pubspec.lock` for Hex and Pub) with OSV/GHSA enrichment and blast radius
- **AI models + datasets** — malicious-model detection via safe pickle-opcode disassembly (no execution), model/dataset cards, and target-scoped PII/PHI dataset-file scanning
- **Container images + IaC** — native OCI parsing plus Dockerfile, Terraform, CloudFormation, Helm, and Kubernetes coverage
- **Cloud estate** — read-only, gated asset inventory across AWS/Azure/GCP plus AI/GPU posture and CIS benchmarks
- **Identity (NHI)** — non-human identity discovery (Okta/Entra), credential-expiry posture, and access-review campaigns
- **LLM cost** — spend forecasting, budget runway, chargeback/allocation, and seasonal-aware spend-anomaly detection
- **Secrets + runtime** — MCP proxy/gateway, inline firewall enforcement, A2A/MCP auth posture, Shield SDK, secrets, and redaction surfaces
- **Compliance + evidence** — mapped governance plus ZIP evidence bundles for auditors

## Key features

- **Blast radius + attack-path fusion** — multi-hop exposure paths over one `UnifiedGraph`, from package → finding → MCP server → credentials → connected agents
- **CWE-aware impact** — RCE shows credential exposure, DoS does not; symbol-level CVE reachability joins CWE/CVE/CPE advisory context when OSV/GHSA carry affected symbols (Python, npm, Go)
- **Portable outputs** — SARIF, CycloneDX, SPDX, OCSF, HTML, graph, JSON, ZIP evidence bundles, and more
- **MCP server mode** — start with 8 scan-profile tools; use `agent-bom mcp server --profile full` for the complete catalog of 88 MCP tools, 7 resources, and 8 workflow prompts in Claude, Cursor, Windsurf, and Cortex CoCo / Cortex Code
- **Skill bundle identity** — stable bundle hashes for skill and instruction file review
- **Dependency confusion detection** — flags internal naming patterns
- **VEX generation** — auto-triage with CWE/CVE/CPE-aware reachability (package + function-level when advisory symbols exist)

Discovery and static/cloud scanning are read-only and agentless. Proxy,
gateway, Shield, and control-plane write tools are separate, explicit runtime
or authenticated operations. No secrets leave your machine unless you
explicitly enable an outbound integration.

## How the data moves

![How agent-bom works](https://raw.githubusercontent.com/msaad00/agent-bom/main/docs/images/scan-pipeline-light.svg)

## Blast radius

![Blast radius](https://raw.githubusercontent.com/msaad00/agent-bom/main/docs/images/blast-radius-light.svg)

## Links

- [GitHub](https://github.com/msaad00/agent-bom)
- [Docker Hub](https://hub.docker.com/r/agentbom/agent-bom)
- [Documentation](https://github.com/msaad00/agent-bom#readme)
- [Product brief](https://github.com/msaad00/agent-bom/blob/main/docs/PRODUCT_BRIEF.md)
- [Verified metrics](https://github.com/msaad00/agent-bom/blob/main/docs/PRODUCT_METRICS.md)
- [Enterprise controls map](https://github.com/msaad00/agent-bom/blob/main/docs/ENTERPRISE.md)
- [Discord](https://discord.gg/3YmYPqKZh5)
