Kubernetes Server

Un servidor MCP que permite a los asistentes de IA interactuar y gestionar clústeres de Kubernetes.

Documentación

mcp-kubernetes-server

PyPI version License Build Status

El mcp-kubernetes-server es un servidor que implementa el Protocolo de Contexto de Modelos (MCP) para permitir que asistentes de IA (como Claude, Cursor y GitHub Copilot) interactúen con clústeres de Kubernetes. Actúa como un puente, traduciendo solicitudes en lenguaje natural de estos asistentes en operaciones de Kubernetes y devolviendo los resultados.

Permite a los asistentes de IA:

  • Consultar recursos de Kubernetes
  • Ejecutar comandos de kubectl
  • Gestionar clústeres de Kubernetes mediante interacciones en lenguaje natural
  • Diagnosticar e interpretar los estados de los recursos de Kubernetes

Cómo Funciona

El mcp-kubernetes-server actúa como intermediario entre los asistentes de IA (que admiten el Protocolo de Contexto de Modelos) y su clúster de Kubernetes. Recibe solicitudes en lenguaje natural de estos asistentes, las traduce en comandos kubectl o llamadas directas a la API de Kubernetes, y las ejecuta contra el clúster de destino. El servidor luego procesa los resultados y devuelve una respuesta estructurada, lo que permite una interacción fluida con su entorno de Kubernetes a través del asistente de IA.

Cómo Instalar

Requisitos Previos

Antes de instalar mcp-kubernetes-server, asegúrese de tener lo siguiente:

  • Un clúster de Kubernetes funcional.
  • Un archivo kubeconfig configurado correctamente para acceder a su clúster de Kubernetes (el servidor requiere este archivo para la interacción).
  • La herramienta de línea de comandos kubectl instalada y en el PATH de su sistema (utilizada por el servidor para ejecutar muchos comandos de Kubernetes).
  • La herramienta de línea de comandos helm instalada y en el PATH de su sistema (utilizada por el servidor para operaciones con gráficos de Helm).
  • Python >= 3.11, si planea instalar y ejecutar el servidor directamente usando uvx (sin Docker).

Docker

Obtenga su archivo kubeconfig para su clúster de Kubernetes y configúrelo en mcpServers (reemplace la ruta src con la ruta de su kubeconfig):

{
  "mcpServers": {
    "kubernetes": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "--mount", "type=bind,src=/home/username/.kube/config,dst=/home/mcp/.kube/config",
        "ghcr.io/feiskyer/mcp-kubernetes-server"
      ]
    }
  }
}

UVX

Para ejecutar el servidor usando uvx (una herramienta incluida con uv, el empaquetador de Python), primero asegúrese de que uv esté instalado:

Instalar uv

Instale uv si aún no está instalado y agréguelo a su PATH, por ejemplo, usando curl:

# For Linux and MacOS
curl -LsSf https://astral.sh/uv/install.sh | sh
Instalar kubectl

Instale kubectl si aún no está instalado y agréguelo a su PATH, por ejemplo:

# For Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# For MacOS
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
Instalar helm

Instale helm si aún no está instalado y agréguelo a su PATH, por ejemplo:

curl -sSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Configure sus servidores MCP en Claude Desktop, Cursor, ChatGPT Copilot, Github Copilot y otros clientes de IA compatibles, por ejemplo:

{
  "mcpServers": {
    "kubernetes": {
      "command": "uvx",
      "args": [
        "mcp-kubernetes-server"
      ],
      "env": {
        "KUBECONFIG": "<your-kubeconfig-path>"
      }
    }
  }
}

Opciones del Servidor MCP

Variables de Entorno

Variables de entorno:

  • KUBECONFIG: Ruta a su archivo kubeconfig, por ejemplo, /home/<username>/.kube/config.
Argumentos de línea de comandos

Argumentos de línea de comandos:

usage: main.py [-h] [--disable-kubectl] [--disable-helm] [--disable-write]
               [--disable-delete] [--transport {stdio,sse,streamable-http}]
               [--host HOST] [--port PORT]

