OpenGrok

El servidor MCP de OpenGrok es una extensión nativa del Protocolo de Contexto de Modelo (MCP) para VS Code que conecta sin problemas los índices de OpenGrok de tu organización con GitHub Copilot Chat. Proporciona a tu asistente de IA el contexto profundo e instantáneo del repositorio necesario para navegar, comprender y buscar bases de código masivas usando solo lenguaje natural.

Documentación

OpenGrok MCP Server logo

Servidor MCP de OpenGrok

Inteligencia de código para cualquier base de código indexada por OpenGrok: búsqueda, lectura, blame, navegación de símbolos, diffs, historial de commits, grafos de llamadas, mapas de dependencias e investigación guiada. Optimizado para eficiencia de tokens mediante Code Mode y lecturas de código conscientes de AST.

npm MCP Registry CI GitHub Release


Inicio Rápido

Opción 1 — Extensión de VS Code

Instala OpenGrok MCP desde el Marketplace de VS Code, o busca "OpenGrok" en el panel de Extensiones. El panel de configuración se abre en el primer lanzamiento: introduce tu endpoint de OpenGrok, nombre de usuario y contraseña, luego haz clic en Guardar Configuración y recarga cuando se te indique.

La extensión proporciona una interfaz de configuración visual y gestiona el proceso del servidor MCP automáticamente. No se requiere Python, instalación externa de Node.js ni configuración manual del entorno.

Opción 2 — CLI de npm / npx

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

O ejecuta sin instalar:

npx opengrok-mcp-server setup

Otros 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 con cualquier cliente compatible con MCP (CLI o IDE). Consulta MCP_CLIENTS.md para el formato de configuración y solución de problemas.

Las credenciales se almacenan en el llavero del sistema operativo (Keychain de macOS, Administrador de Credenciales de Windows, libsecret de Linux) con un respaldo de archivo cifrado AES-256-GCM para entornos sin interfaz gráfica.


[!TIP] Actualizaciones Automáticas — La extensión verifica GitHub en busca de nuevas versiones una vez cada 24 horas y te notifica cuando hay una disponible. Usa OpenGrok: Buscar Actualizaciones para verificar bajo demanda.


El Problema

Los ingenieros que trabajan en bases de código grandes enfrentan una brecha específica al usar asistentes de codificación con IA. La ventana de contexto del modelo contiene el archivo actualmente abierto, la conversación y lo que se haya compartido manualmente, pero una base de código de producción tiene estructura, historial y relaciones entre módulos que existen completamente fuera de esa ventana.

Un símbolo definido en un módulo y llamado desde otros setenta. Una función cuyo comportamiento solo se aclara con los tres commits que la moldearon. Una cadena de includes que se extiende a través de una docena de directorios. Un grafo de llamadas que muestra qué componentes dependen de un servicio antes de que sea refactorizado.

Sin acceso al índice de código, el modelo llena estos vacíos adivinando: inventa rutas de archivos, crea firmas de funciones, atribuye incorrectamente cambios a autores. El modelo no se equivoca porque no sea inteligente, se equivoca porque está aislado.

OpenGrok ya resuelve esto para ingenieros humanos. Indexa código fuente en docenas de lenguajes de programación, mantiene un índice de texto completo a través del historial de commits y expone búsquedas de definiciones, grafos de referencias, blame, recorrido de directorios e historial de archivos a través de una API REST. El problema era que las herramientas de IA no tenían forma de acceder a ella.


Cómo 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       │
└──────────────────────────────────────────────────────┘

El servidor expone dos herramientas principales. opengrok_api entrega la especificación completa de la API al inicio de la sesión. Cada operación posterior pasa por opengrok_execute: la IA escribe un programa en JavaScript usando el objeto env.opengrok.* — search, getFileContent, getFileAnnotate, getFileHistory, browseDir, getFileSymbols — y lo envía como una única ejecución.

Los resultados intermedios permanecen dentro del sandbox; solo el valor final de return cruza de vuelta a la ventana de contexto. Una investigación completa — encontrar el símbolo, leer la definición, verificar quién lo cambió, rastrear los llamadores — es un solo script, no una secuencia de idas y vueltas con resultados fluyendo a través del contexto entre cada uno. El ahorro de tokens del 80–95% es típico para investigaciones complejas.

Todas las llamadas a env.opengrok.* aparecen síncronas dentro del código del sandbox — la VM WASM de QuickJS puentea llamadas HTTP asíncronas de forma transparente a través de un canal SharedArrayBuffer + Atomics (región de datos de 8 MB, tiempo de espera de 62 s por llamada, límite de ejecución estricto de 62 s), mientras mantiene libre el bucle de eventos de Node.js.

Banco de memoria — dos archivos persisten entre turnos y reinicios de sesión: active-task.md (4 KB) para el estado actual de la investigación y investigation-log.md (32 KB) para hallazgos de solo añadido. Dentro del sandbox: env.opengrok.readMemory() / env.opengrok.writeMemory(). Consulta la referencia del Banco de Memoria a continuación.


Referencia

Referencia de Herramientas

31 herramientas en total: 2–5 en Code Mode (opengrok_api + opengrok_execute, más 3 herramientas de memoria cuando OPENGROK_ENABLE_MEMORY_TOOLS=true) y 26 en modo estándar (OPENGROK_CODE_MODE=false).

Herramientas Principales

HerramientaPropósito
opengrok_search_codeBúsqueda de texto completo, definiciones, referencias, rutas e historial. Soporta filtrado por file_type y paginación por cursor.
opengrok_find_fileLocaliza archivos por nombre o patrón de directorio. Soporta paginación por cursor.
opengrok_get_file_contentLee código fuente. Usa start_line / end_line para archivos grandes.
opengrok_get_file_historyHistorial de commits para un archivo. Soporta paginación por cursor.
opengrok_browse_directoryMuestra la estructura de carpetas y los archivos contenidos. Soporta paginación por cursor / limit.
opengrok_list_projectsLista todos los repositorios indexados.
opengrok_get_file_annotateAnotación de blame línea por línea. Soporta revision, rango start_line/end_line, includeContent.
opengrok_get_file_symbolsExtrae clases, funciones, macros y estructuras de un archivo. Soporta paginación por cursor.
opengrok_search_suggestConsulta recomendaciones de autocompletado. Soporta paso directo de context para clasificación.

Herramientas Compuestas

Estas fusionan múltiples llamadas a la API en una sola operación.

HerramientaQué reemplazaAhorro
opengrok_get_symbol_contextBúsqueda de definición + lectura de fuente + obtención de headers + referencias~92% menos tokens
opengrok_search_and_readBúsqueda + lectura de contexto circundante (límite: OPENGROK_SEARCH_AND_READ_CAP)~92% menos tokens
opengrok_batch_search2–5 búsquedas en paralelo, resultados deduplicados~73% menos tokens
opengrok_index_healthLatencia, conectividad, puntuación de desactualizaciónDiagnóstico

Herramientas de Investigación

HerramientaPropósito
opengrok_what_changedCambios recientes de líneas agrupados por commit — autor, fecha, SHA, líneas cambiadas con contexto
opengrok_dependency_mapRecorrido BFS de cadenas #include/import hasta profundidad 3; grafo dirigido con uses/used_by
opengrok_search_patternBúsqueda de código con expresiones regulares; devuelve file:line:content coincidencias
opengrok_blameBlame con rango de líneas (line_start / line_end) y diff opcional
opengrok_call_graphTrazado de cadenas de llamadas mediante la API v2 de OpenGrok (requiere OPENGROK_API_VERSION=v2; respaldo basado en referencias en v1)
opengrok_get_file_diffDiff unificado entre dos revisiones con líneas de contexto
opengrok_get_compile_infoBanderas de compilador C/C++ y rutas de include desde compile_commands.json local
opengrok_get_all_matchesTodas las líneas coincidentes en un archivo cuando la búsqueda muestra resultados truncados
opengrok_get_file_history_with_filesHistorial de commits con listas de archivos modificados conjuntamente mediante feed RSS
opengrok_get_download_urlURL de descarga directa para un archivo (sin llamada HTTP)
opengrok_list_groupsGrupos de proyectos (vacío cuando se requiere autenticación de administrador)
opengrok_get_suggest_popularitySugerencias populares para un campo de proyecto (vacío cuando se requiere autenticación de administrador)
opengrok_get_project_repositoriesRepositorios para un proyecto (vacío cuando se requiere autenticación de administrador)

