Verify an agent fleet's tamper-evident ledger, check budgets, kill a runaway agent. Local-first.
Mandare MCP Server (com.mandarelabs/mandare)
The Mandare MCP server verifies an agent fleetβs tamper-evident ledger, checks budgets, and can kill a runaway agent. It is described as local-first and is focused on operational verification and safety controls for agent fleets.
π οΈ Key Features
Verify an agent fleetβs tamper-evident ledger
Check budgets
Kill a runaway agent
Local-first operation
π Use Cases
Auditing or validating agent fleet ledger integrity
Enforcing budget limits during agent execution
Stopping runaway agents in an automated agent environment
β‘ Developer Benefits
Provides ledger verification for agent fleet operations
Supports budget checking for runtime governance
Enables programmatic termination of runaway agents
β οΈ Limitations
Source data does not specify available MCP tools, APIs, or configuration details beyond the listed capabilities
Give your agents a budget they cannot talk their way out of.
Mandare is the accountability stack for AI agent fleets: signed agent
identity (Passport), signed machine-readable authority (Mandate), a
tamper-evident ledger of what agents actually did (Ledger), an offline
kill switch β and external witnessing + public anchoring so ledger
history cannot be truncated or rewritten without detection (with the witness
on separate infrastructure, not even by the operator β the solo compose
stack runs everything on one host and says so). Local-first: raw activity
never leaves your machine.
A runaway agent loop dies at β¬20 in the no-docker demo β call #72 is refused, the refusal is written to the ledger, and mandare verify checks the chain
Replay of the captured Demo 1 run
(pnpm demo, the no-docker path; the docker quickstart stops at call #24) β the
same script CI executes and asserts on every push. Regenerate:
node scripts/render-demo-gif.mjs.
Quickstart β 3 commands, no API keys needed
Needs Docker with Compose v2 (up --wait needs v2.1.1+). The images build
locally on first run, which takes a few minutes.
bash
git clone https://github.com/mandarelabs/mandare && cd mandare
bash
docker compose up -d --wait
bash
docker compose run --rm demo
The demo releases a runaway agent loop against your gateway, priced
against a bundled mock provider: the enforcement is real, the money isn't.
The β¬20/day mandate kills it mid-run: 23 calls settle β¬19.17, call #24's reservation would
cross β¬20 and is refused 403 PER_DAY_EXCEEDED, the refusal is itself a ledger entry, and
mandare verify proves chain VALID, counters == replay(ledger), and the
witnessed head history covers the chain. Dashboard at
http://127.0.0.1:8788. Real providers: put keys in .env
(docs).
When you're done, docker compose down -v removes the containers and the
demo volumes (mandare-data, mandare-witness-state).
No docker (Node β₯ 22.13 and pnpm 10; if pnpm is missing, install.sh runs
corepack enable, a global change):
bash
./install.sh
bash
pnpm demo
(pnpm demo runs a cheaper model and raises the gateway's default 60
calls/minute velocity limit so the budget is the only limit in play: 71 calls,
call #72 refused at the same β¬20 cap. The docker demo above runs the stack's
real defaults.)
pnpm demo runs without a witness, so mandare verify there can't see
entries dropped from the end of the ledger β refusals included β unless you
pass a saved --prev-head. The docker stack runs a witness, and
pnpm demo:witness shows it catching exactly that.
Or from npm (CLI + MCP server, no checkout; the MCP server reads the ledger
at MANDARE_LEDGER_DB, default ./mandare-ledger.db):
bash
npm i -g @mandarelabs/cli && mandare help
bash
npx -y @mandarelabs/mcp-server
Where state lands: the CLI's vault (./mandare-vault.db, used by passport issue and vault β¦) keeps its master key in the OS keychain by default;
passport issue writes the agent's credential and key under
~/.mandare/agents/ by default; and unless MANDARE_VAULT=1, the door's private key sits
next to the ledger (<ledger>.doorkey.pem, mode 0600).
Proofs, not data
Raw prompts and responses never leave your machine. What crosses a trust
boundary is only ever a proof: salted tree heads to the witness, an
integrity certificate to an auditor, a revocation bitstring to a verifier.
code
agent (any SDK, base URL β the door)
β RFC 9421-signed request (passport) or scoped PoP token
βΌ
βββββββββββββββββ gateway door βββββββββββββββββ
β kill-check β policy (mandate: caps/window/ β ββ witness (external) ββ
β scope/approval) β INTENT entry (reserves ββββββΆβ salted head history, β
β cost in the ledger tx) β provider β RESULT β acksβ consistency-enforced,β
β entry (settles true cost) βββββββ public anchor (OTS) β
βββββββββββββββββ¬βββββββββββββββββββββββββββββββ ββββββββββββββββββββββββ
βΌ
append-only ledger (SQLite/Postgres)
hash-chained Β· door-signed Β· RFC 6962 tree
budget counters + revocation = PROJECTIONS (replay-checkable)
βΌ
mandare verify Β· certify (third-party checkable) Β· dashboard Β· kill
Every door obeys three rules: fail-closed on spend, log-before-act,
and agent input is hostile. Refusals are ledger entries β the system keeps
its no's, and a witness keeps them from being quietly dropped.
The five demos are the acceptance tests (CI runs all of them)
#
Claim
Run
1
A runaway loop dies at β¬20, with proof
pnpm demo
2
A stolen token is dead paper; kill bites mid-task
pnpm demo:dead-paper
3
One signed mandate replaces 40 prompts; humans approve async
pnpm demo:mandate
4
The card declines AT THE NETWORK; one cap governs both rails
pnpm demo:card
5
Truncation and rewrites can't hide from an independent witness (verified with the door key held out-of-band)
pnpm demo:witness
Each demo also exists as a self-contained, narrated scenario in
examples/ β the story, the real captured output, and the code
to read next.
Integrations
Surface
Where
What
TypeScript SDK
packages/sdk (Apache-2.0)
A signed fetch for your existing Anthropic/OpenAI SDK (token PoP + passport RFC 9421)
Python client
packages/sdk-py (Apache-2.0)
Zero-dependency token-mode client (stdlib only)
MCP server
packages/mcp-server
The door as MCP tools: verify, budgets, issuance, kill β stdio, env-configured
OpenClaw skill
integrations/openclaw
Native AgentSkills skill (also works in Claude Code): budget awareness, honest refusals, proofs, kill
Self-host
compose.yaml + install.sh
gateway + witness + dashboard, no secrets needed for dry-run
Dashboard
apps/dashboard
Local-first fleet view over the ledger; zero telemetry
Docs
apps/docs β mandare.dev
Quickstart, concepts, threat model, reference
Security & provenance
Adversarially reviewed before launch β by AI, not yet by an external
auditor: four parallel AI-assisted review passes (crypto/integrity Β·
spend/enforcement Β· packaging/supply-chain Β· docs-vs-claims) were prompted
to break the system. 15 findings β 3 HIGH β all fixed with regression tests
or documented as accepted residuals, none silent. Full report:
docs/SECURITY-REVIEW-S8.md, including what
was probed and held, the honest residuals, and the target list for the
external audit. A second AI-assisted audit pass (2026-09) found further
spend, witnessing and packaging defects; their fixes and red-team cases are
logged in TASKS.md (S10-fix 2Aβ2D). The external audit is still pending.
Fail-closed by construction: no mandate β no spend; ledger down β no
action; witness dead β high-value actions refuse (the kill switch never
depends on anything remote).
Red-team suites run in CI (rule R5): edit/delete/truncate/rollback/
replay/forge on SQLite AND Postgres, token theft + replay, signature
coverage attacks, webhook forgery, budget races, witness split-view β and
they may never be weakened to make a change pass.
Supply chain: pnpm 10 with install scripts off, 3-day dependency
cooldown, frozen lockfiles, hand-rolled security primitives pinned to
official test vectors where they exist (RFC 6962 CT vectors, did:key/base58)
and otherwise tested against the published wire scheme with adversarial
round-trip suites (Stripe signatures, OpenTimestamps). From launch: npm
Trusted Publishing (OIDC provenance), cosign-signed images, signed skill
envelopes. Honest reproducibility bar in
REPRODUCING.md.
Verify without trusting us: the verifier, passport, and witness
protocol are Apache-2.0 and embeddable; mandare certify produces
integrity certificates a third party checks with no ledger access.
Vulnerabilities: see SECURITY.md (private reporting, safe
harbor, 90-day disclosure).
License
AGPL-3.0-only, except the embeddable packages listed in
LICENSING.md (spec, policy-engine, verifier, passport,
witness-protocol, sdk, sdk-py β Apache-2.0). The split is permanent; we do
not relicense.
Install
Configuration
Environment variables
MANDARE_LEDGER_DBrequired
Path to the Mandare ledger database this MCP server verifies and kills against
MANDARE_MCP_HOME
Directory where issued artifacts (mandates, credentials, token grant files) are written (default ~/.mandare/mcp)
MANDARE_WITNESS_URL
Witness server URL β enables truncation/rewrite checks and certificate export
MANDARE_WITNESS_PUBLIC_KEY
The witness's Ed25519 public key (64 hex chars), obtained out-of-band
MANDARE_GATEWAY_URL
Running gateway base URL β enables the gateway health tool
MANDARE_MCP_ALLOW_REINSTATE
Set to 1 to expose the reinstate tool (off by default; kills only close doors)