Skip to main content
Glama

kubelint-mcp

An MCP server that lets an AI lint and explain Kubernetes manifests statically: plain YAML, multi-document files, kind: List wrappers and helm template output. Every finding has a rule ID, a severity, file:line and a concrete fix. It never contacts a cluster, never applies anything, and needs neither kubectl nor any other binary.

How it differs from what exists. The Kubernetes MCP servers I could find either talk to a live cluster (kubectl-style servers) or wrap external tools: kube-lint-mcp ships kubeconform, kubectl and helm inside a Docker image and validates schemas. This server is pure Python (mcp + pyyaml), runs fully offline, and goes after what schema validation cannot see: security posture (privileged, root, capabilities, host access, docker.sock), cross-object mistakes (a Service whose selector matches nothing, an Ingress pointing at a missing port, a configMapKeyRef to a key that does not exist), RBAC reasoning, a hand-checked table of removed and deprecated API versions with the release that dropped them, and a unified-diff preview of the safe fixes. Secret values are never echoed back to the model: names and lengths only.

Install

Claude Code:

claude mcp add kubelint -- uvx kubelint-mcp --dir .

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "kubelint": {
      "command": "uvx",
      "args": ["kubelint-mcp", "--dir", "C:\\path\\to\\your\\manifests"]
    }
  }
}

Without uv: pip install kubelint-mcp, then run kubelint-mcp --dir /path/to/manifests.

Flag

Meaning

--dir PATH

Only files inside this directory can be read (default: the current directory).

--disable IDS

Comma-separated rule ids to turn off, e.g. --disable K8S1004,K8S1018. Repeatable.

Silence a single finding in the file itself with a comment on the line above it (or at the end of the line):

containers:
  # kubelint-ignore: K8S1009, K8S1010
  - name: app            # the whole container item is covered

A comment at the very top of a document (or right after ---) covers that whole document.

Related MCP server: Kube Check

Tools

Tool

What it does

k8s_overview(path)

Every object by kind and namespace, workloads with replicas, images and ports, Services and what they select, Ingress routes, host-network workloads.

lint_manifests(path)

41 rules (K8S1000-K8S1040): resources, images, security context, host access, probes, replicas, namespaces, secrets, exposure, CronJob settings, removed APIs.

check_references(path)

17 cross-resource rules (K8S2001-K8S2017) over the files you pass.

rbac_review(path)

11 RBAC rules (K8S3001-K8S3011) plus a list of roles and bindings.

explain_resource(path, kind, name, namespace="")

Plain-English account of one object: what it does, effective security posture, dependencies, what reaches it, findings.

suggest_fixes(path)

Unified diff (as text, never written) of the safe mechanical fixes for one file, verified by re-linting the patched text.

values_review(path)

Review a Helm values.yaml (K8S4001-K8S4007); credentials are redacted.

render_helm(chart_dir, ...)

Opt-in. Runs the local helm template (argument list, 60 s timeout, no cluster) and lints the output in memory. Refuses unless allow_exec=true.

path is a YAML file or a directory of them (relative to --dir, or absolute inside it). Directory mode skips YAML that is not a Kubernetes object (Chart.yaml, values.yaml) and unrendered Helm templates, and says how many it skipped. Custom resources (Certificate, ExternalSecret, ...) are skipped quietly with a count, but their apiVersion is still checked against the removed-API table.

Try asking

  • "Give me an overview of the manifests in deploy/."

  • "Lint deploy/ and fix everything that is safe, then show me what is left."

  • "Is anything in this Deployment dangerous? Explain it to me in plain English."

  • "Does my Service actually select my pods? Does the Ingress point at a real port?"

  • "Review the RBAC in rbac.yaml. Who can read secrets?"

  • "Will these manifests still apply on Kubernetes 1.32?" (removed API table)

  • "Check this values.yaml before I publish the chart."

  • "Render the chart in charts/app with values-prod.yaml and lint the result." (needs helm installed)

Rules

ID

Severity

Rule

K8S1000

error

YAML or document-structure problem (parse error with line)

K8S1001

warning

