mcpField
K
Kubernetes MCP Server

Kubernetes MCP Server

ローカル
github.com/reza-gholizadeクラウド・インフラ1871 週間前に更新

Kubernetes MCP Server について

Kubernetes MCP Server は、Go で書かれた MCP サーバーで、標準化されたインターフェースを通じて Kubernetes クラスターの操作を提供します。クラスターのリソースを AI アシスタントに確認・変更させたい運用担当者や開発者に向いており、リスクのある変更を抑えるための読み取り専用モードも備えています。

主な機能

  1. 01API リソースの検出とリソース一覧の取得
  2. 02namespace とラベルによるリソースのフィルタリング
  3. 03kubectl describe に近いリソース詳細の表示
  4. 04Pod ログとノード・Pod のメトリクスの取得
  5. 05マニフェストからのリソースの作成・更新・削除
  6. 06stdio、SSE、streamable-http モードと読み取り専用モード

活用シーン

  1. 01AI アシスタントによる Pod の障害調査とログ確認
  2. 02ノードと Pod の CPU・メモリ使用状況の確認
  3. 03読み取り専用モードでの変更を伴わないクラスター状態の確認

MCP 対応

本プロジェクトは MCP サーバーであり、リソース一覧、ログ取得、メトリクス参照などの Kubernetes 関連ツールを MCP クライアントに公開します。

設定

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

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

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

リポジトリ

ツール

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

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

詳細

Kubernetes MCP サーバー

標準化されたインターフェースを通じて Kubernetes クラスターとやり取りするためのツールを提供する、Kubernetes Model Context Protocol(MCP)サーバーです。

ホステッドデプロイ

Frontier AI でホステッドデプロイを利用できます。

機能

  • API リソースの検出:Kubernetes クラスターで利用可能なすべての API リソースを取得します。
  • リソースの一覧表示:任意の種類のリソースを、必要に応じて名前空間やラベルで絞り込んで一覧表示します。
  • リソースの詳細:特定の Kubernetes リソースの詳細情報を取得します。
  • リソースの説明:kubectl describe と同様に、Kubernetes リソースの包括的な説明を取得します。
  • Pod ログ:特定の Pod のログを取得します(必要に応じて特定のコンテナーを指定できます。指定しない場合はすべてのコンテナーが対象です)。
  • ノードメトリクス:特定のノードのリソース使用状況メトリクスを取得します。
  • Pod メトリクス:特定の Pod の CPU とメモリのメトリクスを取得します。
  • イベントの一覧表示:名前空間内または特定のリソースに関するイベントを一覧表示します。
  • リソースの作成/更新:YAML または JSON マニフェストから新しい Kubernetes リソースを作成するか、既存のリソースを更新します。
  • リソースの削除:指定された名前空間と種類に基づいて、Kubernetes クラスター内のリソースを削除します。
  • 標準化されたインターフェース:MCP プロトコルを使用して、一貫性のあるツールとのやり取りを実現します。
  • 柔軟な設定:さまざまな Kubernetes コンテキストとリソーススコープに対応します。
  • 複数のモード:CLI ツール向けの stdio モード、sse モード、ウェブアプリケーション向けの streamable-http モード、およびクラスターを変更しない --readonly に対応します。
  • セキュリティ:セキュリティを強化するため、Docker コンテナー内で非 root ユーザーとして実行します。

前提条件

  • Go 1.23 以降
  • Kubernetes クラスターへのアクセス
  • 適切なクラスターアクセス権で設定された kubectl

インストール

  1. リポジトリをクローンします:

    git clone https://github.com/reza-gholizade/k8s-mcp-server.git
    cd k8s-mcp-server
    
  2. 依存関係をインストールします:

    go mod download
    
  3. サーバーをビルドします:

    go build -o k8s-mcp-server .
    

使用方法

サーバーの起動

サーバーは3つのモードで実行でき、コマンドラインフラグまたは環境変数で設定できます。

Stdio モード(CLI 統合向け)

このモードでは、標準入力/出力を使って通信します。