(Nota: las herramientas de búsqueda soportan filtrado por idioma. Pasa file_type usando el nombre de analizador canónico — cxx para C++, golang para Go, sh para shell, javascript para JS. Se aceptan alias: cpp/c++→cxx, go→golang, bash/shell→sh, js→javascript, ts→typescript, cs→csharp, py→python, rb→ruby, rs→rust.)

Notas de respaldo para defs/refs/symbol — las búsquedas de defs, refs y symbol requieren un ámbito de proyecto (pasa projects o establece OPENGROK_DEFAULT_PROJECT); sin uno pueden devolver demasiados resultados entre proyectos. En instancias donde el endpoint REST devuelve un error o resultados vacíos para estos tipos, el cliente automáticamente recurre al análisis de la interfaz web para que el LLM aún obtenga respuestas. opengrok_call_graph necesita la API v2 y se degrada a una vista basada en referencias en v1.

API de Code Mode

Establece OPENGROK_CODE_MODE=true (el valor predeterminado). Llama a opengrok_api una vez al inicio de la sesión para recibir la especificación completa de la API. Todas las operaciones posteriores pasan por opengrok_execute.

Todas las llamadas a la API del sandbox son síncronas — globales planos (search(...)), sin await. La forma de objeto env.opengrok.* (env.opengrok.search(...)) es equivalente.

Búsqueda y Descubrimiento

MétodoDevuelve
env.opengrok.search(query, opts?)Texto completo, defs, refs, symbol, path, hist. Opciones: searchType, projects, maxResults (predeterminado 5), startIndex, cursor, fileType, sort, maxHitsPerFile, dir, pathFilter, file, expandFunction
env.opengrok.batchSearch(queries[], opts?)Un conjunto de resultados por consulta (máximo 10), ejecutado en paralelo en el host. El expandFunction: true por consulta incluye contexto de la función envolvente
env.opengrok.findFile(pattern, opts?){ totalCount, results: [{project, path}], cursor? }
env.opengrok.searchSuggest(query, opts?){ query, field, suggestions, time }. Opciones: field, project/projects, context (valores de otros campos para clasificación)
env.opengrok.getAllMatchesInFile(project, path, query, opts?)Todas las líneas coincidentes en un archivo cuando los resultados de búsqueda muestran coincidencias truncadas. También se usa automáticamente cuando a search() se le da un filtro de file: (sin paginación)

search() usa solo nombres de tipo de archivo canónicos (por ejemplo, cxx, golang, sh) — consulta la lista de alias anterior. Pasa expandFunction: true para expandir los resultados coincidentes a su cuerpo de función envolvente (añade lecturas en el host, hasta 3 archivos por llamada).

Paginación por cursor — Los métodos que devuelven un campo cursor (search, findFile, browseDir, getFileSymbols, getFileHistory, getFileDiff) soportan paginación. Pasa el cursor de vuelta como opts.cursor en la siguiente llamada para obtener la siguiente página. Si un cursor ha expirado (sesión reiniciada o demasiado tiempo transcurrido), la respuesta contiene { _cursorExpired: true } — reinicia la paginación desde el principio.

Lectura y Navegación

MétodoDevuelve
env.opengrok.getFileContent(project, path, opts?){ project, path, content, lineCount, sizeBytes, startLine }. Las lecturas por rango se expanden a la función envolvente por defecto; pasa {expandFunction: false} para mantener el rango exacto
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 }. Pasa includeImports:true para incluir imports (omitidos por defecto)

Historial y Blame

MétodoDevuelve
env.opengrok.getFileAnnotate(project, path, opts?){ project, path, lines: [{lineNumber, revision, author, date, content}] }. Opciones: revision, startLine/endLine (fuera de límites lanza error), includeContent (predeterminado true)
env.opengrok.getFileHistory(project, path, opts?){ project, path, entries, cursor? } (maxEntries, cursor)
env.opengrok.getFileHistoryWithFiles(project, path, opts?)Historial de commits con listas de archivos modificados conjuntamente mediante feed RSS (maxEntries)
env.opengrok.getFileDiff(project, path, rev1, rev2, opts?){ hunks, unifiedDiff, stats }. includeHunks:true (predeterminado) conserva los hunks; false devuelve solo {unifiedDiff,stats}. Soporta paginación por cursor a nivel de hunk
env.opengrok.getGuidanceForPath(project, path, opts?){ guidance: [{path, scope, content, truncated}], missingCount, errorCount, incomplete, capped, searchedUpTo } — descubrimiento de AGENTS.md/CLAUDE.md

