MEM0 · FIELD REPORTEDITION 2026.2
An exhaustive technical dossierArchitecture · Memory Model · Context EngineeringRevised · 33 sources · 30+ features mapped

Building blocks of machine recall · 2nd edition

The Memory Layer

Large language models reset the moment a fact slides past the context window. Mem0 is the persistence engine that refuses to forget: extracting salient facts from conversation, consolidating them, and serving them back on demand across sessions, agents, and months of interaction.

+26%
accuracy over OpenAI memory on LOCOMO
−91%
p95 latency vs. full-context prompting
−90%
token cost vs. replaying history
4
primitives: add · search · update · delete

What this report covers

// scope
01 the tech stack
02 system architecture
03 the two-phase pipeline
04 every command, under the hood
05 graph memory (Mem0g)
06 memory types
07 the data model
08 the evidence
09 context engineering
10 limits & trade-offs

Mem0, pronounced “mem-zero”, is an open-source memory layer that sits between an application and its LLM. Rather than stuffing an entire transcript into every request, it distills conversations into compact, addressable facts, stores them in a vector index (and optionally a knowledge graph), and retrieves only what the current query needs.[1][8]

The project ships as a Python and TypeScript SDK, a self-hostable server, a hosted platform, a CLI, and an MCP server. It is governed by a research paper, public documentation, and a 41k-star source repository: the three pillars this report is built on and continuously cross-checks against one another.[1][4][2]

Sources are tagged PRIMARY (paper · docs · source) and SECONDARY (technical write-ups used only to corroborate). Where the two diverge, e.g. the default model, the report says so explicitly.

// contents
01

The substrate

The exact stack Mem0 is built on

Mem0 is deliberately a thin, swappable layer: it requires an LLM (for fact extraction and update decisions) and an embedding model (for semantic search), then plugs into whatever vector store, graph store, and history database you choose.[4][12]

Language & interfaces

The core engine is written in Python, with a first-class TypeScript/JavaScript SDK mirroring the same API. Access is offered through four surfaces: the in-process Memory / AsyncMemory classes, a remote MemoryClient hitting the REST API, a self-hosted server, and a CLI. An MCP server exposes the primitives as tools so agents can call them directly.[4][9]

LayerDefaultPluggable options (representative)
LLMgpt-5-mini ◇OpenAI · Anthropic · Google · AWS Bedrock · Azure · Groq · Together · Ollama · 20+ providers
Embeddertext-embedding-3-smallOpenAI · HuggingFace · Vertex · Together · Bedrock · 14+ providers
Vector storeQdrantChroma · FAISS · Pinecone · Weaviate · Mongo Atlas · Azure AI Search · Elasticsearch · Redis · 10+
Graph storeremoved in v3 ◆Previously swappable (Neo4j · Memgraph · Kuzu · AGE · Neptune). The v3 OSS algorithm removed external graph stores (~4,000 lines), replacing them with built-in entity linking. See §05.
History DBSQLitelocal audit trail of every ADD / UPDATE / DELETE; swap to Postgres in production

Cross-verification note. The default extraction model has migrated over time: community guides cite gpt-4o-mini and later gpt-4.1-nano, while the current README states gpt-5-mini. All agree the model is configurable, and the default is whatever ships in your installed version.[4][14]

Two deployment philosophies share one API: Mem0 Open Source (you run the LLM endpoint and stores) and Mem0 Platform (hosted). Switching is a matter of swapping Memory() for MemoryClient(api_key=…).[5]

02

Architecture

Three API faces, three storage organs

A single MemoryConfig object is the spine. It wires the AI-processing layer (LLM + embeddings) to the storage layer (vector + history + optional graph), overridden in layers: built-in defaults → environment variables → config files → programmatic objects.[13]

