crossplane-mcp-server

Um servidor de Model Context Protocol que permite que assistentes de IA entendam um plano de controle Crossplane.

Documentação

crossplane-mcp-server

CI Release CodeQL GitHub release golangci-lint Go version Crossplane Downloads License

Um servidor Model Context Protocol que permite que assistentes de IA entendam um plano de controle Crossplane.

Pergunte ao seu assistente "quantos recursos gerenciados eu tenho e há algo quebrado?" e ele responderá com base no seu plano de controle real, com o motivo de cada falha, em vez de adivinhar.

> Why is the app-db claim not ready?

  crossplane_diagnose(kind="PostgreSQLInstance", name="app-db")

  PostgreSQLInstance app-db is NOT READY.

  Verdict: Instance/app-db-rds is the deepest failure: InvalidParameterValue:
  the instance class db.t2.mega does not exist

  Root causes (deepest failing resources):
  KIND       NAME          READY   SYNCED   REASON          DETAIL
  Instance   app-db-rds    False   False    ApplyFailure    InvalidParameterValue...

  Control plane checks:
  CHECK         STATE   DETAIL
  composition   OK      Composition "postgres-aws" exists.
  providers     OK      all 3 provider(s) are Installed and Healthy

  Fix the instanceClass field in your Composition and the claim will reconcile.

Toda ferramenta é somente leitura. Este servidor não pode criar, atualizar ou excluir nada no seu plano de controle.

Conteúdo

Por que não um servidor MCP Kubernetes genérico?

Um servidor MCP Kubernetes de propósito geral já pode acessar todos os objetos em um plano de controle Crossplane: os recursos Crossplane são recursos Kubernetes, e um resources_list genérico com um apiVersion e um kind retornará seus XRDs sem problemas. O acesso nunca foi o problema.

O problema é que ele não sabe o que tudo isso significa, e ele excluirá alegremente qualquer coisa.

Kubernetes MCP genéricoEste servidor
Acessar CRDs do CrossplaneSimSim
Seguir uma claim até a infraestrutura que ela criouNão. Ele retorna objetos; o modelo precisa adivinhar qual campo seguir em cada etapacrossplane_resource_tree percorre resourceRefs para você
Dizer qual recurso é realmente o culpadoNãocrossplane_diagnose encontra a falha mais profunda, não o sintoma no topo
Notar que a infraestrutura mudou fora do CrossplaneNão. Ele pode retornar spec e status, mas não tem ideia de que eles devem correspondercrossplane_drift_detect compara o desejado com o observado
Explicar por que uma exclusão está travadaNãocrossplane_deleting_resources identifica o Usage, finalizer ou provider que a está segurando
Dizer o que uma exclusão destruiria primeiroNãocrossplane_impact relata o raio de impacto antes de você agir
Simular uma alteração sem tocar no clusterNãocrossplane_composition_render executa o pipeline de funções offline
Escrever no seu clusterSim: criar, atualizar, excluir, execNunca. Não existe caminho de código que mute qualquer coisa

Essa última linha importa mais aqui do que no trabalho Kubernetes comum. Em um plano de controle Crossplane, um objeto excluído não é um pod que um ReplicaSet recriará; é um banco de dados de produção. Uma superfície de ferramentas que não pode mutar é algo que você pode apontar para o seu plano de controle de produção sem uma revisão de alterações.

Por baixo, o conhecimento Crossplane que este servidor codifica é:

  • Ele descobre recursos pela categoria Crossplane (managed, composite, claim), então funciona com todos os providers sem precisar ser ensinado sobre nenhum deles.
  • Ele lê Ready/Synced em recursos e Installed/Healthy em pacotes, e explica a diferença para o modelo.
  • Ele percorre resourceRefs para construir a árvore de composição, a mesma visão do crossplane beta trace.
  • Ele sabe que drift em um recurso pausado ou somente Observe nunca é corrigido, o que é a diferença entre um aviso e um não-evento.
  • Ele suporta os layouts Crossplane v1 e v2, incluindo recursos compostos com namespace e o local de referência spec.crossplane.

