OpenGrok Go MCP

Inteligência de código-fonte para agentes, alimentada por OpenGrok e Go.

Documentação

opengrok-go-mcp mascot

opengrok-go-mcp

Inteligência de código-fonte para agentes, com tecnologia OpenGrok e Go.

Eu vi coisas que vocês, humanos, não grepariam. — Arquiteto Sênior, provavelmente.


License Go CI MCP Evals


Servidor MCP orientado a agentes para buscar, navegar e ler código através do OpenGrok.

Ele transforma o OpenGrok em uma superfície de inteligência de código mais segura para agentes LLM:

  • ferramentas limitadas por capacidade que só aparecem quando o recurso OpenGrok subjacente funciona
  • busca paginada e leitura de arquivos com cursores estáveis
  • URLs de citação em resultados de código para que respostas possam apontar de volta para a fonte
  • avisos para resultados amplos, heurísticos, truncados ou de melhor esforço (códigos warnings[] além de uma string warning legada)
  • expansão automática de contexto em torno de resultados de busca com limites explícitos
  • superfícies de ferramentas de gateway completas, compactas e experimentais para diferentes estilos de agente

Se você é um agente de IA lendo este repositório, comece com AGENTS.md para restrições do projeto e orientações de fluxo de trabalho do agente.

Nota pré-1.0: este servidor MCP ainda está em evolução. Algumas ferramentas, respostas e caminhos de configuração podem estar quebrados ou mudar antes de um lançamento estável 1.0. Por favor, relate problemas usando docs/reporting-issues.md.

Quando Usar

Use opengrok-go-mcp quando quiser que um agente investigue uma grande base de código indexada sem cloná-la localmente. Funciona melhor para encontrar símbolos, ler arquivos, rastrear referências, restringir buscas amplas e produzir respostas com citações de fonte.

Ele é intencionalmente honesto sobre os limites do OpenGrok. O OpenGrok fornece busca de texto completo além de definições ctags, não um grafo de chamadas semântico completo ou um mecanismo AST. Para questões estruturais, use este servidor para encontrar os arquivos e símbolos certos, depois verifique relacionamentos com ferramentas sensíveis à linguagem quando necessário.

Configuração do Cliente

Obrigatório: OPENGROK_MCP_BASE_URL — URL base da API OpenGrok terminando em /api/v1. Na inicialização, o servidor descobre projetos, testa capacidades e registra apenas ferramentas que funcionam. Uma instância típica atrás de proxy reverso não precisa de mais nada.

Copie um bloco abaixo, substitua a URL, reinicie o cliente.

O servidor usa como padrão OPENGROK_MCP_AGENT_PROFILE=economy (payloads enxutos, sem expansão automática de contexto). Defina OPENGROK_MCP_AGENT_PROFILE=rich quando quiser contexto de busca expandido por padrão. Diagnósticos internos de resposta ficam desativados por padrão; defina OPENGROK_MCP_DIAGNOSTICS=true apenas ao depurar contadores de paginação/busca. Veja docs/configuration.md para a referência completa de ambiente.

Binário lançado (sem instalação Go)

Baixe o arquivo para seu SO/arquitetura em GitHub Releases, verifique checksums.txt e aponte seu cliente MCP para o binário opengrok-go-mcp descompactado. Exemplo (Claude Code):

