marm-memory
¡Las contribuciones son bienvenidas! Explora issues abiertos para contribuir, o únete al MARM Discord para compartir flujos de trabajo, obtener ayuda de configuración y conectar con otros desarrolladores.
Tabla de Contenidos
Related MCP server: Memory Crystal MCP Server
Inicio Rápido
Instala e inicializa con tus perfiles de agente preferidos:
pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-geminiTambién disponibles: --g-qwen y --g-kiro. Ejecuta sin banderas para instalar en tu carpeta de proyecto actual en lugar de home
Pásalo a tu compañero de IA. Dile a tu agente:
"Usa la habilidad marm-init para configurar MARM."
Interactúa: Tu agente manejará toda la configuración (Python/Docker, HTTP/STDIO, claves y configuraciones del cliente) de forma interactiva directamente dentro de tu chat.
Configuración manual
¿Prefieres hacerlo tú mismo?:
Reemplaza "agent" con el comando CLI de tu cliente (por ejemplo, claude, gemini o qwen). Para Codex, usa codex mcp add marm-memory --url http://localhost:8001/mcp en su lugar.
Si eres... | Inicia el servidor | Conecta tu cliente MCP |
Desarrollador / investigador individual |
|
|
Usuario privado local STDIO |
|
|
Múltiples agentes compartiendo memoria |
|
|
Enjambre privado de alto rendimiento |
|
|
Laboratorio/servidor privado de confianza |
|
|
⚡ Inicio HTTP más rápido: Ejecuta marm-memory fast-start-http para iniciar el runtime local, lanzar la consola y abrirla en tu navegador inmediatamente.
🖥️ Consola Web: Ejecuta marm-memory console para ver la aplicación de UI local al instante (no requiere Node.js).
⚙️ Gestión del Ciclo de Vida: Gestiona el demonio en segundo plano usando status, logs --follow, restart y stop.
💡 Banderas Rápidas: Usa --no-console o --no-browser para restringir los inicios. Ejecuta marm-memory --help para listas completas de comandos.
Por qué MARM Memory
Tu IA lo olvida todo. MARM Memory no.
marm-memory les da a tus agentes una memoria privada y compartida para el contexto que normalmente se pierde entre chats: decisiones, investigación, correcciones, notas e historial del proyecto. Cambia de Claude Code a Codex o Gemini sin perder el contexto ya recopilado.
Reúne tres cosas:
🧠 Memoria Central (7 herramientas) almacena conversaciones, notas, entradas de cuaderno y resúmenes para que se mantengan buscables.
💻 Grafo de Código (5 herramientas) mapea tu repositorio para que los agentes puedan encontrar símbolos, seguir rutas de código y entender el proyecto sin tener que releerlo todo. Apúntalo a un repositorio una vez y se mantiene actualizado mientras trabajas.
🧩 Grafo de Conceptos (2 herramientas) conecta personas, decisiones, errores e ideas de tus memorias almacenadas, con enlaces de vuelta al código relevante cuando esté disponible. Se construye solo a medida que almacenas memorias.
Las 14 herramientas funcionan sobre HTTP y STDIO. Tus agentes comparten la misma memoria local entre sesiones en lugar de empezar desde cero cada vez. La Consola integrada te permite ver y gestionar lo que se guarda.
Cómo Funciona
Capa | Qué hace | Por qué es importante |
Modelo de memoria | Sesiones, registros estructurados, cuadernos, resúmenes y memorias semánticas | Mantiene el historial del proyecto buscable en lugar de atrapado en un solo chat |
Capa de escalado | Modo WAL de SQLite, pool de conexiones, cola de escritura serializada y preajustes de límite de tasa HTTP | Permite que un solo servidor soporte uso individual, trabajo multi-agente y ráfagas estilo enjambre |
Capa de inteligencia | Filtro FTS, reordenamiento semántico, fallback semántico acotado, clasificación automática, consolidación en tiempo de escritura y candidatos a compactación | Mantiene la recuperación útil a medida que la memoria crece en lugar de permitir que se acumulen duplicados |
Capa de grafo de código | Indexación de repositorio, búsqueda de símbolos, trazado de llamadas, visión general de arquitectura y análisis de impacto de cambios | Da a los agentes estructura del proyecto sin tener que releer toda la base de código |
Capa de grafo de conceptos | Extracción de entidades y relaciones de las memorias almacenadas, con enlaces de vuelta al grafo de código | Conecta decisiones, errores, herramientas y personas entre sesiones en lugar de dejarlos como texto plano |
Capa de tokens | Superficie central ligera de 7 herramientas (14 en total con herramientas de grafo incluidas), reordenamiento semántico antes de la recuperación y deduplicación en tiempo de escritura | Reduce los tokens enviados al modelo en cada recuperación y el costo se mantiene predecible a medida que la memoria escala |
Capa de despliegue | Pip, Docker, STDIO, HTTP y perfiles gestionados | Te permite ejecutar memoria local privada o memoria multi-agente compartida con la misma superficie MCP |
Consulta Rendimiento y Benchmarks de Escalado para latencia de recuperación, concurrencia y números de costo de escritura, y Arquitectura e Internos para los mecanismos detrás de cada capa.
Comandos CLI en Tiempo de Ejecución
marm-memory es el gestor de runtime local instalado con el paquete Python. Estos son los comandos operativos normales; usa marm-memory <command> --help para banderas y ejemplos específicos de comandos.
Trabajo diario de runtime
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 ConsoleTransportes y configuración
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 ~/.marmConocimiento, proyectos y mantenimiento
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 splitsLos comandos de Docker están documentados por separado más abajo porque requieren montajes de datos explícitos, exposición de red y elecciones de manejo de claves.
Rendimiento y Benchmarks de Escalado
MARM está ajustado para una recuperación rápida primero, incluso a medida que la memoria crece y las memorias largas se dividen en fragmentos detrás de escena.
Estas mediciones utilizan el codificador jinaai/jina-embeddings-v2-small-en respaldado por fastembed y una base de datos SQLite local desechable. Cada ruta cronometrada llama al código MARMMemory enviado, no a una reimplementación local del benchmark. Las secciones 1-4 son tiempos de una sola ejecución de scripts/benchmarking/performance/bench_hotpath.py en hardware local; los milisegundos absolutos varían según la máquina, así que trata la forma de escalado como la señal. La sección 5 es un benchmark de precisión separado (run_eval.py) e informa dos ejecuciones, por la razón indicada allí.
1. Escalado de Latencia de Recuperación
Latencia de extremo a extremo de recall_similar (incluye codificación de consulta).
Tamaño de Sesión ($N$) | Latencia Mínima | Latencia Mediana | Latencia p95 |
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 |
La varianza entre ejecuciones en $N$ pequeño es mayor que la brecha entre tamaños adyacentes, por lo que N = 250 se lee más lento que N = 500 aquí. Trata la tendencia desde N = 1,000 en adelante como la señal real.
2. Codificador + Concurrencia
Carga de modelo en frío:
893msCodificación en caliente: mediana
3.8ms, p954.3msRecuperación concurrente: 10 recuperaciones agrupadas completadas en
151.5msvs176.0msen serie (gather/serial = 0.86). No interpretes eso como paralelismo: ejecuciones repetidas de este mismo benchmark caen en cualquier lugar entre0.63y0.86, por lo que la relación no es lo suficientemente estable como para afirmar una aceleración. La ruta está serializada alrededor del trabajo compartido del codificador y SQLite por diseño, y cualquier ganancia aparente es ruido de medición.
3. Costo de Ingestión en Tiempo de Escritura
Consolidación desactivada: mediana
6.5ms, p957.6msConsolidación activada: mediana
58.1ms, p95106.5msCompensación: la deduplicación/agrupación en tiempo de escritura añade un costo mediano de
9.0xpara que la recuperación se mantenga rápida y el almacén se mantenga más limpio con el tiempo. La consolidación está desactivada por defecto.
4. Escalado de Recuperación: Escaneo Completo vs Híbrido de Producción
Por qué la recuperación se mantiene plana mientras la memoria crece: en lugar de escanear cada vector, la recuperación en producción utiliza un prefiltro FTS de palabras clave para reducir el conjunto de candidatos, luego reordena utilizando una puntuación combinada semántica + BM25 + temporal. Ambas columnas de referencia representan rutas de código asíncrono auténticas, medidas con vectores precalculados para aislar la velocidad de recuperación de la sobrecarga de codificación en bruto. Las pruebas alternan la ejecución para garantizar condiciones de caché completamente imparciales.
Tamaño de sesión ($N$) | Escaneo semántico completo | Híbrido de producción | Aceleración | Candidatos FTS |
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 |
El escaneo completo crece aproximadamente de forma lineal con $N$ mientras que la recuperación híbrida crece mucho más lentamente, por lo que la ventaja aún se amplía con el tamaño de la sesión. Con $N$ muy pequeño, el prefiltro no vale su sobrecarga y el híbrido es más lento.
5. Precisión de recuperación de LoCoMo
Las 10 conversaciones de LoCoMo se ingieren a través de marm_log_entry (5,882 recuerdos), luego los resultados del top-5 de marm_smart_recall se puntúan frente a 1,977 preguntas anotadas con evidencia. No se utiliza ningún modelo de generación de respuestas ni juez LLM.
Configuración | Acierto de cualquier evidencia | Acierto de toda la evidencia | Recuperación media de evidencia |
Línea base MiniLM | 37.5% | 29.5% | no publicado |
Jina v2 Small (v2.29.0) | 53.0% | 43.4% | 47.6% |
Reciente (v2.33.1) | 62.9 - 63.5% | 53.1 - 53.5% | 57.4 - 57.9% |
Las ganancias de rendimiento se aíslan en el pipeline de recuperación combinado y el espacio vectorial localizado, lo que garantiza una alta precisión de recuperación de múltiples saltos sin depender de jueces LLM alojados en la nube. Reproduzca el benchmark completo usando scripts/benchmarking/accuracy/locomo/run_eval.py.
6. vs Competidores: Arquitectura
MARM se dirige a un nicho específico: memoria local para agentes de codificación conectados a MCP, no memoria de personalización general ni un runtime de agente completo. Así es como se diferencia arquitectónicamente de nombres establecidos en la memoria de agentes de IA:
MARM | Mem0 | Letta (MemGPT) | Zep / Graphiti | agentmemory | |
Tipo | Motor de memoria, nativo MCP | API de capa de memoria | Runtime de agente completo | Grafo de conocimiento temporal | Motor de memoria, nativo MCP |
Infraestructura requerida | Sin servicio de datos separado (SQLite embebido) | BD vectorial (Qdrant/pgvector) | Postgres + BD vectorial | Neo4j | Runtime |
Despliegue | Local por defecto; Docker para compartido/remoto | API en la nube o autoalojado | Autoalojado o nube | Nube o autoalojado | Local |
Modelo de recuperación | Híbrido: carril exacto FTS5 BM25 + rerank semántico | Vector + grafo + clave-valor | Almacén de vectores de archivo + memoria central gestionada por el agente | Grafo de conocimiento temporal (ventanas de validez de hechos) | BM25 + vector + grafo (fusión RRF) |
Captura de escritura | Llamadas a herramientas explícitas del agente conectado | Llamadas | El agente edita su propia memoria | Llamadas API explícitas | Basada en hooks, automática (no se necesitan llamadas explícitas) |
Conciencia de estructura de código | Grafo de código + grafo de conceptos empaquetados, fusionados con memoria | No incorporado | No incorporado | No incorporado | No incorporado (se empareja con un proyecto separado) |
Bloqueo de framework | Ninguno (cualquier cliente MCP) | Ninguno | Alto (debe ejecutarse dentro de Letta) | Ninguno | Ninguno (cualquier cliente MCP) |
Descargos y precisión: Los panoramas de competidores evolucionan rápidamente. La matriz anterior refleja rasgos arquitectónicos centrales a partir del tercer trimestre de 2026, basados en documentación pública y READMEs, no en pruebas internas de cada sistema. Si algún dato sobre un framework alternativo ha cambiado o está mal representado, por favor abra un issue o envíe un Pull Request para actualizar la tabla. Damos la bienvenida activamente a correcciones de mantenedores pares.
Configuración del Cliente MCP para HTTP y STDIO
Instalación manual con pip
pip install marm-mcp-serverUse esta regla rápida para elegir su configuración
HTTP/STDIO local = configuración más rápida en una sola máquina.
Docker HTTP = servidor compartido/siempre activo (se requiere clave).
Docker STDIO = uso local privado en contenedor (sin clave HTTP).
Nota para enjambre/multiagente: La cola de escritura está habilitada por defecto para serializar las escrituras de memoria a través de un trabajador. Para despliegues HTTP compartidos, use marm-memory start --profile swarm (200 RPM) o --profile swarm-max (600 RPM). --profile trusted deshabilita la limitación de velocidad por completo para despliegues privados. STDIO sigue siendo lo mejor para uso privado de un solo agente/local. Consulte Ajustes preestablecidos para enjambre y multiagente para la tabla completa.
"agente" se refiere a claude, gemini, grok, qwen, o cualquier cliente MCP. Codex usa --url en lugar de --transport para agregar herramientas MCP.
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/mcpEl inicio predeterminado de pip/local es de configuración cero: MARM se vincula a localhost y no requiere una clave a menos que lo exponga con SERVER_HOST=0.0.0.0.
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-stdioReemplace marm-mcp-stdio con python -m marm_mcp_server.server_stdio si usa un virtualenv o una configuración basada en rutas. Funciona con Claude Code, Cursor, VS Code, Qwen y Gemini CLI. STDIO sigue siendo un solo proceso local sin puerto ni clave API, y expone las mismas 14 herramientas que HTTP.
Use HTTP cuando varios agentes necesiten compartir un servidor MARM activo. STDIO sigue siendo lo mejor para uso privado de un solo agente porque cada cliente posee su propio proceso local.
# 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 requiere una clave API porque expone MARM como un servidor de red; STDIO permanece local al proceso del cliente y no necesita una.
Si instaló MARM a través de pip, la CLI del producto puede previsualizar o ejecutar la misma configuración de forma segura. Usa un puerto de bucle invertido por defecto, conserva ~/.marm, almacena la clave generada en ~/.marm/.env en lugar del historial del shell, y se niega a reemplazar un contenedor existente.
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 --yesLos comandos HTTP run, command y compose aceptan las mismas banderas operativas:
Banderas | Propósito |
| Directorio persistente del host montado en |
| Archivo env explícito de Docker. Debe contener |
| Puerto HTTP del host. Por defecto: |
| Vincula el puerto del host a |
| Selecciona el mismo ajuste preestablecido de cola de escritura y límite de velocidad que el inicio HTTP nativo. |
| Anula el límite de velocidad HTTP del perfil seleccionado. |
| Montaje de repositorio de solo lectura repetible para indexación de código. MARM informa cada ruta |
| Etiqueta de imagen oficial. Por defecto: |
| Extrae la imagen seleccionada antes de crear un nuevo contenedor HTTP. |
| Nombre del contenedor gestionado. MARM se niega a reemplazar un contenedor existente con ese nombre. |
| Límites opcionales de recursos de Docker. |
|
|
Por ejemplo:
# 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 es independiente de Docker HTTP: marm-memory docker stdio-command usa docker run -i --rm, no tiene puerto ni clave bearer, pero sigue montando el directorio de datos para que la memoria SQLite persista después de que el contenedor de corta duración termine. Use --data-dir y --tag con ese comando cuando sea necesario. No hay comandos separados docker key o docker mount; --env-file y --data-dir hacen explícitas esas opciones en el comando HTTP generado.
marm-memory docker pull solo descarga una imagen. marm-memory docker maintenance embeddings migrate se ejecuta contra el mismo montaje de datos y se niega mientras el contenedor HTTP gestionado esté en ejecución. El asistente solo está disponible con el comando marm-memory instalado mediante pip; los usuarios que solo usan Docker pueden usar los comandos sin procesar a continuación.
# 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 toma el nombre de la variable de entorno, no la clave sin procesar. Inicie o reinicie Codex desde el mismo shell después de establecer $env:MARM_API_KEY. Para pruebas de humo locales con Docker, MARM_API_KEY=test está bien y evita problemas de escape del shell; use una clave generada para implementaciones reales. Un 406 Not Acceptable de la prueba de humo GET /mcp significa que la autenticación llegó al endpoint MCP; 401 Unauthorized significa que la clave falta o no coincide.
# --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 --swarmLas herramientas de gráficos Docker se ejecutan dentro del contenedor, por lo que no pueden ver las rutas del host a menos que las monte en 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:latestLuego indexe la ruta del contenedor, no la ruta del host de Windows:
marm_graph_index(repo_path="/workspace/marm-memory")Las herramientas de gráficos deben usar la ruta del contenedor. No se pueden agregar montajes a un contenedor ya en ejecución; detenga y reinicie el contenedor con el montaje del repositorio cuando desee la indexación de gráficos Docker.
Docker STDIO incluye las mismas herramientas marm-graph integradas; no se requiere ninguna imagen o paso de instalación adicional.
docker run --rm -i \
-v ~/.marm:/home/marm/.marm \
--entrypoint python \
lyellr88/marm-mcp-server:latest \
-m marm_mcp_server.server_stdioDocker HTTP requiere una clave; Docker STDIO no.
Si obtiene
401, verifique la coincidencia de la clave y reinicie el cliente después de los cambios en las variables de entorno.Para la configuración completa de la clave, rotación y solución de problemas: INSTALL-DOCKER.md
Conecte su cliente
Inicie el servidor (python -m marm_mcp_server), luego conecte su cliente a continuación. Cada bloque asume la instalación local predeterminada (sin clave). Para servidores Docker o expuestos, agregue el encabezado Authorization: Bearer que se muestra en el bloque plegable de cada cliente.
claude mcp add --transport http marm-memory http://localhost:8001/mcpClaude Code admite HTTP, SSE y STDIO a través de claude mcp add; use HTTP para MARM. Para STDIO: claude mcp add --transport stdio marm-memory-stdio marm-mcp-stdio.
Agregue a .vscode/mcp.json en su espacio de trabajo. Use marm-memory-local para instalaciones directas de Python; marm-memory-docker para modo Docker o expuesto/con clave.
{
"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}"
}
}
}
}Abra .vscode/mcp.json, haga clic en Iniciar sobre el servidor que desee, luego use el Agente de Copilot o cualquier extensión que consuma el registro MCP nativo de VS Code.
Agregue a .cursor/mcp.json en su espacio de trabajo. Cursor usa mcpServers, no la raíz servers de 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}"
}
}
}
}Para el modo Docker/clave, inicie Cursor con MARM_API_KEY establecida en el entorno.
Codex usa codex mcp add o configuración TOML en ~/.codex/config.toml (%USERPROFILE%\.codex\config.toml en 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"Equivalente ~/.gemini/settings.json (ámbito de usuario) o proyecto .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"Equivalente .qwen/settings.json (proyecto) o ~/.qwen/settings.json (usuario):
{
"mcpServers": {
"marm-memory": {
"httpUrl": "http://localhost:8001/mcp",
"headers": {
"Authorization": "Bearer your-generated-key"
}
}
}
}xAI se conecta desde su propia infraestructura, por lo que localhost no funcionará. Exponga MARM detrás de HTTPS y establezca MARM_API_KEY.
{
"type": "mcp",
"server_url": "https://your-marm-domain.example.com/mcp",
"server_label": "marm-memory",
"authorization": "Bearer your-generated-key"
}Guías completas de plataforma, configuración de clave y notas específicas del SO: Windows · macOS · Linux · Modo Docker/clave · Otras plataformas
¿Usando un cliente que no está listado? Abra un issue y háganoslo saber; los adaptadores de cliente son una solicitud de característica de primera clase.
Requisitos
Python: 3.10 o superior
SQLite3: Incluido con Python (no se necesita instalación por separado)
Almacenamiento: ~100MB mínimo para la configuración inicial, escala con el tamaño de la base de datos de memoria
RAM: 512MB mínimo (varía según clientes concurrentes y tamaño de la base de datos)
SO: Windows, macOS, Linux
Ubicación de datos
Ubicación:
~/.marm/(Linux/macOS) o%USERPROFILE%\.marm\(Windows)Contenido: Base de datos SQLite con todos los recuerdos, sesiones y cuadernos; el grafo de conceptos reside en su propia base de datos
~/.marm/index/Copia de seguridad: Copie todo el directorio
~/.marm/para preservar todos los datosPrivacidad: Todo permanece en su máquina, sin sincronización en la nube ni almacenamiento externo
Verificar instalación
Use el endpoint de salud del servidor MCP para la verificación en vivo más rápida:
curl http://localhost:8001/healthLa salida esperada incluye la versión del servidor, disponibilidad de características (estado de búsqueda semántica), estado de conexión a la base de datos y estado de salud del servicio.
Suite completa de herramientas MCP (14 herramientas)
💡 Consejo profesional: ¡No necesita llamar manualmente a estas herramientas! Simplemente dígale a su agente de IA lo que quiere en lenguaje natural:
"Claude, registra esta sesión como 'Project Alpha' y añade esta conversación como 'discusión de diseño de base de datos'"
"Recuerda este fragmento de código en tu cuaderno para más tarde"
"Busca lo que discutimos sobre autenticación ayer"
El agente de IA usará automáticamente las herramientas adecuadas. El acceso manual a las herramientas está disponible para usuarios avanzados que deseen control directo.
🧠 Memoria Central (7 herramientas)
Herramienta | Qué hace | Parámetros clave | |||||
| Recuperación de memoria híbrida con un sidecar de grafo de conceptos/código aditivo y acotado cuando existe un grafo compatible |
| |||||
| Agregar entradas de registro de sesión estructuradas; cada entrada también se incrusta en la memoria semántica para que |
| |||||
| Mostrar todas las entradas y sesiones, con filtrado |
| |||||
| Eliminar una sesión de registro, entrada de registro o entrada de cuaderno |
| |||||
| Resúmenes de sesión en caché, listos para pegar, con truncamiento inteligente |
| |||||
| Bloc de notas de ámbito de sesión más promoción a un documento permanente vinculado al grafo | `action="add" | "use" | "show" | "status" | "clear" | "save" |
| Limpieza de memoria asistida por agente con un registro de auditoría revisable | `action="status" | "candidates" | "review" | "stage" | "apply" | "discard"` |
🕸️ Grafo de Código (5 herramientas)
Herramienta | Qué hace | Parámetros clave | |||
| Indexar un repositorio en el grafo de estructura de código, verificar estado, listar proyectos o activar/desactivar la reindexación automática |
| |||
| Encontrar símbolos, patrones de texto o la fuente de un símbolo; usar en lugar de grep/glob | `kind="auto" | "symbol" | "text" | "snippet"` |
| Trazar rutas de llamada y flujo de datos desde una función |
| |||
| Resumen de arquitectura: módulos, desglose de nodos/aristas, esquema |
| |||
| Radio de explosión de cambios de código: git diff → símbolos afectados + riesgo |
|
🧩 Grafo de Conceptos (2 herramientas)
Herramienta | Qué hace | Parámetros clave |
| Reconstruir el grafo, o indexar recuerdos almacenados antes de la indexación automática. Los nuevos recuerdos se indexan por sí solos |
|
| Consultar explícitamente entidades, relaciones y símbolos de código vinculados |
|
Las 14 herramientas están disponibles tanto en HTTP como en STDIO. Detrás de la superficie de las herramientas, el servidor maneja automáticamente la configuración del ciclo de vida, la actualización del protocolo, la indexación de documentos, el contexto de fecha, el mantenimiento de la caché de resúmenes, el manejo de la cola de escritura, la indexación de conceptos, la reindexación de código a medida que los repositorios cambian, la atribución de proyecto/plataforma y las comprobaciones de salud; nada de eso consume la atención o los tokens del agente. Los dos motores de grafo se inician de forma diferida en el primer uso y nunca bloquean las 7 herramientas de memoria central si fallan al iniciarse. Consulte Arquitectura e Internos para conocer los mecanismos.
Usando MARM: Hable, No Llame a las Herramientas
MARM maneja el trabajo del ciclo de vida internamente. Los documentos y el estado de la sesión se inicializan en la primera llamada real a una herramienta, y los documentos empaquetados se indexan en el espacio de nombres de memoria marm_system con seguimiento de hash de archivo fuente, para que su agente pueda responder preguntas sobre el uso de MARM desde la propia memoria.
Flujo de trabajo de ejemplo: Proyecto de investigación entre AIs
Un flujo de trabajo realista que muestra MARM en acción. Escenario: está investigando patrones de autenticación para un nuevo proyecto utilizando múltiples clientes de IA.
Fase 1: Enrutar sesión (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.Fase 2: Capturar investigación (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 refreshFase 3: Añadir referencia reutilizable (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 projectsFase 4: Recordar contexto (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 contextFase 5: Síntesis y resumen (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 researchFase 6: Finalizar sesión (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 clientsResultado: Tres clientes de IA diferentes investigaron colaborativamente un tema, compartieron ideas y documentaron decisiones. Todo sin tener que reexplicar el proyecto a cada nueva IA.
Patrones avanzados
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 learnedBucle de base de conocimiento:
Capturar: Usa
marm_log_entrypara aprendizajes estructurados de sesiónOrganizar: Crea sesiones temáticas para áreas de conocimiento
Sintetizar:
marm_summaryregular para consolidación de conocimientoAplicar: Convierte resúmenes en entradas
marm_notebook(action="add", ...)
Colaboración multi-IA: cada IA trabaja en sesiones dedicadas en sus fortalezas, usa marm_smart_recall para basarse en el trabajo de las demás, luego una sesión colaborativa combina las ideas.
Nombrado de sesiones: Incluye el nombre del LLM para referencias cruzadas
Registro estratégico: Enfócate en decisiones clave, soluciones, descubrimientos, configuraciones
Búsqueda global: Usa
search_all=Truepara buscar en todas las sesionesBúsqueda en lenguaje natural: "problemas de autenticación con tokens JWT" supera a "error de auth"
Profundidad de recuerdo en capas:
detail=1devuelve una vista de resumen corta (~200 caracteres),detail=2una vista de contexto más amplia (~500 caracteres),detail=3contenido completo de la memoriaApilamiento de cuaderno: Combina múltiples entradas para flujos de trabajo complejos
Compactación: Deja que MARM muestre candidatos de compactación, luego usa
marm_compactionpara preparar, revisar, aplicar o descartar resúmenesCiclo de vida de sesión: Iniciar → Trabajar → Referencia → Revisar compactación preparada cuando MARM lo solicite
Entendiendo la Memoria de MARM
Dos búsquedas, dos problemas muy diferentes, una herramienta:
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 differsLa primera consulta trata sobre significado, por lo que MARM reordena candidatos con incrustaciones vectoriales locales — búsqueda semántica estilo RAG sin una base de datos vectorial alojada. La segunda tiene forma de sintaxis (una clave de configuración), por lo que MARM lo detecta automáticamente y lo enruta a través de coincidencia exacta determinista. Este carril de recuperación exacta es la diferencia entre un sistema de memoria que funciona en demostraciones y uno que responde las preguntas que los desarrolladores realmente hacen: claves de configuración, banderas de CLI, rutas de archivos, nombres de API, cadenas de error. Los sistemas de memoria puramente semánticos fallan exactamente en esas consultas.
MARM usa recuerdo híbrido de filtro→reordenación más un carril de recuperación exacta:
Carril exacto (
exact_mode="auto", el predeterminado): claves de configuración, banderas de CLI, rutas de archivos, nombres de API/herramientas, espacios de nombres con puntos, rutas HTTP, URLs y cadenas de comandos entrecomilladas se detectan y enrutan a través de FTS5 BM25 determinista con un respaldo LIKE. No hay incrustaciones involucradas, por lo que los resultados son estables y literales.Carril de filtro→reordenación: las consultas en lenguaje natural primero extraen un conjunto candidato acotado del índice FTS (
FTS_CANDIDATE_LIMIT, predeterminado 200), luego las incrustaciones semánticas reordenan esos candidatos por significado. La ponderación temporal conservadora da a las memorias más recientes un modesto impulso cuando las coincidencias son cercanas.Respaldo semántico acotado: cuando la cobertura de FTS es débil o inutilizable, MARM recurre a un escaneo semántico acotado (
RECALL_SCAN_LIMIT). Si la respuesta incluyerecall_scan_truncated=true, el respaldo alcanzó su límite; reduce la sesión/consulta o aumenta la variable de entorno para almacenes más grandes.Puntuación consciente de fragmentos: las memorias largas (aproximadamente 180+ palabras) se incrustan internamente como filas de fragmentos superpuestos, y el recuerdo colapsa las puntuaciones de los fragmentos de vuelta a una memoria padre usando el fragmento que mejor coincide. Tanto el carril de reordenación como el carril de respaldo son conscientes de fragmentos.
Por eso la latencia de recuerdo se mantiene casi plana a medida que el almacén crece (ver benchmarks): la reordenación semántica siempre puntúa un conjunto acotado en lugar de escanear cada incrustación.
Control de recuerdo exacto: exact_mode="auto" suele ser correcto. Usa exact_mode="exact" cuando una consulta debe coincidir con texto literal como RECALL_SCAN_LIMIT, --generate-key o settings.py. Usa exact_mode="semantic" cuando una consulta con apariencia de sintaxis aún debe tratarse como recuerdo basado en significado.
Tipos de memoria y clasificación
Registros de contexto - Memorias de conversación clasificadas automáticamente
Entradas manuales - Información importante guardada explícitamente
Entradas de cuaderno - Instrucciones y conocimiento reutilizables
Resúmenes de sesión - Historial de conversación comprimido
MARM categoriza automáticamente el contenido al escribir: Código (fragmentos de programación y discusiones técnicas), Proyecto (conversaciones de trabajo y planificación), Libro (literatura, materiales de aprendizaje, investigación) y General (todo lo demás).
Atribución de proyecto y plataforma
MARM almacena columnas project y platform anulables en memorias, entradas de registro y entradas de cuaderno. El proyecto se detecta desde el directorio de trabajo y la plataforma desde el cliente conectado (Claude Code, VS Code, Cursor, ...); MARM_PROJECT y MARM_PLATFORM anulan la detección. marm_smart_recall(project=..., platform=...) limita el recuerdo sin cambiar el comportamiento predeterminado sin filtrar, por lo que un servidor compartido puede contener varios proyectos sin contaminación cruzada.
Grafos de Conocimiento: Código y Conceptos
MARM incluye dos sistemas de grafo que complementan el almacén de memoria: un grafo de código que entiende la estructura de tu repositorio, y un grafo de conceptos que entiende de qué tratan tus memorias almacenadas. Cuando ambos están indexados para el mismo proyecto, las entidades de concepto se enlazan de forma cruzada a símbolos de código.
Grafo de Código: indexación de repositorio y búsqueda de código
marm-graph está integrado en ambos transportes. Indexa un repositorio una vez, luego permite a los agentes hacer preguntas sobre la estructura del código sin escanear archivos repetidamente:
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.El flujo de trabajo de agente recomendado: indexa una vez, luego marm_code_lookup antes de lecturas amplias de archivos, marm_graph_trace cuando importa el contexto de llamantes/llamados o flujo de datos, marm_graph_architecture para orientación, y marm_graph_impact antes de refactorizaciones arriesgadas. Una consulta de grafo reemplaza docenas de ciclos de grep/lectura, de ahí proviene el ahorro de tokens.
Una vez que un repositorio está indexado, MARM lo mantiene actualizado por sí mismo. Un sondeo en segundo plano nota cuando el repositorio ha cambiado y lo reindexa, por lo que no es necesario reindexar manualmente después de un commit. Mientras tienes trabajo sin confirmar, se actualiza en cada ciclo, ya que ninguna verificación barata puede ver ediciones repetidas en un archivo que ya está modificado. Para indexar solo a petición:
marm-mcp-server projects auto offUn agente puede hacer lo mismo con marm_graph_index(action="auto_off"), y action="auto_status" informa qué se está vigilando y cuándo se indexó cada proyecto por última vez. El cambio persiste entre reinicios y anula la variable de entorno GRAPH_AUTO_INDEX.
Internamente, el motor es codebase-memory-mcp (MIT), un binario estático sin dependencias que analiza 158 lenguajes a través de tree-sitter con resolución de tipos LSP híbrida para los principales, indexa un repositorio promedio en segundos y responde búsquedas de símbolos y trazado de llamadas en menos de un segundo. Medido en un grafo de 149,107 nodos sobre la conexión persistente que MARM mantiene: búsqueda de símbolos 146ms, trazado de llamadas 67ms, y la visión general completa de arquitectura 1.23s, que es la única consulta que no es de menos de un segundo. MARM fija una versión específica, verifica su esquema de herramientas al inicio y enruta el conjunto de herramientas ascendente a través de 5 herramientas MCP enfocadas para que la superficie del modelo se mantenga pequeña. El backend del grafo se inicia de forma perezosa en el primer uso de la herramienta de grafo, por lo que las herramientas de memoria, registro, cuaderno y resumen aún se inician rápido. En Docker, el binario del motor está incluido en la imagen; las instalaciones locales con pip lo descargan en el primer uso del grafo (~269MB, una sola vez).
Modo degradado: si el motor de grafo falla al iniciar (sin red para la descarga inicial, disco lleno, desviación de esquema) o se establece GRAPH_ENABLED=false, las herramientas de grafo devuelven {"status": "error", "message": "graph backend unavailable"} mientras las otras 9 herramientas siguen funcionando normalmente. Los fallos de grafo nunca pueden derribar la memoria.
Grafo de Conceptos: de qué tratan tus memorias
MARM extrae un grafo de conocimiento de las memorias que almacenas, produciendo entidades tipadas (conceptos, decisiones, patrones, errores, herramientas, personas, organizaciones) conectadas por relaciones tipadas (corrige, implementa, depende_de, usa, causa, reemplaza, extiende). Esto ocurre automáticamente: almacenar una memoria la pone en cola, y un trabajador en segundo plano la añade al grafo aproximadamente 30 segundos después. marm_concept_build sigue estando disponible para una reconstrucción completa o limitada. Una vez que hay un grafo, marm_smart_recall añade entidades relacionadas acotadas, relaciones y código enlazado como un acompañante graph_context sin cambiar la clasificación de memoria primaria. marm_concept_recall sigue disponible para exploración explícita del grafo:
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 connectedCómo usarlo:
Automático por defecto: los nuevos recuerdos llegan al grafo sin una llamada de herramienta. Establece
CONCEPT_AUTO_INDEX=falsepara volver solo a las compilaciones manuales, lo que detiene el trabajador pero mantiene las filas de la cola de registro, de modo que volver a activarlo retoma todo lo escrito mientras estaba desactivado;CONCEPT_INDEX_DEBOUNCE_SECONDS(30) yCONCEPT_INDEX_BATCH_SIZE(20) controlan el ritmo.Seguro en ambos transportes a la vez: un bloqueo con concesión en la base de datos de memoria evita que una recompilación en un proceso elimine tablas del grafo mientras otro proceso escribe en ellas. Una compilación que encuentra el grafo ocupado lo indica en lugar de colisionar.
El fallo nunca llega a tus recuerdos: la indexación se ejecuta en una cola duradera fuera de la ruta de escritura. Los problemas de extracción se reintentan, un recuerdo que falla repetidamente se aparca con su error, y el recuerdo en sí mismo se almacena y recupera con normalidad durante todo el proceso.
Limpiar un retraso cuesta algo de velocidad de recuperación: la extracción de entidades consume mucha CPU, por lo que mientras el trabajador procesa una cola, la recuperación medida pasa de ~8 ms a ~16 ms mediana en un corpus real de 768 recuerdos. Las escrituras no se ven afectadas. Solo se aplica mientras se drena un retraso, que para la mayoría de las personas ocurre una vez, después de la recompilación de la actualización. Reproducelo con
scripts/benchmarking/performance/bench_concept_worker.py --from-live.Compila para el retraso:
marm_concept_buildlimitado a unsession_name,projectosearch_all=Trueindexa recuerdos almacenados antes de que existiera la indexación automática, y reconstruye después de una actualización que lo requiere.Dos actualizaciones hasta ahora: los grafos construidos antes de la atribución de plataforma, o antes de que las fuentes de compactación reemplazaran los resúmenes como filas indexadas, requieren
marm_concept_build(search_all=True). Una compilación completa hace una copia de seguridad y restablece solo la base de datos de conceptos derivados; las compilaciones dirigidas se niegan a adivinar la propiedad de la plataforma.Ámbito completo, paginado: las compilaciones leen cada recuerdo dentro del ámbito.
CONCEPT_BUILD_ROW_CAP(predeterminado 500) es el tamaño de página, así que reducirlo hace que una compilación lea más páginas más pequeñas en lugar de saltarse el resto.Sesiones compactadas: los recuerdos originales se indexan y el resumen generado no, por lo que los conceptos permanecen atribuidos a donde se declararon realmente.
La recuperación falla de forma abierta: un grafo de conceptos faltante, vacío, incompatible o no disponible nunca bloquea la recuperación normal de recuerdos. La respuesta informa del estado del grafo por separado.
Enlace cruzado de código: cuando el grafo de código ha indexado el mismo proyecto, las entidades de concepto que coinciden con símbolos de código se vinculan, conectando "lo que decidimos" con "dónde vive en el código".
Entorno de ejecución de extracción incluido: el entorno de ejecución de spaCy y el modelo de extracción en inglés se distribuyen con MARM pero se cargan solo en la primera extracción, que ahora ocurre por sí sola poco después de que se almacena el primer recuerdo, en lugar de cuando ejecutas una compilación. Si una instalación dañada o parcial los hace no disponibles, ambas herramientas de concepto se degradan limpiamente mientras la memoria central permanece disponible; ejecuta
marm-memory knowledge status, luego reinstala MARM si es necesario.Almacenamiento aislado: el grafo de conceptos reside en su propia base de datos SQLite (
~/.marm/index/marm_index.db) con su propio grupo de conexiones, por lo que las escrituras del grafo de conceptos nunca pueden bloquear o corromper la base de datos de memoria de producción.Atlas de consola: MARM Console renderiza el atlas completo hasta 750 entidades y 6 000 relaciones almacenadas. Los grafos más grandes utilizan una muestra conectada determinista de hasta 600 entidades y 4 000 bordes visuales agregados, claramente etiquetados como muestra.
Esto llena el vacío de estructura entre sesiones que deja la búsqueda plana de memoria: las sesiones organizan los recuerdos, pero el grafo de conceptos los conecta, por lo que "¿qué depende de la cola de escritura?" es respondible incluso cuando la respuesta abarca cinco sesiones de tres agentes diferentes.
Arquitectura y funcionamiento interno
Todo lo anterior se ejecuta sobre un pequeño número de mecanismos deliberados. Esta sección es el mapa completo, para que tú (o tu agente) nunca tengan que adivinar qué está haciendo el servidor.
Motor de almacenamiento
SQLite en modo WAL en
~/.marm/marm_memory.dbcon un grupo de conexiones (5 conexiones). WAL mantiene a los lectores desbloqueados durante las escrituras, lo que importa cuando varios agentes recuerdan mientras uno escribe.Índice de texto completo FTS5 (
memories_fts) se mantiene como una tabla de contenido externo sobre la tabla de recuerdos y potencia tanto el carril exacto (BM25) como la etapa de filtro de la recuperación híbrida.Almacenamiento de fragmentos: los recuerdos de más de ~180 palabras se dividen en fragmentos superpuestos de 150 tokens (superposición de 50 tokens) en una tabla
memory_chunks, cada uno con su propia incrustación. La recuperación puntúa los fragmentos y colapsa en el recuerdo padre.Incrustaciones provienen del codificador
jinaai/jina-embeddings-v2-small-enrespaldado por fastembed: 33 millones de parámetros, 512 dimensiones, una ventana de contexto de 8 192 tokens y una licencia Apache-2.0. No requiere prefijos de texto de consulta/documento separados. El codificador se carga perezosamente en el primer uso semántico y se serializa detrás de un bloqueo para que las codificaciones concurrentes no puedan corromperse entre sí. Si no está disponible, las escrituras aún tienen éxito; los recuerdos se almacenan sin incrustaciones hasta que se cargue. La puntuación semántica se ejecuta como un único lote de NumPy (coseno matricial) en lugar de un bucle en Python.El grafo de conceptos tiene su propia base de datos (
~/.marm/index/marm_index.db) y su propio grupo, reutilizando la misma implementación de grupo pero nunca compartiendo conexiones con el almacén de memoria. Aislamiento deliberado: una compilación experimental del grafo no debe poder detener el WAL de producción. La única excepción es la cola de indexación, que reside en la base de datos de memoria a propósito para que una memoria y su tarea de indexación se comprometan juntas; el grafo en sí permanece derivado y desechable.
Ruta de escritura
Cola de escritura serializada (activada por defecto): todas las escrituras de memoria fluyen a través de un trabajador interno asíncrono, eliminando la contención de escritores de SQLite bajo carga de múltiples agentes. La cola es genérica; las compactaciones pasan por el mismo trabajador, por lo que hay exactamente un escritor sin importar qué subsistema esté escribiendo.
MAX_QUEUE_SIZElo limita.Consolidación en tiempo de escritura (opt-in,
CONSOLIDATION_ENABLED=1) ejecuta dos capas antes de que aterrice un recuerdo:Capa 1, deduplicación exacta: se comprueba un hash SHA-256 del contenido normalizado dentro de la sesión; los aciertos de hash se verifican contra el contenido real antes de deduplicar, por lo que una colisión de hash almacena una nueva fila en lugar de fusionar silenciosamente contenido diferente.
Capa 2, fusión semántica: los casi duplicados por encima de
CONSOLIDATION_THRESHOLDde similitud de coseno se fusionan en lugar de acumularse. Esto nunca bloquea una escritura; si el codificador no está disponible, la escritura procede sin consolidar.El equilibrio se mide y publique: aproximadamente 9 veces el costo mediano de escritura (58 ms vs 6.5 ms) a cambio de un almacén que se mantiene limpio, porque las lecturas dominan las cargas de trabajo de memoria. Consulte la sección 3 de los puntos de referencia anteriores.
La indexación de conceptos es una bandeja de salida duradera: una escritura registra una tarea de indexación en la misma transacción que la memoria, por lo que una memoria no puede existir sin una. Un trabajador de fondo drena esa cola y escribe el grafo de conceptos. Nada en la ruta de escritura espera la extracción, y un proceso eliminado a media extracción no pierde trabajo porque la tarea es una fila en lugar de un trabajo en memoria. Ambos transportes ejecutan un trabajador, por lo que los dos se coordinan a través de un bloqueo con concesión en la base de datos de memoria en lugar de un bloqueo en proceso, que no los abarcaría.
Compactación (opt-in,
COMPACTION_ENABLED=1) es la Capa 3: después de suficientes escrituras en una sesión, un pase de fondo detecta grupos de recuerdos relacionados usando similitud de coseno más componentes conectados de unión-búsqueda, limitados por tamaño mínimo del grupo, edad mínima y un período de gracia de sesión activa para que nunca compacte trabajo en curso. MARM luego inyecta una solicitud limitada pidiéndole al agente conectado que resuma cada grupo:candidatos→etapa→revisión→aplicarodescartar. Los IDs de recuerdo fuente se conservan al aplicar, por lo que los resúmenes compactados permanecen rastreables hasta sus originales. Los resúmenes en etapa expiran (COMPACTION_STAGING_TTL_HOURS), los avisos tienen un límite y un límite de reutilización, y la inyección tiene un presupuesto de bytes. El diseño es honesto sobre para qué sirven los LLM: MARM detecta, el agente resume, y un bucle de etapa/aplicar/descartar revisable por humanos controla el paso destructivo.
Ruta de recuperación
Cubierto en Entendiendo la memoria de MARM: carril exacto (FTS5 BM25 + respaldo LIKE), filtro→reordenar (candidatos FTS limitados → reordenación semántica por lotes → mezcla temporal), respaldo semántico limitado con una bandera de truncamiento explícito, y puntuación de colapso de fragmentos. La profundidad de recuperación (detalle=1/2/3) controla cuánto de cada recuerdo se devuelve, y cada respuesta MCP pasa a través de un limitador de respuesta de 1 MB que trunca el contenido de manera inteligente en lugar de romper el protocolo.
Protocolo de subproceso del grafo de código
El motor de grafo incluido se ejecuta como un proceso hijo supervisado, no como una importación:
Transporte: JSON-RPC 2.0 delimitado por nueva línea sobre el stdio del hijo, con un apretón de manos verificado (inicializar → capturar versión del servidor → notificación inicializada).
Cuidado con el sobre: las respuestas se escanean en busca del primer elemento de contenido analizable como JSON en lugar de asumir el índice 0, porque el binario ascendente puede anteponer un aviso de actualización. Los errores de herramienta llegan como
result.isError, no como errores JSON-RPC, y se convierten en diccionarios limpios{"status": "error"}con la propia sugerencia de remediación del ascendente adjunta.Serialización: un bloqueo protege cada ida y vuelta de escritura+lectura en la única tubería stdin; los llamantes asíncronos pasan por
asyncio.to_threadpara que el bucle de eventos nunca se bloquee en E/S de subproceso.Recuperación tras fallo: stderr se drena en un hilo de fondo, se detecta EOF/fallo del hijo, y el proceso se reanuda transparéntemente en la siguiente llamada. Los tiempos de espera deliberadamente no se tratan como fallos; una ejecución larga de índice puede estar todavía trabajando, y matarla destruiría el trabajo en curso.
Supervisión: un supervisor perezoso singleton posee el cliente durante la vida del proceso. El inicio se desencadena con la primera llamada de herramienta de grafo o con el sondeo de indexación automática si el binario del motor ya está descargado, nevera se elev al capa MCP, y verifica el equema de herramienta del binario fijado para que la deriva ascendent sea detectada al inicio en lugar de en medio de la llamada.
La reindexación automática se sondea por firma git, no se vigila por sistema de archivos: una tarea de fondo compara el
HEADde cada repositorio indexado y el estado sucio, calculado ejecutandogitfuera del motor para que una comprobación inactiva no cueste bloqueo del motor. Una confirmación desencadena una reindexación. Mientras el árbol está sucio, el repositorio se reindexa cada ciclo, porquegit statusinforma qué archivos cambiaron y no qué contienen, por lo que las ediciones repetidas a un archivo ya modificado producen una salida byte-identica que ninguna huella más barata puede distinguir. Git se ejecuta concore.fsmonitordeshabilitado y un entorno limpio, ya que esa configuración nombra un programa que git de otro modo ejecutaría desde un repositorio vigilado en un temporizador.Una puerta para cada mutación del almacén: los índices manuales en las tres superfices, el sondeo y la eliminación de proyecto pasan todos a través de una única fila con concesión en la base de datos de memoria. HTTP y STDIO son procesos separados con hijos de motor separados sobre un almacén de motor compartido, por lo que un bloqueo en proceso no puede abarcarlos. La concesión se libera cuando la llamada al motor realmente regresa, no cuando su llamante deja de esperar: una solicitud cancelada no puede entregar el almacén a otro proceso mientras el motor aún está escribiendo en él.
Seguridad y limitación de velocidad
Puerta de autenticación de dos modos: sin clave en loopback (
127.0.0.1),MARM_API_KEY(Bear) obligatoria en cuanto el servidor está expuesto en red (SERVR_HOST=0.0.0.0, Docker).--generate-keyproduce una. Seguro por defecto, cero fricción de configuración local.Limitación de velocidad basada en IP con ventanas deslizantes y bloques temporales, ajustados a través de preajustes de CLI en lugar de un laberinto de configuración (tabla a continución).
Local-primero: todo vive bajo
~/.marm/; sin sincronización en la nube, sin telemetría, sin almacenamiento externo.Apagado elegante: los manejadores de SIGTERM/SIGINT drenan y cierran limpiamente el grupo de conexiones, y un sistema de eventos internos ejecuta devoluciones de llamada de automatización con aislamiento de errores por devolución de llamada y tiempos de espera para que un gancho defectuoso no pueda atascar el servidor.
Presets de enjambre y multiagente
Indicador | Límite de tasa | Cola de escritura | Usar cuando |
(ninguno) | 80 RPM | habilitado | Uso local normal y configuraciones pequeñas de 3-5 agentes |
| 200 RPM | habilitado | Servidor HTTP compartido, aproximadamente 15-30 agentes según el estilo de escritura |
| 600 RPM | habilitado | Enjambre local/privado más pesado, aproximadamente 50-100 agentes según el estilo de escritura |
| deshabilitado | habilitado | Solo implementaciones privadas/de confianza |
| N RPM | sin cambios | Anulación personalizada; 0 desactiva la limitación |
La cola de escritura serializa las escrituras en memoria independientemente del preset; los indicadores de enjambre ajustan el límite de tasa HTTP además de eso. La cola controla el orden de escritura; la consolidación y la compactación son capas separadas de mantenimiento de memoria. Esta pila (WAL + pooling + un escritor serializado + presets RPM) está intencionalmente limitada a "SQLite, muchos agentes, una máquina"; la memoria distribuida multinodo está fuera del alcance del diseño actual.
Documentación automantenida
Los documentos empaquetados se indexan en el espacio de nombres de memoria marm_system al inicio y se actualizan cada 50 llamadas a herramientas, con seguimiento de hash de archivos fuente para que los documentos sin cambios se omitan y las filas modificadas o eliminadas se vuelvan a indexar. Los agentes conectados pueden responder preguntas sobre el uso de MARM con marm_smart_recall en lugar de que usted les pegue documentos.
Referencia de configuración
Variable | Default | What it controls |
|
| Dirección de enlace; |
|
| Puerto HTTP |
| (vacío) | Clave Bearer para despliegues expuestos en red |
|
| Ubicación de la base de datos de memoria |
|
| Ubicación de la base de datos del grafo conceptual |
| (auto-detectado) | Anulación de la atribución de proyecto/plataforma |
|
| Solicitudes por minuto por IP (los preajustes anulan) |
|
| Serializar escrituras a través de un solo worker |
|
| Candidatos BM25 obtenidos antes del reranking semántico; aumentar para almacenes con poca superposición de palabras clave, reducir para ajustar los resultados a las coincidencias de palabras clave más cercanas |
|
| Límite máximo del escaneo de respaldo semántico; |
|
| Cómo el recuerdo semántico construye su consulta de palabras clave: |
| (vacío) | Palabras extra separadas por comas para ignorar al construir consultas de palabras clave, para términos tan comunes en su almacén que no aportan señal |
|
| Cuánto influye la puntuación de palabras clave en la clasificación. Establecido a partir de un barrido de referencia; la precisión alcanza su punto máximo entre |
|
| Puntuación de palabras clave utilizada cuando solo coincide un recuerdo, o cuando todos los resultados empatan. Redúzcala en almacenes pequeños si una sola coincidencia de palabra clave no debe contar como perfecta. |
|
| Establecer en |
|
| Fuerza y decadencia del impulso de actualidad |
|
| Deduplicación en tiempo de escritura + fusión semántica |
|
| Similitud de coseno necesaria para fusionar casi duplicados. Se compara únicamente con la similitud de significado, no con la puntuación de clasificación combinada |
|
| Detección de clústeres en segundo plano + compactación asistida por agente |
|
| Escrituras por sesión antes de una pasada de compactación |
|
| Puertas de detección de clústeres |
|
| Cuánto tiempo esperan los resúmenes temporales antes de caducar |
|
| Interruptor de apagado para las 5 herramientas del grafo de código |
|
| Re-indexación automática de repositorios ya presentes en el grafo de código. Un interruptor guardado de |
|
| Segundos entre verificaciones de firma git por repositorio. Mínimo 5 |
|
| Segundos entre re-indexaciones para un directorio que no es un repositorio git, donde no existe una verificación de cambio económica. Mínimo 60 |
|
| Profundidad de indexación para re-indexaciones automáticas: |
|
| Cuánto tiempo permanece propiedad de la puerta de indexación una vez que nada la renueva. Una indexación en ejecución renueva su propio arrendamiento, por lo que esto limita cuánto tiempo un proceso eliminado bloquea la indexación, no cuánto tiempo puede tomar una indexación. |
|
| Cuánto tiempo se confía en la lista de proyectos vigilados antes de volver a leerla desde el motor |
|
| Filas de memoria leídas por página durante una construcción del grafo conceptual. No es un límite para la construcción: todos los recuerdos en el ámbito se leen de cualquier manera |
|
| Indexación conceptual automática de nuevos recuerdos. |
|
| Período de silencio después de una escritura antes de que comience la indexación, para que una ráfaga se convierta en una sola pasada |
|
| Recuerdos indexados por lote, con un límite máximo de 500. Reducirlo no disminuye la contención; se midió ligeramente peor |
|
| Pausa entre lotes mientras se limpia un backlog. Reduce el recuerdo en el peor de los casos durante la indexación de ~270 ms a ~80 ms durante aproximadamente un 18% más de tiempo de drenaje. |
|
| Cuánto tiempo permanece propiedad una tarea de indexación reclamada una vez que nada la renueva. El trabajo en curso renueva su propio arrendamiento, por lo que esto limita cuánto tiempo un proceso eliminado retiene tareas, no cuánto tiempo puede tomar un lote. Las tareas reclamadas no gastan intentos. |
|
| Intentos fallidos antes de que un recuerdo se estacione con su error en lugar de reintentarlo |
Solución de problemas
El valor predeterminado de Jina v2 Small utiliza embeddings de 512 dimensiones; los datos antiguos de all-MiniLM-L6-v2 son de 384 dimensiones y deben ser re-embedidos. Detenga todos los procesos MARM HTTP y STDIO, luego ejecute:
marm-memory maintenance embeddings migrateEsto re-embedde memoria, fragmento y cualquier vector existente del grafo de conceptos (las entradas del bloc de notas ya no llevan embeddings), informa el progreso, verifica ambas bases de datos y es reanudable después de una interrupción. Se niega a iniciar contra un servidor HTTP activo; los procesos STDIO no se pueden detectar de manera confiable y deben detenerse manualmente.
Reparar memorias fragmentadas
Las memorias de más de 500 palabras también se almacenan como fragmentos más pequeños. El tamaño de los fragmentos cambió entre versiones, y la migración anterior re-embedde los fragmentos sin dividirlos nuevamente, por lo que los fragmentos antiguos mantienen límites obsoletos. Detenga cada proceso MARM, luego ejecute:
marm-memory maintenance chunks rechunkEsto vuelve a dividir fragmentos obsoletos, completa los que se perdieron por una escritura interrumpida y elimina fragmentos de memorias que ahora están por debajo del umbral. Las memorias ya correctas se omiten sin cargar el codificador, por lo que volver a ejecutar no cuesta nada. La misma protección de servidor activo que arriba, además se niega cuando los vectores almacenados no coinciden con el modelo de embedding configurado: migre primero en ese caso. La recuperación funciona sin esto, solo que con menos precisión en memorias largas.
El servidor no arranca
Verifique la versión de Python:
python --version(debe ser 3.10+)Verifique que el puerto 8001 no esté en uso:
lsof -i :8001(macOS/Linux) onetstat -ano | findstr :8001(Windows)Verifique errores de permisos en el directorio home (
~/.marm/debe ser legible y escribible)Consulte la solución de problemas específica de la plataforma: INSTALL-DOCKER.md, INSTALL-WINDOWS.md, INSTALL-MACOS.md, INSTALL-LINUX.md
La conexión STDIO falla
Verifique que
marm-mcp-stdioesté en su PATH después de la instalación con pip:marm-mcp-stdio --helpAlternativamente, use:
python -m marm_mcp_server.server_stdioConsulte la documentación del cliente de IA para los requisitos de transporte STDIO
Intente la ejecución directa para ver mensajes de error:
python -m marm_mcp_server.server_stdio
El cliente de IA no puede conectarse a MARM
Verifique que el servidor esté ejecutándose con
curl http://localhost:8001/healthVerifique que el cortafuegos no esté bloqueando el puerto 8001
Para STDIO: use
marm-mcp-stdio(script de consola) opython -m marm_mcp_server.server_stdioReinicie tanto el servidor como el cliente de IA
Las herramientas no aparecen en el cliente de IA
Verifique el modo HTTP con
curl http://localhost:8001/healthRevise los registros del servidor en busca de errores de inicialización
Desconecte y vuelva a conectar el cliente de IA para actualizar la lista de herramientas
Tanto HTTP como STDIO exponen 14 herramientas: 7 herramientas principales de memoria/registro/bloc de notas/compactación, 5 herramientas de grafo de código incluidas y 2 herramientas de grafo de conceptos
Las herramientas de grafo devuelven graph backend unavailable
Confirme que
GRAPH_ENABLEDno esté configurado comofalse(afecta tanto a HTTP como a STDIO; las herramientas de grafo tienen paridad completa en ambos transportes)El primer uso del grafo puede tardar más mientras el motor de base de código fijado se inicia o se descarga localmente
En Docker, el binario del motor de grafo está incluido en la imagen; las instalaciones locales con pip pueden descargarlo en el primer uso del grafo
Las herramientas de memoria principal continúan funcionando incluso si el inicio del grafo falla
Las herramientas de concepto devuelven entities_extracted: 0
Primero confirme que una construcción de concepto con ámbito incluya realmente memorias con entidades extraíbles.
Ejecute
marm-memory knowledge status; si informa que falta un tiempo de ejecución o modelo, repare la instalación conpython -m pip install -U --force-reinstall marm-mcp-server.
Las nuevas memorias no aparecen en el grafo
Ejecute
marm-memory knowledge status.index_queue.pendinges cuántas memorias están esperando;index_queue.parkedes cuántas se rindieron.auto_index: falsesignifica que la indexación está desactivada.Espere el intervalo de debounce (30 segundos por defecto) más el tiempo de extracción. Una ráfaga de escrituras se indexa como una sola pasada, no una por memoria.
Verifique que
CONCEPT_AUTO_INDEXno esté configurado comofalse,0,noooff.Un grafo que espera una reconstrucción no se indexa. Si la Consola o
marm-memory knowledge statusinformarebuild_required, ejecutemarm_concept_build(search_all=True)una vez; las memorias en cola se recogen después.La indexación automática solo cubre memorias escritas desde la actualización. Ejecute una construcción una vez para incluir todo lo anterior.
Una memoria que falla la extracción tres veces se estaciona en lugar de reintentarse para siempre. La razón se registra con la tarea.
Los cambios de código no aparecen en el grafo de código
Ejecute
marm-memory projects auto status.enabled: falsesignifica que la reindexación automática está desactivada;source: overridesignifica que un interruptor guardado la desactivó, no el entorno.El repositorio debe indexarse una vez antes de ser vigilado.
marm-memory projects listmuestra lo que está inscrito.Espere el intervalo (30 segundos por defecto) más el tiempo de indexación. Un commit se recoge en la siguiente comprobación.
Un proyecto eliminado de la Consola permanece suprimido a propósito, por lo que una lista de vigilancia obsoleta no puede recrearlo. Indexarlo explícitamente lo reinscribe.
La indexación automática necesita el motor de grafo, que permanece inactivo hasta que se haya descargado el binario del motor. Cualquier llamada a herramienta de grafo lo descarga una vez.
Un índice devuelve index_in_progress
Otro proceso MARM mantiene la puerta de indexación, generalmente el sondeo del otro transporte o un trabajo de índice de la Consola. Eliminar un proyecto informa lo mismo, ya que una eliminación durante un índice sería deshecha por él. Ejecútelo de nuevo en un momento.
Una construcción devuelve build_in_progress
Otro proceso MARM está escribiendo el grafo, generalmente el trabajador de indexación del otro transporte. Las construcciones son cortas a menos que sea una reconstrucción completa; ejecútelo de nuevo en un momento.
Una construcción devuelve lock_lost
La construcción se estancó el tiempo suficiente para que otro proceso tomara el control del grafo, por lo que se detuvo a medio camino en lugar de escribir junto a él. Generalmente una máquina suspendida o una pausa del depurador. Lo que indexó antes de detenerse se conserva, y volver a ejecutar la construcción termina el resto.
Las memorias no se guardan
Verifique que el directorio
~/.marm/exista y tenga permisos de escrituraVerifique el espacio disponible en disco
Pruebe con una memoria simple: pida a la IA que guarde una sola línea y verifique con
marm_log_showPara modo HTTP, verifique la salud del servidor con
curl http://localhost:8001/health
La búsqueda no devuelve resultados
Verifique que existan memorias: use
marm_log_showpara listar entradasUse
search_all=Truepara buscar en todas las sesionesIntente consultas de búsqueda más simples y generales
Espere unos segundos; la primera búsqueda semántica carga el modelo ML
Las memorias aparecen y luego desaparecen
Verifique si MARM se reinició o falló (los datos persisten en
~/.marm/)Verifique que el espacio en disco no se haya llenado
Revise los registros del sistema en busca de errores de base de datos
Datos perdidos o corruptos
Detenga el servidor inmediatamente
Verifique el directorio
~/.marm/en busca de copias de seguridad (si las creó)Restaure desde la copia de seguridad: copie su copia de seguridad
~/.marm/de vuelta al directorio homeReinicie el servidor
Error de base de datos bloqueada
Cierre todas las conexiones del cliente de IA
Detenga el servidor:
Ctrl+CHaga una copia de seguridad de todo el directorio de la base de datos:
cp -r ~/.marm ~/.marm.backupVerifique los procesos que mantienen la base de datos:
lsof ~/.marm/marm_memory.db(macOS/Linux) o verifique el Administrador de tareas (Windows)Si un proceso mantiene el bloqueo, termínelo
Verifique la integridad de la base de datos:
sqlite3 ~/.marm/marm_memory.db "PRAGMA integrity_check;"Si la verificación de integridad falla, restaure desde su copia de seguridad
Si la verificación de integridad pasa, el bloqueo debería liberarse; reinicie el servidor
Resultados de búsqueda lentos
La primera búsqueda es más lenta (el modelo se carga desde el disco); las búsquedas posteriores son más rápidas
Las bases de datos grandes (1000+ memorias) pueden tardar unos segundos
Limite las búsquedas: use
limit=10en lugar de resultados ilimitadosUse
marm_summarypara comprimir sesiones antiguas
El servidor usa demasiada memoria
Los blocs de notas con muchas entradas pueden acumularse; use
marm_notebook(action="clear")para podar entradas activasCierre conexiones de cliente de IA no utilizadas
Use
marm_compaction(action="review")para inspeccionar resúmenes de compactación preparados cuando la compactación está habilitada
Error | Causa | Solución |
| Puerto 8001 ocupado | Mate el proceso en el 8001 o use un puerto diferente |
| Directorio de base de datos no escribible |
|
| Dependencias faltantes | Reinstale desde |
| Múltiples procesos accediendo a la BD | Cierre otras conexiones, reinicie el servidor |
| El modelo de búsqueda semántica no se descargó | La primera ejecución toma tiempo; sea paciente, verifique la conexión a internet |
Para preguntas sobre el comportamiento de la memoria, transportes, clientes compatibles, compactación y copias de seguridad, consulte las FAQ.
Historial de estrellas
Contribuir
MARM da la bienvenida a colaboradores de todos los niveles. El código ayuda, pero también lo hacen los documentos, notas de configuración, pruebas con clientes, informes de errores, benchmarks y comentarios sobre flujos de trabajo reales de personas que usan herramientas de IA a diario.
Buenos lugares para ayudar:
Pruebe MARM con más clientes MCP, agentes IDE y sistemas operativos
Mejore documentos, capturas de pantalla, ejemplos y notas de configuración específicas de plataforma
Reporte errores o pasos de instalación confusos con detalles claros de reproducción
Comparta flujos de trabajo de memoria, hábitos de agentes e ideas de herramientas de uso real
Revise los issues abiertos
💡 ¿Quiere que su nombre aparezca en esta lista? ¡Consulte nuestra guía CONTRIBUTING.md para comenzar!
Únase a la comunidad MARM
Ayude a construir el futuro de la memoria de IA: ¡no se requiere programación!
Conéctese: MARM Discord | Discusiones de GitHub
Licencia y aviso de uso
Copyright © 2026 Ryan A. Lyell. MARM se publica bajo la Licencia Apache 2.0 (consulte NOTICE para la declaración de derechos de autor), y se aceptan bifurcaciones, experimentos e integraciones. MARM también incluye componentes de código abierto de terceros como codebase-memory-mcp bajo MIT; consulte THIRD_PARTY_NOTICES.md para la atribución. Si construye sobre él, facilite que las versiones no oficiales se distingan de las publicaciones del repositorio oficial de MARM para que los usuarios sepan lo que están instalando.
Documentación del Proyecto
Guías de Uso
README.md - Este archivo: guía de uso completa, referencia de herramientas, flujos de trabajo y arquitectura
PROTOCOL.md - Protocolo operativo MCP
FAQ.md - Respuestas a preguntas comunes sobre el uso de MARM
Instalación del Servidor MCP
INSTALL-DOCKER.md - Despliegue con Docker (recomendado)
INSTALL-WINDOWS.md - Guía de instalación en Windows
INSTALL-MACOS.md - Guía de instalación en macOS
INSTALL-LINUX.md - Guía de instalación en Linux
INSTALL-PLATFORMS.md - Guía de instalación en plataformas
Información del Proyecto
CONTRIBUTING.md - Cómo contribuir a MARM
CHANGELOG.md - Historial de versiones y actualizaciones
ACKNOWLEDGMENTS.md - Contribuyentes y agradecimientos
ROADMAP.md - Funciones planificadas y hoja de ruta de desarrollo
LICENSE - Términos de la licencia Apache 2.0
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