memex-mcp
Sistema de continuidad de contexto para desarrolladores que construye un grafo de conocimiento temporal de tu base de código — módulos, símbolos, decisiones y problemas abiertos — y lo sirve a agentes de codificación de IA a través de 12 herramientas MCP, para que cada sesión de agente comience conociendo tu arquitectura sin necesidad de pegar contexto manualmente.
Documentación
memex — memoria de grafo de conocimiento temporal para agentes de codificación de IA
Memoria persistente y contexto del codebase para agentes de codificación de IA, servidos a través de MCP. Un grafo de conocimiento bitemporal de tu repositorio — módulos, símbolos, decisiones, problemas — para Claude Code, Cursor, Codex, Gemini CLI, y cualquier agente compatible con MCP.
Un demonio y servidor MCP que convierte cada commit y cada cambio de archivo en estado de grafo estructurado: módulos, símbolos, decisiones, problemas, hechos de lockfile. Las sesiones dejan de empezar a ciegas. Los agentes dejan de redescubrir la misma refactorización cada vez que /clear.

flowchart LR
A[Your repository<br/>files + git] --> B[memex watcher<br/>tree-sitter + Gemini]
B --> C[Neo4j graph<br/>bitemporal facts]
C --> D[MCP server<br/>stdio / HTTP]
D --> E[AI agent<br/>Claude · Cursor · Codex · Gemini CLI]
E -.->|writes decisions back| C
style B fill:#cfe8ff,stroke:#0066cc,color:#000
style C fill:#fff4cf,stroke:#cc9900,color:#000
style E fill:#d4f5d4,stroke:#2d8f2d,color:#000
Instalación
A través del marketplace de Claude Code
/plugin marketplace add STiFLeR7/claude-plugins
/plugin install memex-mcp@stifler-marketplace
Reinicia tu sesión de Claude Code.
Manual
docker compose -f docker/docker-compose.yml up -d
cat > .env <<EOF
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=memex-local
GEMINI_API_KEY=your-key-here
EOF
npx stifler-memex-mcp init --repo .
npx stifler-memex-mcp watch --repo .
npx stifler-memex-mcp serve --repo .
| Canal | Comando |
|---|---|
| Marketplace de Claude Code | /plugin install memex-mcp@stifler-marketplace |
| npx (sin instalación) | npx stifler-memex-mcp <cmd> |
| uv | uv add memex-mcp |
| pip | pip install memex-mcp |
| fuente | git clone github.com/STiFLeR7/memex && uv sync |
Despliegue de equipo autogestionado
Para una configuración de equipo compartido (un Neo4j + un servidor memex, autenticación activada por defecto, los puertos de Neo4j nunca expuestos al host):
bash docker/bootstrap-team-env.sh
docker compose -f docker/docker-compose.team.yml up -d
Consulta docker/TEAM-DEPLOY.md para el flujo completo, capturando la clave de administrador inicial, y la down -v trampa a evitar.
De un vistazo
| Propiedad | Valor |
|---|---|
| Salida | Un grafo Neo4j poblado continuamente desde tu repositorio |
| Almacenamiento | Neo4j vía Graphiti. Bitemporal — cada arista tiene created_at y opcionalmente expired_at |
| Sobrevive a | /clear, caídas de terminal, reinicios de máquina, transferencias entre compañeros |
| Se entrega a | Claude Code, Cursor, Codex, Gemini CLI, cualquier cliente MCP |
| Granularidad | Escala de 50 a 5000+ módulos mediante clústeres jerárquicos de Leiden |
| Síntesis | Gemini Flash destila commits en nodos de Decision; Pro para síntesis fundamentada |
| Confianza | Calculada en tiempo de consulta. Decaimiento en dos regímenes (vida media validada ~139d, no validado obsoleto a los 30d) |
| Gobernanza de escritura | ACL por tipo de nodo, confirmación de intención en escrituras de agentes, semánticas explícitas de corroborates / supersedes |
| Pruebas | 333 pasando, ~93% de cobertura |
El ciclo de vida
flowchart TD
Init[memex init<br/>extract baseline] --> Watch[memex watch<br/>daemon + git hooks]
Watch -->|commit| Extract[tree-sitter extract<br/>symbols, imports, lockfile]
Extract --> Synth[Gemini Flash<br/>diff → Decision nodes]
Synth --> Write[Graphiti add_episode<br/>+ post-hoc bitemporal SET]
Write --> Decay[Scheduler<br/>nightly confidence decay]
Decay -->|stale edges| Archive[expired_at = now]
Serve[memex serve<br/>MCP stdio/HTTP] -.->|reads| Write
Agent[AI agent] -->|14 MCP tools| Serve
Serve -->|record_decision / record_problem| Write
Cluster[memex cluster<br/>Leiden over hybrid edges] -.->|every N commits| Write
style Init fill:#e8f4ff,color:#000
style Watch fill:#fff4cf,color:#000
style Synth fill:#ffe0cc,color:#000
style Serve fill:#d4f5d4,color:#000
Herramientas MCP
14 herramientas — ocho de lectura, cuatro de escritura, dos analíticas.
Lectura
| Herramienta | Cuándo |
|---|---|
get_project_context | Inicio de sesión. Devuelve un informe a nivel de clúster de menos de 1500 tokens sin importar el tamaño del repositorio |
get_symbol_context | Antes de editar una función o clase. Devuelve llamadores, llamados, decisiones vinculadas |
get_recent_decisions | Últimos N días de decisiones arquitectónicas, opcionalmente limitado por módulo |
get_open_problems | Bugs activos y deuda técnica, ordenados por severidad |
search_context | Búsqueda híbrida: semántica × palabra clave × recorrido de grafo × fusión RRF |
get_stale_context | Aristas cuya confianza compuesta cayó por debajo del umbral |
explain_change | Dado un SHA de commit, cruza el diff con los nodos de Decisión/Problema vinculados y pide a Gemini Pro una explicación fundamentada |
predict_impact | Dada una ruta de archivo, devuelve una lista clasificada de módulos probablemente afectados según el acoplamiento del grafo (sin llamada LLM) |
Escritura
| Herramienta | Cuándo |
|---|---|
record_decision | Después de tomar una decisión técnica. Soporta corroborates (reforzar) y supersedes (reemplazar) |
record_problem | Al descubrir un bug o un trozo de deuda técnica |
resolve_problem | Cuando un problema rastreado se arregla |
invalidate_edge | Cuando un hecho almacenado ya no es verdadero |
Confianza bitemporal
La confianza no es un número almacenado que muta. Se calcula en tiempo de consulta a partir de base_confidence, estado de validación, tiempo desde el último refuerzo y contador de accesos.
flowchart LR
Edge[Edge created<br/>base_confidence] --> Q{Validated by<br/>a human?}
Q -->|yes| Slow[Slow regime<br/>half-life ~139d]
Q -->|no| Fast[Fast regime<br/>stale at exactly 30d]
Slow --> Score[Composite score<br/>conf × recency × rehearsal]
Fast --> Score
Score -->|below floor| Stale[get_stale_context surfaces it]
Score -->|access| Bump[last_reinforced_at updated]
Bump --> Score
style Slow fill:#d4f5d4,color:#000
style Fast fill:#ffd4d4,color:#000
| Propiedad | Valor |
|---|---|
| Vida media validada | ~139 días |
| Umbral de obsolescencia no validado | 30 días (compuesto < 0.3) |
| Recencia τ | 90 días (decaimiento exponencial) |
| Fórmula compuesta | conf × recency × (1 + rehearsal_w × log(1 + access_count)) |
| Umbral de similitud de conflicto | 0.4 (por debajo + validez superpuesta = conflicto) |
| Umbral de confirmación de intención | 0.85 (verificación de similitud en escritura MCP) |
Clústeres jerárquicos
memex cluster ejecuta Leiden jerárquico sobre un grafo de aristas híbrido:
| Tipo de arista | Peso |
|---|---|
| Co-ubicación de directorio | 1.0 |
| Imports de módulos | 2.0 |
| Llamadas de símbolo | log(1 + calls) |
| Propiedad | Valor |
|---|---|
| Algoritmo | graspologic.partition.hierarchical_leiden con semilla fija |
| Nombrado | TF-IDF top-3 sobre docstrings de módulos + nombres de símbolos, respaldo de directorio padre |
| Fijación de ID | Jaccard ≥ 0.5 entre ejecuciones (los nombres de clúster se mantienen estables a través de renombres) |
| Anulaciones de usuario | .memex/clusters.yaml — cualquier asignación se puede bloquear |
| Presupuesto de contexto | get_project_context se mantiene bajo 1500 tokens ya sea que tu repositorio tenga 50 o 5000 módulos |
Mide tus ahorros
memex rastrea métricas de reducción de tokens y acciones de revisión humana localmente en una base de datos SQLite (~/.config/memex/telemetry.db).
Puedes consultar tus ahorros en cualquier momento usando la CLI:
memex stats
O ver el payload JSON crudo:
memex stats --json
O apuntar a un alcance de repositorio específico:
memex stats --repo /path/to/repo
Esto devuelve una agregación de:
- Resúmenes de período: llamadas, tokens devueltos, tokens ingenuos (tamaño de archivos solicitados), tokens ahorrados y porcentaje de reducción de tokens a través de
today,last 7 days,last 30 daysylifetime. - Mejores herramientas: las herramientas más valiosas ordenadas por total de tokens ahorrados.
- Clientes de agentes: agentes activos (Claude Code, Gemini CLI, Cursor, Codex) y su distribución de ahorro de tokens.
- Salud de validación: total de nodos validados, no validados y corroborados, junto con los días transcurridos desde la última revisión.
Las mismas estadísticas se exponen a través del transporte HTTP MCP:
GET /stats?repo=/path/to/repo
Authorization: Bearer <your-key>
Conecta tu agente
Claude Code
La instalación desde el marketplace de arriba hace esto por ti. Configuración manual en .claude/settings.json:
{
"mcpServers": {
"memex": {
"type": "stdio",
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Cursor
Añade a ~/.cursor/mcp.json:
{
"mcpServers": {
"memex": {
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Gemini CLI
Añade a ~/.gemini/settings.json:
{
"mcpServers": {
"memex": {
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Codex
Añade a ~/.codex/config.toml:
[mcp_servers.memex]
command = "npx"
args = ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
Herramienta de memoria de Anthropic (memory_20250818)
memex puede respaldar la herramienta de memoria nativa de Claude — los agentes leen de una proyección de grafo por sesión más una zona de borrador escribible.
memex memory-tool serve --repo . # in-process
memex memory-tool serve --repo . --transport http # FastAPI on :7464
from memex.memory_tool import MemexAsyncMemoryTool
memory_tool = MemexAsyncMemoryTool(repo_root=".")
client.beta.messages.run_tools(..., tools=[memory_tool])
Principios operativos
| # | Principio | La apuesta |
|---|---|---|
| 1 | Bitemporal, nunca destructivo | Las aristas se expiran, no se eliminan. WHERE r.expired_at IS NULL filtra el estado vivo |
| 2 | La confianza se calcula, no se almacena | Mutar un número invita a una deriva silenciosa. Recalcular en cada lectura |
| 3 | Dos regímenes para el decaimiento | Los hechos validados decaen lentamente; los hechos no validados deben ganarse su lugar siendo accedidos |
| 4 | Humano en el bucle | memex review pone en cola los nodos de Decisión de menor confianza para validación explícita |
| 5 | Gobernanza de escritura | ACL por tipo de nodo. Decision.policy = open, Module.policy = locked. Confirmación de intención en escrituras de contenido similar |
| 6 | Los tokens tienen presupuesto | get_project_context se mantiene bajo 1500 tokens en cualquier tamaño de repositorio mediante clústeres de Leiden |
| 7 | Síntesis solo en commits | El watcher agrupa por ventana de debounce. Gemini Flash no está en el camino crítico de una llamada de herramienta |
| 8 | Pro para síntesis, Flash para extracción | explain_change usa Pro porque la fundamentación importa. Todo lo demás usa Flash |
| 9 | Consciente de múltiples repos | Un watcher + un servidor MCP pueden gestionar cientos de repos. --repo cambia el alcance |
| 10 | Primero local | Neo4j corre en tu Docker. Gemini es la única llamada saliente, y solo en commits |
Cuándo usar memex
| Úsalo cuando | Omítelo cuando |
|---|---|
| Proyecto de varias semanas o meses | Script desechable, prototipo de usar y tirar |
| Trabajas con múltiples agentes (Claude, Cursor, Codex) y quieres contexto compartido | Solo emparejas con un agente en una tarea |
| Las decisiones arquitectónicas se toman con el tiempo y necesitan ser recordadas | Todo el proyecto cabe en una sola ventana de contexto de 200k tokens |
| Quieres consultar "¿qué decidimos sobre X?" desde cualquier sesión | Tu repositorio ya es lo suficientemente pequeño como para pegarlo en el prompt |
| Varios desarrolladores usando agentes de IA en el mismo codebase | Trabajo en solitario donde nunca /clear |
Estructura del proyecto
memex/
├── memex/
│ ├── extractor/ tree-sitter + lockfile parsers
│ ├── graph/ Neo4j writes, confidence, archive, cluster engine
│ ├── synthesizer/ Gemini Flash → Decision nodes
│ ├── mcp_server/ 14 MCP tools (read + write + analytic)
│ ├── memory_tool/ Anthropic memory_20250818 adapter
│ ├── watcher/ daemon + git hooks
│ └── cli.py init / watch / serve / review / graph / cluster
├── tests/ 333 passing, ~93% coverage
├── docker/ Neo4j compose
├── npm/ npx wrapper (publishes as stifler-memex-mcp)
└── Dockerfile introspection-only image for MCP directory sandboxes
Comandos
| Comando | Qué hace |
|---|---|
memex init | Extrae el estado base del grafo, ejecuta la primera pasada de clústeres |
memex watch | Demonio que escucha eventos de archivo + git y escribe en Neo4j |
memex serve | Ejecuta el servidor MCP (stdio, HTTP, o ambos) |
memex review | TUI que recorre decisiones de menor confianza para validación humana |
memex graph --output graph.html | Layout de fuerza D3 autocontenido con superposiciones de clúster |
memex cluster [--rerun] [--dry-run] | Ejecuta Leiden sobre el grafo de aristas híbrido; fija IDs de clúster por Jaccard ≥ 0.5 |
memex memory-tool serve | Respaldar la herramienta memory_20250818 de Anthropic con una proyección de grafo |
memex stats [--json] [--repo <path>] | Muestra ahorros de tokens de contexto y estadísticas de telemetría |
Licencia
MIT. Consulta LICENSE.
Autor
Hill Patel (@STiFLeR7)
Contribuidores principales y mantenedores
- Hill Patel (@STiFLeR7) — arquitecto, mantenedor
- Nirvaan Lagishetty (@Nirvaan05) — contribuidor principal, mantenedor
Contribuir
Abre un issue o un PR. uv sync --all-extras && uv run pytest tests/ es toda la configuración que necesitas para ejecutar la suite. Los incrementos de versión deben actualizar ambos pyproject.toml y npm/package.json y deben coincidir.
Vannevar Bush, 1945: "Considera un futuro dispositivo para uso individual, que es una especie de archivo privado y biblioteca mecanizados. Necesita un nombre, y para acuñar uno al azar, memex servirá."