MCPトンネルはリサーチプレビュー段階です。お試しいただくにはアクセスをリクエストしてください。
Anthropic Helmチャートは、トンネルスタックを単一の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以降のインストール手順では、対応するルートを追加する場所を示します。
セットアップコンポーネントは、クラスターのprojected ServiceAccountトークンをフェデレーションルールを通じて交換し、トンネルトークンを取得し、CAとサーバー証明書を生成し、CAをAnthropicに登録します。日次のCronJobが必要に応じてサーバー証明書を更新するため、シークレットを手動で扱う必要はありません。
クラスターのWorkload Identity Federationをセットアップする
KubernetesでWIFを使用するに従って、クラスターのOIDCイシュアーを登録し、フェデレーションルールを作成します。セットアップコンポーネントはリリースのnamespace内で独自のServiceAccountの下で実行されます。正確な名前はHelmのfullname規約に従うため、リリース名がmcp-tunnel以外の場合は、ルールを作成する前にhelm template <release> ... | grep -A2 'kind: ServiceAccount'を実行して確認してください。このガイドの残りの部分では、namespace mcp-tunnel内のリリース名mcp-tunnelを前提としており、ServiceAccountはmcp-tunnel-setupです。
| フィールド | 値 |
|---|---|
| Subject | system:serviceaccount:mcp-tunnel:mcp-tunnel-setup |
| Audience | api.anthropic.com(チャートのデフォルト。スキームなし) |
| Scope | workspace:manage_tunnels |
チャートのデフォルトのaudienceはスキームなしのapi.anthropic.comですが、Consoleのフェデレーションルールフォームはhttps://api.anthropic.comを提案します。この2つはバイト単位で一致する必要があり、一致しない場合は認証が失敗します。ルールのaudienceをapi.anthropic.comに設定するか、values.yamlのapi.wif.audienceを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を編集し、フェデレーションルールIDと組織IDを使用してapi.wif.*キーを設定し、各アップストリームMCPサーバーのroutesエントリを追加します。
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を対象とする場合は、アップストリームIP検証に従ってここにgateway.config.upstream.allowed_ipsを追加してください。
サンプル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セットアップコンポーネントはHelmのpre-installフックJobとして実行されるため、helm installは完了するまでブロックします。成功するとHelmはJobを自動的に削除します。helm installがフックエラーで失敗した場合は、セットアップコンポーネントの認証失敗を参照してください。
tunnel.idが空の場合、セットアップコンポーネントはフェデレーションルールが対象とするワークスペース(api.wif.workspaceIdを設定しない限り組織のデフォルトワークスペース)にトンネルを作成し、そのIDとドメインをmcp-tunnel Secretに保存します。検証に必要なドメインは、ConsoleのManage > MCP tunnelsにあるトンネルの詳細ページで確認するか、Secretから読み取ります。
kubectl -n mcp-tunnel get secret mcp-tunnel \
-o jsonpath='{.data.tunnel-domain}' | base64 -dセットアップコンポーネントを再実行する場合(アップグレードまたはトークンローテーション時)、このSecretに保存されているトンネルIDが再利用されます。2つ目のトンネルが作成されることはありません。
api.wif.*の値は識別子でありシークレットではないため、Helmのリリース履歴Secretに保存してもリスクはありません。保存時の機密データは、セットアップコンポーネントが作成するmcp-tunnel Secretであり、トンネルトークンとTLS秘密鍵を保持します。このnamespaceに対して、Kubernetes Secretを保護するための組織の標準プラクティスを適用してください。
Anthropic側からエンドツーエンドで検証します。Managed AgentセッションまたはMessages APIリクエストでhttps://<route>.<your-tunnel-domain>/<path>を使用します。ここで<route>はgateway.config.routesのキー、<path>はアップストリームMCPサーバーが提供するパスです。サンプルMCPサーバーの場合はhttps://echo.<your-tunnel-domain>/mcpです。リクエストの形式については、トンネル経由のMCPサーバーを使用するを参照してください。
失敗した場合は、Podのログ(kubectl -n mcp-tunnel logs deploy/mcp-tunnel -c mcp-proxyおよび-c cloudflared)を確認し、トラブルシューティングを参照してください。
プロキシPodへのイングレスはデフォルトで拒否されます(networkPolicy.ingress.enabled: true)。さらにPodのエグレスを制限するには、networkPolicy.egress.enabled: trueを設定し、アップストリームMCPサーバーをカバーするPodラベルセレクターまたはCIDR範囲をnetworkPolicy.egress.mcpServersに設定します。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をそのパスに設定し、セットアップコンポーネントはそこからトークンを読み取ります。
予期せず新しいチャートを取得しないように、helm upgradeには常に--versionを渡してください。
チャート2.0.0では、トンネルIDがapi.wif.tunnelIdからtunnel.idに移動しました。アップグレードする前に、values.yamlを編集してください。tnl_...の値をtunnel.idに移動し、api.wif.tunnelIdを削除します。tunnel.idを未設定のままにしても安全です(セットアップコンポーネントは再実行時にmcp-tunnel Secretにすでに保存されているトンネルIDを再利用します)が、明示的に移動することでvalues.yamlが正確に保たれます。また、Consoleでフェデレーションルールのスコープをorg:manage_tunnelsからworkspace:manage_tunnelsに更新してください。
ルート、レプリカ数、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--reuse-valuesに頼るのではなく、完全なvalues.yamlを維持してください。Helmのディープマージの動作により、削除されたルートが静かに削除されないことがあります。
プログラマティックアクセスを使用する場合、values.yamlのtunnel.tokenVersionをインクリメントし、--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トークンはありません。
プログラマティックアクセスを使用しない場合は、Consoleのトンネル詳細ページでRotate tokenをクリックし、mcp-tunnel-token Secretを更新します。
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-tunnelRotate tokenをクリックすると、現在のトークンは即座に無効になります。Secretが更新されロールアウトが完了するまで、古いトークンで再起動したPod(エビクション、ノードドレイン、OOM)は再接続できません。ローテーション後は速やかにSecretを更新してください。より厳格な可用性要件がある場合は、プログラマティックアクセスを使用して、チャートがローテーションをアトミックに処理するようにしてください。
チャートは自動化を提供しますが、有効期限の監視と更新の完了確認はユーザーの責任です。
プログラマティックアクセスを使用する場合、証明書の更新は自動です。チャートはCronJob(Helmのfullnameに-cert-renewサフィックスを付けた名前)をデプロイし、setup renew-certを毎日実行します(serverCert.cronScheduleで指定、デフォルトは0 0 * * * UTC)。このジョブは、証明書の有効期限がserverCert.renewBefore(デフォルト30日)以内でない限り何も行いません。更新はローカルで行われます。ジョブはSecretにすでに保存されているCAで新しい証明書に署名し、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?