OpenGrok

O Servidor MCP OpenGrok é uma extensão nativa do Model Context Protocol (MCP) para VS Code que conecta perfeitamente os índices OpenGrok da sua organização ao GitHub Copilot Chat. Ele equipa seu assistente de IA com o contexto profundo e instantâneo do repositório necessário para navegar, entender e pesquisar bases de código massivas usando apenas linguagem natural.

Documentação

OpenGrok MCP Server logo

Servidor MCP OpenGrok

Inteligência de código para qualquer base de código indexada pelo OpenGrok — busca, leitura, blame, navegação de símbolos, diffs, histórico de commits, grafos de chamadas, mapas de dependências e investigação guiada. Otimizado para eficiência de tokens por meio do Code Mode e leituras de código com ciência de AST.

npm MCP Registry CI GitHub Release


Início Rápido

Opção 1 — Extensão do VS Code

Instale o OpenGrok MCP pelo VS Code Marketplace ou procure por "OpenGrok" no painel de Extensões. O painel de configuração abre no primeiro lançamento — informe seu endpoint do OpenGrok, nome de usuário e senha, depois clique em Salvar Configurações e recarregue quando solicitado.

A extensão fornece uma interface visual de configuração e gerencia o processo do servidor MCP automaticamente. Não é necessário Python, instalação externa de Node.js ou configuração manual de ambiente.

Opção 2 — CLI npm / npx

npm install -g opengrok-mcp-server
opengrok-mcp setup      # interactive wizard: URL, credentials, MCP client registration

Ou execute sem instalar:

npx opengrok-mcp-server setup

Outros comandos de CLI:

opengrok-mcp status      # health check: validates connectivity and detects installed MCP clients
opengrok-mcp setup --test                     # test the stored connection without the wizard
opengrok-mcp setup --set contextBudget=generous  # update one stored setting non-interactively
opengrok-mcp export-audit --format json --output audit.jsonl  # export the audit log
opengrok-mcp version     # print version and exit
opengrok-mcp help        # show all commands

Funciona com qualquer cliente compatível com MCP (CLI ou IDE). Consulte MCP_CLIENTS.md para formato de configuração e solução de problemas.

As credenciais são armazenadas no chaveiro do sistema operacional (Keychain do macOS, Gerenciador de Credenciais do Windows, libsecret do Linux) com um fallback de arquivo criptografado AES-256-GCM para ambientes headless.


[!TIP] Atualizações Automáticas — A extensão verifica o GitHub em busca de novas versões uma vez a cada 24 horas e notifica quando uma está disponível. Use OpenGrok: Verificar Atualizações para verificar sob demanda.


O Problema

Engenheiros que trabalham em grandes bases de código enfrentam uma lacuna específica ao usar assistentes de codificação com IA. A janela de contexto do modelo contém o arquivo atualmente aberto, a conversa e tudo o que foi compartilhado manualmente — mas uma base de código em produção tem estrutura, histórico e relacionamentos entre módulos que existem inteiramente fora dessa janela.

Um símbolo definido em um módulo e chamado por outros setenta. Uma função cujo comportamento só fica claro a partir dos três commits que a moldaram. Uma cadeia de includes que se estende por uma dúzia de diretórios. Um grafo de chamadas mostrando quais componentes dependem de um serviço antes de ele ser refatorado.

Sem acesso ao índice de código, o modelo preenche essas lacunas adivinhando: ele fabrica caminhos de arquivos, inventa assinaturas de funções, atribui incorretamente alterações a autores. O modelo não erra porque é pouco inteligente — ele erra porque está isolado.

O OpenGrok já resolve isso para engenheiros humanos. Ele indexa código-fonte em dezenas de linguagens de programação, mantém um índice de texto completo no histórico de commits e expõe buscas de definições, grafos de referências, blame, navegação de diretórios e histórico de arquivos por meio de uma API REST. O problema era que as ferramentas de IA não tinham como alcançá-lo.


Como Funciona

┌──────────────────────────────────────────────────────┐
│  AI Client  (Claude, Copilot, Cursor, Codex …)       │
└─────────────────────┬────────────────────────────────┘
                      │  MCP  (stdio or HTTP)
