Observed since 20 Oct, 17:32 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
ABOM — the Agent Bill of Materials. Scan, sign, and verify what your AI agents are made of.
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
| Command | What 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 T | Decide 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 URL | Run 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 URL | Run 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.mlog | Cosign 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.mlog | RFC 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.json | The auditor's check: verify a witness cosignature with no trust in the operator. |
abom keygen | Show (or create) the local ed25519 signing key (~/.abom/signing_key.pem, override with ABOM_KEY). |
abom version | Print 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.
$ 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
abom scan is a static scanner (pure stdlib + cryptography):
requirements*.txt, pyproject.toml, package.json) → frameworks, model SDKs, vector stores, guardrails.gpt-4o, claude-*, …) and @tool-decorated functions.*.prompt, prompts/*.txt|md) → hashed.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).
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.
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
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.
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.
pypistats · 73 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-19 – 2026-10-19 | 16 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-18 – 2026-10-18 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-17 – 2026-10-17 | 14 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-16 – 2026-10-16 | 8 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-15 – 2026-10-15 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-14 – 2026-10-14 | 6 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-13 – 2026-10-13 | 8 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-12 – 2026-10-12 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-11 – 2026-10-11 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-10 – 2026-10-10 | 9 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-09 – 2026-10-09 | 10 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-08 – 2026-10-08 | 28 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-07 – 2026-10-07 | 5 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-06 – 2026-10-06 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-04 – 2026-10-04 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-02 – 2026-10-02 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-10-01 – 2026-10-01 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-30 – 2026-09-30 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-29 – 2026-09-29 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-28 – 2026-09-28 | 5 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-27 – 2026-09-27 | 22 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-26 – 2026-09-26 | 27 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-25 – 2026-09-25 | 26 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-24 – 2026-09-24 | 35 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-23 – 2026-09-23 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-22 – 2026-09-22 | 6 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-21 – 2026-09-21 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-20 – 2026-09-20 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-18 – 2026-09-18 | 49 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-16 – 2026-09-16 | 20 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-14 – 2026-09-14 | 10 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-13 – 2026-09-13 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-12 – 2026-09-12 | 46 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-11 – 2026-09-11 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-10 – 2026-09-10 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-09 – 2026-09-09 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-07 – 2026-09-07 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-06 – 2026-09-06 | 7 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-05 – 2026-09-05 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-03 – 2026-09-03 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-02 – 2026-09-02 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-09-01 – 2026-09-01 | 5 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-31 – 2026-08-31 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-27 – 2026-08-27 | 44 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-24 – 2026-08-24 | 18 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-23 – 2026-08-23 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-20 – 2026-08-20 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-19 – 2026-08-19 | 46 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-18 – 2026-08-18 | 84 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-17 – 2026-08-17 | 8 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-14 – 2026-08-14 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-13 – 2026-08-13 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-11 – 2026-08-11 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-10 – 2026-08-10 | 21 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-09 – 2026-08-09 | 8 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-08 – 2026-08-08 | 1 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-07 – 2026-08-07 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-06 – 2026-08-06 | 21 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-04 – 2026-08-04 | 8 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-03 – 2026-08-03 | 22 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-02 – 2026-08-02 | 21 | 2026-10-20T21:44:14.7508740Z |
| 2026-08-01 – 2026-08-01 | 2 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-31 – 2026-07-31 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-30 – 2026-07-30 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-29 – 2026-07-29 | 27 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-28 – 2026-07-28 | 14 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-27 – 2026-07-27 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-26 – 2026-07-26 | 4 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-25 – 2026-07-25 | 7 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-24 – 2026-07-24 | 3 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-23 – 2026-07-23 | 9 | 2026-10-20T21:44:14.7508740Z |
| 2026-07-22 – 2026-07-22 | 165 | 2026-10-20T21:44:14.7508740Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.0 | 22 Jul 2026 | 11 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 17:32 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:24e2459571d348c1087ba578bc38fc8b29b640c238aba8aed7603515b8d0c7c2