Skip to main content
Glama
Lyellr88

marm-memory

License Python FastAPI Docker Pulls PyPI Downloads PyPI Version MCP Registry

Discord Publish CodeQL marm-memory MCP server

Beiträge sind willkommen! Durchsuchen Sie offene Issues, um beizutragen, oder treten Sie dem MARM Discord bei, um Workflows auszutauschen, Hilfe bei der Einrichtung zu erhalten und sich mit anderen Entwicklern zu vernetzen.

Inhaltsverzeichnis

Related MCP server: Memory Crystal MCP Server

Schnellstart

  1. Installieren und initialisieren Sie mit Ihren bevorzugten Agenten-Profilen:

pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-gemini

Auch verfügbar: --g-qwen und --g-kiro. Führen Sie ohne Flags aus, um in Ihrem aktuellen Projektordner statt im Home-Verzeichnis zu installieren

  1. Übergeben Sie die Aufgabe an Ihren KI-Begleiter. Sagen Sie Ihrem Agenten:

„Verwende die Fähigkeit marm-init, um MARM einzurichten.“

  1. Interagieren: Ihr Agent übernimmt die gesamte Einrichtung (Python/Docker, HTTP/STDIO, Schlüssel und Client-Konfigurationen) interaktiv direkt in Ihrem Chat.

Manuelle Einrichtung

Bevorzugen Sie es, selbst einzurichten:

Ersetzen Sie „agent“ durch den CLI-Befehl Ihres Clients (z. B. claude, gemini oder qwen). Für Codex verwenden Sie stattdessen codex mcp add marm-memory --url http://localhost:8001/mcp.

Wenn Sie ...

Server starten

MCP-Client verbinden

Solo-Entwickler / Forscher

marm-memory start

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Privater lokaler STDIO-Benutzer

marm-mcp-stdio

"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio

Mehrere Agenten teilen sich Speicher

marm-memory start --profile swarm

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Privater Hochdurchsatz-Schwarm

marm-memory start --profile swarm-max

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Vertrauenswürdiges privates Labor/Server

marm-memory start --profile trusted

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

  • ⚡ Schnellster HTTP-Start: Führen Sie marm-memory fast-start-http aus, um die lokale Laufzeit zu starten, die Konsole zu öffnen und sie sofort im Browser zu öffnen.

  • 🖥️ Web-Konsole: Führen Sie marm-memory console aus, um die lokale UI-App sofort anzuzeigen (kein Node.js erforderlich).

  • ⚙️ Lebenszyklus-Management: Verwalten Sie den Hintergrund-Daemon mit status, logs --follow, restart und stop.

  • 💡 Schnell-Flags: Verwenden Sie --no-console oder --no-browser, um Starts einzuschränken. Führen Sie marm-memory --help für eine vollständige Befehlsliste aus.

Warum MARM Memory

Ihre KI vergisst alles. MARM Memory nicht.

marm-memory gibt Ihren Agenten einen privaten, gemeinsamen Speicher für den Kontext, der normalerweise zwischen Chats verloren geht: Entscheidungen, Recherchen, Fehlerbehebungen, Notizen und Projekthistorie. Wechseln Sie von Claude Code zu Codex oder Gemini, ohne den bereits gesammelten Kontext zu verlieren.

Es bringt drei Dinge zusammen:

  • 🧠 Kernspeicher (7 Tools) speichert Gespräche, Notizen, Notizbucheinträge und Zusammenfassungen, sodass sie durchsuchbar bleiben.

  • 💻 Code-Graph (5 Tools) kartiert Ihr Repository, sodass Agenten Symbole finden, Codepfade verfolgen und das Projekt verstehen können, ohne es erneut lesen zu müssen. Richten Sie es einmal auf ein Repository aus und es hält sich während Ihrer Arbeit selbst aktuell.

  • 🧩 Konzept-Graph (2 Tools) verbindet Personen, Entscheidungen, Fehler und Ideen aus Ihren gespeicherten Erinnerungen, mit Verweisen auf relevanten Code, falls verfügbar. Er baut sich selbst auf, während Sie Erinnerungen speichern.

Alle 14 Tools funktionieren über HTTP und STDIO. Ihre Agenten teilen sich denselben lokalen Speicher über Sitzungen hinweg, anstatt jedes Mal von vorne zu beginnen. Die integrierte Konsole ermöglicht es Ihnen, das Gespeicherte zu sehen und zu verwalten.

Wie es funktioniert

Ebene

Was sie tut

Warum es wichtig ist

Speichermodell

Sitzungen, strukturierte Protokolle, Notizbücher, Zusammenfassungen und semantische Erinnerungen

Hält die Projekthistorie durchsuchbar, anstatt in einem einzigen Chat gefangen zu sein

Skalierungsebene

SQLite-WAL-Modus, Verbindungspooling, serialisierte Schreibwarteschlange und HTTP-Ratenbegrenzungsvoreinstellungen

Ermöglicht einem Server, Solo-Nutzung, Multi-Agenten-Arbeit und Schwarm-artige Bursts zu unterstützen

Intelligenzebene

FTS-Filter, semantisches Neueranking, begrenzter semantischer Fallback, automatische Klassifizierung, Konsolidierung zum Schreibzeitpunkt und Kompaktierungskandidaten

Hält den Abruf nützlich, wenn der Speicher wächst, anstatt dass Duplikate sich anhäufen

Code-Graph-Ebene

Repository-Indexierung, Symbolsuche, Aufrufverfolgung, Architekturübersicht und Änderungsauswirkungsanalyse

Gibt Agenten Projektstruktur, ohne die gesamte Codebasis erneut lesen zu müssen

Konzept-Graph-Ebene

Entitäts- und Beziehungsextraktion aus gespeicherten Erinnerungen, mit Verweisen zurück in den Code-Graphen

Verbindet Entscheidungen, Fehler, Tools und Personen über Sitzungen hinweg, anstatt sie als flachen Text zu belassen

Token-Ebene

Leichtgewichtige 7-Tool-Kernoberfläche (14 insgesamt mit gebündelten Graph-Tools), semantisches Neueranking vor dem Abruf und Deduplizierung zum Schreibzeitpunkt

Reduziert die an das Modell gesendeten Token bei jedem Abruf und die Kosten bleiben vorhersehbar, wenn der Speicher skaliert

Bereitstellungsebene

Pip, Docker, STDIO, HTTP und verwaltete Profile swarm, swarm-max und trusted

Ermöglicht es Ihnen, privaten lokalen Speicher oder gemeinsamen Multi-Agenten-Speicher mit derselben MCP-Oberfläche zu betreiben

Siehe Leistungs- und Skalierungsbenchmarks für Abruflatenz, Parallelität und Schreibkostenzahlen sowie Architektur & Interna für die Mechanismen hinter jeder Ebene.

Runtime-CLI-Befehle

marm-memory ist der lokale Laufzeit-Manager, der mit dem Python-Paket installiert wird. Dies sind die normalen Betriebsbefehle; verwenden Sie marm-memory <befehl> --help für Flags und befehlsspezifische Beispiele.

Tägliche Runtime-Arbeit

marm-memory fast-start-http                # start HTTP, Console, and open the browser
marm-memory start                          # start or reuse the managed HTTP runtime
marm-memory start --profile swarm          # shared multi-agent preset
marm-memory stop                           # stop the managed runtime safely
marm-memory restart                        # restart the managed runtime
marm-memory status                         # inspect runtime, database, queue, and graph status
marm-memory logs --follow                  # follow bounded runtime logs
marm-memory console                        # start or reuse the bundled local Console

Transports und Einrichtung

marm-memory http                           # run HTTP in the foreground
marm-memory stdio                          # run the strict local MCP STDIO transport
marm-memory init                           # install the MARM skill into detected agents (project scan)
marm-memory init --g-claude                # install the skill into the home-folder claude directory
marm-memory doctor                         # diagnose the local install
marm-memory key init                       # create or reuse ~/.marm/.env without displaying the key
marm-memory key path                       # print the managed key-file path
marm-memory key reveal                     # explicitly display the managed key
marm-memory console --import-key           # open an authenticated local Console session
marm-memory upgrade --check                # compare the installed package with PyPI
marm-memory uninstall                      # preview package removal; always preserves ~/.marm

Wissen, Projekte und Wartung

marm-memory knowledge status               # Indexers, models, and how far behind automatic indexing is
marm-memory knowledge build --all          # Rebuild the whole concept graph (new memories index themselves)
marm-memory knowledge auto off             # Stop indexing memories automatically (on, off, status)
marm-memory projects list                  # List all tracked workspaces
marm-memory projects index <path>          # Add a repo to the code graph (kept current after that)
marm-memory projects status                # Inspect target repo graph readiness
marm-memory projects auto off              # Stop re-indexing repos automatically (on, off, status)
marm-memory maintenance status             # Check internal database optimization state
marm-memory maintenance embeddings migrate # Upgrade old 384-dim vectors to 512-dim
marm-memory maintenance chunks rechunk     # Recalibrate long memory text splits

Docker-Befehle sind unten separat dokumentiert, da sie explizite Daten-Mounts, Netzwerk-Exposition und Schlüssel-Handhabungsentscheidungen erfordern.

Leistungs- und Skalierungsbenchmarks

MARM ist zuerst auf schnellen Abruf optimiert, selbst wenn der Speicher wächst und lange Erinnerungen im Hintergrund in Blöcke aufgeteilt werden.

Diese Messungen verwenden den fastembed-gestützten Encoder jinaai/jina-embeddings-v2-small-en und eine lokale SQLite-Datenbank zum Wegwerfen. Jeder zeitlich gemessene Pfad ruft den ausgelieferten MARMMemory-Code auf, keine benchmark-lokale Neuimplementierung. Die Abschnitte 1-4 sind Zeitmessungen von einem einzelnen Durchlauf von scripts/benchmarking/performance/bench_hotpath.py auf lokaler Hardware; absolute Millisekunden variieren je nach Maschine, behandeln Sie daher die Skalierungsform als Signal. Abschnitt 5 ist ein separater Genauigkeits-Benchmark (run_eval.py) und berichtet zwei Durchläufe, aus dem dort angegebenen Grund.

1. Abruf-Latenz-Skalierung

Ende-zu-Ende-Latenz von recall_similar (beinhaltet Query-Kodierung).

Sitzungsgröße ($N$)

Minimale Latenz

Mittlere Latenz

p95-Latenz

N = 100

7,4 ms

7,9 ms

9,4 ms

N = 250

11,9 ms

13,5 ms

15,4 ms

N = 500

10,9 ms

11,8 ms

13,4 ms

N = 1.000

13,3 ms

13,5 ms

15,6 ms

N = 2.000

17,5 ms

18,2 ms

19,6 ms

N = 4.000

23,8 ms

25,9 ms

30,9 ms

Die Lauf-zu-Lauf-Varianz bei kleinem $N$ ist größer als der Abstand zwischen benachbarten Größen, weshalb hier N = 250 langsamer liest als N = 500. Behandeln Sie den Trend ab N = 1.000 aufwärts als das reale Signal.

2. Encoder + Parallelität

  • Kaltes Modell laden: 893ms

  • Warmer Encode: Median 3,8ms, p95 4,3ms

  • Gleichzeitiger Abruf: 10 gesammelte Abrufe wurden in 151,5ms abgeschlossen vs. 176,0ms seriell (gather/serial = 0,86). Interpretieren Sie das nicht als Parallelität: Wiederholte Durchläufe desselben Benchmarks landen irgendwo zwischen 0,63 und 0,86, daher ist das Verhältnis nicht stabil genug, um einen Geschwindigkeitsvorteil zu behaupten. Der Pfad ist standardmäßig um die gemeinsam genutzte Encoder- und SQLite-Arbeit serialisiert, und jeder scheinbare Gewinn ist Messrauschen.

3. Schreibzeit-Aufnahmekosten

  • Konsolidierung aus: Median 6,5ms, p95 7,6ms

  • Konsolidierung an: Median 58,1ms, p95 106,5ms

  • Kompromiss: Deduplizierung/Clustering zum Schreibzeitpunkt erhöht die medianen Kosten um das 9,0-fache, damit der Abruf schnell bleibt und der Speicher mit der Zeit sauberer bleibt. Die Konsolidierung ist standardmäßig deaktiviert.

4. Abruf-Skalierung: Vollständiger Scan vs. Produktions-Hybrid

Warum der Recall flach bleibt, während das Gedächtnis wächst: Statt jeden Vektor zu scannen, verwendet der Produktions-Recall einen FTS-Keyword-Pre-Filter, um den Kandidatenpool einzugrenzen, und bewertet dann neu mit einer gemischten semantischen + BM25 + zeitlichen Bewertung. Beide Benchmark-Spalten repräsentieren authentische asynchrone Codepfade, die mit vorberechneten Vektoren zeitlich gemessen wurden, um die Retrieval-Geschwindigkeit vom reinen Encoding-Overhead zu isolieren. Die Tests werden abwechselnd ausgeführt, um vollständig unvoreingenommene Cache-Bedingungen zu gewährleisten.

Sitzungsgröße ($N$)

Vollständiger semantischer Scan

Produktion Hybrid

Beschleunigung

FTS-Kandidaten

N = 100

3,3 ms

6,6 ms

0,5x

85 / 200

N = 500

16,3 ms

11,6 ms

1,4x

200 / 200

N = 1.000

31,1 ms

14,7 ms

2,1x

200 / 200

N = 2.000

63,5 ms

19,0 ms

3,3x

200 / 200

N = 4.000

127,2 ms

29,1 ms

4,4x

200 / 200

N = 10.000

316,7 ms

53,8 ms

5,9x

200 / 200

Der vollständige Scan wächst etwa linear mit $N$, während der hybride Recall weitaus langsamer wächst, sodass der Vorteil mit der Sitzungsgröße weiter zunimmt. Bei sehr kleinen $N$ ist der Pre-Filter seinen Overhead nicht wert, und der hybride ist langsamer.

5. LoCoMo Abrufgenauigkeit

Alle 10 LoCoMo-Unterhaltungen werden über marm_log_entry (5.882 Erinnerungen) aufgenommen, dann werden die Top-5-Ergebnisse von marm_smart_recall gegen 1.977 belegannotierte Fragen bewertet. Es wird kein Antwortgenerierungsmodell oder LLM-Richter verwendet.

Konfiguration

Jeder Treffer im Beleg

Alle Treffer im Beleg

Mittlerer Beleg-Recall

MiniLM-Baseline

37,5 %

29,5 %

nicht veröffentlicht

Jina v2 Small (v2.29.0)

53,0 %

43,4 %

47,6 %

Aktuell (v2.33.1)

62,9 - 63,5 %

53,1 - 53,5 %

57,4 - 57,9 %

Die Leistungssteigerungen sind auf die gemischte Abrufpipeline und den lokalisierten Vektorraum beschränkt, was eine hohe Multi-Hop-Abrufgenauigkeit gewährleistet, ohne auf Cloud-gehostete LLM-Richter angewiesen zu sein. Reproduzieren Sie den vollständigen Benchmark mit scripts/benchmarking/accuracy/locomo/run_eval.py.

6. vs Mitbewerber: Architektur

MARM zielt auf eine bestimmte Nische: lokales Gedächtnis für MCP-verbundene Codierungsagenten, nicht allgemeines Personalisierungsgedächtnis oder eine vollständige Agentenlaufzeit. So unterscheidet es sich architektonisch von etablierten Namen im KI-Agentengedächtnis:

MARM

Mem0

Letta (MemGPT)

Zep / Graphiti

agentmemory

Typ

Gedächtnis-Engine, MCP-nativ

Gedächtnisschicht-API

Vollständige Agentenlaufzeit

Temporaler Wissensgraph

Gedächtnis-Engine, MCP-nativ

Erforderliche Infrastruktur

Kein separater Daten-Dienst (eingebettetes SQLite)

Vektor-DB (Qdrant/pgvector)

Postgres + Vektor-DB

Neo4j

Separate iii-engine-Laufzeit

Bereitstellung

Standardmäßig lokal; Docker für gemeinsam/remote

Cloud-API oder selbst gehostet

Selbst gehostet oder Cloud

Cloud oder selbst gehostet

Lokal zuerst

Abrufmodell

Hybrid: FTS5 BM25 exakte Spur + semantische Neubewertung

Vektor + Graph + Schlüssel-Wert

Vektorarchivspeicher + vom Agenten verwalteter Kernspeicher

Temporaler Wissensgraph (Fakten-Gültigkeitsfenster)

BM25 + Vektor + Graph (RRF-Fusion)

Schreib-Erfassung

Explizite Tool-Aufrufe vom verbundenen Agenten

Explizite add()-Aufrufe (einige Integrationen extrahieren automatisch)

Der Agent bearbeitet sein eigenes Gedächtnis selbst

Explizite API-Aufrufe

Hook-basiert, automatisch (keine expliziten Aufrufe nötig)

Code-Struktur-Bewusstsein

Gebündelter Code-Graph + Konzept-Graph, mit Gedächtnis verschmolzen

Nicht integriert

Nicht integriert

Nicht integriert

Nicht integriert (arbeitet mit einem separaten Projekt)

Framework-Bindung

Keine (jeder MCP-Client)

Keine

Hoch (muss innerhalb von Letta laufen)

Keine

Keine (jeder MCP-Client)

Haftungsausschlüsse & Genauigkeit: Die Wettbewerbslandschaft verändert sich schnell. Die obige Matrix spiegelt die grundlegenden architektonischen Merkmale zum Stand Q3 2026 wider, basierend auf öffentlichen Dokumentationen und READMEs, nicht auf internen Tests jedes Systems. Falls sich ein Datenpunkt zu einem alternativen Framework geändert hat oder falsch dargestellt wird, öffnen Sie bitte ein Issue oder reichen Sie einen Pull Request ein, um die Tabelle zu aktualisieren. Wir begrüßen aktiv Korrekturen von Betreuern vergleichbarer Projekte.

MCP-Client-Setup für HTTP & STDIO

Manuelle pip-Installation

pip install marm-mcp-server

Verwenden Sie diese Faustregel, um Ihr Setup zu wählen

  • Lokales HTTP/STDIO = schnellstes Einzelmaschinen-Setup.

  • Docker HTTP = gemeinsam genutzter / immer verfügbarer Server (Schlüssel erforderlich).

  • Docker STDIO = privater containerisierter lokaler Gebrauch (kein HTTP-Schlüssel).

Hinweis für Schwarm-/Multi-Agent: Die Schreibwarteschlange ist standardmäßig aktiviert, um Speicherschreibvorgänge über einen Worker zu serialisieren. Für gemeinsam genutzte HTTP-Bereitstellungen verwenden Sie marm-memory start --profile swarm (200 RPM) oder --profile swarm-max (600 RPM). --profile trusted deaktiviert die Ratenbegrenzung vollständig für private Bereitstellungen. STDIO ist immer noch am besten für private Einzel-Agenten-/lokale Nutzung. Siehe Schwarm- & Multi-Agent-Voreinstellungen für die vollständige Tabelle.

„Agent“ bezieht sich auf Claude, Gemini, Grok, Qwen oder jeden MCP-Client. Codex verwendet --url anstelle von --transport, um MCP-Tools hinzuzufügen.

pip install marm-mcp-server
marm-memory start
# Stuck on client setup? Open a Q&A thread: https://github.com/Lyellr88/marm-memory/discussions
# most agents use this --transport command
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp
codex mcp add marm-memory --url http://localhost:8001/mcp

Der standardmäßige pip/lokale Start ist ohne Konfiguration: MARM bindet an localhost und benötigt keinen Schlüssel, es sei denn, Sie legen ihn mit SERVER_HOST=0.0.0.0 offen.

pip install marm-mcp-server
python -m marm_mcp_server.server_stdio
# most agents use this --transport command
"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio
codex mcp add marm-memory-stdio -- marm-mcp-stdio

Ersetzen Sie marm-mcp-stdio durch python -m marm_mcp_server.server_stdio, wenn Sie eine virtuelle Umgebung oder ein pfadbasiertes Setup verwenden. Funktioniert mit Claude Code, Cursor, VS Code, Qwen und Gemini CLI. STDIO bleibt ein einzelner lokaler Prozess ohne Port und ohne API-Schlüssel und stellt dieselben 14 Tools wie HTTP bereit.

Verwenden Sie HTTP, wenn mehrere Agenten einen gemeinsamen MARM-Server verwenden müssen. STDIO ist immer noch am besten für private Einzel-Agenten-Nutzung, da jeder Client seinen eigenen lokalen Prozess besitzt.

# HTTP shared server, normal multi-agent use
marm-memory start --profile swarm

# HTTP shared server, heavier private swarm
marm-memory start --profile swarm-max

# HTTP trusted private lab/server, rate limiting disabled
marm-memory start --profile trusted

# STDIO remains keyless/private and does not use swarm flags
marm-mcp-stdio

Docker-HTTP erfordert einen API-Schlüssel, da es MARM als Netzwerkserver bereitstellt; STDIO bleibt lokal zum Client-Prozess und benötigt keinen Schlüssel.

Wenn Sie MARM über pip installiert haben, kann die Produkt-CLI dasselbe Setup sicher in der Vorschau anzeigen oder ausführen. Sie verwendet standardmäßig einen Loopback-Port, bewahrt ~/.marm, speichert den generierten Schlüssel in ~/.marm/.env anstatt in der Shell-Historie und weigert sich, einen vorhandenen Container zu ersetzen.

marm-memory docker command                 # preview the exact HTTP command
marm-memory docker run                     # create the managed HTTP container
marm-memory docker stdio-command           # print a Docker STDIO client command
marm-memory docker status
marm-memory docker logs --follow
marm-memory docker stop

# Optional: mount repositories read-only for code indexing.
marm-memory docker run --repo /absolute/path/to/repository

# Optional: preview or explicitly write a Compose configuration.
marm-memory docker compose
marm-memory docker compose --yes

Die HTTP-Befehle run, command und compose akzeptieren dieselben operativen Flags:

Flag

Zweck

--data-dir <absoluter Pfad>

Dauerhaftes Host-Verzeichnis, eingehängt unter /home/marm/.marm. Standardmäßig ~/.marm; dies enthält Speicher, Indizes, Logs und die verwaltete Schlüsseldatei.

--env-file <Pfad>

Explizite Docker-Env-Datei. Sie muss bereits MARM_API_KEY enthalten; ohne dieses Flag verwendet MARM ~/.marm/.env und erstellt dort nur einen Schlüssel, wenn docker run oder docker compose --yes einen benötigt.

--port <Zahl>

Host-HTTP-Port. Standard: 8001.

--expose-network

Bindet den Host-Port an 0.0.0.0 anstatt an Loopback. Dies ist eine bewusste Netzwerkfreigabe; konfigurieren Sie eine Firewall und einen TLS-Proxy.

`--profile standard

swarm

swarm-max

trusted`

Wählt dasselbe Schreibwarteschlangen- und Ratenbegrenzungs-Preset wie der native HTTP-Start.

--rate-limit-rpm <Zahl>

Überschreibt die Ratenbegrenzung des ausgewählten Profils. 0 deaktiviert die Ratenbegrenzung.

--repo <absoluter Pfad>

Wiederholbarer, schreibgeschützter Repository-Mount für Code-Indizierung. MARM meldet jeden entsprechenden /workspace/repo-N-Pfad zur Indizierung im Container.

--tag <Tag>

Offizielles Image-Tag. Standard: latest.

--pull

Zieht das ausgewählte Image, bevor ein neuer HTTP-Container erstellt wird.

--name <Name>

Verwalteter Containername. MARM weigert sich, einen vorhandenen Container mit diesem Namen zu ersetzen.

--memory <Limit> / --cpus <Limit>

Optionale Docker-Ressourcengrenzen.

--dry-run

docker run nur: Druckt den geplanten Befehl, ohne einen Container oder eine Schlüsseldatei zu erstellen. docker command ist immer eine Vorschau.

Zum Beispiel:

# Shared local server with a custom data path and two repositories for indexing.
marm-memory docker command \
  --profile swarm \
  --data-dir /srv/marm-data \
  --repo /srv/projects/api \
  --repo /srv/projects/web

# Execute the reviewed command, pulling the image first.
marm-memory docker run --profile swarm --data-dir /srv/marm-data --pull

Docker STDIO ist getrennt von Docker HTTP: marm-memory docker stdio-command verwendet docker run -i --rm, hat keinen Port und keinen Bearer-Key, mountet aber trotzdem das Datenverzeichnis, sodass der SQLite-Speicher nach dem Beenden des kurzlebigen Containers erhalten bleibt. Verwenden Sie bei Bedarf --data-dir und --tag mit diesem Befehl. Es gibt keine separaten Befehle docker key oder docker mount; --env-file und --data-dir machen diese Entscheidungen im generierten HTTP-Befehl explizit.

marm-memory docker pull lädt nur ein Image herunter. marm-memory docker maintenance embeddings migrate wird gegen denselben Daten-Mount ausgeführt und verweigert, während der verwaltete HTTP-Container läuft. Der Helfer ist nur mit dem per pip installierten Befehl marm-memory verfügbar; Nur-Docker-Benutzer können die untenstehenden Rohbefehle verwenden.

# Step 1: generate key (do not add < > around the key)
docker run --rm lyellr88/marm-mcp-server:latest --generate-key

# Step 2: run server
docker pull lyellr88/marm-mcp-server:latest
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest

# Step 3: connect client
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

# PowerShell: set this before starting/restarting Codex
$env:MARM_API_KEY="your-generated-key"
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY

# Quick auth smoke test
curl -i -H "Authorization: Bearer $env:MARM_API_KEY" http://127.0.0.1:8001/mcp

--bearer-token-env-var akzeptiert den Namen der Umgebungsvariable, nicht den rohen Schlüssel. Starten oder starten Sie Codex aus derselben Shell neu, nachdem Sie $env:MARM_API_KEY gesetzt haben. Für lokale Docker-Smoke-Tests ist MARM_API_KEY=test in Ordnung und vermeidet Shell-Escape-Probleme; verwenden Sie für echte Bereitstellungen einen generierten Schlüssel. Ein 406 Not Acceptable vom Smoke-Test GET /mcp bedeutet, dass die Authentifizierung den MCP-Endpunkt erreicht hat; 401 Unauthorized bedeutet, dass der Schlüssel fehlt oder nicht übereinstimmt.

# --swarm: write queue on, 200 RPM - recommended for multi-agent shared servers
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest --swarm

Docker-Graph-Tools laufen innerhalb des Containers, daher können sie Host-Pfade nicht sehen, es sei denn, Sie mounten sie bei docker run.

$env:MARM_API_KEY="test"

# The second -v line mounts your repo; adjust the host path to your project
docker run -d --name marm-mcp-server `
  -p 127.0.0.1:8001:8001 `
  -e SERVER_HOST=0.0.0.0 `
  -e MARM_API_KEY=$env:MARM_API_KEY `
  -v ~/.marm:/home/marm/.marm `
  -v C:\Users\lyell\Desktop\marm-memory:/workspace/marm-memory `
  lyellr88/marm-mcp-server:latest

Indizieren Sie dann den Container-Pfad, nicht den Windows-Host-Pfad:

marm_graph_index(repo_path="/workspace/marm-memory")

Graph-Tools müssen den Container-Pfad verwenden. Mounts können nicht zu einem bereits laufenden Container hinzugefügt werden; stoppen und starten Sie den Container mit dem Repository-Mount neu, wenn Sie Docker-Graph-Indizierung wünschen.

Docker STDIO enthält die gleichen integrierten marm-graph-Tools; kein zusätzliches Image oder Installationsschritt erforderlich.

docker run --rm -i \
  -v ~/.marm:/home/marm/.marm \
  --entrypoint python \
  lyellr88/marm-mcp-server:latest \
  -m marm_mcp_server.server_stdio

  • Docker HTTP benötigt einen Schlüssel; Docker STDIO nicht.

  • Wenn Sie 401 erhalten, überprüfen Sie die Schlüsselübereinstimmung und den Client-Neustart nach Änderungen an Umgebungsvariablen.

  • Für vollständige Schlüsseleinrichtung, Rotation und Fehlerbehebung: INSTALL-DOCKER.md

Verbinden Sie Ihren Client

Starten Sie den Server (python -m marm_mcp_server), dann verbinden Sie Ihren Client unten. Jeder Block geht von der standardmäßigen lokalen Installation aus (kein Schlüssel). Für Docker oder exponierte Server fügen Sie den Authorization: Bearer-Header hinzu, der im aufklappbaren Bereich jedes Clients gezeigt wird.

claude mcp add --transport http marm-memory http://localhost:8001/mcp

Claude Code unterstützt HTTP, SSE und STDIO über claude mcp add; verwenden Sie HTTP für MARM. Für STDIO: claude mcp add --transport stdio marm-memory-stdio marm-mcp-stdio.

Fügen Sie in Ihrem Arbeitsbereich zu .vscode/mcp.json hinzu. Verwenden Sie marm-memory-local für direkte Python-Installationen; marm-memory-docker für Docker oder exponierten/Schlüssel-Modus.

{
  "inputs": [
    {
      "type": "promptString",
      "id": "marm-api-key",
      "description": "MARM API Key for Docker or exposed server mode",
      "password": true
    }
  ],
  "servers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${input:marm-api-key}"
      }
    }
  }
}

Öffnen Sie .vscode/mcp.json, klicken Sie auf Start über dem gewünschten Server, dann verwenden Sie Copilot Agent oder eine beliebige Erweiterung, die das native MCP-Register von VS Code nutzt.

Fügen Sie in Ihrem Arbeitsbereich zu .cursor/mcp.json hinzu. Cursor verwendet mcpServers, nicht das servers-Root von VS Code.

{
  "mcpServers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${env:MARM_API_KEY}"
      }
    }
  }
}

Für den Docker/Schlüssel-Modus starten Sie Cursor mit gesetztem MARM_API_KEY in der Umgebung.

Codex verwendet codex mcp add oder TOML-Konfiguration unter ~/.codex/config.toml (%USERPROFILE%\.codex\config.toml unter Windows).

# Direct Python install - no key needed
codex mcp add marm-memory --url http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required (set MARM_API_KEY in your shell first)
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY
[mcp_servers."marm-memory"]
url = "http://localhost:8001/mcp"
enabled = true
bearer_token_env_var = "MARM_API_KEY"
# Direct Python install - no key needed
gemini mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
gemini mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

Äquivalente ~/.gemini/settings.json (Benutzerbereich) oder Projekt .gemini/settings.json:

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}
# Direct Python install - no key needed
qwen mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
qwen mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