User appagent · chatbot · toolCORE APIMemorysynchronousAsyncMemoryasync / awaitMemoryClientREST → PlatformMemoryConfigcentral configurationAI PROCESSINGLLM layerextraction · update decisionsEmbedding layertext → vectorSTORAGEVector storeembeddings + payloadHistory DBSQLite audit logGraph storeNeo4j · Memgraph · Neptune
Fig. 1 · System architecture. The user app calls one of three API classes; all share MemoryConfig (green dashed = configuration flow). Processing fans out to LLM + embeddings; storage spans the vector store, the SQLite history log, and the optional graph store (shown here as the legacy architecture, removed in the v3 OSS algorithm).[13][33]

Logical vs. physical separation

All memory levels live in the same physical stores but are kept apart logically by scoping identifiers, user_id, agent_id, app_id, and run_id, carried in each record’s payload. A search for one user implicitly restricts to records where the other identifiers are null, unless you widen the filter with wildcards.[6][13]

03

The pipeline

Two phases: extract, then reconcile

The research paper describes an incremental, two-phase pipeline. Memory is never a passive dump: every new exchange is read for meaning, then weighed against what is already known.[1]

Phase 1 · Extraction

When a message pair arrives, Mem0 assembles a prompt from two context sources: a rolling conversation summary (refreshed asynchronously so extraction never blocks) and a recent-message window. An LLM extraction function distills this into a set of candidate facts, self-contained statements worth remembering.[1]

Phase 2 · Update (the A.U.D.N. cycle)

Each candidate fact is not blindly stored. Mem0 embeds it, runs a semantic search for the top-k most similar existing memories, and hands both to an LLM through a tool-call interface. The model chooses one operation per fact.[1][18]

PHASE 1 · EXTRACTIONPHASE 2 · UPDATEnew pair (m, mt)summary S (async)recent window {m…}LLM extractextract salient factscandidatesvector searchtop-k similar memoriesLLM tool-callchoose operationADDnew factUPDATEaugment / reviseDELETEcontradictedNOOPredundantVector store + History log (+ Graph)every op recorded: old → new · event · timestamp
Fig. 2 · The two-phase memory pipeline. Extraction reads each new exchange against an async summary and a recency window to produce candidate facts. Update embeds each candidate, retrieves similar memories, and lets an LLM tool-call pick ADD / UPDATE / DELETE / NOOP, the “A.U.D.N.” cycle, before writing through to the stores and the audit log.[1][13]

This is the mechanism behind Mem0’s most-quoted property: controlled forgetting. By delegating the keep/merge/discard decision to a model with the relevant neighbours in view, rather than to brittle if/else rules, the store stays dense and non-contradictory as it grows.[16][18]

“Mem0 implements a novel paradigm that extracts, evaluates, and manages salient information from conversations through dedicated modules for memory extraction and updation.”Chhikara et al., Mem0 research paper, arXiv:2504.19413
2026 production algorithm

The hosted platform and current SDK ship a successor to the paper’s pipeline: a single-pass hierarchical extraction with multi-signal retrieval (semantic + keyword + entity boosting, plus rerankers). It keeps the average retrieval call under ~7,000 tokens while raising benchmark accuracy.

04

Under the hood

Every command, traced to its effects

Both the in-process and remote APIs expose the same surface. Here is what each call actually does once it leaves your code.[13][3]

add()messagesLLM extractembedsearch top-kA.U.D.N.store + logsearch()queryembed queryvector match+ graph (opt.)rerankranked hitsgraph traversal runs in parallel, merged into results
Fig. 3 · Write and read paths. add() always pays for an LLM call (extraction + A.U.D.N.); search() pays only for one embedding plus a vector lookup, optionally enriched by graph traversal and a reranker. This asymmetry, expensive writes, cheap reads, is why Mem0 fits read-heavy chat workloads.[17]

The full primitive set

add(messages, *ids, …)
Create memories from a conversation. Extraction + A.U.D.N. by default; raw mode via infer=False.
search(query, *ids, threshold?)
Semantic retrieval, returns ranked memories with relevance scores.
get(memory_id)
Fetch one memory by its UUID.
get_all(*ids, filters, limit)
List memories in a scope, with metadata filters and paging.
update(memory_id, data)
Replace the content of an existing memory (logged to history).
delete(memory_id)
Remove a single memory.
delete_all(*ids)
Bulk delete by scope, at least one identifier required (guard rail).
history(memory_id)
Full ADD / UPDATE / DELETE timeline for one memory, the audit trail.

