Ir al contenido

Solución de Problemas

flowchart TD
    A[El servidor no arranca] --> B{Mensaje de error?}
    B -->|GITLAB_TOKEN required| C[Establece GITLAB_TOKEN<br/>en .env o entorno]
    B -->|Invalid GITLAB_URL| D[Corrige GITLAB_URL<br/>autogestionado]
    B -->|401 Unauthorized| E[Regenera token<br/>con scope api]
    B -->|403 Forbidden| F[Verifica scope api<br/>del token]
    B -->|Conexión rechazada| G{GitLab accesible?}
    G -->|No| H[Verifica GITLAB_URL<br/>y red]
    G -->|Sí| I{Error TLS?}
    I -->|Sí| J{Puedes instalar cert CA?}
    J -->|Sí| J1[Añade cert CA al almacén<br/>de confianza del sistema]
    J -->|No| J2[GITLAB_SKIP_TLS_VERIFY=true<br/>como último recurso]
    I -->|No| K[Habilita debug logging<br/>LOG_LEVEL=debug]

    style C fill:#22c55e,color:#fff
    style D fill:#22c55e,color:#fff
    style E fill:#22c55e,color:#fff
    style F fill:#22c55e,color:#fff
    style H fill:#f59e0b,color:#000
    style J1 fill:#22c55e,color:#fff
    style J2 fill:#f59e0b,color:#000
    style K fill:#3b82f6,color:#fff
SíntomaCausaSolución
GITLAB_TOKEN is required al inicioToken no establecidoEstablece GITLAB_TOKEN en .env o en el entorno
GITLAB_URL is not a valid URL al inicioLa URL tiene sintaxis inválidaCorrige GITLAB_URL u omítela para usar https://gitlab.com en modo stdio
401 Unauthorized de la API de GitLabPAT inválido o expiradoGenera un nuevo token con scope api en GitLab → Preferences → Access Tokens
403 Forbidden en operaciones específicasEl token carece del scope requeridoAsegúrate de que el token tiene scope api (no solo read_api)
Conexión rechazada o timeoutInstancia de GitLab inaccesibleVerifica que GITLAB_URL es accesible: curl -s $GITLAB_URL/api/v4/version
SíntomaCausaSolución
x509: certificate signed by unknown authorityCertificado autofirmadoPrimero intenta añadir el certificado CA al almacén de confianza del sistema. Si no es posible, establece GITLAB_SKIP_TLS_VERIFY=true en .env o --skip-tls-verify en modo HTTP
x509: certificate has expiredCertificado TLS expiradoRenueva el certificado en el servidor de GitLab, o usa GITLAB_SKIP_TLS_VERIFY=true temporalmente

Si el servidor no puede resolver el hostname de tu GitLab:

Ventana de terminal
# Verificar DNS desde la máquina que ejecuta el servidor MCP
nslookup gitlab.ejemplo.com
# o
dig gitlab.ejemplo.com +short

En contenedores Docker, asegúrate de que tu fichero compose o el comando docker run use --dns o una red personalizada con configuración DNS adecuada. Dentro de Kubernetes, revisa los logs de CoreDNS y resolv.conf en el pod.

El net/http de Go respeta las variables de entorno de proxy estándar. Establécelas antes de lanzar el servidor:

Ventana de terminal
export HTTPS_PROXY=http://proxy.corp.ejemplo.com:8080
export HTTP_PROXY=http://proxy.corp.ejemplo.com:8080
export NO_PROXY=localhost,127.0.0.1,.internal.corp
SíntomaCausaSolución
Timeout de conexión detrás de red corporativaProxy no configuradoEstablece HTTPS_PROXY / HTTP_PROXY
El proxy funciona con curl pero no con el servidorVars de entorno no exportadas al proceso del servidorPásalas en .env, Docker environment:, o secretos de Fly.io
CONNECT rechazado por proxy para api.github.comEl proxy deniega salida a GitHub (auto-update)Establece AUTO_UPDATE=false o añade github.com y objects.githubusercontent.com a la whitelist
GitLab interno enrutado a través de proxy externoFalta NO_PROXYAñade tu hostname de GitLab a NO_PROXY

Cuando se ejecuta el servidor MCP detrás de nginx, Caddy, o un balanceador cloud:

