MCP server for interacting with Kubernetes clusters
This server has significant gaps in definition quality. While all 7 tools are explicitly registered with schemas and descriptions, most descriptions are extremely terse (10-20 chars), parameter descriptions are minimal or missing, and there is no output schema documentation. The parameter 'clusterName' in get-kubernetics-all-pods-detail is unused in the implementation (the function ignores it), indicating a disconnect between interface and implementation. Error handling is minimal, helpers catch exceptions but return generic strings like 'Error fetching pods' with no actionable recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite all being READ_ONLY. The server lacks any guidance on multi-step workflows, pagination, or result limits. Average description length across tools is ~40 chars, well below the baseline of 194 chars for A+ tools.
Describe pod details by name and namespace
get all pods details from kubernetics cluster
Get sorted events in a Kubernetes namespace
get kubernetics namespaces
Get Kubernetes node taints and labels
get pods details from kubernetics cluster by namespace
Get CPU and memory usage for nodes
Tool descriptions are uniformly terse (10-30 chars), well below the 194-char baseline for production tools. Descriptions like 'get kubernetics namespaces' and 'Get sorted events in a Kubernetes namespace' lack context about WHEN to use the tool, WHAT it returns, and how it differs from similar tools.
Parameter 'clusterName' in get-kubernetics-all-pods-detail is defined in the schema but completely ignored by the implementation (getPodsByNamespace ignores it and queries all pods). This forces LLMs to pass a parameter that has no effect, causing confusion and wasted tokens.
No output schema documentation. Callers cannot predict what fields are returned (pod name, status, namespace, etc.) or what format. LLMs must infer output structure from plain text responses, inviting parsing errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 32 | - | v1 |
Error handling returns generic strings ('Error fetching pods', 'Error describing pod') with no recovery guidance. Per the pattern:recovery-guide, errors should tell the LLM what to try next, e.g., 'Namespace not found. Call get-kubernetics-namespaces to list valid namespaces.'
No pagination support. Tools like get-kubernetics-pods-detail-by-namespace and get-kubernetics-all-pods-detail return unbounded lists (all pods joined by newlines). For large clusters, this can blow the context window. Per the pattern:paginated-result, should accept limit and offset/cursor parameters.
Tool descriptions lack parameter constraints and format guidance. E.g., 'namespace' parameter has no description of expected format (e.g., 'Kubernetes namespace name, typically lowercase alphanumeric with hyphens'). Underspecified parameters invite invalid input from LLMs.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 7 tools are READ_ONLY but server.tool() calls do not declare readOnlyHint: true. This prevents clients from optimizing caching or retry behavior.
getSortedEvents() implementation returns raw JSON.stringify(res) instead of sorted, formatted events. The commented-out code indicates intent to sort and format, but the live implementation just dumps the entire API response. Tokens wasted on irrelevant metadata; LLMs must parse unstructured JSON.
getNodeDetails() returns JSON.stringify(res), the entire Kubernetes node object. No filtering or formatting. Verbose API responses dilute signal and waste context tokens. Should return only relevant fields (taints, labels) as documented in the description.