./k8s-mcp-server --mode stdio

または、環境変数を使用します:

SERVER_MODE=stdio ./k8s-mcp-server
SSE モード(ウェブアプリケーション向け)

このモードでは、Server-Sent Events をサポートする HTTP サーバーを起動します。

HTTP トランスポートにはベアラートークンが必要で、デフォルトではループバックでリッスンします:

MCP_AUTH_TOKEN="$(openssl rand -hex 32)" ./k8s-mcp-server --mode sse

ポートを指定します:

MCP_AUTH_TOKEN="your-random-secret" ./k8s-mcp-server --mode sse --port 9090

または、環境変数を使用します:

SERVER_MODE=sse SERVER_PORT=9090 MCP_AUTH_TOKEN="your-random-secret" ./k8s-mcp-server
Streamable-HTTP モード(ウェブアプリケーション向け)

このモードでは、MCP 仕様に準拠した streamable-http トランスポートをサポートする HTTP サーバーを起動します。

デフォルト(ポート 8080):

MCP_AUTH_TOKEN="your-random-secret" ./k8s-mcp-server --mode streamable-http

ポートを指定します:

MCP_AUTH_TOKEN="your-random-secret" ./k8s-mcp-server --mode streamable-http --port 9090

または、環境変数を使用します:

SERVER_MODE=streamable-http SERVER_PORT=9090 MCP_AUTH_TOKEN="your-random-secret" ./k8s-mcp-server

サーバーは http://localhost:8080/mcp(または指定したポート)で利用できます。

モードを指定しない場合、サーバーはデフォルトで stdio を使用します。HTTP モードは デフォルトで 127.0.0.1 にバインドします。ネットワークアクセスが意図されている場合に限り、 SERVER_HOST=0.0.0.0(または --host 0.0.0.0)を設定し、すべての MCP リクエストで Authorization: Bearer <token> を送信してください。ブラウザクライアントを使用するには、 カンマ区切りの MCP_ALLOWED_ORIGINS の値で明示的に許可する必要があります。

認証不要の /healthz エンドポイントは、コンテナーのヘルスチェックに利用できます。 MCP の機能は公開されません。

Kubernetes 認証

サーバーは複数の認証方法に対応しており、次の優先順位で順に試行します:

1. 環境変数からの Kubeconfig コンテンツ

KUBECONFIG_DATA 環境変数を使って、kubeconfig ファイルの内容全体を指定できます:

export KUBECONFIG_DATA="$(cat ~/.kube/config)"
./k8s-mcp-server

ファイルをマウントしたくない場合や、ファイルアクセスが制限されている環境で実行する場合に便利です。

2. API サーバー URL とトークン

Kubernetes API サーバー URL とベアラートークンを使用して認証できます。

export KUBERNETES_SERVER="https://kubernetes.example.com:6443"
export KUBERNETES_TOKEN="your-bearer-token-here"
./k8s-mcp-server

TLS 設定用のオプションの環境変数:

  • KUBERNETES_CA_CERT:CA 証明書の内容(Base64 エンコードまたは PEM 形式)
  • KUBERNETES_CA_CERT_PATH:CA 証明書ファイルのパス
  • KUBERNETES_INSECURE:TLS 検証をスキップするには "true" に設定します(本番環境では推奨されません)

CA 証明書を使用する例:

export KUBERNETES_SERVER="https://kubernetes.example.com:6443"
export KUBERNETES_TOKEN="your-bearer-token-here"
export KUBERNETES_CA_CERT_PATH="/path/to/ca.crt"
./k8s-mcp-server
3. クラスター内認証(サービスアカウント)

Kubernetes クラスター内で実行する場合、サーバーは /var/run/secrets/kubernetes.io/serviceaccount/token のサービスアカウントトークンを自動的に検出して使用します。これは、クラスター内でサーバーをポッドとして実行する際に推奨される方法です。

