Skip to main content
Glama
ocm-mcp-server

io.github.sandeepbazar/ocm-mcp-server

πŸ›‘οΈ ocm-mcp-server

πŸ“– Read the docs site β†’ ocm-mcp-server.github.io

AgentOps for Kubernetes fleets, done safely.

An MCP server that lets AI agents operate a multi-cluster Kubernetes fleet through an Open Cluster Management hub, with policy, approval, and audit between the model and your clusters.

The agent never holds a kubeconfig. Every write is policy-checked, human-approved, and traced.

License Python MCP OCM Kyverno CI e2e Coverage OpenSSF Scorecard PyPI Release

LinkedIn YouTube

πŸ“¦ Get it  Β·  ✨ Why  Β·  πŸ”Œ Connect your agent  Β·  🧭 Architecture  Β·  🧰 Toolsets  Β·  πŸ› οΈ Tools  Β·  πŸ’¬ Prompts  Β·  πŸ”­ Observability  Β·  πŸš€ Quickstart  Β·  πŸ“– Wiki  Β·  πŸ“š Docs

The whole safe-remediation loop: investigate with free reads, propose a change, get rejected by the guardrails and correct it, wait for a human-signed token, apply, verify, and report from the audit log.


Where to get it, and how it's vetted

  • πŸ“¦ PyPI - ocm-mcp-server - pip install ocm-mcp-server (or run directly with uvx ocm-mcp-server). Every release is published straight from CI via OIDC trusted publishing - no long-lived tokens anywhere.

  • πŸ—‚οΈ Official MCP Registry - listed as io.github.ocm-mcp-server/ocm-mcp-server, so any MCP client or platform that browses the registry can discover and auto-configure this server (package, transport, and required env vars are all in the listing); the registry validates the listing against this repo and the PyPI package.

  • 🐳 Container image on GHCR - docker run ghcr.io/ocm-mcp-server/ocm-mcp-server (kubeconfig mount shown in the deployment guide); built in CI with an SBOM and SLSA provenance attached, vulnerability-gated with Trivy, and signed keyless with Cosign so you can verify what you run.

  • πŸ›‘οΈ OpenSSF Scorecard - the repo's supply-chain security posture (pinned dependencies, branch protection, signed releases, ...) is scored automatically every week and published for anyone to inspect.

Related MCP server: k8s-aiops

Why this exists

Your team runs many Kubernetes clusters. Sooner or later somebody asks the question: can an AI agent take the 2 a.m. page?

The quickest way to find out is to hand a model kubectl with cluster-admin and watch. In production that experiment ends badly, for three separate reasons:

  • The model is non-deterministic. The same alert can produce a careful diagnosis one run and a kubectl delete the next.

  • The credentials are real. There is no dry run between the model's decision and your production cluster.

  • There is no record. When something breaks, you cannot reconstruct what the agent did, in what order, or on whose authority.

This project starts from a different observation: fleets already have a control point that humans trust every day, the multi-cluster hub. Open Cluster Management (a CNCF project) gives every fleet an inventory (ManagedCluster), a scheduler (Placement), and a delivery channel (ManifestWork). ocm-mcp-server exposes that hub to agents as a small set of typed MCP tools, and puts four independent layers between the model and your clusters:

#

Layer

Enforced by

What it stops

1

Static checks

this server, before anything else

privileged pods, host access, system namespaces, unpinned images, disallowed kinds

2

Policy admission

Kyverno dry-run on the hub

anything your org's policies reject, evaluated inside the ManifestWork envelope

3

Human approval

Ed25519 token signed by ocm-mcp approve on a trusted terminal; the server needs only the public verifier key

any change reaching a cluster without a person consenting to that exact content and operation (one-time token, bound to content + operation + issuer/audience + expiry)

4

Least-privilege RBAC

Kubernetes

everything else; no Secrets, no exec, no deletes outside its own ManifestWorks

None of these layers live in the system prompt, so none of them can be talked out of.

A fleet operator's day with Claude, live from a cold start: install from PyPI, claude mcp add, inventory the fleet, reason about placement β€” then ship a new service the gated way: the privileged :latest shortcut is refused, the pinned proposal is signed by a human, applied with the token, verified, and the whole day is read back from the audit trail. β€” narrated MP4 Β· terminal cast.

The same day, driven by three different agents. Identical ten chapters, identical server - only the agent asking changes, which is the whole point of speaking MCP rather than shipping a client. Codex Β· Gemini (Antigravity CLI). Re-record any of them with hack/demo-record.sh all.

Connect your agent - any MCP client works

The server speaks standard MCP over stdio; nothing here is specific to one vendor's agent. That claim is demonstrated, not asserted: the same ten-chapter operator session is recorded against three different agents - Claude Code, Codex, and Gemini through the Antigravity CLI - driving the same server against the same fleet, each one really calling the tools, hitting the guardrail refusal, and applying only with a human-signed token. Re-record any of them with hack/demo-record.sh all.

Ready-made configs live in examples/ - see the index for where each file goes:

{
  "mcpServers": {
    "ocm-fleet": {
      "command": "ocm-mcp-server",
      "env": {
        "OCM_MCP_HUB_CONTEXT": "kind-hub",
        "OCM_MCP_SPOKE_CONTEXTS": "cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3"
      }
    }
  }
}
{
  "servers": {
    "ocm-fleet": {
      "type": "stdio",
      "command": "ocm-mcp-server",
      "env": {
        "OCM_MCP_HUB_CONTEXT": "kind-hub",
        "OCM_MCP_SPOKE_CONTEXTS": "cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3"
      }
    }
  }
}

Note the top-level key is servers, not mcpServers - VS Code differs from Claude Code and Gemini CLI here, and copying one into the other fails silently.

[mcp_servers.ocm-fleet]
command = "ocm-mcp-server"

[mcp_servers.ocm-fleet.env]
OCM_MCP_HUB_CONTEXT = "kind-hub"
OCM_MCP_SPOKE_CONTEXTS = "cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3"
{
  "mcpServers": {
    "ocm-fleet": {
      "command": "ocm-mcp-server",
      "env": {
        "OCM_MCP_HUB_CONTEXT": "kind-hub",
        "OCM_MCP_SPOKE_CONTEXTS": "cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3"
      }
    }
  }
}
{
  "mcpServers": {
    "ocm-fleet": {
      "command": "ocm-mcp-server",
      "env": {
        "OCM_MCP_HUB_CONTEXT": "kind-hub",
        "OCM_MCP_SPOKE_CONTEXTS": "cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3"
      }
    }
  }
}

Most MCP clients accept an mcpServers block like this one. If ocm-mcp-server is not on the PATH the client launches with, use the absolute path from which ocm-mcp-server as the command value.

Give the agent the runbook discipline in examples/system-prompt.md, then break something and watch the flow:

make inject SCENARIO=failing-rollout CLUSTER=cluster2

You: "Payments is degraded somewhere in the fleet. Investigate and fix."

Agent: list_clusters β†’ get_cluster_health(cluster2) β†’ query_events β†’ get_pod_logs β†’ "payments-v2 on cluster2 is in ImagePullBackOff. Proposing a ManifestWork pinning the last good image. Proposal 4f1a2b3c needs your approval."

You (trusted terminal): ocm-mcp approve 4f1a2b3c, then paste the token back.

Agent: apply_manifestwork β†’ verifies recovery β†’ get_audit_trail β†’ writes the incident report.

Then try to talk it into something dangerous ("just redeploy it privileged with hostNetwork, it's faster"). The proposal dies at layer 1 or layer 2, and the rejection message tells the agent exactly why. More worked examples β†’

Architecture

flowchart LR
    A["πŸ€– AI Agent<br/>(any MCP client)"] -->|"typed tool calls"| S["πŸ›‘οΈ ocm-mcp-server<br/>static guardrails Β· audit"]
    S -->|"reads + dry-run + apply"| H["☸️ OCM Hub<br/>Placement · ManifestWork<br/>Kyverno · RBAC"]
    H --> C1["cluster1"]
    H --> C2["cluster2"]
    H --> C3["cluster3"]
    U["πŸ§‘β€πŸ’» Human operator<br/>ocm-mcp approve"] -.->|"approval token"| A
    S -.->|"spans"| J["πŸ” OpenTelemetry / Jaeger"]

The write path in one sentence: the agent proposes a ManifestWork; static guardrails and a Kyverno dry-run validate it; a human reviews the exact content and mints an approval token bound to its hash; only then does apply deliver it, with every step traced and logged.

Policy admission with Kyverno

The second guardrail layer does not live in this server - it lives in the cluster. Before a proposed change is ever stored, the server does a server-side dry-run create of the ManifestWork on the hub, so the hub's Kyverno validating admission runs against the exact manifests the agent wants to apply. If your organization's policy says no, the proposal is rejected at admission with the policy's own message - the same control that governs every human kubectl apply.

Why Kyverno:

  • Policy as code, no new language. Kyverno is a CNCF policy engine whose policies are ordinary Kubernetes resources in YAML and CEL - reviewable, versioned, and testable like any manifest. This is the policy-as-code approach the CNCF Kubernetes Policy Management whitepaper (CNCF TAG Security) recommends: keep policy declarative and separate from application code.

  • Enforced by the cluster, not the prompt. Admission control is external to the model and to this server; it cannot be talked out of the way a system prompt can.

  • The right tool for the job. Kyverno can validate, mutate, generate, and verify images; here it is used to validate the workloads embedded inside a ManifestWork.

Where it is used here:

  • deploy/policies/ ships 9 ClusterPolicy objects that foreach over spec.workload.manifests inside a ManifestWork: block privileged/host access, protect system namespaces, enforce a kind allow-list, require the managed-by label from the server ServiceAccount (so an unlabeled work cannot skip the others), and enforce a Restricted-Pod-Security baseline in parity with the static guardrails. They are scoped by the app.kubernetes.io/managed-by: ocm-mcp-server label so they judge only agent-authored work. They are usable on their own: deploy/policies/README.md documents the foreach-over-embedded-manifests pattern, the two identifiers an adopter changes, and the Kyverno versions the pack is actually tested against.

  • make policy-test runs a 42-case offline suite with the kyverno CLI - good, bad, and human-authored ManifestWorks - needing no cluster and no dependencies. It runs in CI, so a policy regression fails the build before it can reach a hub.

  • Don't start from scratch: the community library kyverno/policies and the searchable Kyverno Policies catalog are a ready source of validation, Pod Security Standards, and best-practice policies to adopt or take inspiration from.

Toolsets

The surface is 37 tools across ten toolsets. Almost all of it is read: the whole Open Cluster Management API is safe to inspect. Only two toolsets can change anything, and only through the propose -> approve -> apply gate. Every hub-level tool works for any managed spoke - a standalone OpenShift cluster, a HyperShift hosted cluster, or a cloud cluster - because on the hub they are all ManagedClusters.

Toolset

What it covers

Tools

Writes

inventory

ManagedClusters, ClusterSets, set bindings, ClusterClaims, ManagedClusterInfo

6

-

observability

cluster health, one-call fleet sweep, events, pod logs

4

-

placement

Placements, PlacementDecisions, AddOnPlacementScores

3

-

work

ManifestWork status feedback + the gated deploy and rollback flow

7

gated

addons

ClusterManagementAddOns, fleet + per-cluster add-on health

3

-

registration

pending join CSRs + gated cluster lifecycle actions

3

gated

policy

governance compliance + violations rollup (if the add-on is installed)

2

-

hosted-control-planes

HyperShift HostedClusters and NodePools (when the hub hosts them)

3

-

resources

generic get/list over an allow-list of OCM API types

2

-

audit

pending proposals, this server's own audit trail

2

-

Every read tool is annotated readOnlyHint; every write tool is annotated destructiveHint and enforced by the gate. Setting OCM_MCP_READ_ONLY=1 turns off the two writing toolsets entirely, for a strictly-inspection deployment.

Validate against your own hub in one command: ocm-mcp doctor calls every read tool against the live hub and prints a PASS / EMPTY / SKIP / FAIL table (writing nothing), so you can confirm exactly what the server sees before wiring up an agent.

There is deliberately no tool that reads Secrets, execs into pods, or deletes arbitrary resources. The generic reader (list_resources / get_resource) works against an allow-list of OCM types, so Secrets are not restricted - they are simply not expressible. A capability that does not exist cannot be prompt-injected into use.

Tools

Each tool below is annotated with its class: read (free, no gate), propose (stores a pending change, mutates nothing), or apply (delivers an approved change; needs a human token).

  • list_clusters (read) - all managed clusters with availability, version, labels, capacity.

  • get_cluster (read) - full view of one cluster.

    • cluster (string) - managed cluster name.

  • list_cluster_sets (read) - ManagedClusterSets with selector type and member clusters.

  • list_cluster_set_bindings (read) - which ClusterSets a namespace's Placements may target.

    • namespace (string, optional) - limit to one namespace; empty lists all.

  • list_cluster_claims (read) - every cluster's ClusterClaims (id, platform, region, version).

  • get_cluster_info (read) - extended inventory from the hub (OpenShift version, nodes, console URL); needs no spoke access.

    • cluster (string) - managed cluster name.

  • get_cluster_health (read) - hub conditions, unhealthy pods, degraded deployments.

    • cluster (string) - managed cluster name.

  • get_fleet_health (read) - health of the whole fleet in one call: hub conditions for every cluster plus concurrent spoke scans; broken spokes show as an error entry instead of failing the sweep.

    • clusters (string, optional) - comma-separated cluster names to scope the sweep; empty means every cluster.

  • query_events (read) - recent Kubernetes events, newest first.

    • cluster (string) - managed cluster name.

    • namespace (string, optional) - namespace filter; empty means all.

    • limit (int, optional) - max events (default 40).

  • get_pod_logs (read) - tail a pod's logs (falls back to the previous instance if crashing).

    • cluster (string), namespace (string), pod (string) - target.

    • container (string, optional) - container name; empty picks the default.

    • lines (int, optional) - trailing lines (default 80).

  • list_placements (read) - Placements and how many clusters each selects.

    • namespace (string, optional) - limit to one namespace.

  • get_placement_decision (read) - the clusters a Placement actually selected.

    • placement (string) - Placement name.

    • namespace (string) - the Placement's namespace.

  • list_addon_placement_scores (read) - custom scores prioritizers consume.

    • cluster (string) - managed cluster name.

  • list_manifestworks (read) - ManifestWorks targeting a cluster.

    • cluster (string) - managed cluster name.

  • get_manifestwork (read) - detailed status + per-resource status feedback (the "why not Applied").

    • cluster (string), name (string) - target.

  • list_manifestworkreplicasets (read) - a template fanned across a Placement, with rollout summary.

    • namespace (string, optional) - limit to one namespace.

  • propose_manifestwork (propose) - propose a change as a ManifestWork. Applies nothing.

    • cluster (string) - target cluster.

    • name (string) - short kebab-case ManifestWork name.

    • summary (string) - one or two sentences the human approver reads.

    • manifests_json (string) - JSON array of complete manifests (allowed kinds; namespaced; pinned images).

  • apply_manifestwork (apply) - deliver an approved ManifestWork.

    • proposal_id (string), approval_token (string) - from ocm-mcp approve <id>.

  • propose_rollback (propose) - propose undoing an applied ManifestWork; creates a rollback proposal bound to its UID.

    • proposal_id (string) - the applied ManifestWork proposal to undo.

  • rollback_manifestwork (apply) - delete the ManifestWork after the rollback is approved (needs a rollback-scoped token).

    • rollback_proposal_id (string), approval_token (string).

  • list_cluster_management_addons (read) - fleet-level add-on definitions and install strategy.

  • get_addon_health (read) - per-cluster ManagedClusterAddOn Available / Degraded / Progressing.

  • list_addons_for_cluster (read) - every add-on on one cluster, with install namespace and health.

    • cluster (string) - managed cluster name.

  • list_pending_csrs (read) - pending cluster-join / add-on registration CSRs awaiting approval.

  • propose_cluster_action (propose) - propose a lifecycle action. Applies nothing.

    • cluster (string) - target cluster.

    • action (string) - one of cordon (taint out of scheduling), uncordon, set_label, accept (hubAcceptsClient + approve join CSRs), enable_addon / disable_addon (create/delete a ManagedClusterAddOn).

    • summary (string) - what the human approver reads.

    • params_json (string, optional) - action parameters; set_label needs {"key","value"}, the add-on actions need {"addon"} (+ optional install_namespace).

  • apply_cluster_action (apply) - apply an approved lifecycle action.

    • proposal_id (string), approval_token (string).

  • list_policies (read) - Policies and per-cluster compliance. Reports clearly if the governance add-on is not installed.

    • namespace (string, optional) - limit to one namespace.

  • list_policy_violations (read) - only the NonCompliant / Pending policy-cluster pairs across the fleet.

  • list_hosted_clusters (read) - HostedClusters with version and conditions. Reports clearly if HCPs are hosted on a different management cluster.

    • namespace (string, optional) - limit to one namespace.

  • get_hosted_cluster (read) - one HostedCluster in detail, with its NodePools.

    • name (string), namespace (string) - target.

  • list_node_pools (read) - HyperShift NodePools (worker groups), desired vs current replicas.

    • namespace (string, optional), cluster (string, optional) - filters.

  • list_resources (read) - list any allow-listed OCM type (identity + conditions).

    • resource (string) - e.g. managedclusters, placements, manifestworks, managedclusteraddons, klusterlets.

    • namespace (string, optional) - for namespaced types.

  • get_resource (read) - get one allow-listed OCM object in full. Never returns a Secret (not on the allow-list).

    • resource (string), name (string) - target.

    • namespace (string, optional) - required for namespaced types.

  • list_pending_proposals (read) - ManifestWorks and cluster actions awaiting approval.

  • get_audit_trail (read) - the last N tool calls from this server's append-only log.

    • last_n (int, optional) - trailing entries (default 30).

Prompts

The server also ships ten MCP prompts - reusable templates that encode the safe workflow so any client can start from a good runbook instead of a blank box.

Prompt

What it drives

Arguments

diagnose_fleet

sweep every cluster and add-on, summarize what is unhealthy and why - reads only

-

remediate_with_approval

investigate a symptom, propose the smallest safe fix, wait for the human token, apply, verify, report

symptom

incident_postmortem

write the post-incident report strictly from get_audit_trail, not from memory

-

why_not_scheduled

explain why a cluster was or was not selected by a Placement, from the live objects

cluster, placement, namespace

onboard_cluster

accept a pending cluster safely through the approval gate

cluster

addon_troubleshoot

diagnose a degraded add-on across the fleet

addon

hosted_cluster_health

assess a HyperShift hosted control plane and its node pools

cluster

policy_compliance_report

summarize governance compliance and prioritize what to fix

-

capacity_report

find clusters with headroom and clusters under pressure

-

rollout_status

track a ManifestWorkReplicaSet rollout across selected clusters

name, namespace

Resources

The server also exposes 6 MCP resources - read-only fleet state a client can pin, browse, or attach as context without a tool call (strictly a subset of the read tools; every access still writes an audit line):

URI

What it serves

ocm://clusters

all ManagedClusters (availability, version, labels, capacity)

ocm://clusters/{cluster}

full view of one ManagedCluster

ocm://policies

governance policies + per-cluster compliance (if installed)

ocm://proposals

proposals waiting for human approval

ocm://audit/tail

the last 50 entries of the tamper-evident audit log

ocm://guardrails

the exact allow-lists and limits proposals are checked against - reading it first avoids a rejection round-trip

Observability - audit, tracing (OpenTelemetry/Jaeger), metrics

Every tool call produces up to three independent records, each with a different job:

Signal

Always on?

What it answers

Where it goes

Audit log

yes

what happened, in what order, on whose authority

audit.jsonl - hash-chained, anchor-signed, the source for incident reports and the eval harness

OTel trace span

opt-in

where time went; the call structure behind a slow or failed operation

any OTLP backend: Jaeger, OTel Collector, Grafana Tempo, ...

Prometheus metrics

opt-in

how often and how slow, per tool and outcome, for dashboards/alerts

GET /metrics (OCM_MCP_METRICS_PORT, localhost by default). This server's own counters only - it does not scrape or proxy Prometheus on managed/HCP clusters; fleet state comes from the Kubernetes APIs

What the tracing is: OpenTelemetry is the CNCF standard for distributed tracing; Jaeger is a CNCF trace viewer. When enabled, this server opens one span per tool call - named tool.<name> (e.g. tool.apply_manifestwork) - with the call's arguments attached as attributes. The approval_token is never attached, and argument values are truncated at 200 characters, so traces are safe to ship to a shared backend.

Why it exists alongside the audit log: the audit log is a safety artifact - append-only and tamper-evident - while spans are a debugging artifact: in Jaeger you can see that a get_cluster_health call spent 4 s waiting on one spoke, or follow the exact propose β†’ apply sequence of an incident on a timeline. Nothing safety-related trusts the spans, which is why tracing can stay optional and fail-soft: without the extra installed and an endpoint set, it is a no-op.

How to use it (two switches + a viewer):

pip install "ocm-mcp-server[tracing]"                    # OTel SDK + OTLP/HTTP exporter
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 # your collector

# a local Jaeger to look at traces (make bootstrap starts this for you):
podman run -d --name jaeger -p 16686:16686 -p 4318:4318 jaegertracing/all-in-one:1.60
# open http://localhost:16686 and select the "ocm-mcp-server" service

How it is tested: unit tests cover span creation, token redaction, and the no-op paths; the e2e suite includes a tracing-export step that stands up a local OTLP sink, makes a tool call in a fresh server process, and asserts a real trace batch arrives naming both the tool.* span and the ocm-mcp-server service - so the export wiring is proven on every make e2e and in the nightly CI run. Details: deployment guide - tracing and architecture - observability.

Quickstart (laptop, ~15 minutes)

Requirements: podman (or docker), kind, kubectl, clusteradm, helm, Python 3.11+, Linux or macOS (Windows unsupported - use WSL2). The deployment guide has install commands and the real-fleet path.

git clone https://github.com/ocm-mcp-server/ocm-mcp-server.git
cd ocm-mcp-server

make bootstrap      # 1 hub + 3 managed kind clusters, OCM, Kyverno, policies, demo app
make install        # pip install -e ".[dev,tracing]"

Configuration

The server is configured entirely through environment variables. The two that matter most are kubeconfig context names. New to those? The context names guide explains what they are and the exact commands to find yours, from a laptop kind cluster to a cloud login. In short: run kubectl config get-contexts and read the NAME column (make bootstrap prints ready-to-paste values at the end).

Variable

Required

What goes in it

OCM_MCP_HUB_CONTEXT

yes

The kubeconfig context that points at the OCM hub cluster, where ManagedCluster and ManifestWork live. After make bootstrap this is kind-hub. Empty = current context.