container has no resource requests

K8S1002

warning

container has no memory limit (CPU limits are deliberately not required)

K8S1003

warning

image is untagged or uses :latest

K8S1004

info

image is not pinned by digest

K8S1005

error

privileged container

K8S1006

warning / error

allowPrivilegeEscalation is not false (error when explicitly true)

K8S1007

error

container runs as root

K8S1008

warning

runAsNonRoot is not enforced

K8S1009

warning

root filesystem is writable

K8S1010

warning

capabilities are not dropped

K8S1011

error / warning

dangerous capability added (SYS_ADMIN, ALL, ... error; others warning)

K8S1012

error

hostNetwork is enabled

K8S1013

error

hostPID or hostIPC is enabled

K8S1014

warning / error

hostPath volume (error for sensitive locations)

K8S1015

error

container runtime socket (docker.sock, containerd.sock, ...) mounted

K8S1016

warning

no livenessProbe

K8S1017

warning

no readinessProbe

K8S1018

info

single replica

K8S1019

info

replicated workload has no PodDisruptionBudget

K8S1020

warning / info

default namespace (info when metadata.namespace is omitted)

K8S1021

error

secret as a plain env value (name and length only)

K8S1022

warning

secret-looking data in a ConfigMap

K8S1023

warning

Secret with inline data in a manifest

K8S1024

info / warning

service account token is auto-mounted (warning when explicitly true)

K8S1025

info

no pod-level securityContext

K8S1026

warning

no seccomp profile

K8S1027

warning / error

imagePullPolicy problem (invalid value is an error)

K8S1028

warning

Service of type LoadBalancer is exposed

K8S1029

info

Service of type NodePort is exposed

K8S1030

info

namespace has no NetworkPolicy

K8S1031

warning

CronJob concurrencyPolicy allows overlap

K8S1032

info

CronJob history limits not set

K8S1033

error / warning

removed (error) or deprecated (warning) apiVersion, with replacement

K8S1034

warning

hostPort in use

K8S1035

warning

Ingress without TLS

K8S1036

info

bare Pod

K8S1037

info

workload uses the default service account

K8S1038

info

namespace has no Pod Security Admission label

K8S1039

error

duplicate mapping key

K8S1040

warning

Service uses externalIPs

K8S2001

error

selector does not match the pod template labels

K8S2002

warning

Service selector matches no pod template

K8S2003

warning

Ingress backend Service not found

K8S2004

error

Ingress backend port not exposed by the Service

K8S2005

warning

ConfigMap referenced but not defined (info when no ConfigMaps are provided at all)

K8S2006

info

Secret referenced but not defined (Secrets created by ExternalSecret, SealedSecret and cert-manager Certificate are recognised)

K8S2007

warning

PersistentVolumeClaim referenced but not defined

K8S2008

info

ServiceAccount referenced but not defined

K8S2009

error

key not present in the referenced ConfigMap/Secret

K8S2010

warning / error

Service targetPort does not match a container port (named port: error)

K8S2011

warning

HorizontalPodAutoscaler target not found

K8S2012

warning

PodDisruptionBudget selects no workload

K8S2013

error

duplicate resource

K8S2014

warning

StatefulSet serviceName not found

K8S2015

warning

binding refers to a Role that is not defined

K8S2016

error

Service with several ports needs port names

K8S2017

error

volumeMount refers to a volume that is not declared

K8S3001

error

wildcard verbs in a role

K8S3002

error

wildcard resources in a role

K8S3003

error

ClusterRoleBinding to cluster-admin

K8S3004

warning

RoleBinding to cluster-admin

K8S3005

warning

role can read Secrets

K8S3006

error

escalate, bind or impersonate verb

K8S3007

warning

binding to the default ServiceAccount

K8S3008

error

binding to anonymous or unauthenticated users

K8S3009

warning

binding to system:authenticated

K8S3010

warning

role can exec into pods

K8S3011

warning

role can use the nodes/proxy subresource

K8S4001

warning

image tag is latest or missing in values

K8S4002

info

resources are not set in values

K8S4003

error

secret stored in values

