ShipItAndPray/mcp-memory
based, zero dependencies.
Ask AI about ShipItAndPray/mcp-memory
Powered by Claude Β· Grounded in docs
I know everything about ShipItAndPray/mcp-memory. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
mcp-memory
Smart memory for AI agents. Memories decay, topics are frequency-weighted, one-time questions don't become obsessions.
Solves the Karpathy problem: "A single question from 2 months ago keeps coming up as a deep interest with undue mentions in perpetuity."
What's New in v0.2.0
- Auto-categorization β no need to specify category, inferred from content
- Semantic dedup β bigram similarity prevents duplicate memories
- Preference supersede β "prefers dark mode" then "prefers light mode" updates, not duplicates
- Recall auto-reinforces β searching for a topic counts as a mention
- Recall auto-prunes β dead memories cleaned up on every read
- System prompt injection β active memories provided via MCP prompts capability
- Fuzzy forget β "VS Code" matches "User prefers VS Code for all editing"
- 7 tools β 4 tools β simpler API, higher adoption (backwards compatible)
In Action
Day 1: User asks 5 questions (Rust, dark mode, Python, job title, Haskell)
#1 [ACTIVE] rel=1.000 cat=preference "User prefers dark mode in all editors"
#2 [ACTIVE] rel=0.900 cat=fact "User works as a senior software engineer"
#3 [FADING] rel=0.500 cat=question "User is building a Python web scraper"
#4 [FADING] rel=0.300 cat=one-time "User asked about Rust programming"
#5 [FADING] rel=0.300 cat=one-time "User asked what Haskell monads are"
Day 2-5: User mentions Python 4 more times β auto-upgraded to "interest"
#1 [ACTIVE] rel=2.658 mentions=5 cat=interest "Python web scraper"
#2 [ACTIVE] rel=1.000 mentions=1 cat=preference "dark mode"
#3 [ACTIVE] rel=0.900 mentions=1 cat=fact "senior software engineer"
#4 [FADING] rel=0.300 mentions=1 cat=one-time "Rust" β FADING, won't obsess
#5 [FADING] rel=0.300 mentions=1 cat=one-time "Haskell" β FADING, won't obsess
After 60 days:
Rust: 0.3 Γ 0.5^(60/7) = 0.0008 β DEAD (gone, as it should be)
Python: 0.8 Γ 0.5^(60/60) Γ 3.32 = 1.329 β STILL ACTIVE (real interest)
How It Fixes This
| Current LLM Memory | mcp-memory |
|---|---|
| Ask about Rust once β mentioned forever | Ask once β fades in 7 days |
| All memories equal weight | Categories: one-time (7d), question (14d), interest (60d), preference (180d) |
| No decay | Exponential decay β old memories naturally fade |
| No frequency tracking | Mentioned 5+ times β auto-upgrades from "question" to "interest" |
| Keyword matching | Bigram similarity + relevance scoring |
| Agent must decide to remember | Auto-categorizes from content patterns |
| Contradicting preferences coexist | New preference supersedes old one |
| Manual cleanup required | Auto-prunes dead memories on recall |
Install
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "mcp-memory"]
}
}
Tools
| Tool | What it does |
|---|---|
remember | Store a memory. Auto-categorizes from content. Auto-deduplicates via bigram similarity. Supersedes conflicting preferences. |
recall | Retrieve memories ranked by relevance. Auto-reinforces top match. Auto-prunes dead memories. |
forget | Delete a memory by ID or fuzzy content match. |
inspect | Debug view: all memories with decay status, relevance scores, category breakdown, health. |
Auto-Categorization
No need to specify category β it's inferred from content:
| Content Pattern | Auto-Category | Decay |
|---|---|---|
| "prefers X", "likes X", "always uses X" | preference | 180 days |
| "works as X", "is a X", "lives in X" | fact | 365 days |
| "actually X", "meant X", "wrong" | correction | 365 days |
| "currently building", "working on" | context | 30 days |
| "what is X", "how to X" | one-time | 7 days |
| anything else | question | 14 days |
You can still override: remember(content: "...", category: "preference")
Examples
Auto-categorized preference:
remember(content: "User prefers TypeScript over JavaScript")
β Auto-detected as "preference". Persists 180 days.
Semantic dedup:
remember(content: "Works as data scientist at Google")
remember(content: "Works as senior data scientist at Google")
β Second call reinforces first (80% similar). Keeps longer version.
Preference supersede:
remember(content: "User prefers dark mode")
remember(content: "User prefers light mode")
β Superseded: "dark mode" β "light mode". One memory, not two.
Recall auto-reinforces:
recall(query: "MCP servers")
β Returns matching memories AND counts this as a mention.
mention_count goes from 1 β 2 automatically.
Fuzzy forget:
forget(content: "VS Code")
β Matches and removes "User prefers VS Code for all editing"
The Math
relevance = base_weight Γ decay Γ frequency_boost
where:
base_weight = category-specific (0.3 for one-time, 1.0 for preference)
decay = 0.5 ^ (age_days / halflife_days)
freq_boost = 1 + log2(mention_count)
A one-time question from 2 months ago:
0.3 Γ 0.5^(60/7) Γ 1.0 = 0.0003 β effectively zero. Won't surface.
A preference mentioned 8 times, last week:
1.0 Γ 0.5^(7/180) Γ 4.0 = 3.89 β top of every recall.
Backwards Compatibility
v0.2.0 still accepts the old v0.1.0 tool names (reinforce, prune, stats). They map to the new tools internally. No breaking changes.
License
MIT
