mcpField
N
Nutanix Prism Central

Nutanix Prism Central

ローカル
github.comクラウド・インフラ02 週間前に更新

Nutanix Prism Central について

Nutanix Prism Central は、Nutanix 公式の Prism Central v4 API MCP サーバー向けマルチテナント HTTP ブリッジです。テナントごとの認証情報で上流の stdio プロセスを起動し、読み取り専用の操作を提供します。

主な機能

  1. 01テナントごとの上流 MCP セッション
  2. 02Streamable HTTP インターフェース
  3. 03Prism Central の読み取り専用操作
  4. 04認証ヘッダーの子プロセスへの割り当て
  5. 05アイドル状態のテナントプロセスの終了
  6. 06API 操作の検出ツール

活用シーン

  1. 01複数テナントの Prism Central データの参照
  2. 02HTTP ゲートウェイと stdio 専用上流サーバーの接続
  3. 03操作スキーマと権限の検出

MCP 対応

MCP ツールの一覧取得と呼び出しを Nutanix 公式の上流サーバーへ転送し、ツール名は変更しません。上流の stdio セッションを Streamable HTTP で提供し、読み取り専用モードを適用します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"wyre-technology-nutanix": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"PORT",
"-e",
"IDLE_EVICT_MS",
"-e",
"SPAWN_TIMEOUT_MS",
"ghcr.io/wyre-technology/nutanix-mcp:v1.0.0"
],
"env": {
"PORT": "<PORT>",
"IDLE_EVICT_MS": "<IDLE_EVICT_MS>",
"SPAWN_TIMEOUT_MS": "<SPAWN_TIMEOUT_MS>"
}
}
}
}
起動コマンドdocker run -i --rm -e PORT -e IDLE_EVICT_MS -e SPAWN_TIMEOUT_MS ghcr.io/wyre-technology/nutanix-mcp:v1.0.0
設定が必要な環境変数
PORTPublic 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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/wyre-technology/nutanix-mcp:v1.0.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

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 経由で再提供します。

  1. :8080 で待ち受け、POST /mcp と GET /health を提供します。起動時には有効な CONDUIT_S2S_SECRET が必要です。すべての /mcp リクエストには、そのシークレットの有効な X-Gateway-S2S 署名が必要です。
  2. すべての /mcp リクエストで、X-Nutanix-Pc-* 認証情報ヘッダー(以下を参照)をチェックし、401 を返します。これらのヘッダーのみが Prism Central 認証情報のソースです。
  3. 認証情報の組み合わせごとに(ハッシュをキーとして)nutanix-mcp serve-stdio の子プロセスを遅延起動し、テナントの PC_* 環境変数を設定したうえで、stdio 経由で MCP クライアントを接続します。
  4. v2 SDK の createMcpHandler(factory, { legacy: 'stateless' }) を使い、/mcp で両方のプロトコル世代に対応します。2025年世代の initialize ハンドシェイクを行うクライアント(現在の conduit ゲートウェイ)と、最新の 2026-07-28 エンベロープクライアントをサポートします。tools/list と tools/call はテナントの子プロセスセッションに委譲されます。
  5. 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-HostPC_HOSTはいPrism Central の IP アドレスまたは FQDN
X-Nutanix-Pc-PortPC_PORTいいえ上流のデフォルトは 9440 です。上流の仕様上、9440 以外のポートでは https:// ではなく http:// が使用されます
X-Nutanix-Pc-UsernamePC_USERNAMEパスワードがある場合Basic 認証の組み合わせ
X-Nutanix-Pc-PasswordPC_PASSWORDユーザー名がある場合Basic 認証の組み合わせ
X-Nutanix-Pc-Api-KeyPC_API_KEY代替リクエストヘッダー X-ntnx-api-key として PC に送信されます。両方が設定されている場合、上流は Basic 認証よりもこちらを優先します
X-Nutanix-Pc-InsecurePC_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 のみをバインドします。
PORT8080外部向けリッスンポートです(フォールバックは 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_MS3600000テナントのアイドルタイムアウト(60 分)です。
SPAWN_TIMEOUT_MS60000MCP ハンドシェイクへの子プロセスの応答を待つ最大時間です。

/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 のガイダンス/フリートのセキュリティベースライン)。更新手順は次のとおりです。

  1. 現在の固定バージョンから新しいタグまでのアップストリームの差分(ツールの範囲、認証情報の処理、READ_ONLY_MODE のセマンティクス)を確認します。
  2. Dockerfile の NUTANIX_MCP_REF と、この README のタグを変更します。
  3. ローカルで docker build を実行します。ビルド時のスモークテストで、venv のエントリーポイントが実行できることと、stdio のツールが引き続き応答することを検証します(名前空間が変更された場合は、想定されるツール数を更新してください)。
  4. feat:/fix: の PR としてマージし、semantic-release でバージョンを作成します。

ライセンス

Apache-2.0。バンドルされている ntnx-api-mcp-server は Nutanix による Apache-2.0 ライセンスです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。