Les tunnels MCP sont en aperçu de recherche. Demandez l'accès pour les essayer.
Le chart Helm d'Anthropic installe la pile de tunnel sous la forme d'un seul Deployment et l'attache au tunnel que vous avez créé dans la Console.
Vous avez besoin de :
tnl_...). Pour le provisionnement manuel, vous avez également besoin du jeton de tunnel et du domaine de tunnel obtenus à cette étape.org:manage_tunnels.helm et kubectl. L'onglet Sans accès programmatique utilise également openssl (version 1.1.1 ou ultérieure).api.anthropic.com (443 TCP) et le tunnel edge (7844 TCP et UDP). Consultez l'ensemble des exigences réseau.gateway.config.routes. Si vous n'en avez pas encore, utilisez le serveur d'exemple.Si vous n'avez pas de serveur MCP disponible pour vos tests, utilisez ce serveur minimal :
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 }
EOFLes étapes d'installation qui suivent indiquent où ajouter la route correspondante.
Vérifiez de bout en bout depuis le côté d'Anthropic : utilisez https://<route>.<your-tunnel-domain>/<path> dans une session Managed Agent ou une requête à l'API Messages, où <route> est une clé de gateway.config.routes et <path> est ce que le serveur MCP en amont sert à cet emplacement. Avec le serveur MCP d'exemple, il s'agit de https://echo.<your-tunnel-domain>/mcp. Consultez Utiliser les serveurs MCP tunnelisés pour les formats de requête.
En cas d'échec, consultez les logs du pod (kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxy et -c cloudflared) et reportez-vous à Dépannage.
Le trafic entrant vers le pod proxy est refusé par défaut (networkPolicy.ingress.enabled: true). Pour restreindre en plus le trafic sortant du pod, définissez networkPolicy.egress.enabled: true et renseignez networkPolicy.egress.mcpServers avec des sélecteurs de labels de pod ou des plages CIDR couvrant vos serveurs MCP en amont. Le trafic sortant de cloudflared vers le tunnel edge est autorisé séparément via networkPolicy.egress.cloudflaredEgressCIDRs.
Les champs sous gateway.config.* sont transmis au fichier de configuration du proxy. Les ajustements courants incluent upstream.allowed_ips, log_level et upstream.tls. Consultez la référence de configuration du proxy pour la liste complète des champs. Le chart définit toujours listen_addr, tls.cert_file et tls.key_file ; les définir dans gateway.config n'a aucun effet.
Par défaut, le chart projette un jeton ServiceAccount Kubernetes pour le composant de configuration. Pour utiliser un jeton provenant d'un autre fournisseur d'identité (tel que SPIFFE, Vault ou un sidecar de SDK cloud), montez-le avec setup.extraVolumes et setup.extraVolumeMounts. Pointez ensuite api.wif.tokenFile vers le chemin de montage. Le chart définit ANTHROPIC_IDENTITY_TOKEN_FILE sur ce chemin, et le composant de configuration lit le jeton à cet emplacement.
Passez toujours --version à helm upgrade afin de ne pas récupérer une version plus récente du chart de manière inattendue.
Pour les modifications courantes telles que les routes, le nombre de réplicas ou la 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.yamlMaintenez un fichier values.yaml complet plutôt que de vous appuyer sur --reuse-values. Le comportement de fusion profonde de Helm peut silencieusement échouer à supprimer les routes retirées.
Avec l'accès programmatique, incrémentez tunnel.tokenVersion dans values.yaml et effectuez la mise à niveau avec --set setup.force=true. Le composant de configuration ne se réexécute lors des mises à niveau que lorsqu'il est forcé :
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=trueLe composant de configuration s'authentifie avec Workload Identity Federation ; il n'y a pas de jeton d'API à révoquer.
Sans accès programmatique, cliquez sur Rotate token sur la page de détails du tunnel dans la Console, puis mettez à jour le 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-tunnelCliquer sur Rotate token invalide immédiatement le jeton actuel. Tant que le Secret n'est pas mis à jour et que le déploiement n'est pas terminé, tout pod qui redémarre avec l'ancien jeton (éviction, drainage de nœud, OOM) ne peut pas se reconnecter. Mettez à jour le Secret rapidement après la rotation ; pour des exigences de disponibilité plus strictes, utilisez l'accès programmatique afin que le chart gère la rotation de manière atomique.
Le chart fournit l'automatisation, mais vous restez responsable de la surveillance de l'expiration et de la confirmation que le renouvellement s'effectue correctement.
Avec l'accès programmatique, le renouvellement des certificats est automatique. Le chart déploie un CronJob (nommé d'après le fullname Helm, avec le suffixe -cert-renew) qui exécute setup renew-cert quotidiennement (à serverCert.cronSchedule, par défaut 0 0 * * * UTC). Le job est sans effet sauf si le certificat est à moins de serverCert.renewBefore de son expiration (30 jours par défaut). Le renouvellement est local : le job signe un nouveau certificat avec la CA déjà stockée dans le Secret, n'effectue aucun appel d'API et n'a besoin que du RBAC Kubernetes accordé par le chart. Le proxy recharge à chaud le certificat depuis le montage du Secret, donc aucun redémarrage du Deployment n'est nécessaire.
Sans accès programmatique, il n'y a pas de CronJob. Depuis le répertoire mcp-tunnel/ que vous avez conservé après l'installation, signez un nouveau certificat serveur avec la CA existante (ne régénérez pas 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 -Le proxy recharge à chaud le certificat depuis le montage du Secret.
Attachez un serveur MCP en amont à un Managed Agent ou à l'API Messages.
Conseils de durcissement, rotation des identifiants et réponse aux violations.
Diagnostiquez les problèmes de connectivité, de TLS et de routage.
Was this page helpful?