JACS - JSON AI Communication Standard: Cryptographic signing and verification for AI agents.
Project description
JACS Python Library
Cryptographic identity, signing, and verification for AI agents — from Python.
pip install jacs
Prebuilt native bindings via maturin. No Rust compilation during install.
Full documentation | Quick Start
Quick start
import jacs.simple as jacs
info = jacs.quickstart(name="my-agent", domain="my-agent.example.com")
signed = jacs.sign_message({"action": "approve", "amount": 100})
result = jacs.verify(signed.raw)
print(f"Valid: {result.valid}, Signer: {result.signer_id}")
quickstart() creates a persistent agent with keys on disk. If jacs.config.json exists, it loads it; otherwise it creates a new agent.
Core operations
| Operation | Description |
|---|---|
quickstart(name, domain) |
Create a persistent agent with keys — zero config |
load() |
Load an existing agent from config |
sign_message() |
Sign any JSON-serializable data |
sign_file() |
Sign a file with optional embedding |
verify() |
Verify any signed document |
verify_standalone() |
Verify without loading an agent |
export_agent() |
Export agent JSON for sharing |
audit() |
Run a security audit |
What's new in 0.10.0
Why this matters: shared markdown that multiple Python agents review and counter-sign, plus signed images for AI-era provenance, are now first-class — the signature is embedded in the artifact, no sidecar JSON required.
import jacs.simple as jacs
from jacs import MissingSignatureError
jacs.load("./jacs.config.json")
# Text — permissive verify (default)
jacs.sign_text("README.md")
result = jacs.verify_text("README.md")
print(result.status) # 'signed' | 'missing_signature' | 'malformed'
# Hard-fail if the file isn't signed
try:
jacs.verify_text("README.md", strict=True)
except MissingSignatureError as e:
print("not signed:", e)
# Override the trust store with a directory of <signer_id>.public.pem files
jacs.verify_text("README.md", key_dir="./trusted-keys/")
# Images
jacs.sign_image("photo.png", out="signed.png")
v = jacs.verify_image("signed.png")
print(v.status) # 'valid'
v_strict = jacs.verify_image("signed.png", strict=True) # raises if not signed
# Extract the embedded provenance payload (decoded JSON by default)
payload = jacs.extract_media_signature("signed.png")
The same five methods are available on the instance-based JacsClient for multi-agent processes.
A JACS inline signature proves "agent X signed these canonical bytes at their claimed time." It does not prove first creation or legal ownership.
Verify without an agent
result = jacs.verify_standalone(signed_json, key_directory="./keys")
Cross-language interop tested on every commit — documents signed in Rust or Node.js verify identically in Python.
Framework adapters
pip install jacs[langchain] # LangChain / LangGraph
pip install jacs[fastapi] # FastAPI / Starlette
pip install jacs[crewai] # CrewAI
pip install jacs[anthropic] # Anthropic / Claude SDK
pip install jacs[a2a] # A2A protocol
pip install jacs[all] # Everything
Instance-based API
For multiple agents in one process:
from jacs.client import JacsClient
client = JacsClient.quickstart(name="my-agent", domain="example.com")
signed = client.sign_message({"action": "approve"})
See DEVELOPMENT.md for the full API reference, advanced usage (agreements, A2A, attestation, headless loading), framework adapter examples, and testing utilities.
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 jacs-0.10.0.tar.gz.
File metadata
- Download URL: jacs-0.10.0.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
289e10df55ea45fa21b35f95d27e87299347886cfa89a19ebf7d25e68adb5375
|
|
| MD5 |
1375363776183a03d369af186fc91b34
|
|
| BLAKE2b-256 |
bbafcd8af4ed178b1db990106a9613df049c2cee8e351e2f8361ee1fb7044227
|
Provenance
The following attestation bundles were made for jacs-0.10.0.tar.gz:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0.tar.gz -
Subject digest:
289e10df55ea45fa21b35f95d27e87299347886cfa89a19ebf7d25e68adb5375 - Sigstore transparency entry: 1392656629
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jacs-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: jacs-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 8.4 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9adfb4d02d4b76a6739ac2fd4de20951698dfc272baca9b06b1d180791b762e
|
|
| MD5 |
e7c904c99c899ec8099b29f234e9904b
|
|
| BLAKE2b-256 |
28ddb1db8eea6bfdb116526f009de6186328b77756ae64a32b7ef02d87a60995
|
Provenance
The following attestation bundles were made for jacs-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0-cp310-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
b9adfb4d02d4b76a6739ac2fd4de20951698dfc272baca9b06b1d180791b762e - Sigstore transparency entry: 1392656634
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jacs-0.10.0-cp310-abi3-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: jacs-0.10.0-cp310-abi3-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 9.5 MB
- Tags: CPython 3.10+, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4930581152d20920b2baa2f5e0387410d399c94749a07f57c2cea0f6f8e6d470
|
|
| MD5 |
ba051b445a8b6f418d79e3a09eaa6b00
|
|
| BLAKE2b-256 |
e55646e09747def2ca41d73f61c4c9cff5d9e892af1c2f03e0fcae4c81b84e4a
|
Provenance
The following attestation bundles were made for jacs-0.10.0-cp310-abi3-manylinux_2_38_x86_64.whl:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0-cp310-abi3-manylinux_2_38_x86_64.whl -
Subject digest:
4930581152d20920b2baa2f5e0387410d399c94749a07f57c2cea0f6f8e6d470 - Sigstore transparency entry: 1392656632
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jacs-0.10.0-cp310-abi3-manylinux_2_38_aarch64.whl.
File metadata
- Download URL: jacs-0.10.0-cp310-abi3-manylinux_2_38_aarch64.whl
- Upload date:
- Size: 9.4 MB
- Tags: CPython 3.10+, manylinux: glibc 2.38+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
192580ae0acf7d479c5c52e3f5570606cd64632b2958b8e0119a24cac148ad4a
|
|
| MD5 |
a0ad2a0d6ed43c3efad5bafcbcf0b804
|
|
| BLAKE2b-256 |
b907b9155c8f3d9deef7bb1f00accd916a8e6dd4caafc93f9d91a2131e3ac1b7
|
Provenance
The following attestation bundles were made for jacs-0.10.0-cp310-abi3-manylinux_2_38_aarch64.whl:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0-cp310-abi3-manylinux_2_38_aarch64.whl -
Subject digest:
192580ae0acf7d479c5c52e3f5570606cd64632b2958b8e0119a24cac148ad4a - Sigstore transparency entry: 1392656631
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jacs-0.10.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: jacs-0.10.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 8.7 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d6fe80b4048dba5771bddd9ffc6206361551bd81712e5c63af7c99ed02089a4
|
|
| MD5 |
cf4ebff99c62c480ffaa5bd347e42274
|
|
| BLAKE2b-256 |
c35d2f1ffbc5ae9fc486a7942d1fb2a467e47781ecabeac7cc0aa36893c63815
|
Provenance
The following attestation bundles were made for jacs-0.10.0-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
2d6fe80b4048dba5771bddd9ffc6206361551bd81712e5c63af7c99ed02089a4 - Sigstore transparency entry: 1392656637
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jacs-0.10.0-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: jacs-0.10.0-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 8.9 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c3593475136540f3ff000cba9a8959bfbb5c208bda1283ddaed07a67cd50ad5
|
|
| MD5 |
2f1cccd768781eba5bea6051623fda00
|
|
| BLAKE2b-256 |
08451e12d0b4e195b9b7e9bc0182cab92eb55e04382974ad7ed83c32c7d3941e
|
Provenance
The following attestation bundles were made for jacs-0.10.0-cp310-abi3-macosx_10_12_x86_64.whl:
Publisher:
release-pypi.yml on HumanAssisted/JACS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jacs-0.10.0-cp310-abi3-macosx_10_12_x86_64.whl -
Subject digest:
1c3593475136540f3ff000cba9a8959bfbb5c208bda1283ddaed07a67cd50ad5 - Sigstore transparency entry: 1392656640
- Sigstore integration time:
-
Permalink:
HumanAssisted/JACS@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Branch / Tag:
refs/tags/pypi/v0.10.0 - Owner: https://github.com/HumanAssisted
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@7ce6bac8f5ec77af347c9b591e5e819bb426ed65 -
Trigger Event:
push
-
Statement type: