mcpField
M
Mcp Kubernetes Ro

Mcp Kubernetes Ro

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

Mcp Kubernetes Ro について

mcp-kubernetes-ro は、AI アシスタントに Kubernetes クラスターの読み取り専用アクセスを提供する MCP サーバーです。リソース、Pod ログ、API リソースの確認に対応します。kubectl バイナリは不要で、ローカルの kubeconfig を利用します。Secret の値はツール出力から除外され、破壊的な操作は行えません。

主な機能

  1. 01Kubernetes リソースの一覧表示と詳細取得
  2. 02grep や時間による絞り込みを含む Pod ログの取得
  3. 03API リソースとコンテキストの検出
  4. 04Base64 のエンコードとデコード
  5. 05Secret など特定リソースへのアクセス制限

活用シーン

  1. 01失敗している Pod の調査を AI アシスタントで支援する
  2. 02書き込み権限を与えずにクラスターの状態を確認する
  3. 03ノードと Pod の CPU・メモリ使用量を確認する

MCP 対応

本プロジェクトは読み取り専用の Kubernetes 照会ツールを MCP クライアントに公開する MCP サーバーです。リソース一覧、ログ取得、メトリクス取得を提供します。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

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

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

詳細

Kubernetes 読み取り専用 MCP サーバー

Github Downloads

Kubernetes 読み取り専用 MCP サーバー mcp-kubernetes-ro は、AI アシスタントに Kubernetes クラスターへの読み取り専用アクセスを提供する Model Context Protocol (MCP) サーバーです。AI モデルはリソースの一覧表示、リソースの詳細取得、Pod ログの取得、API リソースの検出、Base64 のエンコード/デコードを実行できます。これらすべてを、読み取り専用アクセスによるセキュリティを維持しながら行えます。

このサーバーはローカルの kubectl 設定を利用し(kubectl のインストールも不要です)、Kubernetes クラスターへの安全な読み取り専用インターフェースを提供します。破壊的な操作を防ぎながら、クラスターの包括的な検査とトラブルシューティングを可能にします。

特長

  • kubectl は不要です:MCP サーバーは、Kubernetes クラスターへの接続にローカルの kubectl 設定を使用しますが、バイナリは使用しません。そのため、マシンに kubectl がインストールされていなくても動作します。
  • リソースの一覧表示:ラベル、フィールド、ネームスペースによる任意のフィルタリングを指定して、Kubernetes リソースを種類別に一覧表示できます
  • リソースの詳細:特定の Kubernetes リソースの詳細情報を取得できます
  • Pod ログ:grep パターン、時間によるフィルタリング、前回のログなど、高度なフィルタリングオプションを指定して Pod ログを取得できます
  • コンテナの検出:Pod 内のコンテナを一覧表示し、対象を絞ったログアクセスを行えます
  • API の検出:利用可能な Kubernetes API リソースとその機能を検出できます
  • Base64 ユーティリティ:Kubernetes の Secret や設定向けに、Base64 データをエンコードおよびデコードできます
  • 複数のトランスポートモード:stdio、Server-Sent Events(SSE)、ステートレスな Streamable HTTP 通信に対応しています
  • 読み取り専用のセキュリティ:検査機能を完全に維持しながら、破壊的な操作をすべて防止します
  • リソースのアクセス制御:特定の Kubernetes リソース種類(例:Secret)へのアクセスを無効にし、AI エージェントが機密データを照会できないようにします
  • Secret の値は会話に表示されません:Secret の値はツールの出力に表示されません。エージェントが値を必要とする場合、ファイルに直接書き込む(stdio)か、マシンだけが保持するキーで暗号化して配信します(リモートトランスポート)。Secret の値を参照してください
  • ネームスペースのサポート:特定のネームスペースまたはクラスター全体のリソースを操作できます
  • 高度なフィルタリング:ラベルセレクター、フィールドセレクター、ページネーションに対応しています
  • コマンドごとのコンテキスト:個々のコマンドに異なる Kubernetes コンテキストを指定できます
  • 環境変数のサポート:KUBECONFIG 環境変数を自動的に検出します
  • ポートフォワーディング(オプトイン):デバッグ用に Pod ポートへのトンネル接続を確立でき、セッションごとに複数のポートをサポートします
  • 起動時の接続チェック:起動時にクラスターへの接続と基本的な権限を自動検証します

インストール

リリースページからビルド済みバイナリをダウンロードできます。

または、macOS または Linux では Homebrew を使ってインストールできます。

brew install patrickdappollonio/tap/mcp-kubernetes-ro

NPM パッケージとしても使用できます。AI エージェントに設定を指定してください。

npx -y @patrickdappollonio/mcp-kubernetes-ro

最後に、Docker ユーザーは GitHub Container Registry のビルド済みイメージを使用できます。

docker pull ghcr.io/patrickdappollonio/mcp-kubernetes-ro:latest
エディターの設定

mcp-kubernetes-ro を使用するには、エディターの設定に以下を追加します。

{
  "mcpServers": {
    "kubernetes-ro": {
      "command": "mcp-kubernetes-ro",
      "args": [
        // Uncomment and modify as needed:
        // "--kubeconfig=/path/to/kubeconfig",
        // "--namespace=default",
        // "--transport=stdio",
        // "--port=8080",
        // "--disabled-tools=get_logs,decode_base64",
        // "--disabled-resources=secrets",
        // "--always-start"
      ],
      "env": {
        // Set KUBECONFIG environment variable if needed:
        // "KUBECONFIG": "/path/to/kubeconfig",
        // Set MCP_KUBERNETES_RO_DISABLED_TOOLS environment variable if needed:
        // "MCP_KUBERNETES_RO_DISABLED_TOOLS": "get_logs,decode_base64",
        // Or use generic DISABLED_TOOLS environment variable:
        // "DISABLED_TOOLS": "get_logs,decode_base64",
        // Disable access to specific resource types:
        // "MCP_KUBERNETES_RO_DISABLED_RESOURCES": "secrets,configmaps",
        // Skip startup connectivity check via environment variable:
        // "MCP_KUBERNETES_RO_ALWAYS_START": "true"
      }
    }
  }
}

上記のように $PATH から mcp-kubernetes-ro を直接使用することも、バイナリへのフルパス(例:/path/to/mcp-kubernetes-ro)を指定することもできます。

npx パッケージとして使用すれば、インストール手順を簡略化することもできます。

