Los túneles MCP están en vista previa de investigación. Solicita acceso para probarlos.
El chart de Helm de Anthropic instala el stack de túnel como un único Deployment y lo adjunta a tu túnel: uno que el hook de configuración del chart crea por ti, o un túnel existente que creaste en la Console.
Necesitas:
tnl_...). El aprovisionamiento manual siempre comienza desde un túnel creado en la Console; también necesitarás su token de túnel y el dominio del túnel.workspace:manage_tunnels.helm y kubectl. La pestaña Sin acceso programático también usa openssl (1.1.1 o posterior).api.anthropic.com (443 TCP) y el borde del túnel (7844 TCP y UDP). Consulta los requisitos de red completos.gateway.config.routes. Si aún no tienes uno, usa el servidor de ejemplo.Si no tienes un servidor MCP disponible para pruebas, usa este mínimo:
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 }
EOFLos pasos de instalación que siguen indican dónde agregar la ruta correspondiente.
El componente de configuración intercambia el token de ServiceAccount proyectado del clúster a través de tu regla de federación, obtiene el token del túnel, genera una CA y un certificado de servidor, y registra la CA con Anthropic. Un CronJob diario renueva el certificado de servidor según sea necesario, por lo que no manejas ningún secreto manualmente.
Configura Workload Identity Federation para el clúster
Sigue Usa WIF con Kubernetes para registrar el emisor OIDC de tu clúster y crear una regla de federación. El componente de configuración se ejecuta bajo su propio ServiceAccount en el namespace del release; el nombre exacto sigue la convención fullname de Helm, así que para cualquier nombre de release distinto de mcp-tunnel, ejecuta helm template <release> ... | grep -A2 'kind: ServiceAccount' para confirmarlo antes de crear la regla. El resto de esta guía asume el nombre de release mcp-tunnel en el namespace mcp-tunnel, donde el ServiceAccount es mcp-tunnel-setup.
| Campo | Valor |
|---|---|
| Subject | system:serviceaccount:mcp-tunnel:mcp-tunnel-setup |
| Audience | api.anthropic.com (el valor predeterminado del chart; sin esquema) |
| Scope | workspace:manage_tunnels |
La audiencia predeterminada del chart es api.anthropic.com sin esquema, pero el formulario de regla de federación de la Console sugiere https://api.anthropic.com. Ambos deben coincidir byte por byte o la autenticación falla. Establece la audiencia de la regla en api.anthropic.com, o establece api.wif.audience en values.yaml en https://api.anthropic.com.
Si el túnel está en un workspace distinto del predeterminado de la organización, agrega también la cuenta de servicio de la regla como miembro de ese workspace en Settings > Workspaces (la Tunnels API autoriza según las membresías de workspace de la cuenta de servicio).
Anota el ID de la regla (fdrl_...); lo establecerás como api.wif.federationRuleId.
El CronJob diario de renovación de certificados usa un ServiceAccount separado (también derivado del fullname de Helm) pero no llama a la Tunnels API; renueva el certificado localmente y solo necesita RBAC de Kubernetes, que el chart otorga. La regla de federación no necesita cubrirlo.
Obtén los valores predeterminados
helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 > values.yamlConfigura la vinculación del túnel y las rutas
Edita values.yaml y establece las claves api.wif.* con el ID de la regla de federación y el ID de la organización, además de una entrada en routes para cada servidor 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 estas rutas, Claude alcanza los servidores en docs.<your-tunnel-domain> y search.<your-tunnel-domain>. Algunas distribuciones gestionadas de Kubernetes asignan el CIDR de Service fuera de los rangos privados estándar; si tus rutas apuntan a Services dentro del clúster, agrega gateway.config.upstream.allowed_ips aquí según Validación de IP upstream.
Si estás usando el servidor MCP de ejemplo, establece routes en echo: http://hello-mcp:9000 en su lugar.
Revisa los manifiestos renderizados
Renderiza el chart y revisa la salida de acuerdo con las prácticas de verificación de tu organización:
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.yamlInstala
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.yamlEl componente de configuración se ejecuta como un Job de hook pre-install de Helm, por lo que helm install se bloquea hasta que se completa. Si tiene éxito, Helm elimina el Job automáticamente. Si helm install falla con un error de hook, consulta Fallos de autenticación del componente de configuración.
Cuando tunnel.id está vacío, el componente de configuración crea el túnel en el workspace al que apunta tu regla de federación (el workspace predeterminado de la organización a menos que establezcas api.wif.workspaceId) y almacena su ID y dominio en el Secret mcp-tunnel. Encuentra el dominio que necesitarás para la verificación en la página de detalle del túnel en la Console bajo Manage > MCP tunnels, o léelo desde el Secret:
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dVolver a ejecutar el componente de configuración (durante actualizaciones o rotación de token) reutiliza el ID del túnel almacenado en este Secret; nunca crea un segundo túnel.
Los valores api.wif.* son identificadores, no secretos, por lo que almacenarlos en los Secrets del historial de releases de Helm no es un riesgo. Los datos sensibles en reposo son el Secret mcp-tunnel que crea el componente de configuración, que contiene el token del túnel y las claves privadas TLS. Aplica las prácticas estándar de tu organización para proteger Secrets de Kubernetes a este namespace.
Verifica de extremo a extremo desde el lado de Anthropic: usa https://<route>.<your-tunnel-domain>/<path> en una sesión de Managed Agent o en una solicitud de la Messages API, donde <route> es una clave de gateway.config.routes y <path> es lo que sirva el servidor MCP upstream. Con el servidor MCP de ejemplo, eso es https://echo.<your-tunnel-domain>/mcp. Consulta Usa los servidores MCP tunelizados para las formas de las solicitudes.
Si eso falla, revisa los logs del pod (kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxy y -c cloudflared) y consulta Solución de problemas.
El ingreso al pod del proxy está denegado de forma predeterminada (networkPolicy.ingress.enabled: true). Para restringir adicionalmente el egreso del pod, establece networkPolicy.egress.enabled: true y completa networkPolicy.egress.mcpServers con selectores de etiquetas de pod o rangos CIDR que cubran tus servidores MCP upstream. El egreso desde cloudflared hacia el borde del túnel se permite por separado mediante networkPolicy.egress.cloudflaredEgressCIDRs.
Los campos bajo gateway.config.* se pasan directamente al archivo de configuración del proxy. Los ajustes comunes incluyen upstream.allowed_ips, log_level y upstream.tls. Consulta la referencia de configuración del proxy para la lista completa de campos. El chart siempre establece listen_addr, tls.cert_file y tls.key_file; establecerlos en gateway.config no tiene efecto.
De forma predeterminada, el chart proyecta un token de ServiceAccount de Kubernetes para el componente de configuración. Para usar un token de un proveedor de identidad diferente (como SPIFFE, Vault o un sidecar de SDK de nube), móntalo con setup.extraVolumes y setup.extraVolumeMounts. Luego apunta api.wif.tokenFile a la ruta de montaje. El chart establece ANTHROPIC_IDENTITY_TOKEN_FILE en esa ruta, y el componente de configuración lee el token desde allí.
Pasa siempre --version a helm upgrade para no descargar un chart más nuevo inesperadamente.
El chart 2.0.0 mueve el ID del túnel de api.wif.tunnelId a tunnel.id. Antes de actualizar, edita tu values.yaml: mueve el valor tnl_... a tunnel.id y elimina api.wif.tunnelId. Dejar tunnel.id sin establecer es seguro (el componente de configuración reutiliza el ID del túnel ya almacenado en el Secret mcp-tunnel al volver a ejecutarse), pero el movimiento explícito mantiene tu values.yaml preciso. También actualiza el alcance de tu regla de federación de org:manage_tunnels a workspace:manage_tunnels en la Console.
Para cambios rutinarios como rutas, número de réplicas 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.yamlMantén un values.yaml completo en lugar de depender de --reuse-values. El comportamiento de fusión profunda de Helm puede fallar silenciosamente al eliminar rutas borradas.
Con acceso programático, incrementa tunnel.tokenVersion en values.yaml y actualiza con --set setup.force=true. El componente de configuración solo se vuelve a ejecutar en actualizaciones cuando se fuerza:
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=trueEl componente de configuración se autentica con Workload Identity Federation; no hay ningún token de API que revocar.
Sin acceso programático, haz clic en Rotate token en la página de detalle del túnel en la Console, luego actualiza el 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-tunnelHacer clic en Rotate token invalida el token actual de inmediato. Hasta que el Secret se actualice y el despliegue se complete, cualquier pod que se reinicie con el token antiguo (desalojo, drenaje de nodo, OOM) no puede reconectarse. Actualiza el Secret rápidamente después de rotar; para requisitos de disponibilidad más estrictos, usa acceso programático para que el chart maneje la rotación de forma atómica.
El chart proporciona automatización, pero sigues siendo responsable de monitorear la expiración y confirmar que la renovación se complete.
Con acceso programático, la renovación de certificados es automática. El chart despliega un CronJob (nombrado según el fullname de Helm, con el sufijo -cert-renew) que ejecuta setup renew-cert diariamente (en serverCert.cronSchedule, predeterminado 0 0 * * * UTC). El job no tiene efecto a menos que el certificado esté dentro de serverCert.renewBefore de su expiración (predeterminado 30 días). La renovación es local: el job firma un certificado nuevo con la CA ya almacenada en el Secret, no hace llamadas a la API y solo necesita el RBAC de Kubernetes que el chart otorga. El proxy recarga en caliente el certificado desde el montaje del Secret, por lo que no se necesita reiniciar el Deployment.
Sin acceso programático no hay CronJob. Desde dentro del directorio mcp-tunnel/ que conservaste después de la instalación, firma un certificado de servidor nuevo con la CA existente (no regeneres 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 -El proxy recarga en caliente el certificado desde el montaje del Secret.
Adjunta un servidor MCP upstream a un Managed Agent o a la Messages API.
Guía de endurecimiento, rotación de credenciales y respuesta ante brechas.
Diagnostica problemas de conectividad, TLS y enrutamiento.
Was this page helpful?