K8S4004

info

empty securityContext in values

K8S4005

warning / info

Service exposed publicly by default

K8S4006

info

replicaCount is 1

K8S4007

warning

insecure security setting in values

Removed and deprecated APIs

K8S1033 knows 58 apiVersion/kind pairs (extensions/v1beta1, apps/v1beta1 and v1beta2, networking.k8s.io/v1beta1 Ingress, policy/v1beta1 PodSecurityPolicy and PodDisruptionBudget, batch/v1beta1 CronJob, autoscaling/v2beta1 and v2beta2, rbac v1beta1, admissionregistration, apiextensions, certificates, storage, discovery, events, node, flowcontrol, and more). A removed API is an error and names the release that dropped it (for example "batch/v1beta1 CronJob was removed in Kubernetes 1.25"); a still-served deprecated one is a warning. The table lives in src/kubelint_mcp/deprecations.py and is checked against known facts by the tests.

What it does not do

  • It checks the files you give it, not the cluster. References are resolved only inside those files; an object missing from them is reported (as info when it plausibly lives elsewhere), not assumed absent.

  • It does not validate against the OpenAPI schema (use kubeconform for that); it looks for mistakes that schema validation accepts.

  • The line of a finding is the YAML line of the offending field, or the nearest enclosing key when the field is absent (the container, the pod spec:, the kind: line).

  • Helm templates with {{ }} must be rendered first (helm template), or use render_helm.

Security

  • Read-only and offline. Nothing is applied; no network access; no kubectl. The only subprocess is the opt-in render_helm (see below).

  • Sandboxed. Every path is resolved (symlinks and .. included) and must stay inside --dir. Files over 2 MB, directories over 300 files and 20 MB, and non-UTF-8 files are refused with a clear message.

  • Safe YAML. yaml.SafeLoader only, so no tag can construct an object. Alias bombs ("billion laughs") are detected by computing the expanded size with memoization and refusing documents above 200,000 nodes; nesting is capped; more than 1000 documents per file are ignored with a note.

  • Secrets never leave. Findings, explanations and diffs show a name and a length (DB_PASSWORD (12 characters, value redacted)), never a value. YAML parse errors are rebuilt without PyYAML's source snippet, and diff context lines are filtered, so a secret on a neighbouring line cannot slip out.

  • render_helm runs helm template <release> <chart> [--namespace ns] [--values file] as an argument list (no shell), with a 60 second timeout and without KUBECONFIG. It never passes --validate or --dry-run, so helm cannot reach a cluster. It does nothing unless the call says allow_exec=true and a helm binary exists. Rendering an untrusted chart is still executing someone else's templates: do it only when you trust the chart.

Development

uv sync --extra test
uv run pytest
uv run ruff check src tests
uv run mypy --strict src

Tests run the real code over real files, a real subprocess for render_helm (a fake helm script, plus real helm when installed), and launch the installed server over stdio to list and call every tool.

MIT licensed.

Available Tools

8 tools
check_referencesB

Cross-resource checks (K8S2001-K8S2017) among the provided files: Deployment selector that does not match its template labels (invalid), Service selector matching no pod, targetPort that no container declares, Ingress backend Service or port that does not exist, ConfigMap/Secret/PVC/ ServiceAccount referenced but not defined (info when it may live elsewhere), a key missing from a ConfigMap/Secret, HPA or PodDisruptionBudget pointing at nothing, StatefulSet serviceName, volumeMounts without a volume, RoleBinding to an undefined Role, and duplicate objects. Pass a directory to check a whole app. Only the files you pass are considered.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose useful behavior: scope is limited to passed files, some findings are informational when a resource may legitimately live elsewhere, and selector mismatches are flagged invalid. It does not cover severity model beyond that, or whether it fails or reports when nothing is found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the tool's core action and the check range (K8S2001-K8S2017), then a dense list of detected cases. The enumeration is long but each item is a distinct, actionable check; only the closing scope sentence could be tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape needn't be explained. The description covers what is checked and the scoping caveat well, but for a tool in a crowded linting family it leaves the crucial selection question, when to prefer this over lint_manifests or rbac_review, unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single required 'path' param is undocumented in the schema, so the description must supply meaning. It partially does by implying path may be a directory ('Pass a directory to check a whole app'), but never states whether a single file is also accepted or what formats are expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific operation (cross-resource reference checks) and enumerates the concrete failure classes it detects (selector/label mismatch, dangling Service/Ingress/HPA targets, missing ConfigMap keys, duplicate objects). This distinguishes it from a plain linter, but it never names or contrasts with siblings like lint_manifests or rbac_review, leaving the boundary to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'Pass a directory to check a whole app' and 'Only the files you pass are considered' give scope hints, but there is no explicit when-to-use vs. lint_manifests or rbac_review, and no prerequisites or preconditions are described.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_resourceA