reset() wipes the entire store; from_config() builds a configured instance. AsyncMemory mirrors every method with async/await.[13]

05

Graph memory · Mem0g

When facts need to be connected, not just listed

The graph variant, Mem0g, stores memories as a directed, labelled graph: entities are nodes, relationships are edges. It exists for queries that must navigate relational paths, the multi-hop questions a flat vector store struggles with.[1]

Extraction here is a two-stage LLM process. An entity extractor identifies people, places, objects, concepts, and events; a relationship generator emits triplets of the form (source, relation, destination). On write, embeddings are computed for source and destination, existing nodes are reused if similarity clears a threshold, and a conflict detector flags relationships the new information contradicts, with outdated edges marked invalid (soft-deleted) rather than erased, preserving history for temporal reasoning.[1][14]

AlexSan Franciscoboutique hotelstravellives_inpreferspart_ofcontexttriplet (vs , r , vd) · dark node = subject · outlined nodes = entities · labels = relations
Fig. 4 · Memories as a knowledge graph. Mem0g turns “Alex lives in San Francisco and prefers boutique hotels” into connected triplets, letting a later query about travel preferences traverse from person → preference → domain. Graph mode trades slower writes for relationship-aware recall.[1]

The cost is real: entity extraction is heavier than fact extraction, so add() slows and a graph database must be operated. The guidance, echoed by practitioners, is that graph mode earns its keep only when retrieval actually traverses relationships; otherwise the default flat store is the right call.[17]

Update · the V3 algorithm changed this picture

In April 2026 Mem0 shipped a new memory algorithm. In the open-source default, the external graph store was replaced by built-in entity linking: on add(), entities are extracted into a parallel {collection}_entities collection; at search time, query entities are matched and used to boost ranking. The trade-off is blunt: this is no longer a queryable graph, and the relations field is gone.[23]

Can you still change the underlying graph DB? On the current default, no. The OSS v2→v3 migration guide is explicit: graph_store, enable_graph, the Neo4j default config, and ~4,000 lines of external graph code have been removed entirely. The swappable provider set (Neo4j, Memgraph, Kuzu, Apache AGE, Neptune) applies to the previous algorithm only.[33]

06

Memory types

A stratigraphy of what an agent remembers

Mem0 maps the classic cognitive categories onto layered storage: a sticky note for the current task, a journal for the session, an archive for the user. What fades quickly and what lasts for months is a choice you make per write.[2]

LIFETIME →Conversationsingle response · lost after the turnSHORT-TERMSessionminutes–hours · scoped by run_idSHORT-TERMUserweeks–forever · scoped by user_idLONG-TERMOrganizationshared across agents & teamsLONG-TERMpromote ▲ data flows upward as it proves durableCOGNITIVE TYPEWorking / attentionrecent turns · tool outputs · intermediate state, the "hot" contextSemantic (factual)durable facts, preferences, relationships between conceptsEpisodicsummaries of past interactions & completed tasks (what happened)Procedurallearned workflows & how-to, opt-in via memory_type, needs agent_id
Fig. 5 · Two views of the same memory. Left: storage layers by lifetime (Conversation → Session → User → Org). Right: the cognitive types those layers carry. By default, add() creates short-term plus long-term (semantic + episodic) memories; procedural memory is explicit.[2]

How retrieval merges the layers

The layers are stored separately and combined at query time in three steps: capture (messages enter the conversation layer while the turn is live) → promote (relevant details persist to session or user memory) → retrieve (the search pipeline pulls from all layers, ranking user memories first, then session notes, then raw history).[2]

LayerLifetimeHorizonBest for
Conversationsingle responseshorttool calls, chain-of-thought within a turn
Sessionminutes–hoursshortmulti-step flows (onboarding, a debugging run)
Userweeks–foreverlongpersonalization, preferences, account state
Orgconfigured globallylongshared FAQs, policies, catalogs across agents