デプロイの例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-mcp-server-sa
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: k8s-mcp-server-role
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: ["apps"]
    resources: ["*"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  # Add more rules as needed for your use case
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-mcp-server-rb
subjects:
  - kind: ServiceAccount
    name: k8s-mcp-server-sa
    namespace: default
roleRef:
  kind: ClusterRole
  name: k8s-mcp-server-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-mcp-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-mcp-server
  template:
    metadata:
      labels:
        app: k8s-mcp-server
    spec:
      serviceAccountName: k8s-mcp-server-sa
      containers:
        - name: k8s-mcp-server
          image: ginnux/k8s-mcp-server:latest
          ports:
            - containerPort: 8080
          env:
            - name: SERVER_MODE
              value: "sse"
            - name: SERVER_PORT
              value: "8080"
4. Kubeconfig ファイルのパス(デフォルト)

上記の方法がいずれも利用できない場合、サーバーは kubeconfig ファイルの使用にフォールバックします。

  • --kubeconfig フラグ(実装されている場合)または KUBECONFIG 環境変数で指定されたパスを使用します
  • どちらも指定されていない場合は、デフォルトで ~/.kube/config を使用します
# Using default ~/.kube/config
./k8s-mcp-server

# Using custom kubeconfig path
export KUBECONFIG=/path/to/your/kubeconfig
./k8s-mcp-server

注: サーバーは、利用可能な環境変数とファイルシステムに基づいて、使用する認証方法を自動的に検出します。認証方法を明示的に設定する必要はありません。上記の優先順位で、最初に利用可能な方法が使用されます。

読み取り専用モード

サーバーは読み取り専用モードに対応しており、すべての書き込み操作を無効にすることで、変更を加えるリスクなく Kubernetes クラスターを安全に調査、監視できます。

--read-only フラグを指定して読み取り専用モードを有効にします。

./k8s-mcp-server --read-only

読み取り専用モードは、任意のサーバーモードと組み合わせることができます。

# Read-only with stdio mode
./k8s-mcp-server --mode stdio --read-only

# Read-only with SSE mode
./k8s-mcp-server --mode sse --read-only

# Read-only with streamable-http mode
./k8s-mcp-server --mode streamable-http --read-only

読み取り専用モードが有効な場合、次のツールは無効になります。

  • createResource(Kubernetes リソースの作成/更新)
  • helmInstall(Helm チャートのインストール)
  • helmUpgrade(Helm チャートのアップグレード)
  • helmUninstall(Helm チャートのアンインストール)
  • helmRollback(Helm リリースのロールバック)
  • helmRepoAdd(Helm リポジトリの追加)

リソースの一覧表示、ログの取得、メトリクスの表示、Helm リリースの調査など、その他の読み取り専用操作はすべて引き続き利用できます。

ツールカテゴリのフラグ

次のフラグを使用して、ツールのカテゴリ全体を選択的に無効にできます。

Kubernetes ツールを無効にする:

./k8s-mcp-server --no-k8s

Helm ツールを無効にする:

./k8s-mcp-server --no-helm

他のフラグと組み合わせる:

# Read-only mode with only Kubernetes tools (no Helm)
./k8s-mcp-server --read-only --no-helm

# Read-only mode with only Helm tools (no Kubernetes)
./k8s-mcp-server --read-only --no-k8s

# SSE mode with only Kubernetes tools
./k8s-mcp-server --mode sse --no-helm

注: --no-k8s と --no-helm を同時に使用することはできません。使用すると、利用可能なツールがなくなるためです。両方のフラグが指定された場合、サーバーはエラーで終了します。

--no-k8s を有効にすると、すべての Kubernetes ツールが無効になります。

  • getAPIResources、listResources、getResource、describeResource
  • getPodsLogs、getNodeMetrics、getPodMetrics、getEvents
  • createResource(読み取り専用モードでない場合)

--no-helm を有効にすると、すべての Helm ツールが無効になります。

  • helmList、helmGet、helmHistory、helmRepoList
  • helmInstall、helmUpgrade、helmUninstall、helmRollback、helmRepoAdd(読み取り専用モードでない場合)
Docker イメージの使用

Docker Hub のビルド済み Docker イメージを使用してサーバーを実行することもできます。

  1. イメージを取得します:

    docker pull ginnux/k8s-mcp-server:latest
    

    latest は、特定のバージョンタグ(例:1.0.0)に置き換えることができます。

  2. コンテナを実行します:

    注: サーバーは複数の認証方法に対応しています。kubeconfig ファイルをマウントする(以下を参照)か、認証に環境変数を使用できます(上記の Kubernetes 認証 セクションを参照)。

    • SSE モード(イメージのデフォルトの動作):

      docker run -p 8080:8080 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest
      

      コンテナのポート 8080 をホストのポート 8080 に割り当て、Kubernetes の設定を読み取り専用で非 root ユーザーのホームディレクトリにマウントします。サーバーには http://localhost:8080 でアクセスできます。イメージはデフォルトでポート 8080 の sse モードで動作します。

    • Streamable-HTTP モード:

      docker run -p 8080:8080 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode streamable-http
      

      サーバーを streamable-http モードで実行します。サーバーには http://localhost:8080/mcp でアクセスできます。

    • Stdio モード:

      docker run -i --rm -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode stdio
      

      対話型の stdio 通信には -i フラグが重要です。--rm は終了後にコンテナをクリーンアップします。

    • SSE モードでカスタムポートを使用:

      docker run -p 9090:9090 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode sse --port 9090
      
    • Streamable-HTTP モードでカスタムポートを使用:

      docker run -p 9090:9090 -v ~/.kube/config:/home/appuser/.kube/config:ro ginnux/k8s-mcp-server:latest --mode streamable-http --port 9090
      
    • 別の方法:.kube ディレクトリ全体をマウント:

      docker run -p 8080:8080 -v ~/.kube:/home/appuser/.kube:ro ginnux/k8s-mcp-server:latest
      
    • 認証に環境変数を使用(ファイルのマウントは不要):

      # 環境変数の kubeconfig コンテンツを使用
      docker run -p 8080:8080 \
        -e KUBECONFIG_DATA="$(cat ~/.kube/config)" \
        ginnux/k8s-mcp-server:latest
      
      # または API サーバーの URL とトークンを使用
      docker run -p 8080:8080 \
        -e KUBERNETES_SERVER="https://kubernetes.example.com:6443" \
        -e KUBERNETES_TOKEN="your-token-here" \
        -e KUBERNETES_CA_CERT_PATH="/path/to/ca.crt" \
        -v /path/to/ca.crt:/path/to/ca.crt:ro \
        ginnux/k8s-mcp-server:latest
      
Docker Compose での使用

docker-compose.yml ファイルを作成します:

オプション 1:kubeconfig ファイルを使用(従来の方法):

version: '3.8'
services:
  k8s-mcp-server:
    image: ginnux/k8s-mcp-server:latest # Or a specific version
    container_name: k8s-mcp-server
    ports:
      - "8080:8080" # Host:Container, adjust if using a different SERVER_PORT
    volumes:
      - ~/.kube:/home/appuser/.kube:ro # Mount kubeconfig read-only to non-root user home
    environment:
      - KUBECONFIG=/home/appuser/.kube/config
      - SERVER_MODE=sse # Can be 'stdio', 'sse', or 'streamable-http'
      - SERVER_PORT=8080 # Port for SSE/streamable-http modes
    # command: ["--read-only"] # Uncomment this line to enable read-only mode
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

オプション 2:環境変数を使用(ファイルのマウントは不要):

version: '3.8'
services:
  k8s-mcp-server:
    image: ginnux/k8s-mcp-server:latest
    container_name: k8s-mcp-server
    ports:
      - "8080:8080"
    environment:
      - KUBECONFIG_DATA=${KUBECONFIG_DATA} # Set this in your .env file or shell
      # Or use API server and token:
      # - KUBERNETES_SERVER=https://kubernetes.example.com:6443
      # - KUBERNETES_TOKEN=${KUBERNETES_TOKEN}
      - SERVER_MODE=sse
      - SERVER_PORT=8080
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

注: 読み取り専用モードを有効にするには、オプション 1 に示すように command のオーバーライドを使用します。stdio モードでは、「ports」を調整し、「stdin_open: true」と「tty: true」を追加したうえで、必要に応じてコマンドをオーバーライドする必要があります。

次のコマンドで起動します:

docker compose up -d

ログを確認するには、docker compose logs -f k8s-mcp-server を実行します。

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

Docker イメージはセキュリティ強化のため、非 root ユーザー(UID 1001 の appuser)で実行されます。

  • アプリケーションのバイナリは /usr/local/bin/k8s-mcp-server に配置されています
  • kubeconfig は /home/appuser/.kube/config にマウントしてください
  • コンテナの状態を監視するため、ヘルスチェックが有効になっています
  • コンテナに含まれる依存関係は最小限です(ca-certificates と curl のみ)

SSE と streamable HTTP は、MCP_AUTH_TOKEN が設定されていない場合、フェイルクローズになります。認証なしで HTTP トランスポートを公開しないでください。ローカルの MCP クライアントには stdio を優先し、可能な場合は --read-only を使用して、サーバーの Kubernetes ID には必要な RBAC 権限のみを付与してください。セッション ID は認証情報ではありません。リモートからアクセス可能なデプロイメントは TLS と認証機能を備えたリバースプロキシの背後に配置し、ブラウザベースのクライアント向けに MCP_ALLOWED_ORIGINS を設定してください。

API 呼び出しの実行(SSE/Streamable-HTTP モード)

サーバーが SSE または streamable-http モードで実行されている場合、HTTP エンドポイントに JSON-RPC 呼び出しを送信できます。

curl -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getAPIResources",
    "arguments": {
      "includeNamespaceScoped": true,
      "includeClusterScoped": true
    }
  }
}' http://localhost:8080/

