Meniscus
Give your AI a memory you own.
Local, structured, long-term memory for AI agents — in one file on your machine.
Meniscus is a local, long-term memory for your AI tools. It captures what you do across them, distills it into timestamped facts, and hands any connected AI the relevant ones on demand — from a single SQLite file on your machine that you own and can read.
Two ways in: your agents reach it automatically over MCP, or you drive it yourself with the men CLI. Both talk to the same memory.
Quickstart
Requires Python 3.11+. Embeddings run locally (no API); distilling facts uses a small LLM via OpenRouter. The local embedding model downloads once, then loads fully offline on every run after — no network at startup.
uv tool install "meniscus[all]" # local embeddings, MCP server, and vector store
men init # set up your key and connect your AI tools
Connect your AI tools — MCP (the everyday way)
Meniscus runs as a local MCP server (men-mcp) and gives every connected agent two tools: meniscus_recall (read the relevant memory before answering) and meniscus_log (silently save what's worth remembering). Your tools share one memory and use it without you typing anything.
Add it with one command:
claude mcp add meniscus -- men-mcp # Claude Code
codex mcp add meniscus -- men-mcp # Codex
Or drop it into any MCP client's config (Antigravity, Cursor, …):
{
"mcpServers": {
"meniscus": {
"command": "men-mcp"
}
}
}
men-mcpnot found? Some clients — especially GUI apps like Antigravity — don't inherit your shell'sPATH, so they can't see the installed command. Use its absolute path instead: runwhich men-mcpand use that full path — e.g.claude mcp add meniscus -- "$(which men-mcp)", or set the JSON"command"to the output ofwhich men-mcp.
Claude Code plugin. A ready-to-install plugin also lives in meniscus-plugin/ — the same two tools, packaged as a one-click extension.
Restart the tool and ask it something only your own history knows.
Drive it yourself — CLI (men)
men add "went with SQLite for Fernwind — zero ops, one file to back up"
men ask "what did I pick for storage and why?"
men watch --catch-up # silently capture your Claude Code / Codex sessions into memory
men sql "SELECT text FROM facts WHERE ..." # it's just SQLite — look inside
Benchmarks
Measured on LongMemEval-S, a standard long-term-memory benchmark, on a 100-instance stratified sample.
| Meniscus | |
|---|---|
| Retrieval recall | 0.89 |
| Context reduction | 99.1% (feeds ~1% of the full history) |
| End-to-end answer accuracy¹ | 72% |
¹ With a strong reader (GPT-5); a small local reader scores ~54%. The oracle ceiling (perfect retrieval, GPT-4o reader) is ~82%, so retrieval costs ~10 points — most of it on multi-session aggregation, the known weak spot. We'd rather show you the honest number than a cherry-picked one.
Run them yourself — every number above is reproducible from frozen memories with no LLM calls: see bench/README.md for the exact commands.
What you get
- It knows you — and compounds. Every session builds on the last. The more you use it, the more your AI knows about your work, without you repeating yourself.
- One memory, every AI. The same memory works across Claude Code, Codex, Antigravity, and any MCP client. Teach it once; recall anywhere.
- Yours, on your machine. One local SQLite file. No cloud, no account, no vendor that can revoke it, silently train on it, or shut it down.
- Nothing is a black box. Every fact links back to the exact moment it came from, and you can query the whole thing with plain SQL.
How it works
Meniscus distills what flows through your tools into atomic facts (via a small LLM), stores them append-only — nothing is ever overwritten or deleted, and every fact is recoverable to its source event — and retrieves them with a deterministic hybrid search (semantic vectors + keywords, plus an entity door for lookups by a named person, project, or tool). There is no LLM in the read path, so retrieval is reproducible and inspectable.
Build on it in Python — namespaced under meniscus, so nothing generic like config or db leaks onto your import path:
import meniscus
from meniscus.fact_retrieval import retrieve
Inspect everything
Because it's one SQLite file and retrieval is a fixed formula, nothing is hidden. men sql and men tables give you the raw facts, their sources, and the entities they link — the same data your AI sees. Memory you can audit is memory you can trust. For more, run men --help
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meniscus-0.1.0.tar.gz.
File metadata
- Download URL: meniscus-0.1.0.tar.gz
- Upload date:
- Size: 229.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fadfa2c27c0f82e82fe362294071efb8ff3e7582c09a947cafd719d49eef9e5
|
|
| MD5 |
3bb5df83c942529cd31d9f7d3a2028c9
|
|
| BLAKE2b-256 |
e6f72b4839f6801bbe350554ab85ab9e0dd5d4e94ee2e2ebfc6e7f76af71cbe4
|
File details
Details for the file meniscus-0.1.0-py3-none-any.whl.
File metadata
- Download URL: meniscus-0.1.0-py3-none-any.whl
- Upload date:
- Size: 60.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bacfa188cd68f2367b5966cc91096a64fe032a4e21c23f52e7d604af1149042
|
|
| MD5 |
e4310c473e418facc853c3aaacb76c12
|
|
| BLAKE2b-256 |
fd793408f67d52774ded1b826d3b89a180a91c72d92ce551bc1b07bae9cc72d9
|