OpenGrok Go MCP
Inteligencia de código fuente para agentes, impulsada por OpenGrok y Go.
Documentación
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.
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 cadenawarningheredada) - 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
| Variable | Requerida | Cuándo establecerla |
|---|---|---|
OPENGROK_MCP_BASE_URL | sí | URL de la API de OpenGrok que termina en /api/v1 |
OPENGROK_MCP_API_TOKEN | no | Autenticació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_PROJECT | no | Mú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
| Variable | Predeterminado | Propósito |
|---|---|---|
OPENGROK_MCP_WEB_BASE_URL | derivado | Base 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_SCRAPE | false | Omite el scrape de la interfaz web cuando /projects/indexed falla |
OPENGROK_MCP_PROJECT_REQUIRED | true | Requiere project en llamadas de herramientas |
OPENGROK_MCP_PROBE_FILE | — | project/path para la sonda de capacidad de lectura de archivos |
OPENGROK_MCP_TRANSPORT | stdio | http para Streamable HTTP (127.0.0.1:8765/mcp) |
OPENGROK_MCP_LISTEN | 127.0.0.1:8765 | Dirección de escucha HTTP |
OPENGROK_MCP_TOOL_SURFACE | compact | full (herramientas de grano fino) o gateway (experimental) |
OPENGROK_MCP_AGENT_PROFILE | economy | rich 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_ENABLED | true | Herramientas 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_VERIFY | false | Solo hosts internos de confianza con TLS roto |
OPENGROK_MCP_CURSOR_SECRET | — | Secreto HMAC para cursores de paginación firmados |
OPENGROK_MCP_AUTO_EXPAND_CONTEXT | true | Auto-expande contexto alrededor de coincidencias de búsqueda |
OPENGROK_MCP_CONTEXT_BEFORE / AFTER | 5 / 10 | Líneas de ventana de expansión |
OPENGROK_MCP_MAX_EXPANDED_RESULTS | 10 | Máximo de resultados a expandir |
OPENGROK_MCP_MAX_EXPANDED_FILES | 5 | Máximo de archivos obtenidos durante la expansión |
OPENGROK_MCP_CONTEXT_FETCH_CONCURRENCY | 3 | Obtenciones paralelas durante la expansión |
OPENGROK_MCP_RETRY_MAX_ATTEMPTS | 2 | Reintentos para errores transitorios de OpenGrok |
OPENGROK_MCP_RETRY_BASE_DELAY | 200ms | Base de retroceso de reintentos |
OPENGROK_MCP_CACHE_ENABLED | false | Caché de respuestas en proceso |
OPENGROK_MCP_CACHE_TTL | 5m | Vida útil de las entradas de caché |
OPENGROK_MCP_CACHE_MAX_SIZE | 1000 | Máximo de entradas de caché |
DEBUG | false | 1 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=truees 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_URLcon 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_SECRETpara 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), ogateway(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 —
ListToolsmás todas las llamadas de herramientas en un escenario (bytes de solicitud + respuesta). Para gateway, cálido excluye la llamada única aopengrok_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
| Herramienta | Puntaje | Casos |
|---|---|---|
| get_file_context | 100% (Δ ±0) | 1 |
| list_projects | 100% (Δ ±0) | 1 |
| list_symbols | 100% (Δ ±0) | 1 |
| read_file | 100% (Δ ±0) | 1 |
| search_code | 100% (Δ ±0) | 4 |
| search_symbol_definitions | 100% (Δ ±0) | 1 |
| search_symbol_references | 100% (Δ ±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.
| Superficie | ListTools (tokens est.) | Total cálido mín–máx (tokens est.) |
|---|---|---|
| full | 14k (Δ +724) | 15k–16k (era 14k–15k) |
| compact | 6.8k (Δ +3.3k) | 7.7k–10k (era 4.4k–6.8k) |
| gateway | 261 (Δ ±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.mdspecs/FEATURE/plan.mdspecs/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.