Kubernetes Server
Un servidor MCP que permite a los asistentes de IA interactuar y gestionar clústeres de Kubernetes.
Documentación
mcp-kubernetes-server
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
kubeconfigconfigurado 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
kubectlinstalada y en el PATH de su sistema (utilizada por el servidor para ejecutar muchos comandos de Kubernetes). - La herramienta de línea de comandos
helminstalada 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:
| Herramienta | Descripción | Parámetros |
|---|---|---|
| kubectl | Ejecutar cualquier comando de kubectl y devolver la salida | command (cadena) |
| helm | Ejecutar cualquier comando de helm y devolver la salida | command (cadena) |
Herramientas de Lectura
Herramientas de Lectura
Estas herramientas proporcionan acceso de solo lectura a los recursos de Kubernetes:
| Herramienta | Descripción | Parámetros |
|---|---|---|
| k8s_get | Obtener cualquier objeto de Kubernetes (o lista) como cadena JSON | resource (cadena), name (cadena), namespace (cadena) |
| k8s_describe | Mostrar información detallada sobre un recurso específico o grupo de recursos | resource_type (cadena), name (cadena, opcional), namespace (cadena, opcional), selector (cadena, opcional), all_namespaces (booleano, opcional) |
| k8s_logs | Imprimir los registros de un contenedor en un pod | pod_name (cadena), container (cadena, opcional), namespace (cadena, opcional), tail (entero, opcional), previous (booleano, opcional), since (cadena, opcional), timestamps (booleano, opcional), follow (booleano, opcional) |
| k8s_events | Listar eventos en el clúster | namespace (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_apis | Listar todas las API disponibles en el clúster de Kubernetes | ninguno |
| k8s_crds | Listar todas las Definiciones de Recursos Personalizados (CRDs) en el clúster de Kubernetes | ninguno |
| k8s_top_nodes | Mostrar el uso de recursos (CPU/memoria) de los nodos | sort_by (cadena, opcional) |
| k8s_top_pods | Mostrar el uso de recursos (CPU/memoria) de los pods | namespace (cadena, opcional), all_namespaces (booleano, opcional), sort_by (cadena, opcional), selector (cadena, opcional) |
| k8s_rollout_status | Obtener el estado de un despliegue para un deployment, daemonset o statefulset | resource_type (cadena), name (cadena), namespace (cadena, opcional) |
| k8s_rollout_history | Obtener el historial de despliegues para un deployment, daemonset o statefulset | resource_type (cadena), name (cadena), namespace (cadena, opcional), revision (cadena, opcional) |
| k8s_auth_can_i | Verificar si una acción está permitida | verb (cadena), resource (cadena), subresource (cadena, opcional), namespace (cadena, opcional), name (cadena, opcional) |
| k8s_auth_whoami | Mostrar el sujeto con el que está autenticado actualmente | ninguno |
Herramientas de Escritura
Herramientas de Escritura
Estas herramientas proporcionan operaciones de creación, actualización o parcheo de recursos de Kubernetes:
| Herramienta | Descripción | Parámetros |
|---|---|---|
| k8s_create | Crear un recurso de Kubernetes a partir de contenido YAML/JSON | yaml_content (string), namespace (string, opcional) |
| k8s_apply | Aplicar una configuración a un recurso por nombre de archivo o stdin | yaml_content (string), namespace (string, opcional) |
| k8s_expose | Exponer un recurso como un nuevo servicio de Kubernetes | resource_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_run | Crear y ejecutar una imagen específica en un pod | name (string), image (string), namespace (string, opcional), command (array, opcional), env (object, opcional), labels (object, opcional), restart (string, opcional) |
| k8s_set_resources | Establecer límites y solicitudes de recursos para contenedores | resource_type (string), resource_name (string), namespace (string, opcional), containers (array, opcional), limits (object, opcional), requests (object, opcional) |
| k8s_set_image | Establecer la imagen para un contenedor | resource_type (string), resource_name (string), container (string), image (string), namespace (string, opcional) |
| k8s_set_env | Establecer variables de entorno para un contenedor | resource_type (string), resource_name (string), container (string), env_dict (object), namespace (string, opcional) |
| k8s_rollout_undo | Deshacer un rollout para un deployment, daemonset o statefulset | resource_type (string), name (string), namespace (string, opcional), to_revision (string, opcional) |
| k8s_rollout_restart | Reiniciar un rollout para un deployment, daemonset o statefulset | resource_type (string), name (string), namespace (string, opcional) |
| k8s_rollout_pause | Pausar un rollout para un deployment, daemonset o statefulset | resource_type (string), name (string), namespace (string, opcional) |
| k8s_rollout_resume | Reanudar un rollout para un deployment, daemonset o statefulset | resource_type (string), name (string), namespace (string, opcional) |
| k8s_scale | Escalar un recurso | resource_type (string), name (string), replicas (integer), namespace (string, opcional) |
| k8s_autoscale | Autoescalar un deployment, replica set, stateful set o replication controller | resource_type (string), name (string), min (integer), max (integer), namespace (string, opcional), cpu_percent (integer, opcional) |
| k8s_cordon | Marcar un nodo como no programable | node_name (string) |
| k8s_uncordon | Marcar un nodo como programable | node_name (string) |
| k8s_drain | Drenar un nodo en preparación para mantenimiento | node_name (string), force (boolean, opcional), ignore_daemonsets (boolean, opcional), delete_local_data (boolean, opcional), timeout (integer, opcional) |
| k8s_taint | Actualizar los taints en uno o más nodos | node_name (string), key (string), value (string, opcional), effect (string) |
| k8s_untaint | Eliminar los taints de un nodo | node_name (string), key (string), effect (string, opcional) |
| k8s_exec_command | Ejecutar un comando en un contenedor | pod_name (string), command (string), container (string, opcional), namespace (string, opcional), stdin (boolean, opcional), tty (boolean, opcional), timeout (integer, opcional) |
| k8s_port_forward | Reenviar uno o más puertos locales a un pod | resource_type (string), name (string), ports (array), namespace (string, opcional), address (string, opcional) |
| k8s_cp | Copiar archivos y directorios hacia y desde contenedores | src_path (string), dst_path (string), container (string, opcional), namespace (string, opcional) |
| k8s_patch | Actualizar campos de un recurso | resource_type (string), name (string), patch (object), namespace (string, opcional) |
| k8s_label | Actualizar las etiquetas de un recurso | resource_type (string), name (string), labels (object), namespace (string, opcional), overwrite (boolean, opcional) |
| k8s_annotate | Actualizar las anotaciones de un recurso | resource_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:
| Herramienta | Descripción | Parámetros |
|---|---|---|
| k8s_delete | Eliminar recursos por nombre, selector de etiquetas o todos los recursos en un namespace | resource_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
kubeconfigesté configurado correctamente y apunte al clúster deseado. - Verifica que la ruta a tu archivo
kubeconfigesté especificada correctamente en la configuración demcpServers(para Docker, asegúrate de que la ruta de montaje sea correcta; parauvx, asegúrate de que la variable de entornoKUBECONFIGesté configurada correctamente). - Comprueba que las credenciales en tu
kubeconfigtengan los permisos necesarios para realizar operaciones en el clúster. Puedes probar esto conkubectldirectamente (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 quekubectly/ohelmesté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-writeo--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/inspectorcomo 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 deuvx), asegúrate de que tu cliente de IA esté configurado para lanzar el comandomcp-kubernetes-servercorrectamente. - Si se usa el transporte
sseostreamable-http, asegúrate de que el host y el puerto configurados en elmcp-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:
- Haz un fork del repositorio y clónalo en tu máquina local.
- Crea una nueva rama para tus cambios.
- Realiza tus cambios y haz commit con un mensaje de commit descriptivo.
- Sube tus cambios a tu repositorio bifurcado.
- 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.