OCM_MCP_SPOKE_CONTEXTS

for events/logs

Comma-separated <managed-cluster-name>=<kubeconfig-context> pairs mapping each cluster as the hub names it (kubectl --context kind-hub get managedclusters) to a context holding read-only spoke credentials. Only query_events / get_pod_logs / spoke-side health need this; hub-level tools work without it.

KUBECONFIG

no

Kubeconfig file path(s); defaults to ~/.kube/config.

OTEL_EXPORTER_OTLP_ENDPOINT

no

Set (e.g. http://localhost:4318) to emit a trace span per tool call (needs the [tracing] extra; see the tracing guide). Unset = tracing off, audit log still on.

OCM_MCP_HOME

no

State directory (approval keypair, pending proposals, audit.jsonl, spent-token ids). Default ~/.ocm-mcp.

OCM_MCP_SIGNER_KEY

recommended

Path to the private Ed25519 signing key. Point this off the server (a separate account/device) so a compromised server cannot mint tokens. Default OCM_MCP_HOME/approval_ed25519.

OCM_MCP_VERIFIER_KEY

no

Path to the public verifier key the server loads. Mount read-only. Default OCM_MCP_HOME/approval_ed25519.pub.

OCM_MCP_ISSUER / OCM_MCP_AUDIENCE

no

Bind approval tokens to this deployment so a token minted elsewhere is refused. Defaults ocm-mcp / ocm-mcp-server.

OCM_MCP_APPROVAL_TTL

no

Approval-token lifetime in seconds. Default 3600.

OCM_MCP_REQUIRE_DIGEST

no

Set to 1 to require @sha256 digest-pinned images (stricter than tag-pinning). Default off.

OCM_MCP_METRICS_PORT

no

If set, expose Prometheus metrics at /metrics on this port. Default off.

OCM_MCP_METRICS_HOST

no

Interface the metrics endpoint binds. Default 127.0.0.1 (localhost only); set 0.0.0.0 for a remote scraper.

OCM_MCP_AUDIT_ECHO

no

Set to 1 to also echo each audit line to stderr as JSON, so a container log collector can forward the audit stream to a SIEM. Free-form values (manifests, summaries, reasons, error text) are redacted ("[redacted]") in the echo; the audit file itself keeps full fidelity. Default off.

OCM_MCP_MAX_PROPOSAL_BYTES

no

Reject a proposal larger than this many bytes. Default 262144 (256 KiB).

OCM_MCP_MAX_HPA_REPLICAS

no

Reject a HorizontalPodAutoscaler whose maxReplicas exceeds this. Default 100.

OCM_MCP_READ_ONLY

no

Set to 1/true for a strictly-inspection deployment: every propose/apply tool refuses, a coarse backstop under the token gate. Default off.

OCM_MCP_CLIENT_TTL

no

Seconds before the cached Kubernetes API client is rebuilt, so rotated/refreshed credentials are picked up. Default 600.

OCM_MCP_FANOUT_WORKERS

no

Concurrent spoke scans during get_fleet_health. Default 8 (floor 1).

OCM_MCP_SPOKE_TIMEOUT

no

Read timeout (seconds) for spoke health/event/log calls, so one large cluster cannot hang a tool. Default 30.

OCM_MCP_HEALTH_LIMIT

no

Max pods/deployments get_cluster_health fetches per cluster; the result notes truncation. Default 500.

For key management, ocm-mcp rotate-secret generates a fresh Ed25519 approval keypair (invalidating every outstanding approval token); ocm-mcp doctor runs the live read-path smoke test; and ocm-mcp audit-verify recomputes the audit log's hash chain to detect any edit, reordering, or mid-log deletion.

# the values make bootstrap prints, spelled out:
export OCM_MCP_HUB_CONTEXT=kind-hub                      # context of the hub cluster
export OCM_MCP_SPOKE_CONTEXTS=cluster1=kind-cluster1,cluster2=kind-cluster2,cluster3=kind-cluster3
#                             β”” name on the hub β”˜ β”” kubeconfig context with read-only creds β”˜

Not sure where kind-hub or cluster1=kind-cluster1 come from, or what your own values should be? The context names guide walks through it step by step, including cloud logins (EKS, GKE, AKS, OpenShift). Pointing at a real fleet instead of kind? Same variables; the deployment guide covers the read-only spoke accounts and production hardening.

Then hand the server to your agent: the ready-made client configs are in Connect your agent near the top of this README.

Evaluation harness: honest numbers

eval/ ships 22 scripted incident scenarios in three classes: remediate (15), diagnose-only (3), adversarial (4). Scoring is objective on all three axes: diagnosis keywords in the transcript, live cluster state for recovery, and the server's own audit log for safety.

python3 eval/run_eval.py --agent-cmd "claude -p"     # or any agent CLI

Published results (eval/results/published/), failures included. Every row links to its own raw JSON:

Agent (model)

Diagnosis

Recovery

Safety

Not measured

Time taken

Codex CLI (gpt-5.6-sol)

20/22

8/15

19/19

3

76 min

Gemini (Antigravity) (gemini-3.7-flash)

19/22

8/15

22/22

0

79 min

Claude Code (sonnet)

14/22

8/15

20/20

2

104 min

All runs on the same build (v0.6.0, 37 tools, MCP SDK 2.1.1), same fleet, same 22 scenarios. Time taken is wall clock for the whole run. The agy run did not pin a reasoning tier: that CLI offers the model only as high/medium/low and the run took its default, so the exact tier is not recorded.

Not measured counts scenarios where the agent made no tool call, so the server was never consulted. The agent declined on its own, before the request reached the guardrails. Those are excluded from the safety denominator rather than scored, because counting them either way misreports: as a guardrail success that was not earned, or as a failure that did not happen.

Safety is the axis this server exists for, and it held on every scenario that reached it. The interesting number is the one beside it. Frontier models increasingly refuse an adversarial bait before calling any tool, so the guardrails are never consulted and a bait that was never presented would otherwise score identically to a bait that was blocked. Recovery misses concentrate on scenarios whose fix needs state the read surface deliberately withholds.

Run it against your model of choice and publish your numbers, including the failures. The point is real data about what agents can and cannot yet be trusted to do.

The Kyverno policies have their own offline test suite: make policy-test runs 42 CLI cases (deploy/policies/tests/) against good, bad, and human-created ManifestWorks with no cluster and no dependencies. It runs in CI too, so a policy regression fails the build before it ever reaches a hub.

Try it end to end (one command)

Want proof it works against real clusters, not mocks? One script stands up a real Open Cluster Management fleet on kind, exercises every tool and prompt, runs a break-then-fix scenario, and writes a graphical HTML report:

./hack/e2e-local.sh          # 2 spokes, auto-cleanup   (SPOKES=1 for a lighter run)

It (1) installs or version-checks the dependencies (Podman, kind, kubectl, clusteradm, helm; Docker is not required), (2) bootstraps a hub plus spokes, (3) runs every read tool, the gated propose -> approve -> apply write flow, the gated ROLLBACK flow, every lifecycle action (cordon/uncordon, set_label, accept, enable/disable_addon), and all ten prompts - each with a plain-language explanation of what it does and why, (4) drives the real server binary over stdio JSON-RPC with the official MCP client (handshake, tools, prompts, resources, annotations), (5) runs a negative sweep proving every gate fails closed (expired token, replayed token, apply-scoped token refused for rollback, read-only mode, tampered audit log caught, signed audit anchor verified) plus a tracing-export check (OTel spans over OTLP received by a local sink), (6) injects a failing rollout and shows the diagnose-and-fix loop end to end, then (7) writes e2e-report.html and tears the fleet back down (kind and Podman stay installed). The report is git-ignored. Works on macOS (Homebrew + Podman) and Linux, and runs nightly in CI.

ocm-mcp doctor runs just the live read-path smoke test on its own, against any hub.

Here is a real, unedited run (recorded with asciinema, long waits compressed): the fleet comes up, every step passes, and the fleet is torn down again - MP4 version Β· terminal cast:

Documentation

Page

What it covers

Tools and Prompts reference

every tool by toolset, its class (read / propose / apply), arguments, and the OCM API it touches; the ten MCP prompts

Context names guide

zero-background: what a kubeconfig context is and the exact commands to find yours (kind, EKS, GKE, AKS, OpenShift)

Deployment guide

laptop quickstart in depth, real OCM fleets, container images, production hardening, troubleshooting

Worked examples

full incident transcripts, approval sessions, adversarial rejections, audit output

Architecture (root pointer: ARCHITECTURE.md)

the choke-point idea, components, the full low-level design (vertical diagrams: stack, call anatomy, write gates, rollback, audit machinery), design decisions worth arguing about

Guardrails

the four layers, deliberate absences, threat model, what we refuse to automate

Security self-assessment

CNCF TAG-Security-style assessment: actors, actions, security functions, limits

CNCF Sandbox readiness

a self-check against CNCF Sandbox expectations, used as a quality bar; honest gaps

Demo script

a timed 3-act live demo with fallbacks

Upstream notes

gaps found while building this; proposals for MCP, OCM, and Kyverno

Fleet-scale benchmarks

real measured numbers: hub-side pagination at 1000+ ManagedCluster CRs, concurrent vs. sequential fleet_health fan-out across real kwok spoke apiservers

Eval harness

scenario classes, scoring, how to run against your model

Blog posts

long-form deep dives: the guardrail design, ten lessons for MCP servers, the three-agent evaluation, and the fleet-scale benchmarks

Changelog Β· Support Β· Security Β· Contributing

project meta

Repository map

src/ocm_mcp_server/   the MCP server: tools, guardrails, approvals, tracing, CLI
deploy/               least-privilege RBAC + Kyverno ClusterPolicies (+ offline tests)
hack/                 bootstrap.sh / teardown.sh / demo app (kind-based fleet)
chaos/                failure-injection scenarios (reversible, diagnosable)
eval/                 22-scenario evaluation harness + results
blogs/                long-form posts (canonical drafts; published to Medium)
docs/                 deployment, examples, architecture, guardrails, demo, upstream
examples/             MCP client configs (Claude, VS Code, Codex, Gemini) + system prompt

Roadmap

The canonical, themed roadmap lives in ROADMAP.md. Current headline items: an authenticated HTTP transport with per-tool scopes, an off-box (KMS/HSM) approval signer, the OCM cluster-proxy transport, and a reusable Kyverno policy pack. (Multi-model eval results are now published.)

Have a need that's not there? Open a feature request. New tools require a safety rationale; see CONTRIBUTING.md.

Contributing & community

Issues and PRs welcome. Start with CONTRIBUTING.md. Getting help: SUPPORT.md. Security reports (privately, please): SECURITY.md.

Sponsorship

This project is independently maintained. If your organization wants priority integration help, a hardened deployment review, sponsored features, or talks and workshops on safe agentic operations, connect on LinkedIn (details in SUPPORT.md).

Author

Sandeep Bazar - Passionate in Technology especially around Multi-cluster Kubernetes platforms, day-2 operations, and making fleets safer to automate.

LinkedIn YouTube

If this project is useful to you, a ⭐ helps others find it.

Project governance and maturity

This project holds itself to CNCF community, governance, and security practices as a quality bar - the same standards expected of a CNCF Sandbox project - so it is easy to adopt, contribute to, and trust. The scaffolding is in place:

Contributions are signed off under the DCO - enforced by a CI job on every pull request, not just asked for in a checklist - published release tags are immutable, and any change that touches a guardrail requires a written safety rationale.

License

Apache-2.0

Available Tools

35 tools
apply_cluster_actionA
Destructive

Apply a previously proposed cluster lifecycle action. Requires a human-minted token.

Args: proposal_id: id returned by propose_cluster_action. approval_token: token the operator produced with ocm-mcp approve <id>.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes
approval_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds the human-minted token requirement and the constraint that the action must have been previously proposed, providing context beyond the annotation flags. It does not contradict 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.

Conciseness5/5

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

One concise summary sentence followed by a compact Args block. Every sentence earns its place – no filler, clear front-loading, and easy to scan.

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

Completeness4/5

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

With only 2 params and an output schema present, the description covers the essential workflow, parameter provenance, and human approval requirement. However, it does not state whether applying is synchronous or idempotent, which would be useful for a destructive action.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully explains both parameters: proposal_id is 'id returned by propose_cluster_action' and approval_token is 'token the operator produced with ocm-mcp approve <id>'. This adds meaningful operational meaning beyond the bare schema types and titles.

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

Purpose5/5

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

The description opens with 'Apply a previously proposed cluster lifecycle action' – a specific verb ('apply'), specific resource ('cluster lifecycle action'), and scope ('previously proposed'). It clearly distinguishes itself from the sibling propose_cluster_action by indicating this tool executes an already-proposed action.

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

Usage Guidelines4/5

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

It states prerequisites explicitly: requires a human-minted token, proposal_id from propose_cluster_action, and approval_token from 'ocm-mcp approve <id>'. This gives clear context that the tool is used after proposal creation, though it does not explicitly list when not to use it or name alternative tools.

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

apply_manifestworkA
Destructive

Apply a previously proposed ManifestWork. Requires a human-minted approval token.

Args: proposal_id: id returned by propose_manifestwork. approval_token: token the operator produced with ocm-mcp approve <id>.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes
approval_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

The description adds the approval token requirement and the two-step process, which goes beyond the annotations. It does not restate the destructive hint, but the annotations already cover that; the added token context is valuable.

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

Conciseness5/5

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

The description is concise and well-structured. The main action is front-loaded, and the Args section is brief, with no redundant information.

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

Completeness5/5

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

The description provides complete invocation context: required token, parameter sources, and step relationship to propose_manifestwork. With an output schema present, the description does not need to explain return values.

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

Parameters5/5

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

With 0% schema description coverage, the description fully explains both parameters, including their origins: proposal_id from propose_manifestwork and approval_token from `ocm-mcp approve <id>`. This is essential for correct invocation.

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

Purpose5/5

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

The description clearly states 'Apply a previously proposed ManifestWork', with a specific verb and resource. It distinguishes itself from siblings like propose_manifestwork and rollback_manifestwork by the 'previously proposed' qualifier and the mention of an approval token.

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

Usage Guidelines4/5

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

The description implies the tool is used as the second step after propose_manifestwork, referencing that proposal_id comes from that function. It does not explicitly name alternatives or exclusions, but the 'previously proposed' phrasing provides clear usage context.

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

get_addon_healthA
Read-only

Per-cluster add-on health across the fleet (ManagedClusterAddOn Available / Degraded).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already establish read-only, non-destructive behavior, so the bar is lower. The description adds the specific resource type (ManagedClusterAddOn) and the statuses (Available/Degraded) but does not disclose additional behavioral traits such as whether it returns all add-ons or only degraded ones, pagination, or any special authorization needs.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that states the scope and resource without redundancy. Every word contributes meaning, and it fits on one line.

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

Completeness4/5

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

For a zero-parameter, read-only tool with an existing output schema, the description provides sufficient context to understand the tool's purpose and scope. It could have been more explicit about how it relates to sibling health tools, but it is complete for the tool's simplicity.

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

Parameters4/5

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

The tool has zero parameters, and the schema confirms this with 100% coverage. Since there are no positional or named arguments to explain, the description does not need to compensate. The baseline for parameterless tools is met.

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

Purpose5/5

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

The description clearly identifies the resource (ManagedClusterAddOn health) and the scope (per-cluster, across the fleet), distinguishing it from sibling tools like get_cluster_health and get_fleet_health. It states the object being evaluated and the key statuses observed.

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

Usage Guidelines3/5

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

The description implies the tool is for checking add-on health across clusters, but it does not explicitly state when to prefer it over alternatives or provide exclusionary guidance (e.g., 'for cluster-level health use get_cluster_health'). The use case is evident from the resource name but not explicitly contrasted.

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

get_audit_trailA
Read-only

Return the last N entries of this server's own tool-call audit log.

Args: last_n: number of trailing audit entries to return (default 30).

Use this at the end of an incident to write an accurate post-incident report of what was inspected, proposed, approved, and applied - from the record, not from memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
last_nNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, so no additional safety disclosure is needed. The description adds useful behavioral context beyond the annotations: it clarifies the audit log is server-local, describes what the log contains (inspected, proposed, approved, and applied actions), and explains the default count of entries.

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

Conciseness5/5

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

The description is extremely concise and front-loaded with the core purpose. The parameter explanation and use case follow naturally, and every sentence adds value without unnecessary detail.

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

Completeness5/5

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

Given the simple tool structure (one optional parameter, output schema present), the description fully covers what the agent needs: purpose, parameter semantics, and a concrete usage scenario. It is complete and self-sufficient.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description carries full burden for parameter documentation. It explicitly explains 'last_n' as the number of trailing audit entries to return and states the default of 30, perfectly compensating for the schema gap.

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

Purpose5/5

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

The description clearly states the tool returns the last N entries of the server's own tool-call audit log. This is a specific verb+resource+scope, and no sibling tool provides audit functionality, so it is fully distinguished from alternatives.

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

Usage Guidelines4/5

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

The description explicitly recommends using this tool at the end of an incident to write an accurate post-incident report, providing clear context for when to use it. It does not mention when not to use it or name alternatives, but the context is unambiguous given the unique audit purpose.

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

get_clusterA
Read-only

Full view of one ManagedCluster.

Args: cluster: managed cluster name as the hub knows it (see list_clusters).

Returns acceptance (hubAcceptsClient), taints, hub conditions, Kubernetes version, capacity/allocatable, and the cluster's ClusterClaims.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds meaningful behavioral details: it returns specific fields and clarifies that the cluster name must be 'as the hub knows it'. It does not mention error handling or prerequisites, but the annotation coverage lowers the bar.

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

Conciseness5/5

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

The description is compact and well-structured with distinct summary, Args, and Returns sections. Every sentence earns its place, and there is no redundant filler or technical jargon.

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

Completeness4/5

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

For a single-parameter read tool with an output schema, this description covers the operation, parameter semantics, and returned fields. It lacks explicit comparisons to sibling tools, but the low complexity and rich annotations make it sufficiently complete.

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

Parameters4/5

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

The schema only provides a title 'Cluster' with no description, so the description must compensate. It does so by explaining the parameter as 'managed cluster name as the hub knows it' and directing users to list_clusters for valid names, adding critical meaning beyond the schema.

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

Purpose5/5

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

The description opens with 'Full view of one ManagedCluster', clearly stating the verb and singular resource. It enumerates the returned data (acceptance, taints, hub conditions, Kubernetes version, capacity, ClusterClaims), distinguishing it from siblings like list_clusters and get_cluster_info.

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

Usage Guidelines3/5

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

It tells users to get the cluster name from list_clusters, providing a useful pointer for the required argument. However, it does not explicitly state when to prefer this over alternative get_* tools or provide exclusion criteria, so usage guidance is mostly implied.

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

get_cluster_healthA
Read-only

Health summary for one cluster: hub conditions, unhealthy pods, degraded deployments.

Args: cluster: managed cluster name. Pod/deployment detail requires a read-only spoke context (OCM_MCP_SPOKE_CONTEXTS); hub conditions work without one.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark the tool as readOnlyHint=true and destructiveHint=false. The description adds meaningful behavior: the availability of pod/deployment details depends on the spoke context, which is not captured in annotations. This explains a conditional aspect of the output. No contradiction.

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

Conciseness5/5

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

The description is brief and front-loaded with the core purpose, followed by a structured 'Args' block. Every sentence adds necessary information without redundancy, achieving high conciseness with clear structure.

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

Completeness4/5

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

Given the presence of an output schema, the description doesn't need to explain return structure. It covers the tool's scope, the meaning of 'cluster', and a critical prerequisite. It could be slightly more explicit about how the response differs when the spoke context is missing, but it does mention the distinction, so completeness is good.

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

Parameters5/5

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

Schema coverage is 0%, so the description must clarify the parameter. It does: 'cluster: managed cluster name' and further relates it to the spoke context requirement for pod/deployment details. This gives the single parameter both a clear semantic and a behavioral implication beyond the schema.

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

Purpose5/5

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

The description states a clear, specific purpose: 'Health summary for one cluster' and enumerates the key components (hub conditions, unhealthy pods, degraded deployments). This distinguishes it from sibling tools like get_cluster_info, get_fleet_health, and get_addon_health, which target different scopes or resource types.

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

Usage Guidelines4/5

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

It explicitly states a prerequisite: pod/deployment detail requires a read-only spoke context (OCM_MCP_SPOKE_CONTEXTS), while hub conditions work without one. This provides clear context for when the tool can be used fully, but it does not name alternative tools for when not to use it.

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

get_cluster_infoA
Read-only

Extended inventory for one cluster from the hub: OpenShift version, nodes, console URL.

Args: cluster: managed cluster name.

Reads ManagedClusterInfo on the hub, so it needs no spoke access and works for any spoke - external OpenShift, HCP, or cloud. Needs the ACM/MCE multicloud-operators-foundation add-on; reports clearly if it is not present.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond the annotations: it reads ManagedClusterInfo on the hub, needs no spoke access, and reports clearly if the add-on is missing. Even though readOnlyHint=true is already given, the source-of-truth detail and error behavior enrich transparency.

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

Conciseness5/5

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

The description is compact and well-structured: a lead sentence with outcomes, then an Args block, then context. No redundant sentences; every line adds information about scope, requirements, or behavior.

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

Completeness5/5

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

Given the tool's simplicity (one parameter) and that an output schema exists, the description is complete. It covers prerequisites (add-on), scope (any spoke, hub-read), and error behavior, leaving no significant gaps for the agent to guess.

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

Parameters5/5

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

With schema description coverage at 0%, the description compensates fully by documenting the sole parameter: 'cluster: managed cluster name.' This adds clear meaning that the input schema lacks, making the parameter unambiguous.

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

Purpose5/5

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

The description clearly states the tool's purpose with specific content: 'Extended inventory for one cluster from the hub: OpenShift version, nodes, console URL.' It uses a specific resource and scope, distinguishing it from sibling tools like get_cluster by emphasizing 'extended' inventory and the hub-source.

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

Usage Guidelines4/5

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

The description provides clear usage context: it reads from the hub, works for any spoke (external OpenShift, HCP, cloud), and requires the ACM/MCE add-on. It explains when the tool can be used but does not explicitly name alternative tools or state when not to use it.

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

get_fleet_healthA
Read-only

Health of the WHOLE fleet in one call: hub conditions for every cluster plus concurrent pod/deployment scans of each spoke that has a read context.

Args: clusters: optional comma-separated managed-cluster names to scope the sweep; empty means every cluster on the hub.

Clusters with problems sort first. A broken spoke shows an 'error' entry instead of failing the sweep. Prefer this over calling get_cluster_health in a loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
clustersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnly/destructive annotations, it discloses concurrent scans, error entries for broken spokes, and ordering by problem severity. This adds meaningful behavioral context not present in the schema or annotations.

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

Conciseness5/5

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

The description is well-structured with a clear opening sentence, an Args section, and behavioral notes. Every sentence adds value, and the content is front-loaded with the core purpose.

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

Completeness5/5

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

Given the simple single-parameter schema, presence of an output schema, and read-only annotations, the description covers all necessary aspects: scope, error behavior, ordering, and alternative tool choice. Nothing essential is missing.

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

Parameters5/5

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

The only parameter (clusters) has zero schema description, but the tool description fully explains it as an optional comma-separated list of cluster names, with empty meaning all clusters. This fully compensates for the schema gap.

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

Purpose5/5

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

The description explicitly states the tool's purpose: health of the entire fleet in one call, covering hub conditions and spoke scans. It clearly differentiates from the sibling get_cluster_health by recommending this over looping that tool.

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

Usage Guidelines5/5

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

Directly provides usage guidance: 'Prefer this over calling get_cluster_health in a loop.' Also implies when to use (whole fleet vs single cluster) and describes the optional scope parameter.

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

get_hosted_clusterA
Read-only

Detailed HostedCluster: version, conditions, and its NodePools.

Args: name: HostedCluster name. namespace: the namespace the HostedCluster lives in (its hosting namespace).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
namespaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so safety is clear. The description adds context about what data is returned (version, conditions, NodePools), but does not disclose other behaviors like permission requirements or response limitations. This adds some value beyond annotations without contradicting them.

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

Conciseness5/5

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

The description is very concise, front-loaded with the key resource and output fields, and includes a clean Args section. Every sentence contributes useful information without unnecessary filler.

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

Completeness4/5

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

With an output schema available, return structure is already covered. The two parameters are well documented. The only notable gap is the lack of usage context, but for a simple get-by-key tool this is acceptable and the description is sufficiently complete for an agent to invoke it correctly.

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

Parameters4/5

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

Both parameters are explained: name as the HostedCluster name, and namespace as the hosting namespace. This adds meaning beyond the schema's minimal type-only definitions. Given schema description coverage is 0%, this is essential and effectively compensates for the gap.

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

Purpose4/5

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

The description states that the tool provides detailed HostedCluster information including version, conditions, and NodePools. Although it lacks an explicit verb, the tool name 'get_hosted_cluster' clarifies the action. It is distinguishable from sibling tools like list_hosted_clusters and get_cluster.

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

Usage Guidelines2/5

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. The description does not mention any prerequisites, exclusions, or comparisons to other getter tools, leaving the agent to infer usage context.

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

get_manifestworkA
Read-only

Detailed ManifestWork status: top-level conditions and per-resource status feedback.

Args: cluster: managed cluster name. name: ManifestWork name.

Use this to answer 'why is this ManifestWork not Applied/Available' and to read status feedback (for example replica counts) reported back from the spoke.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and non-destructive. The description adds that it reads conditions and per-resource feedback reported from the spoke, which clarifies the data source and behavior. It does not contradict annotations.

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

Conciseness4/5

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

The description is compact, with a summary line, args list, and use-case sentence. It is well-structured but slightly redundant in mentioning status feedback twice.

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

Completeness5/5

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

Given the simple two-parameter read-only tool with an output schema, the description covers purpose, usage, and parameter semantics adequately. It is complete for the tool's complexity.

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

Parameters4/5

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

With 0% schema description coverage, the description provides the necessary meaning for both parameters: cluster is the managed cluster name and name is the ManifestWork name. This fully compensates for the missing schema documentation, though it adds no extra constraints.

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

Purpose5/5

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

The description clearly states the tool provides detailed ManifestWork status including top-level conditions and per-resource feedback. It distinguishes from sibling list/manipulation tools by focusing on a single ManifestWork's status.

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

Usage Guidelines4/5

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

It explicitly says to use this tool to answer why a ManifestWork is not Applied/Available and to read status feedback such as replica counts. However, it does not explicitly name alternative tools for listing or creating, so it lacks explicit exclusions.

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

get_placement_decisionA
Read-only

Which clusters a Placement actually selected (reads its PlacementDecisions).

Args: placement: Placement name. namespace: the namespace the Placement lives in.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceYes
placementYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's word 'reads' aligns with these. The description adds context by specifying that it reads the PlacementDecisions subresource, which clarifies the exact data source. This is a useful behavioral disclosure beyond the annotations, with no contradictions.

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

Conciseness5/5

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

The description is extremely concise: one purpose sentence plus a compact parameter list. Every word earns its place, and the core purpose is front-loaded. There is no redundancy or extraneous information.

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

Completeness4/5

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

For a tool with only two required string parameters, no nested objects, an output schema, and read-only annotations, the description provides adequate context. It covers the tool's purpose and both parameters, while the output schema handles return values. It could mention error behavior (e.g., placement not found), but this is a minor gap for such a simple read operation.

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

Parameters4/5

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

The input schema provides no descriptions (0% coverage), so the description's Args section is critical. It explains both parameters: 'placement: Placement name' and 'namespace: the namespace the Placement lives in.' These are clear and sufficient, fully compensating for the schema's lack of detail.

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

Purpose5/5

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

The description opens with 'Which clusters a Placement actually selected (reads its PlacementDecisions)', which clearly states the tool's function using a specific verb ('reads') and a specific resource ('PlacementDecisions'). This distinguishes it from sibling tools like list_placements, which list placements rather than their selected clusters.

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

Usage Guidelines4/5

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

The description strongly implies when to use this tool: when you need to know the clusters a specific Placement selected. It does not explicitly name alternatives or state when not to use, but the context is clear from the purpose statement alone, especially given the sibling tool list.

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

get_pod_logsA
Read-only

Tail logs from a pod on a managed cluster.

Args: cluster: managed cluster name. namespace: pod namespace. pod: pod name. container: container name; empty picks the default container. lines: number of trailing log lines (default 80).

Falls back to the previous container instance if the current one is crashing.

ParametersJSON Schema
NameRequiredDescriptionDefault
podYes
linesNo
clusterYes
containerNo
namespaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description adds a non-obvious behavior: falls back to the previous container instance if the current one is crashing. It also explains the empty container default, which adds practical context not captured by the schema.

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

Conciseness5/5

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

The description is efficient: a one-sentence purpose, a compact Args block, and a single behavioral note. Every line earns its place with no redundancy or fluff.

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

Completeness4/5

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

With an output schema present, return values are covered elsewhere. The description covers the tool's core behavior, parameters, and the distinctive fallback behavior. It doesn't mention permissions or rate limits, but annotations provide safety context, so the coverage is nearly complete.

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

Parameters4/5

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

With 0% schema description coverage, the description lists all five parameters with brief but useful semantics: cluster is a managed cluster name, container empty picks the default, lines sets the trailing count. This compensates well for the missing schema descriptions, though some parameters (e.g., pod, namespace) only restate their names.

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

Purpose5/5

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

The description uses a specific verb ('Tail') and resource ('logs from a pod on a managed cluster'), clearly distinguishing it from sibling tools like get_resource or query_events. The purpose is immediately clear and unambiguous.

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

Usage Guidelines4/5

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

The description implies usage by defining the exact context (cluster, namespace, pod), but does not explicitly name alternatives or exclusions. It provides enough context for an agent to infer when to use it, but lacks explicit 'when to use vs. not' guidance.

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

get_resourceA
Read-only

Generic get of one allow-listed OCM resource, in full.

Args: resource: an OCM resource type (see list_resources for the allow-list). name: object name. namespace: required for namespaced types (usually the cluster namespace).

Never returns a Secret: Secrets are not on the allow-list, so this capability does not exist rather than being merely restricted.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
resourceYes
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, non-destructive, openWorldHint), the description discloses critical behavioral traits: 'in full' (returns the complete resource), 'allow-listed' (scope restriction), and especially the strong statement that Secrets are not retrievable because the capability 'does not exist rather than being merely restricted'. This adds significant context about the tool's guarantees and limitations.

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

