Install
openclaw skills install mpps-attestationCreate tamper-proof receipts for AI agent work. Hash artifacts or action manifests, POST to api.mpps.io, get an HSM-signed receipt. No API key.
openclaw skills install mpps-attestationCreate tamper-proof receipts for agent actions via mpps.io. No API key. No SDK required. One HTTP call.
Source: https://github.com/gdlg-ai/mpps.io (MIT) Docs: https://github.com/gdlg-ai/mpps.io/blob/main/docs/api.md
Use /v1/receipts when you know what action happened and which artifacts it produced.
ARTIFACT_HASH=$(sha256sum "$ARTIFACT_PATH" | awk '{print "sha256:" $1}')
curl -s -X POST https://api.mpps.io/v1/receipts \
-H "Content-Type: application/json" \
-d "{
\"action\": \"agent.task.complete\",
\"subject\": \"$ARTIFACT_PATH\",
\"artifact_hashes\": [
{\"label\": \"$ARTIFACT_PATH\", \"sha256\": \"$ARTIFACT_HASH\"}
],
\"context\": {
\"repo\": \"${GITHUB_REPOSITORY:-local}\",
\"commit\": \"${GIT_COMMIT:-unknown}\"
}
}"
Returns: uuid, receipt_type, manifest_hash, manifest, timestamp, HSM signature, and verify_url.
Use /v1/notarize when you only need to anchor one hash.
HASH=$(echo -n "$DATA" | sha256sum | awk '{print "sha256:" $1}')
curl -s -X POST https://api.mpps.io/v1/notarize \
-H "Content-Type: application/json" \
-d "{\"content_hash\": \"$HASH\"}"
import hashlib
import requests
artifact = b"agent output bytes"
h = "sha256:" + hashlib.sha256(artifact).hexdigest()
receipt = requests.post(
"https://api.mpps.io/v1/receipts",
json={
"action": "agent.task.complete",
"subject": "output.json",
"artifact_hashes": [{"label": "output.json", "sha256": h}],
"context": {"runner": "codex"},
},
timeout=30,
).json()
print(receipt["uuid"])
print(receipt["verify_url"])
curl https://api.mpps.io/v1/verify/mpps_att_0c27bebca6dc4bd6
For structured receipts, recompute the manifest hash if you need stronger evidence:
python3 - <<'PY'
import hashlib, json
r = json.load(open("receipt.json"))
manifest = r["manifest"]
canonical = json.dumps(manifest, sort_keys=True, separators=(",", ":")).encode()
print("sha256:" + hashlib.sha256(canonical).hexdigest())
print(r["manifest_hash"])
PY
Send hashes and small labels, not raw private content. Avoid hashing short secrets directly; use larger payloads or a salt. Do not put secrets, customer data, raw prompts, or private source text in context.
agent_id is a weak source fingerprint, not authenticated identity