Verifiable agent actions.
Every action becomes signed context for the next.
Add atrib at an SDK, MCP, or daemon boundary you already own. Selected actions become a signed context graph: who acted, what evidence mattered, and what the next agent should build on.
Then verify it without trusting us, or any single log.
pnpm add @atrib/mcpimport { atrib } from "@atrib/mcp"
server.use(atrib())Why atrib exists
Agent systems already produce chats, traces, logs, and memory writes. What they rarely produce is a past another agent can prove and use: who signed the action, what evidence mattered, what changed, and which prior belief was superseded.
server.use(atrib()) adds that evidence without changing the primary path. Each action becomes a signed receipt inside a graph that grows and evolves. Recall, audit, handoff, and settlement can read from the same verified chain instead of four disconnected logs.
MCP 2026-07-28
One request in. A verifiable receipt out.
Add verifiable records to a tool call without adopting a new agent runtime or maintaining an atrib transport session. The request carries its context. The result can carry a receipt any verifier can check.
Normal tool output
Signed record
Stateless transport
No prior connection, initialize exchange, or session header is needed. Reads retry as new requests. Writes retry with the same complete arguments and action-bound idempotency key.
Durable signed state
The receipt proves what the named key signed. It does not prove a real-world claim is true. Authorization, tool-side, counterparty, and log evidence remain separate checks.
The layer
One layer, three primitives,
a context graph.
atrib sits between the agents that act and the systems that read those actions.
Everything on the top plugs in through one package.
Everything on the bottom becomes context for the next pass.
Signature
Every action, provably authored. Ed25519 over canonical JSON.
Chain
Every action, linked to what caused it. A causal graph, by construction.
Receipt
Every chain, readable by anyone. Verified through receipts, traces, annotations, and revisions.
The next agent starts from verified context, not memory drift.
Teams can replay which evidence changed a decision.
Corrections become signed context for future work.
The next agent starts from verified context, not memory drift.
Teams can replay which evidence changed a decision.
Corrections become signed context for future work.
Receipts flow out, settle, audit, and return as the next trace. The loop closes by itself. You didn't write a single line to make that happen.
Two verbs, and the relationships you declare.
One verb writes and one verb reads. The graph is not built from a growing set of primitives; it is built from the relationships you declare on the way past, which is why adding a new kind of claim rarely means adding a new call.
attestwrites, and signsOne call. What it signs depends on the relationship you declare, and the schema rejects contradictions rather than guessing.
- no ref → an observation
- You noticed or concluded something in the present moment.
- ref: { kind: "annotates" } → a mark on a past record
- A record turned out to matter. Carries importance, topics and a one-line summary, so later recall can rank it.
- ref: { kind: "revises" } → a supersession
- You now hold a position incompatible with an earlier one. Carries the prior position, the new one, and the reason.
informed_by names the prior records that actually changed what you did. That is where the edges come from, so precision matters more than completeness: everything you happened to read is noise.
recallreads, and signs nothingOne call, dispatched by shape. Each shape answers a question you would otherwise have to hold in your head between sessions.
- history
- What did I do recently, or matching this filter?
- content
- What do I know about this topic across records?
- walk
- How did we get here? Lineage, forward or backward.
- annotations
- What did anyone say about this record's importance?
- revisions
- Has this position been superseded since?
- chain
- What happened in this session, in order?
- orphans
- What did I note and never follow up on?
- by_signer
- Who else has records here?
It carries what you already use.
Every layer below already knows one part of what happened. None of them can prove any of the others, because each is a different vendor’s word for it. atrib replaces none of them and carries a record between them that anyone can check.
Agent runtimes
which agent acted, under whose key
Claude Agent SDKOpenAI AgentsLangGraphLangChainGoogle ADKMicrosoft Agent FrameworkVercel AI SDKMastraTools
what it called, and what came back
MCPBrowserbaseStagehandFirecrawlMemory and context
what it relied on when it decided
Mem0LettaLlamaIndexGraphitiTracing
what the host observed while it ran
OpenInferenceOpenTelemetryPayments and credentials
what it committed to, and on whose authority
x402x401AP2ACPUCPOpenETRAgent to agent
what was handed off, and what was still open
A2A
Each of these has a working integration in the public repo. The list grows; the record format does not have to change when it does.
Builds on
Each of these is open and standard. atrib wires them into signed context records that agents and people can verify.
The full chain
- 01Ed25519 signature (RFC 8032) over JCS-canonicalized JSON (RFC 8785).
- 02Record hash committed to an append-only Merkle log (RFC 6962).
- 03Log served via C2SP tlog-tiles, state signed as C2SP tlog-checkpoints.
- 04Each record bound to the agent's OpenTelemetry trace via its W3C Trace Context trace-id.
Verifying a record means checking the signature, the Merkle inclusion proof, and the checkpoint signature.
Why you can build on it
Context you don't have to trust us for.
- 01Verifier-first
Check the signature, the inclusion proof and the checkpoint yourself. The verifier is a pure function: no network, no clock, no randomness, so two runs on the same bundle agree.
- 02More than one anchor
A record can be anchored to an atrib log, Sigstore Rekor, an RFC 3161 timestamp, OpenTimestamps. Two under different operators and your trust stops ending at ours. One anchor is a tier, not a failure.
- 03Anchor it later, without the key
Anchoring is permissionless and post-hoc. Anyone can anchor an existing record hash to another service afterwards. No signed byte changes when they do.
- 04Standard primitives
Ed25519, SHA-256, JCS, RFC 6962, C2SP checkpoints, and OpenTelemetry trace context.
- 05Composable adoption
Use agent middleware, an MCP wrapper, OpenTelemetry spans, or the two verbs directly.
- 06Self-hostable
Apache 2.0. Run your own log; the verifier still has the same job.
Start in a minute
Install the package, add the middleware, then inspect the signed context graph in the explorer.
pnpm add @atrib/mcp