Explain one object in plain English: what it does, its effective security posture (user, privilege, filesystem, capabilities, host access, token, seccomp), what it depends on (ConfigMaps, Secrets, PVCs, service account, with whether each is defined in these files), what reaches it (Services, Ingress, HPA, PodDisruptionBudget, NetworkPolicy) and its lint findings. kind is e.g. Deployment, name its metadata.name; pass namespace if the name exists in several. Env values, ConfigMap/Secret data and command arguments are never printed.

NameRequiredDescriptionDefault
kindYes
nameYes
pathYes
namespaceNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does a solid job: it discloses a meaningful privacy constraint that the agent (and user) needs — env values, ConfigMap/Secret data, and command arguments are never printed. It doesn't explicitly state read-only/non-mutating behavior or error behavior (e.g., what happens when the kind/name isn't found), which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core purpose opens the sentence and the parenthetical enumerations are informative rather than filler. The long embedded list of posture dimensions is slightly wall-of-text, but every clause carries information and the trailing privacy and parameter sentences are short.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return shape need not be explained, and the description correctly focuses on scope and on the one behavior an agent can't infer (redacted secret/env/args data). The unexplained required `path` parameter is the remaining gap for a four-parameter tool with zero schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it only partly does: it clarifies `kind` ('e.g. Deployment' — a Kind, not a filename), `name` (metadata.name), and `namespace` (disambiguator for duplicate names). The required `path` parameter is never explained at all, leaving the agent to guess whether it is a file, a directory, or a manifest root.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and scope ('Explain one object in plain English') and then enumerates exactly what the explanation covers: security posture, dependencies, inbound traffic, and lint findings. An agent can tell this is a single-object deep dive rather than a repo-wide scan like lint_manifests or check_references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the enumeration of contents; there is no explicit statement of when to pick this over lint_manifests, check_references, or rbac_review, which overlap on lint findings, references, and security posture. The only concrete guidance is 'pass `namespace` if the name exists in several', which is parameter advice rather than tool selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

k8s_overviewA

Summarize Kubernetes manifests: every object by kind and namespace, workloads with replicas, images and ports, Services (type, ports, which workloads they select), Ingress routes, and host-network workloads. path is a YAML file (multi-document is fine, helm template output works) or a directory of them. Start here, then lint_manifests.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. 'Summarize' implies a read-only analysis pass, and the description usefully discloses accepted input shapes (multi-document YAML, helm template output, directories), but says nothing about side effects, failure behavior on malformed YAML, or whether any cluster/auth access is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the capability, then input semantics, then the next step. The mid-sentence enumeration is long but each item maps to a distinct thing the agent gets back, so it earns its space; only slight tightening would improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be spelled out, and the description lists enough content to make selection easy while covering the one ambiguous input. Remaining gap is behavioral: no note on invalid/non-Kubernetes YAML or on scope limits of the summary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter has no description, so the description is the only source of meaning. It specifies that `path` accepts a YAML file, a multi-document file, helm template output, or a directory of files — meaningful detail the bare string schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Summarize) and resource (Kubernetes manifests), then enumerates exactly what the summary covers: objects by kind/namespace, workloads with replicas/images/ports, Services with selectors, Ingress routes, host-network workloads. The closing 'Start here, then lint_manifests' positions it against the closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow position ('Start here') and names the follow-up tool (lint_manifests), which is genuine when-to-use guidance. It does not state when to skip this tool or jump straight to check_references/rbac_review, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lint_manifestsA

