Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Attestari

by attestariversion 0.0.8i★ –iRuns on your computer
Registry nameio.github.attestari/attestari

Install

Overview

Description from the maker (original English)

Auditable memory for AI agents: provable deletion, tamper-evident audit, time-travel recall.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Travel, maps & weather
  • You need to fill in: ATTESTARI_KEK, ATTESTARI_DATABASE_URL, ANTHROPIC_API_KEY

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • You fill in yourself: ATTESTARI_KEK, ATTESTARI_DATABASE_URL, ATTESTARI_SQLITE_PATH, ATTESTARI_MCP_ALLOW_FORGET, ANTHROPIC_API_KEY

Values marked secret are keys to your account. Never share them or paste them into a chat.

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "attestari": {
      "command": "uvx",
      "args": [
        "attestari"
      ],
      "env": {
        "ATTESTARI_KEK": "your-value",
        "ATTESTARI_DATABASE_URL": "your-value",
        "ATTESTARI_SQLITE_PATH": "your-value",
        "ATTESTARI_MCP_ALLOW_FORGET": "your-value",
        "ANTHROPIC_API_KEY": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add attestari --env ATTESTARI_KEK=your-value --env ATTESTARI_DATABASE_URL=your-value --env ATTESTARI_SQLITE_PATH=your-value --env ATTESTARI_MCP_ALLOW_FORGET=your-value --env ANTHROPIC_API_KEY=your-value -- uvx attestari

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "attestari": {
      "command": "uvx",
      "args": [
        "attestari"
      ],
      "env": {
        "ATTESTARI_KEK": "your-value",
        "ATTESTARI_DATABASE_URL": "your-value",
        "ATTESTARI_SQLITE_PATH": "your-value",
        "ATTESTARI_MCP_ALLOW_FORGET": "your-value",
        "ANTHROPIC_API_KEY": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "attestari": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "attestari"
      ],
      "env": {
        "ATTESTARI_KEK": "your-value",
        "ATTESTARI_DATABASE_URL": "your-value",
        "ATTESTARI_SQLITE_PATH": "your-value",
        "ATTESTARI_MCP_ALLOW_FORGET": "your-value",
        "ANTHROPIC_API_KEY": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • ATTESTARI_KEK secret env
    Base64 32-byte root key. Set it to enable encryption at rest and cryptographic erasure (forget() destroys the subject's key and signs the certificate). Without it, forget() is a logical delete and ce…
  • ATTESTARI_DATABASE_URL secret env
    Postgres DSN. Set it to use Postgres + pgvector instead of the default local SQLite file (concurrent access, indexed hybrid search).
  • ATTESTARI_SQLITE_PATH env
    Where the default SQLite ledger lives.
  • ATTESTARI_MCP_ALLOW_FORGET env
    Set to 1 to offer the forget_subject tool (off by default, since erasure is irreversible and an agent can be steered by what it reads). When on, it is flagged destructive and takes two calls: a previ…
  • ANTHROPIC_API_KEY secret env
    Enables Claude-powered fact extraction; falls back to the built-in regex extractor when unset.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account attestari, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Travel, maps & weatheri

  • More stars than 0% of the other 1706 servers in this category
  • Published to the registry more recently than 52% of the other 1706 servers in this category
  • Basic checks equal to or better than 100% of the other 1706 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Attestari safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: ATTESTARI_KEK, ATTESTARI_DATABASE_URL, ANTHROPIC_API_KEY

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.0.8) reached the registry 29 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: topo^alpin, Agent Data Tools: Everyday data, Exely MCP by usefulapi

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

topo^alpin

by topoalpin.app

Avalanche bulletins, mountain weather, stations, huts, ski and snowshoe tours in the Alps.

Runs in the cloudUpdated today
Install

Read hotel bookings, rooms, cancellation rules and daily occupancy in Exely.

Runs in the cloudUpdated today
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

Attestari

The auditable memory layer for AI agents. Give your agent long-term memory — like any memory layer — except every fact carries a receipt (where it came from, when), it runs on plain Postgres, the audit trail is tamper-evident, and any user's data can be provably deleted with a signed certificate.

from attestari import Memory

mem = Memory() mem.add("Hi, I'm Alice. I live in Toronto and I work at Acme.", subject_id="alice", valid_from="2021-06-01") mem.add("Update: I moved to Berlin and I now work at Globex.", subject_id="alice", valid_from="2026-01-01") # supersedes Acme + Toronto

mem.answer("where does the user work", subject_id="alice") # -> "Globex" (latest) mem.answer("where did the user live", subject_id="alice", as_of="2022-01-01") # -> "Toronto" (time-travel)

cert = mem.forget("alice") # right-to-be-forgotten -> a signed deletion certificate

No database, no API key, no model download required to run that — the core engine has zero dependencies.


Contents

  • Why it's different
  • What you get
  • Quickstart (30 seconds)
  • The Python API
  • Run it for real — Postgres · server + console · MCP · TypeScript
  • REST API
  • Configuration
  • Provable deletion + tamper-evident audit, in one demo
  • Already using Mem0 or Zep? Wrap it
  • For auditors and DPOs
  • How it works — and the Atlas, the engine on one illustrated page
  • Project layout
  • Docs & contributing

Why it's different

Hosted memory is a black box: you can't see where a "memory" came from, you can't cleanly delete one user's data, and you can't *prove* the history wasn't altered. For a bank, hospital, or insurer — and under GDPR / the EU AI Act — that's a dealbreaker. Attestari is the neutral, self-hostable layer that fixes exactly that.

AttestariTypical memory layer
Runs on plain Postgres (no graph DB)✅✗ (needs Neo4j / a vector service)
Provenance on every fact✅partial
Bi-temporal ("what was true on date D?")✅✗
Provable deletion + certificate (GDPR)✅✗
Tamper-evident audit trail (hash chain)✅✗
Works across model vendors✅usually locked to one

The last two rows are the moat. Deletion you can prove: each user's data is encrypted with their own key; forget() destroys the key, so the content is unrecoverable — while an immutable log and a signed certificate remain as proof. A history you can verify: every event is hash-linked, so verify_audit() catches any edit, insert, or delete — and the proof survives deletion.

What you get

  • Provenance on every fact — each memory traces back to the exact source message, with a character span, confidence, and timestamps.
  • Bi-temporal time travel — query memory as_of any past instant; corrections supersede old facts without erasing them, so history is always reconstructable. as_of filters on valid time (when a fact was true). System time (when Attestari recorded it) is stored on every fact, but there's no query on it yet.
  • Provable deletion — forget(subject_id) crypto-shreds a user's data and returns a signed DeletionCertificate; content backups and replicas are covered (key storage needs its own backup policy — see the threat model).
  • Tamper-evident audit — a hash-linked event chain; verify_audit() detects any edit/insert/delete, and the proof survives crypto-shred.
  • Conflict resolution — single- vs multi-valued predicates; conflicts are surfaced via conflicts(), not silently dropped.
  • Entity resolution — merge "the same entity, many surface forms," reversibly. Merges are recorded, but reads don't follow them yet: search() and timeline() still see each surface form separately.
  • Hybrid retrieval — semantic (pgvector) ⊕ keyword (full-text), with the bi-temporal filter built in.
  • Runs anywhere — zero-dependency in-memory engine, or durable on one Postgres
  • pgvector container. No graph database. Works across model vendors.

Quickstart (30 seconds)

git clone https://github.com/attestari/attestari && cd attestari

python examples/spike.py # zero-dep end-to-end loop python examples/agent_with_memory.py # the "give an agent memory" pattern

You'll see facts change over time, a bi-temporal query answer differently "as of" different dates, a provenance trace back to the source, and a forget() that issues a certificate. No install, no API key, no database.

The Python API

One facade, Memory, covers the whole surface:

from attestari import Memory

mem = Memory() # zero-dep, in-memory (tests, demos)

mem = Memory.local() # durable in one local SQLite file — zero infrastructure

mem = Memory.postgres() # durable on Postgres + pgvector (production service)

--- write -------------------------------------------------------------

fact_ids = mem.add( "I moved to Berlin and I now work at Globex.", subject_id="alice", # whose memory this is valid_from="2026-01-01", # when it became true (defaults to now) source_ref="chat:msg-42", # where it came from (for provenance) )

--- read --------------------------------------------------------------

mem.search("where does the user work", subject_id="alice") # ranked SearchResults mem.answer("where does the user work", subject_id="alice") # -> "Globex" mem.answer("where did the user live", subject_id="alice", as_of="2022-01-01") # time travel: recall as-of a past date mem.timeline(subject_id="alice") # full bi-temporal history mem.get_provenance(fact_ids[0]) # source episode + span mem.conflicts(subject_id="alice") # surfaced conflicts

--- govern ------------------------------------------------------------

report = mem.verify_audit() # AuditReport — is the hash chain intact? cert = mem.forget("alice") # DeletionCertificate — provable erasure

MethodReturnsWhat it does
add(text, *, subject_id, valid_from=…, source_ref=…)list[str]Ingest a message; extract, dedup, and supersede facts.
search(query, *, subject_id, as_of=…, limit=5)list[SearchResult]Hybrid retrieval with an optional time filter.
answer(query, **kwargs)`str \None`The single top object for a query.
timeline(*, subject_id)list[Edge]Every fact for a subject, live and superseded.
get_provenance(fact_id)`Provenance \None`Trace a fact to its source episode + span.
conflicts(*, subject_id=None)list[dict]Conflicts resolved by predicate cardinality.
resolve_entities(names=None, *, auto=True)ResolutionResultMerge duplicate entities (reversible).
forget(subject_id)DeletionCertificateCrypto-shred a subject; return proof.
verify_audit(deep=False)AuditReportVerify the tamper-evident hash chain; deep=True also catches silent edits to event content.

Run it for real

Three storage tiers, one engine — every guarantee (audit chain, crypto-shred, deep verification, time travel) holds on all three:

TierStorageForSetup
Memory()in-memorytests, demos, determinismnone
Memory.local()one SQLite file (~/.attestari/attestari.db)a personal agent, MCP, prototypes — durable, single-processnone (stdlib)
Memory.postgres()Postgres + pgvectorproduction: concurrent access, indexed hybrid searchone container

Durable with zero infrastructure (survives restarts; nothing to install or run):

from attestari import Memory

mem = Memory.local() # or Memory.local("path/to/agent.db")

Durable, on Postgres + pgvector (one container, no graph DB):

ATTESTARI_PG_PORT=5433 docker compose up -d       # applies the schema on first boot

pip install -e ".[postgres,embeddings]" export ATTESTARI_DATABASE_URL=postgresql://attestari:attestari@localhost:5433/attestari

Already have a Postgres (managed or local)? The schema ships inside the pip package — no clone needed:

python -m attestari.initdb postgresql://user:pass@host:5432/db   # idempotent
from attestari import Memory

mem = Memory.postgres() # durable; materialized projections + pgvector + full-text search

As a REST API + visual console:

pip install -e ".[server]"

uvicorn attestari.server:app # API at /v1/*, the memory-graph console at /

As an MCP server (any agent — Claude, frameworks — can use it) — exposes add_memory / search_memory / get_provenance over stdio, plus forget_subject if you opt in (below). Register it in your MCP client's config (e.g. Claude Desktop's claude_desktop_config.json); the client launches the process for you:

{

"mcpServers": { "attestari": { "command": "attestari-mcp", "args": [], "env": { "ATTESTARI_SQLITE_PATH": "~/.attestari/attestari.db", "ANTHROPIC_API_KEY": "sk-ant-...", "ATTESTARI_KEK": "base64-kek-here" } } } }

Only `command`/`args` are required. Durable by default (memories go to the local

SQLite file, so they survive app restarts); the env block is where per-server config lives — add ATTESTARI_DATABASE_URL to use Postgres instead of SQLite, ANTHROPIC_API_KEY to upgrade extraction to Claude, ATTESTARI_KEK to enable crypto-shred. To run it standalone (e.g. to debug): attestari-mcp (or python -m attestari.mcp). Without a local install, MCP clients can spawn it straight from PyPI: uvx --from "attestari[server]" attestari-mcp.

Erasure over MCP is opt-in. An agent can be steered by text it reads, and erasure can't be undone, so forget_subject is only offered when the env block sets "ATTESTARI_MCP_ALLOW_FORGET": "1". It is then flagged destructive (clients that honour tool annotations ask before running it) and takes two calls: the first previews what would be erased and returns a manifest_hash; the second passes that hash back as confirm_manifest_hash, and erases only if the subject's records still match the preview. Leave it off unless the agent is meant to erase people; Memory.forget() and POST /v1/forget are unaffected.

From TypeScript — the TS client talks to the REST API, so start the server first (see above; it defaults to http://localhost:8000). Then see clients/ts (@attestari/client), a thin typed client mirroring the Memory surface.

With LangChain: see clients/langchain (attestari-langchain) — a AttestariRetriever (recall facts with provenance) and AttestariChatMessageHistory (drop-in memory for RunnableWithMessageHistory) for any chain or agent.

With real Claude extraction (instead of the zero-dep deterministic extractor):

pip install -e ".[anthropic]"

export ANTHROPIC_API_KEY=sk-ant-... python examples/spike.py --llm anthropic

Enable crypto-shred deletion (turn forget() from a logical delete into cr

Only the beginning is shown; read the rest in the repo

Ask PopNx