Kubernetes MCP Server について
Kubernetes MCP Server は、Go で書かれた MCP サーバーで、標準化されたインターフェースを通じて Kubernetes クラスターの操作を提供します。クラスターのリソースを AI アシスタントに確認・変更させたい運用担当者や開発者に向いており、リスクのある変更を抑えるための読み取り専用モードも備えています。
主な機能
- 01API リソースの検出とリソース一覧の取得
- 02namespace とラベルによるリソースのフィルタリング
- 03kubectl describe に近いリソース詳細の表示
- 04Pod ログとノード・Pod のメトリクスの取得
- 05マニフェストからのリソースの作成・更新・削除
- 06stdio、SSE、streamable-http モードと読み取り専用モード
活用シーン
- 01AI アシスタントによる Pod の障害調査とログ確認
- 02ノードと Pod の CPU・メモリ使用状況の確認
- 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
インストール
-
リポジトリをクローンします:
git clone https://github.com/reza-gholizade/k8s-mcp-server.git cd k8s-mcp-server -
依存関係をインストールします:
go mod download -
サーバーをビルドします:
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、describeResourcegetPodsLogs、getNodeMetrics、getPodMetrics、getEventscreateResource(読み取り専用モードでない場合)
--no-helm を有効にすると、すべての Helm ツールが無効になります。
helmList、helmGet、helmHistory、helmRepoListhelmInstall、helmUpgrade、helmUninstall、helmRollback、helmRepoAdd(読み取り専用モードでない場合)
Docker イメージの使用
Docker Hub のビルド済み Docker イメージを使用してサーバーを実行することもできます。
-
イメージを取得します:
docker pull ginnux/k8s-mcp-server:latestlatestは、特定のバージョンタグ(例:1.0.0)に置き換えることができます。 -
コンテナを実行します:
注: サーバーは複数の認証方法に対応しています。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 リポジトリの URLvalues(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 リリースをアンインストールします。
新しいツールの追加
- ツールを定義する:
tools/tools.goで、mcp.Tool構造体を返す関数を定義します。これには、ツールの名前、説明、入出力スキーマを含めます。 - ハンドラーを実装する:
handlers/handlers.goで、ハンドラー関数を作成します。この関数は引数として*k8s.Clientを受け取り、func(context.Context, mcp.ToolInput) (mcp.ToolOutput, error)というシグネチャの関数を返します。この内側の関数に、ツールのロジックを記述します。 - ツールを登録する:
main.goで、s.AddTool(tools.YourToolDefinitionFunction(), handlers.YourToolHandlerFunction(client))を使用して、新しいツールを MCP サーバーインスタンスに追加します。
貢献
貢献を歓迎します!このプロジェクトへの貢献方法については、CONTRIBUTING.md をご覧ください。
ライセンス
このプロジェクトは MIT License のもとでライセンスされています。詳細は LICENSE ファイルをご覧ください。
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'))
手動インストール
-
VS Code に MCP 拡張機能をインストールする:
code --install-extension modelcontextprotocol.mcp -
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" } } } } -
バイナリが PATH に含まれていることを確認する:
リリースページから適切なバイナリをダウンロードし、システム PATH に追加します。
-
VS Code を再起動する
VS Code での使用方法
設定が完了すると、Claude などの MCP 互換ツールを使用して、VS Code から Kubernetes MCP サーバーを利用できます。
- VS Code を開きます
- Claude(またはその他の MCP 対応 AI アシスタント)を開きます
- 自然言語を使って 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 を再起動してください
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。