Use run_id when short-term context should expire automatically; rely on user_id for lasting personalization.[2]

07

The data model

What a single memory actually is

A memory is a discrete, addressable unit, not a chunk of transcript. Each one carries its content, a semantic embedding, scoping identifiers, a content hash, timestamps, and free-form metadata.[9][14]

Memory objectiduuid (primary key)memorythe fact, in wordsembeddingdense vectorhashcontent fingerprintuser_idscopeagent_idscope · nullableapp_id / run_idscope · nullablemetadatajson · categoriescreated / updated_atAUDIT TRAIL (SQLite)History recordmemory_idold_memorynew_memoryeventADD·UPDATE·DELETEactor_id / rolecreated / updated_atlogs every changeGRAPH (optional)Tripletsource nodeentity · type · embedrelationlabelled edgedestination nodeentity · type · embedImplicit null scoping: a write with only user_id is retrievable only when other identifiers are null, unless you query with wildcards (*).
Fig. 6 · The data model. The vector store holds Memory objects (content + embedding + scope + metadata). The SQLite History table records every mutation as old → new with an event type and timestamp, the basis for history() and governance. Graph mode adds typed nodes and labelled edges.[9][13]
A retrieved memory, in JSON
{
  "id": "13efe83b-a8df-4ec0-814e-428d6e8451eb",
  "memory": "Likes to play cricket on weekends",
  "hash": "87bcddeb-fe45-4353-bc22-15a841c50308",
  "metadata": { "category": "hobbies" },
  "user_id": "alice",
  "created_at": "2024-07-26T08:44:41-07:00",
  "updated_at": null
}

Search responses additionally return a relevance score and the originating input conversation. The same shape is served by both the open-source SDK and the REST API.[9][21]

08

The evidence

What the benchmarks actually show

Mem0’s central claim is a three-way win, accuracy, latency, and cost, measured on LOCOMO, a long-conversation QA benchmark, with an LLM-as-a-judge (J) score.[1][7]

ACCURACY · LOCOMO J-SCOREOpenAI memory52.9%Mem0 (paper)66.9%Mem0 2026 algo92.5%+26% relative over OpenAI in the original paper;2026 algo: 92.5 LoCoMo · 94.4 LongMemEval · 64.1/48.6 BEAM.EFFICIENCY vs. FULL-CONTEXTp95 latency1.44s17.12sMem0 vs full-context (−91%)tokens / query~7K~26KMem0 vs full-context (≈ −90%)Search latency alone: p50 0.148s · p95 0.200s,the lowest among all methods tested in the paper.
Fig. 7 · The three-way trade-off, measured. Original paper: J-score 66.9% vs. OpenAI’s 52.9% (+26% relative), p95 total latency 1.44s vs. 17.12s for full-context (−91%), ~90% fewer tokens. The 2026 token-efficient algorithm pushes LoCoMo accuracy to 92.5 while holding retrieval under ~7K tokens.[1][8]

The honest caveats. Mem0’s own evaluation notes that small benchmarks like LoCoMo can be inflated by aggressive retrieval or frontier models, and that on short conversations (≤30 turns) full-context prompting can still beat a memory layer on raw accuracy; the win appears as histories grow long enough that replaying them becomes slow and expensive. Independent benchmarks from competing systems report different rankings, a reminder that memory evaluation is contested and configuration-sensitive.[7][20]

“Optimizing one is easy. Balancing all three, accuracy, cost, and latency, at scale is the actual problem.”Mem0 docs, Memory Evaluation
09

Context engineering

Using Mem0 to engineer the context window

Context engineering is the discipline of deciding what goes into the prompt on every turn. Mem0’s role is to keep that window small and high-signal: instead of replaying history, you retrieve a handful of distilled facts and inject only those.[12][17]

