kubelint-mcp
Reviews Helm values.yaml files and can optionally render local Helm charts via helm template to lint the resulting Kubernetes manifests.
Statically lints and explains Kubernetes manifests, covering security posture, cross-resource references, RBAC, deprecated/removed APIs, and safe fix diffs without contacting a cluster.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kubelint-mcpLint deploy/ and explain any security issues you find"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Only files inside this directory can be read (default: the current directory). |
| Comma-separated rule ids to turn off, e.g. |
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 coveredA 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 |
| Every object by kind and namespace, workloads with replicas, images and ports, Services and what they select, Ingress routes, host-network workloads. |
| 41 rules (K8S1000-K8S1040): resources, images, security context, host access, probes, replicas, namespaces, secrets, exposure, CronJob settings, removed APIs. |
| 17 cross-resource rules (K8S2001-K8S2017) over the files you pass. |
| 11 RBAC rules (K8S3001-K8S3011) plus a list of roles and bindings. |
| Plain-English account of one object: what it does, effective security posture, dependencies, what reaches it, findings. |
| Unified diff (as text, never written) of the safe mechanical fixes for one file, verified by re-linting the patched text. |
| Review a Helm |
| Opt-in. Runs the local |
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.yamlbefore I publish the chart.""Render the chart in
charts/appwithvalues-prod.yamland lint the result." (needshelminstalled)
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:, thekind:line).Helm templates with
{{ }}must be rendered first (helm template), or userender_helm.
Security
Read-only and offline. Nothing is applied; no network access; no
kubectl. The only subprocess is the opt-inrender_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.SafeLoaderonly, 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_helmrunshelm template <release> <chart> [--namespace ns] [--values file]as an argument list (no shell), with a 60 second timeout and withoutKUBECONFIG. It never passes--validateor--dry-run, so helm cannot reach a cluster. It does nothing unless the call saysallow_exec=trueand ahelmbinary 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 srcTests 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 toolscheck_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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | Yes | ||
| path | Yes | ||
| namespace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chart_dir | Yes | ||
| namespace | No | ||
| allow_exec | No | ||
| values_file | No | ||
| release_name | No | release |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
check_references - First observed
explain_resource - First observed
k8s_overview - First observed
lint_manifests - First observed
rbac_review - First observed
render_helm - First observed
suggest_fixes - First observed
values_review
TDQS
Scored across 8 tools
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).
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.
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.
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
Related MCP Connectors
Give your AI assistant access to real Helm chart data. No more hallucinated values.yaml files.
Security scanner for AI-written code: SAST, secrets, dependencies, IaC, containers and DAST.
Fail-closed policy guardrails for AI agents running kubectl, terraform, helm, and argocd.
kube-linter audit for Kubernetes manifests — 63 checks: security, availability, RBAC, network.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.3MIT
- AlicenseAqualityCmaintenanceEnables 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.31MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseAqualityCmaintenanceEnables 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.5MIT