OpenGrok Go MCP

Inteligencia de código fuente para agentes, impulsada por OpenGrok y Go.

Documentación

opengrok-go-mcp mascot

opengrok-go-mcp

Inteligencia de código fuente para agentes, impulsada por OpenGrok y Go.

He visto cosas que ustedes no grep-arían. — Arquitecto Senior, probablemente.


License Go CI MCP Evals


Servidor MCP orientado a agentes para buscar, navegar y leer código a través de OpenGrok.

Convierte OpenGrok en una superficie de inteligencia de código más segura para agentes LLM:

  • herramientas limitadas por capacidades que solo aparecen cuando la función subyacente de OpenGrok funciona
  • búsqueda paginada y lectura de archivos con cursores estables
  • URLs de citación en resultados de código para que las respuestas puedan apuntar a la fuente
  • advertencias para resultados amplios, heurísticos, truncados o de mejor esfuerzo (códigos warnings[] más una cadena warning heredada)
  • expansión automática de contexto alrededor de coincidencias de búsqueda con límites explícitos
  • superficies de herramientas de puerta de enlace completas, compactas y experimentales para diferentes estilos de agente

Si eres un agente de IA leyendo este repositorio, comienza con AGENTS.md para conocer las restricciones del proyecto y la guía de flujo de trabajo del agente.

Nota previa a 1.0: este servidor MCP aún está en evolución. Algunas herramientas, respuestas y rutas de configuración pueden estar rotas o cambiar antes de un lanzamiento estable 1.0. Por favor, reporta problemas usando docs/reporting-issues.md.

Cuándo Usarlo

Usa opengrok-go-mcp cuando quieras que un agente investigue una base de código indexada grande sin clonarla localmente. Funciona mejor para encontrar símbolos, leer archivos, rastrear referencias, acotar búsquedas amplias y producir respuestas con citas de fuente.

Es intencionalmente honesto sobre los límites de OpenGrok. OpenGrok proporciona búsqueda de texto completo más definiciones de ctags, no un grafo de llamadas semántico completo ni un motor AST. Para preguntas estructurales, usa este servidor para encontrar los archivos y símbolos correctos, luego verifica relaciones con herramientas conscientes del lenguaje cuando sea necesario.

Configuración del Cliente

Requerido: OPENGROK_MCP_BASE_URL — URL base de la API de OpenGrok que termina en /api/v1. Al iniciar, el servidor descubre proyectos, sondea capacidades y registra solo las herramientas que funcionan. Una instancia típica detrás de proxy inverso no necesita nada más.

Copia un bloque a continuación, reemplaza la URL, reinicia el cliente.

El servidor usa por defecto OPENGROK_MCP_AGENT_PROFILE=economy (cargas útiles ligeras, sin expansión automática de contexto). Establece OPENGROK_MCP_AGENT_PROFILE=rich cuando quieras contexto de búsqueda expandido por defecto. Los diagnósticos internos de respuesta están desactivados por defecto; establece OPENGROK_MCP_DIAGNOSTICS=true solo al depurar contadores de paginación/búsqueda. Consulta docs/configuration.md para la referencia completa de variables de entorno.

Binario publicado (sin instalación de Go)

Descarga el archivo para tu SO/arquitectura desde GitHub Releases, verifica checksums.txt, y apunta tu cliente MCP al binario opengrok-go-mcp descomprimido. Ejemplo (Claude Code):