user messagethe new turnsearch(query)top-k relevant memoriesassemble promptsystem + memories + turnLLM respondsadd(turn)write back salient factsmemories accumulate across turns & sessionsThe context window stays small and constant, only the most relevant ~k facts enter the prompt, regardless of how long the relationship is.
Fig. 8 · The retrieve-inject-write loop. Each turn: search memory for what’s relevant, assemble a tight prompt from system instructions + retrieved facts + the new turn, respond, then write any new salient facts back. The window never balloons with history.[12][22]

Field-tested practices

Scope deliberately. Use run_id for ephemeral, self-cleaning session context and user_id for durable personalization; combine with agent_id / app_id to separate user-stated facts from agent-generated inferences.[6]

Mind the write/read economics. Every add() costs an LLM call; every search() costs only an embedding plus a lookup. For read-heavy chat this is a clear win; for write-heavy, low-read workloads the extraction overhead may not pay off.[17]

Structure your metadata early. Wrap memories with categories, a schema_version, and consistent identifiers so you can filter, audit, and run retention workflows later. Mem0 supplies the primitives, but the schema and write policy are yours to design.[22]

Keep the graph off until traversal pays. Default to the flat vector store; reach for Mem0g only when queries genuinely need multi-hop relational reasoning.[17]

Minimal loop, in practice
m = MemoryClient(api_key=...)
m.add(messages, user_id="alice")            # write: extract + reconcile
hits = m.search("dietary restrictions?",    # read: cheap retrieval
                user_id="alice")
prompt = system + format(hits) + user_turn  # inject only what's relevant
10

Limits & trade-offs

Where the layer ends and your design begins

Mem0 provides building blocks, not guarantees. A short, honest inventory of what it does not solve for you.[22]

Model interpretation is not free. Extraction and update decisions are LLM calls, so they inherit LLM failure modes: a fact can be misread, an update misjudged, or a retrieved memory ignored at generation time. Memory quality is bounded by the model you wire in.[22]

Governance is yours. Memories are retrievable by design, so secrets and unredacted PII should never be written raw; the docs advise hashing or encrypting sensitive values and building retention workflows on top of the delete API and metadata filters.[2]

Schema drift is real. As an application evolves, metadata conventions change; versioned keys and disciplined write policies are the only defense, and they remain an engineering responsibility.[22]

Benchmarks are contested. Accuracy numbers are configuration-sensitive and the field lacks a settled evaluation; treat any single headline figure, including Mem0’s, as directional, not absolute.[7][20]

The one-line verdict

Mem0 is a model-driven, framework-agnostic memory layer that separates reasoning from persistence: it distills conversation into addressable facts, reconciles them as they change, and serves them back cheaply, turning a fixed context window into something that behaves like long-term memory. Used well, it is less a database than a discipline for context engineering.

Part II · the operating layer

Memory as an operating layer

Beyond the pipeline and the store lies the machinery that makes memory usable in production: how it ages, how it is found, how it is shaped, and how it is governed. Six chapters on Mem0 as a full operating layer, not just an extract-store-retrieve loop.

11
lifecycle: decay · expiry · eviction
12
advanced retrieval
13
shaping what's stored
14
the V3 algorithm
15
openmemory · MCP · integrations
16
governance & ops
11

The missing dimension

Decay, expiration & forgetting

An agent that remembers everything forever degrades: stale facts pollute the top-k, inflate tokens, and contradict current truth. Mem0 addresses this with three distinct mechanisms that are easy to conflate but do very different things.[25][27]

1 · Memory Decay, re-ranking, not deletion

Shipped May 2026 as a per-project toggle, Memory Decay biases search ranking toward recently-used memories. Each memory keeps a record of its last accesses (up to 20 timestamps); a memory touched today can earn a ~1.5× boost while one idle for weeks is dampened toward ~0.3×, a roughly 5× spread that reorders candidates without overwhelming the underlying relevance score (clamped to [0,1]). Nothing is deleted; reinforcement runs fire-and-forget, so search latency is unchanged. Disable any time with decay: false.[25]

2 · Memory Expiration, TTL with tiers

By default Mem0 memories persist forever. Pass an expiration_date and a memory self-destructs after its window, no cron jobs. The documented pattern is tiered retention: ~7-day session context, ~30-day chat history, permanent preferences and core facts.[26]