Äquivalente .qwen/settings.json (Projekt) oder ~/.qwen/settings.json (Benutzer):

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}

xAI verbindet sich von seiner eigenen Infrastruktur, daher wird localhost nicht funktionieren. Setzen Sie MARM hinter HTTPS und setzen Sie MARM_API_KEY.

{
  "type": "mcp",
  "server_url": "https://your-marm-domain.example.com/mcp",
  "server_label": "marm-memory",
  "authorization": "Bearer your-generated-key"
}

Vollständige Plattform-Walkthroughs, Schlüsseleinrichtung und OS-spezifische Hinweise: Windows · macOS · Linux · Docker/Schlüssel-Modus · Andere Plattformen

Verwenden Sie einen Client, der nicht aufgeführt ist? Erstellen Sie ein Issue und lassen Sie es uns wissen; Client-Adapter sind eine erstklassige Funktionsanfrage.

Anforderungen

  • Python: 3.10 oder höher

  • SQLite3: In Python enthalten (keine separate Installation erforderlich)

  • Speicher: ~100 MB Minimum für die Ersteinrichtung, skaliert mit der Größe der Speicherdatenbank

  • RAM: 512 MB Minimum (variiert je nach gleichzeitigen Clients und Datenbankgröße)

  • Betriebssystem: Windows, macOS, Linux

Datenort

  • Ort: ~/.marm/ (Linux/macOS) oder %USERPROFILE%\.marm\ (Windows)

  • Inhalt: SQLite-Datenbank mit allen Erinnerungen, Sitzungen und Notizbüchern; der Konzeptgraph lebt in einer eigenen ~/.marm/index/-Datenbank

  • Backup: Kopieren Sie das gesamte Verzeichnis ~/.marm/, um alle Daten zu erhalten

  • Datenschutz: Alles bleibt auf Ihrem Rechner, keine Cloud-Synchronisation oder externer Speicher

Installation überprüfen

Verwenden Sie den MCP-Server-Health-Endpunkt für den schnellsten Live-Check:

curl http://localhost:8001/health

Erwartete Ausgabe enthält Serverversion, Funktionsverfügbarkeit (Status der semantischen Suche), Datenbankverbindungsstatus und Dienst-Health-Status.

Vollständiges MCP-Tool-Suite (14 Tools)

💡 Profi-Tipp: Sie müssen diese Tools nicht manuell aufrufen! Sagen Sie Ihrem KI-Agenten einfach in natürlicher Sprache, was Sie möchten:

  • "Claude, protokolliere diese Sitzung als 'Projekt Alpha' und füge diese Unterhaltung als 'Datenbankdesign-Diskussion' hinzu"

  • "Merke dir diesen Code-Snippet für später in deinem Notizbuch"

  • "Suche nach dem, was wir gestern über Authentifizierung besprochen haben"

Der KI-Agent wird automatisch die entsprechenden Tools verwenden. Manueller Tool-Zugriff ist für Power-User verfügbar, die direkte Kontrolle wünschen.

🧠 Kernspeicher (7 Tools)

Tool

Was es tut

Wichtige Parameter

marm_smart_recall

Hybrider Speicher-Abruf mit einem additiven, begrenzten Konzept-/Code-Graph-Seitenwagen, wenn ein kompatibler Graph existiert

query, limit, session_name, search_all, detail=1/2/3, project, platform, exact_mode

marm_log_entry

Strukturierte Sitzungsprotokolleinträge hinzufügen; jeder Eintrag wird auch in den semantischen Speicher eingebettet, sodass marm_smart_recall ihn finden kann

entry, session_name

marm_log_show

Alle Einträge und Sitzungen mit Filterung anzeigen

session_name

marm_delete

Eine Protokollsitzung, einen Protokolleintrag oder einen Notizbucheintrag löschen

type, target, session_name, project, platform

marm_summary

Zwischengespeicherte, einfügebereite Sitzungszusammenfassungen mit intelligenter Kürzung

session_name

marm_notebook

Sitzungsbezogener Notizblock plus Promotion zu einem dauerhaften, graph-verknüpften Dokument

`action="add"

"use"

"show"

"status"

"clear"

"save", name, data, session_name, project, platform`

marm_compaction

Agentenunterstützte Speicherbereinigung mit überprüfbarem Audit-Trail

`action="status"

"candidates"

"review"

"stage"

"apply"

"discard"`

🕸️ Code-Graph (5 Tools)

Tool

Was es tut

Wichtige Parameter

marm_graph_index

Ein Repository in den Code-Struktur-Graphen indizieren, Status prüfen, Projekte auflisten oder automatische Neuindizierung ein- und ausschalten

repo_path, project, action

marm_code_lookup

Symbole, Textmuster oder die Quelle eines Symbols finden; anstelle von grep/glob verwenden

`kind="auto"

"symbol"

"text"

"snippet"`

marm_graph_trace

Aufrufpfade und Datenfluss von einer Funktion aus verfolgen

direction, mode

marm_graph_architecture

Architekturübersicht: Module, Knoten/Kanten-Aufschlüsselung, Schema

project

marm_graph_impact

Auswirkungsradius von Code-Änderungen: git diff → betroffene Symbole + Risiko

since, base_branch, depth

🧩 Konzept-Graph (2 Tools)

Tool

Was es tut

Wichtige Parameter

marm_concept_build

Den Graphen neu erstellen oder Erinnerungen indizieren, die vor der automatischen Indizierung gespeichert wurden. Neue Erinnerungen werden automatisch indiziert

session_name, project, oder search_all=True (eines erforderlich)

marm_concept_recall

Explizit Entitäten, Beziehungen und verknüpfte Code-Symbole abfragen

query, depth (1-5), direction, project, platform

Alle 14 Tools sind sowohl über HTTP als auch STDIO verfügbar. Hinter der Tool-Oberfläche kümmert sich der Server automatisch um Lebenszyklus-Setup, Protokollaktualisierung, Docs-Indizierung, Datumskontext, Zusammenfassungs-Cache-Wartung, Schreibwarteschlangen-Handling, Konzept-Indizierung, Code-Neuindizierung bei Repository-Änderungen, Projekt-/Plattform-Zuordnung und Health-Checks; nichts davon verbraucht die Aufmerksamkeit oder Tokens des Agenten. Die beiden Graph-Engines starten träge bei der ersten Verwendung und blockieren niemals die 7 Kernspeicher-Tools, falls sie nicht starten können. Siehe Architektur & Interna für die Mechanismen.

MARM verwenden: Reden, nicht Tools aufrufen

MARM erledigt Lebenszyklus-Arbeiten intern. Docs und Sitzungszustand werden beim ersten echten Tool-Aufruf initialisiert, und verpackte Docs werden mit Quell-Datei-Hash-Verfolgung in den marm_system-Speicher-Namespace indiziert, sodass Ihr Agent MARM-Nutzungsfragen aus dem Speicher selbst beantworten kann.

Beispiel-Workflow: KI-übergreifendes Forschungsprojekt

Ein realistischer Workflow, der MARM in Aktion zeigt. Szenario: Sie recherchieren Authentifizierungsmuster für ein neues Projekt mit mehreren KI-Clients.

Phase 1: Sitzung starten (Claude)

You: "Claude, create a MARM session called 'auth-research-2025-01'"
Claude calls: marm_log_entry(entry="Session: auth-research")
Result: Session routed to auth-research-[today]. MARM lifecycle/docs initialize automatically.

Phase 2: Recherche erfassen (Claude)

You: "Summarize OAuth2 vs JWT for API authentication and save it"
Claude calls: marm_log_entry(entry="Research: OAuth2 is token-based with refresh cycles, better for delegated access. JWT is stateless, good for microservices...", session_name="auth-research-2025-01")
Result: Research captured in the active session log and marked for summary-cache refresh

Phase 3: Wiederverwendbare Referenz hinzufügen (Claude)

You: "Save a JWT validation code snippet to my notebooks as 'jwt-validation-pattern'"
Claude calls: marm_notebook(action="add", name="jwt-validation-pattern", data="def verify_jwt(token):\n  # validation logic...")
Result: Reusable snippet stored for future projects

Phase 4: Kontext abrufen (Gemini)

You: "Gemini, what authentication approaches did we research? Activate the JWT pattern."
Gemini calls: marm_smart_recall("authentication patterns", search_all=True)
Gemini calls: marm_notebook(action="use", names="jwt-validation-pattern")
Result: Gemini sees previous research + has JWT code available as context

Phase 5: Synthese & Zusammenfassung (Qwen)

You: "Qwen, pull everything from the auth research and create a summary"
Qwen calls: marm_smart_recall("authentication", session_name="auth-research-2025-01", limit=20)
Qwen calls: marm_summary(session_name="auth-research-2025-01")
Result: Qwen generates an implementation guide from all captured research

Phase 6: Sitzung beenden (Claude)

You: "Log final decision - we're using JWT for APIs, and OAuth2 for user auth"
Claude calls: marm_log_entry(entry="DECISION: JWT for API auth, OAuth2 for user flows. Rationale: stateless APIs + delegated user access", session_name="auth-research-2025-01")
Result: Decision logged and searchable by all future AI clients

Ergebnis: Drei verschiedene KI-Clients haben kollaborativ ein Thema recherchiert, Erkenntnisse geteilt und Entscheidungen dokumentiert. Alles ohne das Projekt jedem neuen KI erneut erklären zu müssen.

Fortgeschrittene Muster

Project Structure:
├── project-name-planning/          # Initial design and requirements
├── project-name-development/       # Implementation details
├── project-name-testing/           # QA and debugging notes
├── project-name-deployment/        # Production deployment
└── project-name-retrospective/     # Lessons learned

Wissensdatenbank-Schleife:

  1. Erfassen: Verwenden Sie marm_log_entry für strukturierte Sitzungserkenntnisse

  2. Organisieren: Erstellen Sie thematische Sitzungen für Wissensbereiche

  3. Synthetisieren: Regelmäßige marm_summary zur Wissenskonsolidierung

  4. Anwenden: Konvertieren Sie Zusammenfassungen in marm_notebook(action="add", ...)-Einträge

Multi-KI-Kollaboration: Jede KI arbeitet in dedizierten Sitzungen an ihren Stärken, nutzt marm_smart_recall, um auf der Arbeit der anderen aufzubauen, und eine kollaborative Sitzung kombiniert dann die Erkenntnisse.

  • Sitzungsbenennung: Fügen Sie den LLM-Namen für Querverweise hinzu

  • Strategisches Protokollieren: Fokussieren Sie auf wichtige Entscheidungen, Lösungen, Entdeckungen, Konfigurationen

  • Globale Suche: Verwenden Sie search_all=True, um über alle Sitzungen zu suchen

  • Natürliche Sprachsuche: "Authentifizierungsprobleme mit JWT-Tokens" schlägt "auth error"

  • Gestaffelte Abruftiefe: detail=1 gibt eine kurze Zusammenfassungsansicht (~200 Zeichen) zurück, detail=2 eine größere Kontextansicht (~500 Zeichen), detail=3 den vollständigen Speicherinhalt

  • Notebook-Stapelung: Kombinieren Sie mehrere Einträge für komplexe Arbeitsabläufe

  • Kompaktierung: Lassen Sie MARM Kompaktierungskandidaten anzeigen, verwenden Sie dann marm_compaction, um Zusammenfassungen zu stufen, zu überprüfen, anzuwenden oder zu verwerfen

  • Sitzungslebenszyklus: Start → Arbeiten → Referenz → Überprüfen Sie die gestufte Kompaktierung, wenn MARM darum bittet

MARM-Gedächtnis verstehen

Zwei Suchen, zwei sehr unterschiedliche Probleme, ein Werkzeug:

User: "I discussed machine learning algorithms yesterday"
MARM Search: Finds related memories about "ML models", "neural networks", "AI training"

User: "What was the COMPACTION_TRIGGER_COUNT setting?"
MARM Search: Finds the exact config memory even if the rest of the text differs

Die erste Abfrage betrifft Bedeutung, daher bewertet MARM Kandidaten mit lokalen Vektor-Einbettungen neu – RAG-artige semantische Suche ohne gehostete Vektordatenbank. Die zweite ist syntaxförmig (ein Konfigurationsschlüssel), daher erkennt MARM das automatisch und leitet es stattdessen durch deterministisches exaktes Matching. Diese exakte Abrufspur ist der Unterschied zwischen einem Gedächtnissystem, das in Demos funktioniert, und einem, das die Fragen beantwortet, die Entwickler tatsächlich stellen: Konfigurationsschlüssel, CLI-Flags, Dateipfade, API-Namen, Fehlerstrings. Rein semantische Gedächtnissysteme scheitern genau bei solchen Abfragen.

MARM verwendet Filter→Rerank-Hybrid-Abruf plus eine exakte Abrufspur:

  1. Exakte Spur (exact_mode="auto", die Standardeinstellung): Konfigurationsschlüssel, CLI-Flags, Dateipfade, API-/Werkzeugnamen, gepunktete Namespaces, HTTP-Routen, URLs und zitierte Befehlsstrings werden erkannt und durch deterministisches FTS5 BM25 mit einem LIKE-Fallback geleitet. Keine Einbettungen beteiligt, daher sind die Ergebnisse stabil und wörtlich.

  2. Filter→Rerank-Spur: Natürlichsprachige Abfragen ziehen zuerst eine begrenzte Kandidatenmenge aus dem FTS-Index (FTS_CANDIDATE_LIMIT, Standard 200), dann bewerten semantische Einbettungen diese Kandidaten nach Bedeutung neu. Konservative zeitliche Gewichtung gibt frischeren Erinnerungen einen moderaten Schub, wenn Übereinstimmungen ansonsten nahe beieinanderliegen.

  3. Begrenzter semantischer Fallback: Wenn die FTS-Abdeckung schwach oder unbrauchbar ist, fällt MARM auf einen begrenzten semantischen Scan zurück (RECALL_SCAN_LIMIT). Wenn die Antwort recall_scan_truncated=true enthält, hat der Fallback sein Limit erreicht; verengen Sie die Sitzung/Abfrage oder erhöhen Sie die Umgebungsvariable für größere Speicher.

  4. Chunk-bewusste Bewertung: Lange Erinnerungen (etwa 180+ Wörter) werden intern als überlappende Chunk-Zeilen eingebettet, und der Abruf kollabiert Chunk-Scores zurück zu einer übergeordneten Erinnerung unter Verwendung des am besten passenden Chunks. Sowohl die Rerank-Spur als auch die Fallback-Spur sind chunk-bewusst.

Deshalb bleibt die Abruflatenz nahezu flach, während der Speicher wächst (siehe Benchmarks): Die semantische Neubewertung bewertet immer eine begrenzte Menge, anstatt jede Einbettung zu scannen.

Exakte Abrufkontrolle: exact_mode="auto" ist normalerweise richtig. Verwenden Sie exact_mode="exact", wenn eine Abfrage wörtlichen Text wie RECALL_SCAN_LIMIT, --generate-key oder settings.py entsprechen muss. Verwenden Sie exact_mode="semantic", wenn eine syntaxähnliche Abfrage dennoch als bedeutungsbasierter Abruf behandelt werden soll.

