Attest — Proof layer for AI agents
Decide → Gate → Verify → Attest. When an AI agent takes an action in the real world, Attest decides whether it may, gates it behind a human when it matters, verifies from the system of record that it actually happened, and records tamper-evident evidence.
Attest is not an agent framework, not a connector platform, not a guardrail filter. It is the layer that lets a team say, with proof: "this agent did exactly this, as this person, and it worked."
Read in this order
| Doc | What it locks |
|---|---|
| 01 — Vision | What Attest is, what it is not, the thesis |
| 02 — Product | The four steps, surfaces, what a customer experiences |
| 03 — Universal adapter | All apps, all actions: descriptor, entry points, verification ladder, auth, confirm, policy |
| 04 — Architecture | SDK + Cloud, stack, data model, ledger |
| 05 — Market & positioning | Why now, competitors, first vertical, go-to-market |
| 06 — Build plan | Phases, weekly plan, what we reuse, what we do not build |
| 07 — Decisions | Locked decisions and open questions |
| 08 — Phase plan | Detailed phase-wise split: task IDs, deliverables, exit criteria, milestones, founder checklist |
Quickstart
Brand Attest · PyPI attestlayer · npm attestlayer · deploy runbook in DEPLOY.md.
TypeScript — on npm today:
npm install attestlayer
import { Attest } from "attestlayer";
const at = new Attest({ agent: "followup-agent@v3", readers: { gmail: process.env.GMAIL_TOKEN! } });
const sendEmail = at.wrap({ system: "gmail", verb: "send", target: "to" },
async ({ to, subject, body }) => gmail.send({ to, subject, body }));
await sendEmail({ to: "arun@newco.com", subject: "Proposal", body: "…" });
Python — same contract, same ledger format:
pip install attestlayer # publishing pending; today: pip install -e ".[dev]"
import attest
@attest.action(system="gmail", verb="send", target="to")
def send_email(to, subject, body): ...
The first external send pauses for a human; the ledger row says acknowledged, or verified once Attest can
read back with the agent's own credentials (Attest(readers={"gmail": service})). attest ledger · attest verify.
Full docs: mkdocs serve → docs/site.
Repository
| path | what |
|---|---|
| attest/ | Python SDK — descriptor, registry, policy, hash-chained ledger, verification ladder + recipes, gates (console / Slack / webhook / inbox / LangGraph interrupt / pending + resume), adapters (LangGraph, OpenAI Agents), MCP proxy, CLI, cloud client. attest/README.md |
| cloud/ | Attest Cloud v0 — FastAPI + Postgres: orgs, keys, agents, versioned policy, per-org hash-chained ledger, confirm inbox with Slack / webhook, exports |
| dashboard/ | Next.js dashboard — ledger drill-down, confirm inbox, policy / keys / settings |
| examples/ | unknown app (L1 → L3), LangGraph agent (two verified rows), OpenAI Agents, MCP config, API-only, cloud |
| docs/site/ | documentation site (mkdocs) · docs/ — product docs 01–08 · docs/notes — DO / DeerFlow extraction |
| deploy/ | Dockerfiles + compose (Postgres, API :8400, dashboard :3400) |
| launch/ | Show HN, blog drafts, LangChain integration PR draft |
| DEPLOY.md · CHANGELOG.md | release (git tag vX.Y.Z → PyPI, npm, GHCR, Pages) and hosting runbook |
pytest -q && (cd cloud && pytest -q) # 273 + 21 tests
ATTEST_AUTO_APPROVE=1 python examples/langgraph_agent.py
cd deploy && cp .env.example .env && docker compose up # cloud + dashboard
One-line rules
- We never execute the customer's action. Their tool executes; we observe, decide, gate, verify, record.
- Coverage is universal (any app, any action, any framework, any language). Verification depth is layered and honest.
- Open-source SDK (MIT). Paid cloud (ledger, confirm inbox, policies, exports).
- Developer-led, self-serve, USD. No enterprise sales motion in year one.
Install from registries
| where | how |
|---|---|
| PyPI (publishing pending) | pip install attestlayer → attest, attest-mcp, attest-mcp-server, attest-gateway, attestlayer |
| MCP Registry | io.github.dev-prathap/attest (verify server) · io.github.dev-prathap/attest-proxy (zero-code proxy) — uvx attestlayer |
| Claude Desktop / Smithery | MCPB bundle from mcp/mcpb (mcpb pack mcp/mcpb) |
| npm | npm install attestlayer — live |
| Docker | ghcr.io/dev-prathap/attest-api, ghcr.io/dev-prathap/attest-dashboard |
Lineage
Attest is extracted from two working codebases: DO (policy engine, read-back verification pairs, evidence ledger, Nango auth) and DeerFlow (tool receipts, verification patterns, MCP/IM channel adapters). Nothing here is theoretical — every core mechanism already runs against real Gmail, Slack, HubSpot, Notion, Linear and Google Workspace.
Release files for attestlayer 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| attestlayer-0.1.0.tar.gz | 311.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| attestlayer-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 455.8 kB
Release files / attestlayer-0.1.0.tar.gz
| Download URL | attestlayer-0.1.0.tar.gz |
|---|---|
| Size | 311.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a2797532b970ea8d3d97d8e087f8ddbc4e8bdde3ac56c4c5c2c056e31af54c0
|
|
BLAKE2b-256 checksum How to use checksums |
940c3ed1638ec536a17aed0ae21df1fbbb52dc026c7305d4907df760d6b9543d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / attestlayer-0.1.0-py3-none-any.whl
| Download URL | attestlayer-0.1.0-py3-none-any.whl |
|---|---|
| Size | 144.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
28926c61c1b989572244bdf113266d875c2bea45a8e202341085531b9e0bcf17
|
|
BLAKE2b-256 checksum How to use checksums |
0af41698eb2df9ad64c110f9defdf89e0d5e9783c6bd4da968d7d23fe8485c58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|