Туннели MCP находятся в стадии исследовательской предварительной версии. Запросите доступ, чтобы попробовать их.
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 |
Аудитория по умолчанию в чарте — api.anthropic.com без схемы, но форма правила федерации в Console предлагает https://api.anthropic.com. Эти два значения должны совпадать побайтово, иначе аутентификация завершится неудачей. Либо установите аудиторию правила в api.anthropic.com, либо установите api.wif.audience в values.yaml в https://api.anthropic.com.
Если туннель находится в рабочем пространстве, отличном от пространства по умолчанию организации, также добавьте сервисный аккаунт правила в качестве участника этого рабочего пространства в разделе Settings > Workspaces (Tunnels API выполняет авторизацию на основе членства сервисного аккаунта в рабочих пространствах).
Запишите ID правила (fdrl_...); вы укажете его как api.wif.federationRuleId.
Ежедневный CronJob обновления сертификата использует отдельный ServiceAccount (также производный от Helm fullname), но не вызывает Tunnels API; он обновляет сертификат локально и нуждается только в Kubernetes RBAC, который предоставляет чарт. Правило федерации не должно его охватывать.
Получите значения по умолчанию
helm show values \
oci://us-docker.pkg.dev/anthropic-public-registry/charts/mcp-tunnel \
--version 2.0.1 > values.yamlНастройте подключение туннеля и маршруты
Отредактируйте values.yaml и задайте ключи api.wif.* с ID правила федерации и ID организации, а также запись 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 за пределами стандартных частных диапазонов; если ваши маршруты нацелены на Services внутри кластера, добавьте здесь gateway.config.upstream.allowed_ips согласно разделу Проверка IP вышестоящих серверов.
Если вы используете пример сервера MCP, вместо этого установите routes в echo: http://hello-mcp:9000.
Просмотрите сгенерированные манифесты
Сгенерируйте чарт и просмотрите результат в соответствии с практиками проверки вашей организации:
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.yamlУстановите
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.yamlКомпонент настройки запускается как Job хука Helm pre-install, поэтому helm install блокируется до его завершения. При успехе Helm автоматически удаляет Job. Если helm install завершается с ошибкой хука, см. Сбои аутентификации компонента настройки.
Когда tunnel.id пуст, компонент настройки создает туннель в рабочем пространстве, на которое нацелено ваше правило федерации (рабочее пространство по умолчанию организации, если вы не задали api.wif.workspaceId), и сохраняет его ID и домен в Secret mcp-tunnel. Найдите домен, который понадобится вам для проверки, на странице сведений о туннеле в Console в разделе Manage > MCP tunnels или прочитайте его из Secret:
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dПовторный запуск компонента настройки (во время обновлений или ротации токена) повторно использует ID туннеля, сохраненный в этом Secret; он никогда не создает второй туннель.
Значения api.wif.* — это идентификаторы, а не секреты, поэтому их хранение в Secrets истории релизов Helm не представляет риска. Конфиденциальные данные в состоянии покоя — это Secret mcp-tunnel, который создает компонент настройки и который содержит токен туннеля и закрытые ключи TLS. Применяйте стандартные практики вашей организации по защите Kubernetes Secrets к этому пространству имен.
Проверьте сквозную работу со стороны 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 или sidecar облачного SDK), смонтируйте его с помощью setup.extraVolumes и setup.extraVolumeMounts. Затем укажите api.wif.tokenFile на путь монтирования. Чарт устанавливает ANTHROPIC_IDENTITY_TOKEN_FILE в этот путь, и компонент настройки читает токен оттуда.
Всегда передавайте --version в helm upgrade, чтобы случайно не получить более новый чарт.
Чарт 2.0.0 перемещает ID туннеля из api.wif.tunnelId в tunnel.id. Перед обновлением отредактируйте ваш values.yaml: переместите значение tnl_... в tunnel.id и удалите api.wif.tunnelId. Оставить tunnel.id незаданным безопасно (компонент настройки повторно использует 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.1 \
-n mcp-tunnel \
-f values.yamlПоддерживайте полный values.yaml, а не полагайтесь на --reuse-values. Поведение глубокого слияния Helm может незаметно не удалить удаленные маршруты.
При программном доступе увеличьте 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.1 \
-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Нажатие Rotate token немедленно делает текущий токен недействительным. Пока Secret не обновлен и развертывание не завершено, любой под, который перезапускается со старым токеном (вытеснение, дренаж узла, OOM), не сможет переподключиться. Обновите Secret сразу после ротации; для более строгих требований к доступности используйте программный доступ, чтобы чарт выполнял ротацию атомарно.
Чарт предоставляет автоматизацию, но вы остаетесь ответственными за мониторинг истечения срока действия и подтверждение завершения обновления.
При программном доступе обновление сертификата происходит автоматически. Чарт развертывает 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?