Speichertypen & Klassifizierung

  1. Kontextprotokolle – Automatisch klassifizierte Konversationserinnerungen

  2. Manuelle Einträge – Explizit gespeicherte wichtige Informationen

  3. Notebook-Einträge – Wiederverwendbare Anweisungen und Wissen

  4. Sitzungszusammenfassungen – Komprimierter Konversationsverlauf

MARM kategorisiert Inhalte beim Schreiben automatisch: Code (Programmier-Snippets und technische Diskussionen), Projekt (Arbeitsgespräche und Planung), Buch (Literatur, Lernmaterialien, Forschung) und Allgemein (alles andere).

Projekt- & Plattformzuordnung

MARM speichert nullable project- und platform-Spalten für Erinnerungen, Protokolleinträge und Notebook-Einträge. Das Projekt wird aus dem Arbeitsverzeichnis und die Plattform vom verbindenden Client (Claude Code, VS Code, Cursor, ...) erkannt; MARM_PROJECT und MARM_PLATFORM überschreiben die Erkennung. marm_smart_recall(project=..., platform=...) begrenzt den Abruf, ohne das standardmäßige ungefilterte Verhalten zu ändern, sodass ein gemeinsamer Server mehrere Projekte ohne Kreuzkontamination halten kann.

Wissensgraphen: Code & Konzepte

MARM enthält zwei Graphsysteme, die den Speicher ergänzen: einen Codegraphen, der die Struktur Ihres Repositorys versteht, und einen Konzeptgraphen, der versteht, worum es in Ihren gespeicherten Erinnerungen geht. Wenn beide für dasselbe Projekt indiziert sind, verlinken Konzeptentitäten auf Codesymbole.

Codegraph: Repo-Indizierung und Code-Lookup

marm-graph ist in beide Transporte integriert. Es indiziert ein Repository einmal und ermöglicht es Agenten dann, Codestrukturfragen zu stellen, ohne wiederholt Dateien zu scannen:

Use marm_graph_index to index this repository.
Then use marm_code_lookup when you need symbols, files, or source snippets.
Use marm_graph_trace for call paths, marm_graph_architecture for an overview, and marm_graph_impact for change-risk checks.

Der empfohlene Agenten-Workflow: einmal indizieren, dann marm_code_lookup vor breiten Dateilesevorgängen, marm_graph_trace, wenn Aufrufer/Aufgerufene oder Datenflusskontext wichtig sind, marm_graph_architecture zur Orientierung und marm_graph_impact vor riskanten Refactorings. Eine Graphabfrage ersetzt Dutzende von grep/read-Zyklen, was die Token-Ersparnis ausmacht.

Sobald ein Repository indiziert ist, hält MARM es von selbst aktuell. Ein Hintergrund-Poller bemerkt, wenn sich das Repo geändert hat, und indiziert es neu, sodass keine manuelle Neuindizierung nach einem Commit erforderlich ist. Während Sie nicht committete Arbeit haben, aktualisiert es jeden Zyklus, da keine billige Prüfung wiederholte Bearbeitungen einer bereits geänderten Datei sehen kann. Um nur auf Anfrage zu indizieren, stattdessen:

marm-mcp-server projects auto off

Ein Agent kann dasselbe mit marm_graph_index(action="auto_off") tun, und action="auto_status" berichtet, was überwacht wird und wann jedes Projekt zuletzt indiziert wurde. Der Schalter bleibt über Neustarts hinweg erhalten und schlägt die Umgebungsvariable GRAPH_AUTO_INDEX.

Unter der Haube ist die Engine codebase-memory-mcp (MIT), eine null-Abhängigkeits-Statik-Binärdatei, die 158 Sprachen durch tree-sitter mit Hybrid-LSP-Typauflösung für die wichtigsten parst, ein durchschnittliches Repository in Sekunden indiziert und Symbolsuche und Aufrufverfolgung in deutlich unter einer Sekunde beantwortet. Gemessen an einem 149.107-Knoten-Graphen über die persistente Verbindung, die MARM hält: Symbolsuche 146ms, Aufrufverfolgung 67ms und die vollständige Architekturübersicht 1,23s, was die eine Abfrage ist, die nicht unter einer Sekunde liegt. MARM pinnt eine bestimmte Version, überprüft ihr Werkzeugschema beim Start und leitet den Upstream-Werkzeugsatz durch 5 fokussierte MCP-Werkzeuge, sodass die Modelloberfläche klein bleibt. Die Graph-Backend startet verzögert bei der ersten Graph-Werkzeugnutzung, sodass Speicher-, Protokoll-, Notebook- und Zusammenfassungswerkzeuge weiterhin schnell starten. In Docker ist die Engine-Binärdatei in das Image eingebacken; lokale pip-Installationen laden sie bei der ersten Graph-Nutzung herunter (~269MB, einmalig).

Degradierter Modus: Wenn die Graph-Engine nicht startet (kein Netzwerk für den Erststart-Download, Festplatte voll, Schema-Drift) oder GRAPH_ENABLED=false gesetzt ist, geben Graph-Werkzeuge {"status": "error", "message": "graph backend unavailable"} zurück, während die anderen 9 Werkzeuge normal weiterarbeiten. Graph-Fehler können das Gedächtnis niemals lahmlegen.

Konzeptgraph: Worum es in Ihren Erinnerungen geht

MARM extrahiert einen Wissensgraphen aus den gespeicherten Erinnerungen und erzeugt typisierte Entitäten (Konzepte, Entscheidungen, Muster, Fehler, Werkzeuge, Personen, Organisationen), die durch typisierte Beziehungen (behebt, implementiert, hängt_ab_von, verwendet, verursacht, ersetzt, erweitert) verbunden sind. Dies geschieht automatisch: Das Speichern einer Erinnerung stellt sie in die Warteschlange, und ein Hintergrundarbeiter fügt sie etwa 30 Sekunden später zum Graphen hinzu. marm_concept_build ist weiterhin für einen vollständigen oder begrenzten Neuaufbau verfügbar. Sobald ein Graph vorhanden ist, fügt marm_smart_recall begrenzte verwandte Entitäten, Beziehungen und verknüpften Code als graph_context-Sidecar hinzu, ohne die primäre Speicherbewertung zu ändern. marm_concept_recall bleibt für die explizite Graph-Erkundung verfügbar:

marm_concept_recall(query="write queue")            → the entity, its relationships, linked code symbols
marm_concept_recall(query="related to SQLite", depth=3) → multi-hop traversal of everything connected

So verwenden Sie es:

  • Standardmäßig automatisch: Neue Erinnerungen erreichen den Graphen ohne einen Tool-Aufruf. Setzen Sie CONCEPT_AUTO_INDEX=false, um nur zu manuellen Builds zurückzukehren. Dies stoppt den Worker, behält aber die Aufzeichnung von Warteschlangenzeilen bei, sodass beim Wiedereinschalten alles aufgegriffen wird, was während der Deaktivierung geschrieben wurde; CONCEPT_INDEX_DEBOUNCE_SECONDS (30) und CONCEPT_INDEX_BATCH_SIZE (20) steuern das Tempo.

  • Sicher auf beiden Transports gleichzeitig: Ein geleastes Lock in der Speicherdatenbank verhindert, dass ein Neubau in einem Prozess Graphtabellen löscht, während ein anderer Prozess darauf schreibt. Ein Build, der den Graphen als belegt vorfindet, meldet dies, anstatt zu kollidieren.

  • Fehler erreichen niemals Ihre Erinnerungen: Die Indizierung läuft auf einer dauerhaften Warteschlange außerhalb des Schreibpfads. Extraktionsprobleme werden wiederholt, eine Erinnerung, die wiederholt fehlschlägt, wird mit ihrem Fehler abgelegt, und die Erinnerung selbst wird währenddessen normal gespeichert und abgerufen.

  • Das Abarbeiten eines Rückstaus kostet etwas Abrufgeschwindigkeit: Die Entitätsextraktion ist CPU-intensiv. Während der Worker also eine Warteschlange abarbeitet, steigt der gemessene mediane Abruf von ~8ms auf ~16ms bei einem realen Korpus von 768 Erinnerungen. Schreibvorgänge sind nicht betroffen. Dies gilt nur, solange ein Rückstau abgebaut wird, was für die meisten Menschen einmalig nach dem Upgrade-Neubau der Fall ist. Reproduzieren Sie es mit scripts/benchmarking/performance/bench_concept_worker.py --from-live.

  • Build für den Rückstau: marm_concept_build, begrenzt auf eine session_name, project oder search_all=True, indiziert Erinnerungen, die vor der Existenz der automatischen Indizierung gespeichert wurden, und baut nach einem Upgrade neu auf, das eines erfordert.

  • Bisher zweimal aktualisiert: Graphen, die vor der Plattformattribution erstellt wurden, oder bevor Kompaktierungsquellen die indizierten Zeilen ersetzten, erfordern marm_concept_build(search_all=True). Ein vollständiger Build sichert und setzt nur die abgeleitete Konzeptdatenbank zurück; gezielte Builds weigern sich, die Plattformzugehörigkeit zu erraten.

  • Gesamter Geltungsbereich, seitenweise: Builds lesen jede Erinnerung im Geltungsbereich. CONCEPT_BUILD_ROW_CAP (Standard 500) ist die Seitengröße. Eine Verringerung führt dazu, dass ein Build mehr, kleinere Seiten liest, anstatt den Rest zu überspringen.

  • Kompaktierte Sitzungen: Die ursprünglichen Erinnerungen werden indiziert und die generierte Zusammenfassung nicht, sodass Konzepte dort verbleiben, wo sie tatsächlich angegeben wurden.

  • Abruf schlägt offen fehl: Ein fehlender, leerer, inkompatibler oder nicht verfügbarer Konzeptgraph blockiert niemals den normalen Erinnerungsabruf. Die Antwort meldet den Graphstatus separat.

  • Code-Querverweise: Wenn der Codegraph dasselbe Projekt indiziert hat, werden Konzeptentitäten, die mit Codesymbolen übereinstimmen, verknüpft, wodurch „was wir entschieden haben“ mit „wo es im Code lebt“ verbunden wird.

  • Gebündelte Extraktionslaufzeit: Die spaCy-Laufzeit und das englische Extraktionsmodell werden mit MARM ausgeliefert, laden aber nur bei der ersten Extraktion, die jetzt kurz nach dem Speichern der ersten Erinnerung erfolgt, anstatt wenn Sie einen Build ausführen. Wenn eine beschädigte oder unvollständige Installation sie nicht verfügbar macht, verschlechtern sich beide Konzept-Tools sauber, während der Kernspeicher verfügbar bleibt; führen Sie marm-memory knowledge status aus und installieren Sie MARM bei Bedarf neu.

  • Isolierte Speicherung: Der Konzeptgraph lebt in einer eigenen SQLite-Datenbank (~/.marm/index/marm_index.db) mit einem eigenen Verbindungspool, sodass Konzeptgraph-Schreibvorgänge niemals die Produktionsspeicherdatenbank blockieren oder beschädigen können.

  • Konsolenatlas: Die MARM-Konsole rendert den vollständigen Atlas mit bis zu 750 Entitäten und 6.000 gespeicherten Beziehungen. Größere Graphen verwenden eine deterministische, verbundene Stichprobe von bis zu 600 Entitäten und 4.000 aggregierten visuellen Kanten, die deutlich als Stichprobe gekennzeichnet ist.

Dies schließt die Lücke in der sitzungsübergreifenden Struktur, die die flache Erinnerungssuche offen lässt: Sitzungen organisieren Erinnerungen, aber der Konzeptgraph verbindet sie, sodass „was von der Schreibwarteschlange abhängt“ beantwortbar ist, selbst wenn die Antwort fünf Sitzungen von drei verschiedenen Agenten umfasst.

Architektur & Interna

Alles oben Genannte läuft auf einer kleinen Anzahl durchdachter Mechanismen. Dieser Abschnitt ist die vollständige Karte, sodass Sie (oder Ihr Agent) nie raten müssen, was der Server tut.

Speicher-Engine

  • SQLite im WAL-Modus unter ~/.marm/marm_memory.db mit einem Verbindungspool (5 Verbindungen). WAL hält Leser während Schreibvorgängen entsperrt, was wichtig ist, wenn mehrere Agenten gleichzeitig abrufen, während einer schreibt.

  • FTS5-Volltextindex (memories_fts) wird als externe Inhaltstabelle über der Erinnerungstabelle verwaltet und treibt sowohl die exakte Spur (BM25) als auch die Filterstufe des hybriden Abrufs an.

  • Chunk-Speicher: Erinnerungen über ~180 Wörter werden in überlappende 150-Token-Chunks (50-Token-Überlappung) in einer memory_chunks-Tabelle aufgeteilt, jeder mit eigener Einbettung. Der Abruf bewertet Chunks und reduziert sie auf die übergeordnete Erinnerung.

  • Einbettungen stammen vom fastembed-gestützten jinaai/jina-embeddings-v2-small-en-Encoder: 33 Millionen Parameter, 512 Dimensionen, ein 8.192-Token-Kontextfenster und eine Apache-2.0-Lizenz. Es erfordert keine separaten Abfrage-/Dokumenttext-Präfixe. Der Encoder wird träge bei der ersten semantischen Verwendung geladen und hinter einem Lock serialisiert, sodass gleichzeitige Kodierungen einander nicht beschädigen können. Wenn er nicht verfügbar ist, sind Schreibvorgänge dennoch erfolgreich; Erinnerungen werden ohne Einbettungen gespeichert, bis er geladen ist. Die semantische Bewertung läuft als einzelner NumPy-Batch (Matrix-Kosinus) und nicht als Python-Schleife.

  • Der Konzeptgraph erhält eine eigene Datenbank (~/.marm/index/marm_index.db) und einen eigenen Pool, der dieselbe Pool-Implementierung wiederverwendet, aber niemals Verbindungen mit dem Speicher teilt. Bewusste Isolation: Ein experimenteller Graph-Build darf nicht in der Lage sein, den Produktions-WAL zu blockieren. Die einzige Ausnahme ist die Indizierungswarteschlange, die sich absichtlich in der Speicherdatenbank befindet, damit eine Erinnerung und ihre Indizierungsaufgabe gemeinsam festgeschrieben werden; der Graph selbst bleibt abgeleitet und wegwerfbar.

