Static guardrails
Dangerous reads cannot be expressed: Secrets and non-OCM kinds are absent from the allow-list, so they are refused before any API call.
An MCP server that lets AI agents operate a multi-cluster Kubernetes fleet through an Open Cluster Management hub. The agent never holds a kubeconfig. Every write is policy-checked, human-approved, and traced.
Each gate can refuse on its own. A change reaches the fleet only by satisfying all four.
Recorded live against a real fleet: the privileged :latest shortcut is
refused, the pinned proposal is human-signed, applied and verified.
Each one can refuse independently. A request has to satisfy all of them, and the two policy layers are tested against a shared fixture corpus to prove they agree.
Dangerous reads cannot be expressed: Secrets and non-OCM kinds are absent from the allow-list, so they are refused before any API call.
An independent second opinion in dry-run. A parity contract asserts it reaches the same verdict as layer 1 on every fixture.
Writes are two-phase. An Ed25519 token, minted by a person out of band, binds the exact content hash and expires.
No Secret reads, no exec, no arbitrary delete — enforced by the hub itself, not by the server asking nicely.
Watch the same four gates take two requests. Only one of them reaches a cluster, and a person had to sign for it.
The server holds a public verifier key and nothing else. The signing key stays with the person, on their own terminal, and the token it produces is bound to one content hash, one operation, and an expiry.
The whole Open Cluster Management API is safe to inspect, so most of the server is readable and free. Only two toolsets can change anything, and only through the gate.
The audit log is a safety artifact: append-only, hash-chained, and the thing an incident report is written from. The spans are a debugging one, and nothing safety-related trusts them.
Why it exists, how it works, and what it refuses to automate — in order.
Every platform team running Kubernetes at scale eventually hears it from leadership: can an AI agent handle our on-call
02Fleets already have a place where multi-cluster actions are observed and controlled: the hub. Open Cluster Management(ht
03The agent talks only to the server. The server holds the kubeconfig, applies static guardrails, writes an audit line and
04What is actually in the code, so you can read it with a map in hand.
0537 tools across ten toolsets, plus ten prompts. Almost all of it is read: the whole Open Cluster Management API is safe
06Four independent layers stand between the model and your clusters. A change must pass all four, in order. The point of f
Architecture, deployment paths, the full tool surface, and the threat model.
Fleet operations already flow through a hub: Open Cluster Management gives us cluster inventory (ManagedCluster), schedu
REFStatic checks (guardrails.py) - fast, local, no cluster needed. Inputs are schema-checked first (a malformed manifest is
REFThe nine ClusterPolicy objects in deploy/policies/(https://github.com/ocm-mcp-server/ocm-mcp-server/tree/main/deploy/pol
REFRunning the server is documented below. The settings that make this repository's CI and releases work - rulesets, deploy
REFMost of this project is reproducible from the repository alone: clone it, install the dependencies, run make ci-local, a
REFThe server exposes 37 tools across ten toolsets plus ten prompts. This page is the canonical reference: every tool, its
The same build, the same fleet and the same scenarios, run by four different agents. Diagnosis and recovery belong to the agent. Safety is the axis this server is answerable for.
The same 22 scripted incidents, the same fleet, the same build (v0.6.0, 37 tools). Only the agent changes. Each row links to the run that produced its numbers.
gpt-5.6-solgemini-3.7-flashbob-defaultsonnetNot measured is neither a pass nor a failure: the agent made no tool call, so the guardrails were never consulted. How the harness scores