mnemon-mcp

Memoria persistente en capas para agentes de IA — modelo de 4 capas, búsqueda FTS5, versionado de hechos, derivación EN+RU. Prioridad local, cero nube, archivo SQLite único.

Documentación

mnemon-mcp

CI npm version Node.js License: MIT

Memoria persistente en capas para agentes de IA. Local primero. Sin nube. Un único archivo SQLite.

Página de inicio · npm · GitHub

Tu agente de IA lo olvida todo después de cada sesión. Mnemon lo soluciona.

Le da a cualquier cliente compatible con MCP — OpenClaw, Claude Code, Cursor, Windsurf, o el tuyo propio — una memoria estructurada a largo plazo respaldada por una única base de datos SQLite en tu máquina. Sin claves API, sin nube, sin telemetría. Solo npm install y tu agente recuerda.

mnemon-mcp demo — memory_add, memory_search, memory_inspect, memory_update


¿Por qué memoria en capas?

Los almacenes planos de clave-valor tratan "lo que pasó ayer" igual que "nunca hagas commit sin pruebas". Eso está mal — diferentes tipos de conocimiento tienen diferentes ciclos de vida y patrones de acceso.

Mnemon organiza los recuerdos en cuatro capas:

CapaQué almacenaCómo se accedeCiclo de vida
EpisódicaEventos, sesiones, entradas de diarioPor fecha o períodoDecae (vida media de 30 días)
SemánticaHechos, preferencias, relacionesPor tema o entidadEstable
ProcedimentalReglas, flujos de trabajo, convencionesSe carga al inicioRara vez cambia
RecursoMaterial de referencia, notas de librosBajo demandaDecae lentamente (90 días)

Una entrada de diario del martes pasado y una regla de codificación que nunca cambia viven en capas diferentes — porque así debe ser.

Calidad de recuperación

La recuperación se mide contra un conjunto dorado de 50 casos en un corpus bilingüe real (RU/EN) de 797 memorias, a través del servidor MCP real — no una reimplementación. Números actuales (metodología e historial):

MétricaSolo FTSSolo vectorHíbrido (RRF)
Puntuación compuesta88.989.291.7
Recall@50.9070.8980.919
MRR0.8170.8320.878
nDCG@50.8160.8280.869
Precisión negativa1.0001.0001.000

El híbrido supera a ambas partes individualmente, que es todo el argumento para fusionarlas: la búsqueda léxica tiene mejor recall bruto, la búsqueda vectorial mejor ranking, y RRF conserva ambas en lugar de promediarlas.

El documento de evaluación también rastrea los fallos — deriva de puntuación bajo crecimiento del corpus, el error de ponderación de campos BM25 que la evaluación detectó, los dos casos donde la fusión aún pierde frente a la búsqueda léxica pura, y lo que el conjunto dorado no cubre. Los números que no se pueden auditar son marketing; lee cómo se producen.

Arquitectura

flowchart LR
    C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
    T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
    T --> M["memories + supersede chains"]
    I["KB import pipeline<br/>markdown → memories"] --> M
    M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
    R --> F
    R --> V["sqlite-vec (optional, BYOK)"]

Un único archivo SQLite contiene las memorias, el índice FTS5 y el índice vectorial opcional. Las escrituras pasan por transacciones que mantienen el invariante de la cadena de sustitución; las lecturas ejecutan el pipeline de recuperación escalonado descrito en Búsqueda.

El panorama completo — límites de módulos, rutas de escritura/lectura, invariantes y limitaciones conocidas — está en docs/ARCHITECTURE.md. Las decisiones de diseño se registran como ADR: núcleo SQLite+FTS5, recuperación híbrida RRF, controlador síncrono, modelo de memoria en capas.

Inicio rápido

Instalación

npm install -g mnemon-mcp

O desde el código fuente:

git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run build

Configura tu cliente MCP

OpenClaw
openclaw mcp register mnemon-mcp --command="mnemon-mcp"

O añade a ~/.openclaw/mcp_config.json:

{
  "mnemon-mcp": {
    "command": "mnemon-mcp"
  }
}
Claude Code

Añade a ~/.claude/mcp.json:

{
  "mcpServers": {
    "mnemon-mcp": {
      "command": "mnemon-mcp"
    }
  }
}
Cursor / Windsurf / Otros clientes MCP

Añade a la configuración MCP de tu cliente:

{
  "mcpServers": {
    "mnemon-mcp": {
      "command": "mnemon-mcp"
    }
  }
}
¿Ejecutando desde el código fuente?

Usa la ruta completa al punto de entrada compilado:

{
  "mnemon-mcp": {
    "command": "node",
    "args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
  }
}

Verificación

echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcp

Deberías ver 10 herramientas en la respuesta. La base de datos (~/.mnemon-mcp/memory.db) se crea automáticamente en la primera ejecución.

Eso es todo. Tu agente ahora tiene memoria persistente.

Qué puede hacer

10 herramientas MCP

HerramientaQué hace
memory_addAlmacena una memoria con capa, entidad, confianza, importancia y TTL opcional
memory_searchBúsqueda de texto completo o exacta con filtros por capa, entidad, fecha, alcance, confianza
memory_updateActualiza en el lugar o crea un reemplazo versionado (cadena de sustitución)
memory_deleteElimina una memoria; reactiva su predecesora si existe
memory_inspectObtiene estadísticas de capa o rastrea el historial de versiones de una sola memoria
memory_exportExporta a JSON, Markdown o formato Claude-md con filtros
memory_healthEjecuta diagnósticos: entradas expiradas, cadenas huérfanas, memorias obsoletas; GC opcional
memory_session_startInicia una sesión de agente — devuelve ID de sesión para agrupar memorias
memory_session_endTermina una sesión con resumen opcional; devuelve duración y recuento de memorias
memory_session_listLista sesiones con filtros por cliente, proyecto o estado activo

Recursos y prompts MCP

Recursos — datos en vivo que tu agente puede leer:

URIDevuelve
memory://statsEstadísticas agregadas por capa
memory://recentMemorias creadas/actualizadas en las últimas 24h
memory://layer/{layer}Todas las memorias activas en una capa
memory://entity/{name}Todas las memorias activas sobre una entidad

Prompts — flujos de trabajo preconstruidos:

PromptPropósito
recall"Cuéntame todo lo que sabes sobre X"
context-loadCarga contexto relevante antes de comenzar una tarea
journalCrea una entrada de diario estructurada

Búsqueda

Cuatro modos, todos con soporte de filtros por capa / entidad / alcance / fecha / confianza:

Modo FTS (predeterminado sin embeddings) — búsqueda de texto completo tokenizada con ranking BM25. Las consultas de varias palabras usan AND; si hay muy pocos resultados, OR complementa con una penalización de puntuación. La relajación progresiva de AND prueba los 3 términos más específicos antes de recurrir a OR completo.

Modo híbrido (predeterminado cuando hay embeddings configurados) — combina FTS5 + búsqueda vectorial mediante Fusión de Ranking Recíproco. Detecta entidades entre comillas en las consultas (p. ej., 'Essentialism') y ejecuta subconsultas ponderadas para recuperación de referencias cruzadas.

Modo vectorial — búsqueda pura de similitud coseno sobre embeddings.

Modo exacto — coincidencia de subcadena LIKE para búsquedas precisas de frases.

Puntuaciones: bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency

Impulso de actualidad: 1 / (1 + daysSince / 365) — recompensa suavemente las memorias creadas recientemente sin penalizar las antiguas.

Derivación (Stemming)

Se aplica el derivador Snowball tanto en tiempo de indexación como en tiempo de consulta para inglés y ruso. Esto significa que "running" coincide con "runs", y "книги" coincide con "книга". Las palabras vacías se filtran de las consultas para mejorar la precisión.

Versionado de hechos

El conocimiento evoluciona. Mnemon no elimina hechos antiguos — los encadena:

v1: "Team uses React 17"  →  superseded_by: v2
v2: "Team uses React 19"  →  supersedes: v1 (active)

La búsqueda devuelve solo la versión más reciente. memory_inspect con include_history: true revela la cadena completa. memory_delete reactiva la predecesora — nada se pierde.

Búsqueda vectorial (Opcional, BYOK)

Habilita la búsqueda de similitud semántica proporcionando tu propia API de embeddings:

# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp

# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcp

Esto desbloquea dos modos de búsqueda adicionales:

Requiere sqlite-vec (instalado como dependencia opcional). Las nuevas memorias se incrustan al añadirse; las existentes se pueden rellenar retroactivamente.

Configuración de embeddings
VariablePredeterminadoDescripción
MNEMON_EMBEDDING_PROVIDER—openai o ollama (sin definir = deshabilitado)
MNEMON_EMBEDDING_API_KEY—Clave API (requerida para OpenAI)
MNEMON_EMBEDDING_MODELtext-embedding-3-small / nomic-embed-textNombre del modelo
MNEMON_EMBEDDING_DIMENSIONS1024 / 768Dimensiones del vector
MNEMON_OLLAMA_URLhttp://localhost:11434Endpoint de Ollama

Importar una base de conocimiento

¿Tienes una carpeta de archivos Markdown? Impórtalos en lote:

cp config.example.json ~/.mnemon-mcp/config.json   # edit this first
npm run import:kb -- --kb-path /path/to/your/kb     # incremental (skips unchanged files)