Inteligencia de Código

MétodoDevuelve
env.opengrok.traceCallChain(symbol, opts?)Trazado de cadena de llamadas. direction: 'callers'|'callees'|'both'. ASYNC — puede devolver {status:'computing'} en la primera llamada; reintenta la misma llamada para recopilar el resultado en caché
env.opengrok.getSymbolContext(symbol, opts?)Definición + referencias + encabezados combinados. La definición se expande al cuerpo completo de la función mediante tree-sitter
env.opengrok.dependencyMap(project, path, opts?)Grafo de dependencias: uses (importaciones) + used_by (referencias). ASYNC con ruta rápida — puede devolver {status:'computing'}; reintenta para obtener el grafo en caché. direction: 'uses'|'used_by'|'both'
env.opengrok.getCompileInfo(path)Banderas del compilador C/C++ y rutas de inclusión, o null cuando no hay una base de datos de compilación local configurada

Los llamadores de traceCallChain provienen de la búsqueda de referencias; los llamados provienen del análisis AST de tree-sitter para lenguajes compatibles (C/C++, Java, Go, Python, JS/TS, Rust y más). Ambos métodos de larga duración se distribuyen a través de un cliente en segundo plano — una conexión hermana sin límite de velocidad con un presupuesto corto por operación — para que los recorridos profundos no consuman la cuota de límite de velocidad en primer plano.

Sistema

MétodoDevuelve
env.opengrok.indexHealth(){ connected, latencyMs, baseUrl, serverVersion?, suggestConfig? }
env.opengrok.listProjects(filter?){ projects } — todos los repositorios indexados (equivalente en modo estándar: opengrok_list_projects)
env.opengrok.readMemory(filename)Lee active-task.md o investigation-log.md (null cuando no está inicializado)
env.opengrok.writeMemory(filename, content, mode?)'overwrite' (predeterminado) o 'append'; máximo 5 escrituras por ejecución
env.opengrok.elicit(message, schema)Pide al usuario que elija (requiere OPENGROK_ENABLE_ELICITATION=true)
env.opengrok.sample(prompt, opts?)Solicita texto de IA al LLM del cliente (requiere OPENGROK_ENABLE_SAMPLING=true; null cuando no es compatible — siempre protege contra nulos)

Ejemplo

// 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 };

Cuando search() devuelve cero resultados y el muestreo está habilitado, _suggestions: string[] se inyecta automáticamente en el resultado — verifícalo antes de llamar a sample() explícitamente.

Inteligencia de tree-sitter — las lecturas de rango y expandFunction expanden las coincidencias a los cuerpos de función envolventes mediante el análisis AST de tree-sitter (gramáticas WASM, sin necesidad de cadena de herramientas del host). Se aplican presupuestos de líneas por nivel: minimal 200 líneas, standard 400 líneas, generous 600 líneas. Anula el directorio de gramáticas con OPENGROK_GRAMMAR_DIR; contribuye nuevas gramáticas a través de npm run copy-grammars (consulta CONTRIBUTING.md).

Truncamiento fitToBuffer — los resultados del sandbox que superan el búfer de puente de 8 MB se recortan mediante fitToBuffer(), que conserva elementos de resultado completos en lugar de truncar a mitad de JSON. Los resultados recortados llevan _truncated: true — reduce la consulta o pagina con cursor cuando lo veas.

Elicitación (OPENGROK_ENABLE_ELICITATION=false para deshabilitar, predeterminado: true)

