OpenCode History MCP

Pesquise seu histórico de conversas anteriores do OpenCode antes de iniciar um novo trabalho, por meio de um índice FTS5 local somente leitura — sem chamadas de rede.

Documentação

OpenCode History MCP

Um servidor MCP (Model Context Protocol) local que permite que agentes de codificação de IA pesquisem suas conversas passadas do OpenCode — antes de começarem a explorar arquivos ou refazer trabalhos que você já fez.

Tudo roda na sua máquina: ele lê o banco de dados SQLite do próprio OpenCode e constrói um índice de busca de texto completo privado ao lado dele. Sem chamadas de rede, sem serviços externos, nenhum dado jamais sai do seu computador.

PyPI Python License: MIT MCP

Se isso te poupar de diagnosticar o mesmo bug duas vezes, considere deixar uma ⭐ — isso ajuda outros usuários do OpenCode a encontrá-lo também.

Por quê

Se você usa OpenCode diariamente em vários projetos, você acumula milhares de sessões passadas — correções de bugs, trabalho em funcionalidades, diagnósticos — ficando sem uso em opencode.db. Quando você inicia uma nova sessão no mesmo módulo ou arquivo, seu agente não tem ideia de que tudo isso aconteceu. Ele re-explora do zero, ou pior, repete um erro que você já corrigiu há três semanas.

Este servidor expõe esse histórico como ferramentas MCP que qualquer agente pode chamar: "este arquivo já foi tocado antes? o que concluímos da última vez? que trabalho relacionado existe neste projeto?"

Como funciona

OpenCode's own DB (read-only)          Our derived index (read-write)
┌─────────────────────────┐            ┌──────────────────────────┐
│ opencode.db              │  builds →  │ opencode-history.db       │
│ - session / message /part│            │ - sessions (denormalized) │
│ - JSON blobs per row      │            │ - search_idx (FTS5)       │
└─────────────────────────┘            │ - session_files (index)   │
                                        └──────────────────────────┘
  • O banco de dados de origem permanece intocado. Nós o abrimos mode=ro (somente leitura, ciente de WAL) e nunca escrevemos nele.
  • Um índice FTS5 separado armazena metadados de sessão desnormalizados + busca de texto completo sobre textos de usuário/assistente — ordens de magnitude mais rápido do que escanear blobs JSON em cada consulta.
  • Sincronização automática na inicialização, com cache TTL (5 min): se o OpenCode gravou novas sessões desde a última verificação, o índice se atualiza incrementalmente antes de servir os resultados.
  • Privacidade é estrutural, não uma política: o índice fica ao lado do próprio banco do OpenCode, na sua máquina, sob seu usuário do SO. Não existe versão hospedada/compartilhada deste servidor — cada um executa o seu próprio, contra seu próprio histórico.

Início rápido

1. Construa o índice (primeira execução)

uvx opencode-history-mcp --build-index

Isso lê seu opencode.db local e constrói opencode-history.db ao lado dele. Leva alguns segundos por mil sessões.

2. Adicione ao seu cliente MCP

Hermes Agent
hermes mcp add history \
  --command uvx \
  --args opencode-history-mcp

Ou em ~/.hermes/config.yaml:

mcp_servers:
  history:
    command: uvx
    args:
      - opencode-history-mcp
    enabled: true
OpenCode

Em ~/.config/opencode/opencode.jsonc (global) ou .opencode/opencode.jsonc (projeto):

{
  "mcp": {
    "history": {
      "type": "local",
      "command": ["uvx", "opencode-history-mcp"],
      "enabled": true
    }
  }
}
Claude Desktop

Em claude_desktop_config.json:

{
  "mcpServers": {
    "opencode-history": {
      "command": "uvx",
      "args": ["opencode-history-mcp"]
    }
  }
}
Cursor / outros clientes MCP

Qualquer cliente que suporte servidores MCP stdio locais funciona da mesma forma — aponte-o para:

command: uvx
args: ["opencode-history-mcp"]

3. Mantenha o índice atualizado (opcional)

O servidor sincroniza automaticamente na inicialização (verificado a cada 5 minutos por sessão). Para um índice totalmente atualizado sem esperar essa verificação, execute:

uvx opencode-history-mcp --sync-index

Você pode agendar isso com cron/launchd se quiser que o índice esteja sempre aquecido antecipadamente.

Ferramentas

FerramentaPropósito
search_historyBusca de texto completo (FTS5) sobre prompts de usuário e respostas de assistente. Classificada por relevância + recência + atividade.
find_related_workCorrespondência de maior precisão em títulos de sessão e descrições originais de tarefas. Melhor primeira chamada para "já fizemos isso antes?"
find_sessions_by_fileEncontre todas as sessões que modificaram ou mencionaram um arquivo específico.
list_sessionsNavegue por sessões em um diretório, ordenadas por data/mensagens/custo/tokens.
get_session_detailMetadados completos de uma sessão: tarefa, arquivos tocados, custo, tokens, contagem de subagentes.
get_session_messagesLeia o histórico real de mensagens paginado de uma sessão.
get_statsEstatísticas agregadas: contagens de sessão/mensagem, custo, intervalo de tempo, distribuição de atividade.