SíntomaCausaSolución
El rate limiter cuenta todas las peticiones como un solo clienteLee la IP del balanceador en lugar de la del cliente realEstablece --trusted-proxy-header a la cabecera que tu proxy establece (ej. X-Forwarded-For, Fly-Client-IP)
WebSocket o SSE desconectadoTimeout de lectura del proxy demasiado cortoAumenta el timeout de lectura del proxy a al menos 120s para streams MCP de larga duración
502 Bad GatewayEl servidor aún no está escuchandoAñade un startup probe o reintento; el servidor necesita unos segundos para inicializarse en la primera petición
SíntomaCausaSolución
El cliente MCP muestra cientos de herramientas individuales en lugar de 32Meta-herramientas desactivadasEstablece META_TOOLS=true (por defecto) para consolidar en meta-herramientas de dominio
Herramienta no encontrada en tools/listDesajuste de la superficie de herramientasEl modo individual usa gitlab_create_issue, el modo meta usa gitlab_issue con action: create, y el modo dinámico expone gitlab_search_tools, gitlab_describe_tools y gitlab_execute_tool
unknown action en llamada a meta-herramientaParámetro de acción inválidoVerifica las acciones válidas en Resumen de Herramientas
json: unknown field "<nombre>" desde una meta-herramientaParámetro mal escrito u obsoleto en paramsLas meta-herramientas rechazan claves desconocidas. Usa los nombres exactos de la action elegida (p. ej. merge_request_iid, issue_iid, epic_iid, work_item_iid, snippet_id)
Herramientas enterprise faltantesCatálogo enterprise desactivadoEn modo stdio, establece GITLAB_ENTERPRISE=true. En modo HTTP, configura --enterprise para forzar el catálogo o deja que la autodetección CE/EE lo habilite cuando GitLab informe la edición
SíntomaCausaSolución
Actualización detectada pero no aplicadaModo es solo checkEstablece AUTO_UPDATE=true para habilitar la aplicación automática
Sigue ejecutando la versión antigua tras la actualizaciónProceso no reiniciado (Windows)Reinicia el servidor o usa gitlab-mcp-server --shutdown para terminar todas las instancias
No se puede reemplazar el binario (archivo bloqueado)Las instancias en ejecución mantienen el archivoEjecuta gitlab-mcp-server --shutdown para terminar todas las instancias primero
Error de red alcanzando GitHubFirewall o proxy bloqueandoVerifica la conectividad a github.com desde el servidor
SíntomaCausaSolución
400 Bad RequestCabecera de token faltanteEnvía la cabecera PRIVATE-TOKEN o Authorization: Bearer <token> con cada solicitud
Desalojo del pool demasiado frecuenteDemasiados tokens únicosAumenta --max-http-clients (por defecto: 100)
Sesiones expirando inesperadamenteTimeout de inactividad muy cortoAumenta --session-timeout (por defecto: 30m)
SíntomaCausaSolución
401 Unauthorized con token OAuth válidoToken expirado o rechazado por GitLabRe-autoriza a través del flujo OAuth; verifica que la aplicación OAuth de GitLab siga activa
Alta latencia en la primera solicitud tras expirar la cachéRe-validación del token contra la API de GitLabComportamiento esperado — aumenta --oauth-cache-ttl (por defecto: 15m, máx: 2h) para reducir la frecuencia de validación
404 en /.well-known/oauth-protected-resourceModo OAuth no habilitadoInicia el servidor con --auth-mode=oauth
El cliente no inicia el flujo OAuthEl cliente no soporta OAuth 2.1Usa la cabecera PRIVATE-TOKEN en su lugar — funciona en modo OAuth mediante normalización automática
La cabecera PRIVATE-TOKEN no funciona en modo OAuthDebería funcionarEl middleware normaliza PRIVATE-TOKEN a Bearer — verifica la validez del token
Operaciones fallan con scope mcp insuficienteDCR fallback asignó scope mcp en lugar de apiConfigura clientId explícitamente en la configuración del cliente MCP. Ver Modo servidor HTTP
SíntomaCausaSolución
Resultados de listas truncadosLímite predeterminado de per_pagePasa los parámetros per_page (máx 100) y page para paginar
nextPage faltante en la respuestaÚltima página alcanzadaNo hay más resultados — este es el comportamiento esperado
SíntomaSolución
”Tool not found” en Copilot ChatVerifica el panel de Salida → MCP Logs para errores. Verifica la ruta de .vscode/mcp.json
El servidor no aparece en el estado MCPEjecuta Ctrl+Shift+PMCP: List Servers para verificar la configuración
”Permission denied” al inicioEjecuta chmod +x /ruta/al/gitlab-mcp-server (Linux/macOS)
El servidor se reinicia repetidamenteVerifica MCP Logs por GITLAB_URL o GITLAB_TOKEN faltantes
Espera indefinidamente a initialize y Docker muestra modo HTTPAñade --http=false después del nombre de la imagen para modo stdio, o configura el cliente como HTTP con http://host:8080/mcp

Habilita el registro detallado para diagnosticar problemas:

  1. Establece el nivel de log a debug:

    Ventana de terminal
    # Modo stdio
    LOG_LEVEL=debug ./gitlab-mcp-server 2>debug.log
    # Modo HTTP (logs mezclados con la salida del servidor)
    LOG_LEVEL=debug ./gitlab-mcp-server --http --gitlab-url=https://gitlab.com 2>debug.log
  2. Reproduce el problema ejecutando la misma operación que falló.

  3. Examina los logs — los logs de depuración incluyen:

    • Cada llamada a herramienta con parámetros de entrada
    • Detalles de solicitud/respuesta de la API de GitLab
    • Eventos de validación de token (solo los últimos 4 caracteres)
    • Operaciones del pool de sesiones (modo HTTP)

Si no puedes resolver un problema:

  1. Habilita el registro de depuración (LOG_LEVEL=debug) y captura la salida
  2. Revisa las GitHub Issues para problemas conocidos
  3. Abre una nueva issue con:
    • Versión del servidor (gitlab-mcp-server --version o revisa los logs de inicio)
    • Sistema operativo y arquitectura
    • Nombre y versión del cliente MCP
    • Logs de depuración redactados (elimina cualquier token o dato sensible)
    • Pasos para reproducir el problema