<!-- generated by build_articles.py — edit content/compare/xerj-vs-mcp-memory-service.md instead -->
---
title: "XERJ vs mcp-memory-service: tested MCP memory servers"
canonical: "https://xerj.org/compare/xerj-vs-mcp-memory-service"
updated: "2026-10-31"
source: "content/compare/xerj-vs-mcp-memory-service.md"
---

# XERJ vs mcp-memory-service: two MCP memory servers, tested

**Short answer** (updated 2026-10-31): XERJ or mcp-memory-service? With MiniLM, both found 84% of reworded questions. mcp-memory-service found 89.3% of all answers in the top 5 and XERJ semantic recall 94.7%. At default settings mcp-memory-service rejected 4 of 15 updated facts as duplicates. XERJ stores every write unless you ask for dedup.

**Key number:** mcp-memory-service turns semantic dedup on by default: a new memory 0.85 similar or more to one from the last 24 hours is rejected. (as of 2026-10-31; source: [github.com/doobidoo/mcp-memory-service/blob/main/src/mcp_memory_service/storage/mixins/base.py](https://github.com/doobidoo/mcp-memory-service/blob/main/src/mcp_memory_service/storage/mixins/base.py))

**TL;DR** mcp-memory-service and XERJ both serve agent memory over MCP and HTTP. Both can use a local MiniLM model; XERJ needs neural mode for it. Recall was close: 89.3% top 5 for mcp-memory-service, 94.7% for XERJ semantic. The big difference was changed facts: mcp-memory-service's default dedup threw away 4 of 15 updates.

## Agent prompt

```text
Act as a coding agent. Read https://xerj.org/llms.txt, install XERJ, start a local node with --embed-mode neural, store a fact about this project with POST /_memory/project, store a changed version of the same fact, then recall it with hybrid recall and recency_weight 0.3 and tell me whether the new value came first.
```

## Commands

### Command 1

Note: Install the single XERJ binary.

```sh
curl -fsSL https://xerj.org/get | sh
```

### Command 2

Note: Start a local node with the built-in MiniLM embedder.

```sh
xerj --embed-mode neural
```

### Command 3

Note: Hybrid recall that ranks newer memories higher.

```sh
curl -s -XPOST 'http://127.0.0.1:9200/_memory/project/_recall' -H 'content-type: application/json' -d '{"query":"API port in production","hybrid":true,"recency_weight":0.3,"k":5}'
```

*Figure: mcp-memory-service turns semantic dedup on by default, with a 0.85 similarity threshold and a 24 hour window (storage/mixins/base.py). In our run it rejected 4 of the 15 updated facts this way. XERJ skips near duplicates only when a write sets dedup to true, at 0.95.*

## Tested side by side

Same 85 memories, same 75 questions, same MiniLM model. Top 5 is the share of questions where the right memory came back in the first five.

| | mcp-memory-service 12.4.0 | XERJ v1.0.0-rc.100 |
| --- | --- | --- |
| Top 5, all questions | 89.3% | 94.7% semantic, 93.3% hybrid |
| Top 1, all questions | 64.0% | 65.3% semantic, 60.0% hybrid |
| Top 5, reworded questions | 84% | 84% |
| New value first, changed facts | 6.7% | 13.3%; 93.3% with recency weight |
| Updates rejected at write | 4 of 15 | 0 |
| Median write | 16.7 ms | 7.2 ms |
| Median query | 16.7 ms | 6.3 ms |
| LLM calls per write | 0 | 0 |
| What you install | 72 Python packages | One binary |
| Storage | SQLite with sqlite-vec, optional cloud sync | Index per namespace |
| License | Apache 2.0 | Apache 2.0 |

## Question by question

This starts on the changed facts. A check means the right memory was in the top 5.

*Figure: Runs in your browser and sends nothing. Each cell is the rank of the first returned memory that holds the answer, or miss if none of the top 5 does. "old first" means the old value of a changed fact ranked above the new one. From out/per_question.csv in benchmarks/agent-memory.*

## When to pick mcp-memory-service

- You want sync across machines through Cloudflare or another copy of the service.
- You want a dashboard, OAuth and scheduled consolidation included.
- You store lots of near duplicate notes and want them filtered for you.
- You are happy to run a Python service.

## When to pick XERJ

- Facts in your project change, and you want the new value kept and ranked first.
- You want one binary with no Python environment.
- You want memory in the same engine as your logs, docs and code search.
- You want BM25, semantic and hybrid recall from one API.

## Limits on the XERJ side

- mcp-memory-service beat XERJ hybrid on the first result, 64.0% vs 60.0%.
- XERJ is single-node, with no built-in cloud sync or replication.
- The recency weight that ranks new values first lowers overall recall, so use it for facts that change.

See the full [AI agent memory benchmark](/compare/ai-agent-memory-benchmark) for all seven projects.

## Try it with XERJ

Use the Copy the prompt button and paste it into your coding agent. It stores a fact, changes it and checks whether XERJ returns the new value first.

## Sources checked

All checked on 2026-10-31.

- mcp-memory-service: README and src/mcp_memory_service/storage/mixins/base.py in [doobidoo/mcp-memory-service](https://github.com/doobidoo/mcp-memory-service), commit 0071ab2a, PyPI release 12.4.0. License Apache 2.0 from the GitHub API.
- Test runs and per question results: [benchmarks/agent-memory](https://github.com/xerj-org/xerj/tree/main/benchmarks/agent-memory).

## FAQ

### What is mcp-memory-service?

An Apache 2.0 memory backend for AI agents with a REST API, MCP, a CLI and a dashboard. It stores memories in SQLite with local ONNX embeddings by default, and can sync to Cloudflare or another instance.

### Which one recalled more in your test?

On top 5, XERJ semantic found 94.7% and mcp-memory-service 89.3%. On the first result, XERJ semantic was 65.3% and mcp-memory-service 64.0%. Both found 84% of reworded questions.

### Why did mcp-memory-service miss changed facts?

Its semantic dedup rejected 4 of our 15 updates, such as a new API port, because they were too close to the old note. Only the old value could come back. You can turn dedup off or pass a conversation_id to skip it.

### Which one is faster?

XERJ semantic queries took 6.3 ms median and writes 7.2 ms. mcp-memory-service took 16.7 ms for both. It ran in process and XERJ over HTTP.

### Do I need Python for mcp-memory-service?

Yes. It is a Python package. With the SQLite extra it resolved to 72 packages on Python 3.12. XERJ is one binary.

## Evidence

- Top 5: mcp-memory-service 89.3%, XERJ semantic 94.7%, XERJ hybrid 93.3%. Top 1: mcp-memory-service 64.0%, XERJ semantic 65.3%, XERJ hybrid 60.0%. Reworded top 5: both 84%. New value first: mcp-memory-service 6.7%, XERJ 13.3%, XERJ with recency weight 93.3%. — `benchmarks/agent-memory/out/summary.csv`

## Related

- [AI agent memory compared: real tests on 7 open-source projects](/compare/ai-agent-memory-benchmark)
- [XERJ vs agentmemory: which memory for your coding agent?](/compare/xerj-vs-agentmemory)
- [claude-mem vs MemPalace vs XERJ: which memory should Claude Code use?](/compare/xerj-vs-claude-mem-and-mempalace)
- [XERJ vs memvid: one memory file or one local server?](/compare/xerj-vs-memvid)
- [What is an MCP memory server?](/answers/what-is-an-mcp-memory-server)
- [What is hybrid search?](/answers/what-is-hybrid-search)
- [XERJ vs ReMe (Alibaba Tongyi Lab): a tested comparison](/compare/xerj-vs-reme) (same intent: agent memory)
- [XERJ vs Mem0: which memory fits your AI agent?](/compare/xerj-vs-mem0) (same intent: agent memory)
- [What's a simple way to give an agent long-term memory on my laptop without Qdrant?](/answers/agent-memory-without-postgres-qdrant) (same intent: agent memory)