MCP Kubernetes Server

options:
  -h, --help            show this help message and exit
  --disable-kubectl     Disable kubectl command execution
  --disable-helm        Disable helm command execution
  --disable-write       Disable write operations
  --disable-delete      Disable delete operations
  --transport {stdio,sse,streamable-http}
                        Transport mechanism to use (stdio or sse or streamable-http)
  --host HOST           Host to use for sse or streamable-http server
  --port PORT           Port to use for sse or streamable-http server

Uso

Una vez que el mcp-kubernetes-server esté instalado y configurado en su cliente de IA (usando los fragmentos JSON proporcionados en la sección 'Cómo instalar' para Docker o UVX), puede comenzar a interactuar con su clúster de Kubernetes mediante lenguaje natural. Por ejemplo, puede preguntar:

What is the status of my Kubernetes cluster?

What is wrong with my nginx pod?

Verificando el servidor: Si está ejecutando el servidor con transporte stdio (común para la ejecución directa de uvx), el cliente de IA normalmente iniciará y gestionará el proceso del servidor. Para transportes sse o streamable-http, el servidor se ejecuta de forma independiente. Usted lo habría iniciado manualmente (por ejemplo, uvx mcp-kubernetes-server --transport sse) y debería ver una salida en su terminal indicando que se está ejecutando (por ejemplo, INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)). También puede verificar si hay mensajes de error en la terminal del servidor si el cliente de IA no logra conectarse.

Herramientas Disponibles

El mcp-kubernetes-server proporciona un conjunto completo de herramientas para interactuar con clústeres de Kubernetes, categorizadas por tipo de operación:

Herramientas de Comando

Herramientas de Comando

Estas herramientas proporcionan capacidades generales de ejecución de comandos:

HerramientaDescripciónParámetros
kubectlEjecutar cualquier comando de kubectl y devolver la salidacommand (cadena)
helmEjecutar cualquier comando de helm y devolver la salidacommand (cadena)
Herramientas de Lectura

Herramientas de Lectura

Estas herramientas proporcionan acceso de solo lectura a los recursos de Kubernetes:

HerramientaDescripciónParámetros
k8s_getObtener cualquier objeto de Kubernetes (o lista) como cadena JSONresource (cadena), name (cadena), namespace (cadena)
k8s_describeMostrar información detallada sobre un recurso específico o grupo de recursosresource_type (cadena), name (cadena, opcional), namespace (cadena, opcional), selector (cadena, opcional), all_namespaces (booleano, opcional)
k8s_logsImprimir los registros de un contenedor en un podpod_name (cadena), container (cadena, opcional), namespace (cadena, opcional), tail (entero, opcional), previous (booleano, opcional), since (cadena, opcional), timestamps (booleano, opcional), follow (booleano, opcional)
k8s_eventsListar eventos en el clústernamespace (cadena, opcional), all_namespaces (booleano, opcional), field_selector (cadena, opcional), resource_type (cadena, opcional), resource_name (cadena, opcional), sort_by (cadena, opcional), watch (booleano, opcional)
k8s_apisListar todas las API disponibles en el clúster de Kubernetesninguno
k8s_crdsListar todas las Definiciones de Recursos Personalizados (CRDs) en el clúster de Kubernetesninguno
k8s_top_nodesMostrar el uso de recursos (CPU/memoria) de los nodossort_by (cadena, opcional)
k8s_top_podsMostrar el uso de recursos (CPU/memoria) de los podsnamespace (cadena, opcional), all_namespaces (booleano, opcional), sort_by (cadena, opcional), selector (cadena, opcional)
k8s_rollout_statusObtener el estado de un despliegue para un deployment, daemonset o statefulsetresource_type (cadena), name (cadena), namespace (cadena, opcional)
k8s_rollout_historyObtener el historial de despliegues para un deployment, daemonset o statefulsetresource_type (cadena), name (cadena), namespace (cadena, opcional), revision (cadena, opcional)
k8s_auth_can_iVerificar si una acción está permitidaverb (cadena), resource (cadena), subresource (cadena, opcional), namespace (cadena, opcional), name (cadena, opcional)
k8s_auth_whoamiMostrar el sujeto con el que está autenticado actualmenteninguno
Herramientas de Escritura