{
  "mcpServers": {
    "kubernetes-ro": {
      "command": "npx",
      "args": [
        "-y",
        "@patrickdappollonio/mcp-kubernetes-ro"
        // Uncomment and modify as needed:
        // "--kubeconfig=/path/to/kubeconfig",
        // "--namespace=default",
        // "--transport=stdio",
        // "--port=8080",
        // "--disabled-tools=get_logs,decode_base64",
        // "--disabled-resources=secrets"
      ],
      "env": {
        // Set KUBECONFIG environment variable if needed:
        // "KUBECONFIG": "/path/to/kubeconfig",
        // Set MCP_KUBERNETES_RO_DISABLED_TOOLS environment variable if needed:
        // "MCP_KUBERNETES_RO_DISABLED_TOOLS": "get_logs,decode_base64",
        // Or use generic DISABLED_TOOLS environment variable:
        // "DISABLED_TOOLS": "get_logs,decode_base64",
        // Disable access to specific resource types:
        // "MCP_KUBERNETES_RO_DISABLED_RESOURCES": "secrets,configmaps"
      }
    }
  }
}

Docker イメージを使用する方法は次のとおりです。

{
  "mcpServers": {
    "kubernetes-ro": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e", "KUBECONFIG=/root/.kube/config",
        "-v", "/path/to/kubeconfig:/root/.kube/config",
        // Environment variables must be passed with -e, before the image name:
        // "-e", "MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs,decode_base64",
        // "-e", "MCP_KUBERNETES_RO_DISABLED_RESOURCES=secrets,configmaps",
        "ghcr.io/patrickdappollonio/mcp-kubernetes-ro"
        // Place additional flags here, like:
        // "--disabled-tools=get_logs,decode_base64",
        // "--disabled-resources=secrets"
      ]
    },
  }
}

kubeconfig ファイルをコンテナにマウントする必要があります。また、KUBECONFIG 環境変数をマウントしたファイルのパスに設定するか、--kubeconfig フラグを使用してパスを指定してください。この設定の "env" ブロックは docker コマンド自体にのみ適用され、コンテナ内のサーバーには適用されません。そのため、上記のように args で -e を使って環境変数を渡してください。

コンテナはディスクにファイルを書き込めないため、イメージではデフォルトで --encrypted-secret-access が有効になっています。stdio 経由の場合も含め、Secret の値は save_secret_to_file ではなく get_secret_encrypted で取得されます。Secret の値を参照してください。

前提条件
  • 有効な Kubernetes 設定ファイル(通常は ~/.kube/config)
  • 有効な認証情報とクラスターへのアクセス(kubectl バイナリは不要です)
  • 読み取り操作に必要な適切な RBAC 権限
  • Metrics Server(メトリクスツールに必要):メトリクス機能(get_node_metrics、get_pod_metrics)を使用するには、クラスターに metrics-server がインストールされている必要があります。利用できない場合、これらのツールはエラーメッセージを返します。

利用可能な MCP ツール

デフォルトでは 11 個のツールが利用でき、ポートフォワーディングを有効にすると、さらに 3 個のツールが追加されます。利用できる Secret ツールはトランスポートによって異なり、--insecure-secret-access を指定するとそのツールが無効になり、10 個になります(Secret の値を参照してください)。

  • list_resources:任意の種類の Kubernetes リソースを、オプションのフィルタリングを適用して新しい順に一覧表示します。include_managed_fields=true を指定しない限り、metadata.managedFields はデフォルトで省略されます
  • get_resource:指定したリソースの詳細を取得します。include_managed_fields=true を指定しない限り、metadata.managedFields はデフォルトで省略されます。Secret の値は表示されません
  • get_logs:grep パターン、時間によるフィルタリング、以前のログなど、高度なフィルタリングオプションを使用して Pod のログを取得します
  • get_pod_containers:ログにアクセスするため、Pod 内のコンテナを一覧表示します
  • list_api_resources:利用可能な Kubernetes API リソースとその詳細を一覧表示します(kubectl api-resources と同様)
  • list_contexts:kubeconfig ファイルから利用可能な Kubernetes コンテキストを一覧表示します
  • get_node_metrics:ノードのメトリクス(CPU とメモリの使用量)を取得します
  • get_pod_metrics:Pod のメトリクス(CPU とメモリの使用量)を取得します
  • encode_base64:テキストデータを base64 形式にエンコードします
  • decode_base64:base64 データをテキスト形式にデコードします
  • save_secret_to_file (stdio のみ):Secret の値を 1 つ、デフォルトではプライベートな一時フォルダー内の所有者のみがアクセスできるファイルに書き込みます。値は返しません
  • get_secret_encrypted (SSE、Streamable HTTP、または --encrypted-secret-access):指定した公開鍵で暗号化した Secret の値を 1 つと、お使いのマシンでそれを復号するコマンドを返します
  • start_port_forward (オプトイン):1 つ以上のポートマッピングを使って、Pod へのポートフォワーディングを開始します
  • stop_port_forward (オプトイン):ID を指定して、実行中のポートフォワーディングセッションを停止します
  • list_port_forwards (オプトイン):実行中のポートフォワーディングセッションをすべて一覧表示します

ツールの管理

ツールの無効化

--disabled-tools フラグ、または MCP_KUBERNETES_RO_DISABLED_TOOLS/DISABLED_TOOLS 環境変数を使用して、特定のツールを無効化できます。フラグは複数回指定でき、カンマ区切りの値を受け付けます。

# Comma-separated
mcp-kubernetes-ro --disabled-tools=get_logs,decode_base64

# Repeated flags
mcp-kubernetes-ro --disabled-tools=get_logs --disabled-tools=decode_base64

# Using environment variable
export MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs,decode_base64
mcp-kubernetes-ro

フラグと環境変数の値は統合されます。MCP_KUBERNETES_RO_DISABLED_TOOLS 環境変数が設定されていない場合は、DISABLED_TOOLS が代わりに使用されます。

ツールを無効化すると、MCP サーバーに登録されず、利用可能なツールの一覧にも表示されません。スキップされたツールを示すメッセージが stderr に記録されます。

無効化できるツール名:

  • list_resources
  • get_resource
  • get_logs
  • get_pod_containers
  • list_api_resources
  • list_contexts
  • get_node_metrics
  • get_pod_metrics
  • encode_base64
  • decode_base64
  • save_secret_to_file (stdio の場合のみ)
  • get_secret_encrypted (SSE、Streamable HTTP、または --encrypted-secret-access の場合のみ)
  • start_port_forward (ポートフォワーディングが有効な場合のみ)
  • stop_port_forward (ポートフォワーディングが有効な場合のみ)
  • list_port_forwards (ポートフォワーディングが有効な場合のみ)
