Catalog PyPI
PACKAGE EXPLORERView in registry

abom-cli

PyPI

ABOM — the Agent Bill of Materials. Scan, sign, and verify what your AI agents are made of.

agentaiai-securitycyclonedxllmml-bomprovenancesbomsupply-chain
Versions collected1
Direct dependencies11From release 0.2.0
Last observed20 Oct, 17:32 UTC

README

Version 0.2.0 documentation

abom-cli

The reference implementation of ABOM — the Agent Bill of Materials. Every agent action becomes a signed, hash-chained record a third party can verify without trusting you: scan a repo into a signed Composition Manifest, run MCP traffic through the gateway for per-call attestation, settle disputes from commitments — and opt into inline blocking (--enforce) when evidence alone isn't enough.

pip install abom-cli        # (until published: pip install -e .)
abom scan .                 # → abom.json (signed with ed25519)
abom verify abom.json       # check signature
abom verify abom.json --policy policy.json   # + enforce a policy (exit 1 on violations)
abom gate abom.json --tool wire_transfer     # ALLOW/DENY one action (deny-by-default)
abom broker abom.json --upstream https://mcp.internal/rpc  # mediate an agent's tool calls
abom gateway run policy.json --upstream https://mcp.internal/rpc  # policy + signed provenance per call

Commands

CommandWhat it does
abom scan [PATH]Detect agent components (models, prompts, tools, MCP servers, frameworks, vector stores, guardrails) and emit a signed Composition Manifest. -o - writes to stdout.
abom verify [FILE]Verify the ed25519 signature; with --policy, enforce model allowlist / residency / egress / approval rules. Non-zero exit on findings (CI-friendly). --trusted-key pins the authorized signer.
abom gate FILE --tool TDecide ALLOW/DENY for one action against the signed manifest, deny-by-default, notarized. --trusted-key refuses a manifest it can't authenticate. Exit 1 = DENY.
abom broker FILE --upstream URLRun the MCP broker: mediate every tools/call against the signed manifest before forwarding to an upstream MCP server. Denied calls return a notarized JSON-RPC error and never reach upstream. --log for a durable decision log.
abom gateway run POLICY --upstream URLRun the MCP gateway (ABOM v0.2): one signed, hash-chained Action Provenance Record per tools/call — written and fsync'd before forwarding, fail-closed. Default is inspect-only (violations recorded as would_deny, forwarded); --enforce blocks. --floor layers an org minimum no template can weaken; --manifest binds records to a composition.
abom gateway verify LOG...The auditor's check: recompute the hash chain, every ed25519 signature, and — across rotated files — the epoch continuity links. --trusted-key pins the signer. Exit 1 at the exact file and seq.
abom witness LOG.mlogCosign a durable transparency log with an independent witness key; refuses a rewrite across runs. Run on a second party's machine for genuine non-equivocation.
abom anchor LOG.mlogRFC 3161-timestamp the log root via a TSA (--tsa, default freetsa.org) — a third-party existence proof (eIDAS Art. 41 with a qualified TSA).
abom witness-verify COSIG.jsonThe auditor's check: verify a witness cosignature with no trust in the operator.
abom keygenShow (or create) the local ed25519 signing key (~/.abom/signing_key.pem, override with ABOM_KEY).
abom versionPrint the tool and spec versions.

All commands accept -v (info) / -vv (debug) / -q (errors only) / --json-logs (NDJSON for CI) — logs go to stderr, so the ABOM on stdout stays clean.

Example

$ abom scan .
  ABOM · my-agent @ 1.2.0
  models                  3  gpt-4o-mini, claude-3-5-sonnet, OpenAI (SDK)
  frameworks              2  LangChain, LangGraph
  MCP servers             2  filesystem, github
  tools                   1  lookup_customer
  prompts                 1  prompts/system.txt
  signed: ed25519 · key 5846eabc738b3542
  → wrote abom.json

How detection works