ヘルスステータスも確認できます。

curl -f http://localhost:8080/
利用可能なツール
1. getAPIResources

Kubernetes クラスターで利用可能なすべての API リソースを取得します。

パラメーター:

  • includeNamespaceScoped(boolean、任意):名前空間スコープのリソースを含めるかどうかを指定します(デフォルトは true)。
  • includeClusterScoped(boolean、任意):クラスター スコープのリソースを含めるかどうかを指定します(デフォルトは true)。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getAPIResources",
    "arguments": {
      "includeNamespaceScoped": true,
      "includeClusterScoped": true
    }
  }
}
2. listResources

特定のリソースタイプのすべてのインスタンスを一覧表示します。

パラメーター:

  • Kind(string、必須):一覧表示するリソースの種類(例:「Pod」、「Deployment」)。
  • namespace(string、任意):リソースを一覧表示する名前空間です。省略した場合、名前空間スコープのリソースについて、すべての名前空間が対象になります(RBAC に従います)。
  • labelSelector(string、任意):ラベルセレクターでリソースをフィルターします(例:「app=nginx,env=prod」)。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "listResources",
    "arguments": {
      "Kind": "Pod",
      "namespace": "default",
      "labelSelector": "app=nginx"
    }
  }
}
3. getResource

特定のリソースの詳細情報を取得します。

