The next operator to deploy on your platform will never open your dashboard. It will read your API schema, submit desired state, watch status conditions, and decide on its own whether the rollout worked. In November 2025, the CNCF announced Crossplane's graduation — 100-plus releases, a governance tier shared with Kubernetes and Prometheus — and Upbound now pitches its platform as one API for people, software, and AI agents alike. The 2026 case for Crossplane-style infrastructure goes further: composable, declarative, API-first infrastructure is not just good platform engineering, it is the precondition for agents operating infrastructure reliably, because an agent needs a stable, introspectable interface to reason about, not a console built for human eyes.
Here is the bottom line up front, with the evidence below: an agent that deploys needs exactly five things from an API — an introspectable schema, a desired-state object it can submit, status conditions it can read back, a watch stream so it is not polling blind, and idempotent apply so retries are safe. A Crossplane composite resource supplies all five. So does a purpose-built deploy API with apps, deploys, and services behind it. Composition earns its abstraction cost when one developer intent fans out to many infrastructure primitives; for a git-push web service, it is usually overhead. The agent does not care which one you built. It cares that the contract is declarative, typed, and honest about status.
The answer in one table
Before the mechanics, here is the whole argument compressed. The left column is the five-step loop every deploying agent runs. The other two columns show how each step is served by a Crossplane composite resource (XR) versus a purpose-built deploy API (Render-compatible REST, optionally exposed to agents over MCP).
| Agent loop step | Needs from the API | Crossplane XR | Purpose-built deploy API |
|---|---|---|---|
| 1. Discover what it can create | Machine-readable schema | XRD published as a CRD; kubectl explain works | OpenAPI spec; typed SDK / MCP tool schemas |
| 2. Submit desired state | Idempotent apply of a typed object | kubectl apply a namespaced XR; same YAML twice converges once | POST /apps then POST /deploys; idempotency keys / natural keys |
| 3. Watch progress | Status stream, not blind polling | status.conditions on the XR + standard K8s watch | Deploy status field + events / websocket / pollable endpoint |
| 4. Diff actual vs desired | Separate spec and status, per-resource health | Composition surfaces each composed resource's readiness | Deploy timeline: build, push, release, live, each with its own state |
| 5. Retry or roll back | Safe re-apply; previous revision addressable | Re-apply XR or revert the GitOps source; controllers reconcile | Re-submit, or pin the previous deploy / image as the new desired state |
Both columns fill every row. That is the uncomfortable truth for either camp: the agent's needs are a contract shape, not a specific technology. The rest of this post justifies each cell, then gives you the decision rule for which column to build.
What Crossplane actually hands an agent
Crossplane turns a Kubernetes cluster into a universal control plane: providers expose databases, networks, IAM, even SaaS products as Kubernetes objects called managed resources, and platform teams compose those primitives into opinionated platform APIs. The vocabulary matters because it is exactly the vocabulary an agent would operate:
- CompositeResourceDefinition (XRD) — defines a new API type: its schema, in the same way a CRD defines any Kubernetes type.
- Composition — the template that renders one composite object into N concrete resources (a Deployment, a managed database, firewall rules, a DNS record).
- Composite resource (XR) — one instance of the platform API: what the developer, or the agent, actually creates.
- Claim — the v1-era namespaced wrapper around a cluster-scoped XR. Crossplane v2 removed claims entirely: XRs are namespaced directly (
scope: Namespaced,apiextensions.crossplane.io/v2), which deletes a whole layer of claim-to-XR bookkeeping an agent previously had to understand.
A typical agent-facing interaction in v2 looks like this: the agent writes one small object.
apiVersion: platform.example.com/v1alpha1
kind: WebService
metadata:
name: checkout
namespace: team-a
spec:
image: registry.example.com/checkout:v2.4.1
replicas: 3
database: trueCrossplane's composition engine renders that into a Deployment, a Service, a managed Postgres instance from the cloud provider, and the network policy wiring them together — then its controllers reconcile continuously, so drift between the declared XR and the real world gets corrected without anyone re-running a pipeline. Composition logic itself can be plain YAML patch-and-transform or composition functions written in Python, Go, KCL, or CUE over WASM or gRPC.
Adoption is past the experiment stage. CNCF announced graduation on November 6, 2025, citing maturity and broad production use; Upbound reports 100 million-plus downloads and more than 1,000 organizations running Crossplane in production, with Nike, Autodesk, SAP, IBM, and NASA's Science Cloud among the named users. Version 2.3 landed in May 2026 with a high-fidelity render engine and provider deletion protection, and v2.4 is in release candidates. This is the substrate the "API-first for agents" argument is built on — and it is genuinely agent-legible: typed schemas, declarative objects, status conditions, watch semantics, all inherited from the Kubernetes API machinery.
The agent deploy loop, in detail
Strip away the branding and every agent that ships software runs the same five steps. Each step implies a hard API requirement, and these requirements are the real spec — whatever serves them serves the agent.
1. Discover. The agent must learn what it is allowed to create without reading your docs site. That means a machine-readable schema: a CRD the agent can introspect, an OpenAPI document, or MCP tool definitions with typed parameters. A wiki page is not discoverable. kubectl explain webservice is. So is an OpenAPI POST /deploys schema.
2. Submit. The agent declares what it wants, once, as data. The critical property is idempotency: submitting the same desired state twice must converge, not duplicate. Kubernetes apply semantics give this to Crossplane for free. A REST deploy API has to design for it — natural keys, idempotency headers, or upsert-by-name — but it is a solved problem, not a reason to adopt a new system.
3. Watch. After submitting, the agent needs progress without hammering your API. Kubernetes gives Crossplane watch streams and status.conditions (Ready, Synced) essentially for free. A deploy API needs the equivalent: a deploy object whose status moves through building, pushing, releasing, live, exposed over events, websockets, or at minimum a cheap pollable endpoint. "Re-poll the whole app every 5 seconds and infer state" is how you get an agent that either misses the failure window or DDoSes your control plane.
4. Diff. When something is wrong, the agent must compare desired against actual per component. Crossplane compositions surface each composed resource's readiness on the XR's status, so the agent can see "app is live, database never became ready" rather than one opaque red light. A good deploy API does the same with a deploy timeline where build, push, and release each carry their own state and logs pointer. The failure mode to avoid is a single boolean: healthy: false with no decomposition is where agents start guessing.
5. Retry or roll back. The agent's recovery move must itself be a declarative act: re-apply the same object, or declare the previous revision as desired state again. GitOps-backed XRs get this by reverting the source; controllers do the rest. A deploy API gets it by keeping every deploy addressable so "make deploy N-1 current again" is one call. What breaks agents here is irreversible imperative steps — a migration endpoint that cannot run twice, a promote call with no inverse.
Notice what is absent from this list: at no point does the agent need to know that a Composition rendered twelve resources, or that a build ran on a specific node. It needs the contract shape — schema, submit, status, stream, safe retry — and either architecture can provide it.
Head-to-head: the same deploy, two APIs
Take the concrete case both sides must serve: ship checkout:v2.4.1 with 3 replicas. As a Crossplane XR, the agent applies one YAML object (the WebService above) and watches status.conditions until Ready=True. As purpose-built deploy-API calls, the agent does roughly this:
POST /v1/apps/checkout/deploys {"image": "registry.example.com/checkout:v2.4.1"}
-> 202 Accepted {"id": "dep_9f3", "status": "building"}
GET /v1/deploys/dep_9f3 (or subscribe to deploy events)
-> {"status": "live", "steps": {"build": "ok", "push": "ok", "release": "ok"}}For this workload — one app, one image, one environment — count the moving parts each approach requires the platform team to build and the agent to understand. The XR path needs an XRD, a Composition, installed providers, and a cluster the agent can reach with RBAC scoped to a namespace. The deploy-API path needs two endpoints, a status model, and credentials. Both give the agent identical loop behavior: typed submit, watchable status, re-submittable recovery. The XR's extra machinery buys nothing here, because one developer intent maps to one lifecycle with no fan-out and no cross-team policy in the middle.
Now change the workload: the same deploy, but the platform must also provision a Postgres database with a rotated password, a private network segment, an IAM role with least-privilege storage access, and a DNS record — each owned by a different team, each with policy constraints, all of which must exist before the app goes live and all of which must be torn down together. The purpose-built API now needs five new resource types, ordering logic, rollback across partial failure, and per-team policy hooks — it is slowly reinventing composition, badly. The XR path expresses it as one more Composition: same single object for the agent, same status conditions, with ordering, ownership, and cascading delete handled by the framework. This is where composition earns its weight: one intent, many primitives, policy in the middle.
The decision rule follows directly:
- Build Crossplane-style composition when one developer intent routinely fans out to primitives across providers, teams, or lifecycles — data plus network plus identity plus app — and you need shared ordering, policy injection, and teardown semantics across all of them.
- Build (or keep) a purpose-built deploy API when developer intent maps one-to-one onto an app lifecycle — git push in, running HTTPS service out — and the fan-out behind it is the platform's private business, not something every consumer must model.
And the minimum agent-ready checklist applies to whichever you pick: machine-readable schema, desired-state objects with status separated from spec, idempotent submit, a watch or event stream, per-component health in status, addressable revisions for rollback, and credentials scoped for a non-human operator. Miss any one and agents will work around you with screen-scraping and prayer.
One more 2026 development cuts across both columns: MCP servers are becoming the presentation layer agents actually touch. Red Hat ships a Go MCP server that talks directly to the Kubernetes API rather than wrapping kubectl; SUSE wired MCP into Rancher Prime and its Linux fleet manager at SUSECON 2026; Google launched managed MCP servers for GKE, Compute Engine, BigQuery, and Maps in December 2025, days after MCP itself moved to the Linux Foundation's Agentic AI Foundation; and PaaS vendors like Sevalla expose their deploy APIs to coding agents over MCP directly.
MCP standardizes how the agent calls you. It does not fix an API whose status model is a single boolean — the substrate underneath still has to be declarative and introspectable, which is exactly the Crossplane argument, and it applies equally to the deploy API you already have.
The agent grades your API, not your architecture
Crossplane's graduation marks the moment composable control planes grew up: namespaced XRs, functions in real languages, a thousand organizations in production. CNCF's 2026 argument is right that agents need API-first infrastructure — stable, typed, declarative interfaces instead of consoles and scripts. Where the argument needs a qualifier is the word composable: composition is the right answer when intents fan out, and expensive ceremony when they don't. An agent deploying a web service cannot tell whether a Ready=True condition was set by a composition engine reconciling twelve resources or by a deploy controller that watched one rollout — and it should never have to.
So audit your own surface against the five-step loop before adopting anything: can an agent discover the schema, submit idempotently, watch without polling blind, diff per component, and roll back declaratively? If yes, you already have the API-first infrastructure the 2026 pitch describes, whatever it is built on. If no, fix the contract first — no composition framework, and no MCP wrapper, will supply a status model you never designed.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, behind a Render-compatible API that agents can drive as a first-class operator. Star the repo on GitHub or deploy your first app today.