Cuando está habilitada, opengrok_api solicita al usuario que seleccione un proyecto de trabajo al inicio de la sesión si no hay OPENGROK_DEFAULT_PROJECT configurado y existe más de un proyecto. El código del sandbox también puede llamar a env.opengrok.elicit() para pedir al usuario que elija entre múltiples coincidencias durante la ejecución. Requiere un cliente que admita MCP Elicitation — Claude Code v2.1.76+ lo admite. Degrada correctamente a { action: "cancel" } en otros clientes.

Muestreo (OPENGROK_ENABLE_SAMPLING=true, predeterminado: false)

Delega las llamadas de LLM de vuelta al cliente mediante MCP Sampling, usando la suscripción de modelo del cliente sin claves API separadas. Se activa automáticamente en tres lugares: explicación de errores del sandbox, resumen de grafos de dependencias grandes (>10 nodos) y reformulación de consultas con cero resultados (inyección de _suggestions). VS Code Copilot admite el muestreo; otros clientes varían. El servidor degrada correctamente cuando el muestreo no está disponible.

[!ADVERTENCIA] Los disparadores de muestreo son automáticos — no bajo demanda. Una sola sesión de investigación puede generar muchas llamadas de muestreo entre errores del sandbox, búsquedas con cero resultados y grafos de dependencias grandes. Algunos clientes consumen solicitudes premium por llamada después del primer mensaje de confirmación. Habilítalo teniendo esto en cuenta.

Memory Bank

Code Mode incluye 2 herramientas por defecto (api + execute; 5 con OPENGROK_ENABLE_MEMORY_TOOLS=true). Dos archivos persisten entre turnos y reinicios de sesión:

HerramientaPropósito
opengrok_memory_statusEstado, tamaño y vista previa de 3 líneas de ambos archivos de memoria
opengrok_read_memoryLee active-task.md o investigation-log.md
opengrok_update_memoryEscribe o agrega; marca automáticamente con marca de tiempo las entradas de investigation-log.md
ArchivoLímite de tamañoPropósito
active-task.md≤ 4 KBEstado actual de la tarea: task:, last_symbol:, next_step:, open_questions:, status:
investigation-log.md≤ 32 KBRegistro de solo agregar de hallazgos, agrupado por encabezados de ## YYYY-MM-DD HH:MM:

La codificación delta devuelve [unchanged] en lecturas repetidas de contenido sin modificar. El recorte con puntuación de riqueza mantiene las entradas de registro de mayor valor cuando el espacio es limitado.

Configuración

Núcleo

VariablePredeterminadoDescripción
OPENGROK_BASE_URL(en blanco)URL base del servidor OpenGrok (requerida). Proporcionada por el asistente de configuración o la configuración de VS Code.
OPENGROK_USERNAME(en blanco)Nombre de usuario de autenticación. Déjalo sin configurar para acceso anónimo.
OPENGROK_PASSWORD(en blanco)Contraseña de autenticación. Prefiere el llavero del sistema operativo mediante opengrok-mcp setup.
OPENGROK_PASSWORD_FILE(en blanco)Ruta a un archivo que contiene la contraseña de OpenGrok (secreto montado por archivo para CI/contenedores). Alternativa a OPENGROK_PASSWORD.
OPENGROK_VERIFY_SSLtrueEstablece false para deshabilitar la verificación TLS para certificados autofirmados.
OPENGROK_TIMEOUT30Tiempo de espera de solicitud HTTP en segundos.

Code Mode y Rendimiento

VariablePredeterminadoDescripción
OPENGROK_CODE_MODEtrueCode Mode (2–5 herramientas: opengrok_api + opengrok_execute + 3 herramientas de memoria cuando está habilitado). Establece false para las 26 herramientas estándar heredadas.
OPENGROK_CONTEXT_BUDGETstandardNivel de tamaño de respuesta: minimal (8 KB, presupuesto de tree-sitter de 200 líneas) / standard (16 KB, 400 líneas) / generous (32 KB, 600 líneas).
OPENGROK_MAX_RESPONSE_BYTES—Anula el límite de bytes por respuesta (tiene prioridad sobre OPENGROK_CONTEXT_BUDGET).
OPENGROK_SEARCH_AND_READ_CAP—Anula el límite compuesto de opengrok_search_and_read (predeterminados: 2 KB / 4 KB / 8 KB por nivel).
OPENGROK_RESPONSE_FORMAT_OVERRIDE—Fuerza un formato globalmente: markdown / json / tsv / toon / yaml / text.
OPENGROK_DEFAULT_PROJECT—Nombre de proyecto predeterminado para acotar todas las búsquedas.
OPENGROK_DEFAULT_MAX_RESULTS25Límite de resultados de búsqueda predeterminado.
OPENGROK_LOCAL_COMPILE_DB_PATHS—Rutas separadas por comas a compile_commands.json para extracción de banderas C/C++.
OPENGROK_GRAMMAR_DIRauto-detectadoAnula la ruta a los archivos WASM de gramática de tree-sitter. Predeterminado: subir desde el directorio del paquete para encontrar grammars/.