特定のリソースへのアクセスの無効化

--disabled-resources フラグ、または MCP_KUBERNETES_RO_DISABLED_RESOURCES 環境変数を使用して、AI エージェントが特定の Kubernetes リソースタイプを照会できないようにできます。Secrets のような機密リソースへのアクセスを防ぐ場合に特に便利です。

リソースは、名前(単数形、複数形、kind、または短縮名)か、group/version/resource の完全な 3 要素で指定できます。core キーワードは、Kubernetes のコア API グループの別名として使用されます。すべての名前は起動時にクラスターの検出 API に照合されるため、単数形の名前、kind 名、短縮名のいずれも使用できます。

# By resource name (resolved via the cluster's discovery API)
mcp-kubernetes-ro --disabled-resources=secrets

# Singular, kind, and short names all work
mcp-kubernetes-ro --disabled-resources=secret      # singular
mcp-kubernetes-ro --disabled-resources=Secret      # kind
mcp-kubernetes-ro --disabled-resources=cm          # short name for configmaps

# Full group/version/resource format
mcp-kubernetes-ro --disabled-resources=core/v1/secrets

# Multiple resources (comma-separated or repeated flags)
mcp-kubernetes-ro --disabled-resources=secrets,configmaps
mcp-kubernetes-ro --disabled-resources=secrets --disabled-resources=configmaps

# Non-core API groups
mcp-kubernetes-ro --disabled-resources=apps/v1/deployments

# Using environment variable
export MCP_KUBERNETES_RO_DISABLED_RESOURCES=secrets,configmaps
mcp-kubernetes-ro

無効化されたリソースが list_resources または get_resource を介して照会されると、サーバーは明確なエラーを返します。

access to resource "secrets" (core/v1/secrets) is disabled by configuration and cannot be queried

無効化されたリソースは list_api_resources の出力からも除外されるため、AI エージェントが利用可能なリソースとして検出することはありません。

リソース名がクラスターに照合できない場合(入力ミスや存在しない CRD など)、サーバーは内容が明確なエラーを表示して起動を拒否します。これにより、無効化したリソースが常に確実に無効化されます。

Secret の値

ツールの出力は会話履歴や AI クライアントのログに残ります。Secret の値は base64 エンコードされているだけで、暗号化されているわけではありません。そのため、ツールから値を返すと、プレーンテキストで読み取れる状態になります。

デフォルトでは、get_resource はすべての Secret の値を隠し、"password": "[redacted: 16 bytes]" のようにサイズのみを表示します。また、kubectl apply で作成された Secret の完全なコピーが含まれる kubectl.kubernetes.io/last-applied-configuration アノテーションも削除します。list_resources もメタデータを返す際(title_only=false)にこのアノテーションを削除します。

エージェントが値を必要とする場合、たとえばスクリプトで使用する場合は、使用中のトランスポートに対応した Secret 用ツールを使って取得します。サーバーの指示で、エージェントに手順が説明されます。

stdio:save_secret_to_file

サーバーはお使いのマシン上で実行されるため、値をそのままファイルに書き込み、パスとサイズのみを返します。

{
  "name": "db-credentials",
  "key": "password",
  "namespace": "prod"
}

デフォルトでは、ファイルはシステムの一時ディレクトリ内に新しく作成されるフォルダーに保存されます。たとえば、/tmp/mcp-kubernetes-ro-secret-1234567/password のようなパスになります。フォルダー(0700)とファイル(0600)を開けるのはあなただけです。また、このフォルダーはプロジェクトの外部にあるため、誤ってコミットされることはありません。別の場所を使用するには、絶対パスの path を指定してください。既存のファイルやシンボリックリンクが上書きされることはありません。

エージェントはファイルをスクリプトに渡します。たとえば、DB_PASSWORD="$(cat /tmp/mcp-kubernetes-ro-secret-1234567/password)" ./migrate.sh のように実行し、スクリプトで不要になったらファイルを削除するよう指示されます。サーバーがファイルを削除することはありません。

SSE、Streamable HTTP、Docker:get_secret_encrypted

リモートサーバーやコンテナ内で実行されているサーバーは、お使いのディスクに書き込めないため、値はお使いのマシンだけが保持する鍵で暗号化されます。このツールは、SSE および Streamable HTTP トランスポートと、--encrypted-secret-access が設定されている場合の stdio において、save_secret_to_file に代わるものです。Docker イメージでは、これがデフォルトで設定されています。エージェントは、macOS とほとんどの Linux ディストリビューションに付属する openssl を使って次の手順を実行するため、通常は何もインストールする必要はありません。

  1. 1 回限りの鍵ペアを作成します:(umask 077; openssl genrsa -out /tmp/k8s-secret-key.pem 4096)
  2. 公開鍵を出力します:openssl rsa -in /tmp/k8s-secret-key.pem -pubout
  3. 公開鍵、秘密鍵のパス、出力先のパスを指定して get_secret_encrypted を呼び出します。サーバーは値を RSA-OAEP で暗号化し、decrypt_command を返します。1 つの RSA ブロックに収まらない値は、複数のブロックに分割されます。
  4. decrypt_command を実行します。出力先のパスに所有者のみがアクセスできる権限で値を書き込み、既存のファイルへの上書きを拒否し、復号に成功すると秘密鍵を削除します。スクリプトで不要になったら復号済みファイルを削除するよう、エージェントに指示されます。

会話に含まれるのは、公開鍵と暗号化されたブロックのみです。どちらも秘密鍵がなければ値を復元できません。秘密鍵はお使いのマシンから外に出ることはなく、使用後に削除されます。サーバーは状態を保持しないため、ステートレスなレプリカを複数用意した環境でも動作します。

これによって保護されるもの

これらのツールを使うと、Secret の値が会話履歴やクライアントのログに残りません。ただし、シェルアクセス権を持つエージェントが、たとえば cat を使ってその後ファイルを読み取ることまでは防げません。サーバーの指示ではエージェントに読み取らないよう伝えますが、これは指針であって強制されるものではありません。エージェントが Secret に一切アクセスできないようにするには、--disabled-resources=secrets を使用してください。これを指定すると、シークレット関連のツールもすべてのリクエストを拒否します。

以前の動作に戻す:--insecure-secret-access