La configuración asigna patrones glob a capas de memoria:

{
  "owner_name": "your-name",
  "extra_stop_words": [],
  "mappings": [
    {
      "glob": "journal/*.md",
      "layer": "episodic",
      "entity_type": "user",
      "entity_name": "$owner",
      "importance": 0.6,
      "split": "h2"
    },
    {
      "glob": "people/*.md",
      "layer": "semantic",
      "entity_type": "person",
      "entity_name": "from-heading",
      "importance": 0.8,
      "split": "h3"
    }
  ]
}

Campos de configuración

CampoTipoDescripción
owner_namestringTu nombre — se usa para la sustitución de $owner en entity_name
extra_stop_wordsstring[]Palabras a filtrar de las consultas FTS (p. ej., formas de tu nombre)
globstringPatrón de archivo a coincidir
layerstringCapa de memoria de destino
entity_typestringuser / person / project / concept / file / rule / tool
entity_namestringNombre literal, "$owner", o "from-heading" (extraer de H2/H3)
splitstring"whole" (una memoria por archivo), "h2", o "h3" (dividir por encabezados)
importancenumber0.0–1.0, afecta el ranking de búsqueda
confidencenumber0.0–1.0, filtrable en búsqueda
scopestringEspacio de nombres opcional

Transporte HTTP

Para configuraciones remotas o de múltiples clientes:

MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http
EndpointDescripción
POST /mcpMCP JSON-RPC (autenticación Bearer si hay token configurado)
GET /health{"status":"ok","version":"..."}

Se vincula a 127.0.0.1 por defecto. Vincular a cualquier otro host requiere MNEMON_AUTH_TOKEN — el servidor se niega a exponer el almacén de memoria a la red sin autenticación (anular con MNEMON_ALLOW_INSECURE_HTTP=1 en una red de confianza). Limitación de velocidad (100 req/min/IP por defecto), CORS opcional, límite de cuerpo de 1MB, autenticación a prueba de temporización, apagado elegante en SIGTERM.

Referencia de configuración

VariablePredeterminadoDescripción
MNEMON_DB_PATH~/.mnemon-mcp/memory.dbRuta de la base de datos
MNEMON_KB_PATH.Raíz de la base de conocimiento para importación
MNEMON_CONFIG_PATH~/.mnemon-mcp/config.jsonRuta de configuración de importación
MNEMON_AUTH_TOKEN—Token Bearer para transporte HTTP
MNEMON_HOST127.0.0.1Dirección de vinculación del transporte HTTP
MNEMON_PORT3000Puerto del transporte HTTP
MNEMON_CORS_ORIGIN—CORS Access-Control-Allow-Origin (sin encabezados CORS a menos que se configure)
MNEMON_RATE_LIMIT100Máximo de solicitudes por minuto por IP (0 = desactivado)

Referencia de herramientas

memory_add — lista completa de parámetros
ParámetroTipoRequeridoDescripción
contentstringSíTexto de la memoria (máx. 100K caracteres)
layerstringSíepisodic / semantic / procedural / resource
titlestringNoTítulo corto (máx. 500 caracteres)
entity_typestringNouser / project / person / concept / file / rule / tool
entity_namestringNoNombre de entidad para filtrado
confidencenumberNo0.0–1.0 (predeterminado 0.8)
importancenumberNo0.0–1.0 (predeterminado 0.5)
scopestringNoEspacio de nombres (predeterminado global)
source_filestringNoRuta del archivo fuente — activa auto-sustitución de entradas coincidentes
ttl_daysnumberNoAuto-expiración después de N días
valid_from / valid_untilstringNoVentana de hecho temporal (ISO 8601)
memory_search — lista completa de parámetros
ParámetroTipoObligatorioDescripción
querystringSíTexto de búsqueda
modestringNofts (predeterminado), exact, vector, hybrid
layersstring[]NoFiltrar por capas
entity_namestringNoFiltrar por entidad (admite alias)
scopestringNoFiltrar por ámbito
date_from / date_tostringNoRango de fechas (ISO 8601)
as_ofstringNoFiltro de hechos temporales — hechos válidos en esta fecha
min_confidencenumberNoConfianza mínima
min_importancenumberNoImportancia mínima
limitnumberNoMáximo de resultados (predeterminado 10, máximo 100)
offsetnumberNoDesplazamiento de paginación
memory_update — lista completa de parámetros
ParámetroTipoObligatorioDescripción
idstringSíID de memoria
contentstringNoNuevo contenido
titlestringNoNuevo título
confidencenumberNoNueva confianza
importancenumberNoNueva importancia
supersedebooleanNotrue = reemplazo versionado; false (predeterminado) = en el lugar
new_contentstringNoContenido para la entrada que sustituye
memory_delete
ParámetroTipoObligatorioDescripción
idstringSíID de memoria. Reactiva el predecesor si forma parte de una cadena de sustitución
memory_inspect
ParámetroTipoObligatorioDescripción
idstringNoID de memoria (omitir para estadísticas agregadas)
layerstringNoFiltrar estadísticas por capa
entity_namestringNoFiltrar estadísticas por entidad
include_historybooleanNoMostrar cadena de sustitución
memory_export
ParámetroTipoObligatorioDescripción
formatstringSíjson / markdown / claude-md
layersstring[]NoFiltrar por capas
scopestringNoFiltrar por ámbito
date_from / date_tostringNoRango de fechas
limitnumberNoMáximo de entradas (predeterminado todas, máximo 10K)
memory_health
ParámetroTipoObligatorioDescripción
cleanupbooleanNotrue = recolectar basura de entradas expiradas (predeterminado: solo informe)