Memory Bank

VariablePredeterminadoDescripción
OPENGROK_ENABLE_MEMORY_TOOLSfalseRegistra las 3 herramientas de memoria de Code Mode (estado de memoria, lectura, actualización). Desactivado = solo api + execute.
OPENGROK_MEMORY_BANK_DIRpredeterminado del servidorAnula el directorio para active-task.md + investigation-log.md.
OPENGROK_ENABLE_OBSERVATION_MASKERfalseAntepone resúmenes de historial compactos a los resultados de opengrok_execute después de que se llene la ventana de texto completo. Solo es útil para clientes que truncan el contexto.
OPENGROK_OBSERVATION_MASKER_TURNS10Número de resultados recientes de opengrok_execute para mantener completos antes de que los más antiguos se compacten.

Limitación de velocidad

VariablePredeterminadoDescripción
OPENGROK_RATELIMIT_ENABLEDtrueHabilita la limitación de velocidad con cubo de tokens.
OPENGROK_RATELIMIT_RPM60Límite global de solicitudes por minuto.
OPENGROK_PER_TOOL_RATELIMIT—Anulaciones de RPM por herramienta: opengrok_execute:15,opengrok_batch_search:20. Predeterminados: opengrok_execute 15 rpm, opengrok_batch_search 5 rpm, opengrok_dependency_map 10 rpm, opengrok_call_graph 5 rpm.

Caché de respuestas

VariablePredeterminadoDescripción
OPENGROK_CACHE_ENABLEDtrueHabilita la caché de respuestas con TTL.
OPENGROK_CACHE_MAX_SIZE500Máximo de entradas de caché.
OPENGROK_CACHE_MAX_BYTES52428800Tamaño máximo total de caché en bytes (50 MB).
OPENGROK_CACHE_SEARCH_TTL300TTL de caché de resultados de búsqueda en segundos.
OPENGROK_CACHE_FILE_TTL600TTL de caché de contenido de archivos en segundos.
OPENGROK_CACHE_HISTORY_TTL1800TTL de caché de historial de archivos en segundos.
OPENGROK_CACHE_PROJECTS_TTL3600TTL de caché de lista de proyectos en segundos.

Protocolo MCP

VariablePredeterminadoDescripción
OPENGROK_ENABLE_ELICITATIONtrueSelector de proyectos en el inicio de opengrok_api y env.opengrok.elicit() en el sandbox.
OPENGROK_ENABLE_SAMPLINGfalseMCP Sampling para explicación de errores, resumen de grafos y recuperación de cero resultados.
OPENGROK_ENABLE_FILES_APIfalseFileReferenceCache para investigation-log.md (direccionado por contenido SHA-256).
OPENGROK_SAMPLING_MODEL—Preferencia de modelo para llamadas de muestreo.
OPENGROK_SAMPLING_MAX_TOKENS256Presupuesto de tokens para respuestas de muestreo (máximo: 4096).

API de OpenGrok

VariablePredeterminadoDescripción
OPENGROK_API_VERSIONv1Versión de la API REST. Usa v2 para opengrok_call_graph.

Seguridad y Auditoría

VariablePredeterminadoDescripción
OPENGROK_AUDIT_LOG_FILE—Ruta de archivo para registro de auditoría estructurado (CSV o JSON).
OPENGROK_STRICT_SSRFfalseRechaza URL base y redirecciones que resuelven a rangos de IP privados/loopback (predeterminado: solo advertencia).

Registro

VariablePredeterminadoDescripción
OPENGROK_LOG_LEVELinfoEstablece debug para registro estructurado detallado en stderr.

