mcp-ariel-memory
Persistent, local SQLite-based agent memory server exposed as MCP tools for remembering, recalling, forgetting, evolving, and tracking project context.
Remember content via
think, routing to user/agent memory layers or wiki/graph stores based on importance and content.Recall with
dreamvia hybrid search across episodic/core/wiki/graph layers, with recent/core/balanced intent and token-budgeted digest.Forget with
forget, using exact/fuzzy/recent scopes and Shadow Bin archival instead of hard deletion.Evolve the agent's personality/rules over time with
evolve.Manage per-project context with
project: init/update/archive, artifact mapping, audits, decision logs, and recall.Fire lifecycle/auto-hook events with
memory_hook(session start/end, new message, context threshold, memory pressure, post-compression) for push-model auto-save/rehydrate workflows.Keep user and agent memory isolated via layers (
user/agent) and per-useruser_id; supports MCP stdio/HTTP and optional dashboard.
Integrates with Hermes Agent to offer memory capabilities including episodic recall, knowledge graphs, and hybrid search for agent identity and learning.
Exposes a Prometheus-compatible metrics endpoint for monitoring server performance, memory usage, and request rates.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-ariel-memory remember that my favorite color is blue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
a-memory
Your AI agents forget. a-memory makes them remember. 4-tier agent memory with hybrid search and a real knowledge graph — all in plain SQLite files. Zero cloud. Zero external APIs.
Also available on PyPI:
pip install a-memory— optional extras:a-memory[embeddings]for real multilingual embeddings.
Why SQLite?
Every other memory server sends your agent's data through a cloud API or requires a separate vector database.
a-memory stores everything in SQLite files on your machine.
Zero infrastructure. No Docker, no database server, no embedding API keys.
Zero data leaving your network. Works air-gapped.
Layer-isolated by design. User facts and agent identity never share a namespace.
One directory = entire memory. Back up with
cp, sync with rsync.
Related MCP server: ContextStream MCP Server
Why this exists
Three problems a-memory solves:
① Agent self-evolution — your AI stops repeating mistakes between sessions. It remembers decisions, errors, and corrections in a dedicated agent layer, and an hourly consolidation sweep promotes what matters into long-term facts.
② User persona persistence — your agent knows who it's talking to even after weeks of silence. Preferences, history, emotional context live in the user layer, isolated from agent identity.
③ Project continuity — project tracks per-project context: decisions with rationale and outcomes, artifact maps, a graphify-powered code index — so a fresh session picks up where the last one left off.
Get started
pip install a-memory
a-memory # MCP server on stdio — connect from any MCP clientThe server runs without these, but the privacy gate (hooks ingest) and the graph
miners need two spaCy NER models. Neither is on PyPI — en-core-web-sm 404s there and
ru-core-news-sm is an unrelated placeholder — so they can only be installed by wheel URL,
and a wheel URL cannot be a dependency: PyPI rejects any distribution whose metadata
carries a direct URL. One command installs them from the URLs the package already knows:
a-memory-ner # install (console script, ships in the wheel)
a-memory-ner --check # report what is missing, install nothingFrom a source checkout, python scripts/install_ner_models.py is the same command.
Skipping them is safe: the gate falls back and reports degraded instead of failing.
Point your MCP client at it:
{
"mcpServers": {
"a-memory": {
"command": "a-memory"
}
}
}HTTP transport with dashboard:
a-memory --transport http --port 8000 --dashboardOr run from source:
git clone https://github.com/Cipher208/a-memory.git
cd a-memory
uv sync
uv run ariel-memoryThe seven primitives
Agents see exactly seven tools — one verb per intent, plus the event bridge (6 verbs + memory_hook), no tool-choice paralysis:
Primitive | Intent | What it does |
| remember | Routes content to the right layer (L4 facts / L3 episodes / wiki / graph) based on importance, emotion, and relations |
| recall | Hybrid search across ALL layers (FTS5 + binary embeddings + wiki + graph), returns a token-budgeted digest |
| let go | Context-aware deletion with Shadow Bin archival (exact / fuzzy / recent) — plus a dry run that writes nothing and an undo that puts back what the bin kept |
| grow | Records personality/rules evolution for the agent |
| continue | Per-project identity, decision log, artifact map, code index |
| resume | One-call memory lift for a fresh session — the critical set in one call, instead of walking a recall protocol step by step |
| signal | The event bridge: fires one lifecycle event ( |
Quick demo — Python MCP client:
# think — routed to the right store automatically
await session.call_tool("think", {"text": "User prefers dark mode", "layer": "user"})
# dream — finds it across every store, a week later
res = await session.call_tool("dream", {"query": "dark mode preference"})
print(res["summary"])66 fine-grained operations exist in total, grouped into coherent opt-in tiers: the 7 primitives are exposed by default; add context (recall protocol, /new session recap, smart context budget, steering hints, tool-output compression), insight (Memory Query DSL, provenance fact-blame, quality loop, reflections, stats), write (typed memory schemas, declarative rules engine, scratchpad, counterfactuals, episodes), plus wiki and review (staged mutations, memory_report_card, daily_brief). The usual live-agent surface is one preset — ARIEL_EXPOSE=agent (59 tools), equivalent to primitives,context,insight,write,wiki,review. The remaining 7 are admin-tier: ARIEL_EXPOSE=operator (66) or all.
Tier history, because older guides still name a
brieftier: it was dissolved on 2026-09-07 —daily_briefnow ridesreview. If a doc tells you to passbrief, it is pre-1.10 and the token is simply ignored.
⚠️ Env sanitization gotcha (stdio): MCP clients pass a sanitized environment to stdio servers — setting
ARIEL_EXPOSEin your shell profile does nothing. Define the tier set in your MCP client config (theenvblock of the server entry — see configuration guide). The server logs its resolved surface at startup (tool exposure: N/M tools) — if your agent reports seeing only the primitives, check that line first, then restart the client session (tool lists are cached per session).
Features
Category | What's inside |
🧠 Memory | L1 Reflex (atomic persistence) → L2 Sessions → L3 Episodic → L4 Core, importance scoring, typed memory kinds with TTL policies, layer isolation; bi-temporal fact history (is_current view hides superseded rows globally, |
🔍 Search | FTS5 + MIB binary embeddings + hybrid RRF ranking, multi-source merge (RAG + Wiki + Episodic + Core + Graph), EDM/ITS dual-route rerank (information-gain scoring, №11-eval winner), semantic dedup gate (cosine, opt-in), RU-lemma key normalization (pymorphy3), counter-signal pessimisation, ACT-R activation with per-query min-max multipliers and memory-kind weights, embedding-path circuit breaker (graceful hash-fallback), deterministic retrieval mode, dream digest |
🕸️ Graph | Epistemic knowledge graph + temporal timeline, typed nodes and edges, BFS traversal, 1-hop GraphRAG expansion (provenance-aware edge filter), 12 self-maintaining miners (degree-capped anti-hub, wiki↔fact provenance bridges with metadata backlinks, co-retrieval, zero-result gaps), orphan-anchor GC, nightly gap-registry — and a reader for it: the registry now records how often each hole is re-observed ( |
📁 Projects | Decision log (what/why/outcome), artifact map, graphify code index — survives between sessions |
⚡ Auto-Hooks | Push-model memory: a per-agent daemon tails the conversation and ariel saves what matters on its own — importance thresholds (EMA-adaptive), staged mutations (proposal → review → apply → revert), |
🎯 Skills | Skill = Memory: agent-read Markdown pages (first-class |
🔐 Security | NaCl |
🛠️ Ops | Auto-backup cron, saga rollback pattern, Prometheus metrics, read-only replica, hourly self-maintenance (decay + consolidation + auto-VACUUM) |
🌐 Wiki | FTS5-indexed markdown files — edit in Obsidian/VS Code, search from MCP, 6 analytical perspectives ( |
Architecture
graph TD
A[LLM Agent] -->|MCP Protocol| B[mcp_server]
B --> C{Importance Scoring}
C --> D[L1: ReflexBuffer]
D --> E[L2: SessionStore]
E --> F{EmotionTrigger?}
F -->|high emotion| G[L3: EpisodicMemory]
F -->|normal| H[L4: CoreMemory]
B --> I[RAG Engine]
I --> J[FTS5 Search]
I --> K[MIB Binary Search]
I --> L[Hybrid RRF Ranking]
B --> M[Wiki System]
M --> N[.md Files]
M --> O[SQLite Index]
B --> P[Knowledge Graphs]
P --> Q[Epistemic Graph]
P --> R[Temporal Graph]
B --> S[Project Store]
S --> T[Decisions / Artifacts / Code Index]
U[Hourly Sweep] -->|consolidate| G
U -->|promote| H
U -->|auto-VACUUM| V[(SQLite)]Comparison
a-memory | mem0 | letta (memgpt) | chroma | |
MCP native | ✅ 7 primitives | ❌ no MCP server | ❌ | ❌ |
Layer isolation | ✅ User vs Agent namespaces | ❌ | ❌ | ❌ |
Local-only (no cloud) | ✅ SQLite — 0 infra | ⚠️ API or self-host Docker | ❌ needs LLM API | ✅ local OSS + Cloud option |
Own semantic search (no API) | ✅ FTS5 + MIB binary hybrid | ⚠️ BM25+entity (LLM-dependent) | ❌ LLM-only | ⚠️ hybrid on Cloud only |
Knowledge graph | ✅ Typed nodes + edges + temporal timeline | ⚠️ entities only | ❌ | ❌ |
Envelope encryption (secrets) | ✅ NaCl SecretBox (auth/saga secrets; memory data is plaintext SQLite) | ❌ | ❌ | ❌ |
Lifecycle hooks | ✅ 19 names (12 user + 13 agent slots), per-layer, config-gated | limited | limited | none |
Self-maintenance | ✅ Hourly consolidation + auto-VACUUM | ❌ | ❌ | ❌ |
Backup / restore | ✅ Auto-cron + saga rollback | ❌ | ❌ | ❌ |
Notes (Sep 2026): mem0 now ships a self-hosted Docker image and a managed cloud with hybrid BM25+entity search; chroma is 29k★ and added hybrid+FTS5 to its Cloud tier (OSS server remains vector-only). What still differentiates a-memory: zero-infra SQLite (no Docker), NaCl-encrypted auth/saga secrets, layer isolation, hourly self-maintenance, and the temporal graph timeline.
Roadmap
4-layer memory hierarchy with layer isolation
Hybrid search (FTS5 + MIB binary embeddings)
Knowledge graphs (epistemic + temporal)
Hourly consolidation sweep + DB self-maintenance
mcp 2.x native SDK
Repo renamed to
Cipher208/a-memory; PyPI package live (pip install a-memory)Temporal timeline wired end to end (think/evolve/project events + dream recent digest)
Dream-cycle inject + auto-generated CONTEXT.md snapshot (curated context + 6 wiki perspectives + recent episodes, per-layer, per-agent)
Phase C — auto-hooks keystone (push-model memory: per-agent conversation daemons, external event dispatcher, importance-gated auto-save, staged mutations with review/revert, dream markers, session-start inject, gap reports; guide)
Phase D — compaction-aware rehydrate (drift log + salvage into the summarizer + one-shot rehydrate blocks; MiMoCode plugin / Hermes native MemoryProvider / CowAgent hooks — integration guide)
Phase D — /recall protocol (multi-axis proportional recall: markers → session → semantic → expand → day; drives Hermes per-turn prefetch)
Phase D — Skill = Memory (Markdown skills as a first-class wiki type, progressive disclosure
wiki_list → wiki_search → wiki_read, 4KB lint cap, promotion pipeline, shared SSOT sync, usage-driven evolution — skills guide)Phase D — working memory + meta-memories (agent scratchpad re-injected at session start, deterministic reflections, smart context budget with weighted floors, counterfactual notes, was_useful quality feedback loop)
Phase D — memory tools D1.2-D1.9 (session continuity recap + steering hints, tool-output compression + recall verification, provenance fact-blame, Memory Query DSL, typed memory schemas, declarative rules engine; coherent
ARIEL_EXPOSEtiers: context / insight / write)Phase E — hardening & closure (18 items across 3 waves): durability — atomic L1 persistence (temp→fsync→os.replace) + per-instance ring files, a circuit breaker guarding the embedding model path (3 failures → open 30s → hash-fallback keeps recall serving), least-privilege wiki roots + traversal-safe backup restore; operations —
memory_diagnose/memory_heal(DB/migrations/L1-files/breaker checks + remigrate/reset-breakers/purge), integrity score in the report card,<cache:break>markers + stable-first inject ordering for provider prompt caches; retrieval — faceted tag queries (dimension:value, same-dim OR / cross-dim AND), memory-kind weights in ACT-R scoring, disclosure triggers («when X, surface Y» recall-side rules); wiring — realcontext_threshold/memory_pressureemitters (Hermes plugin + autohooks daemon),on_turn_endevent,wiki_writestaged mutations with revert, transition-level consolidation revert, causal-link producer onmemory_graph_add; validation — DREAM markers anchored to message start (document-fragment false positives eliminated), post-compaction semantic audit (episode coverage by the L4 set)Phase F — L0→L4 pipeline (bi-temporal fact intervals, hot/warm/cold L0 tiers with CLACK export, SHA-256 capture dedup, hash-chained journal, provenance drill-down)
Phase G — self-wiring graph (12 deterministic miners: sessions, markers, provenance, co-retrieval, entities, zero-result questions, wiki↔fact bridges)
Phase H closeout — EDM/ITS dual-route rerank + eval harness (NDCG@5, drift score, negative-control protocol, LongMemEval-S adapter)
S17 Stage-1 tail — deterministic retrieval mode, ENGRAM procedural kind, AdaptiveRAG pre-gate (27 LLM-free query features), EMA importance gate, counter-signal aliases, SHA-256 L0 dedup, zero-result miner, ru-NER privacy gate
S18-19 wave (15 items) — global is_current view +
changed_sincedelta mode, per-query ACT-R min-max, per-block max_chars, semantic dedup gate, channel-granular sources, 3-option conflict contract (supersede/retain/annotate), orphan-anchor GC, nightly gap-registry, per-agent harness breaker, provenance edge filter, wiki↔fact metadata backlinks,wiki_readrelated-facts hydration, RU lemma keys (pymorphy3), 2-class textcat pilot (flag-gated), S17 supplements 8-11 (cold-archive drill-down, confirming layer, junk-vector detector, HDBSCAN clusters), B6 anti-hub degree capS20 eval — №11 ablation on MINI + LongMemEval-S (50-question stride): full dual-route arm wins on both datasets, published-baseline comparison (GPT-4o long-context league, above ChatGPT-memory); dense e5-small run 3: no parity gain over hash on this split — hash stays prod
Hardening wave (1.12.0) — the speaker-layer defect fixed at the writer (
distill_and_routeread a kind where it needed the speaker) plus a provenance-based purge of the 65 rows it had already mislabelled; a kind classifier that no longer hands a permanent label to harness boilerplate or to compound words (pre-commit,mergeCommit); the gap registry getting the reader S18 planned but never built; the L4 expectation measured against the L4 bar instead of the L3 one (71% of thediff_gapbacklog was that one wrong number); and aqualitygate that could not fail now failing correctly — an unpinned scanner had silently moved its JSON schema out from under itScreenshot / asciinema demo in README
LLM-assisted consolidation on top of the deterministic sweep
Stage 2 — tool-surface redesign (slot system, URI keys, inject/key consolidation — planned with the A-remainder)
LongMemEval full 500-question split + dense-aware threshold retraining (e5-small parity shown, not a win on the 50-question stride)
Contributing
PRs welcome! See CONTRIBUTING.md.
License
MIT © Cipher208
⭐ If this project helps you, star it on GitHub.
Available Tools
7 toolsdreamCRead-onlyIdempotent
Universal Primitive: Hybrid search across ALL layers (L3, L4, Wiki, Graph) with context construction.
Inputs: query (required), layer, limit, intent, +1 more. Returns: object
evolveCDestructive
Universal Primitive: update agent personality and triggering evolution.
Inputs: instruction (required), user_id. Returns: object
forgetADestructive
Universal Primitive: context-aware forgetting with Shadow Bin support.
Scope: exact one L4 key; fuzzy a pattern across L4, L3 and the graph;
recent everything newer than minutes; episode_ids exactly those
episodes.episode_id values; undo puts the archived_ids back where they
came from. Every scope reports what it touched, in entries / episodes /
graph_nodes / not_found.
dry_run=True matches and writes nothing — the same computation as the real
pass, so the preview cannot drift from it. Refused for recent, which has no
shadow bin.
undo refuses a purged row, a row whose archived kind is unknown, another
owner's id, and a row whose key is already back in the table — each with its
reason rather than a bare zero; dry_run=True shows what would return and
refuses the same rows. An id that two archived rows share is refused too, unless
memory_type names the one you want. The archive is not a backup:
restored_items names the fields a restored row could not bring back.
Inputs: key, layer, scope, dry_run, +6 more. Returns: object
memory_hookADestructive
Fire one external lifecycle event (session_started, new_message, ...).
Args: event: one of KNOWN_EVENTS (session_started, session_ended, new_message, auto_save_candidate, context_threshold, memory_pressure, post_context_compression). payload: event body. Recognized keys per event: session_ended: {"summary": str}; new_message/auto_save_candidate: {"text": str}; post_context_compression: {"query": str}; session_started: {"text": str?, "budget": int?}. layer: "user" (default) or "agent". user_id: subject user (bound to API key on HTTP transports). ctx: MCP context (injected).
Returns: Handler results dict; unknown event raises ValueError (MCP error).
Inputs: event (required), layer, payload, user_id. Returns: object
projectCDestructive
Universal Primitive: managing project-specific context and file mapping.
Projects are global (keyed by name). Structured data (identity, decisions, artifact map, code index) lives in projects.db; large documents go to the Wiki as project_spec pages.
Inputs: name (required), action (required), path, role, +6 more. Returns: object
thinkCDestructive
Universal Primitive: routing thoughts to correct memory layers based on importance and content.
kind: optional declaration hint (one of L4_DECLARABLE_KINDS). A declared thought is authored canon — it bypasses the length/pattern gates straight to L4 (spec S4), rate-limited per user. Without it, behavior is unchanged.
Inputs: text (required), kind, layer, user_id, +2 more. Returns: object
wake_upBRead-onlyIdempotent
Wake up (E10, Stage 2-C): one-call memory lift for a fresh session.
Glues memory_recap (continuity pack) and the inject critical set onto a shared token budget: recap takes at most half, inject gets the rest. Returns structured blocks plus a rendered markdown block with a cache:break between the two halves.
Inputs: layer, budget, user_id. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
The metaphorical names (dream=search, think=routing/store, evolve=personality, forget=delete) obscure the underlying actions, so an agent wanting to store or retrieve could plausibly misselect between think and dream. Descriptions disambiguate reasonably well once read, but the boundaries are not self-evident from the names.
Most tools are single imperative verbs (evolve, think, dream, forget, project, wake_up), which is fairly consistent, but memory_hook breaks the pattern with a noun_noun form and several names are metaphorical rather than descriptive. It reads cleanly but the convention is not uniform.
Seven tools is well-scoped for a memory server covering store, search, forget, lifecycle, session lift, projects, and evolution. Each tool has a distinct role and none feels redundant.
The surface covers a full memory lifecycle: ingest (think), retrieval (dream, wake_up), deletion/undo (forget), lifecycle events (memory_hook), project context (project), and personality (evolve). Only minor gaps remain, such as no explicit standalone get/recall beyond the search-oriented tools.
Maintenance
Related MCP Connectors
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Universal memory for AI agents and tools. Save, organize and search context anywhere.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides AI agents with persistent, searchable memory that survives across conversations using semantic search, temporal versioning, and smart organization. Enables long-term context retention and cross-session continuity for AI assistants.14-
- AlicenseCqualityAmaintenanceProvides AI assistants with persistent memory and code intelligence across all tools and conversations. Features semantic search, knowledge graphs, decision tracking, and impact analysis with 60+ tools for universal context preservation.362,856 npm46MIT
- AlicenseAqualityDmaintenanceEnables AI agents with persistent semantic memory, including semantic recall, knowledge graphs, and instant domain expertise via pre-built Intelligence Packs.1051 npmMIT

RushDB MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI agents to gain persistent, structured memory that is semantically searchable and graph-traversable, allowing them to store and query records and relationships without managing embeddings or schemas.48784 npmApache 2.0