Lint Kubernetes manifests with rules K8S1001-K8S1040: missing resource requests/memory limit, :latest or untagged images (and tag-only pins as info), privileged / allowPrivilegeEscalation / root user / readOnlyRootFilesystem / capabilities, hostNetwork/hostPID/hostPath/docker.sock, missing probes, replicas 1, no PodDisruptionBudget or NetworkPolicy, default namespace, secrets as plain env values (name and length only, never the value), service account token, seccomp, imagePullPolicy, LoadBalancer/NodePort exposure, CronJob settings, and removed/deprecated apiVersions with the replacement and the release that dropped them. Each finding has a rule ID, severity, file:line and a concrete fix. Cross-object checks are in check_references, RBAC in rbac_review. Suppress with # kubelint-ignore: K8S1004 above a line. Nothing is applied to any cluster.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full behavioral burden and does so: "Nothing is applied to any cluster" declares the read-only, non-mutating nature, and the secret rule explicitly states only name and length are surfaced, never the value — a privacy trait no schema could convey. It also describes the finding shape (rule ID, severity, file:line, concrete fix) and the in-file suppression syntax, which are behavioral details beyond the input schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and the alternative-tool routing are front-loaded, and the suppression and non-mutation notes are short and standalone. The middle rule enumeration is a long, comma-spliced run-on that is dense to parse, though every clause does convey actual rule coverage rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value formatting is covered, and the description adds the semantic layer (severity, file:line, fix) plus suppression and safety context. Completeness is only slightly undercut by the unexplained `path` parameter, which is the one thing an agent must get right to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single `path` parameter has 0% schema description coverage, so the description must compensate but only implicitly implies it points at manifests. It never states whether path is a file, directory, glob, or repo root, nor whether recursion applies — a meaningful gap for a linting tool. Baseline is lowered accordingly, though the rule enumeration gives some indirect sense of what is scanned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Lint Kubernetes manifests") and then enumerates the concrete rule families K8S1001-K8S1040 it covers, from resource limits to deprecated apiVersions. It also explicitly distinguishes itself from siblings by naming check_references for cross-object checks and rbac_review for RBAC, so an agent can separate it from those tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear routing guidance: cross-object checks belong to check_references and RBAC to rbac_review, which is the main disambiguation an agent needs. It also documents the suppression mechanism (`# kubelint-ignore: K8S1004`). It stops short of covering when to prefer values_review, render_helm, or suggest_fixes, so the routing is partial rather than exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rbac_reviewA

Review RBAC (K8S3001-K8S3011): wildcard verbs or resources, ClusterRoleBinding/RoleBinding to cluster-admin, read access to Secrets, escalate/bind/impersonate verbs, pods/exec, nodes/proxy, and bindings to the default ServiceAccount, system:anonymous, system:unauthenticated or system:authenticated. Also lists every Role/ClusterRole and which subjects each binding grants it to.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, and it does disclose what the analysis looks for and that it enumerates roles and subject bindings. However it never states that the operation is read-only/static, whether a live cluster or credentials are needed, or what happens on an invalid path — meaningful gaps for a file-consuming review tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then a compact rule list, then the secondary listing behavior — no filler sentences. The enumerated security checks are dense but each one maps to real detection content, though the run-on comma list is harder to scan than a short bulleted form would be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and the detection scope is well covered. What is missing is context an agent needs to call it correctly: what `path` points at, whether cluster access is required, and how it differs operationally from the sibling review tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter, `path`, with 0% schema description coverage, so the description must define it — but it never mentions the parameter at all. It is unclear whether `path` is a file, a directory of YAML manifests, or a Helm-rendered output root.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ("Review RBAC") followed by a concrete enumeration of the eleven rule families checked (wildcard verbs, cluster-admin bindings, secret reads, escalate/bind/impersonate, pods/exec, nodes/proxy, anonymous/default-SA bindings). It also states the secondary output (listing Roles/ClusterRoles and their subjects), which clearly separates it from generic siblings like lint_manifests or check_references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer it should call this when auditing RBAC manifests. There is no explicit when-to-use statement, no guidance on when to prefer lint_manifests or check_references instead, and no stated prerequisites (e.g. whether the path must be a manifest directory or a live-cluster kubeconfig).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_helmA