Proxy

VariablePredeterminadoDescripción
HTTP_PROXY—Proxy HTTP para solicitudes salientes.
HTTPS_PROXY—Proxy HTTPS para solicitudes salientes.

Los usuarios de VS Code pueden establecer opengrok-mcp.baseUrl, opengrok-mcp.codeMode, opengrok-mcp.contextBudget, opengrok-mcp.memoryBankDir, opengrok-mcp.defaultProject, opengrok-mcp.responseFormatOverride, opengrok-mcp.compileDbPaths, opengrok-mcp.enableObservationMasker y opengrok-mcp.observationMaskerTurns en la configuración de VS Code en su lugar. Los valores secretos como la contraseña nunca se escriben en la configuración de VS Code.

Nota del SDK de MCP: Esta versión usa @modelcontextprotocol/sdk v1.30.0 (línea v1).

Transporte HTTP y Autenticación

Por defecto, el servidor se comunica a través de stdio. Para implementaciones compartidas en equipo, la capa de transporte HTTP está disponible como API de biblioteca (startHttpTransport() en src/server/transport/http-transport.ts) pero aún no está conectada al punto de entrada de CLI — OPENGROK_HTTP_PORT se documenta a continuación pero main.ts aún no lo lee para iniciar el servidor HTTP automáticamente. Usa startHttpTransport() directamente en implementaciones personalizadas.

Gestión de sesiones

  • Cada cliente HTTP recibe una instancia aislada de McpServer (patrón de fábrica por sesión)
  • Las sesiones expiran después de 30 minutos de inactividad; OPENGROK_HTTP_MAX_SESSIONS limita las sesiones concurrentes (predeterminado: 100)
  • GET /mcp/sessions devuelve JSON con el número de sesiones activas y la antigüedad de la sesión más antigua

Autenticación

MétodoConfiguración
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 con roles nombradosOPENGROK_RBAC_TOKENS='alice-token:admin,bot-token:readonly'

En el modo de servidor de recursos, este servidor valida JWT emitidos por tu propio IdP — no hay un punto final integrado de /token. Cuando se establece OPENGROK_JWT_ISSUER, se rechazan tokens de otros emisores. Los metadatos de recursos protegidos RFC 9728 se sirven en /.well-known/oauth-protected-resource.

Roles RBAC

RolPermisos
adminAcceso completo a todas las herramientas y configuración
developerTodas las herramientas de búsqueda, lectura, memoria y código
readonlySolo herramientas de búsqueda y lectura — sin escrituras de memoria, sin ejecución de código

Los tokens desconocidos o faltantes se rechazan con 403 Forbidden. Cuando no hay autenticación configurada, las solicitudes no autenticadas reciben admin (modo de desarrollo local).

CORS

Los clientes basados en navegador están controlados por una lista de permitidos de orígenes (OPENGROK_ALLOWED_ORIGINS, separados por comas). Sin autenticación configurada, los orígenes de bucle local (localhost, 127.0.0.1, [::1]) están permitidos para desarrollo local; una vez que la autenticación está configurada (OPENGROK_HTTP_AUTH_TOKEN o tokens RBAC), el bucle local ya no es implícito — liste cada origen permitido explícitamente, incluidos los locales.

Seguridad
ÁreaProtección
SSRFDetección de rebinding de DNS + bloqueo de direcciones mapeadas IPv6 en buildSafeUrl; modo estricto mediante OPENGROK_STRICT_SSRF
Path traversalNormalización NFC + bloqueo de caracteres Unicode bidireccionales en assertSafePath
Inyección HTMLDecodificación de entidades en todos los nodos de texto del parser antes de la visualización
Inyección de promptsEscape de campos Markdown en todos los formateadores
Comparación de tokenscrypto.timingSafeEqual para todas las comparaciones de tokens Bearer
CORSLista de permitidos mediante OPENGROK_ALLOWED_ORIGINS — sin comodines en producción
Cabeceras de seguridadX-Content-Type-Options, X-Frame-Options, CSP en respuestas HTTP
Cifrado de credencialesAES-256-GCM con actualización automática desde archivos cifrados antiguos
Limitación de tasaToken bucket basado en enteros (elimina la deriva de flotantes); valores predeterminados por herramienta (opengrok_execute: 15 rpm)
Aislamiento de sandboxMáquina virtual QuickJS WASM — sin sistema de archivos, sin red, solo lista de métodos permitidos; tiempo de espera de 62 s, buffer de 8 MB
Registros de auditoríaEntradas de auditoría estructuradas con escape de inyección

