Graph memory
for your AI.
Mneme is one SQLite file on your machine that remembers what you tell it and finds the note that matters — even when it shares none of your words. No API keys, no accounts, no cloud. Nothing leaves your disk, and every answer names the entities that carried it.
Zero dependencies. Actually zero.
Pure Python standard library and one SQLite file. No torch, no embeddings, no API keys — it works on a plane. About a thousand lines you can read in a sitting.
It shows its work.
Every graph answer names the entities that carried it, so you can see why you got a result instead of trusting a black box. When it falls back to text search, it says so.
Your agents can use it.
A read-only MCP server plugs your memory into Claude Code, Cursor, or any MCP client. Add notes from the terminal; the agent shows up already knowing them.
The demo
It finds the note that shares no words with your question.
$ mneme add "Northwind won't approve anything over 50k without a
second signature. Budget owner is Dan Whitfield."
$ mneme add "Dan Whitfield is out the first week of October."
$ mneme ask "anything blocking us in October?"
1. Dan Whitfield is out the first week of October.
score 1.00 · matched October
2. Northwind won't approve anything over 50k without a second
signature. Budget owner is Dan Whitfield.
score 0.58 · matched Dan WhitfieldThe second result shares no word with the question except anything — a stopword. It comes back because Dan Whitfield links the two notes: you asked what was blocking October and got the approver who is away, plus the rule that makes his absence a blocker. That output is measured, not mocked — the README reproduces it byte for byte.
How it works
A graph, not a guess.
Names, terms, numbers.
Every note is scanned with plain heuristics — no model, no download, about a millisecond. What it finds becomes nodes in a graph.
Together means linked.
Entities that appear in the same note get connected, and the link grows stronger every time the pair shows up again.
Your question spreads through the graph.
Its entities seed a Personalized PageRank walk, and notes rank by how much of the walk lands on theirs. That's how a note with none of your words still surfaces.
Full-text when the graph is cold.
A question that touches nothing in the graph falls back to SQLite full-text search — and the result says so, labeled text match.
Use it from your tools
A CLI, a Python API, and an MCP server.
The terminal.
mneme add to remember, mneme ask to recall, mneme forget to delete. Text, files, or stdin.
Python.
from mneme import Memory — add and ask in four lines, results as plain dataclasses.
Claude Code and Cursor.
A read-only MCP server. Add memories from the terminal; your agent sees them on its next call.
One file.
Everything lives in ~/.mneme/memory.db. Copy the file and your memory moves with it.
What it isn't
Honest about the trade.
Not an LLM.
Entities come from capitalisation, stopword lists, and a light stemmer. That's what makes it instant and offline — and it will miss things a model would catch.
Not a vector database.
There are no embeddings. Recall works through entities and the graph, then text search.
Not multi-user.
One SQLite file, one machine. Your memory is a file you own, not an account you log into.
Not for millions of notes.
Thousands of passages, not millions — the graph is rebuilt in memory on each query. For a person's notes, that's plenty.
Get it
Free. Not a free tier — free.
Python 3.10+ and nothing else — zero dependencies, no keys, no sign-up. Not on PyPI yet: the name belongs to an unrelated package from 2014, so install straight from GitHub.
pip install git+https://github.com/saranshahuja/mneme pip install 'mneme[mcp] @ git+https://github.com/saranshahuja/mneme' # + MCP server
Licensed under the Functional Source License (FSL-1.1-ALv2): free for any use except building a competing product, and each version becomes Apache-2.0 two years after its release. Source-available rather than OSI open source — the code is all there to read, about a thousand lines of it. The retrieval idea is HippoRAG 2's, over a co-occurrence graph instead of LLM-extracted triples.