memex-mcp
Sistema de continuidade de contexto para desenvolvedores que constrói um grafo de conhecimento temporal do seu código — módulos, símbolos, decisões e problemas em aberto — e o disponibiliza para agentes de IA de codificação por meio de 12 ferramentas MCP, para que cada sessão do agente comece conhecendo sua arquitetura sem necessidade de colagem manual de contexto.
Documentação
memex — memória de grafo temporal para agentes de codificação de IA
Memória persistente e contexto de código para agentes de codificação de IA, servidos via MCP. Um grafo de conhecimento bitemporal do seu repositório — módulos, símbolos, decisões, problemas — para Claude Code, Cursor, Codex, Gemini CLI e qualquer agente compatível com MCP.
Um daemon e servidor MCP que transforma cada commit e cada alteração de arquivo em estado de grafo estruturado: módulos, símbolos, decisões, problemas, fatos de lockfile. Sessões param de começar às cegas. Agentes param de redescobrir o mesmo refactor toda vez que você /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
Instalação
Via marketplace do Claude Code
/plugin marketplace add STiFLeR7/claude-plugins
/plugin install memex-mcp@stifler-marketplace
Reinicie sua sessão do 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 do Claude Code | /plugin install memex-mcp@stifler-marketplace |
| npx (sem instalação) | npx stifler-memex-mcp <cmd> |
| uv | uv add memex-mcp |
| pip | pip install memex-mcp |
| fonte | git clone github.com/STiFLeR7/memex && uv sync |
Implantação de equipe auto-hospedada
Para uma configuração de equipe compartilhada (um Neo4j + um memex-server, autenticação ativada por padrão, portas do Neo4j nunca expostas ao host):
bash docker/bootstrap-team-env.sh
docker compose -f docker/docker-compose.team.yml up -d
Veja docker/TEAM-DEPLOY.md para o fluxo completo, capturando a chave de administrador inicial e a armadilha down -v a evitar.
De relance
| Propriedade | Valor |
|---|---|
| Saída | Um grafo Neo4j populado continuamente a partir do seu repositório |
| Armazenamento | Neo4j via Graphiti. Bitemporal — cada aresta tem created_at e expired_at opcional |
| Sobrevive a | /clear, travamentos de terminal, reinicializações de máquina, transferências entre colegas |
| Entrega para | Claude Code, Cursor, Codex, Gemini CLI, qualquer cliente MCP |
| Granularidade | Escala de 50 a 5000+ módulos via clusters hierárquicos Leiden |
| Síntese | Gemini Flash destila commits em nós Decision; Pro para síntese fundamentada |
| Confiança | Calculada no momento da consulta. Decaimento em dois regimes (meia-vida validada ~139d, não validada obsoleta em 30d) |
| Governança de escrita | ACL por tipo de nó, confirmação de intenção em escritas de agente, semântica explícita de corroborates / supersedes |
| Testes | 333 passando, ~93% de cobertura |
O 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
Ferramentas MCP
14 ferramentas — oito de leitura, quatro de escrita, duas analíticas.
Leitura
| Ferramenta | Quando |
|---|---|
get_project_context | Início de sessão. Retorna um briefing em nível de cluster abaixo de 1500 tokens, independentemente do tamanho do repositório |
get_symbol_context | Antes de editar uma função ou classe. Retorna chamadores, chamados e decisões vinculadas |
get_recent_decisions | Últimos N dias de decisões arquiteturais, opcionalmente com escopo de módulo |
get_open_problems | Bugs ativos e dívida técnica, ordenados por severidade |
search_context | Busca híbrida: semântica × palavra-chave × travessia de grafo × fusão RRF |
get_stale_context | Arestas cuja confiança composta caiu abaixo do limite |
explain_change | Dado um SHA de commit, cruza o diff com nós vinculados de Decisão/Problema e pede ao Gemini Pro uma explicação fundamentada |
predict_impact | Dado um caminho de arquivo, retorna uma lista classificada de módulos provavelmente afetados com base no acoplamento do grafo (sem chamada de LLM) |
Escrita
| Ferramenta | Quando |
|---|---|
record_decision | Após fazer uma escolha técnica. Suporta corroborates (reforçar) e supersedes (substituir) |
record_problem | Ao descobrir um bug ou um pedaço de dívida técnica |
resolve_problem | Quando um problema rastreado é corrigido |
invalidate_edge | Quando um fato armazenado não é mais verdadeiro |
Confiança bitemporal
A confiança não é um número armazenado que muda. Ela é calculada no momento da consulta a partir de base_confidence, status de validação, tempo desde o último reforço e contagem de acessos.
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
| Propriedade | Valor |
|---|---|
| Meia-vida validada | ~139 dias |
| Limite de obsolescência não validada | 30 dias (composta < 0,3) |
| Recência τ | 90 dias (decaimento exponencial) |
| Fórmula composta | conf × recency × (1 + rehearsal_w × log(1 + access_count)) |
| Limite de similaridade de conflito | 0,4 (abaixo disso + validade sobreposta = conflito) |
| Limite de confirmação de intenção | 0,85 (verificação de similaridade de escrita MCP) |
Clusters hierárquicos
memex cluster executa Leiden hierárquico sobre um grafo de arestas híbrido:
| Tipo de aresta | Peso |
|---|---|
| Colocalização de diretório | 1,0 |
| Importações de módulo | 2,0 |
| Chamadas de símbolo | log(1 + calls) |
| Propriedade | Valor |
|---|---|
| Algoritmo | graspologic.partition.hierarchical_leiden com semente fixa |
| Nomenclatura | TF-IDF top-3 sobre docstrings de módulo + nomes de símbolos, fallback de diretório pai |
| Fixação de ID | Jaccard ≥ 0,5 entre execuções (nomes de cluster permanecem estáveis através de renomeações) |
| Substituições do usuário | .memex/clusters.yaml — qualquer atribuição pode ser bloqueada |
| Orçamento de contexto | get_project_context permanece abaixo de 1500 tokens, quer seu repositório tenha 50 ou 5000 módulos |
Meça suas economias
O memex rastreia métricas de redução de tokens e ações de revisão humana localmente em um banco de dados SQLite (~/.config/memex/telemetry.db).
Você pode consultar suas economias a qualquer momento usando a CLI:
memex stats
Ou visualizar o payload JSON bruto:
memex stats --json
Ou direcionar um escopo específico de repositório:
memex stats --repo /path/to/repo
Isso retorna uma agregação de:
- Resumos de período: Chamadas, tokens retornados, tokens ingênuos (tamanho dos arquivos solicitados), tokens economizados e porcentagem de redução de tokens em
today,last 7 days,last 30 dayselifetime. - Principais ferramentas: As ferramentas mais valiosas ordenadas por total de tokens economizados.
- Clientes de agente: Agentes ativos (Claude Code, Gemini CLI, Cursor, Codex) e sua distribuição de economia de tokens.
- Saúde de validação: Total de nós validados, não validados e corroborados, juntamente com os dias decorridos desde a última revisão.
As mesmas estatísticas são expostas via transporte HTTP MCP:
GET /stats?repo=/path/to/repo
Authorization: Bearer <your-key>
Conecte seu agente
Claude Code
A instalação via marketplace acima faz isso por você. Conexão manual em .claude/settings.json:
{
"mcpServers": {
"memex": {
"type": "stdio",
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Cursor
Adicione a ~/.cursor/mcp.json:
{
"mcpServers": {
"memex": {
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Gemini CLI
Adicione a ~/.gemini/settings.json:
{
"mcpServers": {
"memex": {
"command": "npx",
"args": ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
}
}
}
Codex
Adicione a ~/.codex/config.toml:
[mcp_servers.memex]
command = "npx"
args = ["-y", "stifler-memex-mcp", "serve", "--repo", "."]
Ferramenta de memória do Anthropic (memory_20250818)
O memex pode dar suporte à ferramenta de memória nativa do Claude — agentes leem de uma projeção de grafo por sessão mais uma zona de rascunho gravável.
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])
Princípios operacionais
| # | Princípio | A aposta |
|---|---|---|
| 1 | Bitemporal, nunca destrutivo | Arestas são expiradas, não excluídas. WHERE r.expired_at IS NULL filtra o estado ativo |
| 2 | Confiança é calculada, não armazenada | Mutar um número convida à deriva silenciosa. Recalcule a cada leitura |
| 3 | Dois regimes para decaimento | Fatos validados decaem lentamente; fatos não validados devem ganhar seu lugar sendo acessados |
| 4 | Humano no circuito | memex review enfileira nós de Decisão de menor confiança para validação explícita |
| 5 | Governança de escrita | ACL por tipo de nó. Decision.policy = open, Module.policy = locked. Confirmação de intenção em escritas de conteúdo semelhante |
| 6 | Tokens são orçados | get_project_context permanece abaixo de 1500 tokens em qualquer tamanho de repositório via clusters Leiden |
| 7 | Síntese apenas em commits | O watcher agrupa por janela de debounce. Gemini Flash não está no caminho crítico de uma chamada de ferramenta |
| 8 | Pro para síntese, Flash para extração | explain_change usa Pro porque a fundamentação importa. Todo o resto usa Flash |
| 9 | Ciente de múltiplos repositórios | Um watcher + um servidor MCP podem gerenciar centenas de repositórios. --repo alterna o escopo |
| 10 | Local-first | Neo4j roda no seu Docker. Gemini é a única chamada de saída, e apenas em commits |
Quando usar o memex
| Use quando | Pule quando |
|---|---|
| Projeto de várias semanas ou meses | Script de uso único, protótipo descartável |
| Você trabalha com vários agentes (Claude, Cursor, Codex) e quer contexto compartilhado | Você só trabalha com um agente em uma tarefa |
| Decisões arquiteturais são tomadas ao longo do tempo e precisam ser lembradas | O projeto inteiro cabe em uma única janela de contexto de 200k tokens |
| Você quer consultar "o que decidimos sobre X" de qualquer sessão | Seu repositório já é pequeno o suficiente para colar no prompt |
| Vários desenvolvedores usando agentes de IA no mesmo código | Trabalho solo onde você nunca /clear |
Estrutura do projeto
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 | O que faz |
|---|---|
memex init | Extrai o estado base do grafo, executa a primeira passada de cluster |
memex watch | Daemon que escuta eventos de arquivo + git e escreve no Neo4j |
memex serve | Executa o servidor MCP (stdio, HTTP ou ambos) |
memex review | TUI que percorre decisões de menor confiança para validação humana |
memex graph --output graph.html | Layout de força D3 autocontido com sobreposições de cluster |
memex cluster [--rerun] [--dry-run] | Executa Leiden sobre o grafo de arestas híbrido; fixa IDs de cluster por Jaccard ≥ 0,5 |
memex memory-tool serve | Dá suporte à ferramenta memory_20250818 do Anthropic com uma projeção de grafo |
memex stats [--json] [--repo <path>] | Mostra economias de tokens de contexto e estatísticas de telemetria |
Licença
MIT. Veja LICENSE.
Autor
Hill Patel (@STiFLeR7)
Principais contribuidores e mantenedores
- Hill Patel (@STiFLeR7) — arquiteto, mantenedor
- Nirvaan Lagishetty (@Nirvaan05) — contribuidor principal, mantenedor
Contribuindo
Abra uma issue ou PR. uv sync --all-extras && uv run pytest tests/ é toda a configuração que você precisa para executar a suíte. Bumps de versão devem atualizar ambos pyproject.toml e npm/package.json e eles devem concordar.
Vannevar Bush, 1945: "Considere um dispositivo futuro para uso individual, que é uma espécie de arquivo e biblioteca privada mecanizada. Ele precisa de um nome, e para cunhar um aleatoriamente, memex servirá."