Helm-чарт Anthropic устанавливает стек туннеля как единый Deployment и подключает его к вашему туннелю: либо к тому, который создаёт для вас хук настройки чарта, либо к существующему туннелю, созданному вами в Console.
Вам потребуется:
tnl_...). Ручная подготовка всегда начинается с туннеля, созданного в Console; вам также понадобятся его токен туннеля и домен туннеля.workspace:manage_tunnels.helm и kubectl. На вкладке Без программного доступа также используется openssl (версии 1.1.1 или новее).api.anthropic.com (443 TCP) и к границе туннеля (7844 TCP и UDP). См. полные сетевые требования.gateway.config.routes. Если у вас ещё нет такого сервера, используйте пример сервера.Если у вас нет MCP-сервера для тестирования, используйте этот минимальный вариант:
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 }
EOFВ следующих шагах установки указано, где добавить соответствующий маршрут.
Компонент настройки обменивает спроецированный токен ServiceAccount кластера через ваше правило федерации, получает токен туннеля, генерирует CA и серверный сертификат и регистрирует CA в Anthropic. Ежедневный CronJob обновляет серверный сертификат по мере необходимости, так что вам не нужно обрабатывать секреты вручную.
Настройте Workload Identity Federation для кластера
Следуйте инструкциям в разделе Использование WIF с Kubernetes, чтобы зарегистрировать OIDC-издателя вашего кластера и создать правило федерации. Компонент настройки выполняется под собственным ServiceAccount в пространстве имён релиза; точное имя следует соглашению Helm fullname, поэтому для любого имени релиза, отличного от mcp-tunnel, выполните helm template <release> ... | grep -A2 'kind: ServiceAccount', чтобы подтвердить его перед созданием правила. В остальной части этого руководства предполагается имя релиза mcp-tunnel в пространстве имён mcp-tunnel, где ServiceAccount — mcp-tunnel-setup.
| Поле | Значение |
|---|---|
| Subject | system:serviceaccount:mcp-tunnel:mcp-tunnel-setup |
| Audience | api.anthropic.com (значение по умолчанию в чарте; без схемы) |
| Scope | workspace:manage_tunnels |
Если туннель находится в рабочем пространстве, отличном от рабочего пространства организации по умолчанию, также добавьте сервисный аккаунт правила в качестве участника этого рабочего пространства в разделе Settings > Workspaces (Tunnels API выполняет авторизацию на основе членства сервисного аккаунта в рабочих пространствах).
Запишите идентификатор правила (fdrl_...); вы зададите его как api.wif.federationRuleId.
Получите значения по умолчанию
helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.2 > values.yamlНастройте подключение туннеля и маршруты
Отредактируйте values.yaml и задайте ключи api.wif.* с идентификатором правила федерации и идентификатором организации, а также запись routes для каждого вышестоящего MCP-сервера:
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:8080С этими маршрутами Claude обращается к серверам по адресам docs.<your-tunnel-domain> и search.<your-tunnel-domain>. Некоторые управляемые дистрибутивы Kubernetes выделяют Service CIDR за пределами стандартных приватных диапазонов; если ваши маршруты указывают на внутрикластерные Service, добавьте здесь gateway.config.upstream.allowed_ips согласно разделу Проверка IP-адресов вышестоящих серверов.
Просмотрите отрендеренные манифесты
Отрендерите чарт и просмотрите вывод в соответствии с практиками проверки, принятыми в вашей организации:
helm template mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.2 \
-n mcp-tunnel \
-f values.yaml > rendered.yamlУстановите
helm install mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.2 \
--namespace mcp-tunnel --create-namespace \
-f values.yamlКомпонент настройки выполняется как Job хука pre-install Helm, поэтому helm install блокируется до его завершения. При успехе Helm автоматически удаляет Job. Если helm install завершается с ошибкой хука, см. раздел Ошибки аутентификации компонента настройки.
Когда tunnel.id пуст, компонент настройки создаёт туннель в рабочем пространстве, на которое нацелено ваше правило федерации (рабочее пространство организации по умолчанию, если вы не задали api.wif.workspaceId), и сохраняет его идентификатор и домен в Secret mcp-tunnel. Найдите домен, который понадобится для проверки, на странице сведений о туннеле в Console в разделе Manage > MCP tunnels или прочитайте его из Secret:
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dПовторный запуск компонента настройки (во время обновлений или ротации токена) повторно использует идентификатор туннеля, сохранённый в этом Secret; второй туннель никогда не создаётся.
Выполните сквозную проверку со стороны Anthropic: используйте https://<route>.<your-tunnel-domain>/<path> в сеансе Managed Agent или в запросе Messages API, где <route> — ключ из gateway.config.routes, а <path> — то, что обслуживает вышестоящий MCP-сервер. С примером MCP-сервера это https://echo.<your-tunnel-domain>/mcp. Формы запросов см. в разделе Использование туннелированных MCP-серверов.
Если проверка не проходит, просмотрите логи пода (kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxy и -c cloudflared) и обратитесь к разделу Устранение неполадок.
Входящий трафик к поду прокси запрещён по умолчанию (networkPolicy.ingress.enabled: true). Чтобы дополнительно ограничить исходящий трафик пода, установите networkPolicy.egress.enabled: true и заполните networkPolicy.egress.mcpServers селекторами меток подов или диапазонами CIDR, охватывающими ваши вышестоящие MCP-серверы. Исходящий трафик от cloudflared к границе туннеля разрешается отдельно через networkPolicy.egress.cloudflaredEgressCIDRs.
Поля в gateway.config.* передаются в файл конфигурации прокси. Типичные настройки включают upstream.allowed_ips, log_level и upstream.tls. Полный список полей см. в справочнике по конфигурации прокси. Чарт всегда задаёт listen_addr, tls.cert_file и tls.key_file; их установка в gateway.config не имеет эффекта.
По умолчанию чарт проецирует токен Kubernetes ServiceAccount для компонента настройки. Чтобы использовать токен от другого поставщика идентификации (например, SPIFFE, Vault или сайдкара облачного SDK), смонтируйте его с помощью setup.extraVolumes и setup.extraVolumeMounts. Затем укажите в api.wif.tokenFile путь монтирования. Чарт устанавливает ANTHROPIC_IDENTITY_TOKEN_FILE в этот путь, и компонент настройки читает токен оттуда.
Всегда передавайте --version в helm upgrade, чтобы случайно не получить более новую версию чарта.
Чарт 2.0.0 перемещает идентификатор туннеля из api.wif.tunnelId в tunnel.id. Перед обновлением отредактируйте ваш values.yaml: переместите значение tnl_... в tunnel.id и удалите api.wif.tunnelId. Оставить tunnel.id незаданным безопасно (компонент настройки при повторном запуске повторно использует идентификатор туннеля, уже сохранённый в Secret mcp-tunnel), но явное перемещение сохраняет точность вашего values.yaml. Также обновите область действия вашего правила федерации с org:manage_tunnels на workspace:manage_tunnels в Console.
Для рутинных изменений, таких как маршруты, количество реплик или NetworkPolicy:
helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.2 \
-n mcp-tunnel \
-f values.yamlПри программном доступе увеличьте tunnel.tokenVersion в values.yaml и выполните обновление с --set setup.force=true. Компонент настройки повторно запускается при обновлениях только при принудительном запуске:
helm upgrade mcp-tunnel \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.2 \
-n mcp-tunnel \
-f values.yaml \
--set setup.force=trueКомпонент настройки аутентифицируется через Workload Identity Federation; токена API, который нужно отзывать, нет.
Без программного доступа нажмите Rotate token на странице сведений о туннеле в Console, затем обновите 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-tunnelЧарт предоставляет автоматизацию, но вы по-прежнему отвечаете за мониторинг срока действия и подтверждение успешного обновления.
При программном доступе обновление сертификата выполняется автоматически. Чарт развёртывает CronJob (названный по Helm fullname с суффиксом -cert-renew), который ежедневно выполняет setup renew-cert (по расписанию serverCert.cronSchedule, по умолчанию 0 0 * * * UTC). Задание ничего не делает, если до истечения срока действия сертификата остаётся больше, чем serverCert.renewBefore (по умолчанию 30 дней). Обновление выполняется локально: задание подписывает новый сертификат с помощью CA, уже сохранённого в Secret, не выполняет вызовов API и нуждается только в Kubernetes RBAC, который предоставляет чарт. Прокси выполняет горячую перезагрузку сертификата из смонтированного Secret, поэтому перезапуск Deployment не требуется.
Без программного доступа CronJob отсутствует. Из каталога mcp-tunnel/, который вы сохранили после установки, подпишите новый серверный сертификат существующим CA (не генерируйте 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 -Прокси выполняет горячую перезагрузку сертификата из смонтированного Secret.
Подключите вышестоящий MCP-сервер к Managed Agent или Messages API.
Рекомендации по усилению защиты, ротация учётных данных и реагирование на нарушения.
Диагностика проблем с подключением, TLS и маршрутизацией.
Was this page helpful?