Recall
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Recallremember the API now runs on port 8787"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Recall
Memória persistente para agentes de IA, via MCP. O agente guarda o que aprende sobre você e o projeto, busca isso nas próximas conversas e deixa esquecer o que ninguém usa. Um painel local mostra tudo: o grafo de memórias, a linha do tempo e o que ele lembrou em cada sessão.

Ver ao vivo: o painel rodando no navegador com um banco de exemplo (memórias fictícias de um agente ajudando uma dev a construir um app de feira livre). Aperte o play na linha do tempo.
Uma memória aberta | Tema claro | No celular |
|
|
|
Por que
Cada conversa com um agente começa do zero. Você explica de novo a porta da API, a decisão sobre autenticação, que não quer Tailwind. O Recall dá ao agente uma memória de longo prazo que fica na sua máquina, num arquivo SQLite, e que se comporta um pouco como a nossa:
Lembra pelo sentido, não só pela palavra exata. A busca combina BM25 com embeddings locais.
Esquece o que não usa. Cada memória tem uma meia-vida. Ser lembrada a reforça; ficar esquecida a apaga devagar do ranking (sem apagar o dado).
Sabe o que foi substituído. Quando um fato novo substitui um antigo, o antigo perde prioridade e aparece marcado.
Não duplica. Guardar de novo algo que ela já sabe só reforça a memória existente.
Related MCP server: code-recall
Ferramentas MCP
Ferramenta | O que faz |
| Guarda um fato com tags, fonte e importância. Pode já ligar a outras memórias. Quase duplicatas são mescladas. |
| Busca híbrida (BM25 + embeddings) ponderada pela retenção. As memórias devolvidas são reforçadas. |
| Apaga uma memória de vez (e as ligações dela). |
| Liga duas memórias: |
| O que foi guardado, lembrado, ligado ou esquecido, por período, tag ou só nesta sessão. |
| Marca uma memória como confirmada para ela decair mais devagar. |
O servidor também manda instructions para o cliente: buscar no começo de uma tarefa, guardar fatos duráveis em uma frase, nunca guardar segredos.
Como usar
O pacote está pronto para o npm (
@leandromlmoreira/recall-mcp), mas ainda não foi publicado. Enquanto isso, rode a partir do código:git clone https://github.com/leandromlmoreira/recall-mcp && cd recall-mcp npm install && npm run buildNos exemplos abaixo, troque
npx -y @leandromlmoreira/recall-mcppornode /caminho/para/recall-mcp/dist/cli.js.
Precisa de Node 22.13 ou mais novo (usa o node:sqlite nativo, sem compilar nada).
Claude Code
claude mcp add recall -- npx -y @leandromlmoreira/recall-mcpClaude Desktop
Em claude_desktop_config.json:
{
"mcpServers": {
"recall": {
"command": "npx",
"args": ["-y", "@leandromlmoreira/recall-mcp"],
"env": { "RECALL_DB": "/Users/voce/.recall/memory.db" }
}
}
}O painel
npx @leandromlmoreira/recall-mcp ui --open # painel do seu banco, em http://localhost:4417
npx @leandromlmoreira/recall-mcp demo --open # painel com o banco de exemploO painel lê o mesmo arquivo que o servidor MCP escreve. Enquanto o agente trabalha numa conversa, o grafo cresce ao vivo (Server-Sent Events). O painel só lê: nada nele altera a memória, nem a busca.
Opção | Padrão | Para quê |
|
| Onde fica o banco. Um por projeto funciona bem. |
|
|
|
|
| Porta do painel (só escuta em |
Outros comandos: recall stats e recall export (o banco inteiro em JSON, para backup).
Uma conversa de exemplo
Numa sessão, a dev comenta que trocou a porta da API. O agente guarda e liga ao fato antigo:
> Mudei a API pra 8787, a 3000 batia com meu Grafana.
● recall · remember("A API agora sobe na porta 8787: a 3000 conflitava com o Grafana local.",
tags: [backend], link_to: [mem_xytybd], relation: supersedes)
⎿ Remembered mem_kzwc7b.Dias depois, em outra conversa:
> Em que porta a API roda? O cliente precisa de conta?
● recall · recall("porta da api")
⎿ 2 of 36 memories for "porta da api":
[mem_kzwc7b] · score 0.78 · retention 0.94 · 18d ago · tags: backend, deploy
A API agora sobe na porta 8787: a 3000 conflitava com o Grafana local da Marina.
source: apps/api/.env.example
links: supersedes → mem_xytybd
[mem_xytybd] · score 0.25 · retention 0.41 · outdated, superseded by mem_kzwc7b · 25d ago · tags: backend
A API sobe na porta 3000 em desenvolvimento.
links: supersedes ← mem_kzwc7b
● A API roda na 8787. Vocês trocaram da 3000 no dia 8 porque conflitava com o Grafana.Como funciona
Busca híbrida
Para cada memória candidata:
texto = BM25(consulta, conteúdo + tags) / maior BM25 da consulta
sentido = cosseno(embedding(consulta), embedding(memória)), calibrado para 0..1
combinado = 0,6 · texto + 0,4 · sentido
pontuação = combinado · (0,35 + 0,65 · retenção) · (0,4 se foi substituída)Resultados abaixo de 30% da melhor pontuação são descartados, para a resposta não vir cheia de ruído. O tokenizador entende português e inglês (acentos, stopwords, plurais como notificações → notificação).
O embedding padrão é um hashing de n-gramas (palavras, pares de palavras e trigramas de caracteres em 1024 dimensões): roda em microssegundos, sem rede, e pega variações de forma como autenticar e autenticação. Ele não entende sinônimos. Para isso existe o modo minilm, opcional, com o all-MiniLM-L6-v2 rodando localmente via transformers.js.
Decaimento
meia-vida = 7 dias · (1 + log2(1 + usos)) · (0,5 + importância)
retenção = 0,5 ^ (dias desde o último uso / meia-vida)Uma memória nova e nunca usada cai para 50% em uma semana. Usada 3 vezes, a meia-vida vai para 21 dias. Reforços muito próximos (menos de 10 minutos) não contam duas vezes, como na repetição espaçada. Nada é apagado por decaimento: a memória só desce no ranking e aparece como "esquecendo" no painel.
Armazenamento
SQLite em modo WAL com node:sqlite. O esquema é versionado por PRAGMA user_version e evolui por migrações em transação (a v3, por exemplo, move as tags de uma coluna JSON para uma tabela normalizada, sem perder dados). Os vetores ficam salvos no banco; se você trocar de embedder, eles são recalculados na abertura.
Arquitetura
flowchart LR
A[Claude Code / Claude Desktop] -- stdio, MCP --> S[recall serve]
S --> ST[RecallStore]
ST --> DB[(SQLite WAL)]
UI[recall ui] --> ST2[RecallStore somente leitura] --> DB
UI -- JSON + SSE --> P[Painel Vite]
P -. mesmo motor .-> CORE[src/core]
ST --> CORE
DEMO[GitHub Pages] -- banco de exemplo + motor no navegador --> Psrc/core/ motor isomórfico: tokenizador, BM25, embeddings, decaimento, ranking
src/store/ SQLite, migrações, embedders
src/server/ servidor MCP (ferramentas) e servidor HTTP do painel
src/demo/ o roteiro fictício que gera o banco de exemplo
web/ painel (Vite + TypeScript, canvas com d3-force)
test/ unidade e integração (Vitest)
e2e/ Playwright no painel de demonstraçãoO motor de busca é o mesmo no servidor e no navegador: a demonstração do GitHub Pages carrega o banco de exemplo e faz a busca híbrida localmente, sem backend.
Stack
TypeScript, SDK oficial do MCP (@modelcontextprotocol/sdk) com Zod, node:sqlite, Vite, d3-force e d3-zoom, fontes Geist, ícones Phosphor. Testes com Vitest e Playwright. CI no GitHub Actions (Node 22 e 24) e deploy da demonstração no GitHub Pages.
Desenvolvimento
npm install
npm run dev # painel com o banco de exemplo em http://localhost:4416
npm run build # servidor em dist/ e painel em dist/web
npm run build:demo # versão para o GitHub Pages em dist-demo/
npm run seed:demo # regenera o banco de exemplo a partir de src/demo/dataset.tsTestes
npm run lint
npm run typecheck
npm test # unidade + integração
npm run test:e2e # Playwright no painel de demonstração (desktop e 375 px)Unidade: tokenizador, BM25, embeddings, decaimento e reforço espaçado, ranking híbrido, substituições, migrações (incluindo atualizar um banco da v1 com dados e reverter uma migração que falha).
Integração: um cliente MCP real (
Client+StdioClientTransportdo SDK) sobe o servidor por stdio, lista as ferramentas e fazremember → recall → link → forget → timeline. O servidor HTTP do painel é testado com banco real, incluindo SSE, bloqueio de host externo e path traversal.E2E: busca, abrir memória, reproduzir a linha do tempo, teclado no grafo e no controle deslizante, troca de tema e de sessão, sem erro no console e sem rolagem horizontal.
Limites conhecidos
Pensado para uma pessoa, na própria máquina. Não há autenticação no painel (ele só escuta em localhost).
O embedding padrão é lexical. Sinônimos de verdade precisam do modo
minilm.A busca carrega o índice em memória: ótimo até dezenas de milhares de memórias, não é um banco vetorial.
Licença
MIT
Available Tools
6 toolsforgetForgetADestructiveIdempotent
Permanently delete a memory that is wrong or must not be kept. If the fact was replaced by a newer one, prefer remembering the new fact and linking it with relation supersedes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory id, e.g. mem_4kz81q. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the permanence framing and, more valuably, the supersession workflow that tells the agent deletion is not the right move for replaced facts. It stops short of describing irreversibility mechanics or failure modes, so not a 5.
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?
Two sentences, no waste. The destructive action and its scoping condition lead, and the alternative path follows immediately.
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 single-param, no-output-schema tool whose annotations already carry destructiveness and idempotency, the description covers everything an agent needs: what it does, when it is appropriate, and what to do instead when it is not.
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?
One parameter with 100% schema coverage, so the schema already documents 'id' with its mem_ prefix format. The description adds no further semantic detail about the identifier, which is the baseline expectation when the schema does the work.
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 a specific verb ('permanently delete') and resource ('a memory') and narrows scope to memories that are 'wrong or must not be kept.' An agent can distinguish this from siblings like remember, reinforce, and link without opening any schema.
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?
Gives an explicit trigger ('wrong or must not be kept') and an explicit when-not with the preferred alternative: if a fact was superseded, remember the new fact and use link with relation 'supersedes' instead. This routes the agent to the correct sibling rather than destroying history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkLink memoriesAIdempotent
Connect two memories with a named relation so recalling one brings context from the other.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target memory id. | |
| from | Yes | Source memory id. | |
| relation | No | supersedes, caused-by, depends-on, fixes, related (default). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, closed-world behavior. The description adds that the relation is 'named' and that linking affects later recall, but says nothing about directionality semantics, failure when ids don't exist, or how duplicate links are handled despite the idempotent hint.
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 sentence that front-loads the action and ends with the payoff, with no redundant or filler text.
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 no output schema, annotations covering the safety profile, and full schema coverage, the description is adequate but thin: it omits directionality of the from/to pair and any error or failure behavior, which an agent linking memories would benefit from knowing.
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%, so 'from', 'to', and 'relation' are fully documented in the schema, including the default relation and allowed values. The description's mention of a 'named relation' adds no syntax or format detail beyond that, so the baseline 3 applies.
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 gives a specific verb and resource ('Connect two memories') plus a named relation, and it states the resulting effect on recall. It does not explicitly distinguish itself from siblings like reinforce or remember, but the operation is clearly identifiable.
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 only implied: the phrase 'so recalling one brings context from the other' hints at building a knowledge graph for later recall, but there is no explicit when-to-use, when-not-to-use, or comparison against siblings such as reinforce, which also relates memories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecallA
Search long-term memory. Call it before answering questions about this user or project and when starting a task. Hybrid ranking: BM25 keywords plus local embeddings, weighted by retention (memories that are used stay strong, unused ones fade). Returned memories are reinforced.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only memories with at least one of these tags. | |
| limit | No | Maximum results, default 5. | |
| query | Yes | What you want to know, in natural language or keywords. | |
| since | No | Only memories created after this: ISO date or relative like 7d, 12h, 2w. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations show readOnlyHint=false on what is nominally a search, which would otherwise look contradictory; the description resolves this by disclosing the side effect: 'Returned memories are reinforced.' It also explains the retention/fade behavior that governs ranking, adding real behavioral context beyond the structured fields.
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?
Three sentences, each earning its place: purpose, when-to-call, then ranking/side-effect mechanics. The most important action guidance is front-loaded and there is 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?
For a 4-parameter tool with no output schema, the description covers purpose, timing, ranking semantics, and the mutation side effect. It stops short of describing the shape or ordering of results, which an agent might want, but nothing essential for correct invocation is missing.
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%, so query, tags, limit, and since are all documented in the schema with defaults and formats. The description adds no parameter-level detail (e.g., how tags interact with query), so the baseline 3 applies.
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 names a specific verb and resource ('Search long-term memory') and clarifies the retrieval mechanism (hybrid BM25 + embeddings, weighted by retention). It distinguishes itself adequately from siblings like remember/forget/link, though it never explicitly contrasts 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?
It states a clear trigger condition: 'Call it before answering questions about this user or project and when starting a task.' That is actionable usage guidance. It does not name when NOT to use it or point to a sibling alternative, which keeps it 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.
reinforceReinforceA
Mark a memory as confirmed or useful right now so it decays more slowly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive write, so the safety profile is covered. The description adds the decay-slowing effect, which is genuinely informative, but it never explains that the operation is non-idempotent (idempotentHint=false) or whether repeated reinforcements stack.
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-formed sentence with the action front-loaded and the rationale trailing. 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?
For a one-parameter tool with no output schema, the description conveys purpose and the observable effect, which is largely sufficient. The main omission is guidance on when this mutating call is warranted versus simply recalling or re-remembering.
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 and schema coverage is 100%, so the schema fully documents 'id'. The description adds no format, sourcing, or lookup semantics for obtaining a valid memory id, so the baseline 3 applies.
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?
Specific verb ('Mark...as confirmed or useful') plus resource ('a memory') and a stated effect ('so it decays more slowly'). The purpose is clear and distinct from remember/recall/forget, though no sibling is named to sharpen the boundary.
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 'right now' hints at when to call it (at the moment the memory proves useful), but there is no explicit when-to-use vs when-not, no mention of forget/remember as alternatives, and no conditions for repeated invocation. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberRememberAIdempotent
Store one durable fact so it is available in future sessions: decisions and their reasons, user preferences, project facts, commands, gotchas, fixes. Write it self-contained, as if read months later without this chat. Near-duplicates are merged and reinforced instead of stored twice.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | 1-3 short topic labels, e.g. auth, deploy, preferences. | |
| source | No | Where it came from: a file path, URL, 'user' or a date. | |
| content | Yes | The fact, in one or two plain sentences. | |
| link_to | No | Ids of existing memories this one relates to. | |
| relation | No | Relation used for link_to, e.g. supersedes, caused-by, related. | |
| importance | No | 0-1, default 0.5. Higher decays slower. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false and idempotentHint=true already declared, the description adds real behavioral value by explaining the merge/reinforce semantics for near-duplicates, which is exactly why the operation is idempotent. It does not say what permission or rate limits apply, but the added write-behavior context exceeds the 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?
Three short sentences, front-loaded with the core action and scope, then categories, then the dedup contract. No filler and no repetition of the title or name.
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 6-parameter write tool with no output schema, it covers purpose, content-writing guidance, and the merge contract. The one gap is that it never explains how an agent obtains the id needed by link_to, nor what the call returns.
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 100%, so the baseline is a 3, but the description adds meaning for the content parameter ('write it self-contained, as if read months later without this chat'), which is guidance the schema does not provide. The other five parameters are left entirely to their schema descriptions.
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 a specific verb and resource ('Store one durable fact') plus the scope ('available in future sessions'). It is clearly distinguishable from the sibling store/retrieve tools (recall, forget, reinforce) without opening any schema.
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?
Gives explicit content categories to use it for (decisions and reasons, preferences, project facts, commands, gotchas, fixes) and a writing rule. It does not name the alternative tools or the when-not conditions (e.g., use forget to retract, recall to read), so it stops short of a full routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timelineTimelineARead-onlyIdempotent
Chronological log of what was remembered, recalled, reinforced, linked or forgotten, newest first. Answers questions like 'what did we decide last week?' or 'what did you look up this session?'.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only events touching memories with this tag. | |
| limit | No | Default 30. | |
| scope | No | session = only this conversation. Default all. | |
| since | No | ISO date or relative like 7d, 12h, 2w. | |
| until | No | ISO date or relative. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful ordering behavior (newest first) and the recorded event taxonomy, but says nothing about pagination limits in practice or the shape of a returned event.
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?
Two tightly written sentences: the first front-loads what the log is and its ordering, the second supplies concrete query examples. 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?
For a read-only listing tool with full schema coverage and strong annotations, the definition covers enough to call it correctly. The remaining gap is that the fields making up each timeline event are never described and there is no output schema, so the agent must discover the entry shape empirically.
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 100%, with tag, limit/default, scope enum, and since/until formats all documented in the schema itself. The description adds no syntax or interpretation beyond that, so the baseline 3 applies.
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 concrete verb-like resource: a chronological log of memory events, newest first, and enumerates the event kinds it records (remembered, recalled, reinforced, linked, forgotten). That taxonomy is enough to separate it from siblings like recall or remember, though no sibling is named explicitly.
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?
Concrete usage contexts are given via example questions ('what did we decide last week?', 'what did you look up this session?'), which tells the agent when this tool is the right choice. It stops short of stating when not to use it or naming an alternative sibling.
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.
6 tool updates
v0.1.0- First observed
forget - First observed
link - First observed
recall - First observed
reinforce - First observed
remember - First observed
timeline
TDQS
Scored across 6 tools
Each tool maps to a distinct memory operation: store (remember), retrieve (recall), delete (forget), connect (link), log (timeline), and reinforce. No two tools overlap in purpose, and descriptions clearly delineate boundaries.
Five of six tools are single-word imperative verbs (remember, recall, forget, link, reinforce), but timeline is a noun, breaking the verb pattern. Still readable and mostly consistent, with only this minor deviation.
Six tools are well-scoped for a long-term memory server, covering core actions without bloat. Each tool earns its place and the set feels neither thin nor heavy.
Core lifecycle is covered: create, read, delete, link, reinforce, and event log. No direct update operation, but replacing a fact via remember + supersedes link handles it; minor gap but workable.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. Search and store durable facts, preferences and decisions.
- GoMindOAuthcom.gominddb
Persistent knowledge graph for AI agents. Remember, recall, and forget facts.
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with persistent, searchable memory using a knowledge graph stored in SQLite. Features semantic search, temporal awareness, and workflow-aware prompts for development projects.15 npmMIT
- AlicenseNot gradedqualityCmaintenanceGives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.4MIT
- AlicenseNot gradedqualityAmaintenanceProvides long-term memory for LLMs via local SQLite storage with hybrid search (BM25, vectors, recency decay), enabling AI coding agents to persist and recall memories across sessions without cloud or API keys.53MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to maintain long-term memory by logging and retrieving facts and decisions in a SQLite database, with relevance ranking and full history tracking.7MIT