Schreibpfad

  • Serialisierte Schreibwarteschlange (standardmäßig aktiviert): Alle Erinnerungsschreibvorgänge fließen durch einen internen asynchronen Worker, wodurch SQLite-Schreibkonflikte bei Multi-Agent-Last vermieden werden. Die Warteschlange ist generisch; Kompaktierungsanwendungen durchlaufen denselben Worker, sodass es genau einen Schreiber gibt, unabhängig davon, welches Subsystem schreibt. MAX_QUEUE_SIZE begrenzt sie.

  • Schreibzeitliche Konsolidierung (optional, CONSOLIDATION_ENABLED=1) führt zwei Schichten aus, bevor eine Erinnerung landet:

    • Schicht 1, exakte Deduplizierung: Ein SHA-256-Hash des normalisierten Inhalts wird innerhalb der Sitzung überprüft; Hash-Treffer werden gegen den tatsächlichen Inhalt verifiziert, bevor dedupliziert wird, sodass eine Hash-Kollision eine neue Zeile speichert, anstatt unterschiedliche Inhalte stillschweigend zusammenzuführen.

    • Schicht 2, semantische Zusammenführung: Nahe Duplikate oberhalb von CONSOLIDATION_THRESHOLD Kosinus-Ähnlichkeit werden zusammengeführt, anstatt akkumuliert zu werden. Dies blockiert niemals einen Schreibvorgang; wenn der Encoder nicht verfügbar ist, wird der Schreibvorgang unkonsolidiert fortgesetzt.

    • Der Kompromiss ist gemessen und veröffentlicht: etwa 9-fache mediane Schreibkosten (58ms vs. 6,5ms) im Austausch für einen Speicher, der sauber bleibt, da Lesevorgänge die Erinnerungsarbeitslast dominieren. Siehe Abschnitt 3 der obigen Benchmarks.

  • Konzeptindizierung ist ein dauerhafter Postausgang: Ein Schreibvorgang zeichnet eine Indizierungsaufgabe in derselben Transaktion wie die Erinnerung auf, sodass eine Erinnerung nicht ohne eine existieren kann. Ein Hintergrundworker leert diese Warteschlange und schreibt den Konzeptgraphen. Nichts im Schreibpfad wartet auf die Extraktion, und ein Prozess, der während der Extraktion abgebrochen wird, verliert keine Arbeit, da die Aufgabe eine Zeile und keine In-Memory-Aufgabe ist. Beide Transports betreiben einen Worker, sodass sie sich über ein geleastes Lock in der Speicherdatenbank koordinieren, anstatt über ein prozessinternes Lock, das sie nicht umfassen würde.

  • Kompaktierung (optional, COMPACTION_ENABLED=1) ist Schicht 3: Nach genügend Schreibvorgängen in einer Sitzung erkennt ein Hintergrunddurchlauf Cluster verwandter Erinnerungen unter Verwendung von Kosinus-Ähnlichkeit plus Union-Find-komponenten, begrenzt durch minimale Clustergröße, Mindestalter und eine Gnadenfrist für aktive Sitzungen, sodass nie in Arbeit befindliche Vorgänge kompaktiert werden. MARM injiziert dann eine begrenzte Anfrage, die den verbundenen Agenten auffordert, jeden Cluster zusammenzufassen: candidatesstagereviewapply oder discard. Quell-Erinnerungs-IDs werden beim Anwenden beibehalten, sodass kompaktierte Zusammenfassungen auf ihre Originale zurückverfolgbar bleiben. Gestaffelte Zusammenfassungen laufen ab (COMPACTION_STAGING_TTL_HOURS), Erinnerungen sind begrenzt und haben eine Abkühlungsbeschränkung, und die Injektion hat ein Byte-Budget. Das Design ist ehrlich, wofür LLMs gedacht sind: MARM erkennt, der Agent fasst zusammen, und eine für Menschen überprüfbare Staging/Apply/Discard-Schleife begrenzt den destruktiven Schritt.

Abrufpfad

Behandelt in Understanding MARM Memory: exakte Spur (FTS5 BM25 + LIKE-Fallback), Filter→Reranking (begrenzte FTS-Kandidaten → Batch-semantisches Reranking → zeitliche Mischung), begrenzter semantischer Fallback mit explizitem Kürzungsflag und Chunk-Collapse-Bewertung. Die Abruftiefe (detail=1/2/3) steuert, wie viel von jeder Erinnerung zurückgegeben wird, und jede MCP-Antwort durchläuft einen 1MB-Antwortbegrenzer, der Inhalte intelligent kürzt, anstatt das Protokoll zu brechen.

Code-Graph-Subprozess-Protokoll

Die gebündelte Graph-Engine läuft als überwachter Kindprozess, nicht als Import:

  • Transport: Newline-getrenntes JSON-RPC 2.0 über stdio des Kindes, mit einem verifizierten Handshake (initialize → Serverversion erfassen → initialized-Notification).

  • Umschlagssorgfalt: Antworten werden nach dem ersten JSON-parsebaren Inhaltselement durchsucht, anstatt Index 0 anzunehmen, da der vorgelagerte Binärprozess eine Update-Notiz voranstellen kann. Tool-Fehler treten als result.isError auf, nicht als JSON-RPC-Fehler, und werden in saubere {"status": "error"}-Dictionaries mit dem eigenen Behebungsvorschlag des vorgelagerten Prozesses umgewandelt.

  • Serialisierung: Ein Lock schützt jede Lese-Schreib-Rundreise auf der einzelnen stdin-Pipe; asynchrone Aufrufer gehen durch asyncio.to_thread, sodass die Ereignisschleife niemals auf Subprozess-E/A blockiert.

  • Absturzwiederherstellung: stderr wird in einem Hintergrundthread abfließen gelassen, Kind-EOF/-Absturz wird erkannt, und der Prozess wird beim nächsten Aufruf transparent neu gestartet. Timeouts werden bewusst nicht als Abstürze behandelt; ein langer Indexlauf kann noch arbeiten, und ihn zu töten, würde laufende Arbeit zerstören.

  • Überwachung: Ein fauler Singleton-Supervisor besitzt den Client für die Prozesslebensdauer. Der Start wird durch den ersten Graph-Tool-Aufruf oder durch den Auto-Index-Poller ausgelöst, wenn die Engine-Binärdatei bereits heruntergeladen ist, steigt niemals in die MCP-Schicht auf und überprüft das Tool-Schema der gepinnten Binärdatei, sodass vorgelagerte Abweichungen beim Start und nicht während des Aufrufs erkannt werden.

  • Auto-Neuindizierung ist Git-Signatur-abgefragt, nicht dateisystemüberwacht: Eine Hintergrundaufgabe vergleicht den HEAD und den Dirty-Status jedes indizierten Repositorys, berechnet durch Ausführen von git außerhalb der Engine, sodass ein Leerlauf-Check kein Engine-Lock kostet. Ein Commit löst eine Neuindizierung aus. Solange der Baum schmutzig ist, wird das Repository in jedem Zyklus neu indiziert, da git status meldet, welche Dateien sich geändert haben, und nicht, was in ihnen ist, sodass wiederholte Bearbeitungen einer bereits geänderten Datei byteidentische Ausgaben erzeugen, die kein billigerer Fingerabdruck unterscheiden kann. Git wird mit deaktiviertem core.fsmonitor und einer bereinigten Umgebung ausgeführt, da diese Einstellung ein Programm benennt, das Git andernfalls aus einem überwachten Repository zeitgesteuert ausführen würde.

  • Ein Tor für jede Store-Mutation: Manuelle Indizes auf allen drei Oberflächen, der Poller und die Projektlöschung durchlaufen alle eine einzelne geleaste Zeile in der Speicherdatenbank. HTTP und STDIO sind separate Prozesse mit separaten Engine-Kindern über einem gemeinsamen Engine-Store, sodass ein prozessinternes Lock sie nicht umfassen kann. Das Lease wird freigegeben, wenn der Engine-Aufruf tatsächlich zurückkehrt, und nicht, wenn sein Aufrufer aufhört zu warten: Eine abgebrochene Anfrage kann den Store nicht an einen anderen Prozess übergeben, während die Engine noch darauf schreibt.

Sicherheit & Ratenbegrenzung

  • Zwei-Modus-Authentifizierungstor: Schlüssellos auf Loopback (127.0.0.1), MARM_API_KEY (Bearer) obligatorisch, sobald der Server netzwerkexponiert ist (SERVER_HOST=0.0.0.0, Docker). --generate-key erzeugt einen. Standardmäßig sicher, kein Einrichtungsaufwand lokal.

  • IP-basierte Ratenbegrenzung mit gleitenden Fenstern und temporären Sperren, abgestimmt über CLI-Voreinstellungen anstelle eines Konfigurationslabyrinths (Tabelle unten).

  • Lokal zuerst: Alles lebt unter ~/.marm/; keine Cloud-Synchronisation, keine Telemetrie, kein externer Speicher.

  • Anmutiges Herunterfahren: SIGTERM/SIGINT-Handler leeren und schließen den Verbindungspool sauber, und ein internes Ereignissystem führt Automatisierungs-Callbacks mit pro-Callback-Fehlerisolierung und Timeouts aus, sodass ein schlechter Hook den Server nicht blockieren kann.

Schwarm- & Multi-Agent-Voreinstellungen

Flag

Ratenbegrenzung

Schreibwarteschlange

Verwendung bei

(none)

80 RPM

aktiviert

Normaler lokaler Gebrauch und kleine 3-5 Agenten-Setups

--swarm

200 RPM

aktiviert

Gemeinsamer HTTP-Server, etwa 15-30 Agenten je nach Schreibstil

--swarm-max

600 RPM

aktiviert

Schwererer lokaler/privater Schwarm, etwa 50-100 Agenten je nach Schreibstil

--trusted

deaktiviert

aktiviert

Nur für private/vertrauenswürdige Bereitstellungen

--rate-limit-rpm N

N RPM

unverändert

Benutzerdefinierte Überschreibung; 0 deaktiviert die Begrenzung

Die Schreibwarteschlange serialisiert Speicherschreibvorgänge unabhängig von der Voreinstellung; die Schwarm-Flags passen die HTTP-Ratenbegrenzung zusätzlich an. Die Warteschlange steuert die Schreibreihenfolge; Konsolidierung und Kompression sind separate Speicherverwaltungsebenen. Dieser Stack (WAL + Pooling + ein serialisierter Schreiber + RPM-Voreinstellungen) ist bewusst auf „SQLite, viele Agenten, eine Maschine“ beschränkt; verteilter Multi-Knoten-Speicher liegt außerhalb des aktuellen Designs.

Selbstwartende Dokumentation

Gepackte Dokumentationen werden beim Start in den Speicher-Namespace marm_system indiziert und alle 50 Tool-Aufrufe aktualisiert, wobei eine Quell-Datei-Hash-Verfolgung verwendet wird, sodass unveränderte Dokumente übersprungen und geänderte oder gelöschte Zeilen neu indiziert werden. Verbundene Agenten können MARM-Nutzungsfragen mit marm_smart_recall beantworten, anstatt dass Sie ihnen Dokumentationen einfügen.

Konfigurationsreferenz

Variable

Standard

Was es steuert

SERVER_HOST

127.0.0.1

Bind-Adresse; 0.0.0.0 legt den Server offen und macht MARM_API_KEY erforderlich

SERVER_PORT

8001

HTTP-Port

MARM_API_KEY

(leer)

Bearer-Schlüssel für netzwerkexponierte Bereitstellungen

MARM_DB_PATH

~/.marm/marm_memory.db

Speicherort der Gedächtnisdatenbank

MARM_CONCEPT_DB_PATH

~/.marm/index/marm_index.db

Speicherort der Konzeptgraph-Datenbank

MARM_PROJECT / MARM_PLATFORM

(automatisch erkannt)

Überschreibt die Projekt-/Plattformzuordnung

MARM_RATE_LIMIT_RPM

80

Anfragen pro Minute pro IP (Voreinstellungen überschreiben)

WRITE_QUEUE_ENABLED

1

Schreibvorgänge durch einen Worker serialisieren

FTS_CANDIDATE_LIMIT

200

BM25-Kandidaten, die vor dem semantischen Neuranning abgerufen werden; erhöhen für Stores mit schwachem Keyword-Überlapp, senken um Ergebnisse auf die nächsten Keyword-Übereinstimmungen zu beschränken

RECALL_SCAN_LIMIT

10000

Obergrenze für den semantischen Fallback-Scan; recall_scan_truncated=true in Antworten bedeutet, dass sie erreicht wurde

FTS_QUERY_MODE

or_nostop

Wie das semantische Abrufen seine Keyword-Abfrage aufbaut: or_nostop ignoriert Füllwörter und matcht dann jeden verbleibenden Begriff, or matcht jeden Begriff, and erfordert jeden Begriff (das Verhalten vor 2.31.0). Die exakte/lexikalische Spur erfordert immer jeden Begriff.

FTS_EXTRA_STOPWORDS

(leer)

Durch Kommas getrennte zusätzliche Wörter, die beim Erstellen von Keyword-Abfragen ignoriert werden sollen, für Begriffe, die in Ihrem Store so häufig vorkommen, dass sie kein Signal liefern

HYBRID_SEARCH_TEXT_WEIGHT

0.05

Wie stark der Keyword-Score das Ranking beeinflusst. Aus einem Benchmark-Sweep gesetzt; die Genauigkeit erreicht Spitzenwerte zwischen 0.04 und 0.08 und fällt oberhalb von 0.10 stark ab. Bei 0.0 schränkt das Keyword-Matching ein, welche Erinnerungen berücksichtigt werden, ordnet sie aber nicht neu.

FTS_LONE_HIT_SCORE

1.0

Keyword-Score, der verwendet wird, wenn nur eine Erinnerung matcht oder wenn alle Matches gleich sind. Senken Sie ihn in kleinen Stores, wenn ein einzelner Keyword-Match nicht als perfekt zählen soll.

SEMANTIC_SEARCH_ENABLED

1

Auf 0 setzen, um ohne das Embedding-Modell auszuführen: Es wird nichts geladen, keine Embeddings geschrieben, und das Abrufen fällt auf Keyword-Matching zurück. Nützlich auf Hosts mit wenig Arbeitsspeicher oder um zu sehen, wie sich das Abrufen verhält, wenn das Modell nicht verfügbar ist. marm-memory doctor meldet, wenn es ausgeschaltet ist.

TEMPORAL_WEIGHT / TEMPORAL_HALF_LIFE_DAYS

0.1 / 30

Stärke und Abfall des Aktualitäts-Boosts

CONSOLIDATION_ENABLED

0

Deduplizierung beim Schreiben + semantische Zusammenführung

CONSOLIDATION_THRESHOLD

0.92

Kosinus-Ähnlichkeit, die zum Zusammenführen von Near-Duplikaten erforderlich ist. Wird nur mit der Bedeutungsähnlichkeit verglichen, nicht mit dem gemischten Ranking-Score

COMPACTION_ENABLED

0

Hintergrund-Cluster-Erkennung + agentenunterstützte Kompaktierung

COMPACTION_TRIGGER_COUNT

5

Schreibvorgänge pro Sitzung vor einem Kompaktierungsdurchlauf

COMPACTION_SIMILARITY_THRESHOLD / COMPACTION_MIN_CLUSTER_SIZE / COMPACTION_MIN_AGE_HOURS

0.88 / 3 / 24

Cluster-Erkennungsschwellen

COMPACTION_STAGING_TTL_HOURS

168

Wie lange bereitgestellte Zusammenfassungen warten, bevor sie ablaufen

GRAPH_ENABLED

true

Ausschalter für die 5 Code-Graph-Tools

GRAPH_AUTO_INDEX

true

Automatische Neuindizierung von Repos, die sich bereits im Code-Graph befinden. Ein gespeicherter Schalter von projects auto off oder marm_graph_index(action="auto_off") überschreibt dies, sodass ein hier gesetzter Wert nicht wieder aktivieren kann, was ein Benutzer deaktiviert hat

GRAPH_AUTO_INDEX_INTERVAL

30

Sekunden zwischen Git-Signatur-Prüfungen pro Repo. Minimum 5

GRAPH_AUTO_INDEX_FULL_INTERVAL

300

Sekunden zwischen Neuindizierungen für ein Verzeichnis, das kein Git-Repo ist, wo keine günstige Änderungsprüfung existiert. Minimum 60

GRAPH_AUTO_INDEX_MODE

moderate

Indextiefe für automatische Neuindizierungen: full, moderate oder fast. Alles andere warnt und fällt zurück

GRAPH_AUTO_INDEX_LEASE_SECONDS

