Every agent today gets access the same way: you hand it your API key and hope. Token Holder replaces that with a protocol — grant-gated, per-agent-signed, and cryptographically audited end-to-end.
Little Snitch for AI file access. See every file your AI just touched. Revoke an individual agent in one command. Prove what happened to a compliance auditor — or to yourself, next month.
The gap
There's no good way today to say "this agent may read my vault under Projects/BTO, but not Projects/MLC." No record of what it actually did. No way to revoke a single agent session without revoking the whole app it runs inside.
Token Holder sits between agents and the things they want to touch — API keys, vault files, usage data — and enforces three things: who is asking, are they allowed, and did it happen.
Who it's for
Same wallet. Different surface. Tap a card for the full pitch.
The three-level identity model
Stripe's analog: merchant account, API key, signed HTTP request. Each layer verifiable and revocable independently.
Which app is talking? A per-app bearer token, scope-bounded.
Which instance of that app? Ed25519-keyed. Revoke one without revoking the app.
Is this exact request authentic? Signed over canonical form, within replay window.
The differentiator
Most RBAC layers stop at allow/deny. Token Holder's usage log is a
SHA-256 hash chain. Each row's hash depends on the previous row's.
Tampering breaks the chain and /usage/verify reports
exactly where.
row_hash = SHA-256( prev_hash || canonical(row) ) · GENESIS-rooted · ordered by insert
Each consumer can pull their own audit trail through
/my/usage/* without admin scope — the customer sees what
the vendor's agents actually did against their data.
Where we fit in the AI stack
Eight layers make modern AI work — physical silicon at the bottom, you at the top. Every layer below the dotted line is someone else's problem: NVIDIA, OpenAI, Anthropic, Meta, Claude Code, Cursor. The moment that stack reaches for your data, it talks to us.
The entire AI stack exists to help an agent do something useful. The
minute that agent wants to touch your stuff, there's a
narrow band where access has to be authorized, attributed, and
recorded. That narrow band is everyone's blind spot — and it's the
only layer we work on.
Hover any layer for detail.
How you plug in
The SDK is headless. Works in Node, Bun, Deno, edge runtimes, and
browsers (with a provided token). Signs requests automatically when
given an Ed25519 key or the TH_AGENT_PRIVATE_KEY env var.
import { createClient } from "@token-holder/client-sdk"; const th = createClient({ consumerId: "my-app", agentId: crypto.randomUUID(), agentName: "research-bot-v1", }); // every call gated, signed, audited, agent-attributed const check = await th.checkGrant({ dataType: "obsidian_vault", permission: "read", path: "Projects/BTO/readme.md", }); if (check.allowed) { const file = await th.vault.read("Projects/BTO/readme.md"); } // caller's OWN audit trail, no admin needed const mine = await th.my.usage.summary();
Private alpha today — distribution via signed tarball. Reach out for access.
SOON A full docs site is in flight — MCP configs, CLI wrappers, framework integrations, compliance export formats. Alpha participants get direct access to the reference integrator (Clawnoly) while it's still private.
The verticals we're shipping
Each piece is a separate package or product, but they all speak the same underlying Token Holder protocol. Pick the ones that match your integration — or run the whole stack and watch every agent on your machine at once.
One protocol, four bands of surfaces. Pick the one that matches how the agent touches your data — the rest share the same signed chain underneath.
Wallet + signed chain + identity. The engine.
SDKs, CLIs, MCP servers. Speak the protocol.
Wrap tools that don't know TH exists.
Kernel-class monitor, interactive approval.
Not sure where to start?
Developer → SDK.
Local AI user → MCP filesystem or th-wrap.
Security ops → wallet + audit chain.
Owner UI + protocol engine. Unlock, configure vault paths, manage consumers + grants, see the signed audit chain visually. Tauri app, Rust + axum backend on 127.0.0.1:9473.
Every access — allow, deny, signature invalid — becomes a SHA-256-chained row. /usage/verify walks and proves integrity; /usage/export emits a compliance-grade bundle.
Consumer token · per-instance agent id · per-request Ed25519 signature. Option A (claim) and Option B (signed) both shipped. Revoke a single agent without revoking the app it runs inside.
Headless TypeScript. Zero native deps. Signs every request when a key is present. Works in Node, Bun, Deno, browsers, edge runtimes. Five minutes from pnpm add to audited access.
Every wallet op from a shell. th consumers register · grants create · agents register --generate · audit verify · my usage history. Scripts hit the same surface as humans.
Stdio adapter exposing admin + grant + audit operations to Claude Code, Cursor, Windsurf. Agents manage the wallet itself via MCP tool calls — the conversational configuration story.
Drop-in replacement for the reference MCP filesystem server. Every read / write / list / edit through your AI tool lands in the audit chain, scoped by grants. Same tool names, zero code changes on the agent side.
CLI shim for anything that's not MCP-aware. th-wrap -- codex add-retry-logic launches the tool under a libc interposer; every open / write / unlink gets logged. Works for Codex, aider, Python scripts, local LLM agents — anything.
Terminal harness. Every spawn auto-provisions a fresh Ed25519 identity registered with TH; tools inside the terminal sign transparently via the SDK. Option B by default, Option A fallback if the wallet is down.
macOS Endpoint Security agent. Watches filesystem events system-wide, attributes them to processes, routes into TH. Separate signed binary from the wallet — a UI vulnerability can't escalate into system omniscience. Apple entitlement review; gated on pilot revenue.
"Claude wants to write ~/.ssh/known_hosts — allow once / allow session / deny / deny + revoke." The moat: turns the audit layer into a real-time access broker. Needs Phase 4's kernel interception to intervene in-flight.
Once identity + monitor are both in place, per-agent access baselines become possible. "Claude historically reads ./src/**; it's about to open ~/.aws/credentials — legit?" Trust graduates; anomalies flag themselves.
Agent identity roadmap
X-Agent-ID / X-Agent-Name headers. Claim-only; populates agent_id on every chain row.
Every request signed over canonical form. Middleware verifies, stamps agent_verified=true. Compromising a token no longer rewrites history.
PAKE-style (Dragonfly / OPAQUE) session key per agent. Deferred until Token Holder is exposed over the network.
The mascot
Ravens are pattern-watchers. They remember faces. They hold grudges against specific bad actors without painting the whole flock with one brush. That's exactly the job of the security layer — distinguish the agent that behaved from the one that didn't, keep receipts, and do it without getting in the way of the ones doing honest work.
The Raven is also the name of Token Holder's reference monitoring agent — an optional preset that watches the audit chain and flags anomalies. Mascot and implementation carry the same motif.