Caso de estudio · okf-mcp
okf-mcp: memoria para agentes que se puede auditar
Un servidor MCP en Rust que da a los agentes memoria técnica persistente: notas Markdown enlazadas, versionadas, con búsqueda semántica y razonamiento ligero.
El problema
Cada sesión de un agente empieza de cero. Las decisiones de ayer, las alternativas que se descartaron y las convenciones del equipo se pierden, o viven en un fichero de texto que nadie mantiene. Y cuando hay memoria, suele ser una caja negra: no se sabe qué se guardó, quién lo cambió ni por qué.
Yo quería una memoria que un humano pudiera leer y versionar igual que el código, y que varios agentes pudieran compartir sin pisarse.
Decisiones
Markdown enlazado como formato. Cada concepto es un documento con frontmatter YAML y enlaces [[...]] que forman un grafo. Se lee en cualquier editor y se puede guardar en GitHub como fuente de verdad.
Un núcleo sin dependencias. El motor de conocimiento y sus puertos usan solo la biblioteca estándar de Rust: sin frameworks, sin serde y sin tokio. Las dependencias externas viven en los adaptadores (Vercel, Supabase, GitHub, proveedores de embeddings), y el núcleo no sabe que existen. Cada crate declara #![forbid(unsafe_code)].
Escrituras seguras entre agentes. Toda escritura es compare-and-swap: hay que enviar el hash de la versión que se leyó. Si otro agente la cambió entretanto, la escritura falla en lugar de sobrescribir en silencio. El borrado es lógico y conserva el historial.
Un contrato que cumplen todos los almacenes. El almacén en memoria, el de PostgreSQL y el prototipo sobre GitHub pasan la misma batería de tests de contrato.
Vocabulario compartido. Las ontologías se declaran una vez como documento y se reutilizan, para que hoy un agente no llame requires a lo que ayer otro llamó depends_on.
Qué hay construido
- 20 herramientas MCP: búsqueda híbrida (texto y semántica), resolución con vecindario del grafo, razonamiento OWL-RL/RDFS acotado, historial, backlinks, operaciones en lote atómicas y validación de la salud del grafo.
- Trabajo guiado por specs (
spec_propose,spec_tasks,spec_status) e ingesta de skills y repositorios externos sin pasar su contenido por un LLM. - Transporte stdio y HTTP sin estado, despliegue en Vercel, OAuth 2.1 con validación de JWT y un outbox transaccional que sincroniza con GitHub y genera embeddings.
- Una interfaz MCP Apps en React para casi todas las herramientas.
- Un tutorial de Rust y principios SOLID, en español, construido sobre el propio proyecto.
Lo que aprendí
La memoria útil para un agente se parece más a un repositorio que a una base de datos vectorial: necesita versiones, autoría, enlaces y una forma de decir «esto ya no vale» sin borrarlo. La búsqueda semántica es la puerta de entrada, pero lo que da confianza es poder auditar el grafo.