Início rápido

go install github.com/ravibagri5/crossplane-mcp-server/cmd/crossplane-mcp-server@latest

# See what this build exposes
crossplane-mcp-server tools

# Check it can reach your control plane
crossplane-mcp-server call crossplane_status

Depois, adicione-o ao seu cliente MCP (veja Configuração do cliente) e pergunte sobre o seu plano de controle.

Instalação

Requisitos

  • Go 1.26 ou mais recente, se você instalar a partir do código-fonte ou com go install. Os binários pré-compilados e a imagem de contêiner não têm esse requisito.
  • Acesso a um cluster Kubernetes com Crossplane instalado. Qualquer versão do Crossplane v1 ou v2 funciona.
  • Opcional: o CLI do crossplane e um runtime de contêiner, usados apenas pelo crossplane_composition_render. A renderização executa o pipeline de funções de composição, o que não pode ser feito pela API Kubernetes. Toda outra ferramenta precisa apenas de acesso à API, e o crossplane_composition_validate cobre grande parte do mesmo terreno sem um runtime de contêiner.

Instalação com Go

go install github.com/ravibagri5/crossplane-mcp-server/cmd/crossplane-mcp-server@latest

Imagem de contêiner

docker run --rm -i \
  -v "${HOME}/.kube:/home/nonroot/.kube:ro" \
  ghcr.io/ravibagri5/crossplane-mcp-server:latest

Binários

Binários pré-compilados para Linux, macOS e Windows estão anexados a cada release. Eles são a opção mais fácil se você não tiver um toolchain Go recente.

A partir do código-fonte

git clone https://github.com/ravibagri5/crossplane-mcp-server.git
cd crossplane-mcp-server
make build
./bin/crossplane-mcp-server tools

Registros

Este servidor está listado em:

  • Registro MCP Oficial como io.github.ravibagri5/crossplane-mcp-server, que é onde os clientes MCP o procuram.
  • Smithery, que também oferece instalação com um clique em um cliente.
  • pkg.go.dev para a documentação do pacote Go.

Configuração do cliente

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 e HOME importam sempre que um contexto de kubeconfig autentica por meio de um plugin exec, como kubelogin ou aws. Aplicativos de desktop iniciam servidores com um ambiente quase vazio, então sem eles o plugin não é encontrado ou não consegue ler seu cache de tokens.

Goose

No ~/.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: 300

VS Code

Adicione ao .vscode/mcp.json no seu workspace:

{
  "servers": {
    "crossplane": {
      "type": "stdio",
      "command": "crossplane-mcp-server",
      "args": ["--clusters", "staging,production"]
    }
  }
}

Clientes baseados em contêiner

{
  "mcpServers": {
    "crossplane": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "${HOME}/.kube:/home/nonroot/.kube:ro",
        "ghcr.io/ravibagri5/crossplane-mcp-server:latest"
      ]
    }
  }
}

Ferramentas

Execute crossplane-mcp-server tools para imprimir esta lista a partir do seu build.

resources

Recursos gerenciados, recursos compostos e claims.

FerramentaO que ela responde
crossplane_managed_resources_summaryQuantos recursos gerenciados existem, por tipo, e quantos estão Ready e Synced
crossplane_managed_resources_listQuais recursos gerenciados existem, opcionalmente apenas os com falha
crossplane_composite_resources_listQuais recursos compostos (XRs) existem e qual Composition cada um selecionou
crossplane_claims_listQuais claims existem e a qual composto cada uma está vinculada
crossplane_resource_getTudo sobre um recurso: condições, nome externo, eventos, manifesto
crossplane_resource_treeA árvore de composição abaixo de uma claim ou composto, com status por recurso
crossplane_resource_eventsOs eventos que o Crossplane registrou contra um recurso
crossplane_diagnosePor que um recurso não está Ready e qual recurso é realmente o culpado
crossplane_drift_detectQual infraestrutura não corresponde mais ao seu spec declarado e se isso será corrigido

