mcpnertes
The server provides read-only access to a Kubernetes cluster through MCP tools, with policy-based restrictions on namespaces and resource kinds.
List cluster resources:
list_pods,list_deployments,list_services,list_nodes, andlist_namespaces(filtered by allowlist).Retrieve logs:
get_pod_logsfor a specific pod, andget_logsfor pods/deployments/jobs/label selectors with options like tail, container, timestamps, and since_seconds.Access cluster events:
get_eventsfor a namespace or all namespaces.Generic dynamic client access:
list_resourceandget_resourcecan work with any resource kind (including CRDs), but blocked kinds (e.g., Secrets) are always refused.Discover available resources:
list_api_resourcesshows which resource kinds (including CRDs) can be listed, omitting blocked kinds.All tools are read-only: every operation is GET/LIST only, and the policy (namespace allow/deny, resource block) is enforced before any cluster API call.
Provides read-only access to a Kubernetes cluster, with tools for listing pods, deployments, services, namespaces, nodes, events, and logs, as well as generic resource listing and retrieval, subject to namespace allow/deny and resource block policies.
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., "@mcpnerteslist all running pods in the default namespace"
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.
Mcpnertes
Read-only Kubernetes MCP server. Every tool is GET/LIST-only, and every tool
passes through a config-driven policy (config.toml) before it touches the
cluster:
Namespace allowlist —
namespaces.allowdefaults to["*"](every namespace). Restrict it to an explicit list to scope the server to specific namespaces, and usenamespaces.denyto carve out exceptions.Resource blocklist —
resources.blockdefaults to["Secret"]. Blocked kinds are refused by every tool, including the genericlist_resource/get_resourcedynamic-client tools, so there's no way to route around the block by asking a different tool.
Both checks happen in a single chokepoint (mcpnertes.config.Policy) before
any Kubernetes API call is made — see src/mcpnertes/config.py.
Install
pip install -e .Related MCP server: mcp-kubernetics
Run standalone
mcpnertesUse from an MCP client (Claude Desktop, Claude Code, etc.)
Add to the client's MCP server config. The policy (namespace allow/deny,
resource block) is set directly in env — no config.toml file needed.
uvx fetches and runs it from PyPI without a local install:
{
"mcpServers": {
"mcpnertes": {
"command": "uvx",
"args": ["mcpnertes"],
"env": {
"UV_HTTP_TIMEOUT": "120",
"MCPNERTES_NAMESPACE_ALLOW": "*",
"MCPNERTES_NAMESPACE_DENY": "kube-system,cert-manager",
"MCPNERTES_RESOURCE_BLOCK": "Secret"
}
}
}
}args must be plain mcpnertes, not mcpnertes@latest — @latest is
npm/npx syntax, not a valid uv/pip version specifier, and uvx will
hang trying to resolve it until the MCP client's connect timeout kills it.
Plain mcpnertes always resolves to the newest PyPI release.
UV_HTTP_TIMEOUT is optional but recommended on a cold cache: the first
uvx run downloads the kubernetes dependency (~4.4MiB) and uv's
default 30s HTTP timeout can be too short on a slow connection, causing
the same "connection timed out" symptom. 120s comfortably covers a cold
install; subsequent runs use uv's cache and start in milliseconds.
All three MCPNERTES_* env vars are optional and comma-separated. Omit
any of them to fall back to config.toml (if present) or the built-in
default (allow all namespaces, block Secret).
Not yet on PyPI? Point uvx at this checkout instead:
{
"mcpServers": {
"mcpnertes": {
"command": "uvx",
"args": ["--from", "/absolute/path/to/Mcpnertes", "mcpnertes"],
"env": {
"MCPNERTES_NAMESPACE_ALLOW": "*",
"MCPNERTES_NAMESPACE_DENY": "kube-system,cert-manager",
"MCPNERTES_RESOURCE_BLOCK": "Secret"
}
}
}
}Configuring the policy
Two equivalent ways to set it — pick whichever fits how you're running the server. If both are present, the env vars win field-by-field.
Env vars (for mcpServers configs — no file needed)
Variable | Format | Default |
| comma-separated, |
|
| comma-separated | (empty) |
| comma-separated, case-insensitive |
|
"env": {
"MCPNERTES_NAMESPACE_ALLOW": "default,staging",
"MCPNERTES_NAMESPACE_DENY": "",
"MCPNERTES_RESOURCE_BLOCK": "Secret,ConfigMap,Ingress"
}config.toml (for standalone runs)
Resolution order (first match wins): $MCPNERTES_CONFIG, ./config.toml
(current working directory), then the config.toml shipped next to the
installed package.
[namespaces]
# "*" = every namespace (default). Replace with an explicit list to scope
# the server to only those namespaces.
allow = ["*"]
# Namespaces to block even if matched by `allow`. `deny` always wins.
deny = []
[resources]
# Resource kinds always refused, regardless of which tool is called
# (including the generic list_resource/get_resource tools). Case-insensitive.
block = ["Secret"]Scope to specific namespaces:
[namespaces]
allow = ["default", "staging"]
deny = []Allow everything except a couple of sensitive namespaces:
[namespaces]
allow = ["*"]
deny = ["kube-system", "cert-manager"]Block additional resource kinds (e.g. also hide ConfigMaps and Ingresses):
[resources]
block = ["Secret", "ConfigMap", "Ingress"]Tools
Tool | Description |
| List pods in a namespace or across all namespaces |
| List deployments in a namespace or across all namespaces |
| Get logs from a specific pod |
| List services in a namespace or across all namespaces |
| List namespaces (filtered by the allowlist) |
| Get cluster events for a namespace or all namespaces |
| Get logs from a pod/deployment/job/label selector |
| List cluster nodes |
| List any resource kind (including CRDs) via the dynamic client |
| Get a single resource of any kind by name |
| Discover listable resource kinds the cluster exposes |
Testing
pip install -e ".[dev]"
pytest -qtests/test_config.py unit-tests the Policy allow/deny/block logic in
isolation. tests/test_e2e.py and tests/test_e2e_stdio.py are full
end-to-end tests with no mocks: they seed a real namespace/pod/deployment
/service/secret on whatever cluster your current kubeconfig context points
to, then drive the actual MCP server (in-process and as a real stdio
subprocess) against it. They auto-skip if no cluster is reachable.
License
Apache-2.0 — see LICENSE.
Available Tools
11 toolsget_eventsGet EventsBRead-onlyIdempotent
Get Kubernetes events from the cluster for a specific namespace or all namespaces
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No | ||
| field_selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful scoping behavior by explaining the namespace can target one namespace or all namespaces, but it does not disclose any further behavioral details such as field_selector filtering, event ordering, or pagination. This is acceptable but not rich.
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 description is a single focused sentence that leads with the action and resource, then covers the main scoping option. It contains no filler and earns its place.
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 simple read-only tool with two optional parameters and no output schema, the description covers the core purpose and namespace behavior. However, it omits critical semantics for field_selector and says nothing about what the returned events contain or any limits. It is minimally viable but leaves notable gaps for an agent.
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%, so the description must compensate for explaining parameters. It partially explains namespace via 'specific namespace or all namespaces', but field_selector is left entirely unexplained. Since the schema only provides the name and type, an agent gets insufficient guidance on one of the two parameters.
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 specific verb and resource: 'Get Kubernetes events from the cluster.' It also specifies the scoping options ('specific namespace or all namespaces'), which clearly distinguishes it from sibling tools focused on pods, logs, deployments, and other resources.
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?
The description tells what the tool does but provides no guidance on when to choose it over sibling tools like get_logs, list_pods, or get_resource. There is no mention of alternatives, exclusions, or prerequisite context, so an agent is left to infer when events are the right resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsGet LogsBRead-onlyIdempotent
Get logs from pods, deployments, jobs, or resources matching a label selector
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| tail | No | ||
| container | No | ||
| namespace | No | ||
| timestamps | No | ||
| resource_type | Yes | ||
| since_seconds | No | ||
| label_selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that logs can come from multiple resource types or label-selected resources, but it does not explain behavior such as whether a name or label_selector is required, how tail/default limits work, or what output to expect. This adds modest context beyond annotations but leaves several behavioral questions unanswered.
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?
One compact sentence with no filler words, and the key action is front-loaded. It conveys the core scope efficiently while leaving necessary details to other dimensions.
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 tool with 8 parameters, one required parameter, no output schema, and no parameter descriptions, a single sentence is incomplete. It does not specify valid resource_type values, the relationship between name and label_selector, default namespace behavior, or the response format. Annotations cover read-only/idempotent safety but not the operational details needed 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%, so the description carries the burden of explaining parameters. It only clarifies label_selector and implies resource_type values (pods, deployments, jobs); it does not explain name, tail, container, namespace, timestamps, or since_seconds. Parameter names are self-descriptive, but the description fails to compensate for the absent schema documentation.
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 uses a specific verb ('Get') and a clear resource scope: logs from pods, deployments, jobs, or resources matched by label selector. It is not a tautology, and the mention of multiple resource types distinguishes it somewhat from the sibling get_pod_logs, though it does not explicitly name that alternative.
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?
There is no guidance about when to choose get_logs over get_pod_logs or other list/get siblings. The description only states what the tool does, not when to use it or when not to use it, so an agent must infer the intended context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pod_logsGet Pod LogsBRead-onlyIdempotent
Get logs from a pod in a specified namespace
| Name | Required | Description | Default |
|---|---|---|---|
| pod_name | Yes | ||
| previous | No | ||
| container | No | ||
| namespace | Yes | ||
| tail_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the scoping detail that it fetches pod logs in a namespace, but does not disclose return format, tailing behavior, or handling of missing pods. With annotations carrying the safety burden, a 3 is appropriate.
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 description is a single, front-loaded sentence with no filler or redundancy. It wastes no words and immediately communicates the core action.
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?
With five parameters, zero schema description coverage, and no output schema, this description is too thin to fully support correct invocation. It lacks optional-parameter semantics, usage context, and any distinction from sibling log-related 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?
Schema description coverage is 0%, so the description must compensate, but it only clarifies 'pod' and 'namespace.' The optional parameters 'previous,' 'container,' and 'tail_lines' remain unexplained, leaving the agent to infer their meaning from names alone.
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 clear verb-resource pair: 'Get logs from a pod in a specified namespace.' It correctly describes what the tool operates on, but it does not distinguish this from the sibling 'get_logs' tool, so an agent cannot tell exactly when to choose this one versus that one without opening schemas.
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?
There is no guidance on when to use this tool versus alternatives like 'get_logs' or 'get_events.' It does not mention exclusions, prerequisites, or conditions that would make it the correct choice, leaving usage entirely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resourceGet ResourceARead-onlyIdempotent
Get a single resource of any kind (including CRDs) by name via the dynamic client. GET only; never mutates. Blocked kinds are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | Yes | ||
| namespace | No | ||
| api_version | No | v1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds useful behavioral context beyond annotations by explicitly stating 'GET only; never mutates' and revealing that 'Blocked kinds are refused.' This gives the agent a clearer safety and failure profile.
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?
Three short sentences with no filler. The core purpose is front-loaded, and each additional sentence ('GET only', 'Blocked kinds are refused') adds meaningful operational context.
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?
The description is adequate for a simple read-only getter, but gaps remain: it does not describe return values, provide any list or explanation of blocked kinds, or clarify how api_version and namespace are used. Since there is no output schema, some of this burden falls on the description.
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%, so the description must compensate for documenting parameters. It mentions 'by name' and 'any kind', which loosely maps to the name and kind parameters, but it does not explain namespace or api_version semantics or their defaults. This is a significant gap for a generic dynamic-client tool.
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 clearly states a specific action ('Get a single resource'), the resource scope ('any kind including CRDs'), and the mechanism ('by name via the dynamic client'). This distinguishes it from sibling list/get-log tools without needing to inspect their schemas.
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?
The description makes the use case clear: retrieve one known resource by name as opposed to listing resources or fetching logs. It does not explicitly name alternatives or provide when-not-to-use conditions, but its context is specific enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_resourcesList API ResourcesARead-onlyIdempotent
Discover which resource kinds (including CRDs) the cluster exposes and can be listed. Read-only discovery; blocked kinds are omitted.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it readOnly, idempotent, and non-destructive; the description adds value by noting results are limited to kinds that 'can be listed', that CRDs are included, and that 'blocked kinds are omitted.' This provides behavioral filtering context beyond the annotations.
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?
Two short sentences front-load the action and scope. 'Read-only discovery; blocked kinds are omitted' adds safety and filtering context in six words, with no 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?
For a no-argument, read-only discovery tool with no output schema, the description conveys what the result contains (listable resource kinds, including CRDs) and its filtering behavior. An agent selecting or invoking this tool is not missing critical information.
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 schema has zero parameters and 100% coverage, so no parameter documentation is needed. The description correctly implies this is a parameterless discovery call without adding unnecessary detail.
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 opens with a specific verb, 'Discover', and names the resource: 'resource kinds (including CRDs) the cluster exposes and can be listed.' This clearly scopes it to capability discovery rather than instance listing, distinguishing it from sibling tools like list_pods and list_deployments.
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?
The phrase 'Discover which resource kinds...' identifies the tool for discovery use, and 'Read-only discovery' signals it is an exploratory step. However, it does not explicitly name when to prefer it over list_resource or state exclusions, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deploymentsList DeploymentsARead-onlyIdempotent
List all deployments in a specified namespace
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide the key behavioral safety profile: readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds the namespace scoping but does not disclose additional behavioral details like pagination, return format, or semantics of an omitted namespace. This is acceptable but not additive beyond what annotations already establish.
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 description is a single, front-loaded sentence with no filler. It states the action and scope immediately and every word earns its place, making it highly concise for a one-parameter tool.
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 simple read-only list tool with annotations covering safety, the description is mostly adequate. However, with no output schema and no explanation of the namespace default (null), an agent cannot fully determine the behavior when no namespace is supplied, leaving a meaningful completeness gap.
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%, so the description must compensate for the namespace parameter, but it does not explain the nullable default or what happens when namespace is omitted. The parameter name is self-explanatory, but the description only says 'specified namespace,' which actually implies the parameter is required when the schema marks it optional.
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 uses a specific verb and resource: 'List all deployments in a specified namespace.' It clearly names the resource (deployments), the action (list), and the scope (namespace), making it immediately distinguishable from siblings like list_pods and list_services.
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?
The description implies when to use the tool: whenever deployments in a namespace need to be listed. It does not explicitly mention alternatives or exclusions, such as using list_resource for a generic resource lookup, so guidance is only implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_namespacesList NamespacesARead-onlyIdempotent
List all namespaces in the cluster (filtered by the namespace allowlist)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the allowlist filtering behavior, which is not present in the annotations. No return-format detail is given, but for a parameterless read-only list operation this is a minor gap.
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 description is a single efficient sentence that front-loads the action and resource, then adds the only relevant qualifier. There is no redundant wording or repetition of the title.
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 parameterless, read-only list operation with no output schema, the description is complete. It states what is listed, the cluster scope, and the allowlist filter. Nothing else is needed for an agent to invoke the tool correctly.
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 tool has zero parameters and the schema is empty with 100% schema description coverage. Per the rubric, a baseline of 4 applies because there are no parameters for the description to clarify.
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 uses a specific verb and resource: 'List all namespaces in the cluster', and adds a scope qualifier ('filtered by the namespace allowlist'). This clearly distinguishes it from sibling tools like list_pods, list_deployments, and list_nodes because it names the exact resource being listed.
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?
The description provides clear context: use this tool to enumerate all allowed namespaces in the cluster. It does not explicitly name alternatives or exclusion conditions, but the scope is unambiguous and the constraint about the allowlist helps an agent understand when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_nodesList NodesARead-onlyIdempotent
List all nodes in the cluster
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds the scope 'in the cluster', clarifying the operation is on the entire cluster. No additional behavioral traits beyond what annotations provide are needed for such a simple 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?
Single sentence (7 words) with no unnecessary information. Front-loaded with the key purpose.
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?
The description is complete for a simple list tool with comprehensive annotations. It lacks details about the output format, but given the tool's simplicity and standard behavior, this is acceptable.
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 are no parameters, so the description doesn't need to add parameter information. Schema coverage is 100%, and baseline for zero params is 4.
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 clearly states the action (list), resource (nodes), and scope (in the cluster). It distinguishes from sibling tools like list_pods by specifying the resource type.
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?
No guidance on when to use this tool vs alternatives. For example, it doesn't mention that get_resource should be used for listing individual nodes, or that this tool returns all nodes without filtering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_podsList PodsARead-onlyIdempotent
List all pods in a namespace or across all namespaces
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the namespace-scoping behavior, including the all-namespaces option, but does not disclose return format, pagination, or ordering. There is no contradiction with annotations.
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?
One sentence, front-loaded with the verb and resource, with no filler or repetition of the title. Every word contributes to the tool's meaning.
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 simple read-only tool with one optional parameter and no output schema, the description plus annotations are sufficient for correct invocation. It does not describe the returned data shape, but the annotations and low schema complexity make that a minor gap rather than a blocking omission.
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%, so the description must compensate. It explains the only parameter's effect by noting pods can be listed 'in a namespace or across all namespaces', which maps directly to the optional namespace parameter. It does not spell out the default behavior in schema terms, but the meaning is still clear.
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?
Description uses a specific verb and resource ('List all pods') and clearly scopes the behavior to a namespace or all namespaces. It is immediately distinguishable from sibling tools like list_deployments and list_services by naming the pod resource 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?
The namespace/all-namespaces context gives clear invocation context, but there is no explicit guidance about when to use this tool versus alternatives such as list_resource or list_deployments. Usage must be inferred from the tool name and description rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resourceList ResourceARead-onlyIdempotent
List resources of any kind (including CRDs) via the dynamic client. GET/LIST only; never mutates. Blocked kinds (see config.toml) are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| namespace | No | ||
| api_version | No | v1 | |
| field_selector | No | ||
| label_selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's 'never mutates' mostly reinforces them. It adds valuable non-obvious behavior: blocked kinds listed in config.toml are refused, and the dynamic-client mechanism is disclosed. No contradiction with annotations.
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?
Three terse sentences, each earning its place: the first states the action and scope, the second guarantees no mutation, and the third warns about blocked kinds. The most decision-relevant information is front-loaded.
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 generic read-only list tool, the description covers core purpose, safety, and the blocked-kind failure mode. However, there is no output schema, no mention of return shape or pagination, and no guidance on selector syntax or setting api_version for CRDs, leaving moderate gaps.
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%, so the description must compensate for the five parameters, but it only indirectly supports 'kind' via 'any kind'. Nothing explains api_version, namespace, field_selector, or label_selector semantics, leaving the agent to infer meaning from parameter names alone.
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 specific verb ('List'), a resource scope ('resources of any kind including CRDs'), and the mechanism ('dynamic client'), making it clearly distinct from specialized siblings like list_pods and list_deployments. The GET/LIST-only qualifier further pins down behavior.
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?
The description implies when to use it: any resource kind, including CRDs, that sibling list tools do not cover. However, it does not explicitly name alternatives or state when not to use it, and 'Blocked kinds are refused' is the only direct usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesList ServicesARead-onlyIdempotent
List all services in a namespace or across all namespaces
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds the namespace-scoping behavior, but it does not disclose pagination, sorting, RBAC requirements, or list size limits.
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 entire description is one crisp sentence with no filler; the core scoping information is front-loaded.
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 simple read-only list tool with a single optional parameter and annotations covering side effects, this description is nearly sufficient. It lacks an explicit mention of return shape or pagination, but the function's purpose is fully stated.
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 schema has zero description coverage, so the description carries the parameter burden. 'In a namespace or across all namespaces' clarifies that namespace is optional and that omitting it means all namespaces, which is the key semantic needed.
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 names the specific verb ('List') and resource ('services') and precisely defines the scope as 'in a namespace or across all namespaces'. This makes it easy to distinguish from sibling tools like list_pods and list_deployments.
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?
The description implies when to use it: whenever services need to be enumerated, with optional namespace scoping. However, it never names alternatives such as list_resource or states when not to use this tool.
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.
11 tool updates
v0.1.0- First observed
get_events - First observed
get_logs - First observed
get_pod_logs - First observed
get_resource - First observed
list_api_resources - First observed
list_deployments - First observed
list_namespaces - First observed
list_nodes - First observed
list_pods - First observed
list_resource - First observed
list_services
TDQS
Scored across 11 tools
There is notable overlap between list_pods, list_deployments, list_services, list_resource, and list_api_resources. list_resource and get_resource are generic dynamic-client tools that can overlap with the specific resource listers, though the specific ones are convenient. get_pod_logs and get_logs also overlap, with get_logs being a broader version of get_pod_logs.
Most tools follow a consistent list_<resource> or get_<resource> pattern. Minor deviations: list_resource and get_resource are generic rather than resource-specific, and list_api_resources is a discovery operation rather than listing actual resources, but the overall pattern is predictable.
11 tools is a reasonable count for a Kubernetes MCP server covering common read-only operations. It is slightly redundant because generic list_resource/get_resource could subsume the specific listers, but the count is not excessive.
The server is read-only by design, so it covers listing and getting resources, logs, events, and discovery. However, it lacks common read operations like describe/status for resources, and there is no way to get a single deployment or pod by name except through the generic get_resource, which is a minor gap.
Maintenance
Related MCP Connectors
Provides read access to your GKE and Kubernetes resources.
Read-only MCP for identity resolution and write guardrails.
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Related MCP Servers
- AlicenseAqualityBmaintenanceRead-only MCP server for safe Kubernetes inspection, diagnosis, and debugging. Supports Kubernetes core, Helm, Argo Workflows, and Argo CD.2231 npm5MIT
- FlicenseNot gradedqualityDmaintenanceEnables Kubernetes cluster introspection via MCP tools, such as listing pods, namespaces, nodes, and events.4-
- FlicenseNot gradedqualityBmaintenanceEnables read-only Kubernetes incident investigation through MCP tools for listing pods, describing resources, fetching logs, and searching runbooks.1-
- AlicenseAqualityAmaintenanceEnables MCP clients to inspect and operate Kubernetes clusters across multiple contexts, with read-only/read-write/admin access modes and security flags controlling namespaces, contexts, deletes, applies, and exec.10262 npm2MIT