┌─────────────────────▼────────────────────────────────┐
│  OpenGrok MCP Server  (Node.js)                      │
│  opengrok_api  ──── full API spec, once per session  │
│  opengrok_execute ─ run JavaScript in sandbox        │
│                                                      │
│  OpenGrok client ── search · symbols · blame · diffs │
└─────────────────────┬────────────────────────────────┘
                      │  HTTP (REST + web fallback)
┌─────────────────────▼────────────────────────────────┐
│  OpenGrok                                       │
│  search · symbols · call graphs · index health       │
└──────────────────────────────────────────────────────┘

O servidor expõe duas ferramentas principais. opengrok_api entrega a especificação completa da API no início da sessão. Cada operação subsequente passa por opengrok_execute: a IA escreve um programa JavaScript usando o objeto env.opengrok.* — search, getFileContent, getFileAnnotate, getFileHistory, browseDir, getFileSymbols — e o envia como uma única execução.

Resultados intermediários permanecem dentro do sandbox; apenas o valor final de return cruza de volta para a janela de contexto. Uma investigação completa — encontrar o símbolo, ler a definição, verificar quem o alterou, rastrear os chamadores — é um único script, não uma sequência de idas e voltas com resultados fluindo pelo contexto entre cada uma. Economia de tokens de 80–95% é típica para investigações complexas.

Todas as chamadas de env.opengrok.* aparecem síncronas dentro do código do sandbox — a VM QuickJS WASM faz a ponte de chamadas HTTP assíncronas de forma transparente por um canal SharedArrayBuffer + Atomics (região de dados de 8 MB, timeout de 62 s por chamada, limite rígido de execução de 62 s), mantendo o loop de eventos do Node.js livre.

Banco de memória — dois arquivos persistem entre turnos e reinícios de sessão: active-task.md (4 KB) para o estado atual da investigação e investigation-log.md (32 KB) para descobertas somente de acréscimo. Dentro do sandbox: env.opengrok.readMemory() / env.opengrok.writeMemory(). Consulte a referência Memory Bank abaixo.


Referência

Referência de Ferramentas

31 ferramentas no total: 2–5 no Code Mode (opengrok_api + opengrok_execute, mais 3 ferramentas de memória quando OPENGROK_ENABLE_MEMORY_TOOLS=true) e 26 no modo padrão (OPENGROK_CODE_MODE=false).

Ferramentas Principais

FerramentaFinalidade
opengrok_search_codeBusca de texto completo, definição, referência, caminho e histórico. Suporta filtragem file_type e paginação cursor.
opengrok_find_fileLocaliza arquivos por nome ou padrão de diretório. Suporta paginação cursor.
opengrok_get_file_contentLê código-fonte. Use start_line / end_line para arquivos grandes.
opengrok_get_file_historyHistórico de commits de um arquivo. Suporta paginação cursor.
opengrok_browse_directoryExibe estrutura de pastas e arquivos contidos. Suporta paginação cursor / limit.
opengrok_list_projectsLista todos os repositórios indexados.
opengrok_get_file_annotateAnotação de blame linha por linha. Suporta revision, intervalo start_line/end_line, includeContent.
opengrok_get_file_symbolsExtrai classes, funções, macros e structs de um arquivo. Suporta paginação cursor.
opengrok_search_suggestConsulta recomendações de autocompletar. Suporta passagem context para ranqueamento.

Ferramentas Compostas

Estas mesclam múltiplas chamadas de API em uma única operação.

FerramentaO que substituiEconomia
opengrok_get_symbol_contextBusca de definição + leitura de código-fonte + busca de headers + obtenção de referências~92% menos tokens
opengrok_search_and_readBusca + leitura do contexto circundante (limite: OPENGROK_SEARCH_AND_READ_CAP)~92% menos tokens
opengrok_batch_search2–5 buscas paralelas, resultados deduplicados~73% menos tokens
opengrok_index_healthLatência, conectividade, pontuação de desatualizaçãoDiagnóstico

Ferramentas de Investigação

FerramentaFinalidade
opengrok_what_changedAlterações recentes de linhas agrupadas por commit — autor, data, SHA, linhas alteradas com contexto
opengrok_dependency_mapTravessia BFS de cadeias #include/import até profundidade 3; grafo direcionado com uses/used_by
opengrok_search_patternBusca de código com regex; retorna correspondências file:line:content
opengrok_blameBlame com intervalo de linhas (line_start / line_end) e diff opcional
opengrok_call_graphRastreamento de cadeia de chamadas via API v2 do OpenGrok (requer OPENGROK_API_VERSION=v2; fallback baseado em refs na v1)
opengrok_get_file_diffDiff unificado entre duas revisões com linhas de contexto
opengrok_get_compile_infoFlags de compilador C/C++ e caminhos de include do compile_commands.json local
opengrok_get_all_matchesTodas as linhas correspondentes em um arquivo quando a busca mostra resultados truncados
opengrok_get_file_history_with_filesHistórico de commits com listas de arquivos alterados em conjunto via feed RSS
opengrok_get_download_urlURL de download direto para um arquivo (sem chamada HTTP)
opengrok_list_groupsGrupos de projetos (vazio quando a autenticação de admin é necessária)
opengrok_get_suggest_popularitySugestões populares para um campo de projeto (vazio quando a autenticação de admin é necessária)
opengrok_get_project_repositoriesRepositórios para um projeto (vazio quando a autenticação de admin é necessária)

(Nota: as ferramentas de busca suportam filtragem por linguagem. Passe file_type usando o nome canônico do analisador — cxx para C++, golang para Go, sh para shell, javascript para JS. Aliases aceitos: cpp/c++→cxx, go→golang, bash/shell→sh, js→javascript, ts→typescript, cs→csharp, py→python, rb→ruby, rs→rust.)

Notas de fallback para defs/refs/symbol — buscas defs, refs e symbol exigem um escopo de projeto (passe projects ou defina OPENGROK_DEFAULT_PROJECT); sem isso, podem retornar muitos resultados entre projetos. Em instâncias onde o endpoint REST retorna erro ou resultados vazios para esses tipos, o cliente automaticamente recorre à análise da interface web para que o LLM ainda receba respostas. opengrok_call_graph precisa da API v2 e degrada para uma visão baseada em refs na v1.

API do Code Mode

Defina OPENGROK_CODE_MODE=true (o padrão). Chame opengrok_api uma vez no início da sessão para receber a especificação completa da API. Todas as operações subsequentes passam por opengrok_execute.

Todas as chamadas de API do sandbox são síncronas — globais planas (search(...)), sem await. A forma de objeto env.opengrok.* (env.opengrok.search(...)) é equivalente.

Busca e Descoberta

MétodoRetorna
env.opengrok.search(query, opts?)Texto completo, defs, refs, symbol, path, hist. Opções: searchType, projects, maxResults (padrão 5), startIndex, cursor, fileType, sort, maxHitsPerFile, dir, pathFilter, file, expandFunction
env.opengrok.batchSearch(queries[], opts?)Um conjunto de resultados por consulta (máx. 10), executado em paralelo no host. O expandFunction: true por consulta inclui contexto da função delimitadora
env.opengrok.findFile(pattern, opts?){ totalCount, results: [{project, path}], cursor? }
env.opengrok.searchSuggest(query, opts?){ query, field, suggestions, time }. Opções: field, project/projects, context (valores de outros campos para ranqueamento)
env.opengrok.getAllMatchesInFile(project, path, query, opts?)Todas as linhas correspondentes em um arquivo quando os resultados da busca mostram ocorrências truncadas. Também usado automaticamente quando search() recebe um filtro file: (sem paginação)

search() usa apenas nomes canônicos de tipos de arquivo (ex.: cxx, golang, sh) — veja a lista de aliases acima. Passe expandFunction: true para expandir resultados correspondentes ao corpo da função delimitadora (adiciona leituras no host, até 3 arquivos por chamada).

Paginação por cursor — Métodos que retornam um campo cursor (search, findFile, browseDir, getFileSymbols, getFileHistory, getFileDiff) suportam paginação. Passe o cursor de volta como opts.cursor na próxima chamada para buscar a próxima página. Se um cursor expirou (sessão reiniciada ou muito tempo decorrido), a resposta contém { _cursorExpired: true } — reinicie a paginação do início.

Leitura e Navegação

MétodoRetorna
env.opengrok.getFileContent(project, path, opts?){ project, path, content, lineCount, sizeBytes, startLine }. Leituras de intervalo expandem para a função delimitadora por padrão; passe {expandFunction: false} para manter o intervalo exato
env.opengrok.browseDir(project, path?, opts?){ project, path, entries, cursor? }
env.opengrok.getFileSymbols(project, path, opts?){ project, path, symbols, cursor? }
env.opengrok.getFileOverview(project, path, opts?){ lang, sizeLines, sizeBytes, imports, topLevelSymbols, recentAuthors, lastRevision }. Passe includeImports:true para incluir imports (omitidos por padrão)

Histórico e Blame

MétodoRetorna
env.opengrok.getFileAnnotate(project, path, opts?){ project, path, lines: [{lineNumber, revision, author, date, content}] }. Opções: revision, startLine/endLine (fora dos limites lança erro), includeContent (padrão true)
env.opengrok.getFileHistory(project, path, opts?){ project, path, entries, cursor? } (maxEntries, cursor)
env.opengrok.getFileHistoryWithFiles(project, path, opts?)Histórico de commits com listas de arquivos alterados em conjunto via feed RSS (maxEntries)
env.opengrok.getFileDiff(project, path, rev1, rev2, opts?){ hunks, unifiedDiff, stats }. includeHunks:true (padrão) mantém hunks; false retorna apenas {unifiedDiff,stats}. Suporta paginação por cursor em nível de hunk
env.opengrok.getGuidanceForPath(project, path, opts?){ guidance: [{path, scope, content, truncated}], missingCount, errorCount, incomplete, capped, searchedUpTo } — descoberta de AGENTS.md/CLAUDE.md

Inteligência de Código

MétodoRetorna
env.opengrok.traceCallChain(symbol, opts?)Rastreamento de cadeia de chamadas. direction: 'callers'|'callees'|'both'. ASSÍNCRONO — pode retornar {status:'computing'} na primeira chamada; repita a mesma chamada para coletar o resultado em cache
env.opengrok.getSymbolContext(symbol, opts?)Definição + referências + cabeçalhos combinados. A definição expande para o corpo completo da função via tree-sitter
env.opengrok.dependencyMap(project, path, opts?)Grafo de dependências: uses (importações) + used_by (referências). ASSÍNCRONO com caminho rápido — pode retornar {status:'computing'}; repita para obter o grafo em cache. direction: 'uses'|'used_by'|'both'
env.opengrok.getCompileInfo(path)Flags do compilador C/C++ e caminhos de inclusão, ou null quando nenhum banco de dados de compilação local está configurado

traceCallChain chamadores vêm da busca de referências; chamados vêm da análise AST do tree-sitter para linguagens suportadas (C/C++, Java, Go, Python, JS/TS, Rust e outras). Ambos os métodos de longa duração se distribuem por um cliente em segundo plano — uma conexão irmã sem limite de taxa com um orçamento curto por operação — para que travessias profundas não consumam a cota de limite de taxa em primeiro plano.

Sistema

MétodoRetorna
env.opengrok.indexHealth(){ connected, latencyMs, baseUrl, serverVersion?, suggestConfig? }
env.opengrok.listProjects(filter?){ projects } — todos os repositórios indexados (equivalente ao modo padrão: opengrok_list_projects)
env.opengrok.readMemory(filename)Ler active-task.md ou investigation-log.md (null quando não inicializado)
env.opengrok.writeMemory(filename, content, mode?)'overwrite' (padrão) ou 'append'; máximo de 5 gravações por execução
env.opengrok.elicit(message, schema)Pedir ao usuário para escolher (requer OPENGROK_ENABLE_ELICITATION=true)
env.opengrok.sample(prompt, opts?)Solicitar texto de IA do LLM do cliente (requer OPENGROK_ENABLE_SAMPLING=true; null quando não suportado — sempre proteja contra nulo)

Exemplo

// Example opengrok_execute code
const refs = env.opengrok.search("handleCrash", { searchType: "refs", maxResults: 5 });
const first = refs.results[0];
const content = env.opengrok.getFileContent(first.project, first.path, {
  startLine: first.matches[0].lineNumber - 5,
  endLine: first.matches[0].lineNumber + 10,
});
return { callerFile: first.path, code: content.content };

Quando search() retorna zero resultados e a amostragem está habilitada, _suggestions: string[] é automaticamente injetado no resultado — verifique-o antes de chamar sample() explicitamente.

Inteligência tree-sitter — leituras de intervalo e expandFunction expandem correspondências para corpos de função envolventes usando análise AST do tree-sitter (gramáticas WASM, sem necessidade de toolchain do host). Orçamentos de linhas por camada se aplicam: minimal 200 linhas, standard 400 linhas, generous 600 linhas. Substitua o diretório de gramáticas com OPENGROK_GRAMMAR_DIR; contribua com novas gramáticas via npm run copy-grammars (veja CONTRIBUTING.md).

Truncamento fitToBuffer — resultados de sandbox que excedem o buffer de ponte de 8 MB são aparados por fitToBuffer(), que mantém elementos de resultado completos em vez de truncar no meio do JSON. Resultados aparados carregam _truncated: true — restrinja a consulta ou pagine com cursor quando você o vir.

Elicitação (OPENGROK_ENABLE_ELICITATION=false para desabilitar, padrão: true)

Quando habilitada, opengrok_api solicita ao usuário que selecione um projeto de trabalho no início da sessão se nenhum OPENGROK_DEFAULT_PROJECT estiver configurado e mais de um projeto existir. O código do sandbox também pode chamar env.opengrok.elicit() para pedir ao usuário que escolha entre várias correspondências durante a execução. Requer um cliente que suporte MCP Elicitation — Claude Code v2.1.76+ suporta isso. Degrada graciosamente para { action: "cancel" } em outros clientes.

Amostragem (OPENGROK_ENABLE_SAMPLING=true, padrão: false)

Delega chamadas de LLM de volta ao cliente via MCP Sampling, usando a assinatura de modelo do cliente sem chaves de API separadas. Dispara automaticamente em três lugares: explicação de erro do sandbox, sumarização de grafos de dependência grandes (>10 nós) e reformulação de consulta com zero resultados (injeção de _suggestions). VS Code Copilot suporta amostragem; outros clientes variam. O servidor degrada graciosamente quando a amostragem não está disponível.

[!WARNING] Os gatilhos de amostragem são automáticos — não sob demanda. Uma única sessão de investigação pode gerar muitas chamadas de amostragem entre erros de sandbox, buscas com zero resultados e grafos de dependência grandes. Alguns clientes consomem solicitações premium por chamada após o primeiro prompt de confirmação. Habilite com isso em mente.

Memory Bank

O Code Mode inclui 2 ferramentas por padrão (api + execute; 5 com OPENGROK_ENABLE_MEMORY_TOOLS=true). Dois arquivos persistem entre turnos e reinicializações de sessão:

FerramentaPropósito
opengrok_memory_statusStatus, tamanho e pré-visualização de 3 linhas de ambos os arquivos de memória
opengrok_read_memoryLer active-task.md ou investigation-log.md
opengrok_update_memoryEscrever ou anexar; carimba automaticamente entradas de investigation-log.md
ArquivoLimite de TamanhoPropósito
active-task.md≤ 4 KBEstado atual da tarefa: task:, last_symbol:, next_step:, open_questions:, status:
investigation-log.md≤ 32 KBLog somente de anexação de descobertas, agrupado por cabeçalhos de ## YYYY-MM-DD HH:MM:

A codificação delta retorna [unchanged] em leituras repetidas de conteúdo não modificado. O corte com pontuação de riqueza mantém as entradas de log de maior valor quando o espaço é limitado.

Configuração

Núcleo

VariávelPadrãoDescrição
OPENGROK_BASE_URL(em branco)URL base do servidor OpenGrok (obrigatório). Fornecido pelo assistente de configuração ou pelas configurações do VS Code.
OPENGROK_USERNAME(em branco)Nome de usuário de autenticação. Deixe não definido para acesso anônimo.
OPENGROK_PASSWORD(em branco)Senha de autenticação. Prefira o chaveiro do SO via opengrok-mcp setup.
OPENGROK_PASSWORD_FILE(em branco)Caminho para um arquivo contendo a senha do OpenGrok (segredo montado em arquivo para CI/containers). Alternativa a OPENGROK_PASSWORD.
OPENGROK_VERIFY_SSLtrueDefina false para desabilitar a verificação TLS para certificados autoassinados.
OPENGROK_TIMEOUT30Tempo limite de solicitação HTTP em segundos.

Code Mode e Desempenho

VariávelPadrãoDescrição
OPENGROK_CODE_MODEtrueCode Mode (2–5 ferramentas: opengrok_api + opengrok_execute + 3 ferramentas de memória quando habilitado). Defina false para as 26 ferramentas padrão legadas.
OPENGROK_CONTEXT_BUDGETstandardCamada de tamanho de resposta: minimal (8 KB, orçamento de 200 linhas do tree-sitter) / standard (16 KB, 400 linhas) / generous (32 KB, 600 linhas).
OPENGROK_MAX_RESPONSE_BYTES—Substituir o limite de bytes por resposta (tem precedência sobre OPENGROK_CONTEXT_BUDGET).
OPENGROK_SEARCH_AND_READ_CAP—Substituir o limite composto de opengrok_search_and_read (padrões: 2 KB / 4 KB / 8 KB por camada).
OPENGROK_RESPONSE_FORMAT_OVERRIDE—Forçar um formato globalmente: markdown / json / tsv / toon / yaml / text.
OPENGROK_DEFAULT_PROJECT—Nome do projeto padrão para escopar todas as buscas.
OPENGROK_DEFAULT_MAX_RESULTS25Limite padrão de resultados de busca.
OPENGROK_LOCAL_COMPILE_DB_PATHS—Caminhos separados por vírgula para compile_commands.json para extração de flags C/C++.
OPENGROK_GRAMMAR_DIRauto-detectadoSubstituir o caminho para arquivos WASM de gramática do tree-sitter. Padrão: subir a partir do diretório do pacote para encontrar grammars/.

Memory Bank

VariávelPadrãoDescrição
OPENGROK_ENABLE_MEMORY_TOOLSfalseRegistrar as 3 ferramentas de memória do Code Mode (status de memória, leitura, atualização). Desligado = apenas api + execute.
OPENGROK_MEMORY_BANK_DIRpadrão do servidorSubstituir diretório para active-task.md + investigation-log.md.
OPENGROK_ENABLE_OBSERVATION_MASKERfalseAntepor resumos compactos de histórico aos resultados de opengrok_execute após a janela de texto completo preencher. Útil apenas para clientes que truncam contexto.
OPENGROK_OBSERVATION_MASKER_TURNS10Número de resultados recentes de opengrok_execute a manter completos antes que os mais antigos sejam compactados.

Limite de Taxa

VariávelPadrãoDescrição
OPENGROK_RATELIMIT_ENABLEDtrueHabilitar limite de taxa com balde de tokens.
OPENGROK_RATELIMIT_RPM60Limite global de solicitações por minuto.
OPENGROK_PER_TOOL_RATELIMIT—Substituições de RPM por ferramenta: opengrok_execute:15,opengrok_batch_search:20. Padrões: opengrok_execute 15 rpm, opengrok_batch_search 5 rpm, opengrok_dependency_map 10 rpm, opengrok_call_graph 5 rpm.

Cache de Resposta

VariávelPadrãoDescrição
OPENGROK_CACHE_ENABLEDtrueHabilitar cache de resposta TTL.
OPENGROK_CACHE_MAX_SIZE500Máximo de entradas de cache.
OPENGROK_CACHE_MAX_BYTES52428800Tamanho máximo total do cache em bytes (50 MB).
OPENGROK_CACHE_SEARCH_TTL300TTL do cache de resultados de busca em segundos.
OPENGROK_CACHE_FILE_TTL600TTL do cache de conteúdo de arquivo em segundos.
OPENGROK_CACHE_HISTORY_TTL1800TTL do cache de histórico de arquivo em segundos.
OPENGROK_CACHE_PROJECTS_TTL3600TTL do cache de lista de projetos em segundos.

Protocolo MCP

VariávelPadrãoDescrição
OPENGROK_ENABLE_ELICITATIONtrueSeletor de projeto na inicialização de opengrok_api e env.opengrok.elicit() no sandbox.
OPENGROK_ENABLE_SAMPLINGfalseMCP Sampling para explicação de erros, sumarização de grafos e recuperação de zero resultados.
OPENGROK_ENABLE_FILES_APIfalseFileReferenceCache para investigation-log.md (endereçado por conteúdo SHA-256).
OPENGROK_SAMPLING_MODEL—Preferência de modelo para chamadas de amostragem.
OPENGROK_SAMPLING_MAX_TOKENS256Orçamento de tokens para respostas de amostragem (máximo: 4096).

API OpenGrok

VariávelPadrãoDescrição
OPENGROK_API_VERSIONv1Versão da API REST. Use v2 para opengrok_call_graph.

Segurança e Auditoria

VariávelPadrãoDescrição
OPENGROK_AUDIT_LOG_FILE—Caminho de arquivo para log de auditoria estruturado (CSV ou JSON).
OPENGROK_STRICT_SSRFfalseRejeitar URLs base e redirecionamentos que resolvem para faixas de IP privadas/loopback (padrão: apenas aviso).

Registro

VariávelPadrãoDescrição
OPENGROK_LOG_LEVELinfoDefina debug para registro estruturado detalhado em stderr.

Proxy

VariávelPadrãoDescrição
HTTP_PROXY—Proxy HTTP para solicitações de saída.
HTTPS_PROXY—Proxy HTTPS para solicitações de saída.

Usuários do VS Code podem definir opengrok-mcp.baseUrl, opengrok-mcp.codeMode, opengrok-mcp.contextBudget, opengrok-mcp.memoryBankDir, opengrok-mcp.defaultProject, opengrok-mcp.responseFormatOverride, opengrok-mcp.compileDbPaths, opengrok-mcp.enableObservationMasker e opengrok-mcp.observationMaskerTurns nas configurações do VS Code em vez disso. Valores secretos, como a senha, nunca são gravados nas configurações do VS Code.

Nota do SDK MCP: Esta versão usa @modelcontextprotocol/sdk v1.30.0 (linha v1).

Transporte HTTP e Autenticação

Por padrão, o servidor se comunica via stdio. Para implantações compartilhadas em equipe, a camada de transporte HTTP está disponível como uma API de biblioteca (startHttpTransport() em src/server/transport/http-transport.ts), mas ainda não está conectada ao ponto de entrada da CLI — OPENGROK_HTTP_PORT está documentado abaixo, mas main.ts ainda não o lê para iniciar o servidor HTTP automaticamente. Use startHttpTransport() diretamente em implantações personalizadas.

Gerenciamento de Sessão

  • Cada cliente HTTP recebe uma instância isolada de McpServer (padrão de fábrica por sessão)
  • Sessões expiram após 30 minutos de inatividade; OPENGROK_HTTP_MAX_SESSIONS limita sessões concorrentes (padrão: 100)
  • GET /mcp/sessions retorna JSON com contagem de sessões ativas e idade da sessão mais antiga

Autenticação

MétodoConfiguração
Token Bearer estáticoOPENGROK_HTTP_AUTH_TOKEN=mysecret
Servidor de recursos OAuth 2.1OPENGROK_JWKS_URI=https://idp.example.com/.well-known/jwks.json + OPENGROK_RESOURCE_URI=https://opengrok-mcp.example.com
RBAC com funções nomeadasOPENGROK_RBAC_TOKENS='alice-token:admin,bot-token:readonly'

No modo de servidor de recursos, este servidor valida JWTs emitidos pelo seu próprio IdP — não há endpoint embutido de /token. Quando OPENGROK_JWT_ISSUER está definido, tokens de outros emissores são rejeitados. Metadados de recurso protegido RFC 9728 são servidos em /.well-known/oauth-protected-resource.

Funções RBAC

PapelPermissões
adminAcesso total a todas as ferramentas e configuração
developerTodas as ferramentas de busca, leitura, memória e código
readonlyApenas ferramentas de busca e leitura — sem gravações de memória, sem execução de código

Tokens desconhecidos ou ausentes são rejeitados com 403 Forbidden. Quando nenhuma autenticação está configurada, solicitações não autenticadas recebem admin (modo de desenvolvimento local).

CORS

Clientes baseados em navegador são controlados por uma lista de permissões de origem (OPENGROK_ALLOWED_ORIGINS, separada por vírgulas). Sem autenticação configurada, origens de loopback (localhost, 127.0.0.1, [::1]) são permitidas para desenvolvimento local; uma vez que a autenticação esteja configurada (OPENGROK_HTTP_AUTH_TOKEN ou tokens RBAC), o loopback não é mais implícito — liste cada origem permitida explicitamente, incluindo as locais.

Segurança
ÁreaProteção
SSRFDetecção de rebinding de DNS + bloqueio de endereços mapeados por IPv6 em buildSafeUrl; modo estrito via OPENGROK_STRICT_SSRF
Path traversalNormalização NFC + bloqueio de caracteres Unicode bidirecionais em assertSafePath
Injeção de HTMLDecodificação de entidades em todos os nós de texto do parser antes da exibição
Injeção de promptEscape de campos Markdown em todos os formatadores
Comparação de tokenscrypto.timingSafeEqual para todas as comparações de tokens Bearer
CORSLista de permissões via OPENGROK_ALLOWED_ORIGINS — sem curinga em produção
Cabeçalhos de segurançaX-Content-Type-Options, X-Frame-Options, CSP em respostas HTTP
Criptografia de credenciaisAES-256-GCM com atualização automática de arquivos criptografados antigos
Limitação de taxaToken bucket baseado em inteiros (elimina drift de ponto flutuante); padrões por ferramenta (opengrok_execute: 15 rpm)
Isolamento de sandboxVM QuickJS WASM — sem sistema de arquivos, sem rede, apenas lista de permissões de métodos; timeout de 62 s, buffer de 8 MB
Logs de auditoriaEntradas de auditoria estruturadas com escape de injeção

Para a arquitetura de segurança completa (modelo de ameaças, camadas de defesa, guia de endurecimento), consulte SECURITY.md.

Recomendação de confiança no sandbox: Ao configurar o OpenGrok MCP nas configurações de MCP do VS Code, você pode definir sandboxEnabled: true, que aprova automaticamente chamadas de ferramentas sem prompts de confirmação. Isso é seguro porque toda a execução de ferramentas ocorre dentro do sandbox QuickJS WASM sem acesso ao host — o LLM não pode executar comandos arbitrários do sistema através deste servidor.


Integração com VS Code

ComandoAção
OpenGrok: Open ConfigurationGUI interativa de configurações
OpenGrok: Test ConnectionValidar acesso à API e validade do token
OpenGrok: Show Server LogsExpor stdout/stderr do processo em segundo plano
OpenGrok: Status MenuMenu de status de acesso rápido na barra de status
OpenGrok: Check for UpdatesAcionar manualmente uma verificação de atualização

[!NOTE] O VS Code gerencia autorizações de ferramentas por workspace. Se você abrir um repositório diferente, marque novamente a caixa OpenGrok no painel de ferramentas do Copilot.

O painel de configuração e a interface de Configurações do VS Code cobrem as mesmas configurações: use o painel para configuração guiada, segredos, testes e prompts de recarga. Use as configurações opengrok-mcp.* em settings.json para substituições de workspace, Sincronização de Configurações e padrões via script. O Code Mode é recomendado; desativá-lo usa ferramentas padrão legadas e exclui capacidades exclusivas do Code Mode.


Solução de Problemas

[!TIP] Execute opengrok-mcp status para verificar a conectividade e confirmar quais clientes MCP estão configurados.

[!WARNING] Após recarregar o VS Code ou atualizar a extensão, as ferramentas podem desaparecer temporariamente da lista de ferramentas do Copilot. Clique no ícone de ferramentas, selecione "Update Tools" e execute Developer: Reload Window para restaurá-las.

Falha de conexão — Verifique OPENGROK_BASE_URL. Confirme se sua VPN ou proxy não está bloqueando o endpoint.

401 Não autorizado — Execute OpenGrok: Open Configuration para reinserir as credenciais.

Erros de certificado SSL autoassinado — Defina opengrok-mcp.verifySsl para false nas configurações do VS Code, ou OPENGROK_VERIFY_SSL=false na configuração do seu cliente MCP.

Consultas lentas ou timeouts — Reduza o escopo com filtragem file_type ou direcione para um projeto específico. Verifique o status de indexação com opengrok_index_health.

Logging detalhado — Defina OPENGROK_LOG_LEVEL=debug.

Compatibilidade com OpenGrok

Versão do mecanismoStatusNotas
v1.13.x e superioresSuportadoAPI REST completa
v1.7.0 — v1.12.xModo legadoRaspagem de HTML para símbolos e blame
Abaixo de v1.7.0Não suportadoComportamento imprevisível

Indo Além

Configuração do Cliente · Arquitetura · Segurança · Contribuindo · Changelog


Informações de Licença

Este sistema é distribuído sob a Licença Não Comercial PolyForm 1.0.0.

  • ✅ Permitido: Uso pessoal, projetos de hobby, pesquisa acadêmica, educação
  • ❌ Proibido: Qualquer utilização comercial, empresarial, corporativa ou paga

Licenciamento Comercial: Para usar esta extensão em um contexto empresarial (ferramentas internas, pipelines de CI, infraestrutura de negócios), uma licença comercial é estritamente necessária. Entre em contato com rudroy09@gmail.com para preços de nível empresarial.

Leia LICENSE-COMMERCIAL.md para os termos completos.