crossplane-mcp-server
Provides read-only tools for inspecting a Crossplane control plane running on a Kubernetes cluster, including managed resources, composite resources, claims, packages, compositions, and diagnostics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@crossplane-mcp-serverwhy is my app-db claim not ready? trace the composition tree"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
crossplane-mcp-server
A Model Context Protocol server that lets AI assistants understand a Crossplane control plane.
Ask your assistant "how many managed resources do I have and is anything broken?" and it will answer from your actual control plane, with the reason for every failure, instead of guessing.
> Why is the app-db claim not ready?
crossplane_resource_tree(kind="PostgreSQLInstance", name="app-db")
PostgreSQLInstance/app-db READY=False SYNCED=True
└─ XPostgreSQLInstance/app-db-x7k2p READY=False SYNCED=True
├─ Instance/app-db-rds READY=False SYNCED=False create failed: InvalidParameterValue
└─ SecurityGroup/app-db-sg READY=True SYNCED=True
The RDS Instance app-db-rds is failing. Let me look at its events.
crossplane_resource_events(kind="Instance", name="app-db-rds")
The instance class db.t2.mega does not exist. Fix the instanceClass field in
your Composition and the claim will reconcile.Every tool is read-only. This server cannot create, update or delete anything on your control plane.
Contents
Related MCP server: mcp-devops-server
Why
A general purpose Kubernetes MCP server can list the objects on a Crossplane
control plane, but it does not know what they mean. It cannot tell you that a
Bucket is a managed resource, that Synced=False points at your composition
rather than at AWS, or that a claim's real problem is three levels down the
composition tree.
This server encodes that knowledge:
It discovers resources by Crossplane category (
managed,composite,claim), so it works with every provider without being taught about any of them.It reads
Ready/Syncedon resources andInstalled/Healthyon packages, and explains the difference to the model.It walks
resourceRefsto build the composition tree, the same view ascrossplane beta trace.It supports both Crossplane v1 and v2 layouts, including namespaced composite resources and the
spec.crossplanereference location.
Quick start
go install github.com/ravibagri5/crossplane-mcp-server/cmd/crossplane-mcp-server@latest
# Check it can see your control plane
crossplane-mcp-server toolsThen add it to your MCP client (see Client configuration) and ask it about your control plane.
Installation
Requirements
Go 1.26 or newer, if you install from source or with
go install. The pre-built binaries and the container image have no such requirement.Access to a Kubernetes cluster with Crossplane installed. Any version of Crossplane v1 or v2 works.
Optional: the crossplane CLI and a container runtime, used only by
crossplane_composition_render. Rendering executes the composition function pipeline, which cannot be done through the Kubernetes API. Every other tool needs nothing beyond API access, andcrossplane_composition_validatecovers most of the same ground without a container runtime.
Go install
go install github.com/ravibagri5/crossplane-mcp-server/cmd/crossplane-mcp-server@latestContainer image
docker run --rm -i \
-v "${HOME}/.kube:/home/nonroot/.kube:ro" \
ghcr.io/ravibagri5/crossplane-mcp-server:latestBinaries
Pre-built binaries for Linux, macOS and Windows are attached to every release. These are the easiest option if you do not have a recent Go toolchain.
From source
git clone https://github.com/ravibagri5/crossplane-mcp-server.git
cd crossplane-mcp-server
make build
./bin/crossplane-mcp-server toolsClient configuration
Claude Desktop, Claude Code, Cursor, Windsurf
{
"mcpServers": {
"crossplane": {
"command": "crossplane-mcp-server",
"args": ["--clusters", "staging,production", "--context", "staging"],
"env": {
"PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin",
"HOME": "/Users/you"
}
}
}
}PATH and HOME matter whenever a kubeconfig context authenticates through an
exec plugin such as kubelogin or aws. Desktop applications launch servers
with a near-empty environment, so without them the plugin is either not found
or cannot read its token cache.
Goose
In ~/.config/goose/config.yaml:
extensions:
crossplane:
enabled: true
type: stdio
cmd: /path/to/crossplane-mcp-server
args: ["--clusters", "staging,production", "--context", "staging"]
envs:
PATH: /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
HOME: /Users/you
timeout: 300VS Code
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"crossplane": {
"type": "stdio",
"command": "crossplane-mcp-server",
"args": ["--clusters", "staging,production"]
}
}
}Container based clients
{
"mcpServers": {
"crossplane": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "${HOME}/.kube:/home/nonroot/.kube:ro",
"ghcr.io/ravibagri5/crossplane-mcp-server:latest"
]
}
}
}Tools
Run crossplane-mcp-server tools to print this list from your build.
resources
Managed resources, composite resources and claims.
Tool | What it answers |
| How many managed resources exist, by kind, and how many are Ready and Synced |
| Which managed resources exist, optionally only the failing ones |
| Which composite resources (XRs) exist and which Composition each selected |
| Which claims exist and which composite each is bound to |
| Everything about one resource: conditions, external name, events, manifest |
| The composition tree below a claim or composite, with per-resource status |
| The events Crossplane recorded against one resource |
packages
Tool | What it answers |
| Which providers are installed and healthy |
| Which composition functions are installed and healthy |
| Which configurations are installed and healthy |
| One package plus its revisions, where image pull and dependency errors appear |
compositions
Tool | What it answers |
| Which platform APIs this control plane offers |
| The fields a platform API takes, with a ready-to-edit example manifest |
| Which Compositions exist and what pipeline they run |
| The full definition of one Composition |
| Why a Composition does not work, without running anything |
| What a Composition would actually create, as a dry run |
config
How the control plane itself is configured.
Tool | What it answers |
| Which EnvironmentConfigs exist and what data they hold |
| Which runtime configs exist and which packages use them |
| Which managed resource kinds are Active, on Crossplane v2 |
| Which policies activate those definitions |
diagnostics
Tool | What it answers |
| Which control planes this server can reach |
| The overall health of the control plane in one call |
| Everything that is currently failing, and why |
| What is stuck deleting, and what is holding it up |
| What is protected from deletion, and what needs it |
| The Crossplane API surface, to find exact kinds and groups |
Expose a subset with --toolsets:
crossplane-mcp-server --toolsets diagnostics,packagesConfiguration
Flag | Default | Description |
|
| Path to a kubeconfig file |
| current context | Kubeconfig context used when a tool does not name a cluster |
| every context | Comma separated contexts to expose as targets |
| context namespace, else | Default namespace for namespaced resources |
| all | Comma separated toolsets to expose |
| (unset) | Serve streamable HTTP on this address instead of stdio |
|
|
|
|
| Maximum time a single tool call may run. |
| Print the version and exit |
Multiple control planes
One server can talk to several control planes. Every tool takes an optional
cluster argument naming one of them, and crossplane_clusters_list tells a
model which are available.
crossplane-mcp-server --clusters staging,production --context stagingAsk your assistant "is anything failing in production?" and it passes
cluster: "production"; omit the cluster and it uses--context.
Use --clusters. Without it every context in your kubeconfig becomes a
target, which on a machine with a few hundred contexts means an assistant could
reach a production cluster when you meant a sandbox. Naming the handful you
work with is both faster and safer.
Clients are created lazily and cached, so an unreachable cluster does not stop the others from working, and listing clusters costs nothing.
Credentials
Source | How it works |
Kubeconfig context | Used as-is, including contexts that authenticate through an exec plugin |
Cloud identity (AKS, EKS, GKE) | Works through the exec plugin the kubeconfig already declares, such as |
Service account | Used automatically when there is no kubeconfig, which is the case for the in-cluster deployment |
Exec plugins are ordinary executables, so a server launched by a desktop
application needs PATH to include them, and HOME so they can find their
own token cache. Most MCP clients start servers with a near-empty environment,
which is the usual reason a cluster works in a terminal but not in the client:
{
"command": "crossplane-mcp-server",
"args": ["--clusters", "staging,production"],
"env": {
"PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin",
"HOME": "/Users/you"
}
}Running in a cluster
Serve the streamable HTTP transport when the server runs inside the control plane it inspects:
crossplane-mcp-server --http-address :8080The MCP endpoint is /mcp and a liveness endpoint is served at /healthz. The
server uses the pod's service account when no kubeconfig is present. Manifests
are in deploy/.
The HTTP transport has no built-in authentication. Put it behind an authenticating proxy, or keep it on a private network. See SECURITY.md.
Required RBAC
The server only ever reads. A cluster role that covers every tool:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: crossplane-mcp-server
rules:
# Discovery, so the server can find managed and composite resource kinds.
- apiGroups: ["apiextensions.k8s.io"]
resources: ["customresourcedefinitions"]
verbs: ["get", "list"]
# Everything Crossplane owns.
- apiGroups: ["*.crossplane.io"]
resources: ["*"]
verbs: ["get", "list"]
# Managed resources, which live in provider-specific API groups.
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "list"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list"]If you would rather not grant a cluster-wide read, deploy/rbac-minimal.yaml
narrows the permissions at the cost of some tools returning warnings.
Contributing
Contributions are very welcome. Start with CONTRIBUTING.md,
which covers the development workflow, how to add a tool, and the sign-off
requirement. Good first issues are labelled
good first issue.
This project follows the Crossplane Code of Conduct and is governed as described in GOVERNANCE.md.
Security
Please report vulnerabilities privately. See SECURITY.md.
License
Apache License 2.0. See LICENSE.
crossplane-mcp-server is a community project and is not an official
Crossplane or CNCF project. Crossplane is a registered trademark of The Linux
Foundation.
This server cannot be deployed
Maintenance
Related MCP Connectors
Provides read access to your GKE and Kubernetes resources.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides read-only access to Kubernetes clusters for AI assistants.23MIT
- AlicenseBqualityBmaintenanceEnables AI agents to execute read-only DevOps operations including kubectl, terraform, helm, docker, and AWS cost analysis through natural language.11MIT
- FlicenseAqualityCmaintenanceRead-only MCP server that exposes Kubernetes platform state (tenants, pods, SLOs, ArgoCD applications, chaos schedules, and catalog services) to AI agents, enabling natural language queries about cluster health and configuration.6-
- FlicenseNot gradedqualityCmaintenanceProvides a read-only interface to Kubernetes clusters, enabling LLMs to list pods, get pod status and logs, fetch deployment manifests, and perform pod health analysis with resource trend tracking.-