The four switches are the design decision that matters: the same server can be a safe investigative tool on production and a full operator on a dev cluster, without maintaining two setups or trusting a prompt to hold the line.
A bridge between an AI assistant and a Kubernetes cluster that translates requests into kubectl commands or direct API calls and returns structured results. What sets it apart is the shape of its permissions: reads, writes, deletes, kubectl and helm are four separate switches you set when you launch it.
- Command tools — `kubectl` and `helm`, each running an arbitrary command and returning its output
- Read tools — `k8s_get`, `k8s_describe`, `k8s_logs` with container, tail, since and previous options, `k8s_events`, `k8s_apis`, `k8s_crds`, `k8s_top_nodes`, `k8s_top_pods`, `k8s_rollout_status`, `k8s_rollout_history`, `k8s_auth_can_i` and `k8s_auth_whoami`
- Write tools — `k8s_create` and `k8s_apply` from YAML or JSON content, `k8s_run`, `k8s_expose`, `k8s_scale`, `k8s_autoscale`, `k8s_patch`, `k8s_label`, `k8s_set_image`, `k8s_set_env`, `k8s_set_resources`, the rollout family (`k8s_rollout_undo`, `k8s_rollout_restart`, `k8s_rollout_pause`, `k8s_rollout_resume`), node operations (`k8s_cordon`, `k8s_uncordon`, `k8s_drain`, `k8s_taint`, `k8s_untaint`) and access paths (`k8s_exec_command`, `k8s_port_forward`, `k8s_cp`)
- Delete tools — `k8s_delete` by name, label selector or across a namespace, with force and grace period
A working cluster and a kubeconfig that reaches it, with `kubectl` and `helm` on the PATH when you run it directly rather than through Docker; Python >= 3.11 for the `uvx mcp-kubernetes-server` path, and `KUBECONFIG` pointing at your config. The Docker route mounts your kubeconfig into the container instead. Four flags decide what an assistant can do: `--disable-kubectl`, `--disable-helm`, `--disable-write` and `--disable-delete` — a disabled operation returns a clear message rather than failing obscurely. `--transport` selects stdio, sse or streamable-http, with `--host` and `--port` for the network ones. Whatever the flags allow, the kubeconfig's own credentials still bound it, so test with `kubectl` first when a call is refused.
One command — uvx mcp-kubernetes-server
