Nutanix Prism Central について
Nutanix Prism Central は、Nutanix 公式 v4 API MCP サーバーをマルチテナントの Streamable HTTP インターフェースとして提供するブリッジです。リクエストごとにテナント認証情報を受け取り、読み取り専用でツール呼び出しを中継します。
主な機能
- 01マルチテナント Streamable HTTP エンドポイント
- 02リクエスト単位の Prism Central 認証情報
- 03stdio 経由で公式サーバーに接続
- 04ツールの検索と呼び出し
- 05アイドル状態の子プロセスを終了
- 06読み取り専用の API 操作
活用シーン
- 01ゲートウェイ経由で複数の Prism Central テナントに接続
- 02API 操作と権限の検索
- 03読み取り専用の Nutanix API クエリ
MCP 対応
Nutanix 公式の Prism Central v4 API MCP サーバーを stdio の子プロセスとして起動し、ツール一覧と呼び出しを Streamable HTTP 経由で MCP クライアントに転送します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e PORT -e IDLE_EVICT_MS -e SPAWN_TIMEOUT_MS ghcr.io/wyre-ai/nutanix-mcp:v1.0.7PORTPublic listen port for the bridge (POST /mcp, GET /health)IDLE_EVICT_MSIdle tenant timeout before an upstream child is evicted (ms)SPAWN_TIMEOUT_MSHow long to wait for a spawned child to answer the MCP handshake (ms)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wyre-ai/nutanix-mcp:v1.0.7stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
nutanix-mcp
nutanix/ntnx-api-mcp-server(Nutanix 公式の Prism Central v4 API MCP サーバー)を介する、マルチテナント対応の Streamable HTTP ブリッジです。WYRE conduit ゲートウェイが、テナントごとの Nutanix 認証情報を HTTP ヘッダーとして転送できるように構築されています。
上流バージョンの固定: Nutanix のサーバーはテクニカルプレビューであり、ここではタグ
v0.8(Apache-2.0)に固定しています。上流バージョンの固定を更新するをご覧ください。
背景
上流サーバーはstdio 専用(nutanix-mcp serve-stdio のみがサーブモード)で、Prism Central の認証情報をプロセス起動時に環境変数から読み取るため、1プロセスにつき1テナントのみを扱います。一方、当社のゲートウェイはマルチテナントであり、すべてのリクエストに呼び出し元組織の認証情報が HTTP ヘッダーとして含まれます。ベンダーコンテナは、それらのヘッダーを上流サーバーが扱える形式に変換する必要があります。
上流サーバーにはプロキシ先となる HTTP モードがないため、このブリッジは各テナントの子プロセスとの間にstdio 経由の MCP クライアントセッションを保持し、Streamable HTTP 経由で再提供します。
:8080で待ち受け、POST /mcpとGET /healthを提供します。起動時には有効なCONDUIT_S2S_SECRETが必要です。すべての/mcpリクエストには、そのシークレットの有効なX-Gateway-S2S署名が必要です。- すべての
/mcpリクエストで、X-Nutanix-Pc-*認証情報ヘッダー(以下を参照)をチェックし、401 を返します。これらのヘッダーのみが Prism Central 認証情報のソースです。 - 認証情報の組み合わせごとに(ハッシュをキーとして)
nutanix-mcp serve-stdioの子プロセスを遅延起動し、テナントのPC_*環境変数を設定したうえで、stdio 経由で MCP クライアントを接続します。 - v2 SDK の
createMcpHandler(factory, { legacy: 'stateless' })を使い、/mcpで両方のプロトコル世代に対応します。2025年世代のinitializeハンドシェイクを行うクライアント(現在の conduit ゲートウェイ)と、最新の 2026-07-28 エンベロープクライアントをサポートします。tools/listとtools/callはテナントの子プロセスセッションに委譲されます。 - 60分間アイドル状態の子プロセスを削除します(
IDLE_EVICT_MS)。
ツール名は変更せずにそのまま渡します。上流サーバーの24個のツールは、20個の {namespace}_execute ツール(aiops、clustermgmt、datapolicies、dataprotection、files、iam、licensing、lifecycle、microseg、monitoring、multidomain、networking、objects、opsmgmt、prism、security、storage、tenancy、vmm、volumes)と、4個の検出ツール(listOperations、getOperationSchema、getCodeSample、getOperationPermissions)で構成されます。
v1 は意図的に読み取り専用
すべての子プロセスは READ_ONLY_MODE=true(上流のデフォルトでもあります)を設定して起動します。上流サーバーは、すべての GET 以外の操作を Prism Central に到達する前に拒否します。このブリッジの v1 は、フリート全体の方針として意図的に読み取り専用で提供されます。書き込みをサポートするには、設定を切り替えるのではなく、src/credentials.ts の credentialsToChildEnv() に対するレビュー済みのバージョン管理された変更が必要です。
認証情報の仕様
ゲートウェイは、すべての /mcp リクエストで以下のヘッダーを転送します。ブリッジはそれらを上流の子プロセスの環境変数に割り当てます。conduit の vendor-config は、この表と完全に一致させる必要があります。
| ヘッダー | 子プロセスの環境変数 | 必須 | 備考 |
|---|---|---|---|
X-Nutanix-Pc-Host | PC_HOST | はい | Prism Central の IP アドレスまたは FQDN |
X-Nutanix-Pc-Port | PC_PORT | いいえ | 上流のデフォルトは 9440 です。上流の仕様上、9440 以外のポートでは https:// ではなく http:// が使用されます |
X-Nutanix-Pc-Username | PC_USERNAME | パスワードがある場合 | Basic 認証の組み合わせ |
X-Nutanix-Pc-Password | PC_PASSWORD | ユーザー名がある場合 | Basic 認証の組み合わせ |
X-Nutanix-Pc-Api-Key | PC_API_KEY | 代替 | リクエストヘッダー X-ntnx-api-key として PC に送信されます。両方が設定されている場合、上流は Basic 認証よりもこちらを優先します |
X-Nutanix-Pc-Insecure | PC_INSECURE | いいえ | "true"/"false" — TLS 検証をスキップします(デフォルトは false) |
有効性のルール: pcHost が設定されており、かつ(apiKey が設定されている、または username と password が設定されている)こと。これ以外の場合は、JSON-RPC エラーボディとともに HTTP 401 を返します。
さらに、すべての子プロセスで READ_ONLY_MODE=true を強制します(上記を参照)。
API 仕様アーティファクト(ビルド時に組み込み)
上流プロジェクトは、稼働中の PC ではなく、YAML API 仕様アーティファクトからツール群を構築します。nutanix-mcp init はこれらをダウンロードします。また、PC の認証情報がない場合は、公開されている developers.nutanix.com 名前空間 API に対して latest_release モードで実行されます(PC へのアクセスは不要です。実証済みの名前空間数は 20 です)。Docker のビルドでは init を一度実行し、アーティファクトを /opt/nutanix-mcp/artifacts に組み込みます。このアーティファクトは、すべてのテナントの子プロセスによって読み取り専用で共有されます。これにより、次のようになります。
- 到達可能な PC がなくても、
tools/listと検出ツールは動作します。Prism Central にアクセスするのは{namespace}_executeの呼び出しだけです。 - アーティファクトのバージョンは、テナントの PC の正確なバージョンではなく、イメージのビルド時点での最新の公開リリースです(上流の
pc_compatibleモードでは、起動時に稼働中の PC へのアクセスが必要です)。読み取り専用の v1 サーフェスでは、アーティファクトを共有してテナントの起動を高速化できるため、これが適切な選択です。
設定
.env.example をコピーします。そのファイルでは CONDUIT_S2S_SECRET を空のままにし、実際に実行する環境でのみ実際の値を設定してください。
| 環境変数 | デフォルト | 説明 |
|---|---|---|
CONDUIT_S2S_SECRET | 空(起動を拒否) | サービス間シークレットです。空の場合、または既知のプレースホルダー(changeme、secret、replace-me、your-s2s-secret、replace-with-a-real-secret、その他のサンプル値)の場合、HTTP サーバーはエラーをログに記録して、ゼロ以外の終了コードで終了します。openssl rand -hex 32 で生成してください。これが設定されていないと Compose は起動しません。この値がログに記録されることはありません。 |
MCP_ALLOW_INSECURE_DEV | 未設定 | CONDUIT_S2S_SECRET なしで HTTP を起動する場合に限り、ローカル開発用として値を正確に 1 に設定します。プロセスは警告をログに記録し、X-Gateway-S2S を省略して、127.0.0.1 のみをバインドします。MCP_HTTP_HOST にループバック以外のアドレスが設定されている場合は起動を拒否します。既知のプレースホルダーシークレットが設定されている場合も起動を拒否します。 |
MCP_HTTP_HOST | 実際のシークレットが設定されている場合は 0.0.0.0 | バインドアドレスです。シークレットが設定されている場合、この値が尊重されます。未設定の場合も同様です(従来の 0.0.0.0 コンテナーへのバインド)。イメージと Compose は、コンテナー内で 0.0.0.0 を設定します。シークレットがなく、MCP_ALLOW_INSECURE_DEV=1 の場合は、127.0.0.1 のみをバインドします。 |
PORT | 8080 | 外部向けリッスンポートです(フォールバックは MCP_HTTP_PORT)。 |
NUTANIX_MCP_DIR | /opt/nutanix-mcp | 上流プロジェクトのチェックアウト先(venv とアーティファクト)。 |
NUTANIX_MCP_BIN | $NUTANIX_MCP_DIR/.venv/bin/nutanix-mcp | ブリッジが起動する上流プロジェクトのコンソールスクリプトです。 |
ARTIFACTS_DIR | $NUTANIX_MCP_DIR/artifacts | 組み込み済みの YAML API 仕様アーティファクトです。 |
CHILD_LOG_DIR | /tmp/nutanix-mcp-logs | 上流プロジェクトのプロセスごとのログファイル用の書き込み可能なディレクトリです。 |
IDLE_EVICT_MS | 3600000 | テナントのアイドルタイムアウト(60 分)です。 |
SPAWN_TIMEOUT_MS | 60000 | MCP ハンドシェイクへの子プロセスの応答を待つ最大時間です。 |
/health と /healthz は引き続き認証不要で、認証情報を読み取りません。
HTTP 認証
CONDUIT_S2S_SECRET が設定されている場合、すべての /mcp リクエストに X-Gateway-S2S を含める必要があります。検証は src/s2s-verify.ts の verifyS2sHeader で行われます。ヘッダー値は t=<unix seconds>,v1=<hex> です。ここで、hex は CONDUIT_S2S_SECRET をキーとして、文字列 t=<unix seconds> そのものを HMAC-SHA256 で署名した値(小文字の 16 進数 64 文字)です。タイムスタンプはサーバー時刻との差が 300 秒以内でなければなりません。ヘッダーがない場合、または無効な場合は、Prism Central の認証情報を読み取る前に HTTP 401 が返されます。
サーバープロセスで使用しているものと同じ CONDUIT_S2S_SECRET で署名してください。ローカル開発ではシェルにこの値を設定しているため、別の値を生成するのではなく、このリクエストでも同じ値を使用してください。
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H 'X-Nutanix-Pc-Host: pc.example.com' \
-H 'X-Nutanix-Pc-Api-Key: fake' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"dev","version":"0"}}}'
このブリッジはゲートウェイモードです。/mcp には X-Nutanix-Pc-Host と、X-Nutanix-Pc-Api-Key または X-Nutanix-Pc-Username と X-Nutanix-Pc-Password の両方も必要です。リクエストの認証情報は、これらのヘッダーのみを参照します。プロセス環境の PC_* 値はフォールバックとして使用されません。
ローカル開発
# 1. Get the upstream at the pinned tag with a venv + artifacts
git clone --branch v0.8 --depth 1 https://github.com/nutanix/ntnx-api-mcp-server ../ntnx-api-mcp-server
cd ../ntnx-api-mcp-server
uv venv .venv && uv pip install .
ARTIFACTS_DIR=$PWD/artifacts .venv/bin/nutanix-mcp init # no PC creds needed
cd -
# 2. Build and run the bridge against it
npm ci && npm run build && npm test
# HTTP refuses to start until CONDUIT_S2S_SECRET is a real value.
# Export it so this shell keeps the same secret for the server, the
# signing request above, and the Docker commands below.
export CONDUIT_S2S_SECRET="$(openssl rand -hex 32)"
NUTANIX_MCP_DIR=../ntnx-api-mcp-server node dist/index.js
# Alternative: local HTTP only, without a service-to-service secret (always
# binds 127.0.0.1). A non-loopback MCP_HTTP_HOST makes this exit. The empty
# assignment applies only to this process; the exported secret stays in the shell.
MCP_ALLOW_INSECURE_DEV=1 CONDUIT_S2S_SECRET= \
NUTANIX_MCP_DIR=../ntnx-api-mcp-server node dist/index.js
# 3. Smoke it (health is unauthenticated; /mcp needs X-Gateway-S2S — see above)
curl -s localhost:8080/health
または、イメージをビルドします(stdio のスモークテストを含むすべての処理がイメージに組み込まれます。このテストでは、serve-stdio が tools/list に応答できない場合、ビルドが失敗します)。イメージはコンテナ内で 0.0.0.0 をリッスンし、実際の CONDUIT_S2S_SECRET がないと起動しません。ポートはループバックで公開してください。Prism Central の認証情報は、各リクエストで X-Nutanix-Pc-* ヘッダーとして渡されます。
docker build --platform linux/amd64 -t ghcr.io/wyre-ai/nutanix-mcp:dev .
# Pass the exported secret. An empty value makes the container exit.
docker run --rm \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
ghcr.io/wyre-ai/nutanix-mcp:dev
CONDUIT_S2S_SECRET が設定されていない場合、Compose は起動しません。ゲートウェイサービスは 127.0.0.1:8080:8080 を公開し、PC_HOST、PC_USERNAME、PC_PASSWORD、PC_API_KEY、env_file は注入しません。後続の署名リクエストがコンテナと一致するよう、エクスポートしたシークレットを使用してください。
docker compose up
アップストリームの固定バージョンを更新する
アップストリームは、Dockerfile のレビュー済みタグ v0.8(NUTANIX_MCP_REF)に固定されています。main は使用しないでください(NSA MCP のガイダンス/フリートのセキュリティベースライン)。更新手順は次のとおりです。
- 現在の固定バージョンから新しいタグまでのアップストリームの差分(ツールの範囲、認証情報の処理、
READ_ONLY_MODEのセマンティクス)を確認します。 DockerfileのNUTANIX_MCP_REFと、この README のタグを変更します。- ローカルで
docker buildを実行します。ビルド時のスモークテストで、venv のエントリーポイントが実行できることと、stdio のツールが引き続き応答することを検証します(名前空間が変更された場合は、想定されるツール数を更新してください)。 feat:/fix:の PR としてマージし、semantic-release でバージョンを作成します。
ライセンス
Apache-2.0。バンドルされている ntnx-api-mcp-server は Nutanix による Apache-2.0 ライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。