smriti
Smriti
Un grafo de conocimiento autohospedado y capa de memoria para agentes de IA: un binario, un archivo SQLite, cero dependencias en la nube.
Git para wikis de LLM. Transacciones atómicas de escritura múltiple, procedencia forzada en cada afirmación, registro de eventos de solo adición con cadena hash y un verificador de integridad; para que el conocimiento generado por agentes sea auditable por diseño.
2.5µs recuperación KV · 235ns recorrido de grafo · 0 dependencias en la nube
[screenshot: web-ui-dashboard.gif]
cargo install smritiPor qué Smriti (frente a Obsidian / Zep / Mem0 / Letta / Neo4j)
Propiedad | Obsidian | Zep | Mem0 / Letta | Neo4j / Graphiti | Smriti |
Binario único, archivo único, sin servidor | ✓* | ✗ | ✗ | ✗ | ✓ |
Totalmente local / sin conexión | ✓ | ✗ | ✗ | parcial | ✓ |
Aristas bitemporales (valid_from / valid_until) | ✗ | ✓ | ✗ | ✓ | ✓ |
Transacciones atómicas de escritura múltiple (SAVEPOINT) | ✗ | ✗ | ✗ | ✓ (servidor) | ✓ |
Procedencia forzada en cada afirmación | ✗ | ✗ | ✗ | ✗ | ✓ |
Registro de eventos de solo adición + cadena hash | ✗ | ✓ | ✗ | ✗ | ✓ |
✗ | ✗ | ✗ | ✗ | ✓ | |
Bandeja de entrada de contradicciones (nunca se resuelve automáticamente) | ✗ | parcial | ✗ | ✗ | ✓ |
Nativo de MCP para agentes | plugin | ✗ | ✗ | ✗ | ✓ |
* Obsidian es un sistema de archivos sin garantías transaccionales. La ventaja de Smriti no es la novedad, sino la disciplina en el momento de la escritura en un entorno de ejecución Rust local-first.
Fundamentos de investigación
Cada característica de integridad cita un artículo de arXiv para que puedas rastrear el diseño hasta la literatura:
Aristas bitemporales y registro de eventos T / T′ — Zep / Graphiti, arXiv:2501.13956
Verificación de superposición estructural (afirmación ↔ fuente) — FACTUM, arXiv:2601.05866 y Citation-Grounded Code Comprehension, arXiv:2512.12117
Puntuación de confianza de contradicción — MemoTime, arXiv:2510.13614 y EvoReasoner / EvoKG, arXiv:2509.15464
Revisión de creencias y política de conflictos en memory_store — Postulados de AGM, arXiv:2603.17244
Recuperación híbrida de grafo + BM25 — Graph-Based Memory Survey, arXiv:2602.05665
Capas de grafo tipadas (semántica/temporal/causal) — MAGMA, arXiv:2601.03236
Memoria de agente estilo Zettelkasten — A-MEM, arXiv:2502.12110 (NeurIPS 2025)
Requisitos de fundamentación de alucinaciones — arXiv:2510.24476
Capa de integridad (v0.2)
Cuatro herramientas MCP convierten a Smriti de un almacén CRUD a una wiki con invariantes:
wiki_transaction_submit— lote de operaciones de creación/actualización/enlace/fuente aplicadas atómicamente dentro de unSAVEPOINTde SQLite. Cada escritura de contenido debe llevar una matrizclaim_spanso ser rechazada (procedencia forzada por defecto).wiki_verify— ejecuta integridad referencial + vuelve a verificar la puntuación de superposición de cada afirmación almacenada + recorre la cadena hash del registro de eventos. Devuelve éxito/fallo. Nunca muta.contradictions_detect— escaneo por pares sobre notas recientes usando puntuación ponderada w1·semántica + w2·recencia + w3·autoridad. Los candidatos aterrizan en una bandeja de entrada de revisión; Smriti nunca resuelve automáticamente.contradictions_list— la bandeja de entrada de revisión.
La CLI refleja todo esto:
smriti verify # integrity sweep
smriti pending-tx # list transactions awaiting review
smriti commit-tx <id> # commit a pending transaction
smriti reject-tx <id> -r "..." # reject with reason
smriti detect-contradictions # scan for candidates
smriti contradictions # show review inbox¿Qué es Smriti?
Smriti (sánscrito: स्मृति, memoria) es un binario único de Rust que ejecuta un grafo de conocimiento, un índice de búsqueda semántica y de texto completo, y un servidor MCP sobre un único archivo SQLite. Está diseñado para dos usuarios: un trabajador del conocimiento que desea un segundo cerebro privado que su asistente de IA pueda leer, y un desarrollador que necesita una capa de memoria estructurada y persistente para agentes de IA.
Las notas se conectan entre sí a través de enlaces wiki tipados: escribe [[rel:causal|Decisión X]] en una nota y Smriti registra una arista causal dirigida en el grafo de conocimiento automáticamente. Los agentes pueden entonces recorrer ese grafo para responder preguntas como "¿qué llevó a esta decisión?" sin tener que volver a leer cada nota.
Inicio rápido
# Install
cargo install smriti
# Create your first notes — links and tags are extracted automatically
smriti new # interactive guided prompt
smriti create "Acme Corp" --content "Key client. Met via [[Sarah Chen]]." --tags client
# Search
smriti search "Acme"
# Open the web dashboard
smriti serve
# → http://localhost:3000Tus notas, grafo e índice de búsqueda residen en ~/.local/share/smriti/smriti.db. Haz copias de seguridad con cp.
Casos de uso
Grafo de conocimiento del cliente
Realiza un seguimiento de cada cliente, contacto y compromiso como notas vinculadas. Cuando informas a Claude antes de una llamada, lee el contexto completo (historial, decisiones, elementos pendientes) sin que tengas que volver a explicar nada.
smriti create "Acme Corp Q2 Review" \
--content "Next steps: [[rel:temporal|Budget approval]] by June. Owner: [[Sarah Chen]]." \
--tags client decisionRegistro de decisiones
Registra decisiones con contexto y consecuencias. El tipo de enlace rel:causal permite a los agentes rastrear por qué se tomó una decisión.
smriti create "Switched to Rust" \
--content "Replaced Python service. Reason: [[rel:causal|Memory leak in prod]]." \
--tags decisionContexto diario de IA
Almacena tu enfoque actual en el almacén KV. Claude lo lee al inicio de cada sesión a través de MCP.
smriti serve # then ask Claude: "what's my current focus?" — Smriti answers via MCPSOPs y manuales de procedimientos
Documenta procesos repetibles como notas vinculadas. Importa archivos markdown existentes con un solo comando.
smriti import ./playbooks --recursiveIntegración MCP
Smriti se ejecuta como un servidor MCP sobre stdio. Agrégalo a Claude Desktop en claude_desktop_config.json:
{
"mcpServers": {
"smriti": {
"command": "smriti",
"args": ["mcp", "--db", "/path/to/smriti.db"]
}
}
}Para MCP remoto en claude.ai, inicia smriti serve y apunta el cliente MCP a http://localhost:3000/mcp.
Herramientas MCP
Herramienta | Qué hace |
| Crea una nota; |
| Lee una nota por ID o título |
| Búsqueda de texto completo BM25 en todas las notas |
| Lista notas recientes, filtra por etiqueta |
| Devuelve un subgrafo (BFS, filtro de arista tipada) alrededor de una nota |
| Búsqueda híbrida vectorial + FTS5 con fusión de rango recíproco |
| Almacena un par clave-valor; admite TTL y política de conflictos |
| Recupera un valor almacenado por ID de agente + clave |
| Lista todas las entradas de memoria para un agente |
| Recupera valores reemplazados para una clave (memoria versionada) |
Referencia completa de MCP: docs/mcp.md
Rendimiento
Medido en Apple Silicon, SQLite en memoria, usando Criterion. Ejecuta: cargo bench
Operación | p50 |
Insertar 1 nota | 32.5 µs |
Insertar 100 notas | 2.0 ms |
Insertar 1,000 notas | 23.1 ms |
Búsqueda FTS5 — 1k notas | 331 µs |
Búsqueda FTS5 — 10k notas | 2.86 ms |
Construcción de grafo — 1k nodos | 216 µs |
BFS profundidad-2 (caché) | 235 ns |
BFS profundidad-3 (caché) | 410 ns |
Almacén KV de memoria — 100 claves | 513 µs |
Recuperación KV de memoria (acierto) | 2.48 µs |
Recuperación KV de memoria (fallo) | 2.25 µs |
Smriti frente a alternativas
Smriti | Mem0 | Letta | Zep | |
Autohospedado | Sí | No | Sí | Parcial |
Grafo de conocimiento | Sí (petgraph) | No | No | Sí (Neo4j) |
Aristas tipadas | Sí | No | No | Sí |
Aristas bitemporales | Sí | No | No | Sí |
Revisión de creencias | Sí (AGM) | No | No | No |
Nativo MCP | Sí | No | No | No |
Búsqueda de texto completo | FTS5 (BM25) | Solo vectorial | Solo vectorial | Vectorial + palabra clave |
Búsqueda híbrida | Sí (RRF) | No | No | No |
Memoria KV + TTL | Sí | No | Sí | Sí |
Lenguaje | Rust | Python | Python | Python/Go |
Despliegue | Binario único | SaaS | Docker + Postgres | Docker + Neo4j + Redis |
Latencia de recuperación KV | ~2.5 µs | ~50–200 ms | ~10–50 ms | ~5–20 ms |
Arquitectura
src/
├── models/ Note, Link, AgentMemory, ToolLog — Serde on every type
├── storage/ SQLite + FTS5 + sqlite-vec; WAL mode; single connection pool
├── parser/ [[wiki-link]] and #tag extraction via regex; no runtime deps
├── graph/ petgraph DiGraph; lazy GraphCache (Arc<RwLock>); typed BFS
├── mcp/ JSON-RPC 2.0 over stdio; dispatches to same handlers as REST
├── web/ Axum router; localhost-only CORS; embedded React SPA
├── cli/ clap v4 derive; 11 commands; shell completions; interactive new
├── sync/ WebDAV + filesystem sync with per-device conflict tracking
└── features/ Smart link suggestions; daily digestDecisiones de diseño
Por qué SQLite, no Postgres. Una base de conocimiento para una persona o un equipo pequeño no debería requerir un servidor de base de datos en ejecución. SQLite en modo WAL maneja cientos de lecturas concurrentes por segundo, más que suficiente para cualquier grafo de conocimiento personal. Toda la base de datos es un archivo: la copia de seguridad es cp, la migración es mv.
Por qué Rust, no Python. La memoria del agente se encuentra en la ruta crítica de cada llamada a herramienta. Los servidores MCP de Python suelen añadir 50–200 ms por viaje de ida y vuelta debido a la sobrecarga de serialización y la contención del GIL. La implementación en Rust de Smriti recupera una entrada KV en 2.5 µs, manteniendo las operaciones de memoria invisibles para la latencia de respuesta del agente.
Por qué FTS5 + vector, no uno u otro. La búsqueda por palabras clave (BM25) es precisa para términos conocidos; la búsqueda vectorial recupera contenido semánticamente relacionado que el usuario no pensó en buscar. Ninguno es suficiente por sí solo. Smriti combina ambos con fusión de rango recíproco, ponderada en el momento de la consulta, coincidiendo con el hallazgo en arXiv:2602.05665 de que la recuperación híbrida supera al vector puro en tareas de razonamiento de múltiples saltos.
Revisión de creencias en memory_store. Cuando un agente almacena una clave que ya existe, la sobrescritura ingenua descarta el historial. Smriti implementa cuatro políticas de resolución de conflictos AGM (arXiv:2603.17244): overwrite (por defecto), reject (falla si existe), version_and_keep (archiva el valor antiguo) e invalidate (marca el antiguo como reemplazado). Los valores reemplazados se pueden consultar a través de memory_history.
Base de investigación
Artículo | arXiv | En qué se fundamenta en Smriti |
Zep / Graphiti | Aristas bitemporales en la tabla | |
MAGMA | Capas de grafo tipadas; BFS filtrado por | |
Graph-Native Belief Revision | Enum | |
Graph-Based Memory Survey | Híbrido FTS5 + sqlite-vec con fusión de rango recíproco |
Contribución
git clone https://github.com/smriti-AA/smriti.git
cd smriti
cargo test --all-features # should be green
cargo bench # performance baselineConsulta CONTRIBUTING.md para el flujo de trabajo de desarrollo. Los problemas etiquetados como good first issue son cambios de almacenamiento o CLI autocontenidos que no requieren comprender toda la base de código.
Antes de abrir un PR: cargo clippy --all-features -- -D warnings y cargo fmt --check.
Licencia
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Smriti-AA/smriti'
If you have feedback or need assistance with the MCP directory API, please join our Discord server