Skip to main content
Glama
Smriti-AA

smriti

by Smriti-AA

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 smriti

Por 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 un SAVEPOINT de SQLite. Cada escritura de contenido debe llevar una matriz claim_spans o 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:3000

Tus 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 decision

Registro 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 decision

Contexto 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 MCP

SOPs y manuales de procedimientos

Documenta procesos repetibles como notas vinculadas. Importa archivos markdown existentes con un solo comando.

smriti import ./playbooks --recursive

Integració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

notes_create

Crea una nota; [[wiki-links]] y #tags se extraen automáticamente

notes_read

Lee una nota por ID o título

notes_search

Búsqueda de texto completo BM25 en todas las notas

notes_list

Lista notas recientes, filtra por etiqueta

notes_graph

Devuelve un subgrafo (BFS, filtro de arista tipada) alrededor de una nota

notes_search_semantic

Búsqueda híbrida vectorial + FTS5 con fusión de rango recíproco

memory_store

Almacena un par clave-valor; admite TTL y política de conflictos

memory_retrieve

Recupera un valor almacenado por ID de agente + clave

memory_list

Lista todas las entradas de memoria para un agente

memory_history

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

No

Parcial

Grafo de conocimiento

Sí (petgraph)

No

No

Sí (Neo4j)

Aristas tipadas

No

No

Aristas bitemporales

No

No

Revisión de creencias

Sí (AGM)

No

No

No

Nativo MCP

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

No

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 digest

Decisiones 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

2501.13956

Aristas bitemporales en la tabla links; mejora del 18.5% en LongMemEval

MAGMA

2601.03236

Capas de grafo tipadas; BFS filtrado por link_type; reducción del 95% de tokens

Graph-Native Belief Revision

2603.17244

Enum ConflictPolicy en memory_store

Graph-Based Memory Survey

2602.05665

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 baseline

Consulta 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

MIT

-
security - not tested
A
license - permissive license
-
quality - not tested

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