packages

FerramentaO que ela responde
crossplane_providers_listQuais providers estão instalados e saudáveis
crossplane_functions_listQuais funções de composição estão instaladas e saudáveis
crossplane_configurations_listQuais configurations estão instaladas e saudáveis
crossplane_package_getUm pacote mais suas revisões, onde erros de pull de imagem e dependências aparecem

compositions

FerramentaO que ela responde
crossplane_xrds_listQuais APIs de plataforma este plano de controle oferece
crossplane_xrd_schemaOs campos que uma API de plataforma aceita, com um manifesto de exemplo pronto para editar
crossplane_compositions_listQuais Compositions existem e qual pipeline elas executam
crossplane_composition_getA definição completa de uma Composition
crossplane_composition_validatePor que uma Composition não funciona, sem executar nada
crossplane_composition_renderO que uma Composition realmente criaria, como um dry run

config

Como o próprio plano de controle está configurado.

FerramentaO que ela responde
crossplane_environment_configs_listQuais EnvironmentConfigs existem e quais dados eles contêm
crossplane_deployment_runtime_configs_listQuais configs de runtime existem e quais pacotes os usam
crossplane_managed_resource_definitions_listQuais tipos de recursos gerenciados estão Active, no Crossplane v2
crossplane_managed_resource_activation_policies_listQuais políticas ativam essas definições

diagnostics

FerramentaO que ela responde
crossplane_clusters_listQuais planos de controle este servidor pode alcançar
crossplane_statusA saúde geral do plano de controle em uma única chamada
crossplane_unhealthy_resourcesTudo que está falhando atualmente e por quê
crossplane_deleting_resourcesO que está travado na exclusão e o que o está segurando
crossplane_usages_listO que está protegido contra exclusão e o que precisa disso
crossplane_impactO que uma exclusão destruiria e se ela seria bloqueada
crossplane_api_resourcesA superfície da API Crossplane, para encontrar tipos e grupos exatos

Exponha um subconjunto com --toolsets:

crossplane-mcp-server --toolsets diagnostics,packages

Prompts

Ferramentas dizem a um modelo o que ele pode fazer. Prompts dizem a ele a ordem em que um operador experiente faria as coisas, para que ele não precise redescobrir a cada conversa que diagnosticar uma claim começa na claim e não no recurso gerenciado que parece mais irritado.

A maioria dos clientes exibe esses como comandos de barra ou um seletor de prompts.

PromptO que ele faz
diagnose_resourcePercorre um recurso com falha até o erro do provider e propõe a correção
control_plane_reviewProduz um relatório de saúde ordenado pelo que precisa de atenção primeiro
explain_platform_apiExplica o que uma API de plataforma oferece e como solicitar uma
assess_deletionCalcula o raio de impacto de uma exclusão antes que alguém a execute

Chamando uma ferramenta diretamente

call executa uma ferramenta e imprime o que ela retorna, sem um cliente MCP no caminho. Use-o para verificar se o servidor consegue alcançar seu cluster e para ver o que uma ferramenta realmente retorna, em vez do que um modelo diz que ela retornou.

# No arguments
crossplane-mcp-server call crossplane_status

# Arguments are the same JSON an MCP client would send
crossplane-mcp-server call crossplane_managed_resources_list '{"status":"not-ready"}'
crossplane-mcp-server call crossplane_diagnose '{"kind":"Bucket","name":"app-data"}'

# The structured payload the model receives, instead of the text rendering
crossplane-mcp-server call crossplane_status --json

# Against another control plane
crossplane-mcp-server call crossplane_status --context prod

Execute crossplane-mcp-server tools --json para ver os argumentos exatos que uma ferramenta aceita.

Configuração

