MCP-Tunnel befinden sich in der Research Preview. Zugang anfordern, um sie auszuprobieren.
Diese Anleitung stellt den Tunnel-Stack als gehärtete Container auf einem einzelnen Host bereit. Dieselbe Konfiguration kann für Verfügbarkeit auf mehrere Hosts repliziert werden.
Du benötigst:
tnl_...). Die manuelle Bereitstellung beginnt immer mit einem in der Console erstellten Tunnel.fdrl_...) und deine Organisations-ID.openssl (1.1.1 oder neuer).api.anthropic.com (443 TCP) und zum Tunnel-Edge (7844 TCP und UDP). Siehe die vollständigen Netzwerkanforderungen.routes konfigurieren wirst. Wenn du noch keinen hast, verwende den Beispielserver.Wenn du keinen MCP-Server zum Testen zur Verfügung hast, verwende diesen minimalen:
mkdir -p mcp-tunnel
cat > mcp-tunnel/hello_server.py <<'EOF'
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("hello-server", host="0.0.0.0", port=9000)
@mcp.tool()
def hello(name: str = "world") -> str:
"""Say hello to someone."""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run(transport="streamable-http")
EOFDie folgenden Installationsschritte wechseln mit cd in mcp-tunnel/ und weisen darauf hin, wo der entsprechende Service und die Route hinzugefügt werden müssen.
Diese Anleitung bietet einen Referenzansatz mit Docker Compose. Du bist dafür verantwortlich, ihn an die Sicherheitsanforderungen deiner Organisation anzupassen.
Dieser Weg erfordert, dass der Host über einen OIDC-Identitätsanbieter verfügt (z. B. einen Cloud-VM-Metadatenserver oder SPIFFE). Falls nicht, verwende stattdessen den Tab Ohne programmatischen Zugriff.
Die Setup-Komponente verwendet Workload Identity Federation, um das Tunnel-Token abzurufen, eine CA und ein Serverzertifikat zu generieren und die CA bei Anthropic zu registrieren.
Bereite das Deployment-Verzeichnis vor
mkdir -p mcp-tunnel/{config,data}
cd mcp-tunnel
sudo chown 65532:65532 dataDie Container laufen als Nicht-Root-UID 65532 und benötigen Schreibzugriff auf data/.
Schreibe docker-compose.yaml
Die Compose-Datei pinnt Images per SHA-256-Digest, führt jeden Container als Nicht-Root mit einem schreibgeschützten Dateisystem aus, entfernt alle Linux-Capabilities und deaktiviert die Privilegien-Eskalation.
cat > docker-compose.yaml <<'EOF'
services:
setup:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:9d4c80593b559fc3ca3814866418744fa94858b02a4d4a4cc52d423e732ccc81
entrypoint: ["/setup"]
command:
- init
- --api-url=https://api.anthropic.com
- --output=dir:/data
- --token-version=1
environment:
- TUNNEL_ID
- ANTHROPIC_FEDERATION_RULE_ID
- ANTHROPIC_ORGANIZATION_ID
- ANTHROPIC_WORKSPACE_ID
- ANTHROPIC_IDENTITY_TOKEN
volumes:
- ./data:/data
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
profiles: ["setup"]
cloudflared:
image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
command: tunnel --no-autoupdate run --url http://localhost:8080
environment:
- TUNNEL_TOKEN
# Teile den netns des Proxys, damit localhost:8080 ihn erreicht.
network_mode: "service:mcp-proxy"
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"
mcp-proxy:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:9d4c80593b559fc3ca3814866418744fa94858b02a4d4a4cc52d423e732ccc81
volumes:
- ./config/mcp-proxy.yaml:/etc/mcp-gateway/config.yaml:ro
- ./data:/data:ro
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"
EOFWenn du den Beispiel-MCP-Server verwendest, füge ihn als Service hinzu:
cat >> docker-compose.yaml <<'EOF'
hello-mcp:
image: python:3.13-slim
working_dir: /app
volumes:
- ./hello_server.py:/app/hello_server.py:ro
command: sh -c "pip install --quiet mcp && python hello_server.py"
restart: unless-stopped
EOFStelle den Tunnel bereit
Setze die Bezeichner. Lass TUNNEL_ID ungesetzt, damit die Setup-Komponente einen Tunnel erstellt; setze sie, um dich mit einem bestehenden Tunnel aus der Console zu verbinden:
# export TUNNEL_ID=tnl_... # setze dies, um dich mit einem bestehenden Tunnel zu verbinden
export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000Wenn deine Föderationsregel auf einen anderen Workspace als den Standard-Workspace deiner Organisation beschränkt ist, setze zusätzlich ANTHROPIC_WORKSPACE_ID=wrkspc_...; andernfalls verwendet die Setup-Komponente den Standard-Workspace. Ein automatisch erstellter Tunnel wird in diesem Workspace erstellt.
Setze ANTHROPIC_IDENTITY_TOKEN auf ein OIDC-JWT vom Identitätsanbieter dieses Hosts. Folge der WIF-Anleitung für deinen Anbieter, um den Issuer zu registrieren, das Subject der Regel zu setzen und das Token auszustellen; die Audience der Regel muss mit der Audience übereinstimmen, die du beim Ausstellen anforderst.
Führe die Setup-Komponente aus:
docker compose run --rm setupsetup init ist idempotent über data/: Ein erneutes Ausführen verwendet die dort bereits gespeicherte Tunnel-ID und CA wieder und erstellt niemals einen zweiten Tunnel. Eine neue CA wird nur generiert und registriert, wenn data/ leer ist oder sich TUNNEL_ID geändert hat; in diesem Fall gilt die Obergrenze von zwei aktiven Zertifikaten, widerrufe also zuerst eines in der Console, wenn beide Plätze belegt sind.
Siehe Authentifizierungsfehler der Setup-Komponente, falls Fehler auftreten.
Rufe deine Tunnel-Domain ab und exportiere sie für spätere Schritte:
export TUNNEL_DOMAIN=$(sudo cat data/tunnel-domain)
echo "$TUNNEL_DOMAIN"Workload-Identity-Federation-Tokens sind kurzlebig (standardmäßig 1 Stunde) und laufen automatisch ab; nach Abschluss des Setups gibt es nichts zu widerrufen.
Schreibe die Proxy-Konfiguration
tunnel_domain ist erforderlich: Der Proxy verwendet sie, um das Domain-Suffix von eingehenden Hostnamen zu entfernen, bevor die Subdomain in routes nachgeschlagen wird. routes ist eine flache Zuordnung von Subdomain zu Upstream-URL, keine Liste.
cat > config/mcp-proxy.yaml <<EOF
listen_addr: ":8080"
log_level: info
shutdown_timeout: 30s
tunnel_domain: ${TUNNEL_DOMAIN}
tls:
cert_file: /data/tls.crt
key_file: /data/tls.key
routes:
echo: http://hello-mcp:9000
EOFDie echo:-Route zielt auf den Beispiel-MCP-Server; ersetze sie durch deine eigenen Routen (oder füge welche hinzu). Siehe die Referenz zur Proxy-Konfiguration für alle verfügbaren Felder.
Starte das Deployment
export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
docker compose up -dDie Compose-Datei liest TUNNEL_TOKEN aus der Host-Umgebung ohne Standardwert, daher muss der Export in jeder neuen Shell und nach einem Neustart wiederholt werden.
Für ein Multi-VM-Deployment kopiere das Verzeichnis mcp-tunnel/ auf jeden Host, setze TUNNEL_TOKEN und führe docker compose up -d aus. Im programmatischen Ablauf ist TUNNEL_TOKEN gleich $(sudo cat data/tunnel-token); im manuellen Ablauf ist es der Wert, den du aus der Console kopiert hast. Dasselbe Tunnel-Token und dieselben Zertifikate funktionieren über alle Replikate hinweg.
Verifiziere Ende-zu-Ende, indem du einen Upstream-MCP-Server von Anthropics Seite aus aufrufst: siehe Die getunnelten MCP-Server verwenden. Mit dem Beispiel-MCP-Server lautet die geroutete URL https://echo.<your-tunnel-domain>/mcp. Wenn die Verifizierung fehlschlägt, siehe Fehlerbehebung.
Führe die Befehle in diesem Abschnitt aus dem Deployment-Verzeichnis mcp-tunnel/ heraus aus.
Mit programmatischem Zugriff: Erhöhe --token-version im Befehl des setup-Service, setze die Workload-Identity-Federation-Bezeichner, stelle ein frisches OIDC-JWT aus und führe die Setup-Komponente erneut aus:
# Bearbeite docker-compose.yaml: Erhöhe die Ganzzahl im
# --token-version-Argument des setup-Service (zum Beispiel --token-version=1 zu
# --token-version=2). Das setup-Binary verweigert die Rotation, wenn sich der Wert
# nicht geändert hat.
# export TUNNEL_ID=tnl_... # nur setzen, wenn du sie bei der Installation gesetzt hast
export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
# export ANTHROPIC_WORKSPACE_ID=wrkspc_... # falls deine Regel Workspace-bezogen ist
# Stelle ANTHROPIC_IDENTITY_TOKEN gemäß dem WIF-Provider-Leitfaden für deine
# Umgebung neu aus (es ist seit der Installation abgelaufen).
export ANTHROPIC_IDENTITY_TOKEN=...
docker compose run --rm setup
export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
docker compose up -d cloudflaredDas Argument --token-version wird in docker-compose.yaml bearbeitet, anstatt es auf der Kommandozeile zu übergeben, damit der neue Wert für zukünftige Ausführungen der Setup-Komponente erhalten bleibt. Die Setup-Komponente authentifiziert sich mit Workload Identity Federation; es gibt kein API-Token zu widerrufen.
Ohne programmatischen Zugriff: Klicke auf Rotate token auf der Tunnel-Detailseite in der Console, aktualisiere dann die Umgebungsvariable TUNNEL_TOKEN auf jedem Host und starte cloudflared neu (docker compose up -d cloudflared).
Das Klicken auf Rotate token macht das aktuelle Token sofort ungültig. Zwischen diesem Moment und der Aktualisierung von TUNNEL_TOKEN auf jedem Host sowie dem Neustart von cloudflared kann sich kein Host, dessen cloudflared neu startet (Absturz, Host-Neustart), wieder verbinden. Aktualisiere jeden Host zeitnah nach der Rotation.
Du bist dafür verantwortlich, das Ablaufdatum zu überwachen und das Serverzertifikat vor dessen Ablauf zu erneuern.
Mit programmatischem Zugriff:
docker compose run --rm setup renew-cert --output=dir:/dataDie CLI-Argumente ersetzen das command des setup-Service (die init-Argumente), behalten aber dessen entrypoint bei, sodass dies /setup renew-cert --output=dir:/data ausführt.
Übergib --renew-before=720h, damit der Befehl zu einem No-op wird, wenn noch mehr als 30 Tage Gültigkeit verbleiben. Das macht es sicher, ihn nach einem festen Zeitplan auszuführen.
Ohne programmatischen Zugriff: Signiere ein neues Serverzertifikat mit deiner bestehenden CA (die in der Console registrierte CA ändert sich nicht) und ersetze data/tls.crt. Setze zuerst TUNNEL_DOMAIN, wenn du dies aus einer neuen Shell ausführst.
export TUNNEL_DOMAIN=YOUR_TUNNEL_DOMAIN_HERE
openssl req -new -key data/tls.key -out /tmp/server.csr \
-subj "/CN=${TUNNEL_DOMAIN}"
openssl x509 -req -in /tmp/server.csr \
-CA data/ca.crt -CAkey data/ca.key -CAcreateserial \
-out data/tls.crt -days 90 \
-extfile data/tls.extIn beiden Abläufen pollt der Proxy tls.cert_file und lädt es automatisch neu, sodass kein Neustart erforderlich ist.
Verbinde einen Upstream-MCP-Server mit einem Managed Agent oder der Messages API.
Härtungsempfehlungen, Rotation von Anmeldedaten und Reaktion auf Sicherheitsverletzungen.
Diagnostiziere Konnektivitäts-, TLS- und Routing-Probleme.
Was this page helpful?