120

Wie lange das Indizierungs-Gate im Besitz bleibt, sobald es nichts mehr erneuert. Ein laufender Index erneuert seinen eigenen Lease, daher begrenzt dies, wie lange ein abgebrochener Prozess die Indizierung blockiert, nicht wie lange ein Index dauern kann

GRAPH_AUTO_INDEX_PROJECT_TTL

300

Wie lange die Liste der überwachten Projekte vertrauenswürdig ist, bevor sie erneut aus der Engine gelesen wird

CONCEPT_BUILD_ROW_CAP

500

Speicherzeilen, die pro Seite während eines Konzeptgraphen-Aufbaus gelesen werden. Keine Obergrenze für den Aufbau: Jede Speicherung im Gültigkeitsbereich wird auf jeden Fall gelesen

CONCEPT_AUTO_INDEX

true

Automatische Konzeptindizierung neuer Erinnerungen. false, 0, no oder off stoppt den Worker und belässt Builds manuell. Schreibvorgänge zeichnen weiterhin Warteschlangenzeilen auf, so oder so

CONCEPT_INDEX_DEBOUNCE_SECONDS

30

Ruhephase nach einem Schreibvorgang, bevor die Indizierung beginnt, sodass ein Burst zu einem Durchlauf wird

CONCEPT_INDEX_BATCH_SIZE

20

Pro Batch indizierte Erinnerungen, begrenzt auf 500. Eine Senkung verringert die Konkurrenz nicht; es wurde etwas schlechter gemessen

CONCEPT_INDEX_BATCH_PAUSE_MS

250

Pause zwischen Batches beim Abarbeiten eines Rückstaus. Reduziert das Worst-Case-Recall während der Indizierung von ~270ms auf ~80ms bei etwa 18% längerer Abarbeitung. 0 deaktiviert es

CONCEPT_INDEX_LEASE_SECONDS

300

Wie lange eine beanspruchte Indizierungsaufgabe im Besitz bleibt, sobald nichts sie erneuert. In Arbeit befindliche Aufgaben erneuern ihren eigenen Lease, daher begrenzt dies, wie lange ein abgebrochener Prozess Aufgaben hält, nicht wie lange ein Batch dauern kann. Zurückgewonnene Aufgaben verbrauchen keinen Versuch

CONCEPT_INDEX_MAX_ATTEMPTS

3

Fehlgeschlagene Versuche, bevor eine Erinnerung mit ihrem Fehler abgelegt wird, anstatt sie erneut zu versuchen

Fehlerbehebung

Der Jina v2 Small Standard verwendet standardmäßig 512-dimensionale Embeddings; ältere all-MiniLM-L6-v2-Daten sind 384-dimensional und müssen neu eingebettet werden. Stoppen Sie jeden MARM HTTP- und STDIO-Prozess und führen Sie dann aus:

marm-memory maintenance embeddings migrate

Es bettet Speicher, Chunks und alle vorhandenen Concept-Graph-Vektoren neu ein (Notebook-Notizen enthalten keine Embeddings mehr), meldet den Fortschritt, überprüft beide Datenbanken und ist nach einer Unterbrechung fortsetzbar. Es weigert sich zu starten, wenn ein HTTP-Server läuft; STDIO-Prozesse können nicht zuverlässig erkannt werden und müssen manuell gestoppt werden.

Chunked Memories reparieren

Erinnerungen über 500 Wörter werden auch als kleinere Chunks gespeichert. Die Chunk-Größe hat sich zwischen den Versionen geändert, und die obige Migration bettet Chunks neu ein, ohne sie neu zu splitten, sodass ältere Chunks veraltete Grenzen behalten. Stoppen Sie jeden MARM-Prozess und führen Sie dann aus:

marm-memory maintenance chunks rechunk

Es splittet veraltete Chunks neu, füllt fehlende Chunks aus einer unterbrochenen Schreibaktion auf und entfernt Chunks von Erinnerungen, die jetzt unter dem Schwellenwert liegen. Bereits korrekte Erinnerungen werden ohne Laden des Encoders übersprungen, sodass erneutes Ausführen nichts kostet. Gleicher Live-Server-Schutz wie oben, zusätzlich verweigert es, wenn gespeicherte Vektoren nicht zum konfigurierten Embedding-Modell passen: In diesem Fall zuerst migrieren. Der Abruf funktioniert auch ohne dies, nur weniger genau bei langen Erinnerungen.

Server startet nicht

  • Python-Version prüfen: python --version (muss 3.10+ sein)

  • Prüfen, ob Port 8001 belegt ist: lsof -i :8001 (macOS/Linux) oder netstat -ano | findstr :8001 (Windows)

  • Auf Berechtigungsfehler im Home-Verzeichnis prüfen (~/.marm/ muss les- und schreibbar sein)

  • Siehe plattformspezifische Fehlerbehebung: INSTALL-DOCKER.md, INSTALL-WINDOWS.md, INSTALL-MACOS.md, INSTALL-LINUX.md

STDIO-Verbindung schlägt fehl

  • Stellen Sie sicher, dass marm-mcp-stdio nach der pip-Installation in Ihrem PATH ist: marm-mcp-stdio --help

  • Alternativ verwenden Sie: python -m marm_mcp_server.server_stdio

  • Überprüfen Sie die Dokumentation des KI-Clients auf STDIO-Transportanforderungen

  • Versuchen Sie die direkte Ausführung, um Fehlermeldungen zu sehen: python -m marm_mcp_server.server_stdio

KI-Client kann keine Verbindung zu MARM herstellen

  • Überprüfen Sie, ob der Server läuft, mit curl http://localhost:8001/health

  • Prüfen Sie, ob die Firewall Port 8001 blockiert

  • Für STDIO: verwenden Sie marm-mcp-stdio (Konsolenskript) oder python -m marm_mcp_server.server_stdio

  • Starten Sie sowohl Server als auch KI-Client neu

Tools werden im KI-Client nicht angezeigt

  • Überprüfen Sie den HTTP-Modus mit curl http://localhost:8001/health

  • Überprüfen Sie die Server-Logs auf Initialisierungsfehler

  • Trennen Sie die Verbindung des KI-Clients und stellen Sie sie erneut her, um die Tool-Liste zu aktualisieren

  • Sowohl HTTP als auch STDIO stellen 14 Tools bereit: 7 Kern-Speicher-/Logging-/Notebook-/Kompaktierungstools, 5 gebündelte Code-Graph-Tools und 2 Concept-Graph-Tools

Graph-Tools geben graph backend unavailable zurück

  • Bestätigen Sie, dass GRAPH_ENABLED nicht auf false gesetzt ist (betrifft sowohl HTTP als auch STDIO; Graph-Tools haben volle Parität über beide Transporte hinweg)

  • Die erste Graph-Nutzung kann länger dauern, während der festgelegte Codebase-Memory-Engine startet oder lokal heruntergeladen wird

  • In Docker ist die Graph-Engine-Binärdatei im Image enthalten; lokale pip-Installationen können sie bei der ersten Graph-Nutzung abrufen

  • Kern-Speicher-Tools funktionieren weiterhin, selbst wenn der Graph-Start fehlschlägt

Concept-Tools geben entities_extracted: 0 zurück

  • Stellen Sie zunächst sicher, dass ein scoped Concept-Build tatsächlich Erinnerungen mit extrahierbaren Entitäten enthält.

  • Führen Sie marm-memory knowledge status aus; wenn es eine fehlende Laufzeit oder ein fehlendes Modell meldet, reparieren Sie die Installation mit python -m pip install -U --force-reinstall marm-mcp-server.

Neue Erinnerungen werden im Graph nicht angezeigt

  • Führen Sie marm-memory knowledge status aus. index_queue.pending gibt an, wie viele Erinnerungen warten; index_queue.parked gibt an, wie viele aufgegeben haben. auto_index: false bedeutet, dass die Indizierung ausgeschaltet ist.

  • Warten Sie das Debounce-Intervall (standardmäßig 30 Sekunden) plus die Extraktionszeit ab. Ein Schreib-Burst wird als ein Durchlauf indiziert, nicht pro Erinnerung.

  • Überprüfen Sie, dass CONCEPT_AUTO_INDEX nicht auf false, 0, no oder off gesetzt ist.

  • Ein Graph, der auf eine Neuerstellung wartet, wird nicht indiziert. Wenn die Konsole oder marm-memory knowledge status rebuild_required meldet, führen Sie marm_concept_build(search_all=True) einmal aus; wartende Erinnerungen werden danach aufgenommen.

  • Die automatische Indizierung deckt nur Erinnerungen ab, die seit dem Upgrade geschrieben wurden. Führen Sie einmal einen Build aus, um alle älteren einzubringen.

  • Eine Erinnerung, die dreimal bei der Extraktion fehlschlägt, wird geparkt, anstatt endlos wiederholt zu werden. Der Grund wird mit der Aufgabe aufgezeichnet.

Code-Änderungen werden im Code-Graph nicht angezeigt

  • Führen Sie marm-memory projects auto status aus. enabled: false bedeutet, dass die automatische Neuindizierung ausgeschaltet ist; source: override bedeutet, dass ein gespeicherter Schalter sie ausgeschaltet hat, nicht die Umgebung.

  • Das Repository muss einmal indiziert werden, bevor es überwacht wird. marm-memory projects list zeigt an, was eingeschrieben ist.

  • Warten Sie das Intervall (standardmäßig 30 Sekunden) plus die Indexzeit ab. Ein Commit wird bei der nächsten Prüfung aufgenommen.

  • Ein Projekt, das aus der Konsole gelöscht wurde, bleibt absichtlich unterdrückt, sodass eine veraltete Überwachungsliste es nicht neu erstellen kann. Eine explizite Indizierung schreibt es erneut ein.

  • Die automatische Indizierung benötigt die Graph-Engine, die inaktiv bleibt, bis die Engine-Binärdatei heruntergeladen wurde. Jeder Graph-Tool-Aufruf lädt sie einmal herunter.

Ein Index gibt index_in_progress zurück

  • Ein anderer MARM-Prozess hält das Indexierungs-Gate, normalerweise der Poller des anderen Transports oder ein Konsolen-Index-Job. Das Löschen eines Projekts meldet dasselbe, da ein Löschen während einer Indizierung rückgängig gemacht würde. Führen Sie es in einem Moment erneut aus.

Ein Build gibt build_in_progress zurück

  • Ein anderer MARM-Prozess schreibt den Graphen, normalerweise der Indexierungs-Worker des anderen Transports. Builds sind kurz, es sei denn, es handelt sich um einen vollständigen Neubau; führen Sie es in einem Moment erneut aus.

Ein Build gibt lock_lost zurück

  • Der Build war lange genug blockiert, dass ein anderer Prozess den Graphen übernommen hat, sodass er abgebrochen wurde, anstatt parallel zu schreiben. Normalerweise ein angehaltener Rechner oder eine Debugger-Pause. Was vor dem Abbruch indiziert wurde, bleibt erhalten, und ein erneuter Build schließt den Rest ab.

Erinnerungen werden nicht gespeichert

  • Überprüfen Sie, ob das Verzeichnis ~/.marm/ existiert und Schreibrechte hat

  • Überprüfen Sie den verfügbaren Speicherplatz

  • Testen Sie mit einer einfachen Erinnerung: Bitten Sie die KI, eine einzelne Zeile zu speichern, und überprüfen Sie mit marm_log_show

  • Für den HTTP-Modus überprüfen Sie die Server-Gesundheit mit curl http://localhost:8001/health

Suche gibt keine Ergebnisse zurück

  • Überprüfen Sie, ob Erinnerungen existieren: verwenden Sie marm_log_show, um Einträge aufzulisten

  • Verwenden Sie search_all=True, um in allen Sitzungen zu suchen

  • Versuchen Sie einfachere, allgemeinere Suchanfragen

  • Warten Sie einige Sekunden; die erste semantische Suche lädt das ML-Modell

Erinnerungen erscheinen und verschwinden dann

  • Überprüfen Sie, ob MARM neu gestartet wurde oder abgestürzt ist (Daten bleiben in ~/.marm/ erhalten)

  • Überprüfen Sie, ob der Speicherplatz nicht vollgelaufen ist

  • Überprüfen Sie die System-Logs auf Datenbankfehler

Verlorene oder beschädigte Daten

  • Stoppen Sie den Server sofort

  • Überprüfen Sie das Verzeichnis ~/.marm/ auf Sicherungskopien (falls Sie sie erstellt haben)

  • Stellen Sie aus dem Backup wieder her: Kopieren Sie Ihr Backup ~/.marm/ zurück in das Home-Verzeichnis

  • Starten Sie den Server neu

Datenbank gesperrt Fehler

  • Schließen Sie alle KI-Client-Verbindungen

  • Stoppen Sie den Server: Strg+C

  • Sichern Sie das gesamte Datenbankverzeichnis: cp -r ~/.marm ~/.marm.backup

  • Überprüfen Sie, ob Prozesse die Datenbank halten: lsof ~/.marm/marm_memory.db (macOS/Linux) oder Task-Manager (Windows)

  • Wenn ein Prozess die Sperre hält, beenden Sie ihn

  • Überprüfen Sie die Datenbankintegrität: sqlite3 ~/.marm/marm_memory.db "PRAGMA integrity_check;"

  • Wenn die Integritätsprüfung fehlschlägt, stellen Sie aus Ihrem Backup wieder her

  • Wenn die Integritätsprüfung bestanden wird, sollte die Sperre freigegeben sein; starten Sie den Server neu

Langsame Suchergebnisse

  • Die erste Suche ist langsamer (Modell wird von der Festplatte geladen); nachfolgende Suchen sind schneller

  • Große Datenbanken (1000+ Erinnerungen) können einige Sekunden dauern

  • Suchen einschränken: verwenden Sie limit=10 anstelle unbegrenzter Ergebnisse

  • Verwenden Sie marm_summary, um alte Sitzungen zu komprimieren

Server verbraucht zu viel Speicher

  • Notizbücher mit vielen Einträgen können sich ansammeln; verwenden Sie marm_notebook(action="clear"), um aktive Einträge zu bereinigen

  • Schließen Sie ungenutzte KI-Client-Verbindungen

  • Verwenden Sie marm_compaction(action="review"), um bereitgestellte Komprimierungszusammenfassungen zu überprüfen, wenn die Komprimierung aktiviert ist

Fehler

Ursache

Lösung

address already in use

Port 8001 belegt

Prozess auf 8001 beenden oder anderen Port verwenden

permission denied: ~/.marm/

Datenbankverzeichnis nicht beschreibbar

chmod 755 ~/.marm/ oder Besitzer überprüfen

module not found: core.memory

Fehlende Abhängigkeiten

Neuinstallation von marm-mcp-server/: pip install -e ".[dev]"

database is locked

Mehrere Prozesse greifen auf DB zu

Andere Verbindungen schließen, Server neu starten

embedding model not found

Semantisches Suchmodell nicht heruntergeladen

Erster Durchlauf dauert; geduldig sein, Internetverbindung überprüfen

Fragen zu Speicherverhalten, Transporten, unterstützten Clients, Komprimierung und Backup finden Sie im FAQ.

Sternenverlauf

Mitwirken

MARM heißt Mitwirkende auf jeder Ebene willkommen. Code hilft, aber genauso Dokumentation, Setup-Notizen, Client-Tests, Fehlerberichte, Benchmarks und echtes Workflow-Feedback von Menschen, die täglich KI-Tools verwenden.