パラメーター:

  • kind(string、必須):取得するリソースの種類(例:「Pod」、「Deployment」)。
  • name(string、必須):取得するリソースの名前です。
  • namespace(string、任意):リソースの名前空間です(名前空間スコープのリソースでは必須)。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getResource",
    "arguments": {
      "kind": "Pod",
      "name": "nginx-pod",
      "namespace": "default"
    }
  }
}
4. describeResource

kubectl describe と同様に、Kubernetes クラスター内のリソースを説明します。

パラメーター:

  • Kind(string、必須):説明するリソースの種類(例:「Pod」、「Deployment」)。
  • name(string、必須):説明するリソースの名前です。
  • namespace(string、任意):リソースの名前空間です(名前空間スコープのリソースでは必須)。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "describeResource",
    "arguments": {
      "Kind": "Pod",
      "name": "nginx-pod",
      "namespace": "default"
    }
  }
}
5. getPodsLogs

特定の Pod のログを取得します。

パラメーター:

  • Name(string、必須):Pod の名前です。
  • namespace(string、必須):Pod の名前空間です。
  • containerName(string、任意):Pod 内の特定のコンテナ名です。省略した場合:
    • Pod にコンテナが 1 つある場合、そのログを取得します。
    • Pod に複数のコンテナがある場合、すべてのコンテナのログを取得して連結します。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getPodsLogs",
    "arguments": {
      "Name": "my-app-pod-12345",
      "namespace": "production",
      "containerName": "main-container"
    }
  }
}
6. getNodeMetrics

