mnemon-mcp

Memória persistente em camadas para agentes de IA — modelo de 4 camadas, busca FTS5, versionamento de fatos, stemming EN+RU. Local-first, zero-cloud, arquivo SQLite único.

Documentação

mnemon-mcp

CI npm version Node.js License: MIT

Memória persistente em camadas para agentes de IA. Local-first. Zero-nuvem. Um único arquivo SQLite.

Página Inicial · npm · GitHub

Seu agente de IA esquece tudo após cada sessão. O Mnemon resolve isso.

Ele dá a qualquer cliente compatível com MCPOpenClaw, Claude Code, Cursor, Windsurf, ou o seu próprio — uma memória estruturada de longo prazo apoiada por um único banco de dados SQLite na sua máquina. Sem chaves de API, sem nuvem, sem telemetria. Apenas npm install e seu agente se lembra.

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


Por que Memória em Camadas?

Armazenamentos simples de chave-valor tratam "o que aconteceu ontem" da mesma forma que "nunca faça commit sem testes". Isso está errado — diferentes tipos de conhecimento têm diferentes tempos de vida e padrões de acesso.

O Mnemon organiza memórias em quatro camadas:

CamadaO que armazenaComo é acessadaTempo de vida
EpisódicaEventos, sessões, entradas de diárioPor data ou períodoDecai (meia-vida de 30 dias)
SemânticaFatos, preferências, relacionamentosPor tópico ou entidadeEstável
ProceduralRegras, fluxos de trabalho, convençõesCarregada na inicializaçãoRaramente muda
RecursoMaterial de referência, notas de livrosSob demandaDecai lentamente (90 dias)

Uma entrada de diário da última terça-feira e uma regra de codificação que nunca muda vivem em camadas diferentes — porque deveriam.

Qualidade da Recuperação

A recuperação é medida contra um conjunto dourado de 50 casos em um corpus bilíngue (RU/EN) real de 797 memórias, através do servidor MCP real — não uma reimplementação. Números atuais (metodologia e histórico):

MétricaSomente FTSSomente vetorHíbrido (RRF)
Pontuação composta88.989.291.7
Recall@50.9070.8980.919
MRR0.8170.8320.878
nDCG@50.8160.8280.869
Precisão negativa1.0001.0001.000

O híbrido supera ambas as pernas individualmente, o que é todo o argumento para fundi-las: a busca lexical tem o melhor recall bruto, a busca vetorial tem o melhor ranking, e o RRF mantém ambos em vez de calculá-los como média.

O documento de avaliação também rastreia as falhas — desvio de pontuação sob crescimento do corpus, o bug de ponderação de campo BM25 que a avaliação capturou, os dois casos em que a fusão ainda perde para a busca lexical pura, e o que o conjunto dourado não cobre. Números que você não pode auditar são marketing; leia como estes são produzidos.

Arquitetura

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)"]

Um único arquivo SQLite armazena memórias, o índice FTS5 e o índice vetorial opcional. Escritas passam por transações que mantêm o invariante da cadeia de substituição; leituras executam o pipeline de recuperação em etapas descrito em Busca.

O quadro completo — limites de módulos, caminhos de escrita/leitura, invariantes e limitações conhecidas — está em docs/ARCHITECTURE.md. Decisões de design são registradas como ADRs: núcleo SQLite+FTS5, recuperação híbrida RRF, driver síncrono, modelo de memória em camadas.

Início Rápido

Instalação

npm install -g mnemon-mcp

Ou a partir do código-fonte:

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

Configure Seu Cliente MCP

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

Ou adicione ao ~/.openclaw/mcp_config.json:

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

Adicione ao ~/.claude/mcp.json:

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

Adicione à configuração MCP do seu cliente:

{
  "mcpServers": {
    "mnemon-mcp": {
      "command": "mnemon-mcp"
    }
  }
}
Executando a partir do código-fonte?

Use o caminho completo para o ponto de entrada compilado:

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

Verificação

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

Você deve ver 10 ferramentas na resposta. O banco de dados (~/.mnemon-mcp/memory.db) é criado automaticamente na primeira execução.

É isso. Seu agente agora tem memória persistente.

O Que Ele Pode Fazer

10 Ferramentas MCP