Gute Möglichkeiten, um zu helfen:

  • Testen Sie MARM mit mehr MCP-Clients, IDE-Agenten und Betriebssystemen

  • Verbessern Sie Dokumentation, Screenshots, Beispiele und plattformspezifische Setup-Notizen

  • Melden Sie Fehler oder verwirrende Installationsschritte mit klaren Reproduktionsdetails

  • Teilen Sie Speicher-Workflows, Agentengewohnheiten und Tool-Ideen aus der Praxis

  • Schauen Sie sich offene Issues an

💡 Möchten Sie Ihren Namen auf dieser Liste sehen? Schauen Sie sich unseren CONTRIBUTING.md-Leitfaden an, um loszulegen!

Treten Sie der MARM-Community bei

Helfen Sie mit, die Zukunft des KI-Gedächtnisses zu bauen – keine Programmierkenntnisse erforderlich!

Verbinden: MARM Discord | GitHub Discussions

Lizenz & Nutzungshinweis

Copyright © 2026 Ryan A. Lyell. MARM wird unter der Apache 2.0 Lizenz veröffentlicht (siehe NOTICE für die Urheberrechtsangabe), und Forks, Experimente und Integrationen sind willkommen. MARM enthält auch Open-Source-Komponenten von Drittanbietern wie codebase-memory-mcp unter MIT; siehe THIRD_PARTY_NOTICES.md für die Quellenangabe. Wenn Sie darauf aufbauen, machen Sie bitte inoffizielle Versionen leicht von den vom offiziellen MARM-Repository veröffentlichten Releases unterscheidbar, damit die Benutzer wissen, was sie installieren.

Projektdokumentation

Nutzungsanleitungen

  • README.md – Diese Datei: vollständige Nutzungsanleitung, Tool-Referenz, Workflows und Architektur

  • PROTOCOL.md – MCP-Betriebsprotokoll

  • FAQ.md – Antworten auf häufige Fragen zur Verwendung von MARM

MCP-Server-Installation

Projektinformationen

Available Tools

14 tools
marm_code_lookupA
🔎 Find code: symbols/definitions, text patterns, or a symbol's source.

Use INSTEAD OF grep/glob. `kind=auto` picks: a qualified_name reads source;
otherwise it searches the graph by name/keyword. Set `kind=text` to grep code,
`kind=snippet` to read a symbol's source, `kind=symbol` to force graph search.

Parameters:
- query: symbol name, natural-language phrase, code/text pattern, or a qualified_name
- project: project name; omit to auto-resolve
- kind: auto | symbol | text | snippet (default auto)
- regex: for text search, treat query as a regex (default False)
- file_pattern: glob to scope search, e.g. "*.py" (optional)
- limit: max results, 1-200 (default 20)

Returns: graph lookup response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoauto
limitNo
queryYes
regexNo
projectNo
file_patternNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It discloses that the tool returns a 'graph lookup response, or a graph-unavailable error if the graph backend is disabled or failed to start.' It also explains the behavior of kind=auto based on query type. However, it does not detail the structure of the response or mention any authentication or rate limits, which would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an emoji, bolded key terms, a concise overview, and a bulleted parameter list. Every sentence adds value, and the length is appropriate for the complexity of the tool. It is front-loaded with the most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description effectively explains the tool's functionality and parameters, and it mentions the return type. Given the complexity (6 parameters, no output schema, no annotations, and many sibling tools), it is largely complete. However, it could briefly mention what a 'graph lookup response' contains or provide an example to further aid understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema. For each parameter, it explains its purpose and behavior: e.g., query can be 'symbol name, natural-language phrase, code/text pattern, or a qualified_name'; kind options are detailed; regex is for text search; project can be omitted for auto-resolve; file_pattern is a glob. With 0% schema coverage, the description fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Find code: symbols/definitions, text patterns, or a symbol's source.' It distinguishes itself by saying 'Use INSTEAD OF grep/glob,' and explains the different modes (auto, symbol, text, snippet), making it easy to understand what the tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool and its alternatives: 'Use INSTEAD OF grep/glob.' It also explains the behavior of each kind value, e.g., 'kind=auto picks: a qualified_name reads source; otherwise it searches the graph by name/keyword. Set kind=text to grep code, kind=snippet to read a symbol's source, kind=symbol to force graph search.' This gives clear context for selecting the appropriate mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_compactionA
Compact related memories into a single summary to reduce context bloat.

Workflow: status/candidates → stage → review → apply/discard

action="status"     — check if compaction candidates exist (run first)
action="candidates" — get pending candidates with source previews; each includes a ready-to-use prompt
action="stage"      — submit your summary: {candidate_id, suggested_summary}; source_memory_ids optional
action="review"     — inspect staged summaries before committing
action="apply"      — commit a staged summary; source memories are marked compacted
action="discard"    — reject a staged summary without touching source memories
ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
summariesNo
candidate_idNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses key behaviors: apply marks source memories as compacted, discard leaves source memories untouched, and candidates include a 'ready-to-use prompt.' This is meaningful contextual information beyond the schema, though it does not mention all side effects or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a workflow arrow, and a bulleted action list. Every sentence provides useful information without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has complexity (six actions, multiple parameters) and no output schema, so the description should clarify return values and expected behavior for each action. The workflow is explained, but the response/return format for actions like status or candidates is not described, leaving the user guessing about what data comes back. This is a significant omission for a stateful workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains action values (status, candidates, stage, etc.) and the candidate_id parameter in context. However, the summaries parameter is never explicitly described, leaving ambiguity about its structure and usage (likely for batch apply, but not stated). This is a noticeable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the tool's exact purpose: 'Compact related memories into a single summary to reduce context bloat.' The verb (compact) and resource (memories) are clear, and the workflow action list distinguishes it from sibling tools like marm_log or marm_smart_recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear workflow (status/candidates → stage → review → apply/discard) and tells the user to run status first. It gives context for each action but does not explicitly name alternative tools or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_buildA
🕸️ Extract entities/relationships from memory content into the concept graph.

Scope with session_name or project for a targeted build, or pass
search_all=True for everything (row-capped). Links extracted entities to
marm-graph code symbols when available. Call this before marm_concept_recall
— there's no data until a build has run at least once.

Parameters:
- session_name: scope extraction to this session; omit with search_all=True
- search_all: extract across all sessions, row-capped (default False)
- project: scope extraction to this project (optional)
- run_id: optional Console build-run ID for status polling

Returns: entities_extracted, relationships_created, code_links_created, duration_ms
ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNo
projectNo
search_allNo
session_nameNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes extraction of entities/relationships, code linking, row-capping for search_all, and return fields. Lacks details on overwrite/durability behavior, but overall informative for a build tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured with bullet-like parameter list and clear action verb. The emoji is non-essential but not harmful. Could be slightly tighter by removing redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, manually lists return values. Covers scoping options, linking behavior, and prerequisite ordering. Missing error conditions and permissions, but adequate for a build tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description compensates fully by explaining the purpose and interaction of all four parameters (session_name, search_all, project, run_id) beyond their titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (extract entities/relationships) and the resource (concept graph). Distinguishes from sibling marm_concept_recall by specifying the ordering dependency.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains scoping via session_name/project or search_all=True, and advises calling this before marm_concept_recall, providing clear when-to-use and when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_recallA
🔎 Search the concept graph: entities, their relationships, and linked code.

Query as a bare concept name for a lookup, or phrase it as "related to X"
to emphasize traversal — both route from query shape alone. Returns empty
lists (not an error) when marm_concept_build hasn't run yet or marm-graph
has no matching code symbols.

Parameters:
- query: concept name, or a "related to X" style ask
- session_name: scope to this session; omit to search across all (optional)
- limit: max entities/relationships returned, 1-100 (default 10)
- depth: max hop distance to traverse, 1-5 (default 1 = direct neighbors only)
- direction: outgoing | incoming | both (default both)
- project: scope to this project; entities with the same name in
  different projects are distinct nodes; omit to search across all (optional)
- platform: scope to this client/platform; omit to search across all (optional)

Returns: entities, related_entities, linked_code
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
limitNo
queryYes
projectNo
platformNo
directionNoboth
session_nameNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations were provided, so the description must carry the full burden. It discloses that returns empty lists (not errors) when the graph hasn't been built or no matches exist, which sets correct expectations. It does not explicitly state read-only behavior, but that is implied from the search nature. This is adequate but could be improved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief paragraph followed by bullet points for parameters. It uses formatting (emoji, bold) to aid readability. While it could be slightly more concise, it doesn't waste words and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description explains inputs well but the return structure is only briefly mentioned ('Returns: entities, related_entities, linked_code') without further detail on the shape or content. This is a gap, but the tool's purpose is still understandable. It meets minimum viability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema coverage is 0%, so the description must fully explain parameters. It does so for all 7 parameters: each has a clear purpose, default values, and acceptable ranges (e.g., limit 1-100, depth 1-5, direction enum). It adds meaning beyond the schema, which only defines types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the concept graph for entities, relationships, and linked code. It uses a specific verb (search, query) and resource (concept graph). However, it does not explicitly distinguish this tool from siblings like marm_smart_recall or marm_graph_trace, leaving ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on query styles ('bare concept name' vs 'related to X'), which helps with when to use each. However, it lacks explicit advice on when to choose this tool over siblings (e.g., vs marm_smart_recall for smarter retrieval, or marm_graph_trace for tracing). No exclusions or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_deleteA
🗑️ Delete a log session, log entry, or notebook entry

type="log" + session_name: delete specific entry by id or topic
type="log" (no session_name): delete entire session and all its entries
type="notebook": delete notebook entry by name
ParametersJSON Schema
NameRequiredDescriptionDefault
typeYes
targetYes
projectNo
platformNo
session_nameNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description adequately discloses the destructive behavior and scope of deletion. It explains what gets deleted based on parameter combinations, but does not mention irreversibility or cascading effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses bullet points and emojis, which improves readability but adds length. It is clear but slightly verbose for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delete tool, the description provides sufficient context about what can be deleted and how. However, missing details on the 'target' parameter and no output schema reduce completeness slightly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies the interaction between 'type' and 'session_name' parameters, but does not explain the 'target', 'project', or 'platform' parameters. With 0% schema coverage, the description partially compensates but leaves gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states that the tool deletes log sessions, log entries, or notebook entries. It distinguishes between different deletion behaviors based on the 'type' and 'session_name' parameters, making the purpose clear and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear patterns for when to use each variation: deleting a specific log entry, deleting an entire log session, or deleting a notebook entry. It implicitly guides the agent to use other tools for non-deletion operations, but does not explicitly mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_architectureA
🏛️ High-level architecture overview: node/edge breakdown, modules, and schema.

One-shot orientation for a project — the de-facto module clusters, package
structure, and the graph schema (node labels + properties) folded in.

Parameters:
- project: project name; omit to auto-resolve

Returns: graph architecture response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the failure mode: 'graph-unavailable error if the graph backend is disabled or failed to start', and also notes that omitting the project parameter auto-resolves. This gives the agent useful expectations for both success and error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact and well-organized: purpose in the first line, a clarifying sentence, then a parameter list and a returns line. Uses whitespace effectively and has no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input, output (graph architecture response), and failure mode (graph-unavailable error). Without an output schema, it doesn't detail the response structure, but for an orientation tool this is a minor gap; the description is sufficient for basic invocation and expectation setting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines a nullable string with a default. The description adds critical meaning: 'project name; omit to auto-resolve' clarifies the parameter's purpose and the behavior when omitted, which is far beyond the schema's minimal info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'High-level architecture overview: node/edge breakdown, modules, and schema' – a specific verb+resource combination that clearly distinguishes this from sibling tools like graph_trace or graph_impact. The noun phrase 'architecture overview' leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as 'one-shot orientation for a project', implying use when a high-level understanding is needed. It doesn't explicitly name alternatives, but the context of sibling tools plus the 'orientation' wording makes the intended use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_impactA
💥 Blast radius of code changes: git diff → affected symbols + risk.

Pass `since` (a git ref/date) or a `base_branch` to compare against. Returns
which symbols a change touches and how far the impact propagates.

Parameters:
- project: project name; omit to auto-resolve
- since: git ref or date to compare from, e.g. HEAD~5, v0.5.0 (optional)
- base_branch: base branch to diff against (default "main")
- depth: impact propagation depth, 1-5 (default 2)

Returns: graph impact response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
sinceNo
projectNo
base_branchNomain

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It usefully mentions the 'graph-unavailable error if the graph backend is disabled or failed to start' and describes the output conceptually. However, it does not explicitly state whether the operation is read-only, whether any mutation occurs, or any authentication requirements, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a bold purpose statement, followed by usage, a bulleted parameter list, and return value. Every sentence earns its place, and the structure is clean and scannable. There is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description explains returns: 'graph impact response, or a graph-unavailable error.' It also clarifies in the opening that the response includes affected symbols and propagation distance. This covers the essentials, though a more structured breakdown of the response object would make it more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It does so thoroughly by listing all four parameters with meanings and examples: 'since: git ref or date to compare from, e.g. HEAD~5, v0.5.0', 'depth: impact propagation depth, 1-5', and defaults for base_branch and project. This adds significant semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Blast radius of code changes: git diff → affected symbols + risk' precisely states the tool's function with a specific verb and resource. It clearly distinguishes from sibling tools like marm_graph_trace (trace specific symbols) and marm_graph_architecture (architecture view) by focusing on impact propagation from a git diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Pass `since` (a git ref/date) or a `base_branch` to compare against' and explains defaults for base_branch and depth. However, it does not explicitly name alternative tools or state when not to use this tool, relying on the purpose to differentiate from siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_indexA
🕸️ Index a code repository into the graph, or check status / list known projects.

Pass `repo_path` to index a repo (returns the project name to use in every
other tool). Omit it to list indexed projects, or pass `project` to check
index status. Call this first — all other graph tools need an indexed project.

Indexed repos are re-indexed automatically in the background. Use
`action="auto_off"` to stop that, `auto_on` to resume, `auto_status` to check.

Parameters:
- repo_path: path to the repository to index; omit to list/status only
- project: existing project name for a status check; omit to auto-resolve
- mode: index depth — full | moderate | fast (default moderate)
- action: auto | index | status | list (default auto; infers from repo_path
  presence), or auto_on | auto_off | auto_status to control automatic
  re-indexing

Returns: graph index/status/list response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNomoderate
actionNoauto
projectNo
repo_pathNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral disclosure burden. It reveals auto-reindexing ('Indexed repos are re-indexed automatically in the background'), the effects of action options, and the possible graph-unavailable error on backend failure. It does not cover permissions or side effects on the repo, but covers the core behaviors well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a summary, parameter list, and return note. It front-loads the main purpose and stays under 200 words, but includes an unnecessary emoji and slightly redundant phrasing. Still, every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 optional params, multiple actions, auto-reindexing), the description covers the purpose, parameter semantics, usage order, and return/error behavior. It lacks concrete examples or response shape, but no output schema exists, so the description is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does by providing per-parameter explanations: repo_path as index vs list/status, project as status check, mode as depth, and action as explicit enum with inference rules. This adds substantial meaning beyond titles and enums.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Index a code repository into the graph, or check status / list known projects.' It also differentiates itself from sibling graph tools by explicitly stating 'Call this first — all other graph tools need an indexed project,' establishing it as the prerequisite setup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Call this first' and explains when to pass vs omit repo_path and project. It outlines the three main action modes (index, status, list) and the auto-reindexing controls, but does not explicitly name alternative tools for other graph operations, relying on the prerequisite statement to imply exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_traceA
🧭 Trace call paths / data flow through the graph from a function.