特定のノードのリソース使用状況メトリクスを取得します。

パラメーター:

  • Name(string、必須):ノードの名前です。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getNodeMetrics",
    "arguments": {
      "Name": "worker-node-1"
    }
  }
}
7. getPodMetrics

特定の Pod の CPU とメモリのメトリクスを取得します。

パラメーター:

  • namespace(string、必須):Pod の名前空間です。
  • podName(string、必須):Pod の名前です。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getPodMetrics",
    "arguments": {
      "namespace": "default",
      "podName": "my-app-pod-67890"
    }
  }
}
8. getEvents

特定の名前空間またはリソースのイベントを取得します。

パラメーター:

  • namespace (string, optional):イベントを取得する名前空間です。省略した場合、すべての名前空間のイベントが対象になります(RBAC の制約を受けます)。
  • resourceName (string, optional):イベントを絞り込む特定のリソース(例:Pod 名)の名前です。
  • resourceKind (string, optional):resourceName が指定されている場合の、特定のリソースの種類(例:「Pod」)です。

例(名前空間のイベント):

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getEvents",
    "arguments": {
      "namespace": "default"
    }
  }
}

例(リソースのイベント):

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getEvents",
    "arguments": {
      "namespace": "production",
      "resourceName": "my-app-pod-12345",
      "resourceKind": "Pod"
    }
  }
}
9. createOrUpdateResource

JSON マニフェストから新しいリソースを作成するか、既存のリソースを更新します。

パラメーター:

  • manifest (string, required):リソースの JSON マニフェストです。
  • namespace (string, optional):リソースを作成または更新する名前空間です。マニフェストに名前空間が含まれている場合、このパラメーターで上書きできます。指定されておらず、マニフェストにも記載がない場合、「default」が想定されることもあれば、リソースの種類によってはエラーになることもあります。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "createResource",
    "arguments": {
      "kind": "Deployment",
      "namespace": "default",
      "manifest": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"name\":\"nginx-deployment\"},\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"name\":\"nginx\",\"image\":\"nginx:latest\"}]}}}}"
    }
  }
}
10. createResourceYAML

YAML マニフェストから新しいリソースを作成するか、既存のリソースを更新します。このツールは特に YAML 入力に最適化されており、YAML の解析エラーをより適切に処理します。

パラメーター:

  • yamlManifest (string, required):リソースの YAML マニフェストです。
  • namespace (string, optional):リソースを作成または更新する名前空間です。マニフェストに名前空間が含まれている場合、このパラメーターで上書きできます。指定されておらず、マニフェストにも記載がない場合、「default」が想定されることもあれば、リソースの種類によってはエラーになることもあります。
  • kind (string, optional):リソースの種類です。指定されていない場合、YAML マニフェストから種類が推測されます。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "createResourceYAML",
    "arguments": {
      "namespace": "default",
      "yamlManifest": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: my-new-pod\nspec:\n  containers:\n  - name: nginx\n    image: nginx:latest"
    }
  }
}
11. rolloutRestart

spec.template.metadata.annotations をサポートする Kubernetes リソースのローリング再起動を開始します。これには、Deployment、DaemonSet、StatefulSet、Job などのリソースが含まれます。

パラメーター:

  • kind (string, required):リソースの種類(例:「Deployment」、「StatefulSet」)です。
  • name: (string, required):再起動するリソースの名前です。
  • namespace (string, required for namespaced resources):リソースの名前空間です。