--insecure-secret-access(または MCP_KUBERNETES_RO_INSECURE_SECRET_ACCESS=true)を指定すると、get_resource は Secret の値を保存されたままの状態で返し、シークレット関連のツールは両方とも削除されます。その後、エージェントが読み取る値はすべて、会話履歴やクライアントのログで読み取り可能なままになります。有効にすると、サーバーは起動時に警告を出力します。

実行モード

標準(stdio)モード

デフォルトでは、mcp-kubernetes-ro は stdio モードで実行されます。このモードは、標準入力/出力を介して通信するエディターやその他のツールとの統合に適しています。

mcp-kubernetes-ro
Server-Sent Events(SSE)モード

代わりに、ウェブベースの統合で SSE を利用できる HTTP サーバーとして mcp-kubernetes-ro を実行することもできます。

mcp-kubernetes-ro --transport=sse --port=8080

SSE モードでは、サーバーは指定されたポート(デフォルト:8080)でリッスンし、Server-Sent Events を使用した HTTP 経由で同じ MCP ツールを提供します。ウェブアプリケーションや、stdio による通信が現実的でない環境で役立ちます。

Streamable HTTP モード

ロードバランサーの背後で水平方向にスケールする必要がある環境では、Streamable HTTP トランスポートを使用してサーバーを実行します。

mcp-kubernetes-ro --transport=streamable-http --port=8080

このモードでは、サーバーは /mcp に単一の MCP エンドポイントを公開し、プロトコル層ではステートレスに動作します。Mcp-Session-Id は不要で、どのリクエストも任意のレプリカで処理できます。つまり、スティッキーセッションや共有セッションストアを使わずに、通常のラウンドロビンロードバランサーの背後に複数のインスタンスを配置できます。

ポートフォワーディングに関する注意: ポートフォワードのセッションはプロセス内に保持され、レプリカ間で共有できません。--enable-port-forwarding と --transport=streamable-http を併用する場合は、レプリカを 1 つだけ実行してください。そうしないと、あるレプリカで開始したセッションは他のレプリカから認識できません。

設定オプション

MCP サーバーの設定には、次のコマンドラインフラグを使用できます。

Kubernetes の設定
  • --kubeconfig=PATH:kubeconfig ファイルへのパス(デフォルトは KUBECONFIG 環境変数、次に ~/.kube/config)
  • --namespace=NAME:操作のデフォルトの名前空間(デフォルトは現在の名前空間)
トランスポートオプション
  • --transport=TYPE:トランスポートの種類:stdio、sse、または streamable-http(デフォルト:stdio)
  • --port=PORT:HTTP ベースのトランスポート用ポート(デフォルト:8080、--transport=sse または --transport=streamable-http の場合のみ使用)
ツールとリソースの管理
  • --disabled-tools=NAMES:無効にするツール名。繰り返し指定でき、カンマ区切りで指定します(任意)
  • --disabled-resources=RESOURCES:ブロックするリソースタイプ。繰り返し指定でき、カンマ区切りで指定します(任意)。リソース名(secrets、deploy、cm)または完全な指定(core/v1/secrets、apps/v1/deployments)を使用できます
  • MCP_KUBERNETES_RO_DISABLED_TOOLS:無効にするツールを指定する環境変数(フラグの値と統合されます。フォールバック:DISABLED_TOOLS)
  • MCP_KUBERNETES_RO_DISABLED_RESOURCES:無効にするリソースを指定する環境変数(フラグの値と統合されます)
シークレットへのアクセス
  • --encrypted-secret-access:サーバーがディスクに書き込めない場合に、stdio の場合でも save_secret_to_file の代わりに get_secret_encrypted を提供します。Docker イメージではデフォルトで有効です
  • MCP_KUBERNETES_RO_ENCRYPTED_SECRET_ACCESS:同じ設定を指定する環境変数(true、1、または yes に設定)
  • --insecure-secret-access:get_resource から Secret の値を保存されたままの状態で返し、シークレット用ツールを無効にします。--encrypted-secret-access より優先されます(デフォルトでは無効です。推奨されません。シークレットの値を参照)
  • MCP_KUBERNETES_RO_INSECURE_SECRET_ACCESS:同じ設定を指定する環境変数(true、1、または yes に設定)
ポートフォワーディング
  • --enable-port-forwarding:ポートフォワーディングツールを有効にします(デフォルトでは無効)
  • MCP_KUBERNETES_RO_ENABLE_PORT_FORWARDING:アプリ固有の環境変数(true、1、または yes に設定)
  • ENABLE_PORT_FORWARDING:汎用環境変数(true、1、または yes に設定)
コンテキストの設定

サーバーはコマンドごとのコンテキストに対応しています。これにより、同じ $KUBECONFIG ファイル内の複数の Kubernetes クラスターやコンテキストを扱う際の柔軟性が高まります。

設定の優先順位:

  1. コマンドレベルのコンテキスト:個々のツール呼び出しで context パラメーターを使用します
  2. kubeconfig のデフォルト:kubeconfig ファイルで指定された現在のコンテキストを使用します

kubeconfig の解決優先順位:

  1. コマンドラインフラグ:--kubeconfig パラメーター
  2. 環境変数:KUBECONFIG 環境変数
  3. デフォルトパス:~/.kube/config
  4. クラスター内の設定:Kubernetes ポッド内で実行されている場合に自動検出されます

例:

{
  "resource_type": "pods",
  "namespace": "default",
  "context": "production-cluster"
}

この方法では、次のことができます。

  • 同じセッション内で、操作ごとに異なるコンテキストを使用する
  • サーバーを再起動せずに、コマンドごとにコンテキストを切り替える
  • 既存の kubeconfig 設定との互換性を維持する

ツールの使用方法

リソースの一覧表示

任意の種類の Kubernetes リソースを、新しい順に並べて一覧表示します。フィルタリングも指定できます。

引数:

  • resource_type(必須):一覧表示するリソースの種類。複数形を使用します(例:'pods'、'deployments'、'services')
  • api_version(任意):リソースの API バージョン(例:'v1'、'apps/v1')
  • namespace(任意):対象の名前空間(クラスター単位のリソースの場合は空欄のままにします)
  • context(任意):使用する Kubernetes コンテキスト(デフォルトは kubeconfig の現在のコンテキスト)
  • label_selector(任意):リソースをフィルタリングするラベルセレクター(例:'app=nginx,version=1.0')
  • field_selector(任意):リソースをフィルタリングするフィールドセレクター(例:'status.phase=Running')
  • limit(任意):返すリソースの最大数(デフォルトはすべて)
  • continue(任意):ページネーション用の継続トークン(前回の応答から取得)

