Voltar as noticias
Criei um Servidor de Memória MCP Onde o Código, Não o Modelo, Decide o Que é Armazenado
MCP ProtocolAltaEN

Criei um Servidor de Memória MCP Onde o Código, Não o Modelo, Decide o Que é Armazenado

Dev.to - MCP·25 de agosto de 2026

Há um buraco em quase todas as bibliotecas de memória de IA, e uma vez que você o vê, não consegue mais ignorá-lo: o modelo que alucina também é a coisa que você colocou no comando do registro.

Você entrega a um LLM uma conversa e pede para ele lembrar o que importa. Ele lê, decide e escreve sua interpretação na memória de longo prazo como se fosse um fato. Três sessões depois, seu aplicativo "sabe" com confiança algo que o usuário nunca disse — e você nem consegue encontrar de onde veio. A raposa está guardando o galinheiro e registra o incidente depois.

Eu passei um longo e humilhante ano nesse problema. O que acabei construindo — e que acabei de publicar como um servidor MCP — inverte completamente o arranjo. O modelo não decide o que é lembrado. Ele pode propor. Um código determinístico, sem modelo e sem prompt em nenhum lugar, decide o que é realmente admitido.

Este post é a versão honesta: o que ele faz, onde é genuinamente forte, onde é fraco, e a noite — logo antes de eu publicar — que ele mentiu para mim e eu quase o publiquei assim mesmo.

A tese: propor, depois adjudicar
A regra é uma frase: o modelo propõe, o código determinístico decide, e nada não fundamentado é comprometido.

Concretamente, seu agente não apenas afirma um fato. Ele afirma uma alegação e cita o texto exato no qual está fundamentado. Então, um portão verifica se a citação realmente apoia a alegação. Veja como ele me recusa quando tento passar uma interpretação sem evidências:

remember(claim="Priya joined Acme in 2019 under duress.",
evidence="Priya Raman joined Acme in 2019 as a logistics analyst.")

RECUSADO (asserts_more_than_evidence) — a alegação adiciona algo que a evidência não diz.
alegação : Priya joined Acme in 2019 under duress.
evidência: Priya Raman joined Acme in 2019 as a logistics analyst.

"Sob coação" não está em nenhum lugar na evidência, então a alegação nunca entra no armazenamento. E eu não posso argumentar para entrar, porque o portão não é uma conversa com a qual eu posso ser persuasivo — é uma função. Esse é o ponto principal. Injeção de prompt, jailbreaks, um modelo simplesmente sendo confiantemente errado — nenhum deles ajuda você aqui, porque não há modelo do lado decisório para enganar.

Este é o cheque anti-alucinação movido para o tempo de escrita, onde é barato e permanente, em vez de esperar que um reclassificador ou um juiz LLM pegue o problema mais tarde, no tempo de leitura.

Proveniência que você pode realmente auditar
Quando uma alegação é fundamentada, ela é admitida — e é armazenada com o intervalo de bytes de onde veio:

ADMITIDO — Dana Kim tem um gato chamado Pepper.
fundamentação : grounded_verbatim
recibo : bytes [0:71] de sha256:b410428a2b58…
Esse recibo é a parte da qual mais me orgulho. Não é uma citação para um pedaço que aponta perto da resposta. É (document_hash, byte_start, byte_end) — o intervalo preciso. E é verificável:

verify_receipts
→ recibos re-verificados: 1/1 verificável — verificado
verify_receipts re-hash o documento fonte e re-fatia o intervalo exato de bytes. Se alguém editou o documento sob um fato armazenado, o recibo não permanece verde silenciosamente — ele falha:

→ recibos re-verificados: 0/1 verificável
FALHOU — Dana Kim tem um gato chamado Pepper.
Uma falha significa que o documento fonte mudou após a alegação ter sido vinculada a ele.

Uma memória que pode ser pega mentindo para você vale mais do que uma que é confiantemente suave. A maioria das "citações" em sistemas RAG são do tipo suave: elas apontam aproximadamente para um pedaço e continuam parecendo boas mesmo depois que o texto subjacente se desviou. Um recibo de intervalo de bytes é uma proveniência que você pode falsificar, que é o único tipo que vale a pena ter.

Ela se abstém em vez de confabular
Pergunte algo fora do que ela possui, e ela não improvisa uma resposta plausível. Ela lhe diz exatamente onde está o limite do seu conhecimento e o que ela realmente sabe:

Qual é o salário de Dana Kim?

ABSTIDO (unknown_predicate) — nenhuma alegação fundamenta "salário"; 2 alegações sobre Dana Kim existem,
fundamentação: named, pepper, cat, plays, weekends, basketball
Uma recusa, não um resultado vazio: o substrato está lhe dizendo que não tem nada em vez de adivinhar.
Próximo: pergunte sobre um dos: named, pepper, cat, plays, weekends — ou comprometa uma alegação fundamentando "salário".

