trackmcp
Back to directory
nikitacometa

mnemon-memory-mcp

View on GitHub

Persistent layered memory MCP server for AI agents — SQLite + FTS5 + vector hybrid search (RRF), multilingual, zero-cloud

3 stars TypeScriptOthers Updated Jul 17, 2026
ai-agentsclaudeembeddingsfts5hybrid-searchllmlocal-firstmcpmemorymodel-context-protocolragsemantic-searchsqlitetypescriptvector-search

Documentation

mnemon-mcp

CI
npm version
Node.js
License: MIT

Persistent layered memory for AI agents.

Local-first. Zero-cloud. Single SQLite file.

Landing Page · npm · GitHub

Your AI agent forgets everything after each session. Mnemon fixes that.

It gives any MCP-compatible client — OpenClaw, Claude Code, Cursor, Windsurf, or your own — a structured long-term memory backed by a single SQLite database on your machine. No API keys, no cloud, no telemetry. Just `npm install` and your agent remembers.


Why Layered Memory?

Flat key-value stores treat "what happened yesterday" the same as "never commit without tests." That's wrong — different kinds of knowledge have different lifetimes and access patterns.

Mnemon organizes memories into four layers:

LayerWhat it storesHow it's accessedLifetime
EpisodicEvents, sessions, journal entriesBy date or periodDecays (30-day half-life)
SemanticFacts, preferences, relationshipsBy topic or entityStable
ProceduralRules, workflows, conventionsLoaded at startupRarely changes
ResourceReference material, book notesOn demandDecays slowly (90 days)

A journal entry from last Tuesday and a coding rule that never changes live in different layers — because they should.

Retrieval Quality

Retrieval is measured against a 50-case golden set on a real 797-memory

bilingual (RU/EN) corpus, through the actual MCP server — not a

reimplementation. Current numbers (methodology & history):

MetricFTS-onlyVector-onlyHybrid (RRF)
Composite score88.989.291.7
Recall@50.9070.8980.919
MRR0.8170.8320.878
nDCG@50.8160.8280.869
Negative precision1.0001.0001.000

Hybrid beats both legs individually, which is the whole argument for

fusing them: lexical search has the better raw recall, vector search the

better ranking, and RRF keeps both instead of averaging them away.

The eval doc tracks the failures too — score drift under corpus growth, the

BM25 field-weight bug the eval caught, the two cases where fusion still loses

to pure lexical search, and what the golden set does *not* cover. Numbers you

can't audit are marketing; read how these are produced.

Architecture