Para la arquitectura de seguridad completa (modelo de amenazas, capas de defensa, guía de endurecimiento), consulte SECURITY.md.

Recomendación de confianza del sandbox: Al configurar OpenGrok MCP en la configuración MCP de VS Code, puede establecer sandboxEnabled: true que aprueba automáticamente las llamadas a herramientas sin solicitudes de confirmación. Esto es seguro porque toda la ejecución de herramientas ocurre dentro del sandbox QuickJS WASM sin acceso al host — el LLM no puede ejecutar comandos arbitrarios del sistema a través de este servidor.


Integración con VS Code

ComandoAcción
OpenGrok: Open ConfigurationGUI interactiva de configuración
OpenGrok: Test ConnectionValidar acceso a la API y validez del token
OpenGrok: Show Server LogsExponer stdout/stderr del proceso en segundo plano
OpenGrok: Status MenuMenú de estado de acceso rápido desde la barra de estado
OpenGrok: Check for UpdatesActivar manualmente una verificación de actualización

[!NOTE] VS Code gestiona las autorizaciones de herramientas por espacio de trabajo. Si abre un repositorio diferente, vuelva a marcar la casilla de OpenGrok en el panel de herramientas de Copilot.

El panel de configuración y la interfaz de configuración de VS Code cubren los mismos ajustes: use el panel para configuración guiada, secretos, pruebas y avisos de recarga. Use la configuración opengrok-mcp.* en settings.json para anulaciones de espacio de trabajo, sincronización de configuración y valores predeterminados por script. Se recomienda Code Mode; deshabilitarlo usa herramientas estándar heredadas y excluye capacidades exclusivas de Code Mode.


Solución de problemas

[!TIP] Ejecute opengrok-mcp status para verificar la conectividad y confirmar qué clientes MCP están configurados.

[!WARNING] Después de recargar VS Code o actualizar la extensión, las herramientas pueden desaparecer temporalmente de la lista de herramientas de Copilot. Haga clic en el icono de herramientas, seleccione "Update Tools" y luego ejecute Developer: Reload Window para restaurarlas.

Conexión fallida — Verifique OPENGROK_BASE_URL. Compruebe que su VPN o proxy no esté bloqueando el endpoint.

401 No autorizado — Ejecute OpenGrok: Open Configuration para volver a ingresar las credenciales.

Errores de certificado SSL autofirmado — Establezca opengrok-mcp.verifySsl a false en la configuración de VS Code, o OPENGROK_VERIFY_SSL=false en la configuración de su cliente MCP.

Consultas lentas o tiempos de espera — Reduzca el alcance con el filtrado file_type o apunte a un proyecto específico. Verifique el estado de indexación con opengrok_index_health.

Registro verboso — Establezca OPENGROK_LOG_LEVEL=debug.

Compatibilidad con OpenGrok

Versión del motorEstadoNotas
v1.13.x y superioresCompatibleAPI REST completa
v1.7.0 — v1.12.xModo heredadoRaspado HTML para símbolos y blame
Por debajo de v1.7.0No compatibleComportamiento impredecible

Para ir más allá

Configuración del cliente · Arquitectura · Seguridad · Contribuir · Registro de cambios


Información de licencia

Este sistema se distribuye bajo la Licencia No Comercial PolyForm 1.0.0.

  • ✅ Permitido: Uso personal, proyectos de hobby, investigación académica, educación
  • ❌ Prohibido: Cualquier uso comercial, empresarial, corporativo o de pago

Licencia comercial: Para usar esta extensión en un contexto empresarial (herramientas internas, pipelines de CI, infraestructura de negocio), se requiere estrictamente una licencia comercial. Contacte a rudroy09@gmail.com para precios de nivel empresarial.

Lea LICENSE-COMMERCIAL.md para los términos completos.