OPT-IN. Runs the local helm template (argument list, 60 s timeout, no cluster contact) on a chart directory and lints the rendered output in memory (it is not written anywhere). Refuses unless allow_exec=true, so set that only when the user asked to render a chart. Fails with a clear message when helm is not installed. values_file is an optional values YAML inside --dir.

NameRequiredDescriptionDefault
chart_dirYes
namespaceNo
allow_execNo
values_fileNo
release_nameNorelease

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does so well: local subprocess execution, 60 s timeout, no cluster contact, output linted in memory and never written to disk, a hard allow_exec gate, and a clear failure when helm is absent. These are exactly the traits an agent needs before authorizing a local exec.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: 'OPT-IN' and the core action lead, followed by safety and failure details. Parenthetical asides are frequent but each carries real information; no sentence is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a local-exec tool with an output schema (so return values need not be described), the description covers the safety gate, timeout, side-effect profile, and failure mode. The remaining gap is the semantics of namespace and release_name, which matter for templating results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters, so the description must compensate. It explains values_file (optional values YAML inside --dir) and allow_exec (the exec gate) and implies chart_dir, but says nothing about namespace or release_name (defaulting to "release"), leaving two parameters undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it runs the local `helm template` on a chart directory and lints the rendered output in memory. The parenthetical clarifies execution scope (argument list, 60 s timeout, no cluster contact). It does not differentiate itself from siblings such as lint_manifests or values_review, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit activation guidance: it is OPT-IN and refuses unless allow_exec=true, which should only be set when the user asked to render a chart. That is a clear use condition. It stops short of naming alternatives (e.g., lint_manifests for already-rendered manifests), so the routing is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_fixesA

Show a unified diff (as text, never written) of the safe mechanical fixes for ONE manifest file: privileged / hostNetwork / hostPID / hostIPC set to false, allowPrivilegeEscalation: false added or flipped, and apiVersion renames where only the version string changes (batch/v1beta1 CronJob -> batch/v1, policy/v1beta1 PodDisruptionBudget -> policy/v1, rbac v1beta1 -> v1, and similar). The patched text is re-parsed and re-linted in memory to confirm. Everything else is listed as needing a human decision.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it declares the output is text-only and 'never written', that patches are re-parsed and re-linted in memory to confirm correctness, and that only safe mechanical changes are applied. It does not say what happens when no auto-fixable issues exist (empty diff?) or whether the file must already lint cleanly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first clause, and the enumerated fix list is dense but each item earns its place by defining the tool's scope. Slightly long sentences with parenthetical examples add bulk but little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be explained. Given a single-parameter tool with no annotations, the description still covers the mutation-safety profile, the validation step, and the human-decision fallback, which is enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and 'path' is undocumented in the schema, so the description must compensate. Its phrase 'for ONE manifest file' does add meaning by narrowing the parameter to a single file path rather than a directory or glob, but it says nothing about accepted path formats or relative vs absolute roots.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource ('Show a unified diff ... of the safe mechanical fixes for ONE manifest file') and enumerates exactly which fix classes it covers (privileged/hostNetwork/hostPID/hostIPC, allowPrivilegeEscalation, apiVersion renames). This makes it easy to tell apart from lint_manifests, which reports issues rather than proposing a patch, even though the sibling is not named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Scope guidance is present and useful: 'ONE manifest file' and 'Everything else is listed as needing a human decision' set boundaries for what the tool will and will not do. However, there is no explicit guidance on when to reach for this versus lint_manifests or explain_resource, so the agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

values_reviewA

