β¨ Features | π Getting Started | π₯ Demos | βοΈ Configuration | π οΈ Tools | π§βπ» Development A powerful and flexible Kubernetes Model Context Protocol (MCP) server implementation with support for Kubernetes and OpenShift. - β Configuration: - Automatically detect changes in the Kubernetes configuration and update the MCP server. - View and manage the current Kubernetes .kube/config or in-cluster
Add this skill
npx mdskills install manusa/kubernetes-mcp-serverNative Go implementation providing comprehensive Kubernetes/OpenShift tooling with excellent documentation
1# Kubernetes MCP Server23[](https://github.com/containers/kubernetes-mcp-server/blob/main/LICENSE)4[](https://www.npmjs.com/package/kubernetes-mcp-server)5[](https://pypi.org/project/kubernetes-mcp-server/)6[](https://github.com/containers/kubernetes-mcp-server/releases/latest)7[](https://github.com/containers/kubernetes-mcp-server/actions/workflows/build.yaml)89[β¨ Features](#features) | [π Getting Started](#getting-started) | [π₯ Demos](#demos) | [βοΈ Configuration](#configuration) | [π οΈ Tools](#tools-and-functionalities) | [π§βπ» Development](#development)1011https://github.com/user-attachments/assets/be2b67b3-fc1c-4d11-ae46-93deba8ed98e1213## β¨ Features <a id="features"></a>1415A powerful and flexible Kubernetes [Model Context Protocol (MCP)](https://blog.marcnuri.com/model-context-protocol-mcp-introduction) server implementation with support for **Kubernetes** and **OpenShift**.1617- **β Configuration**:18 - Automatically detect changes in the Kubernetes configuration and update the MCP server.19 - **View** and manage the current [Kubernetes `.kube/config`](https://blog.marcnuri.com/where-is-my-default-kubeconfig-file) or in-cluster configuration.20- **β Generic Kubernetes Resources**: Perform operations on **any** Kubernetes or OpenShift resource.21 - Any CRUD operation (Create or Update, Get, List, Delete).22- **β Pods**: Perform Pod-specific operations.23 - **List** pods in all namespaces or in a specific namespace.24 - **Get** a pod by name from the specified namespace.25 - **Delete** a pod by name from the specified namespace.26 - **Show logs** for a pod by name from the specified namespace.27 - **Top** gets resource usage metrics for all pods or a specific pod in the specified namespace.28 - **Exec** into a pod and run a command.29 - **Run** a container image in a pod and optionally expose it.30- **β Namespaces**: List Kubernetes Namespaces.31- **β Events**: View Kubernetes events in all namespaces or in a specific namespace.32- **β Projects**: List OpenShift Projects.33- **βΈοΈ Helm**:34 - **Install** a Helm chart in the current or provided namespace.35 - **List** Helm releases in all namespaces or in a specific namespace.36 - **Uninstall** a Helm release in the current or provided namespace.37- **π Observability**: Optional OpenTelemetry distributed tracing and metrics with custom sampling rates. Includes `/stats` endpoint for real-time statistics. See [OTEL.md](docs/OTEL.md).3839Unlike other Kubernetes MCP server implementations, this **IS NOT** just a wrapper around `kubectl` or `helm` command-line tools.40It is a **Go-based native implementation** that interacts directly with the Kubernetes API server.4142There is **NO NEED** for external dependencies or tools to be installed on the system.43If you're using the native binaries you don't need to have Node or Python installed on your system.4445- **β Lightweight**: The server is distributed as a single native binary for Linux, macOS, and Windows.46- **β High-Performance / Low-Latency**: Directly interacts with the Kubernetes API server without the overhead of calling and waiting for external commands.47- **β Multi-Cluster**: Can interact with multiple Kubernetes clusters simultaneously (as defined in your kubeconfig files).48- **β Cross-Platform**: Available as a native binary for Linux, macOS, and Windows, as well as an npm package, a Python package, and container/Docker image.49- **β Configurable**: Supports [command-line arguments](#configuration) to configure the server behavior.50- **β Well tested**: The server has an extensive test suite to ensure its reliability and correctness across different Kubernetes environments.5152## π Getting Started <a id="getting-started"></a>5354### Requirements5556- Access to a Kubernetes cluster.5758<details>59<summary><b>Claude Code</b></summary>6061Follow the [dedicated Claude Code getting started guide](docs/getting-started-claude-code.md) in our [user documentation](docs/).6263For a secure production setup with dedicated ServiceAccount and read-only access, also review the [Kubernetes setup guide](docs/getting-started-kubernetes.md).6465</details>6667### Claude Desktop6869#### Using npx7071If you have npm installed, this is the fastest way to get started with `kubernetes-mcp-server` on Claude Desktop.7273Open your `claude_desktop_config.json` and add the mcp server to the list of `mcpServers`:74``` json75{76 "mcpServers": {77 "kubernetes": {78 "command": "npx",79 "args": [80 "-y",81 "kubernetes-mcp-server@latest"82 ]83 }84 }85}86```8788### VS Code / VS Code Insiders8990Install the Kubernetes MCP server extension in VS Code Insiders by pressing the following link:9192[<img src="https://img.shields.io/badge/VS_Code-VS_Code?style=flat-square&label=Install%20Server&color=0098FF" alt="Install in VS Code">](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522kubernetes%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522kubernetes-mcp-server%2540latest%2522%255D%257D)93[<img alt="Install in VS Code Insiders" src="https://img.shields.io/badge/VS_Code_Insiders-VS_Code_Insiders?style=flat-square&label=Install%20Server&color=24bfa5">](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522kubernetes%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522kubernetes-mcp-server%2540latest%2522%255D%257D)9495Alternatively, you can install the extension manually by running the following command:9697```shell98# For VS Code99code --add-mcp '{"name":"kubernetes","command":"npx","args":["kubernetes-mcp-server@latest"]}'100# For VS Code Insiders101code-insiders --add-mcp '{"name":"kubernetes","command":"npx","args":["kubernetes-mcp-server@latest"]}'102```103104### Cursor105106Install the Kubernetes MCP server extension in Cursor by pressing the following link:107108[](https://cursor.com/en/install-mcp?name=kubernetes-mcp-server&config=eyJjb21tYW5kIjoibnB4IC15IGt1YmVybmV0ZXMtbWNwLXNlcnZlckBsYXRlc3QifQ%3D%3D)109110Alternatively, you can install the extension manually by editing the `mcp.json` file:111112```json113{114 "mcpServers": {115 "kubernetes-mcp-server": {116 "command": "npx",117 "args": ["-y", "kubernetes-mcp-server@latest"]118 }119 }120}121```122123### Goose CLI124125[Goose CLI](https://blog.marcnuri.com/goose-on-machine-ai-agent-cli-introduction) is the easiest (and cheapest) way to get rolling with artificial intelligence (AI) agents.126127#### Using npm128129If you have npm installed, this is the fastest way to get started with `kubernetes-mcp-server`.130131Open your goose `config.yaml` and add the mcp server to the list of `mcpServers`:132```yaml133extensions:134 kubernetes:135 command: npx136 args:137 - -y138 - kubernetes-mcp-server@latest139140```141142## π₯ Demos <a id="demos"></a>143144### Diagnosing and automatically fixing an OpenShift Deployment145146Demo showcasing how Kubernetes MCP server is leveraged by Claude Desktop to automatically diagnose and fix a deployment in OpenShift without any user assistance.147148https://github.com/user-attachments/assets/a576176d-a142-4c19-b9aa-a83dc4b8d941149150### _Vibe Coding_ a simple game and deploying it to OpenShift151152In this demo, I walk you through the process of _Vibe Coding_ a simple game using VS Code and how to leverage [Podman MCP server](https://github.com/manusa/podman-mcp-server) and Kubernetes MCP server to deploy it to OpenShift.153154<a href="https://www.youtube.com/watch?v=l05jQDSrzVI" target="_blank">155 <img src="docs/images/vibe-coding.jpg" alt="Vibe Coding: Build & Deploy a Game on Kubernetes" width="240" />156</a>157158### Supercharge GitHub Copilot with Kubernetes MCP Server in VS Code - One-Click Setup!159160In this demo, I'll show you how to set up Kubernetes MCP server in VS code just by clicking a link.161162<a href="https://youtu.be/AI4ljYMkgtA" target="_blank">163 <img src="docs/images/kubernetes-mcp-server-github-copilot.jpg" alt="Supercharge GitHub Copilot with Kubernetes MCP Server in VS Code - One-Click Setup!" width="240" />164</a>165166## βοΈ Configuration <a id="configuration"></a>167168The Kubernetes MCP server can be configured using command line (CLI) arguments.169170You can run the CLI executable either by using `npx`, `uvx`, or by downloading the [latest release binary](https://github.com/containers/kubernetes-mcp-server/releases/latest).171172```shell173# Run the Kubernetes MCP server using npx (in case you have npm and node installed)174npx kubernetes-mcp-server@latest --help175```176177```shell178# Run the Kubernetes MCP server using uvx (in case you have uv and python installed)179uvx kubernetes-mcp-server@latest --help180```181182```shell183# Run the Kubernetes MCP server using the latest release binary184./kubernetes-mcp-server --help185```186187### Configuration Options188189| Option | Description |190|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|191| `--port` | Starts the MCP server in Streamable HTTP mode (path /mcp) and Server-Sent Event (SSE) (path /sse) mode and listens on the specified port . |192| `--log-level` | Sets the logging level (values [from 0-9](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md)). Similar to [kubectl logging levels](https://kubernetes.io/docs/reference/kubectl/quick-reference/#kubectl-output-verbosity-and-debugging). |193| `--config` | (Optional) Path to the main TOML configuration file. See [Configuration Reference](docs/configuration.md) for details. |194| `--config-dir` | (Optional) Path to drop-in configuration directory. Files are loaded in lexical (alphabetical) order. Defaults to `conf.d` relative to the main config file if `--config` is specified. See [Configuration Reference](docs/configuration.md) for details. |195| `--kubeconfig` | Path to the Kubernetes configuration file. If not provided, it will try to resolve the configuration (in-cluster, default location, etc.). |196| `--list-output` | Output format for resource list operations (one of: yaml, table) (default "table") |197| `--read-only` | If set, the MCP server will run in read-only mode, meaning it will not allow any write operations (create, update, delete) on the Kubernetes cluster. This is useful for debugging or inspecting the cluster without making changes. |198| `--disable-destructive` | If set, the MCP server will disable all destructive operations (delete, update, etc.) on the Kubernetes cluster. This is useful for debugging or inspecting the cluster without accidentally making changes. This option has no effect when `--read-only` is used. |199| `--stateless` | If set, the MCP server will run in stateless mode, disabling tool and prompt change notifications. This is useful for container deployments, load balancing, and serverless environments where maintaining client state is not desired. |200| `--toolsets` | Comma-separated list of toolsets to enable. Check the [π οΈ Tools and Functionalities](#tools-and-functionalities) section for more information. |201| `--disable-multi-cluster` | If set, the MCP server will disable multi-cluster support and will only use the current context from the kubeconfig file. This is useful if you want to restrict the MCP server to a single cluster. |202| `--cluster-provider`. | Cluster provider strategy to use (one of: kubeconfig, in-cluster, kcp, disabled). If not set, the server will auto-detect based on the environment. |203204### TOML Configuration Files205206For complex or persistent configurations, use TOML configuration files instead of CLI arguments:207208```shell209kubernetes-mcp-server --config /etc/kubernetes-mcp-server/config.toml210```211212**Example configuration:**213214```toml215log_level = 2216read_only = true217toolsets = ["core", "config", "helm", "kubevirt"]218219[telemetry]220endpoint = "http://localhost:4317"221```222223For comprehensive TOML configuration documentation, including:224- All configuration options and their defaults225- Drop-in configuration files for modular settings226- Dynamic configuration reload via SIGHUP227- Server instructions for MCP Tool Search228- Custom MCP prompts229230See the **[Configuration Reference](docs/configuration.md)**.231232## π MCP Logging <a id="mcp-logging"></a>233234The server supports the MCP logging capability, allowing clients to receive debugging information via structured log messages.235Kubernetes API errors are automatically categorized and logged to clients with appropriate severity levels.236Sensitive data (tokens, keys, passwords, cloud credentials) is automatically redacted before being sent to clients.237238See the **[MCP Logging Guide](docs/logging.md)**.239240## π οΈ Tools and Functionalities <a id="tools-and-functionalities"></a>241242The Kubernetes MCP server supports enabling or disabling specific groups of tools and functionalities (tools, resources, prompts, and so on) via the `--toolsets` command-line flag or `toolsets` configuration option.243This allows you to control which Kubernetes functionalities are available to your AI tools.244Enabling only the toolsets you need can help reduce the context size and improve the LLM's tool selection accuracy.245246### Available Toolsets247248The following sets of tools are available (toolsets marked with β in the Default column are enabled by default):249250<!-- AVAILABLE-TOOLSETS-START -->251252| Toolset | Description | Default |253|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|254| config | View and manage the current local Kubernetes configuration (kubeconfig) | β |255| core | Most common tools for Kubernetes management (Pods, Generic Resources, Events, etc.) | β |256| helm | Tools for managing Helm charts and releases | β |257| kcp | Manage kcp workspaces and multi-tenancy features | |258| kiali | Most common tools for managing Kiali, check the [Kiali documentation](https://github.com/containers/kubernetes-mcp-server/blob/main/docs/KIALI.md) for more details. | |259| kubevirt | KubeVirt virtual machine management tools | |260261<!-- AVAILABLE-TOOLSETS-END -->262263### Tools264265In case multi-cluster support is enabled (default) and you have access to multiple clusters, all applicable tools will include an additional `context` argument to specify the Kubernetes context (cluster) to use for that operation.266267<!-- AVAILABLE-TOOLSETS-TOOLS-START -->268269<details>270271<summary>config</summary>272273- **configuration_contexts_list** - List all available context names and associated server urls from the kubeconfig file274275- **targets_list** - List all available targets276277- **configuration_view** - Get the current Kubernetes configuration content as a kubeconfig YAML278 - `minified` (`boolean`) - Return a minified version of the configuration. If set to true, keeps only the current-context and the relevant pieces of the configuration for that context. If set to false, all contexts, clusters, auth-infos, and users are returned in the configuration. (Optional, default true)279280</details>281282<details>283284<summary>core</summary>285286- **events_list** - List Kubernetes events (warnings, errors, state changes) for debugging and troubleshooting in the current cluster from all namespaces287 - `namespace` (`string`) - Optional Namespace to retrieve the events from. If not provided, will list events from all namespaces288289- **namespaces_list** - List all the Kubernetes namespaces in the current cluster290291- **projects_list** - List all the OpenShift projects in the current cluster292293- **nodes_log** - Get logs from a Kubernetes node (kubelet, kube-proxy, or other system logs). This accesses node logs through the Kubernetes API proxy to the kubelet294 - `name` (`string`) **(required)** - Name of the node to get logs from295 - `query` (`string`) **(required)** - query specifies services(s) or files from which to return logs (required). Example: "kubelet" to fetch kubelet logs, "/<log-file-name>" to fetch a specific log file from the node (e.g., "/var/log/kubelet.log" or "/var/log/kube-proxy.log")296 - `tailLines` (`integer`) - Number of lines to retrieve from the end of the logs (Optional, 0 means all logs)297298- **nodes_stats_summary** - Get detailed resource usage statistics from a Kubernetes node via the kubelet's Summary API. Provides comprehensive metrics including CPU, memory, filesystem, and network usage at the node, pod, and container levels. On systems with cgroup v2 and kernel 4.20+, also includes PSI (Pressure Stall Information) metrics that show resource pressure for CPU, memory, and I/O. See https://kubernetes.io/docs/reference/instrumentation/understand-psi-metrics/ for details on PSI metrics299 - `name` (`string`) **(required)** - Name of the node to get stats from300301- **nodes_top** - List the resource consumption (CPU and memory) as recorded by the Kubernetes Metrics Server for the specified Kubernetes Nodes or all nodes in the cluster302 - `label_selector` (`string`) - Kubernetes label selector (e.g. 'node-role.kubernetes.io/worker=') to filter nodes by label (Optional, only applicable when name is not provided)303 - `name` (`string`) - Name of the Node to get the resource consumption from (Optional, all Nodes if not provided)304305- **pods_list** - List all the Kubernetes pods in the current cluster from all namespaces306 - `fieldSelector` (`string`) - Optional Kubernetes field selector to filter pods by field values (e.g. 'status.phase=Running', 'spec.nodeName=node1'). Supported fields: metadata.name, metadata.namespace, spec.nodeName, spec.restartPolicy, spec.schedulerName, spec.serviceAccountName, status.phase (Pending/Running/Succeeded/Failed/Unknown), status.podIP, status.nominatedNodeName. Note: CrashLoopBackOff is a container state, not a pod phase, so it cannot be filtered directly. See https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/307 - `labelSelector` (`string`) - Optional Kubernetes label selector (e.g. 'app=myapp,env=prod' or 'app in (myapp,yourapp)'), use this option when you want to filter the pods by label308309- **pods_list_in_namespace** - List all the Kubernetes pods in the specified namespace in the current cluster310 - `fieldSelector` (`string`) - Optional Kubernetes field selector to filter pods by field values (e.g. 'status.phase=Running', 'spec.nodeName=node1'). Supported fields: metadata.name, metadata.namespace, spec.nodeName, spec.restartPolicy, spec.schedulerName, spec.serviceAccountName, status.phase (Pending/Running/Succeeded/Failed/Unknown), status.podIP, status.nominatedNodeName. Note: CrashLoopBackOff is a container state, not a pod phase, so it cannot be filtered directly. See https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/311 - `labelSelector` (`string`) - Optional Kubernetes label selector (e.g. 'app=myapp,env=prod' or 'app in (myapp,yourapp)'), use this option when you want to filter the pods by label312 - `namespace` (`string`) **(required)** - Namespace to list pods from313314- **pods_get** - Get a Kubernetes Pod in the current or provided namespace with the provided name315 - `name` (`string`) **(required)** - Name of the Pod316 - `namespace` (`string`) - Namespace to get the Pod from317318- **pods_delete** - Delete a Kubernetes Pod in the current or provided namespace with the provided name319 - `name` (`string`) **(required)** - Name of the Pod to delete320 - `namespace` (`string`) - Namespace to delete the Pod from321322- **pods_top** - List the resource consumption (CPU and memory) as recorded by the Kubernetes Metrics Server for the specified Kubernetes Pods in the all namespaces, the provided namespace, or the current namespace323 - `all_namespaces` (`boolean`) - If true, list the resource consumption for all Pods in all namespaces. If false, list the resource consumption for Pods in the provided namespace or the current namespace324 - `label_selector` (`string`) - Kubernetes label selector (e.g. 'app=myapp,env=prod' or 'app in (myapp,yourapp)'), use this option when you want to filter the pods by label (Optional, only applicable when name is not provided)325 - `name` (`string`) - Name of the Pod to get the resource consumption from (Optional, all Pods in the namespace if not provided)326 - `namespace` (`string`) - Namespace to get the Pods resource consumption from (Optional, current namespace if not provided and all_namespaces is false)327328- **pods_exec** - Execute a command in a Kubernetes Pod (shell access, run commands in container) in the current or provided namespace with the provided name and command329 - `command` (`array`) **(required)** - Command to execute in the Pod container. The first item is the command to be run, and the rest are the arguments to that command. Example: ["ls", "-l", "/tmp"]330 - `container` (`string`) - Name of the Pod container where the command will be executed (Optional)331 - `name` (`string`) **(required)** - Name of the Pod where the command will be executed332 - `namespace` (`string`) - Namespace of the Pod where the command will be executed333334- **pods_log** - Get the logs of a Kubernetes Pod in the current or provided namespace with the provided name335 - `container` (`string`) - Name of the Pod container to get the logs from (Optional)336 - `name` (`string`) **(required)** - Name of the Pod to get the logs from337 - `namespace` (`string`) - Namespace to get the Pod logs from338 - `previous` (`boolean`) - Return previous terminated container logs (Optional)339 - `tail` (`integer`) - Number of lines to retrieve from the end of the logs (Optional, default: 100)340341- **pods_run** - Run a Kubernetes Pod in the current or provided namespace with the provided container image and optional name342 - `image` (`string`) **(required)** - Container Image to run in the Pod343 - `name` (`string`) - Name of the Pod (Optional, random name if not provided)344 - `namespace` (`string`) - Namespace to run the Pod in345 - `port` (`number`) - TCP/IP port to expose from the Pod container (Optional, no port exposed if not provided)346347- **resources_list** - List Kubernetes resources and objects in the current cluster by providing their apiVersion and kind and optionally the namespace and label selector348(common apiVersion and kind include: v1 Pod, v1 Service, v1 Node, apps/v1 Deployment, networking.k8s.io/v1 Ingress, route.openshift.io/v1 Route)349 - `apiVersion` (`string`) **(required)** - apiVersion of the resources (examples of valid apiVersion are: v1, apps/v1, networking.k8s.io/v1)350 - `fieldSelector` (`string`) - Optional Kubernetes field selector to filter resources by field values (e.g. 'status.phase=Running', 'metadata.name=myresource'). Supported fields vary by resource type. For Pods: metadata.name, metadata.namespace, spec.nodeName, spec.restartPolicy, spec.schedulerName, spec.serviceAccountName, status.phase (Pending/Running/Succeeded/Failed/Unknown), status.podIP, status.nominatedNodeName. See https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/351 - `kind` (`string`) **(required)** - kind of the resources (examples of valid kind are: Pod, Service, Deployment, Ingress)352 - `labelSelector` (`string`) - Optional Kubernetes label selector (e.g. 'app=myapp,env=prod' or 'app in (myapp,yourapp)'), use this option when you want to filter the resources by label353 - `namespace` (`string`) - Optional Namespace to retrieve the namespaced resources from (ignored in case of cluster scoped resources). If not provided, will list resources from all namespaces354355- **resources_get** - Get a Kubernetes resource in the current cluster by providing its apiVersion, kind, optionally the namespace, and its name356(common apiVersion and kind include: v1 Pod, v1 Service, v1 Node, apps/v1 Deployment, networking.k8s.io/v1 Ingress, route.openshift.io/v1 Route)357 - `apiVersion` (`string`) **(required)** - apiVersion of the resource (examples of valid apiVersion are: v1, apps/v1, networking.k8s.io/v1)358 - `kind` (`string`) **(required)** - kind of the resource (examples of valid kind are: Pod, Service, Deployment, Ingress)359 - `name` (`string`) **(required)** - Name of the resource360 - `namespace` (`string`) - Optional Namespace to retrieve the namespaced resource from (ignored in case of cluster scoped resources). If not provided, will get resource from configured namespace361362- **resources_create_or_update** - Create or update a Kubernetes resource in the current cluster by providing a YAML or JSON representation of the resource363(common apiVersion and kind include: v1 Pod, v1 Service, v1 Node, apps/v1 Deployment, networking.k8s.io/v1 Ingress, route.openshift.io/v1 Route)364 - `resource` (`string`) **(required)** - A JSON or YAML containing a representation of the Kubernetes resource. Should include top-level fields such as apiVersion,kind,metadata, and spec365366- **resources_delete** - Delete a Kubernetes resource in the current cluster by providing its apiVersion, kind, optionally the namespace, and its name367(common apiVersion and kind include: v1 Pod, v1 Service, v1 Node, apps/v1 Deployment, networking.k8s.io/v1 Ingress, route.openshift.io/v1 Route)368 - `apiVersion` (`string`) **(required)** - apiVersion of the resource (examples of valid apiVersion are: v1, apps/v1, networking.k8s.io/v1)369 - `gracePeriodSeconds` (`integer`) - Optional duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used370 - `kind` (`string`) **(required)** - kind of the resource (examples of valid kind are: Pod, Service, Deployment, Ingress)371 - `name` (`string`) **(required)** - Name of the resource372 - `namespace` (`string`) - Optional Namespace to delete the namespaced resource from (ignored in case of cluster scoped resources). If not provided, will delete resource from configured namespace373374- **resources_scale** - Get or update the scale of a Kubernetes resource in the current cluster by providing its apiVersion, kind, name, and optionally the namespace. If the scale is set in the tool call, the scale will be updated to that value. Always returns the current scale of the resource375 - `apiVersion` (`string`) **(required)** - apiVersion of the resource (examples of valid apiVersion are apps/v1)376 - `kind` (`string`) **(required)** - kind of the resource (examples of valid kind are: StatefulSet, Deployment)377 - `name` (`string`) **(required)** - Name of the resource378 - `namespace` (`string`) - Optional Namespace to get/update the namespaced resource scale from (ignored in case of cluster scoped resources). If not provided, will get/update resource scale from configured namespace379 - `scale` (`integer`) - Optional scale to update the resources scale to. If not provided, will return the current scale of the resource, and not update it380381</details>382383<details>384385<summary>helm</summary>386387- **helm_install** - Install (deploy) a Helm chart to create a release in the current or provided namespace388 - `chart` (`string`) **(required)** - Chart reference to install (for example: stable/grafana, oci://ghcr.io/nginxinc/charts/nginx-ingress)389 - `name` (`string`) - Name of the Helm release (Optional, random name if not provided)390 - `namespace` (`string`) - Namespace to install the Helm chart in (Optional, current namespace if not provided)391 - `values` (`object`) - Values to pass to the Helm chart (Optional)392393- **helm_list** - List all the Helm releases in the current or provided namespace (or in all namespaces if specified)394 - `all_namespaces` (`boolean`) - If true, lists all Helm releases in all namespaces ignoring the namespace argument (Optional)395 - `namespace` (`string`) - Namespace to list Helm releases from (Optional, all namespaces if not provided)396397- **helm_uninstall** - Uninstall a Helm release in the current or provided namespace398 - `name` (`string`) **(required)** - Name of the Helm release to uninstall399 - `namespace` (`string`) - Namespace to uninstall the Helm release from (Optional, current namespace if not provided)400401</details>402403<details>404405<summary>kcp</summary>406407- **kcp_workspaces_list** - List all available kcp workspaces in the current cluster408409- **kcp_workspace_describe** - Get detailed information about a specific kcp workspace410 - `workspace` (`string`) **(required)** - Name or path of the workspace to describe411412</details>413414<details>415416<summary>kiali</summary>417418- **kiali_mesh_graph** - Returns the topology of a specific namespaces, health, status of the mesh and namespaces. Includes a mesh health summary overview with aggregated counts of healthy, degraded, and failing apps, workloads, and services. Use this for high-level overviews419 - `graphType` (`string`) - Optional type of graph to return: 'versionedApp', 'app', 'service', 'workload', 'mesh'420 - `namespace` (`string`) - Optional single namespace to include in the graph (alternative to namespaces)421 - `namespaces` (`string`) - Optional comma-separated list of namespaces to include in the graph422 - `rateInterval` (`string`) - Optional rate interval for fetching (e.g., '10m', '5m', '1h').423424- **kiali_manage_istio_config_read** - Lists or gets Istio configuration objects (Gateways, VirtualServices, etc.)425 - `action` (`string`) **(required)** - Action to perform: list or get426 - `group` (`string`) - API group of the Istio object (e.g., 'networking.istio.io', 'gateway.networking.k8s.io')427 - `kind` (`string`) - Kind of the Istio object (e.g., 'DestinationRule', 'VirtualService', 'HTTPRoute', 'Gateway')428 - `name` (`string`) - Name of the Istio object429 - `namespace` (`string`) - Namespace containing the Istio object430 - `version` (`string`) - API version of the Istio object (e.g., 'v1', 'v1beta1')431432- **kiali_manage_istio_config** - Creates, patches, or deletes Istio configuration objects (Gateways, VirtualServices, etc.)433 - `action` (`string`) **(required)** - Action to perform: create, patch, or delete434 - `group` (`string`) - API group of the Istio object (e.g., 'networking.istio.io', 'gateway.networking.k8s.io')435 - `json_data` (`string`) - JSON data to apply or create the object436 - `kind` (`string`) - Kind of the Istio object (e.g., 'DestinationRule', 'VirtualService', 'HTTPRoute', 'Gateway')437 - `name` (`string`) - Name of the Istio object438 - `namespace` (`string`) - Namespace containing the Istio object439 - `version` (`string`) - API version of the Istio object (e.g., 'v1', 'v1beta1')440441- **kiali_get_resource_details** - Gets lists or detailed info for Kubernetes resources (services, workloads) within the mesh442 - `namespaces` (`string`) - Comma-separated list of namespaces to get services from (e.g. 'bookinfo' or 'bookinfo,default'). If not provided, will list services from all accessible namespaces443 - `resource_name` (`string`) - Name of the resource to get details for (optional string - if provided, gets details; if empty, lists all).444 - `resource_type` (`string`) - Type of resource to get details for (service, workload)445446- **kiali_get_metrics** - Gets lists or detailed info for Kubernetes resources (services, workloads) within the mesh447 - `byLabels` (`string`) - Comma-separated list of labels to group metrics by (e.g., 'source_workload,destination_service'). Optional448 - `direction` (`string`) - Traffic direction: 'inbound' or 'outbound'. Optional, defaults to 'outbound'449 - `duration` (`string`) - Time range to get metrics for (optional string - if provided, gets metrics (e.g., '1m', '5m', '1h'); if empty, get default 30m).450 - `namespace` (`string`) **(required)** - Namespace to get resources from451 - `quantiles` (`string`) - Comma-separated list of quantiles for histogram metrics (e.g., '0.5,0.95,0.99'). Optional452 - `rateInterval` (`string`) - Rate interval for metrics (e.g., '1m', '5m'). Optional, defaults to '10m'453 - `reporter` (`string`) - Metrics reporter: 'source', 'destination', or 'both'. Optional, defaults to 'source'454 - `requestProtocol` (`string`) - Filter by request protocol (e.g., 'http', 'grpc', 'tcp'). Optional455 - `resource_name` (`string`) **(required)** - Name of the resource to get details for (optional string - if provided, gets details; if empty, lists all).456 - `resource_type` (`string`) **(required)** - Type of resource to get details for (service, workload)457 - `step` (`string`) - Step between data points in seconds (e.g., '15'). Optional, defaults to 15 seconds458459- **kiali_workload_logs** - Get logs for a specific workload's pods in a namespace. Only requires namespace and workload name - automatically discovers pods and containers. Optionally filter by container name, time range, and other parameters. Container is auto-detected if not specified.460 - `container` (`string`) - Optional container name to filter logs. If not provided, automatically detects and uses the main application container (excludes istio-proxy and istio-init)461 - `namespace` (`string`) **(required)** - Namespace containing the workload462 - `since` (`string`) - Time duration to fetch logs from (e.g., '5m', '1h', '30s'). If not provided, returns recent logs463 - `tail` (`integer`) - Number of lines to retrieve from the end of logs (default: 100)464 - `workload` (`string`) **(required)** - Name of the workload to get logs for465466- **kiali_get_traces** - Gets traces for a specific resource (app, service, workload) in a namespace, or gets detailed information for a specific trace by its ID. If traceId is provided, it returns detailed trace information and other parameters are not required.467 - `clusterName` (`string`) - Cluster name for multi-cluster environments (optional, only used when traceId is not provided)468 - `endMicros` (`string`) - End time for traces in microseconds since epoch (optional, defaults to 10 minutes after startMicros if not provided, only used when traceId is not provided)469 - `limit` (`integer`) - Maximum number of traces to return (default: 100, only used when traceId is not provided)470 - `minDuration` (`integer`) - Minimum trace duration in microseconds (optional, only used when traceId is not provided)471 - `namespace` (`string`) - Namespace to get resources from. Required if traceId is not provided.472 - `resource_name` (`string`) - Name of the resource to get traces for. Required if traceId is not provided.473 - `resource_type` (`string`) - Type of resource to get traces for (app, service, workload). Required if traceId is not provided.474 - `startMicros` (`string`) - Start time for traces in microseconds since epoch (optional, defaults to 10 minutes before current time if not provided, only used when traceId is not provided)475 - `tags` (`string`) - JSON string of tags to filter traces (optional, only used when traceId is not provided)476 - `traceId` (`string`) - Unique identifier of the trace to retrieve detailed information for. If provided, this will return detailed trace information and other parameters (resource_type, namespace, resource_name) are not required.477478</details>479480<details>481482<summary>kubevirt</summary>483484- **vm_clone** - Clone a KubeVirt VirtualMachine by creating a VirtualMachineClone resource. This creates a copy of the source VM with a new name using the KubeVirt Clone API485 - `name` (`string`) **(required)** - The name of the source virtual machine to clone486 - `namespace` (`string`) **(required)** - The namespace of the source virtual machine487 - `targetName` (`string`) **(required)** - The name for the new cloned virtual machine488489- **vm_create** - Create a VirtualMachine in the cluster with the specified configuration, automatically resolving instance types, preferences, and container disk images. VM will be created in Halted state by default; use autostart parameter to start it immediately.490 - `autostart` (`boolean`) - Optional flag to automatically start the VM after creation (sets runStrategy to Always instead of Halted). Defaults to false.491 - `instancetype` (`string`) - Optional instance type name for the VM (e.g., 'u1.small', 'u1.medium', 'u1.large')492 - `name` (`string`) **(required)** - The name of the virtual machine493 - `namespace` (`string`) **(required)** - The namespace for the virtual machine494 - `networks` (`array`) - Optional secondary network interfaces to attach to the VM. Each item specifies a Multus NetworkAttachmentDefinition to attach. Accepts either simple strings (NetworkAttachmentDefinition names) or objects with 'name' (interface name in VM) and 'networkName' (NetworkAttachmentDefinition name) properties. Each network creates a bridge interface on the VM.495 - `performance` (`string`) - Optional performance family hint for the VM instance type (e.g., 'u1' for general-purpose, 'o1' for overcommitted, 'c1' for compute-optimized, 'm1' for memory-optimized). Defaults to 'u1' (general-purpose) if not specified.496 - `preference` (`string`) - Optional preference name for the VM497 - `size` (`string`) - Optional workload size hint for the VM (e.g., 'small', 'medium', 'large', 'xlarge'). Used to auto-select an appropriate instance type if not explicitly specified.498 - `storage` (`string`) - Optional storage size for the VM's root disk when using DataSources (e.g., '30Gi', '50Gi', '100Gi'). Defaults to 30Gi. Ignored when using container disks.499 - `workload` (`string`) - The workload for the VM. Accepts OS names (e.g., 'fedora' (default), 'ubuntu', 'centos', 'centos-stream', 'debian', 'rhel', 'opensuse', 'opensuse-tumbleweed', 'opensuse-leap') or full container disk image URLs500501- **vm_lifecycle** - Manage VirtualMachine lifecycle: start, stop, or restart a VM502 - `action` (`string`) **(required)** - The lifecycle action to perform: 'start' (changes runStrategy to Always), 'stop' (changes runStrategy to Halted), or 'restart' (stops then starts the VM)503 - `name` (`string`) **(required)** - The name of the virtual machine504 - `namespace` (`string`) **(required)** - The namespace of the virtual machine505506</details>507508509<!-- AVAILABLE-TOOLSETS-TOOLS-END -->510511### Prompts512513<!-- AVAILABLE-TOOLSETS-PROMPTS-START -->514515<details>516517<summary>core</summary>518519- **cluster-health-check** - Perform comprehensive health assessment of Kubernetes/OpenShift cluster520 - `namespace` (`string`) - Optional namespace to limit health check scope (default: all namespaces)521 - `check_events` (`string`) - Include recent warning/error events (true/false, default: true)522523</details>524525<details>526527<summary>kubevirt</summary>528529- **vm-troubleshoot** - Generate a step-by-step troubleshooting guide for diagnosing VirtualMachine issues530 - `namespace` (`string`) **(required)** - The namespace of the VirtualMachine to troubleshoot531 - `name` (`string`) **(required)** - The name of the VirtualMachine to troubleshoot532533</details>534535536<!-- AVAILABLE-TOOLSETS-PROMPTS-END -->537538## Helm Chart539540A [Helm Chart](https://helm.sh) is available to simplify the deployment of the Kubernetes MCP server. Additional details can be found in the [chart README](./charts/kubernetes-mcp-server/README.md).541542## π§βπ» Development <a id="development"></a>543544### Running with mcp-inspector545546Compile the project and run the Kubernetes MCP server with [mcp-inspector](https://modelcontextprotocol.io/docs/tools/inspector) to inspect the MCP server.547548```shell549# Compile the project550make build551# Run the Kubernetes MCP server with mcp-inspector552npx @modelcontextprotocol/inspector@latest $(pwd)/kubernetes-mcp-server553```554555---556557mcp-name: io.github.containers/kubernetes-mcp-server
Full transparency β inspect the skill content before installing.