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.

Rust (núcleo solo std) · MCP · PostgreSQL + pgvector · Vercel · GitHubGitHub ↗

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.

Siguiente casokthulu-go: que el agente trabaje sobre estructura →