例:

{
  "resource_type": "pods",
  "namespace": "default",
  "context": "production",
  "label_selector": "app=nginx"
}
リソースを取得

完全な設定情報を含む、指定したリソースの詳細を取得します。Secrets の値は非表示になり、サイズのみ表示されます。ただし、--insecure-secret-access を設定した場合はこの限りではありません。Secret Values を参照してください。

引数:

  • resource_type(必須):取得するリソースの種類
  • name(必須):リソース名
  • api_version(任意):リソースの API バージョン(例:'v1'、'apps/v1')
  • namespace(任意):対象の namespace(namespace が設定されたリソースでは必須)
  • context(任意):使用する Kubernetes コンテキスト(デフォルトでは kubeconfig の現在のコンテキスト)

例:

{
  "resource_type": "deployment",
  "name": "nginx-deployment",
  "namespace": "default",
  "context": "production"
}
ログを取得

grep パターン、時間によるフィルタリング、以前のログなど、高度なフィルタリングオプションを指定して Pod のログを取得します。

引数:

  • namespace(必須):Pod の namespace
  • name(必須):Pod 名
  • container(任意):コンテナ名(複数のコンテナがある Pod では必須)
  • context(任意):使用する Kubernetes コンテキスト(デフォルトでは kubeconfig の現在のコンテキスト)
  • max_lines(任意):取得する最大行数
  • grep_include(任意):指定したパターンに一致する行のみを含めます(カンマ区切り)。grep と同様に、いずれかのパターンを含む行を返します
  • grep_exclude(任意):指定したパターンに一致する行を除外します(カンマ区切り)。grep -v と同様に、いずれかのパターンを含む行を除外します
  • use_regex(任意):grep パターンをリテラル文字列ではなく正規表現として扱うかどうか
  • since(任意):指定した時刻より新しいログを返します。「5m」、「1h」、「2h30m」、「1d」のような期間、または「2023-01-01T10:00:00Z」のような絶対時刻を指定できます
  • previous(任意):前回終了したコンテナインスタンスのログを返します(kubectl logs --previous と同様)

例:

{
  "namespace": "default",
  "name": "nginx-pod-12345",
  "container": "nginx",
  "context": "production",
  "max_lines": "100",
  "grep_include": "error,warning",
  "since": "5m"
}
Pod のコンテナを取得

ログにアクセスするため、Pod 内のコンテナ一覧を表示します。

引数:

  • namespace(必須):Pod の namespace
  • name(必須):Pod 名
  • context(任意):使用する Kubernetes コンテキスト(デフォルトでは kubeconfig の現在のコンテキスト)

例:

{
  "namespace": "default",
  "name": "nginx-pod-12345",
  "context": "production"
}
API リソースを一覧表示

利用可能な Kubernetes API リソースとその詳細を一覧表示します(kubectl api-resources と同様)。

引数:

  • 必須の引数はありません

例:

{}
コンテキストを一覧表示

kubeconfig ファイルから利用可能な Kubernetes コンテキストを一覧表示します。他のツールの context パラメーターで使用できるコンテキストを確認するのに便利です。

引数:

  • 必須の引数はありません

例:

{}

応答例:

{
  "contexts": [
    {
      "name": "production",
      "cluster": "prod-cluster",
      "user": "prod-user",
      "namespace": "default",
      "current": true
    },
    {
      "name": "staging",
      "cluster": "staging-cluster",
      "user": "staging-user",
      "namespace": "staging",
      "current": false
    }
  ],
  "count": 2
}
ノードメトリクスを取得

メトリクスサーバーからノードのメトリクス(CPU とメモリの使用量)を取得します。組み込みのメトリクスサーバーエンドポイントは needle ベースのページネーションに対応していないため、一貫した順序とページネーションを実現できるよう、結果はタイムスタンプの新しい順に並べ替えられます。

引数:

  • node_name(任意):メトリクスを取得する特定のノード名。指定しない場合は、すべてのノードのメトリクスを返します。
  • context(任意):使用する Kubernetes コンテキスト(デフォルトでは kubeconfig の現在のコンテキスト)
  • limit(任意):返すノードメトリクスの最大数。指定しない場合は、利用可能なすべてのメトリクスを返します。
  • continue(任意):ページネーション用の継続トークン(前回の応答から指定します)。

エラー処理:

  • メトリクスサーバーを利用できない場合は、エラーメッセージを返します
  • よくあるメトリクスサーバーのエラーを検出し、具体的な対処方法を提示します

例:

{
  "node_name": "worker-node-1",
  "context": "production",
  "limit": 5
}

応答例(単一ノード):

{
  "kind": "NodeMetrics",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "name": "worker-node-1",
    "creationTimestamp": "2023-01-01T12:00:00Z"
  },
  "timestamp": "2023-01-01T12:00:00Z",
  "window": "10.062s",
  "usage": {
    "cpu": "137m",
    "memory": "1368128Ki"
  }
}

応答例(ページネーション付き一覧):

{
  "kind": "NodeMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "count": 5,
  "items": [
    {
      "kind": "NodeMetrics",
      "metadata": { "name": "node-1" },
      "timestamp": "2023-01-01T12:00:00Z",
      "usage": { "cpu": "137m", "memory": "1368128Ki" }
    }
  ],
  "continue": "eyJvZmZzZXQiOjUsInR5cGUiOiJub2RlIiwibmFtZXNwYWNlIjoiIn0="
}
Pod メトリクスの取得

メトリクスサーバーから Pod メトリクス(CPU とメモリの使用量)を取得します。組み込みのメトリクスサーバーエンドポイントはニードルベースのページネーションをサポートしていないため、一貫した並び順とページネーションを実現できるよう、結果はタイムスタンプ順(新しいものから)に並べ替えられます。

引数:

  • namespace(任意):Pod メトリクスを取得する名前空間です。指定しない場合、すべての名前空間にあるすべての Pod のメトリクスを返します。
  • pod_name(任意):メトリクスを取得する特定の Pod 名です。指定する場合は namespace も必要です。
  • context(任意):使用する Kubernetes コンテキストです(デフォルトでは kubeconfig の現在のコンテキスト)。
  • limit(任意):返す Pod メトリクスの最大数です。指定しない場合、利用可能なすべてのメトリクスを返します。
  • continue(任意):ページネーション用の継続トークンです(前の応答から取得)。

エラー処理:

  • メトリクスサーバーを利用できない場合は、エラーメッセージを返します。
  • よくあるメトリクスサーバーのエラーを検出し、具体的な対処方法を提示します。
  • pod_name が指定されている場合に namespace が指定されていることを検証します。

