marm-memory
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
Installieren und initialisieren Sie mit Ihren bevorzugten Agenten-Profilen:
pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-geminiAuch verfügbar: --g-qwen und --g-kiro. Führen Sie ohne Flags aus, um in Ihrem aktuellen Projektordner statt im Home-Verzeichnis zu installieren
Übergeben Sie die Aufgabe an Ihren KI-Begleiter. Sagen Sie Ihrem Agenten:
„Verwende die Fähigkeit marm-init, um MARM einzurichten.“
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 |
|
|
Privater lokaler STDIO-Benutzer |
|
|
Mehrere Agenten teilen sich Speicher |
|
|
Privater Hochdurchsatz-Schwarm |
|
|
Vertrauenswürdiges privates Labor/Server |
|
|
⚡ 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 | 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 ConsoleTransports 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 ~/.marmWissen, 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 splitsDocker-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:
893msWarmer Encode: Median
3,8ms, p954,3msGleichzeitiger Abruf: 10 gesammelte Abrufe wurden in
151,5msabgeschlossen vs.176,0msseriell (gather/serial = 0,86). Interpretieren Sie das nicht als Parallelität: Wiederholte Durchläufe desselben Benchmarks landen irgendwo zwischen0,63und0,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, p957,6msKonsolidierung an: Median
58,1ms, p95106,5msKompromiss: 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 |
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 | 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-serverVerwenden 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/mcpDer 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-stdioErsetzen 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-stdioDocker-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 --yesDie HTTP-Befehle run, command und compose akzeptieren dieselben operativen Flags:
Flag | Zweck | |||
| Dauerhaftes Host-Verzeichnis, eingehängt unter | |||
| Explizite Docker-Env-Datei. Sie muss bereits | |||
| Host-HTTP-Port. Standard: | |||
| Bindet den Host-Port an | |||
`--profile standard | swarm | swarm-max | trusted` | Wählt dasselbe Schreibwarteschlangen- und Ratenbegrenzungs-Preset wie der native HTTP-Start. |
| Überschreibt die Ratenbegrenzung des ausgewählten Profils. | |||
| Wiederholbarer, schreibgeschützter Repository-Mount für Code-Indizierung. MARM meldet jeden entsprechenden | |||
| Offizielles Image-Tag. Standard: | |||
| Zieht das ausgewählte Image, bevor ein neuer HTTP-Container erstellt wird. | |||
| Verwalteter Containername. MARM weigert sich, einen vorhandenen Container mit diesem Namen zu ersetzen. | |||
| Optionale Docker-Ressourcengrenzen. | |||
|
|
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 --pullDocker 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 --swarmDocker-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:latestIndizieren 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_stdioDocker HTTP benötigt einen Schlüssel; Docker STDIO nicht.
Wenn Sie
401erhalten, ü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/mcpClaude 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/-DatenbankBackup: Kopieren Sie das gesamte Verzeichnis
~/.marm/, um alle Daten zu erhaltenDatenschutz: 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/healthErwartete 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 | |||||
| Hybrider Speicher-Abruf mit einem additiven, begrenzten Konzept-/Code-Graph-Seitenwagen, wenn ein kompatibler Graph existiert |
| |||||
| Strukturierte Sitzungsprotokolleinträge hinzufügen; jeder Eintrag wird auch in den semantischen Speicher eingebettet, sodass |
| |||||
| Alle Einträge und Sitzungen mit Filterung anzeigen |
| |||||
| Eine Protokollsitzung, einen Protokolleintrag oder einen Notizbucheintrag löschen |
| |||||
| Zwischengespeicherte, einfügebereite Sitzungszusammenfassungen mit intelligenter Kürzung |
| |||||
| Sitzungsbezogener Notizblock plus Promotion zu einem dauerhaften, graph-verknüpften Dokument | `action="add" | "use" | "show" | "status" | "clear" | "save" |
| 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 | |||
| Ein Repository in den Code-Struktur-Graphen indizieren, Status prüfen, Projekte auflisten oder automatische Neuindizierung ein- und ausschalten |
| |||
| Symbole, Textmuster oder die Quelle eines Symbols finden; anstelle von grep/glob verwenden | `kind="auto" | "symbol" | "text" | "snippet"` |
| Aufrufpfade und Datenfluss von einer Funktion aus verfolgen |
| |||
| Architekturübersicht: Module, Knoten/Kanten-Aufschlüsselung, Schema |
| |||
| Auswirkungsradius von Code-Änderungen: git diff → betroffene Symbole + Risiko |
|
🧩 Konzept-Graph (2 Tools)
Tool | Was es tut | Wichtige Parameter |
| Den Graphen neu erstellen oder Erinnerungen indizieren, die vor der automatischen Indizierung gespeichert wurden. Neue Erinnerungen werden automatisch indiziert |
|
| Explizit Entitäten, Beziehungen und verknüpfte Code-Symbole abfragen |
|
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 refreshPhase 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 projectsPhase 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 contextPhase 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 researchPhase 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 clientsErgebnis: 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 learnedWissensdatenbank-Schleife:
Erfassen: Verwenden Sie
marm_log_entryfür strukturierte SitzungserkenntnisseOrganisieren: Erstellen Sie thematische Sitzungen für Wissensbereiche
Synthetisieren: Regelmäßige
marm_summaryzur WissenskonsolidierungAnwenden: 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 suchenNatürliche Sprachsuche: "Authentifizierungsprobleme mit JWT-Tokens" schlägt "auth error"
Gestaffelte Abruftiefe:
detail=1gibt eine kurze Zusammenfassungsansicht (~200 Zeichen) zurück,detail=2eine größere Kontextansicht (~500 Zeichen),detail=3den vollständigen SpeicherinhaltNotebook-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 verwerfenSitzungslebenszyklus: 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 differsDie 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:
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.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.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 Antwortrecall_scan_truncated=trueenthält, hat der Fallback sein Limit erreicht; verengen Sie die Sitzung/Abfrage oder erhöhen Sie die Umgebungsvariable für größere Speicher.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
Kontextprotokolle – Automatisch klassifizierte Konversationserinnerungen
Manuelle Einträge – Explizit gespeicherte wichtige Informationen
Notebook-Einträge – Wiederverwendbare Anweisungen und Wissen
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 offEin 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 connectedSo 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) undCONCEPT_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 einesession_name,projectodersearch_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 statusaus 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.dbmit 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_SIZEbegrenzt 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_THRESHOLDKosinus-Ä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:candidates→stage→review→applyoderdiscard. 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.isErrorauf, 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
HEADund den Dirty-Status jedes indizierten Repositorys, berechnet durch Ausführen vongitauß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, dagit statusmeldet, 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 deaktiviertemcore.fsmonitorund 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-keyerzeugt 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 |
| 200 RPM | aktiviert | Gemeinsamer HTTP-Server, etwa 15-30 Agenten je nach Schreibstil |
| 600 RPM | aktiviert | Schwererer lokaler/privater Schwarm, etwa 50-100 Agenten je nach Schreibstil |
| deaktiviert | aktiviert | Nur für private/vertrauenswürdige Bereitstellungen |
| 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 |
|
| Bind-Adresse; |
|
| HTTP-Port |
| (leer) | Bearer-Schlüssel für netzwerkexponierte Bereitstellungen |
|
| Speicherort der Gedächtnisdatenbank |
|
| Speicherort der Konzeptgraph-Datenbank |
| (automatisch erkannt) | Überschreibt die Projekt-/Plattformzuordnung |
|
| Anfragen pro Minute pro IP (Voreinstellungen überschreiben) |
|
| Schreibvorgänge durch einen Worker serialisieren |
|
| 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 |
|
| Obergrenze für den semantischen Fallback-Scan; |
|
| Wie das semantische Abrufen seine Keyword-Abfrage aufbaut: |
| (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 |
|
| Wie stark der Keyword-Score das Ranking beeinflusst. Aus einem Benchmark-Sweep gesetzt; die Genauigkeit erreicht Spitzenwerte zwischen |
|
| 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. |
|
| Auf |
|
| Stärke und Abfall des Aktualitäts-Boosts |
|
| Deduplizierung beim Schreiben + semantische Zusammenführung |
|
| Kosinus-Ähnlichkeit, die zum Zusammenführen von Near-Duplikaten erforderlich ist. Wird nur mit der Bedeutungsähnlichkeit verglichen, nicht mit dem gemischten Ranking-Score |
|
| Hintergrund-Cluster-Erkennung + agentenunterstützte Kompaktierung |
|
| Schreibvorgänge pro Sitzung vor einem Kompaktierungsdurchlauf |
|
| Cluster-Erkennungsschwellen |
|
| Wie lange bereitgestellte Zusammenfassungen warten, bevor sie ablaufen |
|
| Ausschalter für die 5 Code-Graph-Tools |
|
| Automatische Neuindizierung von Repos, die sich bereits im Code-Graph befinden. Ein gespeicherter Schalter von |
|
| Sekunden zwischen Git-Signatur-Prüfungen pro Repo. Minimum 5 |
|
| Sekunden zwischen Neuindizierungen für ein Verzeichnis, das kein Git-Repo ist, wo keine günstige Änderungsprüfung existiert. Minimum 60 |
|
| Indextiefe für automatische Neuindizierungen: |
|
| 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 |
|
| Wie lange die Liste der überwachten Projekte vertrauenswürdig ist, bevor sie erneut aus der Engine gelesen wird |
|
| 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 |
|
| Automatische Konzeptindizierung neuer Erinnerungen. |
|
| Ruhephase nach einem Schreibvorgang, bevor die Indizierung beginnt, sodass ein Burst zu einem Durchlauf wird |
|
| Pro Batch indizierte Erinnerungen, begrenzt auf 500. Eine Senkung verringert die Konkurrenz nicht; es wurde etwas schlechter gemessen |
|
| 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. |
|
| 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 |
|
| 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 migrateEs 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 rechunkEs 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) odernetstat -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-stdionach der pip-Installation in Ihrem PATH ist:marm-mcp-stdio --helpAlternativ 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/healthPrüfen Sie, ob die Firewall Port 8001 blockiert
Für STDIO: verwenden Sie
marm-mcp-stdio(Konsolenskript) oderpython -m marm_mcp_server.server_stdioStarten 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_ENABLEDnicht auffalsegesetzt 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 statusaus; wenn es eine fehlende Laufzeit oder ein fehlendes Modell meldet, reparieren Sie die Installation mitpython -m pip install -U --force-reinstall marm-mcp-server.
Neue Erinnerungen werden im Graph nicht angezeigt
Führen Sie
marm-memory knowledge statusaus.index_queue.pendinggibt an, wie viele Erinnerungen warten;index_queue.parkedgibt an, wie viele aufgegeben haben.auto_index: falsebedeutet, 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_INDEXnicht auffalse,0,nooderoffgesetzt ist.Ein Graph, der auf eine Neuerstellung wartet, wird nicht indiziert. Wenn die Konsole oder
marm-memory knowledge statusrebuild_requiredmeldet, führen Siemarm_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 statusaus.enabled: falsebedeutet, dass die automatische Neuindizierung ausgeschaltet ist;source: overridebedeutet, dass ein gespeicherter Schalter sie ausgeschaltet hat, nicht die Umgebung.Das Repository muss einmal indiziert werden, bevor es überwacht wird.
marm-memory projects listzeigt 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_showFü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 aufzulistenVerwenden Sie
search_all=True, um in allen Sitzungen zu suchenVersuchen 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-VerzeichnisStarten Sie den Server neu
Datenbank gesperrt Fehler
Schließen Sie alle KI-Client-Verbindungen
Stoppen Sie den Server:
Strg+CSichern 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=10anstelle unbegrenzter ErgebnisseVerwenden 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 bereinigenSchließ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 |
| Port 8001 belegt | Prozess auf 8001 beenden oder anderen Port verwenden |
| Datenbankverzeichnis nicht beschreibbar |
|
| Fehlende Abhängigkeiten | Neuinstallation von |
| Mehrere Prozesse greifen auf DB zu | Andere Verbindungen schließen, Server neu starten |
| 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
INSTALL-DOCKER.md – Docker-Bereitstellung (empfohlen)
INSTALL-WINDOWS.md – Installationsanleitung für Windows
INSTALL-MACOS.md – Installationsanleitung für macOS
INSTALL-LINUX.md – Installationsanleitung für Linux
INSTALL-PLATFORMS.md – Plattform-Installationsanleitung
Projektinformationen
CONTRIBUTING.md – So können Sie zu MARM beitragen
CHANGELOG.md – Versionsverlauf und Aktualisierungen
ACKNOWLEDGMENTS.md – Mitwirkende und Danksagungen
ROADMAP.md – Geplante Funktionen und Entwicklungsfahrplan
LICENSE – Apache 2.0 Lizenzbedingungen
Available Tools
14 toolsmarm_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
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | auto | |
| limit | No | ||
| query | Yes | ||
| regex | No | ||
| project | No | ||
| file_pattern | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| summaries | No | ||
| candidate_id | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| project | No | ||
| search_all | No | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| limit | No | ||
| query | Yes | ||
| project | No | ||
| platform | No | ||
| direction | No | both | |
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| target | Yes | ||
| project | No | ||
| platform | No | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| project | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| since | No | ||
| project | No | ||
| base_branch | No | main |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | moderate | |
| action | No | auto | |
| project | No | ||
| repo_path | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | calls | |
| depth | No | ||
| project | No | ||
| direction | No | both | |
| risk_labels | No | ||
| function_name | Yes | ||
| include_tests | No | ||
| include_evidence | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | ||
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| session_name | No |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| name | No | ||
| names | No | ||
| action | Yes | ||
| project | No | ||
| platform | No | ||
| session_name | No | main |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| detail | No | ||
| project | No | ||
| platform | No | ||
| exact_mode | No | auto | |
| search_all | No | ||
| include_logs | No | ||
| session_name | No | default |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| session_name | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
v2.40.0- Changed
marm_graph_trace2 fields changed- added
Input schema / properties / include_evidenceAdded value: +{ + "default": true, + "title": "Include Evidence", + "type": "boolean" +} - added
Input schema / properties / include_testsAdded value: +{ + "default": false, + "title": "Include Tests", + "type": "boolean" +}
1 tool update
v2.37.0- Changed
marm_graph_index1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "auto", - "index", - "status", - "list" -]New value: +[ + "auto", + "index", + "status", + "list", + "auto_on", + "auto_off", + "auto_status" +]
5 tool updates
v2.35.0- Added
marm_compaction - Added
marm_graph_architecture - Added
marm_graph_impact - Added
marm_graph_index - Added
marm_notebook
7 tool updates
v2.25.0- Removed
marm_compaction - Changed
marm_concept_recall1 field changed- added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Platform" +}
- Changed
marm_delete2 fields changed- added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Platform" +} - added
Input schema / properties / projectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Project" +}
- Removed
marm_graph_architecture - Removed
marm_graph_impact - Removed
marm_graph_index - Removed
marm_notebook
2 tool updates
v2.21.0- Added
marm_concept_build - Added
marm_concept_recall
12 tool updates
v2.17.1- Added
marm_code_lookup - Changed
marm_compaction6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / action / titleAdded value: +"Action" - added
Input schema / properties / candidate_id / titleAdded value: +"Candidate Id" - added
Input schema / properties / summaries / titleAdded value: +"Summaries" - added
Input schema / titleAdded value: +"marm_compactionArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_delete6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / properties / target / titleAdded value: +"Target" - added
Input schema / properties / type / titleAdded value: +"Type" - added
Input schema / titleAdded value: +"marm_deleteArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
marm_graph_architecture - Added
marm_graph_impact - Added
marm_graph_index - Added
marm_graph_trace - Changed
marm_log_entry5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / entry / titleAdded value: +"Entry" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_log_entryArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_log_show4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_log_showArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_notebook8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / action / titleAdded value: +"Action" - added
Input schema / properties / data / titleAdded value: +"Data" - added
Input schema / properties / name / titleAdded value: +"Name" - added
Input schema / properties / names / titleAdded value: +"Names" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_notebookArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_smart_recall12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / detail / titleAdded value: +"Detail" - added
Input schema / properties / exact_mode / titleAdded value: +"Exact Mode" - added
Input schema / properties / include_logs / titleAdded value: +"Include Logs" - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / platform / titleAdded value: +"Platform" - added
Input schema / properties / project / titleAdded value: +"Project" - added
Input schema / properties / query / titleAdded value: +"Query" - added
Input schema / properties / search_all / titleAdded value: +"Search All" - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_smart_recallArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
marm_summary4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / session_name / titleAdded value: +"Session Name" - added
Input schema / titleAdded value: +"marm_summaryArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
1 tool update
v2.15.2- Changed
marm_smart_recall3 fields changed- added
Input schema / properties / exact_modeAdded value: +{ + "default": "auto", + "type": "string" +} - added
Input schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / projectAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +}
7 tool updates
v2.14.1- First observed
marm_compaction - First observed
marm_delete - First observed
marm_log_entry - First observed
marm_log_show - First observed
marm_notebook - First observed
marm_smart_recall - First observed
marm_summary
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
An MCP memory server. One memory your agents share — across models, devices and apps.
Your versioned memory across every AI tool — context maps, personal memory, and tasks over MCP.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for persistent, compounding memory that automatically captures corrections and insights across AI sessions, enabling agents to learn and improve over time.5371MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.12MIT
- AlicenseBqualityAmaintenanceMCP 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.3514MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.2MIT