I tunnel MCP sono in anteprima di ricerca. Richiedi l'accesso per provarli.
Il chart Helm di Anthropic installa lo stack del tunnel come un singolo Deployment e lo collega al tuo tunnel: uno creato per te dall'hook di setup del chart, oppure un tunnel esistente che hai creato nella Console.
Ti servono:
tnl_...). Il provisioning manuale parte sempre da un tunnel creato nella Console; ti serviranno anche il suo token del tunnel e il dominio del tunnel.workspace:manage_tunnels.helm e kubectl. La scheda Senza accesso programmatico usa anche openssl (1.1.1 o successivo).api.anthropic.com (443 TCP) e il tunnel edge (7844 TCP e UDP). Consulta i requisiti di rete completi.gateway.config.routes. Se non ne hai ancora uno, usa il server di esempio.Se non hai un server MCP disponibile per i test, usa questo server minimale:
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 }
EOFI passaggi di installazione che seguono indicano dove aggiungere la route corrispondente.
Il componente di setup scambia il token ServiceAccount proiettato del cluster tramite la tua regola di federazione, recupera il token del tunnel, genera una CA e un certificato server e registra la CA presso Anthropic. Un CronJob giornaliero rinnova il certificato server quando necessario, quindi non devi gestire alcun segreto manualmente.
Configura Workload Identity Federation per il cluster
Segui Usa WIF con Kubernetes per registrare l'issuer OIDC del tuo cluster e creare una regola di federazione. Il componente di setup viene eseguito con il proprio ServiceAccount nel namespace della release; il nome esatto segue la convenzione fullname di Helm, quindi per qualsiasi nome di release diverso da mcp-tunnel, esegui helm template <release> ... | grep -A2 'kind: ServiceAccount' per confermarlo prima di creare la regola. Il resto di questa guida presuppone il nome di release mcp-tunnel nel namespace mcp-tunnel, dove il ServiceAccount è mcp-tunnel-setup.
| Campo | Valore |
|---|---|
| Subject | system:serviceaccount:mcp-tunnel:mcp-tunnel-setup |
| Audience | api.anthropic.com (il valore predefinito del chart; senza schema) |
| Scope | workspace:manage_tunnels |
L'audience predefinita del chart è api.anthropic.com senza schema, ma il modulo della regola di federazione nella Console suggerisce https://api.anthropic.com. I due valori devono corrispondere byte per byte, altrimenti l'autenticazione fallisce. Imposta l'audience della regola su api.anthropic.com, oppure imposta api.wif.audience in values.yaml su https://api.anthropic.com.
Se il tunnel si trova in un workspace diverso da quello predefinito dell'organizzazione, aggiungi anche il service account della regola come membro di quel workspace in Settings > Workspaces (la Tunnels API autorizza in base alle appartenenze ai workspace del service account).
Annota l'ID della regola (fdrl_...); lo imposterai come api.wif.federationRuleId.
Il CronJob giornaliero di rinnovo del certificato usa un ServiceAccount separato (anch'esso derivato dal fullname di Helm) ma non chiama la Tunnels API; rinnova il certificato localmente e necessita solo del RBAC di Kubernetes, che il chart concede. La regola di federazione non deve coprirlo.
Recupera i valori predefiniti
helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 > values.yamlConfigura il collegamento al tunnel e le route
Modifica values.yaml e imposta le chiavi api.wif.* con l'ID della regola di federazione e l'ID dell'organizzazione, più una voce routes per ogni server MCP upstream:
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:8080Con queste route, Claude raggiunge i server su docs.<your-tunnel-domain> e search.<your-tunnel-domain>. Alcune distribuzioni Kubernetes gestite allocano il CIDR dei Service al di fuori degli intervalli privati standard; se le tue route puntano a Service interni al cluster, aggiungi qui gateway.config.upstream.allowed_ips secondo Validazione degli IP upstream.
Se stai usando il server MCP di esempio, imposta invece routes su echo: http://hello-mcp:9000.
Rivedi i manifest renderizzati
Renderizza il chart e rivedi l'output secondo le pratiche di verifica della tua organizzazione:
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.yamlInstalla
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.yamlIl componente di setup viene eseguito come Job hook pre-install di Helm, quindi helm install si blocca fino al suo completamento. In caso di successo Helm elimina automaticamente il Job. Se helm install fallisce con un errore di hook, consulta Errori di autenticazione del componente di setup.
Quando tunnel.id è vuoto, il componente di setup crea il tunnel nel workspace a cui punta la tua regola di federazione (il workspace predefinito dell'organizzazione, a meno che tu non imposti api.wif.workspaceId) e memorizza il suo ID e dominio nel Secret mcp-tunnel. Trova il dominio che ti servirà per la verifica nella pagina di dettaglio del tunnel nella Console sotto Manage > MCP tunnels, oppure leggilo dal Secret:
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dUna nuova esecuzione del componente di setup (durante gli aggiornamenti o la rotazione del token) riutilizza l'ID del tunnel memorizzato in questo Secret; non crea mai un secondo tunnel.
I valori api.wif.* sono identificatori, non segreti, quindi memorizzarli nei Secret della cronologia delle release di Helm non è un rischio. I dati sensibili a riposo sono nel Secret mcp-tunnel creato dal componente di setup, che contiene il token del tunnel e le chiavi private TLS. Applica a questo namespace le pratiche standard della tua organizzazione per la protezione dei Secret di Kubernetes.
Verifica end-to-end dal lato di Anthropic: usa https://<route>.<your-tunnel-domain>/<path> in una sessione di Managed Agent o in una richiesta alla Messages API, dove <route> è una chiave di gateway.config.routes e <path> è il percorso su cui il server MCP upstream risponde. Con il server MCP di esempio, è https://echo.<your-tunnel-domain>/mcp. Consulta Usa i server MCP attraverso il tunnel per la struttura delle richieste.
Se la verifica fallisce, controlla i log dei pod (kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxy e -c cloudflared) e consulta Risoluzione dei problemi.
L'ingress verso il pod del proxy è negato per impostazione predefinita (networkPolicy.ingress.enabled: true). Per limitare ulteriormente l'egress del pod, imposta networkPolicy.egress.enabled: true e popola networkPolicy.egress.mcpServers con selettori di label dei pod o intervalli CIDR che coprano i tuoi server MCP upstream. L'egress da cloudflared verso il tunnel edge è consentito separatamente tramite networkPolicy.egress.cloudflaredEgressCIDRs.
I campi sotto gateway.config.* vengono passati al file di configurazione del proxy. Le modifiche più comuni includono upstream.allowed_ips, log_level e upstream.tls. Consulta il riferimento alla configurazione del proxy per l'elenco completo dei campi. Il chart imposta sempre listen_addr, tls.cert_file e tls.key_file; impostarli in gateway.config non ha alcun effetto.
Per impostazione predefinita il chart proietta un token ServiceAccount di Kubernetes per il componente di setup. Per usare un token di un identity provider diverso (come SPIFFE, Vault o un sidecar cloud-SDK), montalo con setup.extraVolumes e setup.extraVolumeMounts. Poi fai puntare api.wif.tokenFile al percorso di mount. Il chart imposta ANTHROPIC_IDENTITY_TOKEN_FILE su quel percorso e il componente di setup legge il token da lì.
Passa sempre --version a helm upgrade per non scaricare inaspettatamente un chart più recente.
Il chart 2.0.0 sposta l'ID del tunnel da api.wif.tunnelId a tunnel.id. Prima di aggiornare, modifica il tuo values.yaml: sposta il valore tnl_... in tunnel.id e rimuovi api.wif.tunnelId. Lasciare tunnel.id non impostato è sicuro (il componente di setup riutilizza l'ID del tunnel già memorizzato nel Secret mcp-tunnel alla nuova esecuzione), ma lo spostamento esplicito mantiene accurato il tuo values.yaml. Aggiorna anche l'ambito della tua regola di federazione da org:manage_tunnels a workspace:manage_tunnels nella Console.
Per modifiche di routine come route, numero di repliche o 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.yamlMantieni un values.yaml completo invece di affidarti a --reuse-values. Il comportamento di deep-merge di Helm può silenziosamente non rimuovere le route eliminate.
Con l'accesso programmatico, incrementa tunnel.tokenVersion in values.yaml e aggiorna con --set setup.force=true. Il componente di setup viene rieseguito durante gli aggiornamenti solo se forzato:
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=trueIl componente di setup si autentica con Workload Identity Federation; non c'è alcun token API da revocare.
Senza accesso programmatico, fai clic su Rotate token nella pagina di dettaglio del tunnel nella Console, poi aggiorna il Secret mcp-tunnel-token:
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-tunnelFare clic su Rotate token invalida immediatamente il token corrente. Finché il Secret non viene aggiornato e il rollout non viene completato, qualsiasi pod che si riavvia con il vecchio token (eviction, node drain, OOM) non può riconnettersi. Aggiorna il Secret tempestivamente dopo la rotazione; per requisiti di disponibilità più rigorosi, usa l'accesso programmatico in modo che il chart gestisca la rotazione in modo atomico.
Il chart fornisce l'automazione, ma rimani responsabile del monitoraggio della scadenza e della conferma del completamento del rinnovo.
Con l'accesso programmatico, il rinnovo del certificato è automatico. Il chart distribuisce un CronJob (denominato in base al fullname di Helm, con suffisso -cert-renew) che esegue setup renew-cert ogni giorno (a serverCert.cronSchedule, predefinito 0 0 * * * UTC). Il job non ha effetto a meno che il certificato non sia entro serverCert.renewBefore dalla scadenza (predefinito 30 giorni). Il rinnovo è locale: il job firma un nuovo certificato con la CA già memorizzata nel Secret, non effettua chiamate API e necessita solo del RBAC di Kubernetes concesso dal chart. Il proxy ricarica a caldo il certificato dal mount del Secret, quindi non è necessario riavviare il Deployment.
Senza accesso programmatico non c'è alcun CronJob. Dall'interno della directory mcp-tunnel/ che hai conservato dopo l'installazione, firma un nuovo certificato server con la CA esistente (non rigenerare la CA):
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 -Il proxy ricarica a caldo il certificato dal mount del Secret.
Collega un server MCP upstream a un Managed Agent o alla Messages API.
Linee guida per l'hardening, rotazione delle credenziali e risposta alle violazioni.
Diagnostica problemi di connettività, TLS e routing.
Was this page helpful?