ERINYS
Reflexive Memory for AI Agents - MCP Server. Remembers, forgets, questions, and bites.
README
<p align="center"> <img src="assets/logo.jpg" alt="ERINYS" width="200"> </p>
ERINYS — Reflexive Memory for AI Agents
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.
What Makes ERINYS Different
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.
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.
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). Scheduled overnight via cron, it finds connections you'd never think to look for. No magic — just automated note comparison at scale.
Design Philosophy
Memory has layers
Not all memory is equal. ERINYS organizes knowledge by abstraction level:
- Concrete — what happened. "The JWT httpOnly flag was missing on
/api/auth." - Abstract — patterns from facts. "New API endpoints need a security header checklist."
- Meta — principles from patterns. "Security defaults should be safe without manual opt-in."
A single bugfix generates all three through distillation. The meta layer accumulates principles that transfer across projects and tech stacks.
Forgetting is a feature
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.
Facts change. History shouldn't disappear
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.
Contradictions should be caught
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?"
Search finds meaning, not just keywords
Two searches run simultaneously and fuse results:
- Keyword search (FTS5) — exact term matching.
- Vector search (sqlite-vec) — semantic similarity. "authentication" finds "login", "JWT", "session tokens".
Results merge via Reciprocal Rank Fusion (RRF). High in both = highest score.
Everything stays local
Single SQLite file. No cloud APIs. No API keys. No subscriptions. Offline-capable. Your agent's memory never leaves your machine.
Use Cases
1. Cross-Session Memory for Coding Agents
# 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
2. Contradiction Detection
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'"
3. Dream Cycle — Overnight Knowledge Synthesis
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"
4. Temporal Queries
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)"
5. Knowledge Distillation
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"
6. Obsidian Export
erinys_export(format="markdown")
# → Generates .md files with [[wikilinks]]
# Drop into Obsidian → instant knowledge graph
Quick Start
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
MCP Configuration
Claude Desktop / Claude Code
{
"mcpServers": {
"erinys": {
"command": "/path/to/ERINYS-mem/.venv/bin/python3",
"args": ["-m", "erinys_memory.server"],
"env": {
"ERINYS_DB_PATH": "~/.erinys/memory.db"
}
}
}
}
Gemini (Antigravity)
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"
}
}
}
Environment Variables
| Variable | Default | Description |
|---|---|---|
ERINYS_DB_PATH |
~/.erinys/memory.db |
SQLite database path |
ERINYS_EMBEDDING_MODEL |
BAAI/bge-small-en-v1.5 |
fastembed model |
Tools (25)
Core
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 statistics
Graph
erinys_link— Create typed edgeerinys_traverse— BFS graph traversalerinys_prune— Prune weak/decayed edges
Temporal
erinys_reinforce— Boost observation strengtherinys_supersede— Version an observationerinys_timeline— Query as-of timestamperinys_conflict_check— Detect contradictions
Dream Cycle
erinys_collide— Collide two observations via LLMerinys_dream— Batch collision cycle
Distillation
erinys_distill— 3-granularity abstraction (concrete → abstract → meta)
Batch & Eval
erinys_batch_save— Bulk save with auto-linkingerinys_eval— LOCOMO-inspired quality metrics
Session
erinys_session_start— Start sessionerinys_session_end— End session with summaryerinys_session_summary— Save structured summary
Architecture
┌──────────────────────────┐
│ 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
└──────────────────────────┘
Roadmap
- [ ] Dream Daemon — Background auto-execution of Dream Cycle
- [x] Auto-Distill on Save — Trigger 3-granularity distillation on every save
- [ ] Auto-Prune — GC decayed observations when DB exceeds size threshold
- [ ] Cron-ready CLI —
erinys dream --max 10for scheduled overnight synthesis - [ ] PyPI package —
pip install erinys-memory - [ ] Multi-agent support — Scoped memory per agent identity
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。