mcpstead
mcpstead
MCP-Gateway
Ein Downstream-/mcp-Endpunkt, der als Frontend für viele Upstream-MCP-Server fungiert. Persistente Upstream-Verbindungen mit automatischer Wiederverbindung, Tool-Registry mit qualifizierten Namen, JSON- oder SSE-Antworten basierend auf dem Accept-Header des Clients, Authentifizierung pro Upstream sowie Prometheus-Metriken.
Installation
# 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
Schnelleinstieg
# 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.yamlVerweisen Sie dann einen beliebigen MCP-Client auf http://127.0.0.1:8766/mcp.
Docker
docker build -t mcpstead .
docker run --rm \
-p 8766:8766 \
-v "$PWD/config:/etc/mcpstead:ro" \
mcpsteadDas Dockerfile installiert die Anwendung von crates.io.
HTTP-API
Methode | Pfad | Zweck |
|
| MCP über HTTP JSON-RPC |
|
| gibt 405 zurück |
|
| beendet die Downstream-Sitzung |
|
| Upstream-Status, Tool-Anzahl, zuletzt gesehen, Wiederverbindungen |
|
| Prometheus-Textformat |
|
| Konfiguration ohne Neustart neu laden |
Einrichtung des MCP-Clients
Lokal, ohne Authentifizierung:
mcpstead:
url: http://127.0.0.1:8766/mcp
tools:
resources: false
prompts: falseBearer-Authentifizierung:
mcpstead:
url: http://127.0.0.1:8766/mcp
headers:
Authorization: Bearer ${MCPSTEAD_BEARER_TOKEN}
tools:
resources: false
prompts: falseTools erscheinen mit qualifizierten Namen – <server>__<tool> –, sodass mehrere Upstreams sich überschneidende Tool-Namen ohne Kollision bereitstellen können.
Authentifizierung
Downstream (Clients zu mcpstead)
Standardmäßig ohne Authentifizierung:
mcp:
auth:
mode: noneBearer-Authentifizierung:
mcp:
auth:
mode: bearerDas Token stammt aus einer Umgebungsvariablen:
export MCPSTEAD_BEARER_TOKEN='replace-with-strong-secret'
mcpstead --config ~/.config/mcpstead/config.yamlClients senden Authorization: Bearer <token>. Ein fehlendes oder falsches Token führt zu einem 401-Fehler. mcp.auth.bearer_token in der Konfiguration wird beim Start abgelehnt.
/health und /metrics bleiben unabhängig vom Authentifizierungsmodus offen – für Monitoring, ohne das Token preiszugeben.
Upstream (mcpstead zu MCP-Servern)
Pro Server in der servers-Liste. Drei Modi:
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 löst die benannte Umgebungsvariable beim Start und beim Neuladen der Konfiguration auf.
Konfiguration
Legen Sie den Konfigurationspfad mit --config <path> oder der Umgebungsvariablen MCPSTEAD_CONFIG fest.
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: infoHot-Reload
mcpstead lädt seine Konfiguration ohne Neustart neu bei:
SIGHUP (
systemctl reload mcpsteadoderkill -HUP <pid>)POST /-/reload(geschützt durch Bearer-Authentifizierung im Bearer-Modus)
Hot-Reload-fähig:
Upstream-Liste
Authentifizierung pro Upstream, Header, Quirks, Wiederverbindung, Tools, URL, Protokoll und TLS-Einstellungen
mcp.auth.modeundMCPSTEAD_BEARER_TOKENmetrics.enabled
Neustart erforderlich:
hostportlogging.levelmcp.session.*
Das Neuladen erfolgt nach dem Best-Effort-Prinzip. Eine fehlerhafte Konfiguration wird abgelehnt und ignoriert; die laufende Konfiguration bleibt bestehen. Überprüfen Sie die Protokolle und mcpstead_config_reloads_total{result="error"} auf Fehler.
Konfigurationsschlüssel für MCP-Sitzungen
mcp.session.idle_ttl_seconds- inaktive Sitzungen nach dieser Anzahl von Sekunden entfernen (Standard3600)mcp.session.gc_interval_seconds- GC-Intervall für inaktive Sitzungen (Standard60)mcp.session.shutdown_grace_seconds- maximale Zeit für den Abschluss des Herunterfahrens (Standard5)
Konfigurationsschlüssel pro Upstream
name- erforderlich, wird als Tool-Präfix verwendeturl- erforderlich, MCP-Endpunktprotocol-streamable | sse | auto(Standardauto)required- Start blockieren, wenn der Upstream nicht initialisiert werden kann (Standardfalse)auth-none,bearer(mittoken_env) oderheaders-Mapreconnect.max_attempts-0= unendlich (Standard)reconnect.backoff_base_ms/backoff_max_ms- Grenzen für exponentielles Backofftools.ttl_seconds- zwischengespeichertetools/listnach diesem Intervall aktualisierentls_skip_verify- TLS-Zertifikatsprüfung für diesen Upstream deaktivieren (Standardfalse, nur für vertrauenswürdige lokale Netzwerke verwenden)quirks.normalize_sse_events-event:-Zeilen aus Upstream-SSE-Antworten entfernenquirks.inject_accept_header- den an den Upstream gesendeten Accept-Header überschreiben
Beobachtbarkeit
Metriken
/metrics stellt Zähler, Gauges und Histogramme im Prometheus-Format bereit. Die Kardinalität der Labels geht von einer kleinen, begrenzten Menge an Upstreams und Tools aus; Tool-Call-Serien sind nach (server, tool) indiziert.
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="..."}Scrape-Konfiguration
- job_name: mcpstead
metrics_path: /metrics
static_configs:
- targets: ['mcpstead:8766']Gesundheitsprüfung
curl http://127.0.0.1:8766/healthGibt JSON zurück: Verbindungsstatus pro Upstream, Tool-Anzahl, letzter erfolgreicher Kontakt, Anzahl der Wiederverbindungen, letzter Fehler.
Fehlerbehebung
Liste aller Tools ist leer - mindestens ein Upstream konnte nicht
initialisiertwerden. Überprüfen Sie/healthauf den Status pro Server; prüfen Sie die Upstream-URL, Authentifizierung und Erreichbarkeit.Sporadische
SSE parse failed- der Upstream sendet einen SSE-Dialekt, den mcpstead nicht erkennt. Versuchen Siequirks.normalize_sse_events: truefür diesen Server oder setzen Siequirks.inject_accept_header: 'application/json', um JSON zu erzwingen.tools/callgibt Authentifizierungsfehler zurück - der Upstream hat das Bearer-Token abgelehnt. Bestätigen Sie, dasstoken_envbeim Start in den richtigen Wert aufgelöst wird; prüfen Sie den erwarteten Headernamen des Upstreams.TLS-Handshake-Fehler bei einem Upstream mit selbstsigniertem Zertifikat - setzen Sie
tls_skip_verify: truefür diesen Server. Nur in vertrauenswürdigen lokalen Netzwerken sicher.401 von
/mcpim Bearer-Modus - Client sendet kein oder ein falschesAuthorization: Bearer <token>. Überprüfen Sie, obMCPSTEAD_BEARER_TOKENmit dem übereinstimmt, was der Client sendet.Upstream wird in
/healthwiederholt rot - prüfen Siemcpstead_upstream_reconnects_totalundmcpstead_upstream_last_seen_seconds. Passen Siereconnect.backoff_max_msan, falls der Upstream eine längere Wiederherstellungszeit benötigt.
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.-