OpenGrok Go MCP
Inteligência de código-fonte para agentes, alimentada por OpenGrok e Go.
Documentação
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.
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 stringwarninglegada) - 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ável | Obrigatória | Quando definir |
|---|---|---|
OPENGROK_MCP_BASE_URL | sim | URL da API OpenGrok terminando em /api/v1 |
OPENGROK_MCP_API_TOKEN | não | Autenticaçã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_PROJECT | não | Vá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ável | Padrão | Finalidade |
|---|---|---|
OPENGROK_MCP_WEB_BASE_URL | derivado | Base da interface web para citações e fallback de arquivo bruto |
OPENGROK_MCP_PROJECTS | — | Lista de permissões separada por vírgulas; ignora descoberta via API/scrape |
OPENGROK_MCP_DISABLE_PROJECT_SCRAPE | false | Ignora scrape da interface web quando /projects/indexed falha |
OPENGROK_MCP_PROJECT_REQUIRED | true | Exige project em chamadas de ferramenta |
OPENGROK_MCP_PROBE_FILE | — | project/path para sonda de capacidade de leitura de arquivo |
OPENGROK_MCP_TRANSPORT | stdio | http para Streamable HTTP (127.0.0.1:8765/mcp) |
OPENGROK_MCP_LISTEN | 127.0.0.1:8765 | Endereço de escuta HTTP |
OPENGROK_MCP_TOOL_SURFACE | compact | full (ferramentas granulares) ou gateway (experimental) |
OPENGROK_MCP_AGENT_PROFILE | economy | rich 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_ENABLED | true | Ferramentas 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_VERIFY | false | Apenas hosts internos confiáveis com TLS quebrado |
OPENGROK_MCP_CURSOR_SECRET | — | Segredo HMAC para cursores de paginação assinados |
OPENGROK_MCP_AUTO_EXPAND_CONTEXT | true | Expansão automática de contexto em torno de resultados de busca |
OPENGROK_MCP_CONTEXT_BEFORE / AFTER | 5 / 10 | Linhas da janela de expansão |
OPENGROK_MCP_MAX_EXPANDED_RESULTS | 10 | Máximo de resultados a expandir |
OPENGROK_MCP_MAX_EXPANDED_FILES | 5 | Máximo de arquivos buscados durante a expansão |
OPENGROK_MCP_CONTEXT_FETCH_CONCURRENCY | 3 | Buscas paralelas durante a expansão |
OPENGROK_MCP_RETRY_MAX_ATTEMPTS | 2 | Tentativas para erros transitórios do OpenGrok |
OPENGROK_MCP_RETRY_BASE_DELAY | 200ms | Base de backoff de tentativas |
OPENGROK_MCP_CACHE_ENABLED | false | Cache de resposta em processo |
OPENGROK_MCP_CACHE_TTL | 5m | Tempo de vida da entrada no cache |
OPENGROK_MCP_CACHE_MAX_SIZE | 1000 | Máximo de entradas no cache |
DEBUG | false | 1 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_URLcom 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_SECRETpara 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ície —
full(ferramentas granulares),compact(4 ferramentas consolidadas, padrão), ougateway(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 aquecido —
ListToolsmais todas as chamadas de ferramenta em um cenário (bytes de requisição + resposta). Para gateway, aquecido exclui a chamada única deopengrok_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
| Ferramenta | Pontuação | Casos |
|---|---|---|
| get_file_context | 100% (Δ ±0) | 1 |
| list_projects | 100% (Δ ±0) | 1 |
| list_symbols | 100% (Δ ±0) | 1 |
| read_file | 100% (Δ ±0) | 1 |
| search_code | 100% (Δ ±0) | 4 |
| search_symbol_definitions | 100% (Δ ±0) | 1 |
| search_symbol_references | 100% (Δ ±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ície | ListTools (est. tokens) | Total aquecido mín–máx (est. tokens) |
|---|---|---|
| full | 14k (Δ +724) | 15k–16k (era 14k–15k) |
| compact | 6.8k (Δ +3.3k) | 7.7k–10k (era 4.4k–6.8k) |
| gateway | 261 (Δ ±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.mdspecs/FEATURE/plan.mdspecs/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.