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
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.
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
| Herramienta | Propósito |
|---|---|
opengrok_search_code | Búsqueda de texto completo, definiciones, referencias, rutas e historial. Soporta filtrado por file_type y paginación por cursor. |
opengrok_find_file | Localiza archivos por nombre o patrón de directorio. Soporta paginación por cursor. |
opengrok_get_file_content | Lee código fuente. Usa start_line / end_line para archivos grandes. |
opengrok_get_file_history | Historial de commits para un archivo. Soporta paginación por cursor. |
opengrok_browse_directory | Muestra la estructura de carpetas y los archivos contenidos. Soporta paginación por cursor / limit. |
opengrok_list_projects | Lista todos los repositorios indexados. |
opengrok_get_file_annotate | Anotación de blame línea por línea. Soporta revision, rango start_line/end_line, includeContent. |
opengrok_get_file_symbols | Extrae clases, funciones, macros y estructuras de un archivo. Soporta paginación por cursor. |
opengrok_search_suggest | Consulta 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.
| Herramienta | Qué reemplaza | Ahorro |
|---|---|---|
opengrok_get_symbol_context | Búsqueda de definición + lectura de fuente + obtención de headers + referencias | ~92% menos tokens |
opengrok_search_and_read | Búsqueda + lectura de contexto circundante (límite: OPENGROK_SEARCH_AND_READ_CAP) | ~92% menos tokens |
opengrok_batch_search | 2–5 búsquedas en paralelo, resultados deduplicados | ~73% menos tokens |
opengrok_index_health | Latencia, conectividad, puntuación de desactualización | Diagnóstico |
Herramientas de Investigación
| Herramienta | Propósito |
|---|---|
opengrok_what_changed | Cambios recientes de líneas agrupados por commit — autor, fecha, SHA, líneas cambiadas con contexto |
opengrok_dependency_map | Recorrido BFS de cadenas #include/import hasta profundidad 3; grafo dirigido con uses/used_by |
opengrok_search_pattern | Búsqueda de código con expresiones regulares; devuelve file:line:content coincidencias |
opengrok_blame | Blame con rango de líneas (line_start / line_end) y diff opcional |
opengrok_call_graph | Trazado de cadenas de llamadas mediante la API v2 de OpenGrok (requiere OPENGROK_API_VERSION=v2; respaldo basado en referencias en v1) |
opengrok_get_file_diff | Diff unificado entre dos revisiones con líneas de contexto |
opengrok_get_compile_info | Banderas de compilador C/C++ y rutas de include desde compile_commands.json local |
opengrok_get_all_matches | Todas las líneas coincidentes en un archivo cuando la búsqueda muestra resultados truncados |
opengrok_get_file_history_with_files | Historial de commits con listas de archivos modificados conjuntamente mediante feed RSS |
opengrok_get_download_url | URL de descarga directa para un archivo (sin llamada HTTP) |
opengrok_list_groups | Grupos de proyectos (vacío cuando se requiere autenticación de administrador) |
opengrok_get_suggest_popularity | Sugerencias populares para un campo de proyecto (vacío cuando se requiere autenticación de administrador) |
opengrok_get_project_repositories | Repositorios 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étodo | Devuelve |
|---|---|
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étodo | Devuelve |
|---|---|
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étodo | Devuelve |
|---|---|
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étodo | Devuelve |
|---|---|
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étodo | Devuelve |
|---|---|
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:
| Herramienta | Propósito |
|---|---|
opengrok_memory_status | Estado, tamaño y vista previa de 3 líneas de ambos archivos de memoria |
opengrok_read_memory | Lee active-task.md o investigation-log.md |
opengrok_update_memory | Escribe o agrega; marca automáticamente con marca de tiempo las entradas de investigation-log.md |
| Archivo | Límite de tamaño | Propósito |
|---|---|---|
active-task.md | ≤ 4 KB | Estado actual de la tarea: task:, last_symbol:, next_step:, open_questions:, status: |
investigation-log.md | ≤ 32 KB | Registro 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
| Variable | Predeterminado | Descripció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_SSL | true | Establece false para deshabilitar la verificación TLS para certificados autofirmados. |
OPENGROK_TIMEOUT | 30 | Tiempo de espera de solicitud HTTP en segundos. |
Code Mode y Rendimiento
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_CODE_MODE | true | Code 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_BUDGET | standard | Nivel 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_RESULTS | 25 | Lí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_DIR | auto-detectado | Anula la ruta a los archivos WASM de gramática de tree-sitter. Predeterminado: subir desde el directorio del paquete para encontrar grammars/. |
Memory Bank
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_ENABLE_MEMORY_TOOLS | false | Registra las 3 herramientas de memoria de Code Mode (estado de memoria, lectura, actualización). Desactivado = solo api + execute. |
OPENGROK_MEMORY_BANK_DIR | predeterminado del servidor | Anula el directorio para active-task.md + investigation-log.md. |
OPENGROK_ENABLE_OBSERVATION_MASKER | false | Antepone 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_TURNS | 10 | Número de resultados recientes de opengrok_execute para mantener completos antes de que los más antiguos se compacten. |
Limitación de velocidad
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_RATELIMIT_ENABLED | true | Habilita la limitación de velocidad con cubo de tokens. |
OPENGROK_RATELIMIT_RPM | 60 | Lí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
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_CACHE_ENABLED | true | Habilita la caché de respuestas con TTL. |
OPENGROK_CACHE_MAX_SIZE | 500 | Máximo de entradas de caché. |
OPENGROK_CACHE_MAX_BYTES | 52428800 | Tamaño máximo total de caché en bytes (50 MB). |
OPENGROK_CACHE_SEARCH_TTL | 300 | TTL de caché de resultados de búsqueda en segundos. |
OPENGROK_CACHE_FILE_TTL | 600 | TTL de caché de contenido de archivos en segundos. |
OPENGROK_CACHE_HISTORY_TTL | 1800 | TTL de caché de historial de archivos en segundos. |
OPENGROK_CACHE_PROJECTS_TTL | 3600 | TTL de caché de lista de proyectos en segundos. |
Protocolo MCP
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_ENABLE_ELICITATION | true | Selector de proyectos en el inicio de opengrok_api y env.opengrok.elicit() en el sandbox. |
OPENGROK_ENABLE_SAMPLING | false | MCP Sampling para explicación de errores, resumen de grafos y recuperación de cero resultados. |
OPENGROK_ENABLE_FILES_API | false | FileReferenceCache para investigation-log.md (direccionado por contenido SHA-256). |
OPENGROK_SAMPLING_MODEL | — | Preferencia de modelo para llamadas de muestreo. |
OPENGROK_SAMPLING_MAX_TOKENS | 256 | Presupuesto de tokens para respuestas de muestreo (máximo: 4096). |
API de OpenGrok
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_API_VERSION | v1 | Versión de la API REST. Usa v2 para opengrok_call_graph. |
Seguridad y Auditoría
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_AUDIT_LOG_FILE | — | Ruta de archivo para registro de auditoría estructurado (CSV o JSON). |
OPENGROK_STRICT_SSRF | false | Rechaza URL base y redirecciones que resuelven a rangos de IP privados/loopback (predeterminado: solo advertencia). |
Registro
| Variable | Predeterminado | Descripción |
|---|---|---|
OPENGROK_LOG_LEVEL | info | Establece debug para registro estructurado detallado en stderr. |
Proxy
| Variable | Predeterminado | Descripció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/sdkv1.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_SESSIONSlimita las sesiones concurrentes (predeterminado: 100) GET /mcp/sessionsdevuelve JSON con el número de sesiones activas y la antigüedad de la sesión más antigua
Autenticación
| Método | Configuración |
|---|---|
| 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 con roles nombrados | OPENGROK_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
| Rol | Permisos |
|---|---|
admin | Acceso completo a todas las herramientas y configuración |
developer | Todas las herramientas de búsqueda, lectura, memoria y código |
readonly | Solo 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
| Área | Protección |
|---|---|
| SSRF | Detección de rebinding de DNS + bloqueo de direcciones mapeadas IPv6 en buildSafeUrl; modo estricto mediante OPENGROK_STRICT_SSRF |
| Path traversal | Normalización NFC + bloqueo de caracteres Unicode bidireccionales en assertSafePath |
| Inyección HTML | Decodificación de entidades en todos los nodos de texto del parser antes de la visualización |
| Inyección de prompts | Escape de campos Markdown en todos los formateadores |
| Comparación de tokens | crypto.timingSafeEqual para todas las comparaciones de tokens Bearer |
| CORS | Lista de permitidos mediante OPENGROK_ALLOWED_ORIGINS — sin comodines en producción |
| Cabeceras de seguridad | X-Content-Type-Options, X-Frame-Options, CSP en respuestas HTTP |
| Cifrado de credenciales | AES-256-GCM con actualización automática desde archivos cifrados antiguos |
| Limitación de tasa | Token bucket basado en enteros (elimina la deriva de flotantes); valores predeterminados por herramienta (opengrok_execute: 15 rpm) |
| Aislamiento de sandbox | Má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ía | Entradas 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
| Comando | Acción |
|---|---|
OpenGrok: Open Configuration | GUI interactiva de configuración |
OpenGrok: Test Connection | Validar acceso a la API y validez del token |
OpenGrok: Show Server Logs | Exponer stdout/stderr del proceso en segundo plano |
OpenGrok: Status Menu | Menú de estado de acceso rápido desde la barra de estado |
OpenGrok: Check for Updates | Activar 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 statuspara 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 Windowpara 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 motor | Estado | Notas |
|---|---|---|
| v1.13.x y superiores | Compatible | API REST completa |
| v1.7.0 — v1.12.x | Modo heredado | Raspado HTML para símbolos y blame |
| Por debajo de v1.7.0 | No compatible | Comportamiento 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.