Note que a recusa redireciona. A maioria dos chamadores aqui são agentes, e um agente não pode navegar pela loja para descobrir o que perguntar em vez disso — então um simples "não" é onde a interação morre. Nomear os termos fundamentados e a próxima ação transforma um beco sem saída em um sinal utilizável. (Esse redirecionamento, incidentalmente, foi uma das coisas que consertei no dia anterior ao lançamento — mais sobre isso abaixo.)

Deleção provável, não deleção esperançosa
Se você está construindo algo que toca os dados reais dos usuários, você eventualmente encontra "delete me — and prove you did." forget(subject) é construído exatamente para isso:

forget(subject="Priya Raman")
→ APAGADO Priya Raman — certificado emitido
nós removidos : 3
sobreviventes : 1

O fechamento exato significa que o sujeito é totalmente removido. A sobrevivência dos coadjuvantes significa que os fatos de todos os outros permanecem intactos — deletar Priya não danifica silenciosamente o registro sobre as pessoas que foram mencionadas ao lado dela. E você recebe um certificado assinado como o artefato, não uma deleção suave que você espera que tenha funcionado. Essa é a diferença entre dizer a um oficial de conformidade "confie em mim" e entregar a ele um recibo.

Duas coisas são verdadeiras ao mesmo tempo
Aqui é onde eu paro de vender e começo a ser direto com você, porque acho que é o modo mais útil.

A ideia é sólida. O modelo propõe, o código decide, recibos de intervalo de bytes, apagamento provável. Eu trabalhei nisso e se mantém. Essa é a garantia, e é a parte na qual eu apostaria o projeto.

O código é jovem. Ele tem dois dias de idade no PyPI enquanto escrevo isso, e é jovem exatamente da maneira que um código de dois dias é jovem. Eu sei disso precisamente, por causa do que aconteceu na noite anterior à minha publicação.

A noite em que ele mentiu para mim
Eu estava prestes a postar. Antes de fazê-lo, finalmente fiz a coisa que eu deveria ter feito sempre e raramente fiz: instalei meu próprio pacote da maneira que um total estranho faria — um ambiente limpo, sobre o protocolo real que um cliente real fala — e comecei a tentar quebrá-lo.

Ele mentiu para mim em minutos.

Eu disse a ele para lembrar "Ada Lovelace escreveu o primeiro algoritmo." Ele alegremente retornou ADMITIDO. Ele não havia armazenado nada. O caminho de escrita estava relatando sucesso enquanto silenciosamente deixava o fato cair no chão — que é o pior bug que um sistema de memória pode ter, e estava bem na porta da frente.

A causa era quase engraçada. O firewall que classifica as alegações de entrada reconhecia verbos pela sua grafia — qualquer coisa que terminasse em -s, -ed, -ing. Então ele simplesmente nunca tinha ouvido falar de "escreveu." Ou "foi." Ou "construiu." Cada passado irregular em inglês era invisível para ele, e qualquer frase construída com um deles era descartada como um fragmento sem sentido. Nove de dezesseis frases perfeitamente ordinárias estavam sendo rejeitadas. E as que passaram, na maioria das vezes, passaram por sorte — "Marcus Webb vendeu sua livraria" sobreviveu apenas porque termina em s.

Eu encontrei três bugs bloqueadores de lançamento naquela noite. O de verbos. Um input de travessia de caminho que lançou uma traceback bruta em vez de um erro limpo. Um arquivo de armazenamento corrompido que travou o servidor em cada chamada em vez de se colocar em quarentena.

Eu consertei os três, escrevi testes de regressão para que não pudessem voltar, e só então cortei a versão que você instalaria hoje.

A lição mais profunda foi a desconfortável. Aquele bug de "relatar ADMITIDO enquanto não armazenava nada" foi a terceira vez neste código que cometi a mesma categoria de erro: computar uma decisão, depois ignorá-la. Um resultado de validação computado e descartado. Uma bandeira de abstenção computada e descartada. E agora um resultado de ingestão computado e descartado. Computar uma verificação e depois não honrá-la é pior do que não verificar nada, porque...

Contexto Triplo Up

A implementação de um servidor de memória que utiliza código determinístico pode ajudar empresas brasileiras a garantir a precisão e a auditabilidade das informações armazenadas. Isso é crucial para aplicações que dependem de dados confiáveis e compliance. A abordagem proposta pode reduzir erros e melhorar a confiança em sistemas de IA.

Noticias relacionadas

Gostou do conteudo?

Receba toda semana as principais novidades sobre WebMCP.