3 · Eviction, and the OSS caveat

Beyond decay and expiry sit classic eviction policies: hard TTL, LRU (drop entries unused for N days; each access resets the clock), and periodic pruning. The critical caveat: Mem0 OSS has no built-in TTL, decay, or expiration. expiration_date is Platform-only, and self-hosted lifecycle management is your responsibility.[30][31]

A1 · DECAY (ranking)1.5x1.0x0.3xtime since last accessfresh · boostedstale · dampenedper-project · search-time · nothing deletedA2 · EXPIRATION (TTL)session~7 dayschat history~30 dayspreferencesforeverexpiration_date → auto-cleanup, no cronPlatform onlyA3 · EVICTION (deletion)TTL · drop after N daysLRU · access resets clockprune low-importanceOSS: no built-in support,your responsibility
Fig. 9 · Three ways memory ages. Decay reorders results by recency at search time (nothing removed). Expiration deletes on a per-memory TTL with tiered windows. Eviction is classic deletion (TTL/LRU/prune), and is entirely the developer’s job in OSS. They compose: decay for relevance, expiry for cost, eviction for policy.[25][27]
12

Retrieval, in depth

More than vector similarity

Section 04 sketched search as “embed the query, match by similarity.” The real retrieval path is richer: a multi-signal fusion with optional reranking and several specialized modes.[23]

Multi-signal / hybrid retrieval. The V3 algorithm fuses three signals in parallel, semantic similarity, BM25 keyword matching, and entity matching, each normalized and combined into one score. (Hybrid search benefits from an NLP install: pip install mem0ai[nlp] plus a spaCy model.)[23]

Reranking. Vector search returns the right candidates in the wrong order; an optional second-pass reranker re-scores them against the query using Cohere, Hugging Face, Sentence Transformers, or an LLM before anything reaches the context window.[23]

Criteria-Based Retrieval. Beyond generic relevance, you can rank by custom criteria that matter to your app, emotional tone, intent, behavioral signals, so a support agent surfaces frustrated-tone memories first.[28]

Temporal Reasoning & filters. Time-aware retrieval ranks the right dated instance for “last week,” “right now,” or “upcoming,” and V2 filters compose AND/OR over metadata, entity, and time.[29]

querysemantic similarityvector cosineBM25 keywordlexical matchentity matching{collection}_entitiesnormalize+ fuse scorererank (opt.)Cohere · HF · ST · LLMtop-kinto context
Fig. 10 · Multi-signal retrieval. V3 fuses semantic, lexical (BM25), and entity signals into one normalized score, then optionally reranks before the top-k reaches the prompt. Criteria, temporal, and compound metadata filters layer on top of this path.[23][29]
13

Write-side control

Shaping what gets stored, and how

Extraction isn’t a black box you have to accept. Mem0 exposes project-level and per-request controls over what it remembers, plus capabilities that rarely make the headline tour.[29]

Custom Categories
Replace generic buckets (food, travel) with a domain taxonomy so memories organize the way your app thinks.
Custom Instructions
Inclusion / exclusion prompts and memory depth: a medical bot excludes medication specifics; a support bot keeps only product + issue history.
Contextual Add
Have add() weigh the surrounding conversation, not just the latest turn.
Direct Import
Seed predefined memories with no LLM inference, fast, deterministic backfill (infer=False).
Multimodal
Store images, PDFs, and markdown as memory input: recall a scanned doc or a shared photo across sessions.
Group Chat
Multi-participant conversations with provenance, so user-stated facts stay separable from agent inferences.
Async Client
Non-blocking writes; add() returns a pending status while extraction runs in the background.
Feedback
Capture user signals on memory quality to improve future extraction and ranking.
Export · Webhooks · Batch
Pydantic-schema exports, real-time webhooks on memory changes, and batch update/delete for bulk maintenance.
14

Architecture, updated

The V3 algorithm & the new numbers

