mnemon-mcp
mnemon-mcp
Persistentes, geschichtetes Gedächtnis für KI-Agenten. Lokal zuerst. Keine Cloud. Eine einzige SQLite-Datei.
Landingpage · npm · GitHub
Dein KI-Agent vergisst nach jeder Sitzung alles. Mnemon behebt das.
Es gibt jedem MCP-kompatiblen Client – OpenClaw, Claude Code, Cursor, Windsurf oder deinem eigenen – ein strukturiertes Langzeitgedächtnis, das in einer einzigen SQLite-Datenbank auf deinem Rechner liegt. Keine API-Schlüssel, keine Cloud, keine Telemetrie. Einfach npm install und dein Agent erinnert sich.
Warum ein geschichtetes Gedächtnis?
Flache Key-Value-Stores behandeln „was gestern passiert ist“ genauso wie „committe niemals ohne Tests“. Das ist falsch – verschiedene Arten von Wissen haben unterschiedliche Lebensdauern und Zugriffsmuster.
Mnemon organisiert Erinnerungen in vier Ebenen:
Ebene | Was gepeichert wird | Zugriff | Lebensdauer |
Episodisch | Ereignisse, Sitzungen, Journalbucheinträge | Nach Datum oder Zeitraum | Verfällt (30-Tage-Halbwertszeit) |
Semantisch | Fakten, Präferenzen, Beziehungen | Nach Thema oder Entität | Stabil |
Prozedural | Regeln, Arbeitsabläufe, Konventionen | Beim Start geladen | Ändert sich selten |
Ressource | Referenzmaterial, Buchnotizen | Auf Abruf | Verfällt langsam (90 Tage) |
Ein Journalbucheintrag von letztem Dienstag und eine Regel, die sich nie ändert, leben in verschiedenen Ebenen – weil sie das sollten.
Related MCP server: persistent-kb-mcp
Retrieval-Qualität
Das Retrieval wird gegen einen Golden-Set mit 50 Fällen auf einem echten, zweisprachigen (RU/EN) Korpus mit 797 Erinnerungen gemessen – über den echten MCP-Server, nicht über eine Neuimplementierung. Aktuelle Zahlen (Methodik & Verlauf):
Metrik | FTS-only | Vector-only | Hybrid (RRF) |
Composite-Score | 88.9 | 89.2 | 91.7 |
Recall@5 | 0.907 | 0.898 | 0.919 |
MRR | 0.817 | 0.832 | 0.878 |
nDCG@5 | 0.816 | 0.828 | 0.869 |
Negative precision | 1.000 | 1.000 | 1.000 |
Hybrid schlägt beide Einzelansätze – genau das ist das Argument für die Fusion: Die lexikalische Suche hat den besseren Ro-Recall, die Vektorsuche das besere Ranking, und RRF erhält beide, statt sie durch Mittelung zu verlieren.
Das Auswertungsdokument zeigt auch die Fehlstellen auf – Score-Abdrift bei wachsendem Korpus, den von der Auswertung aufgespürten BM25-Feld-Gewichtungs-Bug, die zwei Fälle, in denen Fusion weiterhin gegenüber reiner lexikalischer Suche verliert, und das, was der Golden-Set nicht abdecket. Zahlen, die du nicht prüfen kannst, sind Marketing; lies, wie sie erzeugt werden.
Architektur
flowchart LR
C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
T --> M["memories + supersede chains"]
I["KB import pipeline<br/>markdown → memories"] --> M
M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
R --> F
R --> V["sqlite-vec (optional, BYOK)"]Eine SQLite-Datei enthält Erinnerungen, den FTS5-Index und den optionalen Vektorindex. Schreibzugriffe laufen über Transaktionen durch die Invariante der Ersetzungskette gewahrt wird; Lesezugriffe nutzen die gestufte Retrieval-Pipeline, die unter Suche beschrieben ist.
Das vollständige Bild – Modülgrenzen, Schreib-/Lesenspfade, Invarianten und bekannte Einschränkungen – findest du in docs/ARCHITECTURE.md. Design-Entscheidungen sind als ADRs dokumentiert: SQLite+FTS-Kern, hybrides RRF-Retrieval, synchrone Treiber, Layer-Speichermodell.
Schnellstart
Installation
npm install -g mnemon-mcpOder aus dem Quellcode:
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run buildMCP-Client konfigurieren
openclaw mcp register mnemon-mcp --command="mnemon-mcp"Oder füge ~/.openclaw/mcp_config.json hinzu:
{
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}Füge ~/.claude/mcp.json hinzu:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}Füge es zur MCP-Konfiguration deines Clients hinzu:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}Verwende den vollständigen Pfad zum kompilierten Einstiegspunkt:
{
"mnemon-mcp": {
"command": "node",
"args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
}
}Verifizierung
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcpDu solltest 10 Tools in der Antwort sehen. Die Datenbank (~/.mnemon-mcp/memory.db) wird beim ersten Lauf automatisch erzeugt.
Das war es. Dein Agent hat jetzt ein persistentes Gedächtnis.
Was es kann
10 MCP-Tools
Werkzeug | Funktionalität |
| Speichert eine Erinnerung mit Ebene, Entität, Konfidenz, Immerg und optionalem TTL |
| Volltextsuche oder exakte Suche mit Filtern nach Ebene, Entität, Datum, Scope, Konfidenz |
| In-Place-Update oder erstellt einen versionierten Ersatz (Ersetzungskette) |
| Löscht eine Erinnerung; reaktiviert ggf. den Vorgänger |
| Ebene-Statistiken abrufen oder Versionsgeschichte einer Erinnerung verfolgen |
| Export nach JSON, Markdown oder Claude-Format mit Filtern |
| Diagnosen: abgelaufene Einträge, verwaiste Ketten, ungeeignete Erinnerungen; optional GC |
| Startet eine Agentensitzung – gibt Sitzungs-ID zum Gruppieren von Erinnerungen zurück |
| Beendet eine Sitzung mit optionaler Zusammenfassung; das gibt Dauer und Anzahl zurück |
| Listet Sitzungen mit Filtern nach Client, Projekt oder aktive Status |
MCP-Ressourcen und Prompts
Ressourcen – Live-Daten, die dein Agent lesen kann:
URI | Rückgabezahl |
| Aggregierte Statistiken pro Ebene |
| Erinnerungen, die in den letzten 24h erstellt/aktualisiert wurden |
| Alle aktiven Erinnerungen in einer Ebene |
| Alle aktiven Erinnerungen zu einer Entität |
Prompts – vorgefertigte Arbeitsabläufe:
Prompt | Zweck |
| „Erzähl mir alles, was du über X weißt“ |
| Relevnten Kontext laden, bevor du eine Aufgabe beginnst |
| Einen strukturierten Tagebucheintrag erstellen |
Suche
Vier Modi, alle unterstützen Filter nach Ebene / Entität / Scope / Datum / Konfidenz:
FTS-Modus (Standard ohne Embeddings) filter? — tokenisierte Volltextsuche mit BM25-Ranking. Mehrwort-Abfragen verwenden UND; bei zu wenigen Ergebnissen wird ODER mit Punktabzug ergänzusammenhält. Die progressive UND-Aufflockung probiert die drei spezifischsten Begriffe, bevor sie auf komplettes ODER fällt.
Hybrid-Modus (Standard bei Embedding-Konfiguration) – kombiniert FTS5 + Vektorbas via Reciprocal Rank Fusion. Er erkennt quoted Ausdrücke (z. B. 'Essentialism') und führt gewichtige Unterabfragen für die Kreuzreferenzsuche durch.
Vektor-Modus – reine Kosinus-Ähnlichkeitssuche bei Übernahmen.
Exakter Modus – LIKE-Substring-Match für präzise wörtliche Suche.
Scores: bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency
Recency-Boot: 1 / (1 + daysSince / 365) – bemillt kürzlich erstellte Erinnerungen leicht, ohne ältere zu abzustrafen.
Stemming
Snowball-Stemmer wird sowohl bei der Indexierung als auch bei der Abfrage für Englisch und Deutsch angewendet. So matcht z. B. "running" auch "runs" und "книги" auch "книга". Stoppwörter werden beim Abfragenfilter verbessert, um die Präzision zu erhöhen.
Faktenversionierung
Wissen entwickelt sich. Mnemon löscht alte Fakten nicht, sondern verkettet sie:
v1: "Team uses React 17" → superseded_by: v2
v2: "Team uses React 19" → supersedes: v1 (active)Die Suche gibt nur die neueste Version zurück. memory_inspect mit include_history: true zeigt die volle Kette. memory_delete reaktiviert den Vorgänger – nichts ist verloren.
Vektorsuche (optional, BYOK)
Aktiviere semantische Ähnlichkeits suche über deine eigene Embedding-API:
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp
# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcpDas schaft zwei zusätzlich Recherche-Modi frei:
mode: "vector"– reine Kosinus-Ähnlichkeitssuchemode: "hybrid"– FTS5 + Vektor über Reciprocal Rank Fusion kombiniert
Erfordert sqlite-vec (wird als optionale Abhängigkeit installiert). Neue Erinnerungen werden beim Hinzufügen in Embedding übersetzt; bestehende können nachgerüstet werden.
Variable | Standardwerte | Beschreibung |
| — |
|
| — | API-Schlüssel (für OpenAI erforderlich) |
|
| Modellname |
|
| Vektor-Dimensionen |
|
| IOllama-Endpunkt |
Importieren einer Wissensdatenbank
Hast du einen Ordner mit Markdown-Dateien? Importiere sie gebündelt:
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)Die Konfiguration weist Glob-Muster den Speicher-eben zu:
{
"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"
}
]
}Konfigurationsfelder
Feld | Typ | Beschreibung |
| string | Dein Name – für |
| string [] | Wörter, die aus FTS-Abfragen herausgefilteretzt werden (z. B. Formen deines Namens) |
| string | Dateimuster, das gematcht wird |
| string | Zielebene der Speicherung |
| string |
|
| string | Literaler Name, |
| string |
|
| number | 0.0–1.0, beeinflusst das Suchranking |
| number | 0.0–1.0, in der Suche filterbar |
| string | Optionaler Namespace |
HTTP-Transport
Für Remote- oder Multi-Client-Setups:
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:httpEndpoint | Beschreibung |
| MCP JSON-RPC (Bearer-Auth, wenn Token gesetzt) |
|
|
Bindet standardmäßig an 127.0.0.1. Für die Bindung an einen anderen Host ist MNEMON_AUTH_TOKEN erforderlich — der Server weigert sich, den Speicher ohne Authentifizierung im Netzwerk verfügbar zu machen (mit MNEMON_ALLOW_INSECURE_HTTP=1 in einem vertrauenswürdigen Netzwerk überschreibbar). Ratenbegrenzung (standardmäßig 100 Anfragen/min/IP), optionales CORS, Body-Limit von 1 MB, timing-sichere Authentifizierung, sauberes Herunterfahren bei SIGTERM.
Konfigurationsreferenz
Variable | Standard | Beschreibung |
|
| Datenbankpfad |
|
| Wurzelverzeichnis der Wissensdatenbank für den Import |
|
| Pfad zur Importkonfiguration |
| — | Bearer-Token für den HTTP-Transport |
|
| Bindungsadresse für den HTTP-Transport |
|
| Port für den HTTP-Transport |
| — | CORS |
|
| Maximale Anfragen pro Minute und IP (0 = aus) |
Tool-Referenz
Parameter | Type | Required | Description |
| string | Ja | Speichertext (max. 100K Zeichen) |
| string | Ja |
|
| string | Nein | Kurzer Titel (max. 500 Zeichen) |
| string | Nein |
|
| string | Nein | Entitätsname zum Filtern |
| number | Nein | 0.0–1.0 (Standard: 0.8) |
| number | Nein | 0.0–1.0 (Standard: 0.5) |
| string | Nein | Namespace (Standard: |
| string | Nein | Pfad der Quelldatei — löst automatisches Ersetzen (Supersede) übereinstimmender Einträge aus |
| number | Nein | Nach N Tagen automatisch ablaufen lassen |
| string | Nein | Zeitfenster für Fakten (ISO 8601) |
Parameter | Type | Required | Description |
| string | Ja | Suchtext |
| string | Nein |
|
| string[] | Nein | Nach Ebenen filtern |
| string | Nein | Nach Entität filtern (unterstützt Aliase) |
| string | Nein | Nach Namespace filtern |
| string | Nein | Datumsbereich (ISO 8601) |
| string | Nein | Temporaler Faktenfilter — Fakten, die zu diesem Datum gültig sind |
| number | Nein | Mindestkonfidenz |
| number | Nein | Mindestwichtigkeit |
| number | Nein | Maximale Ergebnisse (Standard: 10, max. 100) |
| number | Nein | Offset für die Paginierung |
Parameter | Type | Required | Description |
| string | Ja | Speicher-ID |
| string | Nein | Neuer Inhalt |
| string | Nein | Neuer Titel |
| number | Nein | Neue Konfidenz |
| number | Nein | Neue Wichtigkeit |
| boolean | Nein |
|
| string | Nein | Inhalt für den ersetzenden Eintrag |
Parameter | Type | Required | Description |
| string | Ja | Speicher-ID. Reaktiviert den Vorgängereintrag, wenn der Eintrag Teil einer Ersetzungskette ist |
Parameter | Type | Required | Description |
| string | Nein | Speicher-ID (für aggregierte Statistiken weglassen) |
| string | Nein | Statistiken nach Ebene filtern |
| string | Nein | Statistiken nach Entität filtern |
| boolean | Nein | Ersetzungskette anzeigen |
Parameter | Type | Required | Description |
| string | Ja |
|
| string[] | Nein | Nach Ebenen filtern |
| string | Nein | Nach Namespace filtern |
| string | Nein | Datumsbereich |
| number | Nein | Maximale Einträge (Standard: alle, max. 10K) |
Parameter | Type | Required | Description |
| boolean | Nein |
|
Gibt zurück: Status (healthy / warning / degraded), Statistiken pro Ebene, abgelaufene Einträge, verwaiste Ketten, Anzahl veralteter Einträge bzw. Einträge mit niedriger Konfidenz, Anzahl bereinigter Einträge bei cleanup=true.
Parameter | Type | Required | Description |
| string | Ja | Client-Kennung (z. B. |
| string | Nein | Projektbereich für diese Sitzung |
| object | Nein | Zusätzliche Sitzungsmetadaten |
Gibt zurück: id (Sitzungs-UUID), started_at (ISO 8601).
Parameter | Type | Required | Description |
| string | Ja | ID der zu beendenden Sitzung |
| string | Nein | Zusammenfassung dessen, was erreicht wurde (max. 10K Zeichen) |
Gibt zurück: id, ended_at, duration_minutes, memories_count.
Parameter | Type | Required | Description |
| number | Nein | Maximale Sitzungen (Standard: 20, max. 100) |
| string | Nein | Nach Client filtern |
| string | Nein | Nach Projekt filtern |
| boolean | Nein | Nur nicht beendete Sitzungen zurückgeben (Standard: false) |
Gibt zurück: ein Array von Sitzungen mit id, client, project, started_at, ended_at, summary, memories_count.
So schneidet es im Vergleich ab
mnemon-mcp | mem0 | basic-memory | Engram | Anthropic KG | |
Architektur | SQLite FTS5 + Vektor | Cloud API + Qdrant | Markdown + Vektor | SQLite FTS5 | JSON-Datei |
Speicherstruktur | 4 typisierte Ebenen | Flach | Flach | Flach + Sitzungen | Graph |
Suche | FTS5 + hybrides RRF | Semantisch | Hybrid | FTS5 | Exakt |
Faktenversionierung | Ersetzungsketten | Teilweise | Nein | Nein | Nein |
Stemming | EN + RU (Snowball) | Nur EN | Nur EN | Keine | Keine |
Embeddings | BYOK (OpenAI / Ollama) | Integriert | FastEmbed | Keine | Keine |
Abhängigkeiten | Keine erforderlich | Qdrant, Neo4j | Python 3.12 | Go-Binary | Keine |
Cloud erforderlich | Nein | Ja | Nein | Nein | Nein |
Kosten | Kostenlos | $19–249/mo | Kostenlos | Kostenlos | Kostenlos |
Einrichtung |
| Docker + API-Schlüssel | pip + Abhängigkeiten | Go install | Integriert |
Lizenz | MIT | Apache 2.0 | AGPL | MIT | MIT |
Erweiterte Wettbewerbsanalyse mit Quellen: docs/COMPETITORS.md.
Entwicklung
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 databaseCI führt Build, Lint und Tests unter Node 20 und 22 aus; danach wird der kompilierte Server per Smoke-Test über echtes JSON-RPC getestet (tools/list muss exakt dem Tool-Set entsprechen).
Stack: TypeScript 5.9 (Strict-Modus), better-sqlite3, @modelcontextprotocol/sdk, Snowball-Stemmer, Zod, vitest.
Siehe CONTRIBUTING.md für Code-Richtlinien.
Design-Prinzipien
Standardmäßig air-gapped — keinerlei Telemetrie, jemals. Ab Werk verlässt nichts die Maschine; die einzige Komponente, die mit dem Netzwerk kommuniziert, ist der optionale Embedder, und nur mit dem von Ihnen konfigurierten Anbieter (einschließlich eines lokalen Ollama).
Einzelne Datei — eine SQLite-Datenbank, kein Betriebsaufwand, sofortige Sicherung per Dateikopie.
Deterministische Suche — FTS5, nicht Embeddings, ist die Standardeinstellung. Interpretierbar, reproduzierbar, keine GPU erforderlich.
Strukturiert statt flach — Ebenen kodieren Zugriffsmuster; Ablöseketten kodieren Zeit.
Minimal — 4 Produktionsabhängigkeiten. Funktioniert überall, wo Node läuft.
Gemessen, nicht behauptet — Retrieval-Änderungen werden anhand eines Golden Sets bewertet, Regressionen inklusive.
Lizenz
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.51Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server providing persistent, searchable knowledge base via SQLite, enabling AI agents to save and recall facts across sessions without cloud dependencies.MIT
- AlicenseNot gradedqualityDmaintenanceA local-first long-term memory system for AI coding agents, exposed as an MCP server.131MIT
- AlicenseAqualityCmaintenancePersistent memory MCP server for AI agents, using SQLite with hybrid keyword and semantic search for long-term memory storage.5Do What The F*ck You Want To Public
Related MCP Connectors
Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.
Cloud-hosted MCP server for durable AI memory
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nikitacometa/mnemon-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server