Review a Helm values.yaml (K8S4001-K8S4007): :latest or untagged image defaults, resources left empty, credentials committed in values (key name and length only, value redacted), empty securityContext, Services exposed as LoadBalancer/NodePort by default, replicaCount 1, and insecure defaults like privileged or runAsUser 0. Reviews the inputs of a chart; use render_helm or helm template output with lint_manifests to review what a chart actually produces.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it discloses the exact check categories, notes that credential values are redacted and only key name and length are reported (an important privacy behavior an agent could not infer), and frames the operation as a review rather than a mutation. It stops short of explicitly stating read-only semantics or any failure behavior on unreadable/invalid files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and resource, then a compact checklist of checks, then the sibling-routing sentence. Dense but every clause carries information; the parenthetical about redaction is slightly heavy but justified by its privacy significance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-style reviewer with an output schema available, the description covers what is checked, how credentials are handled, and when to use alternatives instead. The remaining gap is the meaning/format of `path`, which is the only thing an agent could get wrong when calling it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter `path` is undocumented in the schema. The description only implies it via 'Review a Helm values.yaml' — it never says whether path is a file, a chart directory, or how relative paths are resolved, so it adds only marginal meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Review a Helm values.yaml') and enumerates the exact rule set it applies (K8S4001-K8S4007: latest/untagged images, empty resources, committed credentials, empty securityContext, LoadBalancer/NodePort services, replicaCount 1, privileged/runAsUser 0). It also explicitly contrasts itself with render_helm and lint_manifests, so an agent can distinguish it from siblings without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: this tool reviews chart inputs, while render_helm or `helm template` output plus lint_manifests should be used to review what the chart actually produces. Both the when-to-use and the named alternatives with their selecting condition are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedcheck_references
    • First observedexplain_resource
    • First observedk8s_overview
    • First observedlint_manifests
    • First observedrbac_review
    • First observedrender_helm
    • First observedsuggest_fixes
    • First observedvalues_review

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a clearly distinct layer of the workflow: inventory (k8s_overview), per-object rules (lint_manifests), cross-object rules (check_references), RBAC (rbac_review), single-object explanation (explain_resource), remediation (suggest_fixes), chart inputs (values_review) and chart rendering (render_helm). The descriptions actively disambiguate the risky pairs ('Cross-object checks are in check_references', 'use render_helm ... with lint_manifests' for rendered output vs values_review for inputs).

Naming Consistency4/5

All names are snake_case and readable, but the pattern mixes verb_noun (lint_manifests, check_references, explain_resource, suggest_fixes, render_helm) with noun_noun/qualifier forms (k8s_overview, rbac_review, values_review). The deviation is minor and each name still predicts its action.

Tool Count5/5

Eight tools is well within the sweet spot and every tool covers a non-redundant stage of the static-analysis workflow, from inspection through linting to fix suggestions. Nothing feels padded or missing purely for count's sake.

Completeness4/5

The surface covers CRUD-equivalent lifecycle for the domain: overview, per-object and cross-object linting, RBAC, explanation, mechanical fixes, and Helm values/render paths, including an opt-in exec guard. Minor gaps remain — no kustomize/overlay rendering and no aggregate multi-file report output — but agents can work around them with directory inputs.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to audit Kubernetes manifests for configuration traps that pass linters but silently break production, via read-only tools to audit YAML, list known traps, and explain trap details.
    3
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables agents and users to validate Kubernetes manifests (YAML/JSON, multi-document) against the API of a chosen Kubernetes version without needing a cluster. It reports removed or deprecated APIs with replacements, unknown or misspelt fields, misconfigurations the API server would reject, Pod Security Standard violations, and common risks, each with file, line, and fix.
    3
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI coding assistants to run static analysis on GitHub repositories, raw code snippets, or local directories to detect cloud cost leaks in Terraform/AWS configs, PostgreSQL migration table-lock hazards, and OWASP/Next.js API security gaps. Each finding returns structured severity, line-level detail, and drop-in fixes.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables deterministic, offline diagnosis of Kubernetes and container failures, generation of exact YAML/Dockerfile fixes, secret and PII redaction, and zero-trust policy checks for agent-proposed commands.
    5
    MIT