An MCP server to operate a k3s / Kubernetes cluster (health, logs, and guarded restart/scale/delete) straight from your AI agent.
Strong tool naming (verb_noun pattern), comprehensive descriptions (avg 180 chars, well above 10-char minimum), and clear parameter documentation. All 10 tools have explicit schemas with types and descriptions. Good composition: tools chain logically (cluster_summary → list_pods → pod_logs). Security-conscious design with read-only mode and namespace allowlisting. Gaps: no output schemas documented in code, no pagination support for list_* tools, error handling lacks recovery guidance, no tool annotations (readOnlyHint/destructiveHint) despite clear risk levels.
Summarize overall cluster health in a single call. Start here when triaging a cluster: it returns node and pod totals plus the full list of unhealthy pods, giving the fastest picture of what is wrong before drilling in with `list_pods`, `pod_logs`, or `node_health`. Read-only. Returns a JSON object with node counts, pod phase totals, and unhealthy-pod details (name, namespace, phase, restart count).
Delete a single pod so its controller recreates it. Use to force-recreate a wedged pod (managed by a Deployment, StatefulSet, etc.) without restarting the whole deployment. Mutating: rejected unless read-only mode is off and the namespace is allowlisted. Returns a JSON status object.
List deployments with their ready/desired replica counts and namespace. Use to check rollout health or to find a deployment to `restart_deployment` or `scale_deployment`. A deployment whose ready count is below its desired count is still rolling out or degraded. Read-only. Returns a JSON array.
Return recent cluster events, most relevant first (Warnings before Normal). Use to find out *why* something is unhealthy: scheduling failures, image-pull errors, failed probes, and OOM kills all surface here. Pair this with `cluster_summary` when a pod is failing but the reason is not obvious. Read-only. Returns a JSON array of up to `limit` events.
Output schemas not documented in code. Tool descriptions state what is returned (e.g., 'JSON object with node counts, pod phase totals') but no formal schema definition visible. LLMs cannot reliably parse or chain results without explicit field documentation.
No pagination support in list_* tools. list_pods, list_deployments, and list_events lack limit/offset or cursor parameters. Large clusters could return thousands of items, exhausting context window and degrading LLM reasoning.
Error handling lacks recovery guidance. Descriptions mention errors (e.g., 'error message if the pod or namespace does not exist') but do not guide LLM on next steps. No structured error classification (retryable vs. user-fixable vs. fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
List pods with phase, restart count, and node, unhealthy pods sorted first. Use after `cluster_summary` to enumerate pods, optionally scoped to one namespace, then feed a pod name into `pod_logs`. Read-only. Returns a JSON array of pod objects.
Report per-node readiness, kubelet version, capacity, and pressure conditions. Use to diagnose node-level problems — NotReady nodes, or memory/disk/PID pressure — when pods are stuck Pending or being evicted. Read-only. Returns a JSON array with one object per node.
Return the last `tail` lines of a single pod's logs as plain text. Use this to investigate a specific pod after `cluster_summary` or `list_pods` flags it as unhealthy (CrashLoopBackOff, restarts, errors). Reads the current container's stdout/stderr only — it does not follow/stream or fetch previous-container logs. Returns the raw log text, or an error message if the pod or namespace does not exist.
Trigger a rolling restart of a deployment (like `kubectl rollout restart`). Use to recycle a deployment's pods after a config/secret change or to clear a stuck state, without changing the replica count. Mutating: rejected unless read-only mode is off and the namespace is in the mutable-namespace allowlist. Returns a JSON status object describing the triggered rollout.
Scale a deployment to a specific replica count. Use to manually scale a workload up or down. Mutating: rejected unless read-only mode is off, the namespace is allowlisted, and `replicas` is within the operator's configured 0..max bound. Returns a JSON status object with the applied replica count.
Report the server's effective configuration. Returns the target kube context, the read-only flag, the mutable-namespace allowlist, and the maximum replica bound. Use this to confirm what the server is permitted to do before attempting a mutation, or to understand why a mutating call was rejected. Read-only. Returns a JSON object.
No tool annotations despite clear risk levels. Mutating tools (restart_deployment, scale_deployment, delete_pod) and read-only tools are not marked with destructiveHint, readOnlyHint, or idempotentHint. MCP spec 2026-07-28 supports tool annotations; omitting them wastes a safety signal.
scale_deployment lacks bounds documentation. Parameter 'replicas' description says 'from 0 up to the operator's configured maximum' but does not state the actual max or how to discover it. LLMs cannot validate input without explicit constraints.