abom-cli
The reference implementation of ABOM — the Agent Bill of Materials. Scan a repo, emit a signed Composition Manifest, verify it, and enforce it at the tool boundary — inline or through the MCP broker.
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
Commands
| 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 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.
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.
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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file abom_cli-0.1.19.tar.gz.
File metadata
- Download URL: abom_cli-0.1.19.tar.gz
- Upload date:
- Size: 103.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3cf33bdef41ab2c8c0cd12224f6ede2491f8ce9623700699650ba15c5841947d
|
|
| MD5 |
f0e8c901d4cb0a61e8a0a46b077508e8
|
|
| BLAKE2b-256 |
bbba4fc5b2f9d4248258ddefad0adeaa30f73954bc4788f8ee2e42fadbee07d4
|
Provenance
The following attestation bundles were made for abom_cli-0.1.19.tar.gz:
Publisher:
release.yml on josephassiga/abom-dev
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abom_cli-0.1.19.tar.gz -
Subject digest:
3cf33bdef41ab2c8c0cd12224f6ede2491f8ce9623700699650ba15c5841947d - Sigstore transparency entry: 2130434025
- Sigstore integration time:
-
Permalink:
josephassiga/abom-dev@a489a9a4a66956fd573564a5cbcd4b6dde1e71a3 -
Branch / Tag:
refs/tags/v0.1.19 - Owner: https://github.com/josephassiga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a489a9a4a66956fd573564a5cbcd4b6dde1e71a3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file abom_cli-0.1.19-py3-none-any.whl.
File metadata
- Download URL: abom_cli-0.1.19-py3-none-any.whl
- Upload date:
- Size: 70.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b81550cd1ef70e313c13e48010a8655a79293d88814cd53b4c7b45a9d398da4
|
|
| MD5 |
445cb0132f16cc21387cef7185bb459a
|
|
| BLAKE2b-256 |
3840e40903327138f41e684e939f8e920abaa2dfd8f807b3475eb35e4afad9e7
|
Provenance
The following attestation bundles were made for abom_cli-0.1.19-py3-none-any.whl:
Publisher:
release.yml on josephassiga/abom-dev
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
abom_cli-0.1.19-py3-none-any.whl -
Subject digest:
9b81550cd1ef70e313c13e48010a8655a79293d88814cd53b4c7b45a9d398da4 - Sigstore transparency entry: 2130434275
- Sigstore integration time:
-
Permalink:
josephassiga/abom-dev@a489a9a4a66956fd573564a5cbcd4b6dde1e71a3 -
Branch / Tag:
refs/tags/v0.1.19 - Owner: https://github.com/josephassiga
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a489a9a4a66956fd573564a5cbcd4b6dde1e71a3 -
Trigger Event:
push
-
Statement type: