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
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.
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
| Ferramenta | Finalidade |
|---|---|
opengrok_search_code | Busca de texto completo, definição, referência, caminho e histórico. Suporta filtragem file_type e paginação cursor. |
opengrok_find_file | Localiza arquivos por nome ou padrão de diretório. Suporta paginação cursor. |
opengrok_get_file_content | Lê código-fonte. Use start_line / end_line para arquivos grandes. |
opengrok_get_file_history | Histórico de commits de um arquivo. Suporta paginação cursor. |
opengrok_browse_directory | Exibe estrutura de pastas e arquivos contidos. Suporta paginação cursor / limit. |
opengrok_list_projects | Lista todos os repositórios indexados. |
opengrok_get_file_annotate | Anotação de blame linha por linha. Suporta revision, intervalo start_line/end_line, includeContent. |
opengrok_get_file_symbols | Extrai classes, funções, macros e structs de um arquivo. Suporta paginação cursor. |
opengrok_search_suggest | Consulta recomendações de autocompletar. Suporta passagem context para ranqueamento. |
Ferramentas Compostas
Estas mesclam múltiplas chamadas de API em uma única operação.
| Ferramenta | O que substitui | Economia |
|---|---|---|
opengrok_get_symbol_context | Busca de definição + leitura de código-fonte + busca de headers + obtenção de referências | ~92% menos tokens |
opengrok_search_and_read | Busca + leitura do contexto circundante (limite: OPENGROK_SEARCH_AND_READ_CAP) | ~92% menos tokens |
opengrok_batch_search | 2–5 buscas paralelas, resultados deduplicados | ~73% menos tokens |
opengrok_index_health | Latência, conectividade, pontuação de desatualização | Diagnóstico |
Ferramentas de Investigação
| Ferramenta | Finalidade |
|---|---|
opengrok_what_changed | Alterações recentes de linhas agrupadas por commit — autor, data, SHA, linhas alteradas com contexto |
opengrok_dependency_map | Travessia BFS de cadeias #include/import até profundidade 3; grafo direcionado com uses/used_by |
opengrok_search_pattern | Busca de código com regex; retorna correspondências file:line:content |
opengrok_blame | Blame com intervalo de linhas (line_start / line_end) e diff opcional |
opengrok_call_graph | Rastreamento de cadeia de chamadas via API v2 do OpenGrok (requer OPENGROK_API_VERSION=v2; fallback baseado em refs na v1) |
opengrok_get_file_diff | Diff unificado entre duas revisões com linhas de contexto |
opengrok_get_compile_info | Flags de compilador C/C++ e caminhos de include do compile_commands.json local |
opengrok_get_all_matches | Todas as linhas correspondentes em um arquivo quando a busca mostra resultados truncados |
opengrok_get_file_history_with_files | Histórico de commits com listas de arquivos alterados em conjunto via feed RSS |
opengrok_get_download_url | URL de download direto para um arquivo (sem chamada HTTP) |
opengrok_list_groups | Grupos de projetos (vazio quando a autenticação de admin é necessária) |
opengrok_get_suggest_popularity | Sugestões populares para um campo de projeto (vazio quando a autenticação de admin é necessária) |
opengrok_get_project_repositories | Repositó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étodo | Retorna |
|---|---|
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étodo | Retorna |
|---|---|
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étodo | Retorna |
|---|---|
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étodo | Retorna |
|---|---|
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étodo | Retorna |
|---|---|
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:
| Ferramenta | Propósito |
|---|---|
opengrok_memory_status | Status, tamanho e pré-visualização de 3 linhas de ambos os arquivos de memória |
opengrok_read_memory | Ler active-task.md ou investigation-log.md |
opengrok_update_memory | Escrever ou anexar; carimba automaticamente entradas de investigation-log.md |
| Arquivo | Limite de Tamanho | Propósito |
|---|---|---|
active-task.md | ≤ 4 KB | Estado atual da tarefa: task:, last_symbol:, next_step:, open_questions:, status: |
investigation-log.md | ≤ 32 KB | Log 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ável | Padrão | Descriçã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_SSL | true | Defina false para desabilitar a verificação TLS para certificados autoassinados. |
OPENGROK_TIMEOUT | 30 | Tempo limite de solicitação HTTP em segundos. |
Code Mode e Desempenho
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_CODE_MODE | true | Code 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_BUDGET | standard | Camada 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_RESULTS | 25 | Limite 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_DIR | auto-detectado | Substituir 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ável | Padrão | Descrição |
|---|---|---|
OPENGROK_ENABLE_MEMORY_TOOLS | false | Registrar as 3 ferramentas de memória do Code Mode (status de memória, leitura, atualização). Desligado = apenas api + execute. |
OPENGROK_MEMORY_BANK_DIR | padrão do servidor | Substituir diretório para active-task.md + investigation-log.md. |
OPENGROK_ENABLE_OBSERVATION_MASKER | false | Antepor 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_TURNS | 10 | Número de resultados recentes de opengrok_execute a manter completos antes que os mais antigos sejam compactados. |
Limite de Taxa
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_RATELIMIT_ENABLED | true | Habilitar limite de taxa com balde de tokens. |
OPENGROK_RATELIMIT_RPM | 60 | Limite 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ável | Padrão | Descrição |
|---|---|---|
OPENGROK_CACHE_ENABLED | true | Habilitar cache de resposta TTL. |
OPENGROK_CACHE_MAX_SIZE | 500 | Máximo de entradas de cache. |
OPENGROK_CACHE_MAX_BYTES | 52428800 | Tamanho máximo total do cache em bytes (50 MB). |
OPENGROK_CACHE_SEARCH_TTL | 300 | TTL do cache de resultados de busca em segundos. |
OPENGROK_CACHE_FILE_TTL | 600 | TTL do cache de conteúdo de arquivo em segundos. |
OPENGROK_CACHE_HISTORY_TTL | 1800 | TTL do cache de histórico de arquivo em segundos. |
OPENGROK_CACHE_PROJECTS_TTL | 3600 | TTL do cache de lista de projetos em segundos. |
Protocolo MCP
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_ENABLE_ELICITATION | true | Seletor de projeto na inicialização de opengrok_api e env.opengrok.elicit() no sandbox. |
OPENGROK_ENABLE_SAMPLING | false | MCP Sampling para explicação de erros, sumarização de grafos e recuperação de zero resultados. |
OPENGROK_ENABLE_FILES_API | false | FileReferenceCache 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_TOKENS | 256 | Orçamento de tokens para respostas de amostragem (máximo: 4096). |
API OpenGrok
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_API_VERSION | v1 | Versão da API REST. Use v2 para opengrok_call_graph. |
Segurança e Auditoria
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_AUDIT_LOG_FILE | — | Caminho de arquivo para log de auditoria estruturado (CSV ou JSON). |
OPENGROK_STRICT_SSRF | false | Rejeitar URLs base e redirecionamentos que resolvem para faixas de IP privadas/loopback (padrão: apenas aviso). |
Registro
| Variável | Padrão | Descrição |
|---|---|---|
OPENGROK_LOG_LEVEL | info | Defina debug para registro estruturado detalhado em stderr. |
Proxy
| Variável | Padrão | Descriçã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/sdkv1.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_SESSIONSlimita sessões concorrentes (padrão: 100) GET /mcp/sessionsretorna JSON com contagem de sessões ativas e idade da sessão mais antiga
Autenticação
| Método | Configuração |
|---|---|
| Token Bearer estático | OPENGROK_HTTP_AUTH_TOKEN=mysecret |
| Servidor de recursos OAuth 2.1 | OPENGROK_JWKS_URI=https://idp.example.com/.well-known/jwks.json + OPENGROK_RESOURCE_URI=https://opengrok-mcp.example.com |
| RBAC com funções nomeadas | OPENGROK_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
| Papel | Permissões |
|---|---|
admin | Acesso total a todas as ferramentas e configuração |
developer | Todas as ferramentas de busca, leitura, memória e código |
readonly | Apenas 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
| Área | Proteção |
|---|---|
| SSRF | Detecção de rebinding de DNS + bloqueio de endereços mapeados por IPv6 em buildSafeUrl; modo estrito via OPENGROK_STRICT_SSRF |
| Path traversal | Normalização NFC + bloqueio de caracteres Unicode bidirecionais em assertSafePath |
| Injeção de HTML | Decodificação de entidades em todos os nós de texto do parser antes da exibição |
| Injeção de prompt | Escape de campos Markdown em todos os formatadores |
| Comparação de tokens | crypto.timingSafeEqual para todas as comparações de tokens Bearer |
| CORS | Lista de permissões via OPENGROK_ALLOWED_ORIGINS — sem curinga em produção |
| Cabeçalhos de segurança | X-Content-Type-Options, X-Frame-Options, CSP em respostas HTTP |
| Criptografia de credenciais | AES-256-GCM com atualização automática de arquivos criptografados antigos |
| Limitação de taxa | Token bucket baseado em inteiros (elimina drift de ponto flutuante); padrões por ferramenta (opengrok_execute: 15 rpm) |
| Isolamento de sandbox | VM 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 auditoria | Entradas 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
| Comando | Ação |
|---|---|
OpenGrok: Open Configuration | GUI interativa de configurações |
OpenGrok: Test Connection | Validar acesso à API e validade do token |
OpenGrok: Show Server Logs | Expor stdout/stderr do processo em segundo plano |
OpenGrok: Status Menu | Menu de status de acesso rápido na barra de status |
OpenGrok: Check for Updates | Acionar 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 statuspara 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 Windowpara 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 mecanismo | Status | Notas |
|---|---|---|
| v1.13.x e superiores | Suportado | API REST completa |
| v1.7.0 — v1.12.x | Modo legado | Raspagem de HTML para símbolos e blame |
| Abaixo de v1.7.0 | Não suportado | Comportamento 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.