{
  "mcpServers": {
    "opengrok": {
      "command": "/path/to/opengrok-go-mcp",
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
Claude Code (go run)

Agrega a ~/.claude.json bajo mcpServers, o ejecuta claude mcp add:

{
  "mcpServers": {
    "opengrok": {
      "command": "go",
      "args": [
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.2"
      ],
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
OpenCode (go run)

Agrega a opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "opengrok": {
      "type": "local",
      "enabled": true,
      "command": [
        "go",
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.2"
      ],
      "environment": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}
Codex

Agrega a .codex/config.toml en la raíz del proyecto o ~/.codex/config.toml:

[[mcp_servers]]
name = "opengrok"
command = ["go", "run", "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.2"]

[mcp_servers.env]
OPENGROK_MCP_BASE_URL = "https://your-opengrok-host/source/api/v1"
Otros clientes (Cursor, VS Code MCP, …)

La mayoría de los clientes MCP stdio usan la misma forma que Claude Code — command, args, y un mapa env (el nombre puede variar: environment, env):

{
  "mcpServers": {
    "opengrok": {
      "command": "go",
      "args": [
        "run",
        "github.com/rokasklive/opengrok-go-mcp/cmd/opengrok-go-mcp@v0.6.2"
      ],
      "env": {
        "OPENGROK_MCP_BASE_URL": "https://your-opengrok-host/source/api/v1"
      }
    }
  }
}

Cursor: .cursor/mcp.json del proyecto o Cursor Settings → MCP. VS Code: configuración de la extensión MCP con la misma entrada de servidor.

Clon local (reemplaza la ruta del paquete go run)

Usa el mismo bloque env / environment de arriba. Ejemplo de comando para Claude Code:

"command": "sh",
"args": [
  "-c",
  "cd /path/to/opengrok-go-mcp && go run ./cmd/opengrok-go-mcp --read-timeout=30s --write-timeout=30s"
]

Modo HTTP opcional desde un clon:

OPENGROK_MCP_TRANSPORT=http \
OPENGROK_MCP_BASE_URL=https://your-opengrok-host/source/api/v1 \
go run ./cmd/opengrok-go-mcp

Endpoint MCP: http://127.0.0.1:8765/mcp

Variables de entorno comunes

VariableRequeridaCuándo establecerla
OPENGROK_MCP_BASE_URLsíURL de la API de OpenGrok que termina en /api/v1
OPENGROK_MCP_API_TOKENnoAutenticación requerida, o los registros de inicio muestran 401/403 en las sondas. Valor completo de Authorization: Bearer <token> o Basic <credentials>. Nunca se registra.
OPENGROK_MCP_DEFAULT_PROJECTnoMúltiples proyectos y quieres uno implícito en llamadas que omiten project. Se establece automáticamente cuando se descubre exactamente un proyecto.

Si las sondas de búsqueda devuelven 401/403 sin un token, el servidor aún se inicia y registra la remediación; las herramientas de búsqueda permanecen bloqueadas hasta que se establezca OPENGROK_MCP_API_TOKEN.

Todas las variables de entorno
VariablePredeterminadoPropósito
OPENGROK_MCP_WEB_BASE_URLderivadoBase de la interfaz web para citas y respaldo de archivo sin procesar
OPENGROK_MCP_PROJECTS—Lista de permitidos separada por comas; omite el descubrimiento por API/scrape
OPENGROK_MCP_DISABLE_PROJECT_SCRAPEfalseOmite el scrape de la interfaz web cuando /projects/indexed falla
OPENGROK_MCP_PROJECT_REQUIREDtrueRequiere project en llamadas de herramientas
OPENGROK_MCP_PROBE_FILE—project/path para la sonda de capacidad de lectura de archivos
OPENGROK_MCP_TRANSPORTstdiohttp para Streamable HTTP (127.0.0.1:8765/mcp)
OPENGROK_MCP_LISTEN127.0.0.1:8765Dirección de escucha HTTP
OPENGROK_MCP_TOOL_SURFACEcompactfull (herramientas de grano fino) o gateway (experimental)
OPENGROK_MCP_AGENT_PROFILEeconomyrich para contexto de búsqueda expandido y enlaces por resultado por defecto. Los expand_context / response_mode / include_links por llamada aún tienen prioridad
OPENGROK_MCP_MEMORY_ENABLEDtrueHerramientas de memoria con ámbito de proceso solo en la superficie completa (stdio). Deshabilitadas sobre HTTP independientemente de esta configuración
OPENGROK_MCP_INSECURE_SKIP_TLS_VERIFYfalseSolo hosts internos de confianza con TLS roto
OPENGROK_MCP_CURSOR_SECRET—Secreto HMAC para cursores de paginación firmados
OPENGROK_MCP_AUTO_EXPAND_CONTEXTtrueAuto-expande contexto alrededor de coincidencias de búsqueda
OPENGROK_MCP_CONTEXT_BEFORE / AFTER5 / 10Líneas de ventana de expansión
OPENGROK_MCP_MAX_EXPANDED_RESULTS10Máximo de resultados a expandir
OPENGROK_MCP_MAX_EXPANDED_FILES5Máximo de archivos obtenidos durante la expansión
OPENGROK_MCP_CONTEXT_FETCH_CONCURRENCY3Obtenciones paralelas durante la expansión
OPENGROK_MCP_RETRY_MAX_ATTEMPTS2Reintentos para errores transitorios de OpenGrok
OPENGROK_MCP_RETRY_BASE_DELAY200msBase de retroceso de reintentos
OPENGROK_MCP_CACHE_ENABLEDfalseCaché de respuestas en proceso
OPENGROK_MCP_CACHE_TTL5mVida útil de las entradas de caché
OPENGROK_MCP_CACHE_MAX_SIZE1000Máximo de entradas de caché
DEBUGfalse1 registra solicitudes HTTP de OpenGrok en stderr

Anulaciones de presupuesto de contexto: OPENGROK_MCP_BUDGET_{MINIMAL|DEFAULT|MAXIMAL}_{BEFORE|AFTER|RESULTS|FILES}.

Obsoletas: OPENGROK_MCP_PROJECT_SCRAPE (usa OPENGROK_MCP_DISABLE_PROJECT_SCRAPE). Eliminadas: OPENGROK_MCP_BASIC_AUTH_TOKEN (usa OPENGROK_MCP_API_TOKEN="Basic …").

Referencia completa: docs/configuration.md.

Seguridad

Evita pasar secretos como banderas de CLI. Usa OPENGROK_MCP_API_TOKEN para la autenticación de OpenGrok; el servidor nunca registra valores de tokens.

Advertencias operativas:

  • El modo HTTP no agrega autenticación de cliente entrante. Mantén la dirección de enlace de loopback predeterminada o colócalo detrás de controles de red/autenticación de confianza.
  • OPENGROK_MCP_INSECURE_SKIP_TLS_VERIFY=true es solo para instancias internas controladas con certificados rotos. No lo uses para hosts públicos o no confiables.
  • El respaldo de archivo sin procesar usa OPENGROK_MCP_WEB_BASE_URL con las mismas credenciales configuradas. Trata esa URL como parte del límite de confianza de OpenGrok.
  • Las herramientas de memoria son solo de superficie completa (stdio). Tienen ámbito de proceso, son efímeras y están deshabilitadas sobre HTTP porque la memoria no está aislada por sesión de cliente.
  • Establece OPENGROK_MCP_CURSOR_SECRET para implementaciones compartidas si la integridad del cursor importa.

Evaluación

Evaluaciones stdio herméticas en evals/ — binario MCP real, backend OpenGrok falso, sin instancia en vivo. CI las ejecuta en cada PR (ci.yml). Los resúmenes del README y las columnas Δ comparan contra líneas base confirmadas en evals/baselines/. Actualiza localmente con scripts/update-eval-results.sh; el hook opcional de pre-push (scripts/install-githooks.sh) ejecuta pruebas y actualiza esos archivos antes de hacer push.

go test ./evals/ -count=1                        # contract + token benchmark
go test ./evals/ -run TestEvalSuite -count=1      # MCP contract only
go test ./evals/ -run TestTokenBenchmark -count=1 # token economy only

Cómo leer las tablas a continuación

  • Evaluación de contrato — llamadas MCP herméticas contra un backend OpenGrok falso; verifica salidas, errores y campos de paginación. Δ es el cambio vs la línea base confirmada en evals/baselines/. cobertura@K es la fracción de casos de evaluación ejercitados.
  • Benchmark de tokens — mismo arnés, pero mide bytes UTF-8 que cruzan el cable MCP (esquemas de herramientas, solicitudes, respuestas). Tokens est. = bytes ÷ 4 (heurística aproximada, no un tokenizador de modelo específico).
  • Superficie — full (herramientas de grano fino), compact (4 herramientas consolidadas, predeterminado), o gateway (descubrir + llamar experimental).
  • ListTools — costo único cuando el cliente carga la lista de herramientas y esquemas al inicio de la sesión; generalmente el elemento de línea más grande en full.
  • Total cálido — ListTools más todas las llamadas de herramientas en un escenario (bytes de solicitud + respuesta). Para gateway, cálido excluye la llamada única a opengrok_discover; frío la incluye (solo primera sesión). En full y compact, frío = cálido.
  • Mín–máx — rango entre los cuatro escenarios de reproducción (búsqueda de símbolo, navegación de archivo, búsqueda de símbolo en varios pasos, buscar-y-leer). El desglose por escenario está en la tabla colapsada.
  • Δ en filas de tokens — cambio en tokens estimados vs la última línea base confirmada (evals/baselines/token_report.json).

Evaluación de contrato

Última ejecución: 2026-06-25 · llamada directa · docs del arnés →

10/10 aprobados · 100% (Δ ±0) · 100% cobertura@K — consulta Cómo leer las tablas para Δ y cobertura@K.

Puntajes por herramienta
HerramientaPuntajeCasos
get_file_context100% (Δ ±0)1
list_projects100% (Δ ±0)1
list_symbols100% (Δ ±0)1
read_file100% (Δ ±0)1
search_code100% (Δ ±0)4
search_symbol_definitions100% (Δ ±0)1
search_symbol_references100% (Δ ±0)1

Benchmark de economía de tokens

Última ejecución: 2026-06-25 · reproducción determinista · tokens est. = bytes÷4 (heurística, no exacta al modelo)

ListTools domina el costo de sesión en la superficie completa (18 herramientas). Compact (4) y gateway (2) registran muchos menos esquemas.

SuperficieListTools (tokens est.)Total cálido mín–máx (tokens est.)
full14k (Δ +724)15k–16k (era 14k–15k)
compact6.8k (Δ +3.3k)7.7k–10k (era 4.4k–6.8k)
gateway261 (Δ ±0)1.2k–2.3k (era 1.2k–2.1k)

Cálido = ListTools + tráfico de herramientas del escenario. Gateway cálido omite discover único; full/compact frío = cálido. La exploración de archivos compact omite files.list (sin operación compact).

Totales cálidos por escenario (tokens est.; ListTools + llamadas) | Escenario | completo | compacto | gateway | |---|---|---|---| | Símbolo compuesto | 16k (Δ +911) | 8.3k (Δ +3.5k) | 1.8k (Δ +187) | | Exploración de archivos | 15k (Δ +779) | 7.7k (Δ +3.3k) | 1.2k (Δ +56) | | Investigación de símbolos (3 llamadas) | 16k (Δ +927) | 8.7k (Δ +3.5k) | 2.3k (Δ +203) | | Búsqueda + lectura | 15k (Δ +834) | 7.9k (Δ +3.4k) | 1.4k (Δ +109) |

Δ vs línea base del 2026-06-24.

Desarrollo

Este proyecto utiliza GitHub Spec Kit para la planificación de funcionalidades no triviales.

Para cambios de comportamiento significativos, nuevas herramientas MCP, cambios de esquema, cambios de configuración o cambios que afecten el comportamiento orientado a agentes, los contribuyentes deben partir de la constitución del proyecto:

  • .specify/memory/constitution.md

El trabajo de funcionalidades generalmente debe producir:

  • specs/FEATURE/spec.md
  • specs/FEATURE/plan.md
  • specs/FEATURE/tasks.md

Las correcciones menores de errores, ediciones de documentación, actualizaciones de dependencias y refactorizaciones mecánicas no requieren un flujo de trabajo completo de Spec Kit, a menos que afecten el contrato público de MCP.

Todos los cambios deben preservar el contrato MCP, la semántica de OpenGrok, la postura de seguridad, las expectativas de compatibilidad y los requisitos de documentación descritos en la constitución.

Limitaciones conocidas

  • El recorrido de proyectos grandes está acotado, y algunas operaciones de búsqueda y descubrimiento son de mejor esfuerzo en lugar de semántica de lenguaje.
  • El transporte HTTP está destinado a configuraciones locales o internas controladas y no agrega autenticación de clientes entrantes.

Consulta docs/limitations.md para obtener la lista detallada actual, el impacto de comportamiento y las mitigaciones.

Licencia

opengrok-go-mcp está licenciado bajo la Licencia Apache 2.0 (Apache-2.0) para nuevos lanzamientos a partir de v0.3.0-beta.2.

Las publicaciones anteriores hasta e incluyendo v0.3.0-beta.1 se publicaron bajo CC0-1.0 y permanecen disponibles bajo esos términos.