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 tunnel che hai creato nella Console.
Ti servono:
tnl_...). Per il provisioning manuale ti servono anche il token del tunnel e il dominio del tunnel ottenuti in quel passaggio.org:manage_tunnels.helm e kubectl. La scheda Senza accesso programmatico utilizza 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.
Verifica end-to-end dal lato di Anthropic: usa https://<route>.<your-tunnel-domain>/<path> in una sessione Managed Agent o in una richiesta alla Messages API, dove <route> è una chiave di gateway.config.routes e <path> è il percorso servito dal server MCP upstream. Con il server MCP di esempio, è https://echo.<your-tunnel-domain>/mcp. Consulta Usare i server MCP in tunnel per la struttura delle richieste.
Se la verifica fallisce, controlla i log del 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 anche l'egress del pod, imposta networkPolicy.egress.enabled: true e popola networkPolicy.egress.mcpServers con selettori di label dei pod o intervalli CIDR che coprono 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 direttamente 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. Quindi punta 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 evitare di scaricare inaspettatamente un chart più recente.
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 1.0.0 \
-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 riuscire a rimuovere le route eliminate.
Con l'accesso programmatico, incrementa tunnel.tokenVersion in values.yaml ed esegui l'upgrade con --set setup.force=true. Il componente di setup viene rieseguito durante gli upgrade solo quando forzato:
helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 1.0.0 \
-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, quindi 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 è 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ù stringenti, 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 che il rinnovo venga completato.
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 quotidianamente (secondo serverCert.cronSchedule, predefinito 0 0 * * * UTC). Il job è un no-op 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à archiviata nel Secret, non effettua chiamate API e necessita solo del RBAC di Kubernetes che il chart concede. 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.
Indicazioni per l'hardening, rotazione delle credenziali e risposta alle violazioni.
Diagnostica problemi di connettività, TLS e routing.
Was this page helpful?