例(StatefulSet):

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rolloutRestart",
    "arguments": {
      "kind": "StatefulSet",
      "name": "redis-cluster-01",
      "namespace": "default"
    }
  }
}

例(Deployment):

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "rolloutRestart",
    "arguments": {
      "kind": "Deployment",
      "name": "my-app-deployment",
      "namespace": "default"
    }
  }
}
12. deleteResource

Kubernetes クラスターから特定のリソースを削除します。

パラメーター:

  • kind (string, required):削除するリソースの種類です。
  • name (string, required):削除するリソースの名前です。
  • namespace (string, optional):リソースの名前空間です(名前空間スコープのリソースでは必須です)。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "deleteResource",
    "arguments": {
      "kind": "Pod",
      "name": "my-pod",
      "namespace": "default"
    }
  }
}
13. getIngresses

Kubernetes クラスターから Ingress リソースを取得します。 ホストで Ingress を絞り込めます。ホストを指定しない場合、すべての Ingress が返されます。

パラメーター:

  • host (string, optional):Ingress の絞り込みに使用するホストです。省略した場合、すべての Ingress が対象になります。

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "getIngresses",
    "arguments": {
      "host": "example.com"
    }
  }
}
Helm 操作
14. helmInstall

Kubernetes クラスターに Helm チャートをインストールします。

パラメーター:

  • releaseName (string, required):Helm リリースの名前
  • chartName (string, required):Helm チャートの名前またはパス
  • namespace (string, optional):リリース用の Kubernetes 名前空間(既定値は「default」)
  • repoURL (string, optional):Helm リポジトリの URL
  • values (object, optional):チャートで上書きする値

例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "helmInstall",
    "arguments": {
      "releaseName": "my-nginx",
      "chartName": "bitnami/nginx",
      "namespace": "web",
      "repoURL": "https://charts.bitnami.com/bitnami",
      "values": {
        "replicaCount": 3,
        "service": {
          "type": "LoadBalancer"
        }
      }
    }
  }
}
15. helmUpgrade

既存の Helm リリースをアップグレードします。

パラメーター:

  • releaseName(string、必須):Helm リリースの名前
  • chartName(string、必須):Helm チャートの名前またはパス
  • namespace(string、必須):リリースの Kubernetes 名前空間(デフォルトは "default")
  • repoURL(string、任意):Helm リポジトリの URL。ローカルのチャートパス、または設定済みのリポジトリから解決できるチャートの場合は省略します
  • values(object、必須):チャートで上書きする値 例:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "helmUpgrade",
    "arguments": {
      "releaseName": "my-nginx",
      "chartName": "nginx",
      "namespace": "web",
      "repoURL": "https://charts.bitnami.com/bitnami",
      "values": {
        "replicaCount": 2,
        "service": {
          "type": "NodePort"
        }
      }
    }
  }
}
16. helmList

クラスター内、または指定した名前空間にあるすべての Helm リリースを一覧表示します。

17. helmGet

指定した Helm リリースの詳細を取得します。

18. helmHistory

Helm リリースの履歴を取得します。

19. helmRollback

Helm リリースを以前のリビジョンにロールバックします。

20. helmUninstall

Kubernetes クラスターから Helm リリースをアンインストールします。

新しいツールの追加
  1. ツールを定義する:tools/tools.go で、mcp.Tool 構造体を返す関数を定義します。これには、ツールの名前、説明、入出力スキーマを含めます。
  2. ハンドラーを実装する:handlers/handlers.go で、ハンドラー関数を作成します。この関数は引数として *k8s.Client を受け取り、func(context.Context, mcp.ToolInput) (mcp.ToolOutput, error) というシグネチャの関数を返します。この内側の関数に、ツールのロジックを記述します。
  3. ツールを登録する:main.go で、s.AddTool(tools.YourToolDefinitionFunction(), handlers.YourToolHandlerFunction(client)) を使用して、新しいツールを MCP サーバーインスタンスに追加します。