FerramentaO que faz
memory_addArmazena uma memória com camada, entidade, confiança, importância e TTL opcional
memory_searchBusca de texto completo ou exata com filtros por camada, entidade, data, escopo, confiança
memory_updateAtualiza no local ou cria uma substituição versionada (cadeia de substituição)
memory_deleteExclui uma memória; reativa seu predecessor, se houver
memory_inspectObtém estatísticas de camada ou rastreia o histórico de versões de uma única memória
memory_exportExporta para JSON, Markdown ou formato Claude-md com filtros
memory_healthExecuta diagnósticos: entradas expiradas, cadeias órfãs, memórias obsoletas; opcionalmente GC
memory_session_startInicia uma sessão de agente — retorna ID de sessão para agrupar memórias
memory_session_endEncerra uma sessão com resumo opcional; retorna duração e contagem de memórias
memory_session_listLista sessões com filtros por cliente, projeto ou status ativo

Recursos e Prompts MCP

Recursos — dados ao vivo que seu agente pode ler:

URIRetorna
memory://statsEstatísticas agregadas por camada
memory://recentMemórias criadas/atualizadas nas últimas 24h
memory://layer/{layer}Todas as memórias ativas em uma camada
memory://entity/{name}Todas as memórias ativas sobre uma entidade

Prompts — fluxos de trabalho pré-construídos:

PromptPropósito
recall"Conte-me tudo o que você sabe sobre X"
context-loadCarrega contexto relevante antes de iniciar uma tarefa
journalCria uma entrada de diário estruturada

Busca

Quatro modos, todos com suporte a filtros de camada / entidade / escopo / data / confiança:

Modo FTS (padrão sem embeddings) — busca de texto completo tokenizada com ranking BM25. Consultas com múltiplas palavras usam AND; se houver poucos resultados, OR complementa com penalidade de pontuação. Relaxamento progressivo de AND tenta os 3 termos mais específicos antes de cair para OR completo.

Modo Híbrido (padrão quando embeddings estão configurados) — combina FTS5 + busca vetorial via Fusão de Rank Recíproco. Detecta entidades entre aspas em consultas (ex.: 'Essentialism') e executa sub-consultas ponderadas para recuperação de referências cruzadas.

Modo Vetorial — busca pura de similaridade por cosseno sobre embeddings.

Modo ExatoLIKE correspondência de substring para buscas precisas de frases.

Pontuações: bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency

Impulso de recência: 1 / (1 + daysSince / 365) — recompensa suavemente memórias criadas recentemente sem penalizar as antigas.

Stemming

Stemmer Snowball aplicado tanto no momento da indexação quanto no momento da consulta para inglês e russo. Isso significa que "running" corresponde a "runs", e "книги" corresponde a "книга". Palavras de parada são filtradas das consultas para melhorar a precisão.

Versionamento de Fatos

O conhecimento evolui. O Mnemon não exclui fatos antigos — ele os encadeia:

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

A busca retorna apenas a versão mais recente. memory_inspect com include_history: true revela a cadeia completa. memory_delete reativa o predecessor — nada é perdido.

Busca Vetorial (Opcional, BYOK)

Habilite a busca de similaridade semântica fornecendo sua própria API de embeddings:

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

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

Isso desbloqueia dois modos de busca adicionais:

  • mode: "vector" — busca pura de similaridade por cosseno
  • mode: "hybrid" — FTS5 + vetor combinados via Fusão de Rank Recíproco

Requer sqlite-vec (instalado como dependência opcional). Novas memórias são incorporadas na adição; as existentes podem ser preenchidas retroativamente.

Configuração de embeddings
VariávelPadrãoDescrição
MNEMON_EMBEDDING_PROVIDERopenai ou ollama (não definido = desabilitado)
MNEMON_EMBEDDING_API_KEYChave de API (obrigatória para OpenAI)
MNEMON_EMBEDDING_MODELtext-embedding-3-small / nomic-embed-textNome do modelo
MNEMON_EMBEDDING_DIMENSIONS1024 / 768Dimensões do vetor
MNEMON_OLLAMA_URLhttp://localhost:11434Endpoint do Ollama

Importando uma Base de Conhecimento

Tem uma pasta de arquivos Markdown? Importe-os em massa:

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)

A configuração mapeia padrões glob para camadas de memória:

{
  "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 Configuração

CampoTipoDescrição
owner_namestringSeu nome — usado para substituição de $owner em entity_name
extra_stop_wordsstring[]Palavras para filtrar de consultas FTS (ex.: formas do seu nome)
globstringPadrão de arquivo para correspondência
layerstringCamada de memória de destino
entity_typestringuser / person / project / concept / file / rule / tool
entity_namestringNome literal, "$owner" ou "from-heading" (extrair de H2/H3)
splitstring"whole" (uma memória por arquivo), "h2" ou "h3" (dividir em títulos)
importancenumber0.0–1.0, afeta o ranking de busca
confidencenumber0.0–1.0, filtrável na busca
scopestringNamespace opcional

Transporte HTTP

Para configurações remotas ou com múltiplos clientes:

MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http
EndpointDescrição
POST /mcpMCP JSON-RPC (autenticação Bearer se o token estiver definido)
GET /health{"status":"ok","version":"..."}

Vincula a 127.0.0.1 por padrão. Vincular a qualquer outro host requer MNEMON_AUTH_TOKEN — o servidor se recusa a expor o armazenamento de memória à rede sem autenticação (substituível com MNEMON_ALLOW_INSECURE_HTTP=1 em uma rede confiável). Limitação de taxa (100 req/min/IP por padrão), CORS opcional, limite de corpo de 1MB, autenticação segura contra timing, desligamento gracioso em SIGTERM.

Referência de Configuração

VariávelPadrãoDescrição
MNEMON_DB_PATH~/.mnemon-mcp/memory.dbCaminho do banco de dados
MNEMON_KB_PATH.Raiz da base de conhecimento para importação
MNEMON_CONFIG_PATH~/.mnemon-mcp/config.jsonCaminho da configuração de importação
MNEMON_AUTH_TOKENToken Bearer para transporte HTTP
MNEMON_HOST127.0.0.1Endereço de vinculação do transporte HTTP
MNEMON_PORT3000Porta do transporte HTTP
MNEMON_CORS_ORIGINCORS Access-Control-Allow-Origin (sem cabeçalhos CORS a menos que definido)
MNEMON_RATE_LIMIT100Máximo de requisições por minuto por IP (0 = desligado)

Referência de Ferramentas

memory_add — lista completa de parâmetros
ParâmetroTipoObrigatórioDescrição
contentstringSimTexto da memória (máx. 100K caracteres)
layerstringSimepisodic / semantic / procedural / resource
titlestringNãoTítulo curto (máx. 500 caracteres)
entity_typestringNãouser / project / person / concept / file / rule / tool
entity_namestringNãoNome da entidade para filtragem
confidencenumberNão0.0–1.0 (padrão 0.8)
importancenumberNão0.0–1.0 (padrão 0.5)
scopestringNãoNamespace (padrão global)
source_filestringNãoCaminho do arquivo de origem — aciona auto-substituição de entradas correspondentes
ttl_daysnumberNãoAuto-expiração após N dias
valid_from / valid_untilstringNãoJanela de fato temporal (ISO 8601)
memory_search — lista completa de parâmetros
ParâmetroTipoObrigatórioDescrição
querystringSimTexto de busca
modestringNãofts (padrão), exact, vector, hybrid
layersstring[]NãoFiltrar por camadas
entity_namestringNãoFiltrar por entidade (suporta aliases)
scopestringNãoFiltrar por escopo
date_from / date_tostringNãoIntervalo de datas (ISO 8601)
as_ofstringNãoFiltro de fato temporal — fatos válidos nesta data
min_confidencenumberNãoConfiança mínima
min_importancenumberNãoImportância mínima
limitnumberNãoMáximo de resultados (padrão 10, máximo 100)
offsetnumberNãoDeslocamento de paginação
memory_update — lista completa de parâmetros
ParâmetroTipoObrigatórioDescrição
idstringSimID da memória
contentstringNãoNovo conteúdo
titlestringNãoNovo título
confidencenumberNãoNova confiança
importancenumberNãoNova importância
supersedebooleanNãotrue = substituição versionada; false (padrão) = no lugar
new_contentstringNãoConteúdo para entrada substituta
memory_delete
ParâmetroTipoObrigatórioDescrição
idstringSimID da memória. Reativa o predecessor se fizer parte de uma cadeia de substituição
memory_inspect
ParâmetroTipoObrigatórioDescrição
idstringNãoID da memória (omitir para estatísticas agregadas)
layerstringNãoFiltrar estatísticas por camada
entity_namestringNãoFiltrar estatísticas por entidade
include_historybooleanNãoMostrar cadeia de substituição
memory_export
ParâmetroTipoObrigatórioDescrição
formatstringSimjson / markdown / claude-md
layersstring[]NãoFiltrar por camadas
scopestringNãoFiltrar por escopo
date_from / date_tostringNãoIntervalo de datas
limitnumberNãoMáximo de entradas (padrão todas, máximo 10 mil)
memory_health
ParâmetroTipoObrigatórioDescrição
cleanupbooleanNãotrue = coletar lixo de entradas expiradas (padrão: apenas relatar)

Retorna: status (healthy / warning / degraded), estatísticas por camada, entradas expiradas, cadeias órfãs, contagens obsoletas/baixa confiança, contagem limpa quando cleanup=true.

memory_session_start
ParâmetroTipoObrigatórioDescrição
clientstringSimIdentificador do cliente (ex.: claude-code, cursor, api)
projectstringNãoEscopo do projeto para esta sessão
metaobjectNãoMetadados adicionais da sessão

Retorna: id (UUID da sessão), started_at (ISO 8601).

memory_session_end
ParâmetroTipoObrigatórioDescrição
idstringSimID da sessão a encerrar
summarystringNãoResumo do que foi realizado (máx. 10 mil caracteres)

Retorna: id, ended_at, duration_minutes, memories_count.

memory_session_list
ParâmetroTipoObrigatórioDescrição
limitnumberNãoMáximo de sessões (padrão 20, máximo 100)
clientstringNãoFiltrar por cliente
projectstringNãoFiltrar por projeto
active_onlybooleanNãoRetornar apenas sessões não encerradas (padrão falso)

Retorna: array de sessões com id, client, project, started_at, ended_at, summary, memories_count.

Como se Compara

mnemon-mcpmem0basic-memoryEngramAnthropic KG
ArquiteturaSQLite FTS5 + vetorialAPI em nuvem + QdrantMarkdown + vetorialSQLite FTS5Arquivo JSON
Estrutura de memória4 camadas tipadasPlanaPlanaPlana + sessõesGrafo
BuscaFTS5 + híbrida RRFSemânticaHíbridaFTS5Exata
Versionamento de fatosCadeias de substituiçãoParcialNãoNãoNão
StemmingEN + RU (Snowball)Somente ENSomente ENNenhumNenhum
EmbeddingsBYOK (OpenAI / Ollama)IntegradoFastEmbedNenhumNenhum
Dependências0 obrigatóriasQdrant, Neo4jPython 3.12Binário GoNenhuma
Nuvem obrigatóriaNãoSimNãoNãoNão
CustoGratuito$19–249/mêsGratuitoGratuitoGratuito
Configuraçãonpm install -gDocker + chaves de APIpip + dependênciasInstalação GoIntegrado
LicençaMITApache 2.0AGPLMITMIT

Análise competitiva estendida com fontes: docs/COMPETITORS.md.

Desenvolvimento

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

O CI executa build + lint + testes no Node 20 e 22, depois faz smoke-tests do servidor compilado via JSON-RPC real (tools/list deve corresponder ao conjunto exato de ferramentas).

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

Consulte CONTRIBUTING.md para diretrizes de código.

Princípios de Design

  • Isolado por padrão — zero telemetria, sempre. Fora da caixa, nada sai da máquina; o único componente que fala com a rede é o embedder opcional, e apenas com o provedor que você configurar (incluindo um Ollama local).
  • Arquivo único — um banco de dados SQLite, zero operações, backup instantâneo via cópia de arquivo.
  • Busca determinística — FTS5, não embeddings, é o padrão. Interpretável, reproduzível, sem necessidade de GPU.
  • Estruturado em vez de plano — camadas codificam padrões de acesso; cadeias de substituição codificam tempo.
  • Mínimo — 4 dependências de produção. Funciona em qualquer lugar onde o Node roda.
  • Medido, não presumido — mudanças na recuperação são avaliadas contra um conjunto dourado, regressões incluídas.

Licença

MIT