ページネーションに関する注意:

  • 継続トークンはコンテキストを認識し、名前空間のコンテキストが変わるとリセットされます。
  • 一貫した並べ替えとフィルタリングを実現するため、クライアント側のページネーションを実装しています。

例(特定の Pod):

{
  "namespace": "kube-system",
  "pod_name": "metrics-server-557ff575fb-9dcl4",
  "context": "production"
}

例(ページネーションあり):

{
  "namespace": "kube-system",
  "context": "production",
  "limit": 10,
  "continue": "eyJvZmZzZXQiOjEwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ=="
}

応答例(単一の Pod):

{
  "kind": "PodMetrics",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "name": "metrics-server-557ff575fb-9dcl4",
    "namespace": "kube-system",
    "creationTimestamp": "2023-01-01T12:00:00Z"
  },
  "timestamp": "2023-01-01T12:00:00Z",
  "window": "18.888s",
  "containers": [
    {
      "name": "metrics-server",
      "usage": {
        "cpu": "8020419n",
        "memory": "48164Ki"
      }
    }
  ]
}

応答例(ページネーションありのリスト):

{
  "kind": "PodMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "namespace": "kube-system",
  "count": 10,
  "items": [
    {
      "kind": "PodMetrics",
      "metadata": { "name": "pod-1", "namespace": "kube-system" },
      "timestamp": "2023-01-01T12:00:00Z",
      "containers": [
        {
          "name": "container-1",
          "usage": { "cpu": "8020419n", "memory": "48164Ki" }
        }
      ]
    }
  ],
  "continue": "eyJvZmZzZXQiOjIwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ=="
}
Base64 エンコード

テキストデータを Base64 形式にエンコードします。

引数:

  • data(必須):エンコードするテキストデータ

例:

{
  "data": "username:password"
}
Base64 デコード

Base64 データをテキスト形式にデコードします。

引数:

  • data(必須):デコードする Base64 データ

例:

{
  "data": "dXNlcm5hbWU6cGFzc3dvcmQ="
}
ポートフォワーディング(オプトイン)

ポートフォワーディングは読み取り専用操作の範囲を超えるため、デフォルトでは無効になっています。クラスターの状態を変更することはありませんが(リソースの作成、更新、削除は行いません)、ローカルマシンから Pod のポートへのアクティブなネットワークトンネルを確立します。つまり、トンネル経由でトラフィックが流れ、HTTP エンドポイントへのアクセス、データベースへの接続、対象サービスでの副作用の発生など、実行中のアプリケーションとやり取りする可能性があります。このため、ポートフォワーディングを有効にするには明示的な設定が必要です。

--enable-port-forwarding フラグを指定するか、MCP_KUBERNETES_RO_ENABLE_PORT_FORWARDING 環境変数を true に設定して有効にします。

警告

ポートフォワーディングの対象には、kubeconfig の認証情報でアクセスできるクラスター内の任意の Pod(インフラストラクチャ Pod を含む)を指定できます。Kubernetes API サーバー自体が Pod として実行されている場合(セルフホスト環境や一部のマネージド環境など)、AI エージェントが理論上それをポートフォワーディングの対象にすることも可能です。ポートフォワーディングだけで追加の権限が付与されるわけではありません。API サーバーで認証するには、引き続き有効な認証情報と RBAC 権限が必要です。しかし、API サーバーをローカルポートに公開すると、他のローカルツールやスクリプトに検出された場合、意図しないやり取りにつながる可能性があります。RBAC ポリシーを必ず確認し、AI エージェントが検出して対象にできるものを制限するために、ポートフォワーディングと併せて --disabled-resources を使用することも検討してください。

警告

リモートサーバー上で SSE モード(--transport=sse)または Streamable HTTP モード(--transport=streamable-http)を実行する場合、転送されたポートはワークステーションではなく、サーバーのローカルインターフェイスにバインドされます。つまり、localhost:<local_port> は mcp-kubernetes-ro が実行されているマシンを指します。ワークステーションから転送されたサービスにアクセスするには、SSH トンネル(ssh -L <local_port>:localhost:<local_port> user@remote-host)などを利用して、ポートを公開する必要があります。stdio モードでは、サーバーがエディターと共にローカルで実行されるため、この問題はありません。Streamable HTTP では、さらにポートフォワーディングを有効にしている間はレプリカを 1 つだけ実行してください。セッション状態はプロセス内に保持され、レプリカ間で共有されないためです。

有効にすると、追加で 3 つのツールが利用可能になります。

ポートフォワードの開始

Kubernetes ポッドへのポートフォワーディングセッションを確立します。1 つのセッションで複数のポートを転送できます。各ポートマッピングでは、ローカルポートからポッド上のポートへ転送します。local_port に 0 を設定するか省略すると、システムによって空いているローカルポートが自動的に割り当てられます。

引数:

  • namespace(必須):ポッドの名前空間
  • pod(必須):ポッド名
  • ports(必須):ポートマッピングの配列。それぞれ次の項目を含みます。
    • pod_port(必須):転送先となるポッド上のポート(1~65535)
    • local_port(任意):リッスンするローカルポート(自動割り当ての場合は 0 に設定するか省略)
  • context(任意):使用する Kubernetes コンテキスト(デフォルトでは kubeconfig の現在のコンテキスト)

例(単一ポート、自動割り当て):

{
  "namespace": "default",
  "pod": "my-app-pod-abc123",
  "ports": [
    { "pod_port": 8080 }
  ]
}

例(複数ポート、ローカルポートを明示的に指定):

{
  "namespace": "default",
  "pod": "my-app-pod-abc123",
  "ports": [
    { "pod_port": 8080, "local_port": 18080 },
    { "pod_port": 5432, "local_port": 15432 }
  ]
}

レスポンス例:

{
  "id": "pf-1",
  "namespace": "default",
  "pod": "my-app-pod-abc123",
  "ports": [
    { "pod_port": 8080, "local_port": 18080 },
    { "pod_port": 5432, "local_port": 15432 }
  ],
  "started_at": "2025-01-15T10:30:00Z"
}
ポートフォワードの停止

ID を指定して、アクティブなポートフォワーディングセッションを終了します。

引数:

  • id(必須):ポートフォワードセッション ID(例:"pf-1")

例:

{
  "id": "pf-1"
}

レスポンス例:

{
  "id": "pf-1",
  "stopped": true
}
ポートフォワードの一覧表示

