kubernetools MCP Server

公式

AIエージェントが正確で最新のKubernetesマニフェストを作成できるよう、公式のKubernetes APIリファレンスを提供します。これにより、最新および過去3バージョンのKubernetesにわたって、現在の仕様に基づいた種類、フィールド、ネストされた型を検索できます。

ドキュメント

kubernetools/mcp-server

kubernetools MCP サーバーのコンテナイメージです。

レジストリ: ghcr.io/kubernetools/mcp-server

クイックスタート

匿名モード (ローカル利用)

認証は不要です。すべての接続は送信元 IP ごとに無料ティアの制限でレート制限されます。

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:latest

API キー認証を使用する場合

# 1. Create a key store file
echo '[{"key":"mykey","tier":"free"}]' > keys.json

# 2. Start the server
podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

設定

パラメータ環境変数説明
Kubernetes バージョンK8S_VERSIONSプリロードするバージョンのカンマ区切りリスト (例: v1.33,v1.34)。デフォルトは v1.33 です。
GitHub トークンGITHUB_TOKENパーソナルアクセストークン (追加スコープ不要)。オプション。GitHub API のレート制限を 60 回/時から 5,000 回/時に引き上げます。複数バージョンをロードする場合に推奨されます。
キーストアKEY_STORE_PATHAPI キー JSON ファイルへのパス (コンテナにマウントしてください)。省略すると、サーバーは匿名モードで実行されます。認証は不要で、すべての接続は送信元 IP ごとに無料ティアの制限でレート制限されます。
許可されたホストALLOWED_HOSTS受け入れる Host ヘッダー値のカンマ区切りリスト (例: mcp.example.com,mcp.example.com:443)。省略すると、ホスト検証は無効になります。これはローカル開発にのみ適しています。DNS リバインディング攻撃を防ぐため、本番環境では常に設定してください。
ブラウザリダイレクトBROWSER_REDIRECT_URLプレーンなブラウザの GET リクエストをリダイレクトする URL。MCP クライアントは Accept: text/event-stream で検出され、ブラウザは代わりにこの URL へ 307 を受け取ります。省略すると、ブラウザの GET は 400 を返します。
ログレベルRUST_LOGログレベルフィルタ (例: infodebugmcp=debug)。
ポート--publishサーバーはポート 3000 でリッスンします。

認証

API キーストア

キーストアは、起動時に一度だけロードされるフラットな JSON 配列です。

[
  { "key": "free-key-abc", "tier": "free" },
  { "key": "paid-key-xyz", "tier": "paid" }
]

すべてのリクエストには、Authorization ヘッダーにキーを含める必要があります。

Authorization: Bearer free-key-abc

有効なキーがないリクエストは 401 Unauthorized を受け取ります。

匿名モード

KEY_STORE_PATH が設定されていない場合、サーバーは認証なしで実行されます。すべての接続が受け入れられ、送信元 IP ごとに無料ティアの制限でレート制限されます。ローカルでの利用に便利ですが、公開しないでください。

ティアとレート制限

ティア制限
free10 リクエスト/分、バースト 10
paid約 1,000 リクエスト/秒、バースト 1,000 (実質的に無制限)

制限を超えたリクエストは 429 Too Many Requests を受け取ります。制限は IP ごとではなく、API キーごとに追跡されます。

MCP クライアントの接続

サーバーは MCP Streamable HTTP トランスポート を実装しています。エンドポイントは次のとおりです。

http://<host>:<port>/[?version=<k8s-version>]

version クエリパラメータで、セッションに使用する Kubernetes バージョンを選択します。省略すると、最初にロードされたバージョンが使用されます。不明なバージョンは 400 Bad Request を返します。

Claude Desktop

claude_desktop_config.json に以下を追加してください。

{
  "mcpServers": {
    "kubernetools": {
      "url": "http://localhost:3000/?version=v1.36",
      "headers": {
        "Authorization": "Bearer mykey"
      }
    }
  }
}

利用可能なツール

list_resources

軽量な検出 — リソースごとに 1 エントリを返し、(group, kind, api_version) でソートされます。kind 名を見つけるために最初に使用してください。

オプションのフィルタ: group (例: "apps""core")、api_version (例: "v1")。

get_resource

完全なリソース詳細 — フィールド、spec、status、リストフィールド — 1 回の呼び出しでマニフェストを作成するのに十分な情報です。必須: kind。オプション: groupapi_version (デフォルトは最新)。

null 以外の type_ref と空の sub_fields を持つフィールドは、get_type で掘り下げる必要があります。

get_type

get_resource 出力の type_ref を介して参照される単一の複合型を掘り下げます。必須: type_name (例: "Container""PodFailurePolicy")。

典型的なクエリフロー

list_resources                          → discover kind names and groups
  └─ get_resource(kind="Deployment")   → see all top-level fields + spec/status
       └─ get_type(type_name="...")    → drill into any complex type_ref

ヘルスチェック

ポート 3000 で GET /healthz

  • Kubernetes API ドキュメントのロード中は 503 Service Unavailable (ボディ: loading) を返します。
  • サーバーの準備が完了すると 200 OK (ボディ: ok) を返します。

このエンドポイントは認証とレート制限をバイパスします。

起動、準備状況、および生存プローブに使用します。

startupProbe:
  httpGet:
    path: /healthz
    port: 3000
  failureThreshold: 30   # allow up to 5 min for version loading
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /healthz
    port: 3000
livenessProbe:
  httpGet:
    path: /healthz
    port: 3000
  initialDelaySeconds: 10

エラーレスポンス

HTTP ステータス原因
307 Temporary RedirectBROWSER_REDIRECT_URL が設定されている場合のブラウザ GET
400 Bad RequestBROWSER_REDIRECT_URL が設定されていない場合のブラウザ GET、または version パラメータが起動時にロードされていないバージョンを指定している場合
401 UnauthorizedAuthorization: Bearer <key> ヘッダーがないか無効
429 Too Many Requestsキーのティアのレート制限を超過

MCP レベルのエラー (不明なツール名、必須引数の欠落、kind が見つからない) は、通常の 200 レスポンス内の MCP エラーコンテンツとして返されます。

複数の Kubernetes バージョン

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e GITHUB_TOKEN=ghp_... \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

ホスト検証を使用した本番環境セットアップ

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  -e ALLOWED_HOSTS=mcp.example.com,mcp.example.com:443 \
  -e BROWSER_REDIRECT_URL=https://example.com/docs \
  ghcr.io/kubernetools/mcp-server:latest

デバッグログ

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  -e RUST_LOG=debug \
  ghcr.io/kubernetools/mcp-server:latest

特定のリリースに固定

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:0.1.0

イメージ

registry.access.redhat.com/hi/core-runtime:2.42-openssl 上に構築 — 最小限の distroless glibc + OpenSSL ランタイム。シェルやパッケージマネージャは含まれていません。