kubernetools MCP Server

oficial

Ajude agentes de IA a escrever manifests Kubernetes precisos e atualizados, fornecendo a referência oficial da API Kubernetes, para que possam consultar tipos, campos e tipos aninhados com especificações atuais nas três versões anteriores e na mais recente do Kubernetes.

Documentação

kubernetools/mcp-server

Imagem de contêiner para o servidor MCP kubernetools.

Registro: ghcr.io/kubernetools/mcp-server

Início rápido

Modo anônimo (uso local)

Nenhuma autenticação necessária; todas as conexões são limitadas por taxa por IP de origem no limite do nível gratuito.

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:latest

Com autenticação por chave de API

# 1. Create a key store file
echo '[{"key":"mykey","tier":"free"}]' > keys.json

# 2. Start the server
podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

Configuração

ParâmetroVariável de ambienteDescrição
Versões do KubernetesK8S_VERSIONSLista separada por vírgulas de versões para pré-carregar (ex.: v1.33,v1.34). O padrão é v1.33.
Token do GitHubGITHUB_TOKENToken de acesso pessoal (sem escopos extras necessários). Opcional; aumenta o limite de taxa da API do GitHub de 60 para 5.000 req/h — recomendado ao carregar várias versões.
Armazenamento de chavesKEY_STORE_PATHCaminho para o arquivo JSON de chaves de API (monte-o no contêiner). Quando omitido, o servidor executa em modo anônimo: nenhuma autenticação é necessária e todas as conexões são limitadas por taxa por IP de origem no limite do nível gratuito.
Hosts permitidosALLOWED_HOSTSValores de cabeçalho Host separados por vírgulas para aceitar (ex.: mcp.example.com,mcp.example.com:443). Quando omitido, a validação de host é desabilitada — adequado apenas para desenvolvimento local. Sempre defina isso em produção para prevenir ataques de rebinding de DNS.
Redirecionamento do navegadorBROWSER_REDIRECT_URLURL para redirecionar requisições GET simples do navegador. Clientes MCP são detectados por Accept: text/event-stream; navegadores recebem 307 para esta URL em vez disso. Quando omitido, GETs do navegador retornam 400.
Nível de logRUST_LOGFiltro de nível de log (ex.: info, debug, mcp=debug).
Porta--publishO servidor escuta na porta 3000.

Autenticação

Armazenamento de chaves de API

O armazenamento de chaves é um array JSON simples carregado uma vez na inicialização:

[
  { "key": "free-key-abc", "tier": "free" },
  { "key": "paid-key-xyz", "tier": "paid" }
]

Toda requisição deve incluir a chave no cabeçalho Authorization:

Authorization: Bearer free-key-abc

Requisições sem uma chave válida recebem 401 Unauthorized.

Modo anônimo

Quando KEY_STORE_PATH não está definido, o servidor executa sem autenticação. Todas as conexões são aceitas e limitadas por taxa por IP de origem no limite do nível gratuito. Conveniente para uso local; não exponha publicamente.

Níveis e limites de taxa

NívelLimite
free10 requisições / minuto, rajada 10
paid~1.000 requisições / segundo, rajada 1.000 (efetivamente ilimitado)

Requisições que excedem o limite recebem 429 Too Many Requests. Os limites são rastreados por chave de API, não por IP.

Conectando um cliente MCP

O servidor implementa o Transporte HTTP Transmissível MCP. O endpoint é:

http://<host>:<port>/[?version=<k8s-version>]

O parâmetro de consulta version seleciona qual versão do Kubernetes usar para a sessão. Se omitido, a primeira versão carregada é usada. Uma versão desconhecida retorna 400 Bad Request.

Claude Desktop

Adicione o seguinte ao claude_desktop_config.json:

{
  "mcpServers": {
    "kubernetools": {
      "url": "http://localhost:3000/?version=v1.36",
      "headers": {
        "Authorization": "Bearer mykey"
      }
    }
  }
}

Ferramentas disponíveis

list_resources

Descoberta leve — retorna uma entrada por recurso, ordenada por (group, kind, api_version). Use isso primeiro para encontrar nomes de tipos.

Filtros opcionais: group (ex.: "apps", "core"), api_version (ex.: "v1").

get_resource

Detalhe completo do recurso — campos, spec, status e campos de lista — suficiente para escrever um manifesto em uma chamada. Obrigatório: kind. Opcional: group, api_version (padrão para o mais recente).

Campos com um type_ref não nulo e sub_fields vazio devem ser aprofundados com get_type.

get_type

Aprofunde em um único tipo composto referenciado via type_ref na saída de get_resource. Obrigatório: type_name (ex.: "Container", "PodFailurePolicy").

Fluxo de consulta típico

list_resources                          → discover kind names and groups
  └─ get_resource(kind="Deployment")   → see all top-level fields + spec/status
       └─ get_type(type_name="...")    → drill into any complex type_ref

Verificação de saúde

GET /healthz na porta 3000.

  • Retorna 503 Service Unavailable (corpo: loading) enquanto a documentação da API do Kubernetes está carregando.
  • Retorna 200 OK (corpo: ok) assim que o servidor estiver pronto.

Este endpoint ignora autenticação e limitação de taxa.

Use-o para sondas de inicialização, prontidão e vivacidade:

startupProbe:
  httpGet:
    path: /healthz
    port: 3000
  failureThreshold: 30   # allow up to 5 min for version loading
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /healthz
    port: 3000
livenessProbe:
  httpGet:
    path: /healthz
    port: 3000
  initialDelaySeconds: 10

Respostas de erro

Status HTTPCausa
307 Temporary RedirectGET do navegador quando BROWSER_REDIRECT_URL está definido
400 Bad RequestGET do navegador quando BROWSER_REDIRECT_URL não está definido, ou o parâmetro version nomeia uma versão não carregada na inicialização
401 UnauthorizedCabeçalho Authorization: Bearer <key> ausente ou inválido
429 Too Many RequestsLimite de taxa excedido para o nível da chave

Erros de nível MCP (nome de ferramenta desconhecido, argumento obrigatório ausente, tipo não encontrado) são retornados como conteúdo de erro MCP dentro de uma resposta 200 normal.

Exemplos

Múltiplas versões do Kubernetes

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.33,v1.34,v1.35,v1.36 \
  -e GITHUB_TOKEN=ghp_... \
  -e KEY_STORE_PATH=/keys.json \
  ghcr.io/kubernetools/mcp-server:latest

Configuração de produção com validação de host

podman run -d \
  -p 3000:3000 \
  -v "$(pwd)/keys.json:/keys.json:ro" \
  -e K8S_VERSIONS=v1.36 \
  -e KEY_STORE_PATH=/keys.json \
  -e ALLOWED_HOSTS=mcp.example.com,mcp.example.com:443 \
  -e BROWSER_REDIRECT_URL=https://example.com/docs \
  ghcr.io/kubernetools/mcp-server:latest

Log de depuração

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  -e RUST_LOG=debug \
  ghcr.io/kubernetools/mcp-server:latest

Fixar em uma versão específica

podman run -d \
  -p 3000:3000 \
  -e K8S_VERSIONS=v1.33 \
  ghcr.io/kubernetools/mcp-server:0.1.0

Imagem

Construída sobre registry.access.redhat.com/hi/core-runtime:2.42-openssl — um runtime mínimo, distroless glibc + OpenSSL. Sem shell ou gerenciador de pacotes.