The two-phase pipeline in Section 03 is the paper’s design. The production system has since moved to a single-pass hierarchical extraction with multi-signal retrieval, and the benchmarks I led with are now superseded.[23][24]

Two changes matter most. First, extraction is now single-pass and ADD-oriented, and it treats agent-generated facts as first-class, storing the assistant’s confirmations and recommendations with the same weight as user statements, closing a real coverage gap. Second, as covered in the §05 update, OSS swapped the queryable graph for entity linking.[23]

Unit note: the 2025 paper reports ~26K tokens per conversation for full-context; the 2026 algorithm reports ~6,956 tokens per retrieval call. Different units, same efficiency story. Headline accuracy figures also vary slightly by snapshot (91.6–92.5 on LoCoMo).[23]

BenchmarkV3 algorithm (2026)vs. previous
LoCoMo91.6+20 points
LongMemEval94.8+27 points (+53.6 on assistant-memory recall)
BEAM (1M tokens)64.1production-scale, 1M-token evaluation
biggest category gainstemporal +29.6 · multi-hop +23.1the two that matter most for real histories

The evaluation framework is open-sourced so the numbers are reproducible, and Mem0’s own docs caution that small benchmarks remain sensitive to retrieval strategy and model choice.[4][7]

15

Beyond the SDK

OpenMemory, MCP & the integration surface

It is tempting to treat Mem0 as one library. It is closer to a small ecosystem.[29]

OpenMemory, a local-first, self-hosted memory product (its API ships as a FastAPI service under openmemory/api) that auto-captures coding memories and serves project-scoped context to AI agents, all under your own infrastructure.[29][32]

MCP everywhere. A hosted MCP server (mcp.mem0.ai) and a self-hosted one expose memory as tools; an editor plugin provides nine MCP tools (add_memory, search_memories, …) for Claude Code, Cursor, Codex, OpenCode, and Antigravity. Agents can even self-mint an API key via the CLI in under five seconds.[29]

Framework breadth. Official integrations span 20+ frameworks, LangChain, LangGraph, LlamaIndex, CrewAI, AutoGen, Agno, the OpenAI Agents SDK, Google ADK, Mastra, and the Vercel AI SDK, plus voice/real-time stacks (ElevenLabs, LiveKit, Pipecat) where memory writes run async to avoid adding latency.[29]

16

Production posture

Governance & operations

Memory at scale is infrastructure, and the Platform ships the controls that implies, most of which hide behind a single cover stat.[5]

Tenancy. A full Organizations → Projects hierarchy with members and roles provides multi-tenant isolation, layered on top of the per-memory user_id / agent_id / app_id / run_id scoping covered earlier.[29]

Compliance & data control. SOC 2 (Type 1) and HIPAA compliance, BYOK, and zero-trust options; deployable to Kubernetes, private cloud, or air-gapped with the same API. Because memories are retrievable by design, the docs are explicit that PII should be hashed/encrypted and governed by retention workflows.[7][5]

Observability. Every read and write is logged (the history table underpins history()); the Events API surfaces async operations; webhooks notify external systems; and a managed dashboard exposes usage. Platform advertises sub-50ms retrieval.[29]

The verdict

Mem0 is not just an extract-store-retrieve pipeline. It is a memory operating layer: it decides what to remember (custom instructions, categories, multimodal input), how to keep it fresh (decay, expiration, eviction), how to find it (multi-signal fusion, reranking, criteria, temporal), and how to govern it (tenancy, compliance, audit), exposed identically across SDKs, a REST API, a CLI, MCP, and OpenMemory.

References