abom scan is a static scanner (pure stdlib + cryptography):

  • Dependencies (requirements*.txt, pyproject.toml, package.json) → frameworks, model SDKs, vector stores, guardrails.
  • Source → concrete model names (gpt-4o, claude-*, …) and @tool-decorated functions.
  • Prompt files (*.prompt, prompts/*.txt|md) → hashed.
  • MCP configs (mcp.json, claude_desktop_config.json, …) → MCP servers.

Each component records detected_from so the manifest is auditable. The output validates against spec/abom-0.1.schema.json (shipped in the sdist).

Signing

abom scan signs with ed25519 (cryptography). The key lives at ~/.abom/signing_key.pem (override with ABOM_KEY); the public key + a short key_id are embedded so abom verify is self-contained. Pin the trusted signer with --trusted-key <key_id> on verify / gate / broker: a manifest re-signed by any other key is then refused, so "signed" authenticates who — not just integrity. LocalSigner is dev/CI; a KMSSigner seam keeps the private key in a KMS/HSM for production.

Dev

make install          # pip install -e ".[dev]"
make test             # pytest (audit chain, scanner, signing)
make scan && make verify
make build            # wheel + sdist + twine check
python demo/demo.py   # generate → verify → tamper-evidence walkthrough

The MCP broker

abom broker moves enforcement out of the agent's process. The agent points its MCP client at the broker instead of the MCP server; the broker checks every tools/call against the signed manifest and only forwards allowed ones. A denied call is answered with a notarized JSON-RPC error and never reaches the upstream server — deny-by-default becomes structural for brokered tools rather than cooperative. It does not stop out-of-band calls (raw HTTP / subprocess) the agent makes without transiting the broker; pair it with network egress containment for that.

The optional [mcp] extra (pip install 'abom-cli[mcp]') pulls in httpx for the broker's upstream transport and for abom scan --mcp.

The MCP gateway (ABOM v0.2)

abom gateway is the broker's v0.2 evolution (spec draft; the full draft and ADRs 0001–0008 ship in the sdist under spec/ and docs/adr/). Same choke-point position — agent ⇄ gateway ⇄ upstream MCP server — but the product is the evidence: every tools/call (allowed, denied, and would-deny) becomes a signed, hash-chained Action Provenance Record, fsync'd to an append-only log before the call is forwarded. A call the log cannot record is never forwarded, so a forwarded-but-unrecorded call cannot exist. Arguments enter the log as salted-HMAC commitments plus a de-identified shape — never content — and verify_argument_claim settles disputes about what a call contained. Log files open with a signed epoch, link across rotations, and refuse a second writer; degradations are recorded as signed events, not gaps.

The default mode is inspect-only — the signed would_deny log is the deliverable. --enforce turns the same policy into inline blocking; --floor layers an org-scoped minimum that no project template can weaken (a contradicting template is refused with a signed conformance-violation record).

abom gateway run examples/policies/gateway-baseline.json -u https://mcp.internal/rpc \
    --floor examples/policies/org-floor.json          # inspect-only by default
abom gateway verify gateway.apr.jsonl                 # chain + signatures (+ rotation links)
python demo/gateway_demo.py                           # live end-to-end demo (make gateway-demo)

Already running Google's Model Armor? Keep it — and make it auditable: --model-armor-template projects/<p>/locations/<l>/templates/<t> screens each call via the sanitize API and seals the verdicts into every signed record's detectors[] (token via ABOM_MODEL_ARMOR_TOKEN). The screen never gates — policy decides; the screen's word becomes third-party-verifiable evidence. They decide, you prove.

Downloads & popularity

16downloads
1-day window · source-reported counts19 Oct 2026
16582.50
2026-07-22: 165 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-22–2026-07-222026-07-23: 9 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-23–2026-07-232026-07-24: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-24–2026-07-242026-07-25: 7 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-25–2026-07-252026-07-26: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-26–2026-07-262026-07-27: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-27–2026-07-272026-07-28: 14 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-28–2026-07-282026-07-29: 27 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-29–2026-07-292026-07-30: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-30–2026-07-302026-07-31: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-07-31–2026-07-312026-08-01: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-01–2026-08-012026-08-02: 21 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-02–2026-08-022026-08-03: 22 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-03–2026-08-032026-08-04: 8 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-04–2026-08-042026-08-06: 21 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-06–2026-08-062026-08-07: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-07–2026-08-072026-08-08: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-08–2026-08-082026-08-09: 8 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-09–2026-08-092026-08-10: 21 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-10–2026-08-102026-08-11: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-11–2026-08-112026-08-13: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-13–2026-08-132026-08-14: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-14–2026-08-142026-08-17: 8 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-17–2026-08-172026-08-18: 84 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-18–2026-08-182026-08-19: 46 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-19–2026-08-192026-08-20: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-20–2026-08-202026-08-23: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-23–2026-08-232026-08-24: 18 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-24–2026-08-242026-08-27: 44 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-27–2026-08-272026-08-28: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-28–2026-08-282026-08-31: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-08-31–2026-08-312026-09-01: 5 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-01–2026-09-012026-09-02: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-02–2026-09-022026-09-03: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-03–2026-09-032026-09-05: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-05–2026-09-052026-09-06: 7 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-06–2026-09-062026-09-07: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-07–2026-09-072026-09-09: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-09–2026-09-092026-09-10: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-10–2026-09-102026-09-11: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-11–2026-09-112026-09-12: 46 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-12–2026-09-122026-09-13: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-13–2026-09-132026-09-14: 10 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-14–2026-09-142026-09-16: 20 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-16–2026-09-162026-09-18: 49 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-18–2026-09-182026-09-20: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-20–2026-09-202026-09-21: 1 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-21–2026-09-212026-09-22: 6 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-22–2026-09-222026-09-23: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-23–2026-09-232026-09-24: 35 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-24–2026-09-242026-09-25: 26 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-25–2026-09-252026-09-26: 27 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-26–2026-09-262026-09-27: 22 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-27–2026-09-272026-09-28: 5 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-28–2026-09-282026-09-29: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-29–2026-09-292026-09-30: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-09-30–2026-09-302026-10-01: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-01–2026-10-012026-10-02: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-02–2026-10-022026-10-04: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-04–2026-10-042026-10-06: 2 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-06–2026-10-062026-10-07: 5 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-07–2026-10-072026-10-08: 28 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-08–2026-10-082026-10-09: 10 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-09–2026-10-092026-10-10: 9 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-10–2026-10-102026-10-11: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-11–2026-10-112026-10-12: 4 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-12–2026-10-122026-10-13: 8 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-13–2026-10-132026-10-14: 6 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-14–2026-10-142026-10-15: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-15–2026-10-152026-10-16: 8 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-16–2026-10-162026-10-17: 14 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-17–2026-10-172026-10-18: 3 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-18–2026-10-182026-10-19: 16 · observed 2026-10-20T21:44:14.7508740Z · period 2026-10-19–2026-10-19
22 Jul19 Oct

pypistats · 73 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-19 – 2026-10-19162026-10-20T21:44:14.7508740Z
2026-10-18 – 2026-10-1832026-10-20T21:44:14.7508740Z
2026-10-17 – 2026-10-17142026-10-20T21:44:14.7508740Z
2026-10-16 – 2026-10-1682026-10-20T21:44:14.7508740Z
2026-10-15 – 2026-10-1532026-10-20T21:44:14.7508740Z
2026-10-14 – 2026-10-1462026-10-20T21:44:14.7508740Z
2026-10-13 – 2026-10-1382026-10-20T21:44:14.7508740Z
2026-10-12 – 2026-10-1242026-10-20T21:44:14.7508740Z
2026-10-11 – 2026-10-1132026-10-20T21:44:14.7508740Z
2026-10-10 – 2026-10-1092026-10-20T21:44:14.7508740Z
2026-10-09 – 2026-10-09102026-10-20T21:44:14.7508740Z
2026-10-08 – 2026-10-08282026-10-20T21:44:14.7508740Z
2026-10-07 – 2026-10-0752026-10-20T21:44:14.7508740Z
2026-10-06 – 2026-10-0622026-10-20T21:44:14.7508740Z
2026-10-04 – 2026-10-0422026-10-20T21:44:14.7508740Z
2026-10-02 – 2026-10-0242026-10-20T21:44:14.7508740Z
2026-10-01 – 2026-10-0122026-10-20T21:44:14.7508740Z
2026-09-30 – 2026-09-3042026-10-20T21:44:14.7508740Z
2026-09-29 – 2026-09-2942026-10-20T21:44:14.7508740Z
2026-09-28 – 2026-09-2852026-10-20T21:44:14.7508740Z
2026-09-27 – 2026-09-27222026-10-20T21:44:14.7508740Z
2026-09-26 – 2026-09-26272026-10-20T21:44:14.7508740Z
2026-09-25 – 2026-09-25262026-10-20T21:44:14.7508740Z
2026-09-24 – 2026-09-24352026-10-20T21:44:14.7508740Z
2026-09-23 – 2026-09-2332026-10-20T21:44:14.7508740Z
2026-09-22 – 2026-09-2262026-10-20T21:44:14.7508740Z
2026-09-21 – 2026-09-2112026-10-20T21:44:14.7508740Z
2026-09-20 – 2026-09-2032026-10-20T21:44:14.7508740Z
2026-09-18 – 2026-09-18492026-10-20T21:44:14.7508740Z
2026-09-16 – 2026-09-16202026-10-20T21:44:14.7508740Z
2026-09-14 – 2026-09-14102026-10-20T21:44:14.7508740Z
2026-09-13 – 2026-09-1322026-10-20T21:44:14.7508740Z
2026-09-12 – 2026-09-12462026-10-20T21:44:14.7508740Z
2026-09-11 – 2026-09-1112026-10-20T21:44:14.7508740Z
2026-09-10 – 2026-09-1032026-10-20T21:44:14.7508740Z
2026-09-09 – 2026-09-0942026-10-20T21:44:14.7508740Z
2026-09-07 – 2026-09-0742026-10-20T21:44:14.7508740Z
2026-09-06 – 2026-09-0672026-10-20T21:44:14.7508740Z
2026-09-05 – 2026-09-0532026-10-20T21:44:14.7508740Z
2026-09-03 – 2026-09-0322026-10-20T21:44:14.7508740Z
2026-09-02 – 2026-09-0212026-10-20T21:44:14.7508740Z
2026-09-01 – 2026-09-0152026-10-20T21:44:14.7508740Z
2026-08-31 – 2026-08-3122026-10-20T21:44:14.7508740Z
2026-08-28 – 2026-08-2812026-10-20T21:44:14.7508740Z
2026-08-27 – 2026-08-27442026-10-20T21:44:14.7508740Z
2026-08-24 – 2026-08-24182026-10-20T21:44:14.7508740Z
2026-08-23 – 2026-08-2342026-10-20T21:44:14.7508740Z
2026-08-20 – 2026-08-2012026-10-20T21:44:14.7508740Z
2026-08-19 – 2026-08-19462026-10-20T21:44:14.7508740Z
2026-08-18 – 2026-08-18842026-10-20T21:44:14.7508740Z
2026-08-17 – 2026-08-1782026-10-20T21:44:14.7508740Z
2026-08-14 – 2026-08-1442026-10-20T21:44:14.7508740Z
2026-08-13 – 2026-08-1322026-10-20T21:44:14.7508740Z
2026-08-11 – 2026-08-1112026-10-20T21:44:14.7508740Z
2026-08-10 – 2026-08-10212026-10-20T21:44:14.7508740Z
2026-08-09 – 2026-08-0982026-10-20T21:44:14.7508740Z
2026-08-08 – 2026-08-0812026-10-20T21:44:14.7508740Z
2026-08-07 – 2026-08-0742026-10-20T21:44:14.7508740Z
2026-08-06 – 2026-08-06212026-10-20T21:44:14.7508740Z
2026-08-04 – 2026-08-0482026-10-20T21:44:14.7508740Z
2026-08-03 – 2026-08-03222026-10-20T21:44:14.7508740Z
2026-08-02 – 2026-08-02212026-10-20T21:44:14.7508740Z
2026-08-01 – 2026-08-0122026-10-20T21:44:14.7508740Z
2026-07-31 – 2026-07-3142026-10-20T21:44:14.7508740Z
2026-07-30 – 2026-07-3032026-10-20T21:44:14.7508740Z
2026-07-29 – 2026-07-29272026-10-20T21:44:14.7508740Z
2026-07-28 – 2026-07-28142026-10-20T21:44:14.7508740Z
2026-07-27 – 2026-07-2732026-10-20T21:44:14.7508740Z
2026-07-26 – 2026-07-2642026-10-20T21:44:14.7508740Z
2026-07-25 – 2026-07-2572026-10-20T21:44:14.7508740Z
2026-07-24 – 2026-07-2432026-10-20T21:44:14.7508740Z
2026-07-23 – 2026-07-2392026-10-20T21:44:14.7508740Z
2026-07-22 – 2026-07-221652026-10-20T21:44:14.7508740Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.2.022 Jul 202611

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 17:32 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:24e2459571d348c1087ba578bc38fc8b29b640c238aba8aed7603515b8d0c7c2