MCPトンネルはリサーチプレビュー段階です。お試しいただくにはアクセスをリクエストしてください。
このガイドでは、トンネルスタックを単一ホスト上に強化されたコンテナとしてデプロイします。同じ構成を複数のホストに複製して可用性を確保できます。
以下が必要です。
tnl_...)を記録してください。手動プロビジョニングは常にConsoleで作成されたトンネルから始まります。fdrl_...)と組織IDを記録してください。openssl(1.1.1以降)も必要です。api.anthropic.com(443 TCP)およびトンネルエッジ(7844 TCPおよびUDP)へのアウトバウンドネットワーク接続。完全なネットワーク要件を参照してください。routesで設定するアドレスでホストから到達可能な状態で実行されている1つ以上のMCPサーバー。まだない場合は、サンプルサーバーを使用してください。テスト用に利用できるMCPサーバーがない場合は、この最小限のものを使用してください。
mkdir -p mcp-tunnel
cat > mcp-tunnel/hello_server.py <<'EOF'
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")
EOF以下のインストール手順ではmcp-tunnel/にcdし、対応するサービスとルートを追加する場所を示します。
このガイドでは、Docker Composeを使用した1つの参考アプローチを提供します。組織のセキュリティ要件を満たすように適応させる責任はお客様にあります。
このパスでは、ホストにOIDCアイデンティティプロバイダー(クラウドVMメタデータサーバーやSPIFFEなど)が必要です。ない場合は、代わりにプログラマティックアクセスなしタブを使用してください。
セットアップコンポーネントはWorkload Identity Federationを使用してトンネルトークンを取得し、CAとサーバー証明書を生成し、CAをAnthropicに登録します。
デプロイメントディレクトリを準備する
mkdir -p mcp-tunnel/{config,data}
cd mcp-tunnel
sudo chown 65532:65532 dataコンテナは非rootのUID 65532として実行され、data/への書き込みアクセスが必要です。
docker-compose.yamlを書く
composeファイルはイメージをSHA-256ダイジェストで固定し、すべてのコンテナを読み取り専用ファイルシステムで非rootとして実行し、すべてのLinuxケーパビリティを削除し、権限昇格を無効にします。
cat > docker-compose.yaml <<'EOF'
services:
setup:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:9d4c80593b559fc3ca3814866418744fa94858b02a4d4a4cc52d423e732ccc81
entrypoint: ["/setup"]
command:
- init
- --api-url=https://api.anthropic.com
- --output=dir:/data
- --token-version=1
environment:
- TUNNEL_ID
- ANTHROPIC_FEDERATION_RULE_ID
- ANTHROPIC_ORGANIZATION_ID
- ANTHROPIC_WORKSPACE_ID
- ANTHROPIC_IDENTITY_TOKEN
volumes:
- ./data:/data
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
profiles: ["setup"]
cloudflared:
image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
command: tunnel --no-autoupdate run --url http://localhost:8080
environment:
- TUNNEL_TOKEN
# プロキシのnetnsを共有し、localhost:8080で到達できるようにします。
network_mode: "service:mcp-proxy"
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"
mcp-proxy:
image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:9d4c80593b559fc3ca3814866418744fa94858b02a4d4a4cc52d423e732ccc81
volumes:
- ./config/mcp-proxy.yaml:/etc/mcp-gateway/config.yaml:ro
- ./data:/data:ro
restart: unless-stopped
user: "65532:65532"
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
stop_grace_period: 30s
logging:
options:
max-size: "10m"
max-file: "3"
EOFサンプルMCPサーバーを使用している場合は、サービスとして追加します。
cat >> docker-compose.yaml <<'EOF'
hello-mcp:
image: python:3.13-slim
working_dir: /app
volumes:
- ./hello_server.py:/app/hello_server.py:ro
command: sh -c "pip install --quiet mcp && python hello_server.py"
restart: unless-stopped
EOFトンネルをプロビジョニングする
識別子を設定します。セットアップコンポーネントにトンネルを作成させる場合はTUNNEL_IDを未設定のままにします。Consoleの既存のトンネルにアタッチする場合は設定します。
# export TUNNEL_ID=tnl_... # 既存のトンネルに接続する場合に設定します
export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000フェデレーションルールが組織のデフォルト以外のワークスペースにスコープされている場合は、ANTHROPIC_WORKSPACE_ID=wrkspc_...も設定してください。それ以外の場合、セットアップコンポーネントはデフォルトのワークスペースを使用します。自動作成されたトンネルはそのワークスペースに作成されます。
ANTHROPIC_IDENTITY_TOKENをこのホストのアイデンティティプロバイダーからのOIDC JWTに設定します。プロバイダー向けのWIFガイドに従って、発行者を登録し、ルールのサブジェクトを設定し、トークンを発行してください。ルールのオーディエンスは、トークン発行時にリクエストするオーディエンスと一致する必要があります。
セットアップコンポーネントを実行します。
docker compose run --rm setupsetup initはdata/に対して冪等です。再実行すると、そこにすでに保存されているトンネルIDとCAが再利用され、2つ目のトンネルが作成されることはありません。新しいCAが生成・登録されるのは、data/が空の場合またはTUNNEL_IDが変更された場合のみです。その場合、アクティブな証明書は2つまでという上限が適用されるため、両方のスロットが埋まっている場合は、先にConsoleで1つを失効させてください。
エラーが発生した場合は、セットアップコンポーネントの認証失敗を参照してください。
トンネルドメインを取得し、後の手順のためにエクスポートします。
export TUNNEL_DOMAIN=$(sudo cat data/tunnel-domain)
echo "$TUNNEL_DOMAIN"Workload Identity Federationトークンは短命(デフォルトで1時間)で自動的に期限切れになります。セットアップ完了後に失効させるものはありません。
プロキシ設定を書く
tunnel_domainは必須です。プロキシは、routesでサブドメインを検索する前に、受信ホスト名からドメインサフィックスを取り除くためにこれを使用します。routesはリストではなく、サブドメインからアップストリームURLへのフラットなマップです。
cat > config/mcp-proxy.yaml <<EOF
listen_addr: ":8080"
log_level: info
shutdown_timeout: 30s
tunnel_domain: ${TUNNEL_DOMAIN}
tls:
cert_file: /data/tls.crt
key_file: /data/tls.key
routes:
echo: http://hello-mcp:9000
EOFecho:ルートはサンプルMCPサーバーを対象としています。独自のルートに置き換える(または追加する)ことができます。利用可能なすべてのフィールドについては、プロキシ設定リファレンスを参照してください。
デプロイメントを開始する
export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
docker compose up -dcomposeファイルはデフォルト値なしでホスト環境からTUNNEL_TOKENを読み取るため、新しいシェルごとに、また再起動後にエクスポートを繰り返す必要があります。
複数VMのデプロイメントでは、mcp-tunnel/ディレクトリを各ホストにコピーし、TUNNEL_TOKENを設定して、docker compose up -dを実行します。プログラマティックフローではTUNNEL_TOKENは$(sudo cat data/tunnel-token)です。手動フローではConsoleからコピーした値です。同じトンネルトークンと証明書がすべてのレプリカで機能します。
Anthropic側からアップストリームMCPサーバーを呼び出してエンドツーエンドで検証します。トンネル経由のMCPサーバーを使用するを参照してください。サンプルMCPサーバーの場合、ルーティングされたURLはhttps://echo.<your-tunnel-domain>/mcpです。検証に失敗した場合は、トラブルシューティングを参照してください。
このセクションのコマンドは、mcp-tunnel/デプロイメントディレクトリ内から実行してください。
プログラマティックアクセスを使用する場合、setupサービスコマンドの--token-versionをインクリメントし、Workload Identity Federationの識別子を設定し、新しいOIDC JWTを発行して、セットアップコンポーネントを再実行します。
# docker-compose.yamlを編集し、setupサービスの
# --token-version引数の整数を増やします(例:--token-version=1を
# --token-version=2に)。値が変更されていない場合、
# setupバイナリはローテーションを拒否します。
# export TUNNEL_ID=tnl_... # インストール時に設定した場合のみ設定します
export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
# export ANTHROPIC_WORKSPACE_ID=wrkspc_... # ルールがワークスペーススコープの場合
# お使いの環境のWIFプロバイダーガイドに従ってANTHROPIC_IDENTITY_TOKENを
# 再発行します(インストール時から期限切れになっているはずです)。
export ANTHROPIC_IDENTITY_TOKEN=...
docker compose run --rm setup
export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
docker compose up -d cloudflared--token-version引数は、コマンドラインで渡すのではなくdocker-compose.yamlで編集されるため、新しい値がセットアップコンポーネントの今後の実行のために永続化されます。セットアップコンポーネントはWorkload Identity Federationで認証するため、失効させるAPIトークンはありません。
プログラマティックアクセスを使用しない場合は、Consoleのトンネル詳細ページでRotate tokenをクリックし、各ホストのTUNNEL_TOKEN環境変数を更新してcloudflaredを再起動します(docker compose up -d cloudflared)。
Rotate tokenをクリックすると、現在のトークンは即座に無効になります。その瞬間から、すべてのホストでTUNNEL_TOKENを更新してcloudflaredを再起動するまでの間、cloudflaredが再起動した(クラッシュ、ホストの再起動)ホストは再接続できません。ローテーション後は各ホストを速やかに更新してください。
有効期限を監視し、期限切れ前にサーバー証明書を更新する責任はお客様にあります。
プログラマティックアクセスを使用する場合:
docker compose run --rm setup renew-cert --output=dir:/dataCLI引数はsetupサービスのcommand(init引数)を置き換えますが、そのentrypointは保持されるため、これは/setup renew-cert --output=dir:/dataを実行します。
--renew-before=720hを渡すと、有効期間が30日以上残っている場合にコマンドが何もしないようになります。これにより、固定スケジュールで安全に実行できます。
プログラマティックアクセスを使用しない場合は、既存のCA(Consoleに登録されたCAは変更されません)で新しいサーバー証明書に署名し、data/tls.crtを置き換えます。新しいシェルから実行する場合は、先にTUNNEL_DOMAINを設定してください。
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どちらのフローでも、プロキシはtls.cert_fileをポーリングして自動的に再読み込みするため、再起動は不要です。
アップストリームMCPサーバーをManaged AgentまたはMessages APIにアタッチします。
強化ガイダンス、認証情報のローテーション、侵害対応。
接続、TLS、ルーティングの問題を診断します。
Was this page helpful?