アクティブなポートフォワーディングセッションを、ポートマッピングとメタデータとともにすべて一覧表示します。引数は不要です。

例:

{}

レスポンス例:

{
  "count": 2,
  "port_forwards": [
    {
      "id": "pf-1",
      "namespace": "default",
      "pod": "my-app-pod-abc123",
      "ports": [
        { "pod_port": 8080, "local_port": 18080 }
      ],
      "started_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": "pf-2",
      "namespace": "monitoring",
      "pod": "grafana-xyz789",
      "ports": [
        { "pod_port": 3000, "local_port": 13000 }
      ],
      "started_at": "2025-01-15T10:35:00Z"
    }
  ]
}
ポートフォワーディングの動作
  • 自動クリーンアップ:対象のポッドが削除された場合、または接続が切断された場合、ポートフォワードセッションは自動的に削除されます。その後 list_port_forwards を呼び出しても、終了したセッションは表示されません。
  • 正常なシャットダウン:MCP サーバーの停止時(SIGINT または SIGTERM)、アクティブなポートフォワードセッションはすべて終了します。
  • セッション ID:各セッションには一意の連番 ID(例:pf-1、pf-2)が付与されます。特定のセッションを終了するには、この ID を stop_port_forward で使用します。
  • 複数のセッション:複数のポートフォワードセッションを同時にアクティブにできます。それぞれ異なるポッドまたはポートを対象にできます。
ポートフォワーディングを使用したエディターの設定
{
  "mcpServers": {
    "kubernetes-ro": {
      "command": "mcp-kubernetes-ro",
      "args": [
        "--enable-port-forwarding"
      ],
      "env": {
        // Or use the environment variable instead of the flag:
        // "MCP_KUBERNETES_RO_ENABLE_PORT_FORWARDING": "true"
      }
    }
  }
}

使用例

基本的な使用例
# Start with default kubeconfig and context
mcp-kubernetes-ro

# Start with specific kubeconfig
mcp-kubernetes-ro --kubeconfig ~/.kube/config

# Start with KUBECONFIG environment variable
export KUBECONFIG=~/.kube/config
mcp-kubernetes-ro

# Start with specific namespace
mcp-kubernetes-ro --namespace kube-system

# Start in SSE mode
mcp-kubernetes-ro --transport=sse --port=3000

# Start with port forwarding enabled
mcp-kubernetes-ro --enable-port-forwarding

# Start with port forwarding via environment variable
export MCP_KUBERNETES_RO_ENABLE_PORT_FORWARDING=true
mcp-kubernetes-ro
高度な設定例
# Production cluster with specific kubeconfig
mcp-kubernetes-ro \
  --kubeconfig ~/.kube/prod-config \
  --namespace monitoring

# Development setup with SSE mode using environment variable
export KUBECONFIG=~/.kube/dev-config
mcp-kubernetes-ro \
  --transport=sse \
  --port=8080

# Using per-command context (specify context in tool calls)
# Context is now specified at the tool level, not globally

# Disable specific tools for security or performance reasons
mcp-kubernetes-ro --disabled-tools=get_logs,decode_base64

# Disable metrics tools when metrics server is not available
mcp-kubernetes-ro --disabled-tools=get_node_metrics,get_pod_metrics

# Prevent AI agents from reading Secrets and ConfigMaps
mcp-kubernetes-ro --disabled-resources=secrets --disabled-resources=configmaps

# Lock down a production environment: no logs, no secrets, no base64 decoding
mcp-kubernetes-ro \
  --kubeconfig ~/.kube/prod-config \
  --disabled-tools=get_logs,decode_base64 \
  --disabled-resources=secrets

# Use environment variables for disabled tools and resources
export MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs,decode_base64
export MCP_KUBERNETES_RO_DISABLED_RESOURCES=secrets
mcp-kubernetes-ro

ユースケース

クラスターのトラブルシューティング
  • 名前空間をまたいで、問題のあるポッドを一覧表示する
  • リソース設定の詳細を取得する
  • デバッグ用にポッドのログを取得する
  • 利用可能な API リソースを確認する
リソースの検出
  • 種類別にクラスターのリソースを調べる
  • 特定のラベルが付いたリソースを検索する
  • リソース間の関係を把握する
  • リソースの設定を確認する
セキュリティとコンプライアンス
  • 読み取り専用アクセスにより、誤った変更を防止する
  • 変更のリスクを伴わずに設定を調査する
  • リソースの状態と設定を監査する
  • 本番クラスターを安全に調査する
AI による運用支援
  • AI アシスタントにクラスターの問題の診断を支援してもらう
  • リソースの問題に対する的確な提案を得る
  • ログ分析とパターン認識を自動化する
  • Kubernetes リソースについて自然言語で問い合わせる

AI アシスタントに関する考慮事項

この MCP サーバーは Kubernetes クラスターの検査に役立つ包括的なツールを提供しますが、技術的には利用可能であっても、AI アシスタントによっては特定のツールの組み合わせを使用できない制限やポリシーが設けられている場合があります。

制限の可能性
  • シークレットへのアクセス:認証情報の取り扱いに関するセキュリティポリシーにより、save_secret_to_file や get_secret_encrypted を使用する場合でも、Kubernetes Secret の値の取得や取り扱いを拒否する AI アシスタントがあります。
  • 機密データ:ユーザーの権限やツールの利用可否にかかわらず、AI モデルにはチャットインターフェースで機密情報を公開しないための制限が組み込まれている場合があります。
  • セキュリティ上の方針:一部の AI アシスタントは技術的な能力よりセキュリティのベストプラクティスを優先し、機密データを漏えいさせる可能性のある操作を拒否することがあります。
回避策

AI アシスタントがセキュリティ上の理由で、利用可能なツールの使用を拒否する場合:

  1. 直接 CLI にアクセスする:機密性の高い操作には kubectl を直接使用し、実行するコマンドを AI に提示してもらいます。例:

    kubectl get secret <secret-name> -n <namespace> -o yaml
    echo "<base64-data>" | base64 -d
    
  2. ツールを手動で使用する:MCP サーバーをプログラムから使用する場合は、AI アシスタントを介さず、ツールを直接呼び出します。

  3. ドキュメント:セキュリティへの影響を考慮してください。AI が使用を拒否するのは、意図しない認証情報の漏えいからユーザーを守るためかもしれません。

設計思想

この動作には、セキュリティに対する異なる考え方が反映されています。

  • ツールベース:ツールと権限があれば、それを使用できるべきです。
  • AI の安全性:技術的な能力よりも、意図しない情報漏えいの防止を優先します。

