Engraphy remembers what your AI learns — without duplicates, without forgetting, and without losing the connections between facts. You run it, on your own database.
Self-hosted · Postgres + pgvector · works with any MCP client
Get Engraphy
Install the extension for your editor, or self-host the server and connect any MCP client.
What it does
Plain and simple: your agent writes what it learns, and Engraphy keeps it clean, findable, and connected over time.
Write the same fact twice and Engraphy recognises it — no duplicate clutter building up over months.
Ask in your own words. It matches on meaning and on exact terms together, so the right memory surfaces.
Memories link into a graph, so an agent can follow from one fact to the people, events, and details around it.
Every user, project, or tenant is isolated — enforced by the database itself, not by hopeful application code.
When a fact changes, the old one isn't destroyed — it's superseded, leaving a trail you can walk back through.
Self-hosted on Postgres + pgvector, local or in your cloud. Point it at a database URL and go.
Why it's different
Engraphy is built like a database, not a scratchpad. Four things set it apart.
A restatement merges; a genuinely new but related fact is kept as its own searchable memory, linked to the original. Nothing is silently swallowed.
A detail stored in a typed field — someone's role, a date, a place — is searchable, not just fetchable by id. If it's in memory, search can reach it.
Separation between spaces is enforced by Postgres row-level security. An unreadable memory simply isn't there — an app-layer bug can't cross the line.
Facts change over time. Engraphy records the new version and keeps the old one linked, so "what did we believe, and when" is always answerable.
Benchmark
We test on LoCoMo, a long-conversation memory benchmark, and we publish the number we can stand behind.
| Capability | Append-only | Engraphy |
|---|---|---|
| No duplicate build-up | partial | yes |
| Facts in fields are searchable | no | yes |
| Related facts stay linked | no | yes |
| Nothing lost when memories merge | no | yes |
| Per-tenant isolation in the DB | no | yes |
| Clean updates with history | no | yes |
A note on leaderboards: published accuracy figures across memory vendors use different harnesses, judges, and question subsets, so a head-to-head "score table" would compare apples to oranges. We'd rather show you our real number and exactly what Engraphy does that a plain vector store doesn't.
Under the hood
Two paths do the work: writes are checked for duplicates before they land; reads fuse two kinds of search into one ranked result.
Each write is compared to what's already there. Clear duplicate merges, clearly new inserts, and the uncertain middle is parked for a decision — never silently dropped.
Semantic and keyword search run together and are fused into one ranked list, de-duplicated, with the option to follow the graph out from any hit for related context.
Quickstart
A Postgres with pgvector (local or a provider like Supabase), then install and go.
# local database with pgvector built in
docker run -d --name engraphy-pg -e POSTGRES_PASSWORD=devpw \
-e POSTGRES_DB=engram -p 127.0.0.1:5432:5432 pgvector/pgvector:pg16
pip install .
engram-admin migrate --dump-dir ./backupsengram-admin space create --id demo --principal you
engram-admin pack apply packs/starter/pack.yaml --space demo
engram-admin token create --space demo --principal you --role readwritepython -m engram.server.app # serves MCP on :8000
// write once, find it later in your own words
write { "title": "Coffee machine", "body": "Descale it monthly." }
search { "query": "how do I keep the espresso maker working" }
→ finds the note, ranked by a fused relevance scoreFull walkthrough in the developer docs — setup, building a pack, the tool reference, and deployment.