`direction=inbound` finds callers, `outbound` finds callees, `both` for all.
`mode=data_flow` follows value propagation. `cross_service` attempts HTTP/async
boundaries but does not currently join a client call to its server handler, so
treat an empty result as unknown rather than as "nothing calls this".
Use for impact analysis, dependency tracing, "who calls this".

Parameters:
- function_name: function or method to trace from
- project: project name; omit to auto-resolve
- direction: inbound | outbound | both (default both)
- depth: max hops, 1-5 (default 3)
- mode: calls | data_flow | cross_service (default calls)
- risk_labels: add CRITICAL/HIGH/MEDIUM/LOW risk tiers by hop distance (default True)
- include_tests: also return callers in test files (default False)
- include_evidence: per-hop `strategy` (lsp | language_rule | heuristic | unresolved)
  and `confidence`, so a guessed edge is distinguishable from a resolved one
  (default True). Test callers typically come back heuristic at low confidence

Returns: graph trace response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocalls
depthNo
projectNo
directionNoboth
risk_labelsNo
function_nameYes
include_testsNo
include_evidenceNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well. It discloses the cross_service limitation that an empty result means 'unknown' and defines evidence strategies and confidence levels so guessed edges are transparently distinguishable. Error behavior for an unavailable graph backend is also explicitly documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prepended emoji and short purpose line front-load the key operation. Parameters are grouped in a compact bullet-style list, and each sentence adds either setup, a limitation, or parameter behavior. It is information-dense without being bloated for a tool with 8 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a complex tool with no output schema or annotations: it covers behavioral caveats, direction/mode choices, evidence semantics, and backend failure. The main gap is that the return value is only described as a generic 'graph trace response', and it doesn't define the result graph shape or edge fields. Still, this is quite complete for an agent's invocation needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the tool description covers all 8 parameters with meaningful semantics. It adds constraints like depth 1-5, auto-resolution for project, direction/mode meanings, risk-label behavior, and evidence strategy values. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific action: 'Trace call paths / data flow through the graph from a function,' which clearly identifies the tool's purpose. It also lists concrete use cases ('impact analysis, dependency tracing, who calls this') that help orient an agent. The only slight overlap with the sibling marm_graph_impact is minor because this tool centers on graph traversal from a function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives actionable direction/mode guidance (inbound vs outbound vs data_flow vs cross_service) and states 'Use for impact analysis, dependency tracing, who calls this.' However, it doesn't explicitly state when not to use it, nor name alternatives like marm_graph_impact, marm_code_lookup, or marm_graph_architecture. Clear context exists, but exclusion/alternative guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_entryA
📝 Write a log entry to the active session.

Entries are stored with a date, topic, and summary. If `entry` begins with
"Session: [name]" or "Topic: [name]", the active session switches to that name
and all subsequent entries route there automatically. Entries are also stored
as semantic memories so marm_smart_recall can find them.

Entry format: YYYY-MM-DD-topic-summary (date prefix is optional; auto-tagged if omitted)

Parameters:
- entry: the text to log; plain text or prefixed with "Session:" / "Topic:" to switch sessions
- session_name: override the target session explicitly (optional; active session used if omitted)

Returns: status, message confirming the entry or session switch, entry_id, memory_id
ParametersJSON Schema
NameRequiredDescriptionDefault
entryYes
session_nameNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses key behaviors: entries are stored with date/topic/summary, session switching via prefix, auto-tagging of date, and storage as semantic memories for recall. It also notes return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy but well-structured with bullet points and clear sections. Every sentence adds value, and the purpose is front-loaded. It could be slightly more concise, but it effectively communicates necessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and low schema coverage, the description fully compensates by explaining return values, complex session-switching behavior, and storage side-effects. It is complete enough for an AI agent to use correctly without additional references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully define parameters. It explains that 'entry' is the text to log with optional prefixes for session/topic switching, and 'session_name' is an optional override. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool writes a log entry to the active session, specifying the resource (log entry, active session) and verb (write). It distinguishes from siblings like marm_log_show (read) and marm_smart_recall (recall), which have different verbs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to write a log entry) and gives detailed formatting and session-switching rules. However, it does not explicitly state when not to use it or mention alternatives, though the context from sibling names implies this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_showA
📋 List log sessions or show entries for a specific session.

Two modes depending on whether `session_name` is provided:
- No session_name: returns a summary of all sessions with entry counts
- With session_name: returns all entries for that session, ordered by date descending

Parameters:
- session_name: name of the session to inspect (omit to list all sessions)

Returns (no session_name): status, sessions list with session_name/entry_count, total_sessions
Returns (with session_name): status, session_name, entries list with id/entry_date/topic/summary/full_entry, total_entries
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description carries full burden. Describes two modes and return structures. However, does not disclose if the operation is read-only, or any potential side effects. Since it's a log viewer, likely safe, but not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with bullet points and clear sections. Every sentence adds value without redundancy. Efficiently covers purpose, modes, parameters, and return formats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 1 parameter, no output schema, and no annotations, the description fully covers both modes, parameter behavior, and expected return structure. No gaps in essential information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (`session_name`) with schema coverage 0%. Description fully explains that it's optional and its effect on output. Provides more semantic meaning than the schema alone, which only has type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists log sessions or shows entries for a specific session. Distinguishes two modes based on `session_name` presence. Action verb 'list' and 'show' combined with resource 'log sessions/entries' make purpose concrete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains which mode triggers when `session_name` is provided or omitted. Provides explicit context for each usage. Does not explicitly exclude scenarios or compare to sibling tools, but the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_notebookA
📔 Unified notebook — add, use, show, status, clear, or save

action="add": save or update a scratch entry (name + data required)
action="use": activate entries as instructions (names required, comma-separated)
action="show": list scratch entries for this session with previews
action="status": show currently active entries
action="clear": clear the active entry list
action="save": promote a scratch entry (or new data) into the permanent docs store
ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
nameNo
namesNo
actionYes
projectNo
platformNo
session_nameNomain

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does describe side effects: updating scratch entries, activating instructions, clearing the active list, and promoting to permanent docs. But it omits important behaviors like whether 'clear' also deletes scratch entries, whether 'save' removes the source entry, and session persistence semantics. This is partial transparency, not full.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally well-structured: a single-line summary followed by a bulleted list of actions, each one sentence. There is no fluff, and the format makes the multi-action tool easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 7 parameters, multiple actions, no annotations, and no output schema, yet the description only explains a subset of actions and three of the seven parameters. It lacks the underlying conceptual model (scratch vs. active vs. permanent) and never mentions return values or session-specific behaviors. This is insufficient for an agent to fully anticipate tool behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for action, name, data, and names by specifying their required status per action (e.g., 'name + data required' for add). However, it completely ignores project, platform, and session_name, which are present in the schema with zero documentation. Since schema coverage is 0%, the incomplete parameter guidance creates a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a unified notebook manager with six explicit verbs (add, use, show, status, clear, save). It distinguishes this from sibling tools like marm_log_entry or marm_smart_recall by framing it as a scratch/active entry management tool, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-action instructions imply when to use each subcommand (e.g., 'add' for saving scratch entries, 'use' for activating instructions), and the 'notebook' context implies a general use case. However, it never explicitly contrasts with alternatives or states when not to use this tool, and there is no high-level guidance on sibling tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_smart_recallA
🧠 Recall memories by semantic similarity or keyword match.

Searches stored memories for the most relevant matches to `query`.
Returns a ranked list of results with similarity scores. When a compatible
concept graph exists, the response also includes bounded relationship and
linked-code context without changing memory ranking.

Parameters:
- query: natural language search term or phrase
- session_name: limit search to a specific session (default searches active session)
- limit: maximum number of results to return (default 5)
- search_all: if True, search across all sessions instead of just the active one
- include_logs: if True, include log entries alongside memory results
- detail: controls how much content is returned per result
    1 = summary only (~200 chars)
    2 = extended context (~500 chars)
    3 = full content
- exact_mode: retrieval lane to use
    'auto'     = automatically switch to exact/lexical for syntax-heavy queries
                 (config keys, file paths, CLI commands, API names, code snippets)
    'exact'    = always use deterministic FTS/BM25, no semantic re-ranking
    'semantic' = always use vector similarity regardless of query shape
- project: filter results to a specific project (e.g. "marm-memory"); omit to search all
- platform: filter results to a specific platform (e.g. "claude-code", "cursor"); omit to search all

Returns: status, ranked results, graph_context, and results_count
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
detailNo
projectNo
platformNo
exact_modeNoauto
search_allNo
include_logsNo
session_nameNodefault

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses read-like behavior (search, return ranked results, graph context) but omits details like error handling, performance characteristics, or any destructive potential. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a concise header, summary paragraph, and clear parameter list. Every sentence adds value without redundancy. Uses formatting (emojis, line breaks) for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, no annotations, and no output schema, the description covers purpose, all parameters, and return fields (status, ranked results, graph_context, results_count). Missing details on result structure or graph_context, but largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides detailed explanations for all 9 parameters, including enumeration for 'exact_mode' and implications for 'detail' levels. This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool recalls memories by semantic similarity or keyword match, with a clear verb (searches/recalls) and resource (memories). It distinguishes from siblings like marm_concept_recall by mentioning similarity scores and graph context, but does not explicitly compare.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings. It describes what it does but does not state when NOT to use it or provide alternatives for specific use cases like exact matching or code lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_summaryA
📊 Generate paste-ready context block for new chats

Reads log_entries for the session and returns a formatted markdown summary.
Equivalent to /summary: [session name] command
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It states it reads log_entries and returns a markdown summary, suggesting a read-only operation. However, it does not disclose potential side effects, prerequisites (e.g., session existence), or limits (e.g., entry count). Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a clear headline sentence, a brief explanation, and a command equivalence. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single param, read-only), the description covers the core purpose and output format (markdown). It could mention if it only reads from the provided session or has size limits, but overall it is fairly complete for a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must add meaning. It mentions 'Equivalent to /summary: [session name] command', which hints that session_name is the session's name. This provides some context beyond the bare schema, but still lacks format details or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates a 'paste-ready context block for new chats' by reading log entries and returning a formatted markdown summary. This distinguishes it from siblings like marm_log_show (raw logs) and marm_log_entry (adding entries).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by equating to a /summary command, indicating it should be used to get a compact summary. However, it does not explicitly state when to use vs. alternatives like marm_log_show or marm_smart_recall, nor provide when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev2.40.0
    • Changedmarm_graph_trace2 fields changed
      • addedInput schema / properties / include_evidence
        Added value: +{
        +  "default": true,
        +  "title": "Include Evidence",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_tests
        Added value: +{
        +  "default": false,
        +  "title": "Include Tests",
        +  "type": "boolean"
        +}
  2. 1 tool updatev2.37.0
    • Changedmarm_graph_index1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "auto",
        -  "index",
        -  "status",
        -  "list"
        -]New value: +[
        +  "auto",
        +  "index",
        +  "status",
        +  "list",
        +  "auto_on",
        +  "auto_off",
        +  "auto_status"
        +]
  3. 5 tool updatesv2.35.0
    • Addedmarm_compaction
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_notebook
  4. 7 tool updatesv2.25.0
    • Removedmarm_compaction
    • Changedmarm_concept_recall1 field changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
    • Changedmarm_delete2 fields changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Project"
        +}
    • Removedmarm_graph_architecture
    • Removedmarm_graph_impact
    • Removedmarm_graph_index
    • Removedmarm_notebook
  5. 2 tool updatesv2.21.0
    • Addedmarm_concept_build
    • Addedmarm_concept_recall
  6. 12 tool updatesv2.17.1
    • Addedmarm_code_lookup
    • Changedmarm_compaction6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / candidate_id / title
        Added value: +"Candidate Id"
      • addedInput schema / properties / summaries / title
        Added value: +"Summaries"
      • addedInput schema / title
        Added value: +"marm_compactionArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_delete6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / properties / target / title
        Added value: +"Target"
      • addedInput schema / properties / type / title
        Added value: +"Type"
      • addedInput schema / title
        Added value: +"marm_deleteArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_graph_trace
    • Changedmarm_log_entry5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / entry / title
        Added value: +"Entry"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_entryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_log_show4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_showArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_notebook8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / data / title
        Added value: +"Data"
      • addedInput schema / properties / name / title
        Added value: +"Name"
      • addedInput schema / properties / names / title
        Added value: +"Names"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_notebookArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_smart_recall12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail / title
        Added value: +"Detail"
      • addedInput schema / properties / exact_mode / title
        Added value: +"Exact Mode"
      • addedInput schema / properties / include_logs / title
        Added value: +"Include Logs"
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / platform / title
        Added value: +"Platform"
      • addedInput schema / properties / project / title
        Added value: +"Project"
      • addedInput schema / properties / query / title
        Added value: +"Query"
      • addedInput schema / properties / search_all / title
        Added value: +"Search All"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_smart_recallArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_summary4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_summaryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
  7. 1 tool updatev2.15.2
    • Changedmarm_smart_recall3 fields changed
      • addedInput schema / properties / exact_mode
        Added value: +{
        +  "default": "auto",
        +  "type": "string"
        +}
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  8. 7 tool updatesv2.14.1
    • First observedmarm_compaction
    • First observedmarm_delete
    • First observedmarm_log_entry
    • First observedmarm_log_show
    • First observedmarm_notebook
    • First observedmarm_smart_recall
    • First observedmarm_summary

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation4/5

Tools are mostly distinct: memory recall, logging, session listing, deletion, notebook, summary, compaction, and graph operations each have clear purposes. Minor overlap exists between smart_recall and log_show (both retrieve stored content) and between code_lookup and graph_trace (both explore code), but the descriptions differentiate them well.

Naming Consistency3/5

All tools share the 'marm_' prefixaine, but the naming convention is inconsistent: some use noun phrases (marm_smart_recall, marm_log_entry, marm_graph_architecture), some use bare verbs (marm_delete), and some combine verb+object (marm_code_lookup, marm_log_show). The pattern is not uniform, making it slightly harder to predict tool names.

Tool Count4/5

The stated count is 14, but only 11 tools are documented, which is a notable discrepancy. Even so, the 11 visible tools cover memory management and code-graph analysis without feeling bloated; a handful of tools for each subdomain is reasonable.

Completeness4/5

The surface covers search, logging, notebook CRUD, summaries, compaction, and code-graph analysis (index, lookup, trace, architecture). Missing explicit update operations and a dedicated session-management tool, but these are partially handled via log_entry parameters. Overall well-rounded for a memory + code context server.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for persistent, compounding memory that automatically captures corrections and insights across AI sessions, enabling agents to learn and improve over time.
    5
    371
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.
    12
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server providing persistent memory and context for AI tools, including semantic memory, knowledge graph, and session history to avoid starting from scratch in every conversation.
    35
    14
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that provides AI agents with persistent memory, cross-agent sharing, and context management, enabling them to remember conversations, track complex tasks, and evolve skills across tools.
    2
    MIT