どちらの考え方も妥当です。機密データの取得を伴うワークフローを設計する際は、この制約を考慮してください。

起動時の接続確認

MCP サーバーは起動時に自動で接続確認を実行し、Kubernetes クラスターに正常に接続できることを検証します。この確認には次の内容が含まれます。

  1. API サーバーへの到達性:Kubernetes API サーバーにアクセスでき、応答があることを確認します。
  2. 認証:認証情報が有効で、クラスターに受け入れられることを確認します。
  3. API の検出:サーバーが利用可能な API リソースを検出できることをテストします。
  4. 基本的な権限:少なくとも名前空間への読み取りアクセス権があることを検証します(基本的な RBAC チェック)。
表示される内容

起動に成功すると、次のような出力が表示されます。

Testing connectivity to Kubernetes cluster...
✓ Successfully connected to Kubernetes cluster (version: v1.28.0)
接続に関する問題のトラブルシューティング

接続確認に失敗すると、詳細なエラーメッセージが表示されます。よくある問題は次のとおりです。

  • 無効な kubeconfig:kubeconfig ファイルが存在し、正しい形式で記述されていることを確認してください。
  • クラスターに到達できない:クラスターのエンドポイントにネットワークからアクセスできることを確認してください。
  • 認証の失敗:認証情報の有効期限が切れておらず、有効であることを確認してください。
  • 権限の不足:基本的なクラスターリソースへの読み取りアクセス権が少なくともあることを確認してください。

応答しないクラスターへの接続で処理が停止しないよう、接続確認には 10 秒のタイムアウトが設定されています。

接続確認をスキップする(--always-start)

OIDC ブラウザーフローなど、MCP サーバーのプロセス起動時にはまだトークンが有効でない仕組みで認証情報が付与される場合は、--always-start フラグ(または MCP_KUBERNETES_RO_ALWAYS_START=true 環境変数)を使用すると、起動時の接続確認を完全にスキップできます。

mcp-kubernetes-ro --always-start

--always-start を指定すると、クラスターに接続せずにサーバーがすぐに起動します。接続確認は実質的に先送りされ、最初にツールが呼び出されたときに、通常どおりクラスターへの接続が試みられます。その時点でクラスターに到達できない場合や、認証情報の有効期限が切れている場合は、ツールから AI に対して、自動で再試行せず、再認証を促すよう指示する構造化エラーメッセージが返されます。

--disabled-resources で設定したリソースフィルターも同様に先送りされます。名前の解決は起動時ではなく、最初のツール呼び出し時に行われるため、サーバーの起動にクラスターへの接続は必要ありません。

セキュリティに関する考慮事項

  • 読み取り専用アクセス:サーバーは、クラスターに対する読み取り操作(get、list、watch)のみをサポートします。書き込み操作は、stdio モードで save_secret_to_file を実行してローカルに新しいファイルを作成する場合のみです
  • リソースアクセス制御:--disabled-resources を使用して、AI エージェントが特定のリソースタイプ(例:Secrets)を照会できないようにします
  • シークレット値はデフォルトで非表示:--insecure-secret-access を設定しない限り、シークレット値がツールの出力に表示されることはありません。シークレット値を参照してください
  • ローカル認証:既存の kubectl 設定と認証情報を使用します
  • 破壊的な操作なし:リソースの作成、更新、削除はできません
  • 名前空間の分離:kubeconfig の RBAC 権限を尊重します
  • 安全な通信:stdio、SSE、Streamable HTTP トランスポートをサポートします(後者 2 つはリバースプロキシ経由で HTTPS を使用して提供できます)

メトリクス実装の詳細

エラー検出と処理

メトリクスツール(get_node_metrics と get_pod_metrics)には、メトリクスサーバーの利用可否を検出する高度なエラー検出機能が含まれています。

  • 自動検出:メトリクスサーバーがインストールされていない場合や、応答していない場合を検出します
  • わかりやすいエラーメッセージ:メトリクスサーバーが見つからない場合、具体的なインストールコマンドを提示します
  • 一般的なエラーパターン:次のようなさまざまなメトリクスサーバーのエラー状況を認識します。
    • metrics-server サービスが見つからない
    • metrics.k8s.io API グループが利用できない
    • 「サーバーが要求されたリソースを見つけられない」エラー
    • 「利用可能なメトリクスがない」状況
ページネーションの実装

組み込みのメトリクスサーバーエンドポイントは指定した値に基づくページネーションをサポートしていないため、どちらのメトリクスツールも、一貫した結果を得られるようクライアント側でページネーションを実装しています。また、AI ツールが必要なデータだけを安全に要求できるようにするためでもあり、特にコンテキストウィンドウが小さい場合に便利です。

  • 並べ替え:ページネーションの前に、すべての結果をタイムスタンプの降順(新しい順)で並べ替えます
  • 継続トークン:次の情報を含む、Base64 エンコードされた JSON トークンです。
    • offset:結果セット内の現在の位置
    • type:リソースタイプ("node" または "pod")
    • namespace:コンテキストの名前空間(Pod メトリクスの場合)
  • コンテキストの認識:名前空間のコンテキストが変わると、ページネーションの状態がリセットされます
  • トークン形式:eyJvZmZzZXQiOjEwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ==
リソース取得戦略
  • 取得してからフィルタリング:サーバーから利用可能なすべてのメトリクスを取得し、その後クライアント側でフィルタリングとページネーションを適用します
  • 一貫した順序:ページネーションされたリクエスト間で予測可能な結果を保証します
  • 名前空間によるスコープ設定:指定がある場合、Pod メトリクスのスコープを特定の名前空間に自動的に限定します

エラー処理

サーバーは、一般的な問題について詳細なエラーメッセージを提供します。

  • 無効なリソースタイプまたは API バージョン
  • 必須パラメーターの不足
  • RBAC 権限エラー
  • ネットワーク接続の問題
  • 形式が正しくない kubeconfig ファイル
  • メトリクスサーバーが利用できない場合(インストール方法の案内付き)

制限事項

  • ローカルの kubectl 設定が必要です
  • 読み取り専用アクセスのみ(書き込み操作なし)
  • kubeconfig の認証情報でアクセス可能なリソースに限定されます
  • ログのリアルタイムストリーミングには対応していません(静的な取得のみ)
  • API リソース以外を対象としたカスタムリソース定義の検出には対応していません

コメント

MCP は初めてですか?

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

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