Articles

Most MCP memory servers store text. Few tag where it came from.

Look across the MCP memory servers people actually run and almost all of them share one property: once something's saved, it's just "a memory." Nothing in storage distinguishes a fact you stated from a document it read from a summary it wrote itself. Six of the most-used servers, compared on exactly that.

A row of identical plain modules, one wearing a distinct amber tag the others lack

Six servers, compared

Server
Storage
Provenance tagged?
Account required?
@modelcontextprotocol/server-memory
Local JSON knowledge graph of entities and relations
No
No
doobidoo/mcp-memory-service
Local vector store (ChromaDB) for semantic search
No
No
Mem0 (OpenMemory MCP)
Local or hosted vector and graph store
Partial: tags a user or agent, not evidence versus summary
No locally, yes on the hosted tier
Letta (MemGPT)
Agent state and memory, self-hosted or on Letta Cloud, not a bare MCP memory server
No
No self-hosted, yes on Letta Cloud
Zep
Temporal knowledge graph, hosted or self-hosted community edition
No
Yes on the hosted tier
ModelBrain
Local vault, plain files you own
Yes: stated fact, source document, or model-generated summary, tagged at write time
No (pre-release)

Read from each project's own README and docs as of publish time; check their repos directly before relying on specifics. server-memory · mcp-memory-service · Mem0 · Letta · Zep

The distinction that gets lost

Three things can end up in a memory store, and they carry very different weight: something you told the assistant directly, something the assistant read from a document you gave it, and something the assistant itself concluded or summarized from other memories. Stored as undifferentiated text, all three come back identically confident. A model-generated summary that drifted slightly from the source looks exactly as trustworthy as the sentence you typed yourself, because nothing in the data says otherwise.

Why it matters specifically when a memory is wrong

This stops being an abstract data-modeling concern the moment a recalled memory turns out to be stale or incorrect. Which of the three types it was determines what the right fix even looks like: correcting a stated fact you'd change your mind about is different from re-reading a source document that changed, which is different again from a summary that needs to be regenerated once its inputs move. A memory store that never captured which one it was can't tell you which fix applies; it can only tell you something doesn't match anymore. What a forget call actually has to guarantee covers the failure modes that follow from exactly this gap.

How ModelBrain does it instead

Every memory ModelBrain stores carries a provenance tier at write time, source evidence, your own stated assertion, or a model-generated summary, kept as a distinct, queryable field rather than collapsed into one opaque blob. It's a small addition to the schema and a real constraint on the write path, not a retrieval-time trick layered on afterward. How ModelBrain tags what it remembers has the actual mechanics.

The complete MCP tool surface this runs on, five calls, nothing hidden: ModelBrain's MCP server tools.