Herramientas de Escritura

Estas herramientas proporcionan operaciones de creación, actualización o parcheo de recursos de Kubernetes:

HerramientaDescripciónParámetros
k8s_createCrear un recurso de Kubernetes a partir de contenido YAML/JSONyaml_content (string), namespace (string, opcional)
k8s_applyAplicar una configuración a un recurso por nombre de archivo o stdinyaml_content (string), namespace (string, opcional)
k8s_exposeExponer un recurso como un nuevo servicio de Kubernetesresource_type (string), name (string), port (integer), target_port (integer, opcional), namespace (string, opcional), protocol (string, opcional), service_name (string, opcional), labels (object, opcional), selector (string, opcional), type (string, opcional)
k8s_runCrear y ejecutar una imagen específica en un podname (string), image (string), namespace (string, opcional), command (array, opcional), env (object, opcional), labels (object, opcional), restart (string, opcional)
k8s_set_resourcesEstablecer límites y solicitudes de recursos para contenedoresresource_type (string), resource_name (string), namespace (string, opcional), containers (array, opcional), limits (object, opcional), requests (object, opcional)
k8s_set_imageEstablecer la imagen para un contenedorresource_type (string), resource_name (string), container (string), image (string), namespace (string, opcional)
k8s_set_envEstablecer variables de entorno para un contenedorresource_type (string), resource_name (string), container (string), env_dict (object), namespace (string, opcional)
k8s_rollout_undoDeshacer un rollout para un deployment, daemonset o statefulsetresource_type (string), name (string), namespace (string, opcional), to_revision (string, opcional)
k8s_rollout_restartReiniciar un rollout para un deployment, daemonset o statefulsetresource_type (string), name (string), namespace (string, opcional)
k8s_rollout_pausePausar un rollout para un deployment, daemonset o statefulsetresource_type (string), name (string), namespace (string, opcional)
k8s_rollout_resumeReanudar un rollout para un deployment, daemonset o statefulsetresource_type (string), name (string), namespace (string, opcional)
k8s_scaleEscalar un recursoresource_type (string), name (string), replicas (integer), namespace (string, opcional)
k8s_autoscaleAutoescalar un deployment, replica set, stateful set o replication controllerresource_type (string), name (string), min (integer), max (integer), namespace (string, opcional), cpu_percent (integer, opcional)
k8s_cordonMarcar un nodo como no programablenode_name (string)
k8s_uncordonMarcar un nodo como programablenode_name (string)
k8s_drainDrenar un nodo en preparación para mantenimientonode_name (string), force (boolean, opcional), ignore_daemonsets (boolean, opcional), delete_local_data (boolean, opcional), timeout (integer, opcional)
k8s_taintActualizar los taints en uno o más nodosnode_name (string), key (string), value (string, opcional), effect (string)
k8s_untaintEliminar los taints de un nodonode_name (string), key (string), effect (string, opcional)
k8s_exec_commandEjecutar un comando en un contenedorpod_name (string), command (string), container (string, opcional), namespace (string, opcional), stdin (boolean, opcional), tty (boolean, opcional), timeout (integer, opcional)
k8s_port_forwardReenviar uno o más puertos locales a un podresource_type (string), name (string), ports (array), namespace (string, opcional), address (string, opcional)
k8s_cpCopiar archivos y directorios hacia y desde contenedoressrc_path (string), dst_path (string), container (string, opcional), namespace (string, opcional)
k8s_patchActualizar campos de un recursoresource_type (string), name (string), patch (object), namespace (string, opcional)
k8s_labelActualizar las etiquetas de un recursoresource_type (string), name (string), labels (object), namespace (string, opcional), overwrite (boolean, opcional)
k8s_annotateActualizar las anotaciones de un recursoresource_type (string), name (string), annotations (object), namespace (string, opcional), overwrite (boolean, opcional)
Herramientas de eliminación