mermaid
flowchart LR
    C["MCP clientClaude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
    T --> R["retrieval pipelineFTS5 · vector · RRF fusion"]
    T --> M["memories + supersede chains"]
    I["KB import pipelinemarkdown → memories"] --> M
    M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
    R --> F
    R --> V["sqlite-vec (optional, BYOK)"]

One SQLite file holds memories, the FTS5 index, and the optional vector

index. Writes go through transactions that keep the supersede-chain invariant;

reads run the staged retrieval pipeline described under Search.

The full picture — module boundaries, write/read paths, invariants, and known

limitations — is in docs/ARCHITECTURE.md. Design

decisions are recorded as ADRs: SQLite+FTS5 core,

hybrid RRF retrieval,

synchronous driver,

layered memory model.

Quick Start

Install

bash
npm install -g mnemon-mcp

Or from source:

bash
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run build

Configure Your MCP Client

OpenClaw

bash
openclaw mcp register mnemon-mcp --command="mnemon-mcp"

Or add to `~/.openclaw/mcp_config.json`:

json
{
  "mnemon-mcp": {
    "command": "mnemon-mcp"
  }
}

Claude Code

Add to `~/.claude/mcp.json`:

json
{
  "mcpServers": {
    "mnemon-mcp": {
      "command": "mnemon-mcp"
    }
  }
}

Cursor / Windsurf / Other MCP clients

Add to your client's MCP config:

json
{
  "mcpServers": {
    "mnemon-mcp": {
      "command": "mnemon-mcp"
    }
  }
}

Running from source?

Use the full path to the compiled entry point:

json
{
  "mnemon-mcp": {
    "command": "node",
    "args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
  }
}

Verify

bash
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcp

You should see 10 tools in the response. The database (`~/.mnemon-mcp/memory.db`) is created automatically on first run.

That's it. Your agent now has persistent memory.

What It Can Do

10 MCP Tools

ToolWhat it does
`memory_add`Store a memory with layer, entity, confidence, importance, and optional TTL
`memory_search`Full-text or exact search with filters by layer, entity, date, scope, confidence
`memory_update`Update in-place or create a versioned replacement (superseding chain)
`memory_delete`Delete a memory; re-activates its predecessor if any
`memory_inspect`Get layer statistics or trace a single memory's version history
`memory_export`Export to JSON, Markdown, or Claude-md format with filters
`memory_health`Run diagnostics: expired entries, orphaned chains, stale memories; optionally GC
`memory_session_start`Start an agent session — returns session ID for grouping memories
`memory_session_end`End a session with optional summary; returns duration and memory count
`memory_session_list`List sessions with filters by client, project, or active status

MCP Resources & Prompts

Resources — live data your agent can read:

URIReturns
`memory://stats`Aggregate stats per layer
`memory://recent`Memories created/updated in last 24h
`memory://layer/{layer}`All active memories in a layer
`memory://entity/{name}`All active memories about an entity

Prompts — pre-built workflows:

PromptPurpose
`recall`"Tell me everything you know about X"
`context-load`Load relevant context before starting a task
`journal`Create a structured journal entry

Four modes, all supporting layer / entity / scope / date / confidence filters:

FTS mode (default without embeddings) — tokenized full-text search with BM25 ranking. Multi-word queries use AND; if too few results, OR supplements with a score penalty. Progressive AND relaxation tries top-3 most specific terms before falling back to full OR.

Hybrid mode (default when embeddings configured) — combines FTS5 + vector search via Reciprocal Rank Fusion. Detects quoted entities in queries (e.g., `'Essentialism'`) and runs weighted sub-queries for cross-reference retrieval.

Vector mode — pure cosine similarity search over embeddings.

Exact mode — `LIKE` substring match for precise phrase lookups.

Scores: `bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency`

Recency boost: `1 / (1 + daysSince / 365)` — gently rewards recently created memories without penalizing old ones.

Stemming

Snowball stemmer applied at both index time and query time for English and Russian. This means `"running"` matches `"runs"`, and `"книги"` matches `"книга"`. Stop words are filtered from queries to improve precision.

Fact Versioning

Knowledge evolves. Mnemon doesn't delete old facts — it chains them:

code
v1: "Team uses React 17"  →  superseded_by: v2
v2: "Team uses React 19"  →  supersedes: v1 (active)

Search returns only the latest version. `memory_inspect` with `include_history: true` reveals the full chain. `memory_delete` re-activates the predecessor — nothing is lost.

Vector Search (Optional, BYOK)

Enable semantic similarity search by providing your own embedding API:

bash
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp

# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcp

This unlocks two additional search modes:

  • `mode: "vector"` — pure cosine similarity search
  • `mode: "hybrid"` — FTS5 + vector combined via Reciprocal Rank Fusion

Requires `sqlite-vec` (installed as optional dependency). New memories are embedded on add; existing ones can be backfilled.

Embedding configuration

VariableDefaultDescription
`MNEMON_EMBEDDING_PROVIDER``openai` or `ollama` (unset = disabled)
`MNEMON_EMBEDDING_API_KEY`API key (required for OpenAI)
`MNEMON_EMBEDDING_MODEL``text-embedding-3-small` / `nomic-embed-text`Model name
`MNEMON_EMBEDDING_DIMENSIONS``1024` / `768`Vector dimensions
`MNEMON_OLLAMA_URL``http://localhost:11434`Ollama endpoint

Importing a Knowledge Base

Got a folder of Markdown files? Import them in bulk:

bash
cp config.example.json ~/.mnemon-mcp/config.json   # edit this first
npm run import:kb -- --kb-path /path/to/your/kb     # incremental (skips unchanged files)

The config maps glob patterns to memory layers:

json
{
  "owner_name": "your-name",
  "extra_stop_words": [],
  "mappings": [
    {
      "glob": "journal/*.md",
      "layer": "episodic",
      "entity_type": "user",
      "entity_name": "$owner",
      "importance": 0.6,
      "split": "h2"
    },
    {
      "glob": "people/*.md",
      "layer": "semantic",
      "entity_type": "person",
      "entity_name": "from-heading",
      "importance": 0.8,
      "split": "h3"
    }
  ]
}

Config Fields

FieldTypeDescription
`owner_name`stringYour name — used for `$owner` substitution in `entity_name`
`extra_stop_words`string[]Words to filter from FTS queries (e.g., your name forms)
`glob`stringFile pattern to match
`layer`stringTarget memory layer
`entity_type`string`user` / `person` / `project` / `concept` / `file` / `rule` / `tool`
`entity_name`stringLiteral name, `"$owner"`, or `"from-heading"` (extract from H2/H3)
`split`string`"whole"` (one memory per file), `"h2"`, or `"h3"` (split on headings)
`importance`number0.0–1.0, affects search ranking
`confidence`number0.0–1.0, filterable in search
`scope`stringOptional namespace

HTTP Transport

For remote or multi-client setups:

bash
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http
EndpointDescription
`POST /mcp`MCP JSON-RPC (Bearer auth if token set)
`GET /health``{"status":"ok","version":"..."}`

Binds to `127.0.0.1` by default. Binding to any other host requires `MNEMON_AUTH_TOKEN` — the server refuses to expose the memory store to the network unauthenticated (override with `MNEMON_ALLOW_INSECURE_HTTP=1` on a trusted network). Rate limiting (100 req/min/IP by default), opt-in CORS, 1MB body limit, timing-safe auth, graceful shutdown on SIGTERM.

Configuration Reference

VariableDefaultDescription
`MNEMON_DB_PATH``~/.mnemon-mcp/memory.db`Database path
`MNEMON_KB_PATH``.`Knowledge base root for import
`MNEMON_CONFIG_PATH``~/.mnemon-mcp/config.json`Import config path
`MNEMON_AUTH_TOKEN`Bearer token for HTTP transport
`MNEMON_HOST``127.0.0.1`HTTP transport bind address
`MNEMON_PORT``3000`HTTP transport port
`MNEMON_CORS_ORIGIN`CORS `Access-Control-Allow-Origin` (no CORS headers unless set)
`MNEMON_RATE_LIMIT``100`Max requests per minute per IP (0 = off)

Tool Reference

memory_add — full parameter list

ParameterTypeRequiredDescription
`content`stringYesMemory text (max 100K chars)
`layer`stringYes`episodic` / `semantic` / `procedural` / `resource`
`title`stringNoShort title (max 500 chars)
`entity_type`stringNo`user` / `project` / `person` / `concept` / `file` / `rule` / `tool`
`entity_name`stringNoEntity name for filtering
`confidence`numberNo0.0–1.0 (default 0.8)
`importance`numberNo0.0–1.0 (default 0.5)
`scope`stringNoNamespace (default `global`)
`source_file`stringNoSource file path — triggers auto-supersede of matching entries
`ttl_days`numberNoAuto-expire after N days
`valid_from` / `valid_until`stringNoTemporal fact window (ISO 8601)

memory_search — full parameter list

ParameterTypeRequiredDescription
`query`stringYesSearch text
`mode`stringNo`fts` (default), `exact`, `vector`, `hybrid`
`layers`string[]NoFilter by layers
`entity_name`stringNoFilter by entity (supports aliases)
`scope`stringNoFilter by scope
`date_from` / `date_to`stringNoDate range (ISO 8601)
`as_of`stringNoTemporal fact filter — facts valid at this date
`min_confidence`numberNoMinimum confidence
`min_importance`numberNoMinimum importance
`limit`numberNoMax results (default 10, max 100)
`offset`numberNoPagination offset

memory_update — full parameter list

ParameterTypeRequiredDescription
`id`stringYesMemory ID
`content`stringNoNew content
`title`stringNoNew title
`confidence`numberNoNew confidence
`importance`numberNoNew importance
`supersede`booleanNo`true` = versioned replacement; `false` (default) = in-place
`new_content`stringNoContent for superseding entry

memory_delete

ParameterTypeRequiredDescription
`id`stringYesMemory ID. Re-activates predecessor if part of a superseding chain

memory_inspect

ParameterTypeRequiredDescription
`id`stringNoMemory ID (omit for aggregate stats)
`layer`stringNoFilter stats by layer
`entity_name`stringNoFilter stats by entity
`include_history`booleanNoShow superseding chain

memory_export

ParameterTypeRequiredDescription
`format`stringYes`json` / `markdown` / `claude-md`
`layers`string[]NoFilter by layers
`scope`stringNoFilter by scope
`date_from` / `date_to`stringNoDate range
`limit`numberNoMax entries (default all, max 10K)

memory_health

ParameterTypeRequiredDescription
`cleanup`booleanNo`true` = garbage-collect expired entries (default: report only)

Returns: status (`healthy` / `warning` / `degraded`), per-layer stats, expired entries, orphaned chains, stale/low-confidence counts, cleaned count when `cleanup=true`.

memory_session_start

ParameterTypeRequiredDescription
`client`stringYesClient identifier (e.g. `claude-code`, `cursor`, `api`)
`project`stringNoProject scope for this session
`meta`objectNoAdditional session metadata

Returns: `id` (session UUID), `started_at` (ISO 8601).

memory_session_end

ParameterTypeRequiredDescription
`id`stringYesSession ID to end
`summary`stringNoSummary of what was accomplished (max 10K chars)

Returns: `id`, `ended_at`, `duration_minutes`, `memories_count`.

memory_session_list

ParameterTypeRequiredDescription
`limit`numberNoMax sessions (default 20, max 100)
`client`stringNoFilter by client
`project`stringNoFilter by project
`active_only`booleanNoOnly return sessions that haven't ended (default false)

Returns: array of sessions with `id`, `client`, `project`, `started_at`, `ended_at`, `summary`, `memories_count`.

How It Compares

mnemon-mcpmem0basic-memoryEngramAnthropic KG
ArchitectureSQLite FTS5 + vectorCloud API + QdrantMarkdown + vectorSQLite FTS5JSON file
Memory structure4 typed layersFlatFlatFlat + sessionsGraph
SearchFTS5 + hybrid RRFSemanticHybridFTS5Exact
Fact versioningSuperseding chainsPartialNoNoNo
StemmingEN + RU (Snowball)EN onlyEN onlyNoneNone
EmbeddingsBYOK (OpenAI / Ollama)Built-inFastEmbedNoneNone
Dependencies0 requiredQdrant, Neo4jPython 3.12Go binaryNone
Cloud requiredNoYesNoNoNo
CostFree$19–249/moFreeFreeFree
Setup`npm install -g`Docker + API keyspip + depsGo installBuilt-in
LicenseMITApache 2.0AGPLMITMIT

Extended competitive analysis with sources: docs/COMPETITORS.md.

Development

bash
npm run dev        # run via tsx (no build step)
npm run build      # TypeScript → dist/
npm run lint       # eslint (flat config)
npm test           # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench      # performance benchmarks
npm run db:backup  # backup database

CI runs build + lint + tests on Node 20 and 22, then smoke-tests the compiled

server over real JSON-RPC (`tools/list` must match the exact tool set).

Stack: TypeScript 5.9 (strict mode), better-sqlite3, @modelcontextprotocol/sdk, Snowball stemmer, Zod, vitest.

See CONTRIBUTING.md for code guidelines.

Design Principles

  • Air-gapped by default — zero telemetry, ever. Out of the box nothing leaves the machine; the only component that talks to the network is the optional embedder, and only to the provider you configure (including a local Ollama).
  • Single file — one SQLite database, zero ops, instant backup via file copy.
  • Deterministic search — FTS5, not embeddings, is the default. Interpretable, reproducible, no GPU needed.
  • Structured over flat — layers encode access patterns; superseding chains encode time.
  • Minimal — 4 production dependencies. Works everywhere Node runs.
  • Measured, not asserted — retrieval changes are judged against a golden set, regressions included.

License

MIT

Frequently asked questions

What is mnemon-memory-mcp?

mnemon-memory-mcp is Persistent layered memory MCP server for AI agents — SQLite + FTS5 + vector hybrid search (RRF), multilingual, zero-cloud

How do I install mnemon-memory-mcp?

Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

Is mnemon-memory-mcp open source?

Yes — it is hosted on GitHub at https://github.com/nikitacometa/mnemon-memory-mcp and has 3 stars.

Related MCP tools

Run your own MCP server? See who uses it and what to fix.

Measure it with TrackMCP