Mnemosyne
Mnemosyne 🧠
Motor de memoria jerárquico de nivel de producción, local-first, para agentes de IA autónomos.
Mnemosyne dota a los agentes de IA (Hermes, OpenClaw, OpenManus, Claude Desktop, Cursor, Windsurf, CrewAI, LangChain) con memoria a largo plazo permanente y estructurada. Conecta bóvedas Obsidian en Markdown legibles por humanos con PostgreSQL + pgvector (HNSW) de alta velocidad o SQLite de configuración cero, impulsando la búsqueda híbrida de fusión por rango recíproco (RRF), los grafos de conocimiento por wikienlaces, el decaimiento temporal de Ebbinghaus, el intercambio de memoria entre flotas de agentes y la sincronización asíncrona en la nube con Google Drive.
📑 Índice
Related MCP server: Synapto
⚡ Matriz completa de funcionalidades
Funcionalidad | Descripción | Beneficio | ||
🤖 MCP nativo (v2024-11-05) | Servidor de protocolo JSON-RPC stdio estandarizado | Integración directa sin fricciones en Claude, Cursor, Windsurf, Hermes, OpenClaw | ||
🔎 Búsqueda vectorial HNSW de alto recall | Indexación HNSW de | Recuperación vectorial en sub-milisegundos sin reentrenamiento de clústeres | ||
⚖️ Recuperación híbrida RRF | Fusión por rango recíproco de embeddings densos (1.0) + GIN FTS (0.8) + Grafo (0.6) + Saliencia (0.2) | Captura palabras técnicas exactas (CVE, tokens de código) y semántica difusa | ||
🏛️ Alcance por Wing y Room | Taxonomía de 2 niveles ( | Elimina la saturación de la ventana de contexto y la alucinación entre dominios | ||
🌐 Memoria compartida entre agentes |
| Inteligencia colectiva de la flota sin comprometer las bases de datos privadas | ||
☁️ Sincronización asíncrona con Google Drive | Motor de sincronización bidireccional local-first con comparación MD5 y resolución de ramas | E/S local del agente en sub-milisegundos + copia de seguridad automática en la nube e intercambio en equipo | ||
⏳ Decaimiento temporal de Ebbinghaus | Decaimiento exponencial $Salience_t = Salience_0 \times (0.95)^{\Delta t}$ con autoarchivado a los 90 días | Poda automática del ruido transitorio y mantiene nítidos los recuerdos activos | ||
📌 Inmunidad de memoria anclada | Inmunidad permanente al decaimiento mediante | Garantiza que las instrucciones fundacionales y las reglas principales nunca se desvanezcan | ||
📖 Obsidian Zettelkasten | Escribe notas Markdown legibles por humanos con frontmatter YAML y | Inspección visual directa, edición y visualización de grafos en Obsidian | ||
📜 Ingestor consciente de turnos | Fragmentación con ventana deslizante de 1.500 caracteres con solapamiento de 200 caracteres a lo largo de los límites de turno | Preserva todo el historial de la conversación sin romper bloques de código | ||
🛡️ Armadura contra inyección de prompts | Neutraliza tokens de control (`< | im_start | > | Evita el envenenamiento de memoria y los ataques de secuestro de contexto |
⚡ Compatibilidad con FastEmbed ONNX | Motor de embeddings de ONNX Runtime ultraligero (~30MB de RAM) | 90% de reducción de memoria frente al pesado PyTorch | ||
🔄 Recurso de reserva SQLite sin configuración | Alternancia automática a SQLite local cuando PostgreSQL no está disponible | Paridad total de funcionalidades para estaciones de trabajo de desarrollo independientes |
🏗️ Arquitectura del sistema
┌──────────────────────────────────────────────┐
│ AI Agents & LLM Frameworks │
│ Hermes • OpenClaw • Claude • Cursor • Manus │
└──────────────────────┬───────────────────────┘
│ JSON-RPC (stdio) / Python SDK
▼
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Mnemosyne Core (v3.4.0) │
│ │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ Admission & Security │ │ Multi-Backend Embedder │ │ Turn-Aware Session Ingestor │ │
│ │ - Secret Regex Guard │ │ - FastEmbed (ONNX 30MB) │ │ - Turn boundary splitting │ │
│ │ - Injection Neutralizer │ │ - Remote Microservice │ │ - 1500-char linear sliding window │ │
│ │ - Path Traversal Guard │ │ - SentenceTransformers │ │ - Sequential [[Wiki Link]] chaining │ │
│ └─────────────────────────┘ └─────────────────────────┘ └─────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ Hybrid RRF Retrieval & Graph Ranker │ │
│ │ RRF Score = 1.0 * Dense(HNSW) + 0.8 * Keyword(FTS) + 0.6 * Graph + 0.2 * Salience │ │
│ └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────┬───────────────────────────────────────┬─────────────────────────────┘
│ │
┌───────────────────────┴───────────────────────┐ │
▼ ▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────────────────────────┐
│ PostgreSQL + pgvector │ │ Obsidian Markdown Vault (Local) │
│ - HNSW vector_cosine_ops │ │ - Human-Readable Markdown + YAML Frontmatter │
│ - GIN tsvector English FTS │ │ - [[Wikilink]] Knowledge Graph Visualizer │
│ - Self-Healing DB Pool │ │ - Atomic Writes with EXDEV Fallback │
│ - Private DB + shared_db │ └──────────────────────┬──────────────────────┘
└─────────────────────────────┘ │ Async Background Sync
▼
┌─────────────────────────────────────────────┐
│ Google Drive Cloud │
│ - Service Account / OAuth2 Authentication │
│ - MD5 Checksum Verification │
│ - Sibling .conflict-TIMESTAMP.md Resolution │
└─────────────────────────────────────────────┘🧠 Análisis profundo de las capacidades clave
1. Taxonomía jerárquica de Wing y Room
La contaminación cruzada de la memoria es un modo de fallo importante en flotas multiagente. Mnemosyne estructura la memoria como un palacio físico de 2 niveles:
wing(dominio/proyecto): límite de dominio de nivel superior (p. ej.,ecommerce,pentest,devops,shared).room(tema/canal): partición de tema granular (p. ej.,database,firewall,stripe_api).
Las consultas pueden acotarse estrictamente a un wing o room específicos, lo que evita que los prompts de marketing recuperen hallazgos de pruebas de penetración.
2. Búsqueda híbrida de fusión por rango recíproco (RRF)
La búsqueda vectorial estándar falla con cadenas técnicas exactas (p. ej., CVE-2024-38077, 0x7fff5fbff8c0), mientras que la búsqueda por palabras clave falla con conceptos semánticos. Mnemosyne ejecuta una recuperación multicandidata y fusiona los resultados mediante RRF ponderado:
$$\text{RRF Score}(d) = \sum_{m \in \text{modes}} w_m \cdot \frac{1}{k + \text{rank}_m(d)} + 0.2 \cdot \text{Salience}(d)$$
Búsqueda vectorial HNSW densa: Peso $1.0$ (distancia coseno sobre embeddings de 384 dimensiones).
Búsqueda de texto completo en PostgreSQL: Peso $0.8$ (
tsvectorponderado con título comoAy contenido comoB).Recorrido recursivo de grafo: Peso $0.6$ (CTE recursivo que descubre
[[Wiki Links]]de 1 salto y 2 saltos).Motor de saliencia de memoria: Peso $0.2$ (puntuación de importancia de $0.0$ a $1.0$).
3. Capa de memoria compartida entre agentes (shared_db)
En entornos multiagente autónomos, los agentes mantienen bases de datos privadas aisladas (toy_db, old_db, candy_db, etc.) para evitar la corrupción del estado. Sin embargo, la inteligencia colectiva requiere compartir políticas globales y hechos verificados.
Publicación: mediante
memory_publish_shared, las notas verificadas se publican enshared_db.Selección de credenciales: el contenido se analiza con filtros regex estrictos para claves de Anthropic (
sk-ant-), claves de Google Gemini (AIza...), tokens de HuggingFace (hf_...), claves de OpenAI (sk-proj-...), claves de acceso de AWS (AKIA...), tokens de Slack (xox-) y claves privadas.Recuperación con degradación suave: cuando un agente consulta la memoria,
memory_recallconsulta tanto el almacén privado comoshared_db. Si la base de datos compartida no está disponible temporalmente, se degrada con elegancia sin interrumpir al agente.
4. Decaimiento temporal de Ebbinghaus e inmunidad anclada
Los recuerdos pierden relevancia de forma natural con el tiempo. Mnemosyne implementa la curva exponencial de olvido de Herman Ebbinghaus:
$$\text{Salience}(t) = \text{Salience}0 \times (0.95)^{\Delta t{\text{days}}}$$
Retroalimentación de acceso: acceder a un recuerdo actualiza
last_accessed_at, reiniciando su decaimiento.Autoarchivado nocturno: la consolidación transfiere automáticamente las notas con $\text{Salience} < 0.05$ y sin acceso durante $>90\text{ días}$ a
status = 'archived'.Inmunidad anclada: las reglas del sistema, las políticas principales o las notas marcadas con
pinned=Trueo etiquetadas con#pinnedreciben inmunidad permanente frente al decaimiento temporal ($\text{Salience} = 1.0$).
5. Obsidian Markdown Vault y grafo bidireccional
Cada recuerdo creado por un agente se escribe simultáneamente como un archivo .md legible por humanos dentro de tu bóveda de Obsidian:
Frontmatter Zettelkasten: contiene
title,date,tags,type,salience,wingyroom.Grafo de conocimiento: las notas objetivo mencionadas como
[[Target Note]]se analizan automáticamente en aristas bidireccionales en PostgreSQL.Inspección en vivo: abre Obsidian en tu escritorio o dispositivo móvil y explora la memoria colectiva de tu flota de agentes en la Vista de Grafo interactiva de Obsidian.
6. Ingestor de sesiones verbatim consciente de turnos
Las transcripciones de conversaciones suelen contener matices cruciales que se pierden en la síntesis con pérdida. memory_ingest_session:
Divide las transcripciones en bruto a lo largo de los límites de turno (
User:,Assistant:,### Turn,**Human**:).Para turnos de más de 1.500 caracteres, aplica una ventana deslizante lineal (1.500 caracteres con solapamiento de 200 caracteres).
Encadena fragmentos secuenciales mediante wikienlaces
[[Session ... Turn 01 Part 02]], preservando bloques de código, trazas de ejecución y el flujo conversacional.
7. Sincronización asíncrona en la nube con Google Drive
Mantén las bóvedas de tus agentes respaldadas de forma segura y sincronizadas entre varias máquinas o dispositivos móviles:
Velocidad local primero: Las llamadas de herramientas del agente se ejecutan a velocidades de SSD local (<1ms) sin bloquearse por la latencia de red de Google Drive.
Demonio en segundo plano / sincronización Cron: Escanea los archivos del vault, calcula sumas de verificación MD5 y sincroniza los deltas bidireccionalmente con Google Drive.
Resolución de conflictos: Si un archivo se modifica simultáneamente en Google Drive y en el vault local del agente, Mnemosyne guarda la versión entrante como
NoteName.conflict-YYYYMMDD-HHMMSS.md, evitando la pérdida de datos.Autenticación: Admite JSON de cuenta de servicio de Google Cloud (
GOOGLE_APPLICATION_CREDENTIALS,GDRIVE_SERVICE_ACCOUNT_JSON) y tokens de usuario OAuth2 (GDRIVE_TOKEN_JSON).
8. Backends de incrustación flexibles (FastEmbed / Microservicio / Local)
Mnemosyne se adapta a cualquier presupuesto de recursos de despliegue:
FastEmbed ONNX Runtime (Recomendado para nodos independientes): Utiliza ejecución C++ de ONNX Runtime (~30MB de RAM). Cero sobrecarga de PyTorch.
Microservicio centralizado (
mnemosyne.embed_service): Aloja sentence-transformers en un único contenedor dedicado que sirve a múltiples contenedores de agentes a través de HTTP (MEMORY_EMBED_URL).SentenceTransformers local: Ejecución independiente de PyTorch (
all-MiniLM-L6-v2, 384 dimensiones).Respaldo de hash determinista: Hash vectorial matemático de cero RAM para entornos con restricciones extremas.
9. Seguridad en profundidad y blindaje contra inyecciones
Inmunidad a Path Traversal: Las comprobaciones canónicas de ruta de doble resolución (
is_relative_to) garantizan que las operaciones de archivos no puedan escapar de la raíz del vault.Escrituras atómicas en archivos hermanos: Los archivos se escriben en archivos temporales hermanos (
.note.pid.tmp) y se renombran atómicamente, con respaldo automático para montajes de volúmenes entre dispositivosEXDEV.Neutralización de tokens de control: Neutraliza los tokens de inyección de LLM (
<|im_start|>,<|system|>,[INST],<<SYS>>) en prosa mientras conserva los bloques de código tal cual.Envoltura de contexto XML estructurado: Las memorias recuperadas se envuelven en etiquetas
<recalled_memory_context id="..." title="..." source="...">con escape interno de etiquetas, lo que garantiza que los LLM anfitriones nunca confundan las memorias recuperadas con directivas activas del sistema.
🛠️ Referencia de herramientas MCP (8 herramientas)
Las 8 herramientas se exponen de forma nativa a los agentes mediante MCP JSON-RPC stdio estándar:
1. memory_remember
Almacena una nota de memoria privada en el vault con incrustación semántica, etiquetas y alcance jerárquico.
{
"title": "PostgreSQL HNSW Tuning",
"content": "For datasets >10,000 vectors, use HNSW with m=16 and ef_construction=64 for optimal recall.",
"tags": ["database", "pgvector", "performance"],
"wing": "engineering",
"room": "databases",
"salience": 0.8,
"pinned": true
}2. memory_publish_shared
Publica un hallazgo o política depurados y verificados en la memoria compartida de la flota entre agentes (shared_db).
{
"title": "Fleet Security Policy: SSL Verification",
"content": "All internal agent HTTP requests must enforce SSL certificate validation.",
"tags": ["security", "policy"],
"wing": "shared",
"room": "general"
}3. memory_recall
Busca memorias en las bases de datos privadas y compartidas de la flota mediante RRF híbrido, vectores HNSW, palabras clave o grafos.
{
"query": "HNSW index configuration parameters",
"mode": "hybrid",
"top_k": 5,
"scope": {
"wing": "engineering",
"room": "databases"
},
"include_shared": true
}4. memory_ingest_session
Ingiere y fragmenta una transcripción completa de conversación, palabra por palabra, siguiendo los límites de turno.
{
"transcript": "User: How do we configure pgvector?\nAssistant: Use CREATE EXTENSION vector; then create an HNSW index.",
"wing": "engineering",
"room": "sessions"
}5. memory_timeline
Inspecciona las operaciones de memoria recientes (remember, recall, remind, consolidate) en orden cronológico.
{
"limit": 20
}6. memory_history
Visualiza el historial de versiones y las instantáneas de ediciones anteriores de una nota de memoria específica antes de las actualizaciones.
{
"title": "PostgreSQL HNSW Tuning",
"limit": 5
}7. memory_remind_me
Programa un recordatorio prospectivo futuro o una tarea recurrente.
{
"title": "Rotate Database Credentials",
"content": "Verify that all 5 agent connection pools are refreshed with new passwords.",
"trigger_at": "2026-09-01T00:00:00Z",
"recurring": "monthly"
}8. memory_audit
Obtén métricas de salud de memoria en tiempo real, estado del backend de almacenamiento, contadores de solicitudes y alas activas.
{}🌐 Arquitectura de producción de flota multiagente
En configuraciones de producción multiagente (como la flota Hermes de 5 agentes), Mnemosyne aísla las bases de datos de los agentes en una red Docker interna mientras proporciona inteligencia compartida:
┌─────────────────────────────────────────┐
│ Production VPS (${VPS_HOST}) │
└────────────────────┬────────────────────┘
│
┌───────────────────┬──────────────────┼───────────────────┬──────────────────┐
▼ ▼ ▼ ▼ ▼
┌──────────────────┐┌──────────────────┐┌──────────────────┐┌──────────────────┐┌──────────────────┐
│ hermes-agent ││ hermes-assistant ││ hermes-marketing ││ hermes-pentest ││ hermes-trader │
│ (Toy) ││ (Old) ││ (Candy) ││ (Pencil) ││ (Coin) │
│ Database: ││ Database: ││ Database: ││ Database: ││ Database: │
│ toy_db ││ old_db ││ candy_db ││ pencil_db ││ trader_db │
└────────┬─────────┘└────────┬─────────┘└────────┬─────────┘└────────┬─────────┘└────────┬─────────┘
│ │ │ │ │
└───────────────────┴──────────────────┼───────────────────┴──────────────────┘
│
▼
┌───────────────────────────────────┐
│ PostgreSQL + pgvector (HNSW) │
│ - Private DBs: toy_db, old_db.. │
│ - Shared DB: shared_db │
└───────────────────────────────────┘🚀 Inicio rápido e instalación
1. Instalación
# Standard installation
pip install mnemosyne-memory
# With Google Drive Cloud Synchronization support
pip install "mnemosyne-memory[gdrive]"
# With lightweight FastEmbed ONNX support (~30MB RAM)
pip install "mnemosyne-memory[fastembed]"
# Full installation (All extras + Dev dependencies)
pip install "mnemosyne-memory[dev,gdrive,fastembed,embed-service]"2. Ejecutar con Docker Compose
Inicia el contenedor de PostgreSQL + pgvector:
docker compose up -d3. Lanzar el servidor MCP
# Standalone with local SQLite (Zero configuration)
python -m mnemosyne server
# With PostgreSQL + pgvector
MEMORY_DB_DSN="postgresql://mnemosyne:***@localhost:5432/my_agent_db" python -m mnemosyne server🤖 Recetas de integración con frameworks de agentes
1. Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"mnemosyne": {
"command": "python3",
"args": ["-m", "mnemosyne", "server"],
"env": {
"MEMORY_VAULT_PATH": "/Users/username/Documents/Obsidian/AgentVault",
"MEMORY_DEFAULT_WING": "claude"
}
}
}
}2. Cursor IDE (.cursor/mcp.json)
{
"mcpServers": {
"mnemosyne": {
"command": "python3",
"args": ["-m", "mnemosyne", "server"],
"env": {
"MEMORY_VAULT_PATH": "./.vault",
"MEMORY_DEFAULT_WING": "codebase"
}
}
}
}3. Hermes Agent (~/.hermes/config.yaml)
mcp_servers:
obsidian_memory:
command: python3
args: ["-m", "mnemosyne", "server"]
env:
MEMORY_DB_DSN: "postgresql://mnemosyne:***@${DB_HOST}:5432/toy_db"
MEMORY_SHARED_DSN: "postgresql://mnemosyne:***@${DB_HOST}:5432/shared_db"
MEMORY_VAULT_PATH: "/opt/data/vault"4. OpenClaw (openclaw-config.yaml)
plugins:
mcp_servers:
mnemosyne:
command: "python3"
args: ["-m", "mnemosyne", "server"]
env:
MEMORY_VAULT_PATH: "~/.openclaw/vault"
MEMORY_DEFAULT_WING: "openclaw"5. SDK de Python y scripts de agentes autónomos
from mnemosyne import UnifiedMemorySystem
mem = UnifiedMemorySystem(
vault_path="~/.agent/vault",
dsn="postgresql://mnemosyne:***@localhost:5432/agent_db",
shared_dsn="postgresql://mnemosyne:***@localhost:5432/shared_db"
)
# Remember fact
mem.remember(
title="Kubernetes Cluster Policy",
content="Deployments in staging must specify resource memory limits.",
wing="infrastructure",
room="k8s",
tags=["kubernetes", "policy"],
pinned=True
)
# Hybrid recall
results = mem.recall(
query="staging memory limits",
mode="hybrid",
scope={"wing": "infrastructure"}
)
for r in results:
print(r["title"], "->", r["formatted_context"])💻 Referencia completa de comandos CLI
Mnemosyne incluye una CLI de gestión con todas las funciones:
# 1. Store a memory note
python -m mnemosyne remember "API Architecture" "Uses Bearer JWT auth." --tags security auth --wing backend --room api --salience 0.8 --pinned
# 2. Publish shared fleet memory
python -m mnemosyne publish-shared "Global Production Policy" "Always check SSL certs." --wing devops
# 3. Search memories
python -m mnemosyne recall "JWT authentication" --mode hybrid --top-k 5 --wing backend
# 4. View activity timeline
python -m mnemosyne timeline --limit 20
# 5. Trigger Ebbinghaus decay & link reconciliation
python -m mnemosyne consolidate --decay-rate 0.95 --archive-threshold 0.05
# 6. Check system statistics & health
python -m mnemosyne stats
# 7. Synchronize with Google Drive (One-off pass)
python -m mnemosyne sync-gdrive --folder "My-Agent-Vault" --credentials service-account.json
# 8. Run Google Drive Sync as a background daemon
python -m mnemosyne sync-gdrive --daemon --interval 60
# 9. Run standalone Centralized Embedding Microservice
python -m mnemosyne embed-service --host 0.0.0.0 --port 8000 --model all-MiniLM-L6-v2⚙️ Referencia de variables de entorno
Variable | Predeterminado | Descripción |
|
| Ruta del sistema de archivos al directorio local del vault de Obsidian Markdown |
| (ninguno) | DSN de PostgreSQL (p. ej. |
| (ninguno) | DSN de PostgreSQL para la base de datos opcional compartida de la flota entre agentes |
|
| Identificador del agente de origen en despliegues de flota multiagente |
| (ninguno) | URL del microservicio centralizado de incrustación remoto (p. ej. |
|
| Establece |
| (ninguno) | Ruta al JSON de cuenta de servicio de Google Cloud para la sincronización con Google Drive |
| (ninguno) | Contenido JSON serializado de las credenciales de cuenta de servicio de Google Cloud |
| (ninguno) | Contenido JSON serializado del token de usuario OAuth2 autorizado de Google |
|
| Desactiva los forks del tokenizador de HuggingFace para preservar la integridad del flujo stdio JSON-RPC |
|
| Desactiva las barras de progreso en stdio para mantener limpios los flujos MCP |
|
| Establece |
|
| Establece |
🧪 Pruebas y benchmarks
Mnemosyne mantiene una suite de pruebas integral (pruebas unitarias, pruebas de inyección de seguridad, pruebas SQLite y pruebas de integración en vivo con PostgreSQL pgvector):
# Run all unit tests
pytest tests/ -v -m "not integration"
# Run full test suite including live PostgreSQL + pgvector tests
MEMORY_DB_DSN="postgresql://mnemosyne:***@localhost:5432/test_db" pytest tests/ -v📄 Licencia
Licencia Apache-2.0. Creado para el ecosistema abierto de agentes autónomos. Consulta LICENSE para obtener más detalles.
Available Tools
9 toolsmemory_assemble_contextA
Retrieve and format high-salience memories into a strict token-budgeted XML prompt block ready for direct agent context injection.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | hybrid | |
| query | Yes | Search query to retrieve context for | |
| scope | No | Optional wing/room filter scope | |
| max_tokens | No | Maximum token budget for the assembled context | |
| include_shared | No | Whether to include shared fleet knowledge |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the tool retrieves rather than mutates, filters for 'high-salience', enforces a 'strict token-budget', and formats into XML. This is useful, though it doesn't explain how salience is determined or how failures/token-truncation are handled.
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 a single dense, front-loaded sentence with no filler. It names the primary action, the input type, the processing behavior, and the output format in an efficient structure.
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 covers the key output (XML prompt block) but leaves important gaps for a tool with five parameters and no annotations: the meaning of each `mode`, how `scope` is applied, the effect of `include_shared`, and expected behavior when the token budget is exceeded. The schema fills some gaps, but the description alone isn't fully complete for correct invocation.
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 80%, so the schema already documents most parameter meanings. The description adds some context around token budgeting and salience, but it doesn't elaborate on the `mode` enum, `scope` object, or `include_shared` flag beyond what the schema fields already say. This is adequate but not additive.
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 action ('Retrieve and format') and resource ('high-salience memories'), and specifies the unique output format: 'strict token-budgeted XML prompt block ready for direct agent context injection.' It doesn't explicitly name sibling alternatives, but the XML formatting and context-injection purpose distinguish it from tools like memory_recall or memory_timeline.
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 intended use is implied: assemble memory context for direct agent injection. It does not name when to use this over alternatives, nor provide any when-not-to-use guidance. The phrase 'ready for direct agent context injection' gives some context, but an agent would need to infer the comparison with memory_recall.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_auditA
Get memory system statistics, health check, active wings, and version info
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. The verb 'Get' strongly implies a read-only operation, and the listed outputs suggest no mutation. However, it does not explicitly state that no state changes occur, whether permissions are required, or whether the health check performs any active diagnostics.
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?
A single, compact sentence with no filler. The verb is front-loaded and each listed item contributes meaning. Every word earns its place, and the structure is easy for an agent to parse 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?
With zero parameters and no output schema, the description needs to convey what the tool returns. It does so by listing four output categories: statistics, health check, active wings, and version info. This is adequate for simple invocation, though the term 'active wings' is domain-specific and not expanded.
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 tool has zero parameters, so the schema provides no parameter documentation. Per the baseline for a zero-parameter tool, the description does not need to compensate for parameter gaps; it simply describes the operation's outputs, which is sufficient.
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 the specific verb 'Get' and names distinct resources: memory system statistics, health check, active wings, and version info. This makes the tool's focus clear and differentiates it from content-oriented siblings like memory_recall or memory_history, though it does not explicitly contrast itself with them.
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?
There is no guidance on when to choose memory_audit over sibling tools. While the system-level subject matter implies a diagnostic use case, the description does not explicitly state when to run an audit versus when to use memory_history, memory_timeline, or memory_assemble_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_historyB
View version history of a specific memory note (previous edits).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| title | Yes | The title of the note to check history for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It only indicates a read-style operation ('View') and says nothing about the shape of the returned history, ordering, pagination, or how 'previous edits' are represented.
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 a single, front-loaded sentence with no filler. It is easy to parse and economical, though it may be too terse to convey all necessary behavioral and parameter guidance.
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 simple read tool, the description names the resource and indicates the action, and the required title parameter is sufficient to invoke it. However, with no output schema and no annotations, the lack of return-format and limit semantics leaves clear gaps for an agent trying to use the results 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?
The title parameter is already documented in the schema, but the limit parameter has no description and the tool description adds no meaning for it. With 50% schema coverage, the description needed to compensate for the undocumented parameter and did not.
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 a specific verb ('View') and a precise resource ('version history of a specific memory note'), with the clarifying parenthetical 'previous edits'. It is immediately clear what the tool does, but it does not explicitly contrast with sibling tools such as memory_timeline or memory_audit.
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 conveys a clear use case: checking the previous edits of one specific note. It gives enough context for when an agent should invoke it, though it provides no explicit exclusions or alternative routing to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_ingest_sessionA
Ingest a full conversation transcript verbatim into memory, split along conversational turn boundaries.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | sessions | |
| wing | No | general | |
| transcript | Yes | The full conversation text to ingest |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It usefully disloses that content is stored verbatim and split by turn boundaries, but it does not explain side effects, storage semantics, deduplication, limits, or whether repeated ingestion creates duplicates. These would be valuable for a memory-mutating tool.
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?
One sentence, no filler, and the most decision-relevant information is front-loaded. The phrase about splitting along turn boundaries is efficiently included without bloating the description.
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 simple ingestion tool, the core invocation path is clear: provide the full transcript. However, no output schema or annotations exist, and the optional room/wing parameters are unexplained, so an agent would need to infer their purpose from names or defaults. This leaves some contextual ambiguity around storage targeting.
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 only 33%, with only 'transcript' having a schema description. The description adds meaning to the requied parameter by specifying 'verbatim' and 'split along conversational turn boundaries', but it does not explain the optional 'room' and 'wing' parameters, which remain defined only by their names 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 identifies the action ('Ingest'), the resource ('full conversation transcript'), the destination ('into memory'), and the precise behavior ('verbatim, split along conversational turn boundaries'). This distinguishes it from sibling tools like memory_remember or memory_recall, which likely handle individual memories rather than bulk ingestion.
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 this is for full multi-turn conversation transcripts, which suggests a bulk ingest use case distinct from memory_remember or memory_recall. However, it does not explicitly state when not to use it or name alternative tools, leaving any routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_recallB
Search memory by semantic meaning, keywords, or graph. Retrieves from both private and shared stores.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| query | Yes | ||
| scope | No | Restrict search to a wing and/or room | |
| top_k | No | ||
| include_shared | No | Whether to include cross-agent shared fleet memory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the tool retrieves from both private and shared stores and that search can be semantic, keyword-based, or graph-based. However, it does not mention return format, whether any filtering or ranking applies, or any access caveats.
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 a single concise sentence with no filler. The primary action and retrieval scope are front-loaded, making it easy to parse 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?
Given 5 parameters, a nested scope object, no output schema, no annotations, and several related sibling tools, this description is too sparse. It leaves important invocation details such as mode defaults, query semantics, shared-memory handling, and result expectations unexplained.
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 only 40%, and the description compensates poorly. It loosely maps to the mode enum with 'semantic meaning, keywords, or graph' and mentions shared/private stores, but it does not clarify the required query parameter, the meaning of hybrid mode, top_k behavior, or the nested scope object.
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 uses a specific verb and resource: 'Search memory' and lists search methods (semantic, keyword, graph). It is clear about what the tool does, though it does not explicitly differentiate itself from sibling tools like memory_timeline or memory_history.
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 the tool is for searching/recalling stored memories, but it gives no explicit guidance on when to prefer memory_recall over alternatives like memory_assemble_context, memory_timeline, or memory_remind_me. Usage context is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_rememberA
Store a private memory note in the vault with semantic embedding, tags, and hierarchical wing/room scope.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | Topic within the wing (e.g. woocommerce, firewall, docker) | general |
| tags | No | Categorical tags | |
| wing | No | Project/domain grouping (e.g. ecommerce, security, devops) | general |
| title | Yes | Short, unique title for the memory | |
| pinned | No | Set true to make permanently immune to Ebbinghaus temporal decay | |
| content | Yes | The memory content in markdown | |
| salience | No | Importance score 0.0-1.0 (default 0.5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does add useful behavioral context: 'private,' 'vault,' 'semantic embedding,' and hierarchy. It does not disclose behaviors such as duplicate-title handling, temporal decay, or return value, which leaves some opacity for a state-changing tool.
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?
One sentence, front-loaded with the verb, and every detail—privacy, vault, embedding, tags, scope—earns its place. There is no filler or 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?
Schema plus description covers what to pass, but the absence of annotations and output schema, combined with seven sibling tools, leaves gaps: no routing guidance versus ingestion/sharing tools and no statement of what happens on success or when a title already exists. Complete enough for basic invocation but not fully self-sufficient.
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 100% and each parameter already has meaningful descriptions (e.g., room is 'Topic within the wing'; pinned explains Ebbinghaus decay). The description adds only the notion of hierarchy, not substantive parameter semantics, so the baseline 3 is appropriate.
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 a specific action ('Store') and a specific resource ('private memory note in the vault') while naming key processing details: semantic embedding, tags, and hierarchical wing/room scope. 'Private' distinguishes it from shared publication, and the write verb separates it from retrieval siblings like memory_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?
Usage is implied by the store verb: use this when saving a private memory note. However, the description provides no explicit when-to-use or when-not-to-use guidance and names no alternatives, so an agent must infer the boundary against siblings like memory_ingest_session and memory_publish_shared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_remind_meB
Schedule a future reminder or recurring task
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| content | No | ||
| recurring | No | ||
| trigger_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Because no annotations are provided, the description carries the full burden of behavioral disclosure. It only states the basic scheduling action and omits important traits such as trigger_at format, how recurrence is applied, side effects when the reminder fires, and whether a memory entry is also created.
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 a single efficient, front-loaded sentence with no wasted words. However, its brevity comes at the cost of necessary parameter and behavior details, so it is concise but not fully appropriately sized.
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 tool with four parameters, no annotations, schema description coverage of 0%, and no output schema, this description is too thin. An agent cannot confidently determine how to provide trigger_at or how recurring should behave, so the definition is materially incomplete.
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, but it names no parameters directly. It only hints at 'future' and 'recurring', leaving title, content, trigger_at format, and the relationship between recurring and trigger_at undocumented.
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 uses a specific verb ('Schedule') and identifies the resource ('future reminder or recurring task'). This clearly distinguishes it from retrospective siblings like memory_recall, memory_timeline, and memory_history, and from memory_remember which implies storage rather than scheduling.
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 phrase 'Schedule a future reminder or recurring task' implies the core use case, but no explicit guidance is given about when to choose this over alternatives. There are no prerequisites, no exclusions, and no mention of sibling tools that might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_timelineB
View recent memory operations (remember, recall, remind, consolidate) as a chronological timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the burden of behavioral disclosure. 'View' and 'chronological timeline' imply a read-only listing, which is helpful, but no details are given about ordering direction, result format, pagination, or whether any side effects occur.
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?
A single, well-structured sentence that front-loads the main action and resource. Every word contributes value, and it includes useful examples of the operation types shown.
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 simple read-only timeline with one optional parameter, the description is mostly adequate. However, the lack of sibling differentiation, no mention of the `limit` parameter, and no output format details leave clear gaps for an agent deciding how to invoke it.
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 single parameter `limit` has zero schema description coverage and the tool description does not mention it at all. While the parameter is somewhat self-explanatory from its name and default value, the description adds no meaning 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 description states a specific verb ('View') and a clear resource ('recent memory operations') with examples of operation types. It is sufficiently clear that this is a timeline of memory operations, though it does not explicitly distinguish itself from the similarly named sibling 'memory_history'.
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 no guidance on when to use this tool versus siblings like `memory_recall` or `memory_history`, nor does it mention any alternative conditions. Usage context is only implied by the word 'View'.
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.
9 tool updates
v3.5.0- First observed
memory_assemble_context - First observed
memory_audit - First observed
memory_history - First observed
memory_ingest_session - First observed
memory_publish_shared - First observed
memory_recall - First observed
memory_remember - First observed
memory_remind_me - First observed
memory_timeline
TDQS
Scored across 9 tools
Most tools target distinct memory operations: storing, retrieving, scheduling, auditing, and publishing. Some overlap exists between memory_recall (search) and memory_assemble_context (curated retrieval), but their descriptions make the intended use clear.
All tool names follow a consistent memory_verb_noun pattern using snake_case (e.g., memory_ingest_session, memory_publish_shared). The one slight deviation is memory_remind_me, but it still fits the overall verb-first convention.
Nine tools cover the core memory management lifecycle without feeling bloated. The set is well-scoped for a memory server, with each tool serving a clear and necessary function.
The server covers storing, retrieving, scheduling, sharing, and diagnostics, but lacks explicit update or delete/forget tools. Memory_history implies prior edits exist, yet no edit tool is exposed, which is a notable gap for a memory management system.
Maintenance
Related MCP Connectors
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceGives AI agents persistent memory with semantic search, automatic extraction, and memory decay, accessible via MCP protocol.5 npmMIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent, searchable memory for MCP-compatible agents, enabling recall by meaning, automatic decay, trust scoring, and cross-agent handoffs.21 PyPI5MIT
- AlicenseAqualityDmaintenanceProvides persistent memory with semantic search for MCP-based AI agents, enabling them to store and recall information across sessions using vector embeddings.41MIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent, graph-based memory for AI agents using Neo4j and vector embeddings, enabling semantic recall across sessions via MCP.1Apache 2.0