Herramientas de eliminación

Estas herramientas proporcionan operaciones de eliminación para recursos de Kubernetes:

HerramientaDescripciónParámetros
k8s_deleteEliminar recursos por nombre, selector de etiquetas o todos los recursos en un namespaceresource_type (string), name (string, opcional), namespace (string, opcional), label_selector (string, opcional), all_namespaces (boolean, opcional), force (boolean, opcional), grace_period (integer, opcional)

Desarrollo

Cómo ejecutar el proyecto localmente:

uv run -m src.mcp_kubernetes_server.main

Cómo inspeccionar las solicitudes y respuestas del servidor MCP:

npx @modelcontextprotocol/inspector uv run -m src.mcp_kubernetes_server.main

Solución de problemas

Aquí hay algunos problemas comunes y sus soluciones al trabajar con mcp-kubernetes-server:

Problema: mcp-kubernetes-server no puede conectarse al clúster de Kubernetes o informa errores de autenticación. Solución:

  • Asegúrate de que tu archivo kubeconfig esté configurado correctamente y apunte al clúster deseado.
  • Verifica que la ruta a tu archivo kubeconfig esté especificada correctamente en la configuración de mcpServers (para Docker, asegúrate de que la ruta de montaje sea correcta; para uvx, asegúrate de que la variable de entorno KUBECONFIG esté configurada correctamente).
  • Comprueba que las credenciales en tu kubeconfig tengan los permisos necesarios para realizar operaciones en el clúster. Puedes probar esto con kubectl directamente (por ejemplo, kubectl get pods).

Problema: Los comandos kubectl o helm devuelven un error como "command not found" o están deshabilitados. Solución:

  • Si se ejecuta mediante uvx, asegúrate de que kubectl y/o helm estén instalados en tu sistema y disponibles en tu PATH. Consulta la sección "Requisitos previos" para obtener orientación sobre la instalación.
  • Si ves un mensaje como "Write operations are not allowed" o "Delete operations are not allowed", el servidor podría haberse iniciado con banderas como --disable-kubectl, --disable-helm, --disable-write o --disable-delete. Revisa el comando de inicio del servidor y la sección "Opciones del servidor MCP" en el README para obtener detalles sobre estas banderas.

Problema: ¿Cómo puedo ver las solicitudes y respuestas sin procesar entre mi cliente de IA y el mcp-kubernetes-server? Solución:

  • Puedes usar la herramienta @modelcontextprotocol/inspector como se menciona en la sección "Desarrollo": npx @modelcontextprotocol/inspector uv run -m src.mcp_kubernetes_server.main. Esto te mostrará los mensajes MCP que se intercambian.

Problema: El servidor se inicia pero el cliente de IA no puede conectarse. Solución:

  • Si se usa el transporte stdio (predeterminado para la ejecución directa de uvx), asegúrate de que tu cliente de IA esté configurado para lanzar el comando mcp-kubernetes-server correctamente.
  • Si se usa el transporte sse o streamable-http, asegúrate de que el host y el puerto configurados en el mcp-kubernetes-server (por ejemplo, --host 0.0.0.0 --port 8000) sean accesibles desde donde se ejecuta tu cliente de IA. Verifica las reglas de firewall o problemas de configuración de red. Además, verifica que el cliente de IA esté configurado con la URL correcta para el servidor.

Contribución

Este proyecto es de código abierto, disponible en GitHub en feiskyer/mcp-kubernetes-server y licenciado bajo la Apache License.

Si deseas contribuir al proyecto, sigue estas pautas:

  1. Haz un fork del repositorio y clónalo en tu máquina local.
  2. Crea una nueva rama para tus cambios.
  3. Realiza tus cambios y haz commit con un mensaje de commit descriptivo.
  4. Sube tus cambios a tu repositorio bifurcado.
  5. Abre un pull request al repositorio principal.

LICENCIA

El proyecto está licenciado bajo la Apache License 2.0. Consulta el archivo LICENSE para obtener más detalles.