{
  "mcpServers": {
    "opengrok": {
      "command": "/path/to/opengrok-go-mcp",
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
Claude Code (go run)

Adicione em ~/.claude.json sob mcpServers, ou execute claude mcp add:

{
  "mcpServers": {
    "opengrok": {
      "command": "go",
      "args": [
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.0"
      ],
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
OpenCode (go run)

Adicione em opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "opengrok": {
      "type": "local",
      "enabled": true,
      "command": [
        "go",
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.0"
      ],
      "environment": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
Codex

Adicione em .codex/config.toml na raiz do projeto ou ~/.codex/config.toml:

[[mcp_servers]]
name = "opengrok"
command = ["go", "run", "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.0"]

[mcp_servers.env]
OPENGROK_MCP_BASE_URL = "https://your-opengrok-host/source/api/v1"
Outros clientes (Cursor, VS Code MCP, …)

A maioria dos clientes MCP stdio usa o mesmo formato do Claude Code — command, args e um mapa env (o nome pode variar: environment, env):

{
  "mcpServers": {
    "opengrok": {
      "command": "go",
      "args": [
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.0"
      ],
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}

Cursor: .cursor/mcp.json do projeto ou Cursor Settings → MCP. VS Code: configuração da extensão MCP com a mesma entrada de servidor.

Clone local (substitua o caminho do pacote go run)

Use o mesmo bloco env / environment acima. Exemplo de comando para Claude Code:

"command": "sh",
"args": [
  "-c",
  "cd /path/to/opengrok-go-mcp && go run ./cmd/opengrok-go-mcp --read-timeout=30s --write-timeout=30s"
]

Modo HTTP opcional a partir de um clone:

OPENGROK_MCP_TRANSPORT=http \
OPENGROK_MCP_BASE_URL=https://your-opengrok-host/source/api/v1 \
go run ./cmd/opengrok-go-mcp

Endpoint MCP: http://127.0.0.1:8765/mcp

Variáveis de ambiente comuns

VariávelObrigatóriaQuando definir
OPENGROK_MCP_BASE_URLsimURL da API OpenGrok terminando em /api/v1
OPENGROK_MCP_API_TOKENnãoAutenticação necessária, ou logs de inicialização 401/403 nas sondagens. Valor completo de Authorization: Bearer <token> ou Basic <credentials>. Nunca registrado em logs.
OPENGROK_MCP_DEFAULT_PROJECTnãoVários projetos e você quer um implícito em chamadas que omitem project. Definido automaticamente quando exatamente um projeto é descoberto.

Se as sondagens de busca retornarem 401/403 sem token, o servidor ainda inicia e registra a correção; as ferramentas de busca permanecem bloqueadas até que OPENGROK_MCP_API_TOKEN seja definido.

Todas as variáveis de ambiente
VariávelPadrãoFinalidade
OPENGROK_MCP_WEB_BASE_URLderivadoBase da interface web para citações e fallback de arquivo bruto
OPENGROK_MCP_PROJECTSLista de permissões separada por vírgulas; ignora descoberta via API/scrape
OPENGROK_MCP_DISABLE_PROJECT_SCRAPEfalseIgnora scrape da interface web quando /projects/indexed falha
OPENGROK_MCP_PROJECT_REQUIREDtrueExige project em chamadas de ferramenta
OPENGROK_MCP_PROBE_FILEproject/path para sonda de capacidade de leitura de arquivo
OPENGROK_MCP_TRANSPORTstdiohttp para Streamable HTTP (127.0.0.1:8765/mcp)
OPENGROK_MCP_LISTEN127.0.0.1:8765Endereço de escuta HTTP
OPENGROK_MCP_TOOL_SURFACEcompactfull (ferramentas granulares) ou gateway (experimental)
OPENGROK_MCP_AGENT_PROFILEeconomyrich para contexto de busca expandido e links por resultado por padrão. expand_context / response_mode / include_links por chamada ainda têm precedência
OPENGROK_MCP_MEMORY_ENABLEDtrueFerramentas de memória com escopo de processo apenas na superfície completa (stdio). Desativadas via HTTP independentemente desta configuração
OPENGROK_MCP_INSECURE_SKIP_TLS_VERIFYfalseApenas hosts internos confiáveis com TLS quebrado
OPENGROK_MCP_CURSOR_SECRETSegredo HMAC para cursores de paginação assinados
OPENGROK_MCP_AUTO_EXPAND_CONTEXTtrueExpansão automática de contexto em torno de resultados de busca
OPENGROK_MCP_CONTEXT_BEFORE / AFTER5 / 10Linhas da janela de expansão
OPENGROK_MCP_MAX_EXPANDED_RESULTS10Máximo de resultados a expandir
OPENGROK_MCP_MAX_EXPANDED_FILES5Máximo de arquivos buscados durante a expansão
OPENGROK_MCP_CONTEXT_FETCH_CONCURRENCY3Buscas paralelas durante a expansão
OPENGROK_MCP_RETRY_MAX_ATTEMPTS2Tentativas para erros transitórios do OpenGrok
OPENGROK_MCP_RETRY_BASE_DELAY200msBase de backoff de tentativas
OPENGROK_MCP_CACHE_ENABLEDfalseCache de resposta em processo
OPENGROK_MCP_CACHE_TTL5mTempo de vida da entrada no cache
OPENGROK_MCP_CACHE_MAX_SIZE1000Máximo de entradas no cache
DEBUGfalse1 registra requisições HTTP do OpenGrok em stderr

Substituições de orçamento de contexto: OPENGROK_MCP_BUDGET_{MINIMAL|DEFAULT|MAXIMAL}_{BEFORE|AFTER|RESULTS|FILES}.

Obsoleto: OPENGROK_MCP_PROJECT_SCRAPE (use OPENGROK_MCP_DISABLE_PROJECT_SCRAPE). Removido: OPENGROK_MCP_BASIC_AUTH_TOKEN (use OPENGROK_MCP_API_TOKEN="Basic …").

Referência completa: docs/configuration.md.

Segurança

Evite passar segredos como flags de CLI. Use OPENGROK_MCP_API_TOKEN para autenticação OpenGrok; o servidor nunca registra valores de token em logs.

Ressalvas operacionais:

  • O modo HTTP não adiciona autenticação de cliente de entrada. Mantenha o endereço de bind loopback padrão ou coloque-o atrás de controles de rede/autenticação confiáveis.
  • OPENGROK_MCP_INSECURE_SKIP_TLS_VERIFY=true é apenas para instâncias internas controladas com certificados quebrados. Não use para hosts públicos ou não confiáveis.
  • O fallback de arquivo bruto usa OPENGROK_MCP_WEB_BASE_URL com as mesmas credenciais configuradas. Trate essa URL como parte do limite confiável do OpenGrok.
  • Ferramentas de memória são apenas superfície completa (stdio). Elas têm escopo de processo, são efêmeras e desativadas via HTTP porque a memória não é isolada por sessão de cliente.
  • Defina OPENGROK_MCP_CURSOR_SECRET para implantações compartilhadas se a integridade do cursor for importante.

Avaliação

Avaliações stdio herméticas em evals/ — binário MCP real, backend OpenGrok falso, sem instância ativa. CI as executa em cada PR (ci.yml). Resumos do README e colunas Δ comparam com baselines confirmados em evals/baselines/. Atualize localmente com scripts/update-eval-results.sh; o hook opcional de pré-push (scripts/install-githooks.sh) executa testes e atualiza esses arquivos antes de você enviar.

go test ./evals/ -count=1                        # contract + token benchmark
go test ./evals/ -run TestEvalSuite -count=1      # MCP contract only
go test ./evals/ -run TestTokenBenchmark -count=1 # token economy only

Como ler as tabelas abaixo

  • Avaliação de contrato — chamadas MCP herméticas contra um backend OpenGrok falso; verifica saídas, erros e campos de paginação. Δ é a mudança em relação ao baseline confirmado em evals/baselines/. cobertura@K é a fração de casos de avaliação exercitados.
  • Benchmark de tokens — mesma estrutura, mas mede bytes UTF-8 cruzando o fio MCP (esquemas de ferramentas, requisições, respostas). Est. tokens = bytes ÷ 4 (heurística aproximada, não um tokenizador de modelo específico).
  • Superfíciefull (ferramentas granulares), compact (4 ferramentas consolidadas, padrão), ou gateway (descobrir + chamar experimental).
  • ListTools — custo único quando o cliente carrega a lista de ferramentas e esquemas no início da sessão; geralmente o maior item de linha em full.
  • Total aquecidoListTools mais todas as chamadas de ferramenta em um cenário (bytes de requisição + resposta). Para gateway, aquecido exclui a chamada única de opengrok_discover; frio a inclui (apenas primeira sessão). Em full e compact, frio = aquecido.
  • Mín–máx — intervalo entre os quatro cenários de replay (busca de símbolo, navegação de arquivo, busca de símbolo em várias etapas, buscar-e-ler). Detalhamento por cenário está na tabela recolhida.
  • Δ em linhas de token — mudança em tokens estimados em relação ao último baseline confirmado (evals/baselines/token_report.json).

Avaliação de contrato

Última execução: 2026-06-25 · chamada direta · docs do harness →

10/10 aprovados · 100% (Δ ±0) · 100% cobertura@K — veja Como ler as tabelas para Δ e cobertura@K.

Pontuações por ferramenta
FerramentaPontuaçãoCasos
get_file_context100% (Δ ±0)1
list_projects100% (Δ ±0)1
list_symbols100% (Δ ±0)1
read_file100% (Δ ±0)1
search_code100% (Δ ±0)4
search_symbol_definitions100% (Δ ±0)1
search_symbol_references100% (Δ ±0)1

Benchmark de economia de tokens

Última execução: 2026-06-25 · replay determinístico · est. tokens = bytes÷4 (heurística, não exata do modelo)

ListTools domina o custo de sessão na superfície completa (18 ferramentas). Compact (4) e gateway (2) registram muito menos esquemas.

SuperfícieListTools (est. tokens)Total aquecido mín–máx (est. tokens)
full14k (Δ +724)15k–16k (era 14k–15k)
compact6.8k (Δ +3.3k)7.7k–10k (era 4.4k–6.8k)
gateway261 (Δ ±0)1.2k–2.3k (era 1.2k–2.1k)

Aquecido = ListTools + tráfego de ferramentas do cenário. Gateway aquecido omite discover único; full/compact frio = aquecido. Exploração de arquivo compact ignora files.list (sem operação compact).

Totais aquecidos por cenário (est. tokens; ListTools + chamadas) | Cenário | completo | compacto | gateway | |---|---|---|---| | Símbolo composto | 16k (Δ +911) | 8,3k (Δ +3,5k) | 1,8k (Δ +187) | | Exploração de arquivos | 15k (Δ +779) | 7,7k (Δ +3,3k) | 1,2k (Δ +56) | | Investigação de símbolo (3 chamadas) | 16k (Δ +927) | 8,7k (Δ +3,5k) | 2,3k (Δ +203) | | Busca + leitura | 15k (Δ +834) | 7,9k (Δ +3,4k) | 1,4k (Δ +109) |

Δ vs. linha de base de 2026-06-24.

Desenvolvimento

Este projeto usa o GitHub Spec Kit para planejamento de funcionalidades não triviais.

Para mudanças de comportamento significativas, novas ferramentas MCP, mudanças de esquema, mudanças de configuração ou mudanças que afetem o comportamento voltado a agentes, os contribuidores devem começar pela constituição do projeto:

  • .specify/memory/constitution.md

O trabalho de funcionalidades geralmente deve produzir:

  • specs/FEATURE/spec.md
  • specs/FEATURE/plan.md
  • specs/FEATURE/tasks.md

Correções de bugs pequenas, edições de documentação, atualizações de dependências e refatorações mecânicas não exigem um fluxo completo do Spec Kit, a menos que afetem o contrato público do MCP.

Todas as mudanças devem preservar o contrato MCP, a semântica do OpenGrok, a postura de segurança, as expectativas de compatibilidade e os requisitos de documentação descritos na constituição.

Limitações Conhecidas

  • A travessia de projetos grandes é limitada, e algumas operações de busca e descoberta são de melhor esforço, em vez de semântica de linguagem.
  • O transporte HTTP é destinado a configurações locais ou internas controladas e não adiciona autenticação de cliente de entrada.

Consulte docs/limitations.md para a lista atual detalhada, impacto comportamental e mitigações.

Licença

opengrok-go-mcp é licenciado sob a Apache License 2.0 (Apache-2.0) para novos lançamentos a partir de v0.3.0-beta.2.

Lançamentos publicados anteriormente, até e incluindo v0.3.0-beta.1, foram lançados sob CC0-1.0 e permanecem disponíveis sob esses termos.