Ir al contenido

Modo Servidor HTTP

Por defecto, GitLab MCP Server se ejecuta en modo stdio — cada cliente de IA inicia su propio proceso de servidor. El modo HTTP es una alternativa donde un único proceso de servidor atiende a múltiples clientes a través de la red, cada uno autenticándose con su propio token de GitLab.

EscenarioModo Recomendado
Desarrollador individual, cliente de IA localstdio
Equipo compartiendo una instancia de servidorHTTP
Despliegue en servidor remoto/sin pantallaHTTP
Integración CI/CD con MCPHTTP
Pruebas con curl o clientes HTTPHTTP
Ventana de terminal
gitlab-mcp-server --http --gitlab-url=https://tu-gitlab.ejemplo.com

El servidor comienza a escuchar en el puerto 8080 por defecto. El endpoint MCP está disponible en /mcp.

FlagPor DefectoDescripción
--http(desactivado)Habilitar modo de transporte HTTP
--http-addr:8080Dirección de escucha HTTP (host:puerto)
--gitlab-url(requerido)URL base de la instancia de GitLab
--skip-tls-verifyfalseOmitir verificación de certificados TLS para certificados autofirmados
--meta-toolstrueHabilitar meta-herramientas de dominio (42 o 57 con —enterprise)
--enterprisefalseHabilitar herramientas Enterprise/Premium (35 individuales + 15 meta-tools)
--read-onlyfalseModo solo lectura: desactivar todas las herramientas de escritura
--max-http-clients100Máximo de tokens únicos en el pool del servidor
--session-timeout30mTimeout de sesión MCP inactiva
--auto-updatetrueModo de actualización automática: true, check o false
--auto-update-repojmrplens/gitlab-mcp-serverRepositorio de GitHub para assets del release
--auto-update-interval1hIntervalo de verificación periódica de actualizaciones
--auth-modelegacyModo de autenticación: legacy u oauth (RFC 9728)
--oauth-cache-ttl15mTTL de caché de identidad de token OAuth (rango: 1m–2h)

Los clientes deben proporcionar su Token de Acceso Personal de GitLab en cada solicitud HTTP usando una de dos cabeceras:

PRIVATE-TOKEN: glpat-xxxxxxxxxxxxxxxxxxxx
Authorization: Bearer glpat-xxxxxxxxxxxxxxxxxxxx

Si ambas cabeceras están presentes, PRIVATE-TOKEN tiene precedencia. Las solicitudes sin un token válido son rechazadas.

El modo OAuth (--auth-mode=oauth) habilita autenticación OAuth 2.1 compatible con RFC 9728. En lugar de gestionar tokens manualmente, los clientes MCP descubren el servidor de autorización automáticamente y manejan el flujo OAuth:

Ventana de terminal
gitlab-mcp-server --http --gitlab-url=https://tu-gitlab.ejemplo.com --auth-mode=oauth

Cómo funciona:

  1. El servidor expone /.well-known/oauth-protected-resource con metadatos que apuntan a tu instancia de GitLab como servidor de autorización
  2. Los clientes MCP (VS Code, Claude Code) descubren este endpoint e inician el flujo OAuth 2.1 PKCE
  3. Los usuarios autorizan en el navegador — no se requiere copiar tokens
  4. El servidor valida los tokens Bearer contra la API de GitLab y cachea la identidad durante --oauth-cache-ttl (por defecto: 15 minutos)

Configuración del cliente en modo OAuth:

{
"servers": {
"gitlab": {
"type": "http",
"url": "http://tu-servidor:8080/mcp",
"oauth": {
"clientId": "TU_APPLICATION_ID_DE_GITLAB",
"scopes": ["api"]
}
}
}
}
  • clientId: El Application ID de tu Aplicación OAuth de GitLab (ver docs/oauth-app-setup.md)
  • scopes: Debe incluir api para funcionalidad completa de herramientas

VS Code maneja el descubrimiento OAuth y la autorización automáticamente.

El núcleo del modo HTTP es un pool LRU limitado de instancias de servidor MCP, indexado por el hash SHA-256 del token de cada cliente.

graph TD
    subgraph "Arquitectura del Modo HTTP"
        REQ1["Cliente A<br/>Token: glpat-aaa"] --> HANDLER[StreamableHTTPHandler]
        REQ2["Cliente B<br/>Token: glpat-bbb"] --> HANDLER
        REQ3["Cliente C<br/>Token: glpat-aaa"] --> HANDLER

        HANDLER --> POOL[Pool de Servidores]

        POOL --> ENTRY1["hash(glpat-aaa)<br/>Servidor MCP + Cliente GitLab"]
        POOL --> ENTRY2["hash(glpat-bbb)<br/>Servidor MCP + Cliente GitLab"]
    end

    ENTRY1 --> GL1["API de GitLab<br/>como usuario A"]
    ENTRY2 --> GL2["API de GitLab<br/>como usuario B"]

Propiedades clave:

  • Los clientes con el mismo token comparten la misma instancia del servidor MCP
  • Los clientes con diferentes tokens obtienen instancias completamente aisladas
  • Los tokens sin procesar nunca se almacenan — solo se mantienen hashes SHA-256 en memoria
  • Cuando el pool alcanza --max-http-clients, la entrada menos usada recientemente es desalojada
  1. Primera solicitud: El token se extrae, se hashea, y se crea un nuevo servidor MCP + cliente GitLab
  2. Solicitudes posteriores: La entrada existente se encuentra y se promueve en la lista LRU
  3. Timeout de inactividad: Después de --session-timeout de inactividad, la sesión MCP se cierra (pero la entrada del pool permanece)
  4. Desalojo del pool: Cuando se alcanza la capacidad, la entrada más antigua se elimina completamente

Añadir a .vscode/mcp.json:

{
"servers": {
"gitlab": {
"type": "http",
"url": "http://tu-servidor:8080/mcp",
"headers": {
"PRIVATE-TOKEN": "glpat-tu-token"
}
}
}
}
services:
gitlab-mcp:
image: ghcr.io/jmrplens/gitlab-mcp-server:latest
ports:
- "8080:8080"
command:
- "--http"
- "--gitlab-url=https://gitlab.ejemplo.com"
- "--http-addr=:8080"
- "--max-http-clients=200"
- "--session-timeout=1h"
restart: unless-stopped

Iniciar el servicio:

Ventana de terminal
docker compose up -d

Puedes verificar que el servidor está funcionando enviando una solicitud tools/list:

Ventana de terminal
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "PRIVATE-TOKEN: glpat-tu-token" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}' | head -c 200

Una respuesta exitosa devuelve un resultado JSON-RPC con la lista de herramientas disponibles.