MKP
Servidor do Model Kontext Protocol para Kubernetes que permite que aplicações baseadas em LLM interajam com clusters Kubernetes por meio de implementação nativa em Go, com integração direta de API e gerenciamento abrangente de recursos.
Documentação
MKP - Servidor de Protocolo de Contexto de Modelo para Kubernetes
O MKP é um servidor de Protocolo de Contexto de Modelo (MCP) para Kubernetes que permite que aplicações alimentadas por LLM interajam com clusters Kubernetes. Ele fornece ferramentas para listar e aplicar recursos Kubernetes através do protocolo MCP.
Recursos
- Listar recursos suportados pelo servidor de API do Kubernetes
- Listar recursos de cluster
- Listar recursos por namespace
- Obter recursos e seus subrecursos (incluindo status, scale, logs, etc.)
- Aplicar (criar ou atualizar) recursos de cluster
- Aplicar (criar ou atualizar) recursos por namespace
- Executar comandos em pods com controle de tempo limite
- Implementação genérica e plugável usando o cliente não estruturado do API Machinery
- Limitação de taxa integrada para proteção contra chamadas excessivas de API
Por que MKP?
O MKP oferece várias vantagens principais como um servidor de Protocolo de Contexto de Modelo para Kubernetes:
Implementação Nativa em Go
- Construído com a mesma linguagem do próprio Kubernetes
- Excelentes características de desempenho para aplicações de servidor
- Forte segurança de tipos e suporte a concorrência
- Integração perfeita com bibliotecas Kubernetes
Integração Direta com API
- Usa o API machinery do Kubernetes diretamente, sem dependências externas
- Sem dependência de kubectl, helm ou outras ferramentas de CLI
- Comunica-se diretamente com o servidor de API do Kubernetes
- Menos sobrecarga e maior confiabilidade
Suporte Universal a Recursos
- Funciona com qualquer tipo de recurso Kubernetes através do cliente não estruturado
- Sem esquemas de recursos codificados ou manipuladores especializados
- Suporta automaticamente Definições de Recursos Personalizados (CRDs)
- À prova de futuro para novos recursos Kubernetes
Design Minimalista
- Focado em operações essenciais de recursos Kubernetes
- Código limpo e de fácil manutenção com clara separação de responsabilidades
- Leve com dependências mínimas
- Fácil de entender, estender e contribuir
Arquitetura Pronta para Produção
- Projetado para confiabilidade e desempenho em ambientes de produção
- Tratamento adequado de erros e gerenciamento de recursos
- Limitação de taxa integrada para proteção contra chamadas excessivas de API
- Design testável com testes unitários abrangentes
- Segue as melhores práticas de desenvolvimento do Kubernetes
Pré-requisitos
- Go 1.24 ou posterior
- Cluster Kubernetes e kubeconfig
- Task para executar tarefas
Instalação
-
Clone o repositório:
git clone https://github.com/StacklokLabs/mkp.git cd mkp -
Instale as dependências:
task install -
Compile o servidor:
task build
Uso
Executando o servidor
Para executar o servidor com o kubeconfig padrão:
task run
Para executar o servidor com um kubeconfig específico:
KUBECONFIG=/path/to/kubeconfig task run-with-kubeconfig
Para executar o servidor em uma porta específica:
MCP_PORT=9091 task run
Executando com ToolHive
O MKP pode ser executado como um servidor de Protocolo de Contexto de Modelo (MCP) usando ToolHive, que simplifica a implantação e o gerenciamento de servidores MCP.
Consulte a documentação do ToolHive para instruções detalhadas sobre como configurar o MKP com a interface do ToolHive, CLI ou operador Kubernetes.
Ferramentas MCP
O servidor MKP fornece as seguintes ferramentas MCP:
get_resource
Obter um recurso Kubernetes ou seu subrecurso.
Parâmetros:
resource_type(obrigatório): Tipo de recurso a obter (cluster ou namespace)group: Grupo de API (ex.: apps, networking.k8s.io)version(obrigatório): Versão da API (ex.: v1, v1beta1)resource(obrigatório): Nome do recurso (ex.: deployments, services)namespace: Namespace (obrigatório para recursos por namespace)name(obrigatório): Nome do recurso a obtersubresource: Subrecurso a obter (ex.: status, scale, logs)parameters: Parâmetros opcionais para a solicitação (veja exemplos abaixo)
Exemplo:
{
"name": "get_resource",
"arguments": {
"resource_type": "namespaced",
"group": "apps",
"version": "v1",
"resource": "deployments",
"namespace": "default",
"name": "nginx-deployment",
"subresource": "status"
}
}
Exemplo de obtenção de logs de um contêiner específico com parâmetros:
{
"name": "get_resource",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"name": "my-pod",
"subresource": "logs",
"parameters": {
"container": "my-container",
"sinceSeconds": "3600",
"timestamps": "true",
"limitBytes": "102400"
}
}
}
Parâmetros disponíveis para logs de pods:
container: Especificar de qual contêiner obter os logsprevious: Obter logs da instância anterior do contêiner (true/false)sinceSeconds: Retornar apenas logs mais recentes que uma duração relativa em segundossinceTime: Retornar apenas logs após um horário específico (formato RFC3339)timestamps: Incluir carimbos de data/hora em cada linha (true/false)limitBytes: Número máximo de bytes a retornartailLines: Número de linhas a retornar do final dos logs
Por padrão, os logs de pods são limitados às últimas 100 linhas e 32KB para evitar sobrecarregar a janela de contexto do LLM. Esses padrões podem ser substituídos usando os parâmetros acima.
Parâmetros disponíveis para recursos regulares:
resourceVersion: Quando especificado, mostra o recurso naquela versão específica
list_resources
Lista recursos Kubernetes de um tipo específico.
Parâmetros:
resource_type(obrigatório): Tipo de recurso a listar (cluster ou namespace)group: Grupo de API (ex.: apps, networking.k8s.io)version(obrigatório): Versão da API (ex.: v1, v1beta1)resource(obrigatório): Nome do recurso (ex.: deployments, services)namespace: Namespace (obrigatório para recursos por namespace)label_selector: Seletor de rótulos Kubernetes para filtrar recursos (opcional)include_annotations: Se deve incluir anotações na saída (padrão: true)exclude_annotation_keys: Lista de chaves de anotação a excluir da saída (suporta curingas com *)include_annotation_keys: Lista de chaves de anotação a incluir na saída (se especificado, apenas estas são incluídas)
Filtragem de Anotações
A ferramenta list_resources fornece poderosos recursos de filtragem de anotações para
controlar o tamanho da saída de metadados e evitar problemas de truncamento com anotações
grandes (como anotações de nós GPU).
Uso Básico:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "apps",
"version": "v1",
"resource": "deployments",
"namespace": "default"
}
}
Excluir anotações específicas (útil para nós GPU):
{
"name": "list_resources",
"arguments": {
"resource_type": "clustered",
"group": "",
"version": "v1",
"resource": "nodes",
"exclude_annotation_keys": [
"nvidia.com/*",
"kubectl.kubernetes.io/last-applied-configuration"
]
}
}
Incluir apenas anotações específicas:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"include_annotation_keys": ["app", "version", "prometheus.io/scrape"]
}
}
Desabilitar anotações completamente para máximo desempenho:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"include_annotations": false
}
}
Regras de Filtragem de Anotações:
- Por padrão,
kubectl.kubernetes.io/last-applied-configurationé excluído para evitar grandes dados de configuração exclude_annotation_keyssuporta padrões curinga usando*(ex.:nvidia.com/*exclui todas as anotações NVIDIA)- Quando
include_annotation_keysé especificado, ele tem precedência e apenas essas anotações são incluídas - Definir
include_annotations: falseremove completamente todas as anotações da saída - Padrões curinga suportam apenas
*no final da chave (ex.:nvidia.com/*)
apply_resource
Aplica (cria ou atualiza) um recurso Kubernetes.
Parâmetros:
resource_type(obrigatório): Tipo de recurso a aplicar (cluster ou namespace)group: Grupo de API (ex.: apps, networking.k8s.io)version(obrigatório): Versão da API (ex.: v1, v1beta1)resource(obrigatório): Nome do recurso (ex.: deployments, services)namespace: Namespace (obrigatório para recursos por namespace)manifest(obrigatório): Manifesto do recurso
Exemplo:
{
"name": "apply_resource",
"arguments": {
"resource_type": "namespaced",
"group": "apps",
"version": "v1",
"resource": "deployments",
"namespace": "default",
"manifest": {
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "nginx-deployment",
"namespace": "default"
},
"spec": {
"replicas": 3,
"selector": {
"matchLabels": {
"app": "nginx"
}
},
"template": {
"metadata": {
"labels": {
"app": "nginx"
}
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:latest",
"ports": [
{
"containerPort": 80
}
]
}
]
}
}
}
}
}
}
post_resource
Envia dados para um recurso Kubernetes ou seu subrecurso, particularmente útil para executar comandos em pods.
Parâmetros:
resource_type(obrigatório): Tipo de recurso para envio (cluster ou namespace)group: Grupo de API (ex.: apps, networking.k8s.io)version(obrigatório): Versão da API (ex.: v1, v1beta1)resource(obrigatório): Nome do recurso (ex.: deployments, services)namespace: Namespace (obrigatório para recursos por namespace)name(obrigatório): Nome do recurso para enviosubresource: Subrecurso para envio (ex.: exec)body(obrigatório): Corpo a enviar para o recursoparameters: Parâmetros opcionais para a solicitação
Exemplo de execução de um comando em um pod:
{
"name": "post_resource",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"name": "my-pod",
"subresource": "exec",
"body": {
"command": ["ls", "-la", "/"],
"container": "my-container",
"timeout": 30
}
}
}
O body para execução em pod suporta os seguintes campos:
command(obrigatório): Comando a executar, como uma string ou um array de stringscontainer(opcional): Nome do contêiner para executar o comando (padrão: o primeiro contêiner)timeout(opcional): Tempo limite em segundos (padrão: 15 segundos, máximo 60 segundos)
Nota sobre tempos limite:
- Tempo limite padrão: 15 segundos se não especificado
- Tempo limite máximo: 60 segundos (qualquer valor maior será limitado)
- Comandos que excedem o tempo limite serão encerrados e retornarão um erro de tempo limite
A resposta inclui stdout, stderr e qualquer mensagem de erro:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "my-pod",
"namespace": "default"
},
"spec": {
"command": ["ls", "-la", "/"]
},
"status": {
"stdout": "total 48\ndrwxr-xr-x 1 root root 4096 May 5 14:30 .\ndrwxr-xr-x 1 root root 4096 May 5 14:30 ..\n...",
"stderr": "",
"error": ""
}
}
Recursos MCP
O servidor MKP fornece acesso a recursos Kubernetes através de recursos MCP. Os URIs de recursos seguem estes formatos:
- Recursos de cluster:
k8s://clustered/{group}/{version}/{resource}/{name} - Recursos por namespace:
k8s://namespaced/{namespace}/{group}/{version}/{resource}/{name}
Configuração
Protocolo de Transporte
O MKP suporta dois protocolos de transporte para o servidor MCP:
- HTTP Streamable: O protocolo de transporte padrão, adequado para a maioria dos casos de uso
- SSE (Server-Sent Events): Protocolo de transporte legado, principalmente para compatibilidade com clientes mais antigos
Você pode configurar o protocolo de transporte usando um sinalizador de CLI ou uma variável de ambiente:
# Using CLI flag
./build/mkp-server --transport=sse
# Using environment variable
MCP_TRANSPORT=sse ./build/mkp-server
# Default (Streamable HTTP)
./build/mkp-server
A variável de ambiente MCP_TRANSPORT é definida automaticamente pelo ToolHive ao
executar o MKP nesse ambiente.
Controlando a Descoberta de Recursos
Por padrão, o MKP serve todos os recursos Kubernetes como recursos MCP, o que fornece contexto útil para LLMs. No entanto, em clusters grandes com muitos recursos, isso pode consumir espaço significativo de contexto no LLM.
Você pode desabilitar esse comportamento usando o sinalizador --serve-resources:
# Run without serving cluster resources
./build/mkp-server --serve-resources=false
# Run with a specific kubeconfig without serving cluster resources
./build/mkp-server --kubeconfig=/path/to/kubeconfig --serve-resources=false
Mesmo com a descoberta de recursos desabilitada, as ferramentas MCP (get_resource,
list_resources, apply_resource, delete_resource e post_resource)
permanecem totalmente funcionais, permitindo que você interaja com seu cluster Kubernetes.
Habilitando Operações de Escrita
Por padrão, o MKP opera em modo somente leitura, o que significa que não permite operações
de escrita no cluster, ou seja, as ferramentas apply_resource, delete_resource e
post_resource não estarão disponíveis. Você pode habilitar operações de escrita usando
o sinalizador --read-write:
# Run with write operations enabled
./build/mkp-server --read-write=true
# Run with a specific kubeconfig and write operations enabled
./build/mkp-server --kubeconfig=/path/to/kubeconfig --read-write=true
Limitação de Taxa
O MKP inclui um mecanismo integrado de limitação de taxa para proteger o servidor de chamadas excessivas de API, o que é particularmente importante quando usado com agentes de IA. O limitador de taxa usa um algoritmo de balde de tokens e aplica limites diferentes com base no tipo de operação:
- Operações de leitura (list_resources, get_resource): 120 solicitações por minuto
- Operações de escrita (apply_resource, delete_resource): 30 solicitações por minuto
- Padrão para outras operações: 60 solicitações por minuto
Os limites de taxa são aplicados por sessão de cliente, garantindo alocação justa de recursos entre múltiplos clientes. O recurso de limitação de taxa pode ser habilitado ou desabilitado através do sinalizador de linha de comando:
# Run with rate limiting enabled (default)
./build/mkp-server
# Run with rate limiting disabled
./build/mkp-server --enable-rate-limiting=false
Os limites de taxa podem ser personalizados através de variáveis de ambiente:
MKP_RATE_LIMIT_DEFAULT: Limite de taxa padrão (padrão: 60)MKP_RATE_LIMIT_READ: Limite de taxa para operações de leitura (padrão: 120)MKP_RATE_LIMIT_WRITE: Limite de taxa para operações de escrita (padrão: 30)
# Run with custom rate limits
MKP_RATE_LIMIT_READ=200 MKP_RATE_LIMIT_WRITE=50 ./build/mkp-server
Desenvolvimento
Executando testes
task test
Formatando código
task fmt
Verificando código com linter
task lint
Atualizando dependências
task deps
Contribuindo
Aceitamos contribuições para este servidor MCP! Se você gostaria de contribuir, por favor revise o guia de CONTRIBUIÇÃO para detalhes sobre como começar.
Se você encontrar um bug ou tiver uma solicitação de recurso, por favor
abra uma issue no repositório ou
junte-se a nós no canal #mcp-servers em nosso
servidor comunitário no Discord.
Licença
Este projeto é licenciado sob a Licença Apache v2 - consulte o arquivo LICENSE para detalhes.