Todas as ferramentas aceitam um parâmetro opcional directory para limitar os resultados a um projeto. Padrão recomendado: busque limitado ao projeto atual primeiro; se nada relevante voltar, tente novamente sem directory para uma busca global — trabalho relacionado às vezes vive em um projeto irmão.

Caminhos multiplataforma

O servidor resolve o diretório de dados do OpenCode da mesma forma que o próprio OpenCode faz (sua resolução baseada em xdg-basedir — veja packages/core/src/global.ts no código-fonte do OpenCode):

PlataformaCaminho padrãoObservações
Linux$XDG_DATA_HOME/opencode → recai para ~/.local/share/opencodeComportamento padrão do XDG Base Directory.
macOS~/.local/share/opencode⚠️ Não ~/Library/Application Support/opencode. O OpenCode não tem ramo específico para macOS em sua resolução de caminho — ele usa o mesmo caminho estilo XDG do Linux. Isso confunde quem assume que as convenções da Apple se aplicam.
Windows%LOCALAPPDATA%\opencodeRecai para %USERPROFILE%\AppData\Local\opencode se a variável de ambiente não estiver definida.
WSL (WSL2/WSL1)Igual ao Linux — ~/.local/share/opencodeO WSL executa um kernel Linux real, então sys.platform reporta "linux" e o caminho Linux se aplica automaticamente. Isso só está correto se o próprio OpenCode rodar dentro do WSL.

O caso extremo WSL + OpenCode no lado Windows

Se você instalou o OpenCode nativamente no Windows (não dentro do WSL) mas executa seu cliente MCP ou terminal dentro do WSL, o banco de dados fica no sistema de arquivos do Windows, que o WSL monta em /mnt/c/.... A resolução automática de caminho Linux procurará no lugar errado (seu diretório home do WSL, não o do Windows) e não o encontrará.

Correção: aponte o servidor explicitamente para o caminho Windows montado via a variável de ambiente OPENCODE_DATA_DIR:

export OPENCODE_DATA_DIR="/mnt/c/Users/<your-windows-username>/AppData/Local/opencode"

Ou defina-a na configuração env do seu cliente MCP para este servidor, por exemplo, para Hermes:

mcp_servers:
  history:
    command: uvx
    args:
      - opencode-history-mcp
    env:
      OPENCODE_DATA_DIR: /mnt/c/Users/yourname/AppData/Local/opencode
    enabled: true

Qualquer outra configuração personalizada

OPENCODE_DATA_DIR sempre vence a detecção automática, em todas as plataformas — use-a sempre que os dados do OpenCode estiverem em um local não padrão (XDG_DATA_HOME personalizado, um contêiner, uma unidade sincronizada/montada, etc).

Ensinando seu agente a usar isso automaticamente

Ter as ferramentas disponíveis não é suficiente — agentes tendem a explorar arquivos diretamente, a menos que sejam instruídos. Adicione isso ao seu AGENTS.md (OpenCode) ou CLAUDE.md (Claude Code) do projeto para tornar a busca de histórico um primeiro passo obrigatório:

## Check history before starting work

Before exploring files or writing code for any task that touches an
existing module, file, or bug, call the history search tools first:

1. `find_related_work(query="<short description of the task>")` —
   has this exact task been worked on before?
2. If the task names a specific file, also call
   `find_sessions_by_file(file_path="...")`.
3. If step 1 returns nothing relevant, broaden with
   `search_history(query="...")` (full-text, no directory scope).

Only start exploring the codebase directly if history search comes up
empty. If a relevant past session is found, read it with
`get_session_detail` / `get_session_messages` before proceeding —
don't repeat work or re-diagnose an issue that was already solved.

Isso é um forte empurrão, não uma restrição rígida — o agente ainda pode decidir que a busca de histórico não é relevante para uma tarefa realmente nova. O objetivo é tornar "verificar primeiro" o reflexo padrão em vez de uma reflexão tardia.

Desenvolvimento

git clone https://github.com/singleflo/opencode-history-mcp.git
cd opencode-history-mcp
uv venv
uv pip install -e .

# Build the index against your own OpenCode history
python -m opencode_history_mcp.build_index --full

# Run the server directly (stdio)
python -m opencode_history_mcp.server

# Inspect with the FastMCP dev tools
fastmcp dev -m opencode_history_mcp.server

Veja docs/design.md para a justificativa completa do design (fórmula de classificação, decisões de esquema, algoritmo de sincronização).

Contribuindo

Issues e PRs são bem-vindos. Se você encontrar um problema de caminho específico de plataforma, inclua seu SO, OPENCODE_DATA_DIR (se definido) e a localização real do seu opencode.db — essa é a forma mais rápida de corrigir um caso extremo na lógica de resolução.

Licença

MIT — veja LICENSE.