貢献

貢献を歓迎します!このプロジェクトへの貢献方法については、CONTRIBUTING.md をご覧ください。

ライセンス

[email protected]

このプロジェクトは MIT License のもとでライセンスされています。詳細は LICENSE ファイルをご覧ください。

README の画像

VS Code との統合

クイックセットアップ
自動インストール(推奨)

macOS/Linux:

curl -sSL https://raw.githubusercontent.com/reza-gholizade/k8s-mcp-server/main/scripts/install-vscode-config.sh | bash

Windows(PowerShell):

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/reza-gholizade/k8s-mcp-server/main/scripts/install-vscode-config.ps1'))
手動インストール
  1. VS Code に MCP 拡張機能をインストールする:

    code --install-extension modelcontextprotocol.mcp
    
  2. VS Code の settings.json に追加する:

    VS Code の設定を開く(Cmd/Ctrl + ,)→「設定を JSON で開く」→ 以下を追加します:

    macOS/Linux:

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server",
          "args": ["--mode", "stdio"],
          "env": {
            "KUBECONFIG": "${env:HOME}/.kube/config"
          }
        }
      }
    }
    

    読み取り専用モード(安全のため推奨):

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server",
          "args": ["--mode", "stdio", "--read-only"],
          "env": {
            "KUBECONFIG": "${env:HOME}/.kube/config"
          }
        }
      }
    }
    

    Kubernetes ツールのみ:

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server",
          "args": ["--mode", "stdio", "--no-helm"],
          "env": {
            "KUBECONFIG": "${env:HOME}/.kube/config"
          }
        }
      }
    }
    

    Helm ツールのみ:

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server",
          "args": ["--mode", "stdio", "--no-k8s"],
          "env": {
            "KUBECONFIG": "${env:HOME}/.kube/config"
          }
        }
      }
    }
    

    Kubernetes ツールのみを使用する読み取り専用モード:

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server",
          "args": ["--mode", "stdio", "--read-only", "--no-helm"],
          "env": {
            "KUBECONFIG": "${env:HOME}/.kube/config"
          }
        }
      }
    }
    

    Windows:

    {
      "mcp.mcpServers": {
        "k8s-mcp-server": {
          "command": "k8s-mcp-server.exe",
          "args": ["--mode", "stdio"],
          "env": {
            "KUBECONFIG": "${env:USERPROFILE}/.kube/config"
          }
        }
      }
    }
    
  3. バイナリが PATH に含まれていることを確認する:

    リリースページから適切なバイナリをダウンロードし、システム PATH に追加します。

  4. VS Code を再起動する

VS Code での使用方法

設定が完了すると、Claude などの MCP 互換ツールを使用して、VS Code から Kubernetes MCP サーバーを利用できます。

  1. VS Code を開きます
  2. Claude(またはその他の MCP 対応 AI アシスタント)を開きます
  3. 自然言語を使って Kubernetes クラスターを操作します:
    • 「default 名前空間内のすべての Pod を一覧表示して」
    • 「Pod nginx-123 のログを表示して」
    • 「worker-node-1 の CPU 使用率を取得して」
    • 「my-app という名前のデプロイメントを説明して」
設定オプション

設定を変更して構成をカスタマイズできます:

{
  "mcp.mcpServers": {
    "k8s-mcp-server": {
      "command": "k8s-mcp-server",
      "args": ["--mode", "stdio"],
      "env": {
        "KUBECONFIG": "/path/to/your/kubeconfig",
        "KUBERNETES_CONTEXT": "your-context-name"
      }
    }
  }
}
トラブルシューティング
  • バイナリが見つからない:k8s-mcp-server が PATH に含まれていることを確認してください
  • Kubernetes への接続に関する問題:KUBECONFIG のパスが正しいことを確認してください
  • 権限エラー:kubeconfig に必要な RBAC 権限が設定されていることを確認してください
  • 拡張機能が読み込まれない:設定を変更した後、VS Code を再起動してください

コメント

MCP は初めてですか?

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

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