MCP-Tunnel befinden sich in der Research Preview. Zugang anfordern, um sie auszuprobieren.
Das Anthropic Helm-Chart installiert den Tunnel-Stack als ein einzelnes Deployment und verbindet es mit deinem Tunnel: entweder einem, den der Setup-Hook des Charts für dich erstellt, oder einem bestehenden Tunnel, den du in der Console erstellt hast.
Du benötigst:
tnl_...). Die manuelle Bereitstellung beginnt immer mit einem in der Console erstellten Tunnel; du benötigst außerdem dessen Tunnel-Token und Tunnel-Domain.workspace:manage_tunnels.helm und kubectl deployen kannst. Der Tab Ohne programmatischen Zugriff verwendet außerdem openssl (1.1.1 oder neuer).api.anthropic.com (443 TCP) und zum Tunnel-Edge (7844 TCP und UDP). Siehe die vollständigen Netzwerkanforderungen.gateway.config.routes konfigurierst. Wenn du noch keinen hast, verwende den Beispielserver.Wenn du keinen MCP-Server zum Testen zur Verfügung hast, verwende diesen minimalen:
kubectl create namespace mcp-tunnel --dry-run=client -o yaml | kubectl apply -f -
kubectl -n mcp-tunnel apply -f - <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: hello-mcp-src
data:
hello_server.py: |
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")
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-mcp
spec:
replicas: 1
selector:
matchLabels: { app: hello-mcp }
template:
metadata:
labels: { app: hello-mcp }
spec:
containers:
- name: hello-mcp
image: python:3.13-slim
command: ["sh", "-c", "pip install --quiet mcp && python /app/hello_server.py"]
volumeMounts:
- { name: src, mountPath: /app }
ports:
- { containerPort: 9000 }
volumes:
- name: src
configMap: { name: hello-mcp-src }
---
apiVersion: v1
kind: Service
metadata:
name: hello-mcp
spec:
selector: { app: hello-mcp }
ports:
- { port: 9000, targetPort: 9000 }
EOFDie folgenden Installationsschritte weisen darauf hin, wo die entsprechende Route hinzugefügt werden muss.
Die Setup-Komponente tauscht das projizierte ServiceAccount-Token des Clusters über deine Federation-Regel aus, ruft das Tunnel-Token ab, generiert eine CA und ein Serverzertifikat und registriert die CA bei Anthropic. Ein täglicher CronJob erneuert das Serverzertifikat bei Bedarf, sodass du keine Secrets manuell handhaben musst.
Workload Identity Federation für den Cluster einrichten
Folge WIF mit Kubernetes verwenden, um den OIDC-Issuer deines Clusters zu registrieren und eine Federation-Regel zu erstellen. Die Setup-Komponente läuft unter ihrem eigenen ServiceAccount im Release-Namespace; der genaue Name folgt Helms fullname-Konvention. Für jeden Release-Namen außer mcp-tunnel führe daher helm template <release> ... | grep -A2 'kind: ServiceAccount' aus, um ihn zu bestätigen, bevor du die Regel erstellst. Der Rest dieses Leitfadens geht vom Release-Namen mcp-tunnel im Namespace mcp-tunnel aus, wobei der ServiceAccount mcp-tunnel-setup ist.
| Feld | Wert |
|---|---|
| Subject | system:serviceaccount:mcp-tunnel:mcp-tunnel-setup |
| Audience | api.anthropic.com (der Standard des Charts; ohne Schema) |
| Scope | workspace:manage_tunnels |
Die Standard-Audience des Charts ist api.anthropic.com ohne Schema, aber das Federation-Regel-Formular der Console schlägt https://api.anthropic.com vor. Die beiden müssen Byte für Byte übereinstimmen, sonst schlägt die Authentifizierung fehl. Setze entweder die Audience der Regel auf api.anthropic.com oder setze api.wif.audience in values.yaml auf https://api.anthropic.com.
Wenn sich der Tunnel in einem anderen Workspace als dem Standard-Workspace der Organisation befindet, füge außerdem den Service-Account der Regel als Mitglied dieses Workspace unter Settings > Workspaces hinzu (die Tunnels API autorisiert anhand der Workspace-Mitgliedschaften des Service-Accounts).
Notiere die ID der Regel (fdrl_...); du wirst sie als api.wif.federationRuleId setzen.
Der tägliche CronJob zur Zertifikatserneuerung verwendet einen separaten ServiceAccount (ebenfalls vom Helm-fullname abgeleitet), ruft aber nicht die Tunnels API auf; er erneuert das Zertifikat lokal und benötigt nur Kubernetes RBAC, das das Chart gewährt. Die Federation-Regel muss ihn nicht abdecken.
Die Standardwerte abrufen
helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 > values.yamlTunnel-Anbindung und Routen konfigurieren
Bearbeite values.yaml und setze die api.wif.*-Schlüssel mit der Federation-Regel-ID und der Organisations-ID sowie einen routes-Eintrag für jeden Upstream-MCP-Server:
api:
wif:
federationRuleId: "fdrl_..."
organizationId: "00000000-0000-0000-0000-000000000000"
# Set when the tunnel is in a non-default workspace and the
# rule's service account is a member of that workspace.
# workspaceId: "wrkspc_..."
tunnel:
# Leave empty to have the setup hook create a tunnel during install.
# Set to attach to an existing tunnel from the Console.
id: ""
# Increment to rotate the tunnel token on the next upgrade.
# See the "Rotate the tunnel token" section.
tokenVersion: "1"
gateway:
config:
routes:
docs: http://docs-mcp.internal:8080
search: http://search-mcp.internal:8080Mit diesen Routen erreicht Claude die Server unter docs.<your-tunnel-domain> und search.<your-tunnel-domain>. Einige verwaltete Kubernetes-Distributionen weisen den Service-CIDR außerhalb der standardmäßigen privaten Bereiche zu; wenn deine Routen auf Services im Cluster zeigen, füge hier gateway.config.upstream.allowed_ips gemäß Upstream-IP-Validierung hinzu.
Wenn du den Beispiel-MCP-Server verwendest, setze routes stattdessen auf echo: http://hello-mcp:9000.
Die gerenderten Manifeste überprüfen
Rendere das Chart und überprüfe die Ausgabe gemäß den Prüfpraktiken deiner Organisation:
helm template mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 \
-n mcp-tunnel \
-f values.yaml > rendered.yamlInstallieren
helm install mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 \
--namespace mcp-tunnel --create-namespace \
-f values.yamlDie Setup-Komponente läuft als Helm-Pre-Install-Hook-Job, daher blockiert helm install, bis sie abgeschlossen ist. Bei Erfolg löscht Helm den Job automatisch. Wenn helm install mit einem Hook-Fehler fehlschlägt, siehe Authentifizierungsfehler der Setup-Komponente.
Wenn tunnel.id leer ist, erstellt die Setup-Komponente den Tunnel in dem Workspace, auf den deine Federation-Regel abzielt (der Standard-Workspace der Organisation, sofern du nicht api.wif.workspaceId setzt), und speichert dessen ID und Domain im mcp-tunnel-Secret. Die Domain, die du für die Verifizierung benötigst, findest du auf der Detailseite des Tunnels in der Console unter Manage > MCP tunnels, oder lies sie aus dem Secret:
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dEin erneutes Ausführen der Setup-Komponente (bei Upgrades oder Token-Rotation) verwendet die in diesem Secret gespeicherte Tunnel-ID wieder; es wird nie ein zweiter Tunnel erstellt.
Die api.wif.*-Werte sind Bezeichner, keine Geheimnisse, daher stellt ihre Speicherung in Helm-Release-History-Secrets kein Risiko dar. Die sensiblen Daten im Ruhezustand sind das mcp-tunnel-Secret, das die Setup-Komponente erstellt und das das Tunnel-Token und die privaten TLS-Schlüssel enthält. Wende die Standardpraktiken deiner Organisation zum Schutz von Kubernetes-Secrets auf diesen Namespace an.
Verifiziere Ende-zu-Ende von Anthropics Seite aus: Verwende https://<route>.<your-tunnel-domain>/<path> in einer Managed-Agent-Sitzung oder einer Messages-API-Anfrage, wobei <route> ein Schlüssel aus gateway.config.routes ist und <path> der Pfad ist, unter dem der Upstream-MCP-Server bereitsteht. Mit dem Beispiel-MCP-Server ist das https://echo.<your-tunnel-domain>/mcp. Siehe Die getunnelten MCP-Server verwenden für die Anfrageformate.
Wenn das fehlschlägt, prüfe die Pod-Logs (kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxy und -c cloudflared) und konsultiere die Fehlerbehebung.
Ingress zum Proxy-Pod wird standardmäßig verweigert (networkPolicy.ingress.enabled: true). Um zusätzlich den Pod-Egress einzuschränken, setze networkPolicy.egress.enabled: true und fülle networkPolicy.egress.mcpServers mit Pod-Label-Selektoren oder CIDR-Bereichen, die deine Upstream-MCP-Server abdecken. Egress von cloudflared zum Tunnel-Edge wird separat über networkPolicy.egress.cloudflaredEgressCIDRs erlaubt.
Felder unter gateway.config.* werden an die Proxy-Konfigurationsdatei durchgereicht. Häufige Anpassungen umfassen upstream.allowed_ips, log_level und upstream.tls. Siehe die Referenz zur Proxy-Konfiguration für die vollständige Feldliste. Das Chart setzt immer listen_addr, tls.cert_file und tls.key_file; sie in gateway.config zu setzen hat keine Wirkung.
Standardmäßig projiziert das Chart ein Kubernetes-ServiceAccount-Token für die Setup-Komponente. Um ein Token von einem anderen Identity-Provider zu verwenden (wie SPIFFE, Vault oder einem Cloud-SDK-Sidecar), mounte es mit setup.extraVolumes und setup.extraVolumeMounts. Verweise dann mit api.wif.tokenFile auf den Mount-Pfad. Das Chart setzt ANTHROPIC_IDENTITY_TOKEN_FILE auf diesen Pfad, und die Setup-Komponente liest das Token von dort.
Übergib immer --version an helm upgrade, damit du nicht unerwartet ein neueres Chart abrufst.
Chart 2.0.0 verschiebt die Tunnel-ID von api.wif.tunnelId nach tunnel.id. Bearbeite vor dem Upgrade deine values.yaml: Verschiebe den tnl_...-Wert nach tunnel.id und entferne api.wif.tunnelId. tunnel.id nicht zu setzen ist sicher (die Setup-Komponente verwendet beim erneuten Ausführen die bereits im mcp-tunnel-Secret gespeicherte Tunnel-ID wieder), aber das explizite Verschieben hält deine values.yaml korrekt. Aktualisiere außerdem den Scope deiner Federation-Regel in der Console von org:manage_tunnels auf workspace:manage_tunnels.
Für routinemäßige Änderungen wie Routen, Replica-Anzahl oder NetworkPolicy:
helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 \
-n mcp-tunnel \
-f values.yamlPflege eine vollständige values.yaml, anstatt dich auf --reuse-values zu verlassen. Helms Deep-Merge-Verhalten kann gelöschte Routen stillschweigend nicht entfernen.
Mit programmatischem Zugriff erhöhe tunnel.tokenVersion in values.yaml und führe das Upgrade mit --set setup.force=true durch. Die Setup-Komponente wird bei Upgrades nur erneut ausgeführt, wenn dies erzwungen wird:
helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 \
-n mcp-tunnel \
-f values.yaml \
--set setup.force=trueDie Setup-Komponente authentifiziert sich mit Workload Identity Federation; es gibt kein API-Token, das widerrufen werden müsste.
Ohne programmatischen Zugriff klicke auf Rotate token auf der Tunnel-Detailseite in der Console und aktualisiere dann das mcp-tunnel-token-Secret:
kubectl -n mcp-tunnel create secret generic mcp-tunnel-token \
--from-literal=tunnel-token='eyJ...' --dry-run=client -o yaml | kubectl apply -f -
kubectl -n mcp-tunnel rollout restart deploy/mcp-tunnelDas Klicken auf Rotate token macht das aktuelle Token sofort ungültig. Bis das Secret aktualisiert und der Rollout abgeschlossen ist, kann sich kein Pod, der mit dem alten Token neu startet (Eviction, Node-Drain, OOM), wieder verbinden. Aktualisiere das Secret umgehend nach der Rotation; für strengere Verfügbarkeitsanforderungen verwende programmatischen Zugriff, damit das Chart die Rotation atomar durchführt.
Das Chart bietet Automatisierung, aber du bleibst dafür verantwortlich, den Ablauf zu überwachen und zu bestätigen, dass die Erneuerung abgeschlossen wird.
Mit programmatischem Zugriff erfolgt die Zertifikatserneuerung automatisch. Das Chart stellt einen CronJob bereit (benannt nach dem Helm-fullname mit dem Suffix -cert-renew), der täglich setup renew-cert ausführt (zu serverCert.cronSchedule, Standard 0 0 * * * UTC). Der Job ist ein No-op, es sei denn, das Zertifikat liegt innerhalb von serverCert.renewBefore vor dem Ablauf (Standard 30 Tage). Die Erneuerung erfolgt lokal: Der Job signiert ein neues Zertifikat mit der bereits im Secret gespeicherten CA, führt keine API-Aufrufe durch und benötigt nur das Kubernetes RBAC, das das Chart gewährt. Der Proxy lädt das Zertifikat per Hot-Reload aus dem Secret-Mount neu, sodass kein Deployment-Neustart erforderlich ist.
Ohne programmatischen Zugriff gibt es keinen CronJob. Signiere aus dem Verzeichnis mcp-tunnel/, das du nach der Installation behalten hast, ein neues Serverzertifikat mit der bestehenden CA (generiere die CA nicht neu):
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.ext
kubectl -n mcp-tunnel create secret generic mcp-tunnel-cert \
--from-file=tls.crt=data/tls.crt --from-file=tls.key=data/tls.key \
--dry-run=client -o yaml | kubectl apply -f -Der Proxy lädt das Zertifikat per Hot-Reload aus dem Secret-Mount neu.
Verbinde einen Upstream-MCP-Server mit einem Managed Agent oder der Messages API.
Härtungsempfehlungen, Rotation von Anmeldedaten und Reaktion auf Sicherheitsvorfälle.
Diagnostiziere Konnektivitäts-, TLS- und Routing-Probleme.
Was this page helpful?