mcpstead
mcpstead
Puerta de enlace MCP
Un punto final /mcp descendente que sirve de interfaz para muchos servidores MCP ascendentes. Conexiones ascendentes persistentes con reconexión, registro de herramientas con nombres calificados, respuestas JSON o SSE basadas en el Accept del cliente, autenticación por servidor ascendente y métricas de Prometheus.
Instalación
# npm (macOS, Linux, WSL)
npm i -g @ahkohd/mcpstead
# homebrew (macOS, Linux)
brew install ahkohd/tap/mcpstead
# cargo
cargo install mcpstead --locked --force
# verify
mcpstead --versionRelated MCP server: Mavryn
Inicio rápido
# 1. write a config
mkdir -p ~/.config/mcpstead
cat > ~/.config/mcpstead/config.yaml <<'EOF'
host: 0.0.0.0
port: 8766
mcp:
auth:
mode: none
servers:
- name: example
url: http://127.0.0.1:3000/mcp
protocol: streamable
auth: none
EOF
# 2. run
mcpstead --config ~/.config/mcpstead/config.yamlLuego, apunta cualquier cliente MCP a http://127.0.0.1:8766/mcp.
Docker
docker build -t mcpstead .
docker run --rm \
-p 8766:8766 \
-v "$PWD/config:/etc/mcpstead:ro" \
mcpsteadEl Dockerfile se instala desde crates.io.
API HTTP
Método | Ruta | Propósito |
|
| MCP sobre HTTP JSON-RPC |
|
| devuelve 405 |
|
| terminar sesión descendente |
|
| estado ascendente, recuento de herramientas, última vez visto, reconexiones |
|
| formato de texto de Prometheus |
|
| recargar configuración sin reiniciar |
Configuración del cliente MCP
Local, sin autenticación:
mcpstead:
url: http://127.0.0.1:8766/mcp
tools:
resources: false
prompts: falseAutenticación Bearer:
mcpstead:
url: http://127.0.0.1:8766/mcp
headers:
Authorization: Bearer ${MCPSTEAD_BEARER_TOKEN}
tools:
resources: false
prompts: falseLas herramientas aparecen con nombres calificados - <servidor>__<herramienta> - para que múltiples servidores ascendentes puedan ofrecer nombres de herramientas superpuestos sin colisiones.
Autenticación
Descendente (clientes a mcpstead)
Por defecto no hay autenticación:
mcp:
auth:
mode: noneAutenticación Bearer:
mcp:
auth:
mode: bearerEl token proviene de una variable de entorno:
export MCPSTEAD_BEARER_TOKEN='replace-with-strong-secret'
mcpstead --config ~/.config/mcpstead/config.yamlLos clientes envían Authorization: Bearer <token>. Un token faltante o incorrecto devuelve 401. mcp.auth.bearer_token en la configuración es rechazado al inicio.
/health y /metrics permanecen abiertos independientemente del modo de autenticación, para monitoreo sin exponer el token.
Ascendente (mcpstead a servidores MCP)
Por servidor en la lista servers. Tres modos:
servers:
- name: local
url: http://127.0.0.1:3000/mcp
auth: none
- name: workflow
url: https://workflow.example/mcp-server/http
auth:
type: bearer
token_env: WORKFLOW_TOKEN
- name: custom
url: https://api.example/mcp
headers:
X-API-Key: '${EXAMPLE_KEY}'token_env resuelve la variable de entorno nombrada al inicio y al recargar la configuración.
Configuración
Establece la ruta de configuración con --config <ruta> o la variable de entorno MCPSTEAD_CONFIG.
host: 0.0.0.0
port: 8766
mcp:
auth:
mode: none # none | bearer
session:
idle_ttl_seconds: 3600
gc_interval_seconds: 60
shutdown_grace_seconds: 5
servers:
- name: local
url: http://127.0.0.1:3000/mcp
protocol: streamable # streamable | sse | auto
required: false # if true, gateway won't start without this upstream
auth: none
reconnect:
max_attempts: 0 # 0 = infinite
backoff_base_ms: 1000
backoff_max_ms: 30000
tools:
ttl_seconds: 300
tls_skip_verify: false
quirks:
normalize_sse_events: true
inject_accept_header: 'application/json, text/event-stream'
metrics:
enabled: true
logging:
level: infoRecarga en caliente
mcpstead recarga su configuración sin reiniciar al recibir:
SIGHUP (
systemctl reload mcpsteadokill -HUP <pid>)POST /-/reload(protegido por autenticación bearer en modo bearer)
Recargable en caliente:
lista de servidores ascendentes
autenticación, encabezados, peculiaridades, reconexión, herramientas, URL, protocolo y configuraciones TLS por servidor ascendente
mcp.auth.modeyMCPSTEAD_BEARER_TOKENmetrics.enabled
Se requiere reinicio para:
hostportlogging.levelmcp.session.*
La recarga es de mejor esfuerzo. Una configuración incorrecta es rechazada e ignorada; la configuración en ejecución permanece vigente. Revisa los registros y mcpstead_config_reloads_total{result="error"} para ver fallos.
Claves de configuración de sesión MCP
mcp.session.idle_ttl_seconds- desalojar sesiones inactivas después de esta cantidad de segundos (por defecto3600)mcp.session.gc_interval_seconds- intervalo de activación del recolector de basura de sesiones inactivas (por defecto60)mcp.session.shutdown_grace_seconds- tiempo máximo de barrido de cierre (por defecto5)
Claves de configuración por servidor ascendente
name- requerido, usado como prefijo de herramientaurl- requerido, punto final MCPprotocol-streamable | sse | auto(por defectoauto)required- bloquear el inicio si el servidor ascendente no logra inicializarse (por defectofalse)auth-none,bearer(contoken_env), o mapa deheadersreconnect.max_attempts-0= infinito (por defecto)reconnect.backoff_base_ms/backoff_max_ms- límites de retroceso exponencialtools.ttl_seconds- actualizartools/listen caché después de este intervalotls_skip_verify- deshabilitar comprobaciones de certificados TLS para este servidor ascendente (por defectofalse, usar solo para redes locales confiables)quirks.normalize_sse_events- eliminar líneasevent:de las respuestas SSE ascendentesquirks.inject_accept_header- anular el encabezado Accept enviado al servidor ascendente
Observabilidad
Métricas
/metrics expone contadores, indicadores e histogramas en formato Prometheus. La cardinalidad de las etiquetas asume un conjunto pequeño y limitado de servidores ascendentes y herramientas; las series de llamadas a herramientas están indexadas por (servidor, herramienta).
mcpstead_build_info{version="...",rust_version="...",git_sha="..."}
mcpstead_start_time_seconds
mcpstead_uptime_seconds
mcpstead_process_resident_memory_bytes
mcpstead_process_virtual_memory_bytes
mcpstead_process_cpu_seconds_total
mcpstead_process_open_fds
mcpstead_process_max_fds
mcpstead_process_threads
mcpstead_upstream_connected{server="..."}
mcpstead_upstream_tools_count{server="..."}
mcpstead_upstream_reconnects_total{server="..."}
mcpstead_upstream_last_seen_seconds{server="..."}
mcpstead_upstream_initialize_total{server="...",result="success|error"}
mcpstead_upstream_initialize_duration_seconds_bucket{server="...",le="..."}
mcpstead_upstream_health_checks_total{server="...",result="success|failure"}
mcpstead_upstream_reconnect_attempts_total{server="...",result="success|error"}
mcpstead_upstream_backoff_seconds_total{server="..."}
mcpstead_upstream_in_backoff{server="..."}
mcpstead_upstream_current_backoff_seconds{server="..."}
mcpstead_upstream_session_resets_total{server="...",reason="unknown_session|expired|terminated"}
mcpstead_upstream_tools_refresh_total{server="...",result="success|error"}
mcpstead_upstream_tools_refresh_duration_seconds_bucket{server="...",le="..."}
mcpstead_upstream_tools_last_refresh_timestamp_seconds{server="..."}
mcpstead_upstream_bytes_total{server="...",direction="sent|received"}
mcpstead_downstream_sessions_active
mcpstead_downstream_sessions_total
mcpstead_downstream_session_duration_seconds_bucket{le="..."}
mcpstead_downstream_session_terminations_total{reason="..."}
mcpstead_mcp_requests_total{method="...",result="success|error"}
mcpstead_mcp_request_duration_seconds_bucket{method="...",le="..."}
mcpstead_mcp_auth_attempts_total{result="success|failure"}
mcpstead_mcp_auth_failures_total{reason="..."}
mcpstead_config_reloads_total{result="success|error"}
mcpstead_config_last_reload_timestamp_seconds
mcpstead_tool_calls_total{server="...",tool="..."}
mcpstead_tool_call_errors_total{server="...",tool="...",reason="..."}
mcpstead_tool_call_duration_seconds_bucket{server="...",tool="...",le="..."}Configuración de scrape
- job_name: mcpstead
metrics_path: /metrics
static_configs:
- targets: ['mcpstead:8766']Verificación de salud
curl http://127.0.0.1:8766/healthDevuelve JSON: estado de conexión por servidor ascendente, recuento de herramientas, último contacto exitoso, recuento de reconexiones, último error.
Solución de problemas
La lista de todas las herramientas está vacía - al menos un servidor ascendente falló al
initialize. Revisa/healthpara el estado por servidor; verifica la URL ascendente, la autenticación y la accesibilidad.SSE parse failedesporádico - el servidor ascendente envía un dialecto SSE que mcpstead no reconoce. Pruebaquirks.normalize_sse_events: truepara ese servidor, o establecequirks.inject_accept_header: 'application/json'para forzar JSON.tools/calldevuelve error de autenticación - el servidor ascendente rechazó el token bearer. Confirma quetoken_envse resuelve al valor correcto al inicio; verifica el nombre del encabezado esperado por el servidor ascendente.Errores de handshake TLS contra un servidor ascendente autofirmado - establece
tls_skip_verify: trueen ese servidor. Solo es seguro en redes locales confiables.401 desde
/mcpcon modo bearer - al cliente le falta o está enviando unAuthorization: Bearer <token>incorrecto. Verifica queMCPSTEAD_BEARER_TOKENcoincida con lo que envía el cliente.El servidor ascendente se pone rojo en
/healthrepetidamente - revisamcpstead_upstream_reconnects_totalymcpstead_upstream_last_seen_seconds. Ajustareconnect.backoff_max_mssi el servidor ascendente necesita una recuperación más larga.
This server cannot be deployed
Maintenance
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
MCP Gateway: wrap any MCP server with cold-start retries, uptime SLA, and per-execution MPP billing.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA gateway that aggregates multiple MCP servers into a single endpoint, namespacing their tools and forwarding calls, so an agent connects to one MCP to access the entire stack.MIT
- AlicenseNot gradedqualityCmaintenanceCentralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.5 npmMIT
- FlicenseNot gradedqualityBmaintenanceA configurable MCP gateway that runs multiple Streamable HTTP MCP servers and exposes all their tools through a single endpoint, enabling tool aggregation and routing for MCP clients.1-
- FlicenseNot gradedqualityBmaintenanceA generic MCP gateway that aggregates multiple upstream MCP servers into a single FastMCP endpoint, configured via servers.json with support for tool subsetting, renaming, multi-instance routing, and pluggable authentication.-