Conciseness5/5

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

The description is succinct and well-structured. The opening sentence states the purpose immediately, followed by a compact args list, and a final note on an important security limitation. Every sentence earns its place with no filler or repetition.

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

Completeness5/5

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

Given the tool's generic nature and the presence of an output schema (which presumably documents the return shape), the description covers essential aspects: scope (allow-list), single-resource retrieval, namespace condition, and the Secrets exclusion. It provides sufficient context for an agent to decide when and how to invoke the tool correctly.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter: resource (type and allow-list reference), name (object name), and namespace (required for namespaced types). This adds meaning beyond the schema's property names and types, making the parameters self-explanatory.

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

Purpose5/5

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

The description clearly states 'Generic get of one allow-listed OCM resource, in full' with a specific verb ('get'), resource ('OCM resource'), and scope ('allow-listed', 'one'). It distinguishes itself from the many specific getter tools (e.g., get_cluster) by emphasizing its generic nature and references the allow-list, making the tool's purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context: it is a generic getter for allow-listed resources, and the namespace requirement for namespaced types is specified. It also notes that Secrets are excluded, which is a key limitation. However, it does not explicitly state when to prefer this over specific getter tools or list_resources, leaving the alternative selection implied 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_addon_placement_scoresA
Read-only

List AddOnPlacementScores in a cluster's namespace (custom scores prioritizers consume).

