k8s-aiops
This server provides governed Kubernetes operations and diagnostics for AI agents.
Read/list/get pods, deployments, statefulsets, daemonsets, replicasets, jobs, cronjobs, services, ingresses, endpoints, configmaps, secrets (names/keys only), PVCs/PVs/storageclasses, nodes, namespaces, and events.
Inspect resources with pod/node describe, pod logs, pod/node top, cluster info, API resources, rollout status/history, and namespace listing.
Run read-only diagnostics/RCA for pod health and workload readiness with worst-first findings.
Perform governed writes: scale deployments/statefulsets, restart/update image/rollout pause/resume/undo, delete pods/deployments/jobs/namespaces, create namespaces, and cordon/uncordon/drain nodes.
Preview writes with dry_run, record audit rows, apply risk-tier labels, capture undo tokens where possible, and enforce token/runaway budget guardrails.
Never return secret values; actual write permission is controlled by the kubeconfig context or ServiceAccount RBAC.
Allows managing k3s Kubernetes clusters, providing the same operations as for standard Kubernetes clusters, such as pod and deployment management, node operations, and policy enforcement.
Allows managing Kubernetes clusters, including listing pods and deployments, scaling deployments, cordoning nodes, and deleting deployments with safety measures like audit logging and undo tracking.
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., "@k8s-aiops list pods in 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.
k8s-aiops
Audit availability: Real writes require a committed
pendingaudit row and stop before contacting the platform if storage is unavailable. Reads and previews may continue with a warning; new audit rows store outcome summaries rather than full responses.
Disclaimer: This is a community-maintained open-source project and is not affiliated with, endorsed by, or sponsored by the Cloud Native Computing Foundation, the Kubernetes project, or k3s/Rancher. "Kubernetes" and "k3s" are trademarks of their respective owners. Source code is publicly auditable at github.com/AIops-tools/K8s-AIops under the MIT license.
Governed Kubernetes operations for AI agents — 55 MCP tools, every one wrapped
with the bundled @governed_tool harness: a local unified audit log under
~/.k8s-aiops/, a token/runaway budget guard, undo-token recording, and a
descriptive risk-tier label on every audit row. Coverage spans pods, deployments, statefulsets,
daemonsets, replicasets, jobs/cronjobs, services, ingresses, endpoints,
configmaps, secrets (names/keys only), PVCs/PVs/storageclasses, nodes, namespaces,
events, rollouts (status/history/undo/pause/resume/set-image), pod/node describe,
pod/node top, a cluster health summary, and read-only diagnostics / RCA
(pod-health and workload-readiness) that flag the root cause worst-first.
Standalone: the governance harness is bundled in the package (
k8s_aiops.governance) — k8s-aiops has no external skill-family dependency. Coverage focuses on common cluster operations and is not yet exhaustive.
Verification status: exercised end-to-end against a live kind cluster (v1.36); the diagnostics/RCA tools added in this release are mock-tested only. See docs/VERIFICATION.md.
What works
Any cluster a kubeconfig can reach: standard Kubernetes, k3s, EKS, GKE, AKS, kind, minikube. Authentication (client certs, tokens, EKS/GKE/AKS exec plugins) is delegated entirely to the kubeconfig.
Related MCP server: k8scortex-mcp
What this tool does, and does not, decide
It delivers Kubernetes operations — reads and writes — accurately and efficiently, and records every one of them. It does not decide whether a write is allowed to happen. That is the agent's judgement, or the permission of the kubeconfig context / ServiceAccount you connect it with: point it at a context bound to a read-only RBAC role and the writes fail at the apiserver — the place that actually owns the permission.
So there is no read-only switch, no policy file, no approval gate to configure.
The one thing the tool guarantees is that nothing is silent: every call, over
MCP and over the CLI alike, lands an audit row in ~/.k8s-aiops/audit.db, and
destructive writes still capture their before-state and record an inverse where
one exists. The runaway budget guard is a safety backstop, not authorization.
Each tool declares a
risk_level, kept in agreement with its[READ]/[WRITE]documentation tag by a test, and carried into the audit row as a descriptive tier — so a reviewer can see at a glance that a row was a high-risk delete. It is a label, not a gate.
Running a smaller / local model? See agent-guardrails.md — it lists the guardrails this tool now enforces for you (so you don't spend prompt budget restating them) and gives a ready-made system prompt for what's left.
Quick Start
As a Claude Code plugin
One install gives an agent both the skill and the MCP server:
/plugin marketplace add AIops-tools/marketplace
/plugin install k8s-aiops@aiops-toolsThe MCP server is fetched with uv and pinned to the
package version this plugin declares, so an audit row can be traced back to the
code that wrote it. Credentials are still configured with k8s-aiops init — see below.
As an OpenClaw plugin
The same bundle is published on ClawHub, where one install delivers the skill and its MCP server together:
openclaw plugins install clawhub:@zw008/k8s-aiops
openclaw skills info k8s-aiops # expect: Visible to model: yesRestart the OpenClaw gateway afterwards so it loads the plugin. The MCP server is
fetched with uv, pinned to this exact release, so
uvx has to be on PATH — without it the skill still installs but reports
Visible to model: no. Credentials are configured exactly as below.
As a CLI or standalone MCP server
uv tool install k8s-aiops
# Friendly onboarding wizard — registers your kube contexts as named targets:
k8s-aiops init
# Or skip it — uses your current kube-context out of the box:
k8s-aiops doctor
k8s-aiops pod list
k8s-aiops deployment list -n default
# Read-only RCA — worst-first root-cause findings, no changes made:
k8s-aiops diagnose pod-health -n prod
k8s-aiops diagnose workload-readiness -n prodTo define named targets (multiple clusters/contexts), create
~/.k8s-aiops/config.yaml:
targets:
- name: prod # used as -t prod
context: prod-eks # a context in your kubeconfig (omit for current-context)
namespace: default # optional default namespace
# kubeconfig: /path/to/alt/kubeconfig # optional explicit path
- name: lab
context: k3s-labNo secrets live in this file — credentials come from the kubeconfig.
MCP
{
"command": "k8s-aiops",
"args": ["mcp"],
"env": { "K8S_AIOPS_CONFIG": "~/.k8s-aiops/config.yaml" }
}Note — MCP servers get a clean environment: most MCP clients spawn the server without your shell's exports, so variables like
K8S_AIOPS_HOME,K8S_AUDIT_APPROVED_BY,K8S_AUDIT_RATIONALE(andKUBECONFIG, if your kubeconfig is not at~/.kube/config) must be set in the MCP server config'senvblock above — values exported only in your terminal may never reach the server.
Audit & Safety
Every tool call is logged to
~/.k8s-aiops/audit.db(local SQLite; relocate withK8S_AIOPS_HOME).Reversible writes record an inverse undo descriptor (
scale_deployment→ scale-back to previous;cordon_node↔uncordon_node).Every MCP write tool takes
dry_run=Trueand returns a{"dryRun": true, ...}preview without touching the cluster (no undo recorded for a preview).delete_deploymentisrisk_level=high; destructive CLI commands require double confirmation, medium-risk ones (deployment scale/restart) a single confirmation, and all write commands support--dry-run.All API text passes through
sanitize()(output hygiene: control/format-char stripping + truncation).
See skills/k8s-aiops/SKILL.md and SECURITY.md for details.
Secrets
k8s-aiops deliberately has no encrypted secret store (no secrets.enc, no
secret CLI): authentication is delegated entirely to your kubeconfig — client
certificates, bearer tokens, or exec plugins (EKS/GKE/AKS) — and the tool never
handles or stores cluster credentials itself. This is a documented exception to
the AIops-tools line-wide encrypted-secret-store pattern.
Companion Skills
If you want… | Use |
Kubernetes pods / deployments / nodes | k8s-aiops (this) |
Hypervisor VM lifecycle | a hypervisor ops skill |
Backup & restore | a backup ops skill |
Contributing & feature requests
Coverage is intentionally focused. Missing a device, action, or feature you need? Open an issue or pull request at github.com/AIops-tools/K8s-AIops — feature requests, contributions, and comments are all welcome.
License
Available Tools
55 toolsapi_resourcesARead-only
[READ] List available API groups and their versions.
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
cluster_infoARead-only
[READ] Friendly cluster health summary: server version, node/ns counts.
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
configmap_getARead-only
[READ] Return a configmap's data (keys + values — config, not secrets).
Args: name: ConfigMap name (see configmap_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
configmap_listARead-only
[READ] List configmaps (name, namespace, key count, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
cordon_nodeADestructive
[WRITE][risk=medium] Mark a node unschedulable (no new pods land). Inverse: uncordon_node.
Pass dry_run=True to preview without cordoning.
Args: name: Node name (see node_list). dry_run: If True, preview without cordoning. target: k8s target name from config.
Inputs: name (required), target, dry_run.
create_namespaceADestructive
[WRITE][risk=medium] Create a namespace. Inverse: delete_namespace.
Pass dry_run=True to preview without creating.
Args: name: Namespace name to create. dry_run: If True, preview without creating. target: k8s target name from config.
Inputs: name (required), target, dry_run.
cronjob_getARead-only
[READ] Return detail for a single cronjob by name.
Args: name: CronJob name (see cronjob_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
cronjob_listARead-only
[READ] List cronjobs (name, namespace, schedule, suspend, active, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
daemonset_getARead-only
[READ] Return detail for a single daemonset by name.
Args: name: DaemonSet name (see daemonset_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
daemonset_listARead-only
[READ] List daemonsets (name, namespace, desired/ready/available, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
delete_deploymentADestructive
[WRITE][risk=high] Delete a deployment and its pods. HIGH RISK — no undo.
Pass dry_run=True to preview without deleting.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without deleting. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
delete_jobADestructive
[WRITE][risk=high] Delete a job and its pods. HIGH RISK — no undo.
Pass dry_run=True to preview without deleting.
Args: name: Job name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without deleting. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
delete_namespaceADestructive
[WRITE][risk=high] Delete a namespace and EVERYTHING in it. HIGH RISK — no undo.
Pass dry_run=True to preview without deleting.
Two namespaces are refused. The cluster's control-plane namespaces (kube-system, kube-public, kube-node-lease) need confirm=True — deleting one takes DNS and pod networking with it. The namespace holding this target's own ServiceAccount credential is refused outright and confirm does NOT override it: that delete revokes the credential it is running on. Both refusals are raised on the dry_run path too, so a preview never shows a green wouldDelete for a delete that would be rejected.
Args: name: Namespace name to delete. dry_run: If True, preview without deleting. confirm: Acknowledge deleting a protected control-plane namespace. target: k8s target name from config.
Inputs: name (required), target, confirm, dry_run.
delete_podADestructive
[WRITE][risk=medium] Delete a pod. No undo — a controller usually recreates it.
Pass dry_run=True to preview without deleting.
Args: name: Pod name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without deleting. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
deployment_getARead-only
[READ] Return detail for a single deployment by name.
Args: name: Deployment name (see deployment_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
deployment_listARead-only
[READ] List deployments (name, namespace, desired/ready/available, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
drain_nodeADestructive
[WRITE][risk=high] Cordon a node and evict its pods. HIGH RISK — no full undo.
DaemonSet-managed and mirror pods are skipped (like kubectl drain). The
cordon is reversible (uncordon_node); the evictions are not. Pass
dry_run=True to preview without draining.
Args: name: Node name (see node_list). dry_run: If True, preview without cordoning or evicting. target: k8s target name from config.
Inputs: name (required), target, dry_run.
endpoints_listBRead-only
[READ] List endpoints (name, namespace, ready addresses, ports, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
event_listARead-only
[READ] List recent events (type, reason, object, message, age).
Useful for diagnosing why a pod is not starting (FailedScheduling, etc.).
Returns {"events": [...], "returned": N, "limit": L, "truncated": bool}.
When truncated is true there are MORE events than shown — re-run with a
higher limit instead of reporting the shown set as complete.
Args: namespace: Namespace; omit for all namespaces. limit: Maximum number of events to return. target: k8s target name from config.
Inputs: limit, target, namespace.
ingress_getARead-only
[READ] Return detail for a single ingress, including path→backend rules.
Args: name: Ingress name (see ingress_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
ingress_listARead-only
[READ] List ingresses (name, namespace, class, hosts, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
job_getBRead-only
[READ] Return detail for a single job by name.
Args: name: Job name (see job_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
job_listARead-only
[READ] List jobs (name, namespace, completions, succeeded/failed, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
namespace_listBRead-only
[READ] List namespaces (name, phase, age).
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
node_describeARead-only
[READ] Describe a node: capacity, allocatable, conditions, taints.
Args: name: Node name (see node_list). target: k8s target name from config.
Inputs: name (required), target.
node_listARead-only
[READ] List cluster nodes (name, status, roles, version, schedulable, age).
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
node_topARead-only
[READ] CPU/memory usage per node (requires metrics-server).
Returns available: False with a clear message when metrics-server is
not installed.
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
pod_describeARead-only
[READ] Describe a pod: status, conditions, container states, recent events.
The fastest single call to diagnose why a pod is not Ready (CrashLoopBackOff, ImagePullBackOff, scheduling failures).
Args: name: Pod name (see pod_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
pod_getARead-only
[READ] Return detail for a single pod by name.
Args: name: Pod name (see pod_list). namespace: Namespace; omit to use the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
pod_health_rcaARead-only
[READ] Scan pods for CrashLoopBackOff, image-pull failures, OOMKilled, unschedulable Pending pods, and high restart counts.
Returns worst-first findings, each citing the reason string / restart count that tripped it plus a concrete kubectl action. Omit namespace to scan all.
Args: namespace: Namespace to scope to; omit for all namespaces. label_selector: Optional label selector, e.g. "app=web". target: k8s target name from config; omit to use the default.
Inputs: target, namespace, label_selector.
pod_listARead-only
[READ] List pods (name, namespace, phase, ready, restarts, node, age).
Omit namespace to list across all namespaces. Use pod_get for full detail.
Args: namespace: Namespace to scope to; omit for all namespaces. label_selector: Optional label selector, e.g. "app=web". target: k8s target name from config; omit to use the default.
Inputs: target, namespace, label_selector.
pod_logsARead-only
[READ] Return the most recent log lines for a pod (default 100).
Args: name: Pod name. namespace: Namespace; omit for the target's default namespace. tail_lines: Number of trailing log lines to return. container: Container name (required only for multi-container pods). target: k8s target name from config.
Inputs: name (required), target, container, namespace, +1 more.
pod_topARead-only
[READ] CPU/memory usage per pod (requires metrics-server).
Returns available: False with a clear message when metrics-server is
not installed.
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
pvc_getARead-only
[READ] Return detail for a single PVC by name.
Args: name: PVC name (see pvc_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
pvc_listARead-only
[READ] List persistent volume claims (name, status, capacity, class, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
pv_listBRead-only
[READ] List persistent volumes (name, capacity, status, claim, class, age).
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
replicaset_listARead-only
[READ] List replicasets (name, namespace, desired/ready, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
rollout_historyBRead-only
[READ] List a deployment's rollout revisions (from its replicasets).
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
rollout_pauseADestructive
[WRITE][risk=medium] Pause a deployment's rollout. Inverse: rollout_resume.
Pass dry_run=True to preview without pausing.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without pausing. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
rollout_restart_deploymentADestructive
[WRITE][risk=medium] Trigger a rolling restart of a deployment. No clean undo.
Pass dry_run=True to preview without restarting.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without restarting. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
rollout_resumeADestructive
[WRITE][risk=medium] Resume a paused deployment's rollout. Inverse: rollout_pause.
Pass dry_run=True to preview without resuming.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without resuming. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace.
rollout_statusARead-only
[READ] Rollout status: desired/updated/available/unavailable + paused.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
rollout_undo_deploymentADestructive
[WRITE][risk=high] Roll a deployment back to a prior revision. HIGH RISK.
Defaults to the immediately previous revision. No clean automatic inverse — re-deploy the intended image/revision to move forward again. Pass dry_run=True to preview without rolling back.
Args: name: Deployment name. namespace: Namespace; omit for the target's default namespace. to_revision: Specific revision to roll back to (0 = previous). dry_run: If True, preview without rolling back. target: k8s target name from config.
Inputs: name (required), target, dry_run, namespace, +1 more.
scale_deploymentADestructive
[WRITE][risk=medium] Scale a deployment to replicas. Inverse: restore previous count.
Returns previous_replicas so the change can be undone. Pass dry_run=True
to preview without changing anything (no undo is recorded for a preview).
Args: name: Deployment name. replicas: Desired replica count. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without scaling. target: k8s target name from config.
Inputs: name (required), replicas (required), target, dry_run, +1 more.
scale_statefulsetADestructive
[WRITE][risk=medium] Scale a statefulset to replicas. Inverse: restore previous count.
Pass dry_run=True to preview without scaling (no undo is recorded for a preview).
Args: name: StatefulSet name. replicas: Desired replica count. namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without scaling. target: k8s target name from config.
Inputs: name (required), replicas (required), target, dry_run, +1 more.
secret_listARead-only
[READ] List secrets — names, types, and key NAMES only (values redacted).
Secret VALUES are never returned. Use this to discover which secrets and keys exist, then mount/reference them via the kubeconfig-authorized workload.
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
service_listARead-only
[READ] List services (name, namespace, type, cluster IP, ports).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
set_deployment_imageADestructive
[WRITE][risk=medium] Update a deployment container's image. Inverse: restore previous.
Returns previous_image so the change can be undone. Pass dry_run=True to
preview without changing anything (no undo is recorded for a preview).
Args: name: Deployment name. container: Container name within the pod template (see deployment_get). image: New image reference (e.g. "nginx:1.27"). namespace: Namespace; omit for the target's default namespace. dry_run: If True, preview without updating the image. target: k8s target name from config.
Inputs: name (required), image (required), container (required), target, +2 more.
statefulset_getARead-only
[READ] Return detail for a single statefulset by name.
Args: name: StatefulSet name (see statefulset_list). namespace: Namespace; omit for the target's default namespace. target: k8s target name from config.
Inputs: name (required), target, namespace.
statefulset_listARead-only
[READ] List statefulsets (name, namespace, desired/ready/current, age).
Args: namespace: Namespace; omit for all namespaces. target: k8s target name from config.
Inputs: target, namespace.
storageclass_listARead-only
[READ] List storage classes (name, provisioner, reclaim policy, default).
Args: target: k8s target name from config; omit to use the default.
Inputs: target.
uncordon_nodeADestructive
[WRITE][risk=medium] Mark a node schedulable again. Inverse: cordon_node.
Pass dry_run=True to preview without uncordoning.
Args: name: Node name (see node_list). dry_run: If True, preview without uncordoning. target: k8s target name from config.
Inputs: name (required), target, dry_run.
undo_applyADestructive
[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.
The inverse runs through its own governed tool, so it is audited and labelled with its own risk tier there. Pass dry_run=True to preview the inverse call without executing it. A token can only be applied once.
Args:
undo_id: The undoId from undo_list (or an _undo_id in a write result).
dry_run: If True, preview the inverse tool + params without running it.
target: Passed through to the inverse tool when it accepts a target.
Inputs: undo_id (required), target, dry_run.
undo_listARead-only
[READ] List recorded, not-yet-applied undo tokens (most recent first).
Each entry names the original tool, the inverse tool that undo_apply
would run, and a human note. Use the undoId with undo_apply.
Returns {"undos": [...], "returned": N, "limit": L, "truncated": bool}.
truncated is measured (one extra row is fetched), not guessed from a
length coincidence: when it is true there are MORE tokens than shown, so
re-run with a higher limit rather than reporting the list as complete.
Each entry carries effectVerified. False means the original write lost
its response, so the change it reverses is PROBABLE, not confirmed — check
the live state before applying, and do not report the result as a restore
of a state that may never have been reached.
Args: limit: Max rows to return (default 50, capped at 500). target: Unused (undo state is host-local); accepted for CLI uniformity.
Inputs: limit, target.
workload_readiness_rcaARead-only
[READ] Scan Deployments/StatefulSets/DaemonSets for ready-vs-desired shortfalls, zero-ready outages, and rollout-stuck conditions.
Returns worst-first findings, each citing the measured ready/desired ratio or the failing condition reason plus a concrete kubectl action.
Args: namespace: Namespace to scope to; omit for all namespaces. target: k8s target name from config; omit to use the default.
Inputs: target, namespace.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 55 tools
Each tool targets a distinct resource + action (job_list vs job_get vs delete_job, scale_deployment vs rollout_restart_deployment vs set_deployment_image vs rollout_undo_deployment). The few adjacent diagnostic tools (pod_describe, pod_health_rca, workload_readiness_rca, event_list) are explicitly scoped in their descriptions, so misselection risk is low.
Strong, predictable snake_case resource_action pattern (job_list, pod_get, delete_namespace, scale_statefulset, cordon_node), with a few deviations like cluster_info, api_resources, and the *_rca scan tools that follow a noun/concept rather than verb_noun convention. Readable and mostly uniform throughout.
55 tools is well above the 3-15 sweet spot and past the 25+ 'too many' threshold. Kubernetes is broad enough that most individual tools earn their place (list/get pairs per resource), but the surface is heavy and forces an agent to sift through many similar read endpoints to find the right one.
Read/list/get coverage is broad across pods, workloads, nodes, network, storage, RBAC-adjacent, diagnostics, and metrics, plus key remediations (scale, rollout, set image, cordon/drain, namespace lifecycle) and a thoughtful undo system. Gaps remain: no exec/port-forward, no create/update for deployments/services/configmaps/secrets/jobs, and no service_get detail, so some lifecycle operations lack coverage.
Maintenance
Related MCP Connectors
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
Governed app access for AI agents: 1,000+ apps & 12,000+ tools via Code Mode MCP.
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
MCP gateway: one connection for your AI apps, with tool policies, PII redaction and audit logs.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceSafe, read-only-by-default Kubernetes access for AI agents via MCP. Provides explicit readonly, readwrite, and dangerous permission modes, plus MCPB bundles for desktop clients.2MIT
- AlicenseBqualityBmaintenanceA production-grade MCP server providing a secure, natural-language interface to Kubernetes for developers and AI agents, with multi-cluster routing, OIDC authentication, RBAC, and audit logging.7575 npm1MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP server for Kubernetes that applies RBAC-style, context-scoped access control to constrain AI agents, with tools for common Kubernetes operations.1Apache 2.0
- AlicenseAqualityBmaintenanceAn MCP server that enables AI agents to safely operate multi-cluster Kubernetes fleets through an Open Cluster Management hub, with policy enforcement, human approval, and audit tracing.3545 PyPI16Apache 2.0