FlagPadrãoDescrição
--kubeconfig$KUBECONFIG, depois ~/.kube/config, depois in-clusterCaminho para um arquivo kubeconfig
--contextcontexto atualContexto do kubeconfig usado quando uma ferramenta não nomeia um cluster
--clusterstodos os contextosContextos separados por vírgula para expor como alvos
--namespacenamespace do contexto, senão defaultNamespace padrão para recursos com namespace
--toolsetstodosConjuntos de ferramentas separados por vírgula para expor
--http-address(não definido)Servir HTTP streamable neste endereço em vez de stdio
--log-levelinfodebug, info, warn ou error. Os logs sempre vão para stderr
--tool-timeout2mTempo máximo que uma única chamada de ferramenta pode executar. 0 desativa
--versionImprime a versão e sai

Múltiplos planos de controle

Um servidor pode conversar com vários planos de controle. Toda ferramenta aceita um argumento opcional cluster nomeando um deles, e crossplane_clusters_list informa a um modelo quais estão disponíveis.

crossplane-mcp-server --clusters staging,production --context staging

Pergunte ao seu assistente "há algo falhando em produção?" e ele passará cluster: "production"; omita o cluster e ele usará --context.

Use --clusters. Sem ele, todo contexto no seu kubeconfig se torna um alvo, o que em uma máquina com algumas centenas de contextos significa que um assistente poderia alcançar um cluster de produção quando você queria um sandbox. Nomear os poucos com os quais você trabalha é mais rápido e mais seguro.

Os clientes são criados de forma preguiçosa e armazenados em cache, então um cluster inacessível não impede os outros de funcionar, e listar clusters não custa nada.

Credenciais

FonteComo funciona
Contexto do kubeconfigUsado como está, incluindo contextos que autenticam por meio de um plugin exec
Identidade na nuvem (AKS, EKS, GKE)Funciona por meio do plugin exec que o kubeconfig já declara, como kubelogin ou aws
Conta de serviçoUsada automaticamente quando não há kubeconfig, que é o caso da implantação no cluster

Plugins exec são executáveis comuns, então um servidor iniciado por um aplicativo de desktop precisa de PATH para incluí-los, e HOME para que eles possam encontrar seu próprio cache de tokens. A maioria dos clientes MCP inicia servidores com um ambiente quase vazio, que é o motivo usual de um cluster funcionar em um terminal, mas não no cliente:

{
  "command": "crossplane-mcp-server",
  "args": ["--clusters", "staging,production"],
  "env": {
    "PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin",
    "HOME": "/Users/you"
  }
}

Executando em um cluster

Sirva o transporte HTTP streamable quando o servidor for executado dentro do plano de controle que ele inspeciona:

crossplane-mcp-server --http-address :8080

O endpoint MCP é /mcp e um endpoint de liveness é servido em /healthz. O servidor usa a conta de serviço do pod quando não há kubeconfig presente. Os manifestos estão em deploy/.

O transporte HTTP não tem autenticação integrada. Coloque-o atrás de um proxy autenticador, ou mantenha-o em uma rede privada. Consulte SECURITY.md.

RBAC necessário

O servidor apenas lê. Uma função de cluster que cobre todas as ferramentas:

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"]

Se você preferir não conceder uma leitura em todo o cluster, deploy/rbac-minimal.yaml restringe as permissões ao custo de algumas ferramentas retornarem avisos.

Contribuindo

Contribuições são muito bem-vindas. Comece com CONTRIBUTING.md, que cobre o fluxo de trabalho de desenvolvimento, como adicionar uma ferramenta e o requisito de assinatura. Boas primeiras issues são rotuladas good first issue.

Este projeto segue o Código de Conduta do Crossplane e é governado conforme descrito em GOVERNANCE.md.

Segurança

Por favor, relate vulnerabilidades de forma privada. Consulte SECURITY.md.

Licença

Apache License 2.0. Consulte LICENSE.

crossplane-mcp-server é um projeto da comunidade e não é um projeto oficial do Crossplane ou da CNCF. Crossplane é uma marca registrada da The Linux Foundation.