Every session, your AI assistant starts from zero. It asks the same questions, forgets your preferences, re-learns your stack. There is no memory between conversations.
YourMemory fixes that. It gives AI agents a persistent memory layer that works the way human memory does β important things stick, forgotten things fade, outdated facts get replaced automatically. Two commands to install, zero infrastructure required.
Tested on LoCoMo-10 β 1,534 QA pairs across 10 multi-session conversations.
| System | Recall@5 | 95% CI |
| --- | --- | --- |
| YourMemory (BM25 + vector + graph + decay) | 59% | 56β61% |
| Zep Cloud | 28% | 26β30% |
2Γ better recall than Zep Cloud on the same benchmark.
Full methodology and per-sample breakdown in BENCHMARKS.md. Writeup: I built memory decay for AI agents using the Ebbinghaus forgetting curve.
Supports Python 3.11, 3.12, 3.13, and 3.14. No Docker, no database setup, no external services.
Step 2 β Run setup (once)
Downloads the spaCy language model and initialises the local database at ~/.yourmemory/memories.duckdb.
Step 3 β Get your config path
Prints your full executable path and a ready-to-paste config block. Copy it.
Step 4 β Wire into your AI client
Claude Code
Add to ~/.claude/settings.json:
{
"mcpServers": {
"yourmemory": {
"command": "yourmemory"
}
}
}
Reload (Cmd+Shift+P β Developer: Reload Window).
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"yourmemory": {
"command": "yourmemory"
}
}
}
Restart Claude Desktop.
Cline (VS Code)
VS Code doesn't inherit your shell PATH. Run yourmemory-path first to get the full executable path.
In Cline β MCP Servers β Edit MCP Settings:
{
"mcpServers": {
"yourmemory": {
"command": "/full/path/to/yourmemory",
"args": [],
"env": { "YOURMEMORY_USER": "your_name" }
}
}
}
Restart Cline after saving.
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"yourmemory": {
"command": "/full/path/to/yourmemory",
"args": [],
"env": { "YOURMEMORY_USER": "your_name" }
}
}
}
OpenCode
Add to ~/.config/opencode/config.json:
{
"mcp": {
"yourmemory": {
"type": "local",
"command": ["yourmemory"],
"environment": { "YOURMEMORY_USER": "your_name" }
}
}
}
Then copy the memory workflow instructions:
cp sample_CLAUDE.md ~/.config/opencode/instructions.md
Restart OpenCode.
Any MCP-compatible client: YourMemory is a standard stdio MCP server. Works with Windsurf, Continue, Zed, and any client that supports MCP. Use the full path from
yourmemory-pathif the client doesn't inherit shell PATH.
Step 5 β Add memory instructions to your project
cp sample_CLAUDE.md CLAUDE.md
Edit CLAUDE.md β replace YOUR_NAME and YOUR_USER_ID. Claude now follows the recall β store β update workflow automatically on every task.
Three tools. Called by Claude automatically once CLAUDE.md is in place.
| Tool | When | What it does |
| --- | --- | --- |
| recall_memory(query) | Start of every task | Surfaces relevant memories ranked by similarity Γ strength |
| store_memory(content, importance) | After learning something new | Embeds and stores with biological decay |
| update_memory(id, new_content) | When a memory is outdated | Re-embeds and replaces |
```
Example session
store_memory("Sachit prefers tabs over spaces in Python", importance=0.9, category="fact")
Next session β without being told again:
recall_memory("Python formatting")
β {"content": "Sachit prefers tabs over spaces in Python", "strength": 0.87}
```
Categories control how fast memories fade
| Category | Survives without recall | Use case |
| --- | --- | --- |
| strategy | \~38 days | Successful patterns |
| fact | \~24 days | Preferences, identity |
| assumption | \~19 days | Inferred context |
| failure | \~11 days | Errors, environment-specific issues |
Ebbinghaus Forgetting Curve
Memory strength decays exponentially β but importance and recall frequency slow that decay:
effective_Ξ» = base_Ξ» Γ (1 - importance Γ 0.8)
strength = importance Γ e^(βeffective_Ξ» Γ days) Γ (1 + recall_count Γ 0.2)
score = cosine_similarity Γ strength
Memories recalled frequently resist decay. Memories below strength 0.05 are pruned automatically every 24 hours.
Hybrid Retrieval: Vector + Graph
Retrieval runs in two rounds to surface related context that vocabulary-based search misses:
Round 1 β Vector search: cosine similarity against all memories, returns top-k above threshold.
Round 2 β Graph expansion: BFS traversal from Round 1 seeds surfaces memories that share context but not vocabulary β connected via semantic edges (cosine similarity β₯ 0.4).
recall("Python backend")
Round 1 β [1] Python/MongoDB (sim=0.61)
[2] DuckDB/spaCy (sim=0.19)
Round 2 β [5] Docker/Kubernetes (sim=0.29 β below cut-off, surfaced via graph)
Chain-aware pruning: A decayed memory is kept alive if any graph neighbour is above the prune threshold. Related memories age together.
Multiple agents can share the same YourMemory instance β each with isolated private memories and controlled access to shared context.
```
from src.services.api_keys import register_agent
result = register_agent(
agent_id="coding-agent",
user_id="sachit",
can_read=["shared", "private"],
can_write=["shared", "private"],
)
β result["api_key"] β ym_xxxx, shown once only
```
Pass api_key to any MCP call to authenticate as an agent:
```
store_memory(content="Staging uses self-signed cert β skip SSL verify",
importance=0.7, category="failure",
api_key="ym_xxxx", visibility="private")
recall_memory(query="staging SSL", api_key="ym_xxxx")
β returns shared memories + this agent's private memories
β other agents see shared only
```
| Component | Role |
| --- | --- |
| DuckDB | Default vector DB β zero setup, native cosine similarity |
| NetworkX | Default graph backend β persists at ~/.yourmemory/graph.pkl |
| sentence-transformers | Local embeddings (all-mpnet-base-v2, 768 dims) |
| spaCy | Local NLP for deduplication and SVO triple extraction |
| APScheduler | Automatic 24h decay job |
| PostgreSQL + pgvector | Optional β for teams or large datasets |
| Neo4j | Optional graph backend β pip install 'yourmemory[neo4j]' |
PostgreSQL setup (optional)
pip install yourmemory[postgres]
Create a .env file:
DATABASE_URL=postgresql://YOUR_USER@localhost:5432/yourmemory
macOS
brew install postgresql@16 pgvector && brew services start postgresql@16
createdb yourmemory
Ubuntu / Debian
sudo apt install postgresql postgresql-contrib postgresql-16-pgvector
createdb yourmemory
```
Claude / Cline / Cursor / Any MCP client
β
βββ recall_memory(query, api_key?)
β βββ embed β vector similarity (Round 1)
β β graph BFS expansion (Round 2)
β β score = sim Γ strength β top-k
β β recall propagation β boost neighbours
β
βββ store_memory(content, importance, category?, visibility?, api_key?)
β βββ question? β reject
β contradiction check β update if conflict
β embed() β INSERT β index_memory() β graph node + edges
β
βββ update_memory(id, new_content, importance)
βββ embed(new_content) β UPDATE β refresh graph node
Vector DB (Round 1) Graph DB (Round 2)
DuckDB (default) NetworkX (default)
memories.duckdb graph.pkl
βββ embedding FLOAT[768] βββ nodes: memory_id, strength
βββ importance FLOAT βββ edges: sim Γ verb_weight β₯ 0.4
βββ recall_count INTEGER
βββ visibility VARCHAR Neo4j (opt-in)
βββ agent_id VARCHAR βββ bolt://localhost:7687
```
Benchmarks use the LoCoMo dataset by Snap Research.
Maharana et al. (2024). LoCoMo: Long Context Multimodal Benchmark for Dialogue. Snap Research.
Copyright 2026 Sachit Misra β Licensed under CC-BY-NC-4.0.
Free for: personal use, education, academic research, open-source projects.
Not permitted: commercial use without a separate written agreement.
Commercial licensing: mishrasachit1@gmail.com