Devuelve: estado (healthy / warning / degraded), estadísticas por capa, entradas expiradas, cadenas huérfanas, recuentos obsoletos/de baja confianza, recuento limpiado cuando cleanup=true.

memory_session_start
ParámetroTipoObligatorioDescripción
clientstringSíIdentificador del cliente (p. ej. claude-code, cursor, api)
projectstringNoÁmbito del proyecto para esta sesión
metaobjectNoMetadatos adicionales de la sesión

Devuelve: id (UUID de sesión), started_at (ISO 8601).

memory_session_end
ParámetroTipoObligatorioDescripción
idstringSíID de sesión a finalizar
summarystringNoResumen de lo logrado (máximo 10K caracteres)

Devuelve: id, ended_at, duration_minutes, memories_count.

memory_session_list
ParámetroTipoObligatorioDescripción
limitnumberNoMáximo de sesiones (predeterminado 20, máximo 100)
clientstringNoFiltrar por cliente
projectstringNoFiltrar por proyecto
active_onlybooleanNoDevolver solo sesiones que no han finalizado (predeterminado false)

Devuelve: matriz de sesiones con id, client, project, started_at, ended_at, summary, memories_count.

Cómo se compara

mnemon-mcpmem0basic-memoryEngramAnthropic KG
ArquitecturaSQLite FTS5 + vectorCloud API + QdrantMarkdown + vectorSQLite FTS5Archivo JSON
Estructura de memoria4 capas tipadasPlanaPlanaPlana + sesionesGrafo
BúsquedaFTS5 + híbrida RRFSemánticaHíbridaFTS5Exacta
Versionado de hechosCadenas de sustituciónParcialNoNoNo
Derivación (stemming)EN + RU (Snowball)Solo ENSolo ENNingunaNinguna
EmbeddingsBYOK (OpenAI / Ollama)IntegradoFastEmbedNingunoNinguno
Dependencias0 obligatoriasQdrant, Neo4jPython 3.12Binario GoNinguna
Nube obligatoriaNoSíNoNoNo
CostoGratis$19–249/mesGratisGratisGratis
Configuraciónnpm install -gDocker + claves APIpip + dependenciasInstalación GoIntegrada
LicenciaMITApache 2.0AGPLMITMIT

Análisis competitivo extendido con fuentes: docs/COMPETITORS.md.

Desarrollo

npm run dev        # run via tsx (no build step)
npm run build      # TypeScript → dist/
npm run lint       # eslint (flat config)
npm test           # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench      # performance benchmarks
npm run db:backup  # backup database

CI ejecuta compilación + lint + pruebas en Node 20 y 22, luego pruebas de humo del servidor compilado sobre JSON-RPC real (tools/list debe coincidir con el conjunto exacto de herramientas).

Stack: TypeScript 5.9 (modo estricto), better-sqlite3, @modelcontextprotocol/sdk, derivador Snowball, Zod, vitest.

Consulta CONTRIBUTING.md para las pautas de código.

Principios de diseño

  • Aislado por defecto — cero telemetría, siempre. De fábrica nada sale de la máquina; el único componente que habla con la red es el embedder opcional, y solo con el proveedor que configures (incluido un Ollama local).
  • Archivo único — una base de datos SQLite, cero operaciones, copia de seguridad instantánea mediante copia de archivo.
  • Búsqueda determinista — FTS5, no embeddings, es el predeterminado. Interpretable, reproducible, sin necesidad de GPU.
  • Estructurado sobre plano — las capas codifican patrones de acceso; las cadenas de sustitución codifican el tiempo.
  • Mínimo — 4 dependencias de producción. Funciona en cualquier lugar donde Node funcione.
  • Medido, no afirmado — los cambios en la recuperación se evalúan contra un conjunto dorado, regresiones incluidas.

Licencia

MIT