loading…
Search for a command to run...
loading…
Reflexive Memory for AI Agents - MCP Server. Remembers, forgets, questions, and bites.
Reflexive Memory for AI Agents - MCP Server. Remembers, forgets, questions, and bites.
100% Recall@5 on LongMemEval-S (_s split) · 94% on LoCoMo · 98% on ConvoMem — Zero LLM calls in the retrieval pipeline.
From memories that existed, it even creates memories that never did.
AI agent memory systems have always mimicked human memory. Short-term, long-term, episodic, semantic — textbook categories bolted straight onto implementations.
Something always felt off.
Humans forget. But existing memory systems don't. They grow endlessly, serving stale facts with the same weight as fresh ones. Humans notice "wait, didn't you say something different before?" But memory systems silently overwrite. Humans connect two unrelated experiences and think "oh, I can use that here." But memory systems just store and retrieve.
What needed to be mimicked wasn't the taxonomy of memory. It was the behavior.
That discomfort is what summoned ERINYS.
ERINYS is a guard dog. It remembers, forgets, questions, and bites.
Origin: ERINYS was built as the retrieval layer for HyperAION, an AI agent self-improvement framework. It is released as a standalone MCP server so any agent stack can use it independently.
All results use the same mode (enhanced_v2_boost) with zero LLM calls in the retrieval pipeline. Note: higher-level features (Dream Cycle, Distillation) do use an LLM — see below.
| Benchmark | N | R@5 | R@10 | Avg Latency |
|---|---|---|---|---|
| LongMemEval-S | 500 | 100.0% | 100.0% | 10.3 ms |
| LoCoMo | 1,982 | 94.0% | 98.1% | 6.9 ms |
| ConvoMem | 250 | 97.6% | — | — |
Why this matters: No API keys. No network. No tokens burned for retrieval. ERINYS achieves these results with FTS5 + sqlite-vec + algorithmic boosting alone. Your agent's memory searches at the speed of SQLite.
LongMemEval evaluated on
longmemeval_ssplit (~20 sessions/question). Results on the harder_msplit have not yet been evaluated. Full methodology, per-category breakdown, and reproduction commands → benchmarks/BENCHMARKS.md
The story of how we got to 100% → 🇯🇵 Japanese / 🇺🇸 English
Forgetting. Most memory systems only accumulate. ERINYS decays memories over time following the Ebbinghaus forgetting curve. Old noise sinks. Frequently accessed knowledge floats. Search results stay relevant without manual curation. Decay runs automatically — no LLM needed.
Distillation. A specific bugfix ("JWT httpOnly flag was missing") automatically generates three layers: the concrete fact → a reusable pattern ("new endpoints need a security checklist") → a universal principle ("security defaults should be safe without opt-in"). No other memory system does this. ⚠️ Distillation requires an LLM call to generate the abstract/meta layers.
Dream Cycle. Two memories are fed to an LLM: "is there a connection?" Candidate pairs are selected by semantic similarity — close enough to be related (cosine > 0.65), far enough to not be redundant (< 0.90). Currently triggered manually via erinys_dream. ⚠️ Dream Cycle requires LLM calls — it is not part of the zero-LLM retrieval pipeline.
Not all memory is equal. ERINYS organizes knowledge by abstraction level:
/api/auth."A single bugfix generates all three through distillation. The meta layer accumulates principles that transfer across projects and tech stacks.
Every memory has a strength score that decays over time. A memory saved 6 months ago ranks lower than one saved yesterday. Memories accessed frequently resist decay — repeated retrieval reinforces them.
When strength drops below a threshold, the memory becomes a pruning candidate. The database stays lean. Search stays relevant.
When information updates — "we moved from AWS to GCP" — ERINYS doesn't overwrite. It creates a supersede chain: the old fact is marked as replaced but preserved. You can ask "what did we believe in March?" and get the answer that was true then.
If memory contains both "use PostgreSQL" and "use SQLite", ERINYS detects the conflict. Instead of silently switching, the agent asks: "you previously chose PostgreSQL — has the requirement changed?"
Two searches run simultaneously and fuse results:
Results merge via Reciprocal Rank Fusion (RRF). High in both = highest score.
Single SQLite file. No cloud APIs. No API keys. No subscriptions. Offline-capable. Your agent's memory never leaves your machine.
# Agent saves a learning after fixing a bug
erinys_save(
title="Fixed JWT httpOnly flag missing",
content="Cookie was accessible via JS. Added httpOnly: true, secure: true, sameSite: strict.",
type="bugfix",
project="my-app"
)
# Next week, similar task — agent searches memory
erinys_search(query="authentication cookie security", project="my-app")
# → Returns the JWT fix with relevance score
erinys_save(title="Database choice", content="Using SQLite for simplicity", project="my-app")
erinys_conflict_check(observation_id=42)
# → "⚠️ Conflicts with #18: 'Using PostgreSQL for production reliability'"
erinys_dream(max_collisions=10)
# Picks memory pairs in the "sweet spot" (cosine 0.65–0.90)
# Memory A: "RTK reduces token usage by 60-90%"
# Memory B: "Bootstrap Gate takes 3 seconds due to multiple script calls"
# → Insight: "Apply RTK prefix to Bootstrap Gate scripts to reduce overhead"
erinys_timeline(query="deployment target", as_of="2026-03-01")
# → "AWS EC2 (decided 2026-02-15)"
erinys_timeline(query="deployment target", as_of="2026-04-01")
# → "GCP Cloud Run (superseded AWS on 2026-03-20)"
erinys_save(title="Forgot CORS headers on new endpoint", type="bugfix", ...)
erinys_distill(observation_id=50, level="meta")
# → concrete: "CORS headers missing on /api/v2/users endpoint"
# → abstract: "New API endpoints need a CORS review checklist"
# → meta: "Security concerns should be opt-out, not opt-in"
erinys_export(format="markdown")
# → Generates .md files with [[wikilinks]]
# Drop into Obsidian → instant knowledge graph
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Run as MCP server (stdio)
python -m erinys_memory.server
# Run tests
PYTHONPATH=src pytest tests/ -v
{
"mcpServers": {
"erinys": {
"command": "/path/to/ERINYS-mem/.venv/bin/python3",
"args": ["-m", "erinys_memory.server"],
"env": {
"ERINYS_DB_PATH": "~/.erinys/memory.db"
}
}
}
}
Add to ~/.gemini/antigravity/settings.json under mcpServers:
{
"erinys": {
"command": "/path/to/ERINYS-mem/.venv/bin/python3",
"args": ["-m", "erinys_memory.server"],
"env": {
"ERINYS_DB_PATH": "~/.erinys/memory.db"
}
}
}
| Variable | Default | Description |
|---|---|---|
ERINYS_DB_PATH |
~/.erinys/memory.db |
SQLite database path |
ERINYS_EMBEDDING_MODEL |
BAAI/bge-small-en-v1.5 |
fastembed model |
erinys_save — Save observation (with topic_key upsert)erinys_get — Get by ID (full content, untruncated)erinys_update — Partial updateerinys_delete — Delete with FK cascadeerinys_search — RRF hybrid search (FTS5 + vector)erinys_save_prompt — Save user prompterinys_recall — Recent observationserinys_context — Session context recallerinys_export — Obsidian-compatible markdown exporterinys_backup — SQLite backuperinys_stats — Database statisticserinys_link — Create typed edgeerinys_traverse — BFS graph traversalerinys_prune — Prune weak/decayed edgeserinys_reinforce — Boost observation strengtherinys_supersede — Version an observationerinys_timeline — Query as-of timestamperinys_conflict_check — Detect contradictionserinys_collide — Collide two observations via LLMerinys_dream — Batch collision cycleerinys_distill — 3-granularity abstraction (concrete → abstract → meta)erinys_batch_save — Bulk save with auto-linkingerinys_eval — LOCOMO-inspired quality metricserinys_session_start — Start sessionerinys_session_end — End session with summaryerinys_session_summary — Save structured summary┌──────────────────────────┐
│ FastMCP Server │ 25 tools, unified envelope
├──────────────────────────┤
│ search.py │ graph.py │ RRF hybrid │ typed edges
│ decay.py │ session.py │ Ebbinghaus │ lifecycle
│ temporal.py│collider.py │ versioning │ cross-pollination
│ distill.py │ db.py │ abstraction│ SQLite + vec
├──────────────────────────┤
│ embedding.py │ fastembed (BAAI/bge-small-en-v1.5)
├──────────────────────────┤
│ SQLite + FTS5 + vec0 │ Local-first, no network at runtime
└──────────────────────────┘
erinys dream --max 10 for scheduled overnight synthesispip install erinys-memory_m split evaluationMIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"erinys": {
"command": "npx",
"args": []
}
}
}