// 33 sources · primary & secondary · edition 2026.2
  1. [1]Chhikara, Khant, Aryan, Singh & Yadav. “Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory.” arXiv:2504.19413, Apr 2025. primary
    arxiv.org/abs/2504.19413
  2. [2]Mem0 Docs · Memory Types. primary
    docs.mem0.ai/core-concepts/memory-types
  3. [3]Mem0 Docs · Add Memory / Memory Operations. primary
    docs.mem0.ai · memory-operations/add
  4. [4]Mem0 · GitHub source & README (mem0ai/mem0). primary
    github.com/mem0ai/mem0
  5. [5]Mem0 Docs · Platform Overview. primary
    docs.mem0.ai/platform/overview
  6. [6]Mem0 Docs · Entity-Scoped Memory. primary
    docs.mem0.ai · entity-scoped-memory
  7. [7]Mem0 Docs · Memory Evaluation (LoCoMo / LongMemEval / BEAM). primary
    docs.mem0.ai/core-concepts/memory-evaluation
  8. [8]Mem0 Blog · The Token-Efficient Memory Algorithm. primary
    mem0.ai/blog · token-efficient
  9. [9]Mem0 · REST API reference (memory object schema). primary
    api.mem0.ai · v1/v2 memories
  10. [10]AWS Database Blog · Persistent memory with Mem0 OSS, ElastiCache & Neptune. secondary
    aws.amazon.com/blogs/database
  11. [11]Valkey Blog · AI Agent Memory with Valkey and Mem0. secondary
    valkey.io/blog
  12. [12]DeepWiki · mem0ai/mem0 code-level docs. secondary
    deepwiki.com/mem0ai/mem0
  13. [13]Community · Mem0 Architecture Documentation (coderplay gist). secondary
    gist.github.com/coderplay
  14. [14]Dwarves Memo · Mem0 & Mem0-Graph breakdown. secondary
    memo.d.foundation/breakdown/mem0
  15. [15]Mem0 · GitHub Issue #3644: semantic / episodic / procedural memory_type. secondary
    github.com/mem0ai/mem0/issues/3644
  16. [16]Dwarves Memo · consolidation / controlled-forgetting detail. secondary
    memo.d.foundation/breakdown/mem0
  17. [17]SurePrompts · mem0 Implementation Guide. secondary
    sureprompts.com/blog/mem0-implementation-guide
  18. [18]VirtusLab · GitHub All-Stars #2: Mem0 (the “A.U.D.N.” cycle). secondary
    virtuslab.com/blog/ai
  19. [19]EmergentMind · Mem0: Scalable Memory Architecture. secondary
    emergentmind.com/topics/mem0-system
  20. [20]Memori Labs · LoCoMo Benchmark Results (independent). secondary
    memorilabs.ai · benchmark
  21. [21]FutureSmart AI · Integrating Mem0 with LangChain. secondary
    blog.futuresmart.ai
  22. [22]Mem0 Blog · Open-source AI agents with built-in memory. primary
    mem0.ai/blog · open-source-agents
  23. [23]Mem0 Blog · State of AI Agent Memory 2026 (V3 algorithm). primary
    mem0.ai/blog · state-of-ai-agent-memory-2026
  24. [24]DeepWiki · mem0ai/mem0 overview (V3, hybrid retrieval). secondary
    deepwiki.com/mem0ai/mem0
  25. [25]Mem0 Blog · Introducing Memory Decay in Mem0. primary
    mem0.ai/blog · introducing-memory-decay
  26. [26]Mem0 Docs · Set Memory Expiration (tiered retention). primary
    docs.mem0.ai · memory-expiration
  27. [27]Mem0 Blog · Memory eviction and forgetting in AI agents. primary
    mem0.ai/blog · memory-eviction
  28. [28]Mem0 Docs · Criteria Retrieval. primary
    docs.mem0.ai · criteria-retrieval
  29. [29]Mem0 Docs · llms.txt feature index. primary
    docs.mem0.ai/llms.txt
  30. [30]Mem0 · GitHub Issue #5330 (no built-in decay/expiry in OSS). secondary
    github.com/mem0ai/mem0/issues/5330
  31. [31]DEV Community · AI Agent Memory Part 2: Intelligent Forgetting. secondary
    dev.to · intelligent-forgetting
  32. [32]Rank&Compare · Mem0 Review 2026. secondary
    rankncompare.com/tools/mem0
  33. [33]Mem0 Docs · Migrating to the New Memory Algorithm (v2→v3). primary
    docs.mem0.ai/migration/oss-v2-to-v3