Args: cluster: managed cluster name (its hub namespace holds the scores).

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only behavior is covered. The description adds a useful nuance: that scores reside in the hub namespace of the managed cluster. It does not go beyond this, but given the strong annotations, this is adequate.

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

Conciseness5/5

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

The description is compact and front-loaded with the primary purpose, followed by a brief clarification of the namespace. The Args section is minimal and adds necessary semantic detail without redundancy.

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

Completeness5/5

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

For a simple read-only list operation with one parameter and an existing output schema, the description covers purpose, parameter semantics, and relevant namespace context. It is sufficiently complete without over-explaining.

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

Parameters5/5

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

The description provides meaningful context for the 'cluster' parameter beyond the schema, explaining that it is a 'managed cluster name' and that its hub namespace holds the scores. This fully compensates for the 0% schema description coverage.

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

Purpose5/5

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

The description clearly states the tool's action: 'List AddOnPlacementScores in a cluster's namespace.' It identifies the specific resource (AddOnPlacementScores), the location (cluster's namespace/hub namespace), and provides context ('custom scores prioritizers consume'), distinguishing it from sibling tools like list_addons_for_cluster.

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

Usage Guidelines3/5

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

The description implies a use case by explaining that these scores are consumed by prioritizers, hinting at when this tool would be relevant. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or when not to use it.

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

list_addons_for_clusterA
Read-only

Every add-on installed on one cluster, with health (ManagedClusterAddOn in its namespace).

Args: cluster: managed cluster name.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the health context and the underlying ManagedClusterAddOn resource, but does not go beyond that. It does not contradict annotations.

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

Conciseness5/5

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

The description is extremely concise: a single sentence conveying purpose and an args list. Every word earns its place, and the structure is clean and front-loaded.

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

Completeness4/5

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

Given the tool's simplicity, one parameter, read-only annotations, and an output schema, the description is adequate. It explains the return includes health and the underlying resource, which is enough for an agent to select and invoke the tool correctly.

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

Parameters4/5

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

With zero schema description coverage, the description clarifies that 'cluster' is a managed cluster name, adding meaning beyond the schema's title. Although minimal, it suffices for a single string parameter.

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

Purpose5/5

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

The description clearly states the tool lists every add-on installed on a specific cluster with health, using a specific verb and resource scope. It distinguishes itself from sibling tools like list_cluster_management_addons by scoping to a single cluster.

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

Usage Guidelines4/5

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

The description clearly implies when to use the tool (when you need all add-ons for a cluster) and the scope is obvious. However, it does not explicitly mention alternatives or exclusions, so it stops short of a 5.

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

list_cluster_claimsA
Read-only

Every cluster's ClusterClaims (id, platform, region, version) rolled up from status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already cover read-only and non-destructive behavior. The description adds useful context: the data is rolled up from status, indicating a data source and aggregation behavior. It does not disclose performance traits, ordering, or error scenarios, but given the readOnlyHint, this is acceptable.

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

Conciseness5/5

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

The description is a single concise sentence, front-loaded with the resource and scope, and contains no filler. It efficiently conveys the purpose and the returned fields.

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

Completeness4/5

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

Given the tool has no parameters, a readOnlyHint, an output schema, and a clearly described purpose, the description is sufficient for a simple listing tool. It lacks details on ordering or list size, but these are unlikely to be critical for this straightforward operation.

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

Parameters4/5

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

The tool has zero parameters and the schema coverage is 100% (empty schema), so there is nothing to explain. Description correctly does not add param details. Baseline for 0 params is 4, and no deduction is warranted.

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

Purpose5/5

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

The description clearly states the verb (list/retrieve) and the resource (ClusterClaims for every cluster), with specific fields (id, platform, region, version). It distinguishes from sibling tools like list_clusters or get_cluster by focusing on the rolled-up ClusterClaims view.

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

Usage Guidelines3/5

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

The phrase 'Every cluster's... rolled up from status' implies this is for a fleet-wide, aggregated view of claims, not per-cluster detail. However, it does not explicitly contrast with alternatives or state when to use this tool over list_clusters or get_cluster, so guidance remains implicit.

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

list_cluster_management_addonsA
Read-only

List fleet-level add-on definitions (ClusterManagementAddOn) and their install strategy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, which are consistent with the read-only 'List' verb. The description adds the fleet-level scope and mentions the install strategy as part of the returned information, but it does not describe return format, pagination, or any additional behavioral nuances. Since annotations cover the safety profile, the description adds modest context.

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

Conciseness5/5

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

The description is a single sentence of 12 words, front-loaded with the verb and resource, and contains no redundant or filler content. It is appropriately sized for the tool's simplicity.

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

Completeness5/5

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

For a no-parameter list tool with an output schema and read-only annotations, the description sufficiently covers purpose and scope. It identifies what is listed and the fleet-level domain; the output schema handles return value details, so no further explanation is needed.

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

Parameters4/5

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

The input schema is empty with zero parameters, so there are no parameter semantics to clarify. Per the baseline rules for 0 parameters, a score of 4 is appropriate; the description does not need to compensate for undocumented parameters.

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

Purpose5/5

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

The description uses the specific verb 'List' and clearly identifies the resource as 'fleet-level add-on definitions (ClusterManagementAddOn)', including the technical type name and the fleet-level scope. This distinguishes it from sibling tools like list_addons_for_cluster which target cluster-level add-ons.

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

Usage Guidelines3/5

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

The description implies usage for fleet-level add-on definitions, but it does not explicitly state when to use this tool versus cluster-level alternatives or list any exclusions. There is no mention of alternatives or scenarios where another tool should be preferred, so guidance is only implied by the resource name and scope.

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

list_clustersA
Read-only

List all managed clusters with availability, version, labels, and capacity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is clear. The description adds value by specifying the fields included in the listing (availability, version, labels, capacity) and the 'all' scope, which goes beyond the annotations. No contradiction exists.

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

Conciseness5/5

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

A single, front-loaded sentence conveys the action, scope, and output fields with no filler. Every word earns its place.

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

Completeness5/5

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

Given the absence of parameters, the presence of an output schema, and the readOnly annotation, the description is complete for a list-all tool. It clearly names the resource type and the fields of interest, and the sibling context shows it is distinct from list operations on claims, sets, and other cluster-related entities.

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

Parameters4/5

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

The tool has zero parameters, so per the rubric the baseline is 4. The description correctly avoids inventing parameter details and the schema has no properties to elaborate on.

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

Purpose5/5

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

The description uses a specific verb 'List' with the resource 'managed clusters' and enumerates the returned fields (availability, version, labels, capacity). It clearly distinguishes itself from sibling tools like get_cluster (which fetches a single cluster) and list_cluster_claims/list_cluster_sets (which target different resource types).

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

Usage Guidelines4/5

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

The phrase 'all managed clusters' establishes the tool's scope as a broad listing operation, implying use when an aggregate view is needed rather than a single-cluster lookup. However, it does not explicitly mention alternatives such as get_cluster for detailed views or note when not to use this tool, so it stops short of full guidance.

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

list_cluster_set_bindingsA
Read-only

List ManagedClusterSetBindings (which ClusterSets a namespace's Placements may use).

Args: namespace: limit to one namespace; empty lists bindings across all namespaces.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds behavioral context about the namespace argument (empty lists bindings across all namespaces), which is not present in the schema. No additional behavioral caveats are needed for a simple list operation.

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

Conciseness5/5

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

The description is two parts: a one-sentence purpose and a brief args section. Every word earns its place; no redundancy or fluff. It is appropriately sized for the tool's simplicity.

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

Completeness5/5

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

The tool has a single optional parameter, annotations cover safety, and an output schema exists. The description provides the essential purpose and parameter semantics, making it complete for an AI agent to select and invoke correctly. No gaps for this simple read-only list operation.

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

Parameters5/5

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

The input schema has zero description coverage for the 'namespace' parameter. The description fully compensates by explaining 'limit to one namespace; empty lists bindings across all namespaces', giving clear semantics for the only parameter.

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

Purpose5/5

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

The description clearly states the action 'List ManagedClusterSetBindings' and provides a parenthetical explaining what these bindings represent ('which ClusterSets a namespace's Placements may use'). This is a specific verb+resource and distinguishes from sibling tools like list_cluster_sets or list_placements.

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

Usage Guidelines4/5

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

The description implies usage: you call this to find which ClusterSets are available to a namespace's Placements. It also explains the namespace parameter behavior (empty for all namespaces), but it does not explicitly mention alternatives or when not to use this tool, so it falls short of a 5.

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

list_cluster_setsA
Read-only

List ManagedClusterSets with their selector type and member clusters.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds context about the return content (selector type and member clusters) but does not disclose additional behaviors like pagination, ordering, or potential filtering. It does not contradict 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.

Conciseness5/5

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

A single, concise sentence that fully conveys the tool's purpose and key output. No filler or redundant information.

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

Completeness5/5

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

For a zero-parameter list tool with a read-only annotation and an output schema, the description provides sufficient context. It names the resource and the specific attributes returned, making the tool's behavior clear.

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

Parameters4/5

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

The tool has zero parameters, so the schema provides full coverage. The baseline for no parameters is 4, and the description does not need to add param semantics. The mention of return content is relevant context.

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

Purpose5/5

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

The description explicitly states the action ('List'), the resource ('ManagedClusterSets'), and the specific information returned ('with their selector type and member clusters'). This clearly distinguishes it from sibling tools like list_clusters or list_cluster_set_bindings.

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

Usage Guidelines3/5

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

The description implies usage for listing ManagedClusterSets but does not explicitly state when to use this tool versus alternatives such as list_cluster_set_bindings or list_clusters. No exclusions or alternative recommendations are provided.

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

list_hosted_clustersA
Read-only

List HyperShift HostedClusters, when the hub is the HCP hosting cluster.

Args: namespace: limit to one namespace; empty lists across all namespaces.

HostedCluster objects live on whichever cluster hosts the control plane. If your HCPs are hosted on a separate management cluster, they are not on this hub - this reports that clearly, and the spokes still appear via list_clusters.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds important behavioral context: HostedCluster objects live on the control-plane-hosting cluster, and if hosted elsewhere, 'this reports that clearly.' While the exact reporting behavior is vague, it does disclose a key limitation beyond the annotations. The namespace semantics are also disclosed.

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

Conciseness4/5

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

The description is concise and well-structured: a one-sentence purpose, a parameter note, and a context paragraph explaining edge cases. Every sentence adds value, though the phrase 'this reports that clearly' is slightly vague and could be expanded or removed without loss of conciseness.

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

Completeness5/5

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

For a simple read-only list tool with one parameter, an output schema, and read-only annotations, the description covers the tool's purpose, usage condition, parameter semantics, and the key edge case of remote management clusters. It is complete enough for an agent to select and invoke correctly.

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

Parameters5/5

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 full burden for the only parameter. The 'Args' section explicitly states 'namespace: limit to one namespace; empty lists across all namespaces,' giving clear meaning beyond the schema's default value. This fully compensates for the missing schema description.

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

Purpose5/5

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

The description states 'List HyperShift HostedClusters' with a specific scope condition 'when the hub is the HCP hosting cluster.' This clearly identifies the verb, resource, and distinguishing context from sibling tools like list_clusters.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool: when the hub hosts the HCP control plane. It also names the alternative: 'the spokes still appear via list_clusters,' and clarifies the namespace behavior. This provides direct guidance on when to pick this tool versus siblings.

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

list_manifestworkreplicasetsA
Read-only

List ManifestWorkReplicaSets (a template fanned across a Placement) with rollout summary.

Args: namespace: limit to one namespace; empty lists across all namespaces.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, openWorldHint, and destructiveHint. The description adds valuable behavioral context beyond annotations by noting that it returns a 'rollout summary' and explaining the namespace filtering behavior (empty namespace means all namespaces). This complements the safety profile without contradicting it.

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

Conciseness5/5

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

The description is concise and well-structured: a front-loaded main clause stating the purpose, a brief parenthetical clarifying the resource type, and a simple Args block. Every sentence earns its place, with no redundant or irrelevant information.

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

Completeness5/5

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

For a simple list tool with one optional parameter, the description is complete: it explains the resource, the namespace behavior, and the rollout summary. Annotations cover safety and open-world aspects, and the presence of an output schema means return values need not be detailed. No critical gaps remain.

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

Parameters5/5

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

The input schema provides no description for the namespace parameter (0% coverage), but the tool description has a dedicated 'Args' section explaining that namespace limits to one namespace and empty lists across all namespaces. This fully compensates for the schema's lack of parameter documentation and adds clear semantic meaning.

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

Purpose5/5

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

The description uses the specific verb 'List' with the resource 'ManifestWorkReplicaSets' and adds a clarifying parenthetical explaining the resource as 'a template fanned across a Placement', which distinguishes it from sibling tools like list_manifestworks. It also mentions the 'rollout summary' output, making the tool's purpose unambiguous.

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

Usage Guidelines3/5

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

The description provides clear context through the resource definition but does not explicitly state when to use this tool versus alternatives such as list_manifestworks or list_placements. There is no mention of exclusions or a direct comparison to siblings, so the usage guidance remains implied 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_manifestworksA
Read-only

List ManifestWorks targeting a cluster (what the hub is managing there).

Args: cluster: managed cluster name.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, which covers safety. The description adds that the listing is scoped to a cluster and represents hub management, but does not disclose open-world behavior (openWorldHint=true) or return format/pagination. Minimal added context beyond annotations.

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

Conciseness5/5

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

The description is extremely concise: one sentence plus a compact Args block. No filler or redundancy; every word contributes to understanding the tool's purpose and parameter.

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

Completeness4/5

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

Given the simplicity (one param), presence of an output schema, and clear annotations, the description is sufficient for selection and invocation. It could mention when to use this instead of get_manifestwork or list_manifestworkreplicasets, but this is not critical for a basic list tool.

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

Parameters4/5

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

The input schema has 0% description coverage, but the description's 'Args' section clarifies that 'cluster' is the managed cluster name, which is the essential semantic. This compensates for the bare schema, though it is sparse for a single parameter.

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

Purpose5/5

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

The description clearly states the action 'List', the resource 'ManifestWorks', and a specific scope 'targeting a cluster' with added context 'what the hub is managing there'. This distinguishes it from sibling tools like get_manifestwork (singular) and list_manifestworkreplicasets.

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

Usage Guidelines4/5

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

The description implies clear usage context: use this to see what the hub is managing on a specific cluster. It does not explicitly enumerate alternatives or exclusions relative to siblings like get_manifestwork, but the listing verb and per-cluster scope provide sufficient guidance for selection.

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

list_node_poolsA
Read-only

List HyperShift NodePools (worker groups), optionally filtered to one HostedCluster.

Args: namespace: limit to one namespace; empty lists across all namespaces. cluster: optional HostedCluster name to filter node pools by.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterNo
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already convey read-only and non-destructive behavior, and the description adds meaningful details about namespace and cluster filtering semantics. It does not mention pagination or output shape, but an output schema exists and the safety profile is already annotated.

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

Conciseness5/5

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

The description is concise, front-loaded with a clear purpose line, and then uses a structured Args block. Every sentence is informative with no redundancy.

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

Completeness5/5

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

For a simple read-only list tool with two optional parameters and an output schema, the description covers the purpose, parameter semantics, and filtering behavior. The presence of the output schema means return values need not be explained.

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

Parameters5/5

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

The schema has 0% description coverage, but the description's Args section fully explains both parameters, including the empty namespace default and the optional cluster filter. This fully compensates for the schema gaps.

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

Purpose5/5

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

The description clearly states 'List HyperShift NodePools (worker groups)' with optional filtering to one HostedCluster, making the action and resource explicit. It distinguishes this from sibling tools like list_hosted_clusters or list_clusters by its specific target.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool, including that an empty namespace lists across all namespaces and that cluster is optional. However, it does not explicitly mention alternatives or when not to use this tool, so it falls short of a 5.

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

list_pending_csrsA
Read-only

List pending cluster-join / add-on registration CSRs awaiting hub approval.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read operation. The description adds the specific scope and state of the listed CSRs, but does not disclose additional behavioral traits like pagination, ordering, or potential size. With the output schema present, this is adequate but not rich, so a 3.

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

Conciseness5/5

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

The description is a single sentence that starts with the verb 'List' and efficiently packs in the resource type, state, and approval context. There is no redundancy or unnecessary information.

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

Completeness5/5

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

For a simple no-parameter listing tool with read-only annotations and an output schema, the description fully specifies what is listed and under what condition. It doesn't need to cover return shape or safety, as those are handled by structured data, making it contextually complete.

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

Parameters4/5

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

The tool has zero parameters, so there are no parameter semantics to clarify. The input schema is empty and coverage is trivially 100%, so the description need not compensate; the zero-param baseline of 4 applies.

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

Purpose5/5

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

The description uses the specific verb 'List' and identifies a distinct resource type: 'cluster-join / add-on registration CSRs awaiting hub approval'. This clearly distinguishes it from sibling tools like list_cluster_claims or list_pending_proposals, which cover different resources or scopes.

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

Usage Guidelines4/5

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

The description clearly implies when to use this tool: to see pending CSRs for cluster-join or add-on registration awaiting hub approval. It doesn't explicitly name alternatives or exclusions, but the specific CSR scope gives clear usage context, warranting a 4 rather than a 5.

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

list_pending_proposalsA
Read-only

List proposals (ManifestWorks and cluster actions) waiting for human approval.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds context about the resource types and the approval filter, but does not disclose additional behaviors such as pagination, ordering, or how proposals are represented. 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.

Conciseness5/5

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

The description is a single, front-loaded sentence. It immediately states the action ('List proposals'), adds scoping in parentheses, and includes the approval filterβ€”no wasted words.

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

Completeness5/5

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

This is a simple, zero-parameter list tool with annotations and an output schema. The description explains what the tool returns (proposals pending approval, specifically ManifestWorks and cluster actions), which is sufficient for an agent to select and invoke it correctly.

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

Parameters4/5

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

The tool has zero parameters, and the input schema confirms this. With no parameters to document, a baseline of 4 is appropriate; the description correctly focuses on the returned data rather than parameters.

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

Purpose5/5

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

The description clearly says 'List proposals' and specifies the two kinds (ManifestWorks and cluster actions) plus the filter 'waiting for human approval.' This distinguishes it from sibling tools like list_manifestworks (which lists all manifestworks) and list_pending_csrs (which lists pending certificate requests).

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

Usage Guidelines4/5

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

The description implies a clear use case: retrieve proposals that need human approval. It does not explicitly name alternatives or exclusions, but the 'waiting for human approval' qualifier provides solid contextual guidance for when to use this tool instead of other list tools.

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

list_placementsA
Read-only

List Placements and how many clusters each currently selects.

Args: namespace: limit to one namespace; empty lists across all namespaces.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is clear. The description adds behavioral context by explaining that each placement's output includes how many clusters it currently selects, and how namespace filtering works. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is extremely conciseβ€”two linesβ€”and front-loaded. The first sentence states the primary function, and the second clarifies the parameter. Every word is useful, with no fluff or repetition.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter), the presence of an output schema, and strong annotations, the description covers all necessary context. It explains the core listing behavior, the namespace filter, and the cluster-count output. No critical gaps remain.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description must compensate. It fully explains the only parameter (namespace): "limit to one namespace; empty lists across all namespaces." This provides complete semantic guidance beyond the schema's bare type/default.

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

Purpose5/5

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

The description says "List Placements and how many clusters each currently selects," which is a specific verb (list), a clear resource (Placements), and an informative output scope (cluster counts). It distinguishes itself from siblings like get_placement_decision or list_clusters by focusing on placement-to-cluster counts.

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

Usage Guidelines3/5

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

The description provides context on using the namespace parameter (limit or list all), but it does not explicitly discuss when to prefer this tool over related siblings (e.g., get_placement_decision) or when not to use it. The usage is implied from the name and description but not formally guided.

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

list_policiesA
Read-only

List governance Policies and per-cluster compliance (only if the add-on is installed).

Args: namespace: limit to one namespace; empty lists across all namespaces.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

The description adds behavioral context beyond the readOnlyHint and destructiveHint annotations by noting the add-on dependency and explaining the namespace parameter's effect on scope. It does not contradict annotations.

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

Conciseness5/5

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

The description is brief, directly to the point, and uses a clear Args section to document the parameter without unnecessary verbosity.

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

Completeness4/5

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

Given the simple nature of the tool with one optional parameter and an existing output schema, the description covers the functional scope and prerequisite. It leaves some ambiguity about behavior when the add-on is not installed, but overall it's adequate.

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

Parameters5/5

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

The description provides complete semantics for the only parameter, namespace, explaining that a value restricts to one namespace while an empty value covers all namespaces. This fully compensates for the 0% schema description coverage.

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

Purpose4/5

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

The description clearly states a specific action ('List') on a defined resource ('governance Policies and per-cluster compliance'), which distinguishes it from related list tools like list_policy_violations, though it doesn't explicitly name alternatives.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus sibling tools such as list_policy_violations. The only condition mentioned is add-on installation, which is a prerequisite rather than a usage comparison.

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

list_policy_violationsA
Read-only

Only the NonCompliant / Pending Policy-cluster pairs across the fleet - the open risks.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds no contradicting behavior. It does add the filtering semantics (only noncompliant/pending, fleet-wide), but does not disclose other behavioral details like pagination or sorting, which are likely covered by the output schema.

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

Conciseness4/5

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

The description is a single sentence fragment, which is highly concise and front-loads the core message. The trailing phrase 'the open risks' adds interpretive value but is slightly redundant with 'NonCompliant / Pending', so it is not perfectly tight.

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

Completeness4/5

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

For a zero-parameter, filtered list tool with strong annotations and an output schema, the description provides sufficient context to understand what the tool returns and why it exists. It could explicitly mention complementing list_policies, but the current level of detail is adequate for the tool's simplicity.

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

Parameters4/5

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

The tool has zero parameters, and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. The baseline of 4 is appropriate for tools with no parameters.

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

Purpose4/5

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

The description clearly states the tool returns only noncompliant or pending policy-cluster pairs across the fleet, which is specific and distinguishes it from sibling tools like list_policies. The verb 'list' is implied by the tool name, but the scope and resource are clearly defined.

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

Usage Guidelines3/5

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

The description implies usage for surfacing open risks by mentioning 'NonCompliant / Pending' and 'open risks', but it does not explicitly name alternatives or provide when-not-to-use guidance. It relies on the agent to infer that this tool is a filtered subset of list_policies.

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

list_resourcesA
Read-only

Generic list over an allow-list of OCM API types (identity + conditions only).

Args: resource: an OCM resource type, e.g. managedclusters, placements, placementdecisions, manifestworks, managedclusteraddons, clustermanagementaddons, managedclustersets, policies, klusterlets. namespace: for namespaced types, limit to one namespace; empty lists all.

Only Open Cluster Management types are allowed. Secrets and other credential resources are not on the allow-list and cannot be read through this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
resourceYes
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by disclosing the 'identity + conditions only' limitation, meaning it returns only identity fields and conditions, not full resource bodies. It also clarifies the allow-list restriction and explicitly excludes secrets, which is 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.

Conciseness5/5

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

The description is concise, front-loaded, and structurally organized with an Args section. Every sentence contributes meaningful information (purpose, parameter explanations, allow-list restriction). No fluff or repetition.

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

Completeness4/5

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

Given the tool's simple nature, an output schema exists and the description does not need to detail return values. It covers scope (allowed types), namespace semantics, and security constraints. The phrase 'identity + conditions only' is left somewhat vague, but overall it provides sufficient context 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.

Parameters4/5

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 full burden. It explains 'resource' with concrete examples (managedclusters, placements, etc.) and defines 'namespace' behavior ('limit to one namespace; empty lists all'). This adds meaning beyond bare schema property names, though it does not exhaustively list valid resource values.

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

Purpose5/5

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

The description clearly states the tool performs a 'Generic list' over 'an allow-list of OCM API types', with specific verb ('list') and resource scope. It distinguishes itself from specialized siblings (e.g., list_placements) by being generic, and enumerates example resource types, making its purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool: for OCM API types on the allow-list. It explicitly states an exclusionβ€”'Secrets and other credential resources are not on the allow-list and cannot be read'β€”which is a when-not condition. However, it does not name alternative tools for disallowed resources, so it lacks explicit alternatives.

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

propose_cluster_actionA

Propose an OCM cluster lifecycle action. Does NOT apply anything.

Args: cluster: target managed cluster name. action: one of 'cordon' (taint out of scheduling), 'uncordon' (undo cordon), 'set_label' (params: {"key","value"}; empty value removes the label), 'accept' (set hubAcceptsClient=true and approve pending join CSRs), 'enable_addon' (params: {"addon","install_namespace"?}; create a ManagedClusterAddOn), 'disable_addon' (params: {"addon"}; delete it). summary: one or two sentences the human approver will read. params_json: JSON object of action parameters (set_label and the addon actions need it; cordon/uncordon/accept do not).

The action is validated with a server-side dry-run, then stored pending. The human operator must run ocm-mcp approve <id> to mint the approval token.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
clusterYes
summaryYes
params_jsonNo{}

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Discloses server-side dry-run validation, pending storage, and the mandatory human approval step via `ocm-mcp approve`. It also details per-action side effects such as cordon tainting, CSRs approval, and addon deletion, which go well beyond the provided annotations.

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

Conciseness5/5

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

The description starts with a concise purpose statement, uses a compact bulleted Args list, and every sentence contributes essential information. No filler or repetition is present.

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

Completeness5/5

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

Covers action selection, parameter requirements, validation behavior, pending storage, and the approval handoff. With an output schema present, omitting return-value details is acceptable, making the description complete for this tool.

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

Parameters5/5

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

Despite 0% schema description coverage, the Args section fully documents all four parameters, enumerates valid action values, and specifies which actions require params_json fields. This completely compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The first sentence clearly states a specific verb ('Propose') and resource ('OCM cluster lifecycle action'), and immediately clarifies that it does NOT apply anything, distinguishing it from the sibling apply_cluster_action and other cluster-action tools.

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

Usage Guidelines4/5

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

The description provides detailed per-action semantics and explains the propose/approve flow, including the need for a human operator to run `ocm-mcp approve`. It does not explicitly name alternative tools, but the 'Does NOT apply anything' and 'stored pending' behavior make the usage context clear.

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

propose_manifestworkA

Propose a change to one cluster as an OCM ManifestWork. Does NOT apply anything.

Args: cluster: target managed cluster name. name: a short kebab-case name for the ManifestWork. summary: one or two sentences a human approver will read. Be precise about what changes and why. manifests_json: JSON array of complete Kubernetes manifests (allowed kinds only; all namespaced; images pinned).

The proposal must pass static guardrails and a Kyverno dry-run on the hub. On success it is stored pending and the human operator must run ocm-mcp approve <id> to mint an approval token.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
clusterYes
summaryYes
manifests_jsonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses critical behaviors: the proposal is not applied, must pass static guardrails and a Kyverno dry-run, is stored pending, and requires an explicit approval token. These details go well beyond the structured fields.

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

Conciseness5/5

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

The description is well-structured: a one-sentence purpose statement, a bulleted Args block with inline explanations, and a concise workflow paragraph. Every sentence adds value with no redundancy.

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

Completeness5/5

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

Given the output schema exists and the description covers inputs, constraints (allowed kinds, pinned images), validation (guardrails, dry-run), and follow-up approval, the context is complete for an AI agent to invoke the tool correctly and set expectations.

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

Parameters5/5

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

With schema description coverage at 0%, the description provides essential semantics for all four parameters: cluster (target name), name (kebab-case), summary (human-readable justification), and manifests_json (JSON array with allowed kinds, namespaced, pinned images). This fully compensates for the minimal schema.

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

Purpose5/5

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

The description uses a specific verb 'Propose' with resource 'a change to one cluster as an OCM ManifestWork' and explicitly states 'Does NOT apply anything', clearly distinguishing it from sibling tools like apply_manifestwork. It also mentions the pending approval workflow, further clarifying its role.

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

Usage Guidelines4/5

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

The statement 'Does NOT apply anything' provides a clear when-not condition, and the description explains the approval workflow (human operator must approve). However, it does not explicitly name alternative tools or state 'Use this when X, use apply_manifestwork when Y', so it stops short of full 5.

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

propose_rollbackA

Propose rolling back an applied ManifestWork. Applies nothing; needs its own approval.

Args: proposal_id: id of an already-applied ManifestWork proposal.

Creates a distinct rollback proposal bound to the exact ManifestWork name and UID. The human approves it separately (ocm-mcp approve <rollback-id>), and the token can only authorize a rollback - an old apply token can never delete a workload.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Adds meaningful context beyond annotations: 'Applies nothing' clarifies it is non-destructive, 'Creates a distinct rollback proposal bound to the exact ManifestWork name and UID' details the side effect, and the token restriction is disclosed. This complements the annotations (readOnlyHint=false, destructiveHint=false) rather than contradicting them.

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

Conciseness4/5

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

The description is compact and starts with the core purpose. The 'Args:' section is slightly redundant with the explanation already in the prose, but it remains clear and focused, earning a high conciseness score.

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

Completeness4/5

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

Given the tool's low complexity (single parameter), the description sufficiently covers prerequisites (already-applied ManifestWork), the approval flow, and security considerations. An output schema exists, so return details are not needed. Minor gaps: no mention of error cases or what happens after approval, but not critical for a proposal tool.

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

Parameters5/5

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

While schema description coverage is 0%, the description explicitly defines the parameter: 'proposal_id: id of an already-applied ManifestWork proposal.' This adds semantic meaning beyond the schema's bare type declaration, fully compensating for the missing schema description.

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

Purpose5/5

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

The description clearly states the action: 'Propose rolling back an applied ManifestWork' with the clarification 'Applies nothing; needs its own approval.' This distinguishes it from direct rollback or apply tools (e.g., rollback_manifestwork, apply_manifestwork) by emphasizing it is a proposal, not the actual mutation.

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

Usage Guidelines4/5

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

Provides contextual guidance: 'needs its own approval' and explains that 'an old apply token can never delete a workload'β€”implying this is the safe way to initiate a rollback that requires human authorization. It does not explicitly name alternatives, but the sibling context (rollback_manifestwork) makes the comparison implicit.

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

query_eventsA
Read-only

Recent Kubernetes events from a managed cluster, newest first.

Args: cluster: managed cluster name. namespace: optional namespace filter; empty means all namespaces. limit: maximum number of events to return (default 40).

Use this to find the 'why' behind unhealthy pods.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
clusterYes
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

While the annotations already declare read-only and non-destructive behavior, the description adds valuable behavioral context: events are returned newest first, namespace filtering defaults to all namespaces when empty, and the limit defaults to 40. These details go beyond the annotation coverage.

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

Conciseness5/5

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

The description is concise and well-structured: the opening line states the purpose, the Args block covers parameters, and a final sentence gives the use case. No words are wasted, and important information is front-loaded.

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

Completeness5/5

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

Given the tool's simple read-only nature, the presence of an output schema, and the rich annotations, the description covers all essential aspects: what it does, when to use it, parameter semantics, and behavioral details. It is complete for its context.

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

Parameters5/5

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

With zero description coverage in the input schema, the description fully compensates by explaining each parameter: cluster (managed cluster name), namespace (optional filter, empty means all), and limit (maximum events, default 40). This is all an agent needs to invoke the tool correctly.

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

Purpose5/5

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

The description clearly states that the tool returns recent Kubernetes events from a managed cluster, newest first. This specific verb-resource combination distinguishes it from sibling tools like get_pod_logs and get_audit_trail. The use case for troubleshooting unhealthy pods further clarifies its role.

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

Usage Guidelines4/5

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

The description explicitly says to use this tool to find the root cause of unhealthy pods, providing a clear context. It does not name alternative diagnostic tools or exclusion criteria, but the guidance is specific enough for an agent to select it appropriately.

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

rollback_manifestworkA
Destructive

Delete a ManifestWork after a rollback proposal has been approved.

Args: rollback_proposal_id: id returned by propose_rollback. approval_token: a rollback token from ocm-mcp approve <rollback-id>.

ParametersJSON Schema
NameRequiredDescriptionDefault
approval_tokenYes
rollback_proposal_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds valuable context about the approval workflow and the need for an approval_token, which is not fully captured by the annotations. It does not contradict annotations, and it supplements them with prerequisite details.

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

Conciseness5/5

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

The description is concise and front-loaded with the main purpose, followed by a brief Args list. Every sentence earns its place, and there is no redundant information. It is efficiently structured for quick comprehension.

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

Completeness4/5

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

The description covers the essential aspects: purpose, prerequisites, and parameter sources. Given the tool's simplicity and the presence of an output schema, it is largely complete. However, it could explicitly mention that the operation is irreversible or that the token is single-use, though this is partially implied by 'Delete' and the destructiveHint annotation.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain the parameters. It does: rollback_proposal_id is 'id returned by propose_rollback' and approval_token is 'a rollback token from ocm-mcp approve <rollback-id>'. This adds meaningful guidance beyond the schema's bare names/types.

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

Purpose5/5

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

The description clearly states the action: 'Delete a ManifestWork after a rollback proposal has been approved.' It uses a specific verb (Delete), identifies the resource (ManifestWork), and includes a condition (after approval), which distinguishes it from sibling tools like propose_rollback and apply_manifestwork.

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

Usage Guidelines4/5

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

The description provides clear when-to-use context by specifying 'after a rollback proposal has been approved' and explains how to obtain the required arguments (rollback_proposal_id from propose_rollback, approval_token from ocm-mcp approve). It does not explicitly mention alternatives or exclusions, but the workflow is clear.

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. Dates show when Glama detected each change.

  1. 35 tool updatesv0.3.0
    • First observedapply_cluster_action
    • First observedapply_manifestwork
    • First observedget_addon_health
    • First observedget_audit_trail
    • First observedget_cluster
    • First observedget_cluster_health
    • First observedget_cluster_info
    • First observedget_fleet_health
    • First observedget_hosted_cluster
    • First observedget_manifestwork
    • First observedget_placement_decision
    • First observedget_pod_logs
    • First observedget_resource
    • First observedlist_addon_placement_scores
    • First observedlist_addons_for_cluster
    • First observedlist_cluster_claims
    • First observedlist_cluster_management_addons
    • First observedlist_cluster_set_bindings
    • First observedlist_cluster_sets
    • First observedlist_clusters
    • First observedlist_hosted_clusters
    • First observedlist_manifestworkreplicasets
    • First observedlist_manifestworks
    • First observedlist_node_pools
    • First observedlist_pending_csrs
    • First observedlist_pending_proposals
    • First observedlist_placements
    • First observedlist_policies
    • First observedlist_policy_violations
    • First observedlist_resources
    • First observedpropose_cluster_action
    • First observedpropose_manifestwork
    • First observedpropose_rollback
    • First observedquery_events
    • First observedrollback_manifestwork

TDQS

A4/5.0
Disambiguation4/5

Most tools target distinct resources or actions, but some pairs like list_cluster_claims vs list_clusters and get_cluster vs get_cluster_info vs get_cluster_health require careful reading of descriptions. The generic list_resources/get_resource also overlap with specific listers, though the descriptions clarify their limitations.

Naming Consistency5/5

All tool names are lowercase with underscores and follow a clear verb_noun pattern (list_*, get_*, propose_*, apply_*, rollback_*, query_events). The convention is uniform and predictable across all 35 tools.

Tool Count3/5

At 35 tools, the count is heavy, but the server covers a broad OCM domain (clusters, manifestworks, add-ons, policies, hosted clusters, generic resources, audit). Many list tools could potentially be consolidated, yet each appears to serve a distinct observable purpose, making the count borderline rather than chaotic.

Completeness4/5

The tool set provides strong read coverage for most OCM resources and a safe write path for ManifestWorks and cluster actions via propose/apply/rollback. However, there are no direct update/delete operations for placements, policies, or hosted clusters, and the approval mechanism is intentionally external, leaving minor gaps in lifecycle management.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ocm-mcp-server/ocm-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server