MCP server for read-only DevOps operations with Kubernetes and Minikube
This server provides 6 read-only DevOps tools with consistent HTTP/SSE transport and proper schema definitions. All tools have descriptions and input schemas with type constraints. However, the definitions lack depth: descriptions are minimal (mostly 8-15 words), parameter descriptions are generic, output schemas are not documented, and error handling is basic. Tools follow verb_noun naming convention correctly. The server demonstrates competent baseline engineering but misses patterns for LLM optimization (e.g., rich error recovery guidance, output structure documentation, parameter constraints beyond enums). Average tool score: 62/100.
Get the overall status of the Kubernetes cluster including nodes and system pods
Get Horizontal Pod Autoscaler (HPA) status showing current/desired replicas and metrics
Get logs from a specific pod
Get CPU and memory usage for nodes or pods in the cluster
List all pods in the cluster with their status, namespace, and age
List all services in the cluster with their type, cluster IP, and ports
Output schemas are not documented. Tool descriptions state what data is returned (e.g., 'List all pods...') but do not specify the structure, fields, or types the LLM should expect. This forces LLMs to infer output format from kubectl's default text table output, causing parsing errors and wasted token usage on unstructured text.
Descriptions are too brief to guide LLM selection. Most descriptions are 8-15 words and lack context for WHEN to use each tool and WHY it differs from similar tools (e.g., how does 'get_resource_usage' differ from Kubernetes metrics queries; when should an agent call it instead of directly querying Prometheus?). Baseline for A+ tools is 50-200 characters; these average ~95 chars.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Parameter descriptions lack actionable constraints. For example, 'namespace' is described only as 'Namespace to list pods from (optional, defaults to all namespaces)', it does not state valid formats, length limits, or whether it accepts wildcards. 'tail' in get_pod_logs has no bounds (e.g., min=1, max=10000), inviting the LLM to pass absurd values. Baseline: 100% of A+ tools have parameter constraints documented.
Error handling is generic. The catch block returns 'kubectl command failed: <error.message>' without recovery guidance. If a pod is not found, the error does not suggest 'Try list_pods() first to find valid pod names.' If kubectl is not installed, the error does not suggest installing it. Baseline: A+ tools categorize errors as retryable, user-fixable, or fatal and provide next steps.
No input validation or sanitization. Parameters (especially 'pod_name', 'namespace') are passed directly into kubectl commands via string interpolation: `kubectl logs ${podName} -n ${namespace}`. This is vulnerable to command injection if an LLM (or user) passes a malicious namespace like 'default; rm -rf /'. All user-provided input must be validated and escaped.
Return values are raw kubectl text output. Tools return unstructured kubectl table output (e.g., 'NAME READY STATUS RESTARTS AGE'), which the LLM must parse. This wastes tokens and increases hallucination risk. A+ tools return structured JSON/objects with typed fields. The server should parse kubectl output and return JSON with fields like {pods: [{name, namespace, status, age}], total: N}.
No pagination support. Tools like list_pods and list_services return all results without limiting or offering pagination. In a large cluster with hundreds of pods, this exhausts context windows and forces the LLM to reason over massive unstructured text. Baseline: paginated tools accept limit/offset and return a total count.
Inconsistent parameter naming in 'get_pod_logs'. Parameter is 'pod_name' (with underscore), but other tools use 'namespace' and 'resource_type'. While not breaking, inconsistency forces the LLM to reason about field mappings. Adopt a single naming convention across all tools (e.g., all suffixed with _name, _type).