MKP
A Model Context Protocol server enabling LLM-powered applications to interact with Kubernetes clusters.
Key Features
Use Cases
README
MKP - Model Kontext Protocol Server for Kubernetes
MKP is a Model Context Protocol (MCP) server for Kubernetes that allows LLM-powered applications to interact with Kubernetes clusters. It provides tools for listing and applying Kubernetes resources through the MCP protocol.
Features
- List resources supported by the Kubernetes API server
- List clustered resources
- List namespaced resources
- Get resources and their subresources (including status, scale, logs, etc.)
- Apply (create or update) clustered resources
- Apply (create or update) namespaced resources
- Execute commands in pods with timeout control
- Generic and pluggable implementation using API Machinery's unstructured client
- Built-in rate limiting for protection against excessive API calls
Why MKP?
MKP offers several key advantages as a Model Context Protocol server for Kubernetes:
Native Go Implementation
- Built with the same language as Kubernetes itself
- Excellent performance characteristics for server applications
- Strong type safety and concurrency support
- Seamless integration with Kubernetes libraries
Direct API Integration
- Uses Kubernetes API machinery directly without external dependencies
- No reliance on kubectl, helm, or other CLI tools
- Communicates directly with the Kubernetes API server
- Reduced overhead and improved reliability
Universal Resource Support
- Works with any Kubernetes resource type through the unstructured client
- No hardcoded resource schemas or specialized handlers needed
- Automatically supports Custom Resource Definitions (CRDs)
- Future-proof for new Kubernetes resources
Minimalist Design
- Focused on core Kubernetes resource operations
- Clean, maintainable codebase with clear separation of concerns
- Lightweight with minimal dependencies
- Easy to understand, extend, and contribute to
Production-Ready Architecture
- Designed for reliability and performance in production environments
- Proper error handling and resource management
- Built-in rate limiting to protect against excessive API calls
- Testable design with comprehensive unit tests
- Follows Kubernetes development best practices
Prerequisites
- Go 1.24 or later
- Kubernetes cluster and kubeconfig
- Task for running tasks
Installation
-
Clone the repository:
bashgit clone https://github.com/StacklokLabs/mkp.git cd mkp -
Install dependencies:
bashtask install -
Build the server:
bashtask build
Usage
Running the server
To run the server with the default kubeconfig:
task run
To run the server with a specific kubeconfig:
KUBECONFIG=/path/to/kubeconfig task run-with-kubeconfig
To run the server on a specific port:
MCP_PORT=9091 task run
Running with ToolHive
MKP can be run as a Model Context Protocol (MCP) server using ToolHive, which simplifies the deployment and management of MCP servers.
See the ToolHive documentation for detailed instructions on how to set up MKP with the ToolHive UI, CLI, or Kubernetes operator.
MCP Tools
The MKP server provides the following MCP tools:
get_resource
Get a Kubernetes resource or its subresource.
Parameters:
resource_type(required): Type of resource to get (clustered or namespaced)group: API group (e.g., apps, networking.k8s.io)version(required): API version (e.g., v1, v1beta1)resource(required): Resource name (e.g., deployments, services)namespace: Namespace (required for namespaced resources)name(required): Name of the resource to getsubresource: Subresource to get (e.g., status, scale, logs)parameters: Optional parameters for the request (see examples below)
Example:
{
"name": "get_resource",
"arguments": {
"resource_type": "namespaced",
"group": "apps",
"version": "v1",
"resource": "deployments",
"namespace": "default",
"name": "nginx-deployment",
"subresource": "status"
}
}
Example of getting logs from a specific container with parameters:
{
"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"
}
}
}
Available parameters for pod logs:
container: Specify which container to get logs fromprevious: Get logs from previous container instance (true/false)sinceSeconds: Only return logs newer than a relative duration in secondssinceTime: Only return logs after a specific time (RFC3339 format)timestamps: Include timestamps on each line (true/false)limitBytes: Maximum number of bytes to returntailLines: Number of lines to return from the end of the logs
By default, pod logs are limited to the last 100 lines and 32KB to avoid overwhelming the LLM's context window. These defaults can be overridden using the parameters above.
Available parameters for regular resources:
resourceVersion: When specified, shows the resource at that particular version
list_resources
Lists Kubernetes resources of a specific type.
Parameters:
resource_type(required): Type of resource to list (clustered or namespaced)group: API group (e.g., apps, networking.k8s.io)version(required): API version (e.g., v1, v1beta1)resource(required): Resource name (e.g., deployments, services)namespace: Namespace (required for namespaced resources)label_selector: Kubernetes label selector for filtering resources (optional)include_annotations: Whether to include annotations in the output (default: true)exclude_annotation_keys: List of annotation keys to exclude from output (supports wildcards with *)include_annotation_keys: List of annotation keys to include in output (if specified, only these are included)
Annotation Filtering
The list_resources tool provides powerful annotation filtering capabilities to
control metadata output size and prevent truncation issues with large
annotations (such as GPU node annotations).
Basic Usage:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "apps",
"version": "v1",
"resource": "deployments",
"namespace": "default"
}
}
Exclude specific annotations (useful for GPU nodes):
{
"name": "list_resources",
"arguments": {
"resource_type": "clustered",
"group": "",
"version": "v1",
"resource": "nodes",
"exclude_annotation_keys": [
"nvidia.com/*",
"kubectl.kubernetes.io/last-applied-configuration"
]
}
}
Include only specific annotations:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"include_annotation_keys": ["app", "version", "prometheus.io/scrape"]
}
}
Disable annotations completely for maximum performance:
{
"name": "list_resources",
"arguments": {
"resource_type": "namespaced",
"group": "",
"version": "v1",
"resource": "pods",
"namespace": "default",
"include_annotations": false
}
}
Annotation Filtering Rules:
- By default,
kubectl.kubernetes.io/last-applied-configurationis excluded to prevent large configuration data exclude_annotation_keyssupports wildcard patterns using*(e.g.,nvidia.com/*excludes all NVIDIA annotations)- When
include_annotation_keysis specified, it takes precedence and only those annotations are included - Setting
include_annotations: falsecompletely removes all annotations from the output - Wildcard patterns only support
*at the end of the key (e.g.,nvidia.com/*)
apply_resource
Applies (creates or updates) a Kubernetes resource.
Parameters:
resource_type(required): Type of resource to apply (clustered or namespaced)group: API group (e.g., apps, networking.k8s.io)version(required): API version (e.g., v1, v1beta1)resource(required): Resource name (e.g., deployments, services)namespace: Namespace (required for namespaced resources)manifest(required): Resource manifest
Example:
{
"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
Posts to a Kubernetes resource or its subresource, particularly useful for executing commands in pods.
Parameters:
resource_type(required): Type of resource to post to (clustered or namespaced)group: API group (e.g., apps, networking.k8s.io)version(required): API version (e.g., v1, v1beta1)resource(required): Resource name (e.g., deployments, services)namespace: Namespace (required for namespaced resources)name(required): Name of the resource to post tosubresource: Subresource to post to (e.g., exec)body(required): Body to post to the resourceparameters: Optional parameters for the request
Example of executing a command in a 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
}
}
}
The body for pod exec supports the following fields:
command(required): Command to execute, either as a string or an array of stringscontainer(optional): Container name to execute the command in (defaults to the first container)timeout(optional): Timeout in seconds (defaults to 15 seconds, maximum 60 seconds)
Note on timeouts:
- Default timeout: 15 seconds if not specified
- Maximum timeout: 60 seconds (any larger value will be capped)
- Commands that exceed the timeout will be terminated and return a timeout error
The response includes stdout, stderr, and any error message:
{
"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": ""
}
}
MCP Resources
The MKP server provides access to Kubernetes resources through MCP resources. The resource URIs follow these formats:
- Clustered resources:
k8s://clustered/{group}/{version}/{resource}/{name} - Namespaced resources:
k8s://namespaced/{namespace}/{group}/{version}/{resource}/{name}
Configuration
Transport Protocol
MKP supports two transport protocols for the MCP server:
- Streamable HTTP: The default transport protocol, suitable for most use cases
- SSE (Server-Sent Events): Legacy transport protocol, primarily for compatibility with older clients
You can configure the transport protocol using either a CLI flag or an environment variable:
# Using CLI flag
./build/mkp-server --transport=sse
# Using environment variable
MCP_TRANSPORT=sse ./build/mkp-server
# Default (Streamable HTTP)
./build/mkp-server
The MCP_TRANSPORT environment variable is automatically set by ToolHive when
running MKP in that environment.
Controlling Resource Discovery
By default, MKP serves all Kubernetes resources as MCP resources, which provides useful context for LLMs. However, in large clusters with many resources, this can consume significant context space in the LLM.
You can disable this behavior by using the --serve-resources flag:
# 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
Even with resource discovery disabled, the MCP tools (get_resource,
list_resources, apply_resource, delete_resource, and post_resource)
remain fully functional, allowing you to interact with your Kubernetes cluster.
Enabling Write Operations
By default, MKP operates in read-only mode, meaning it does not allow write
operations on the cluster, i.e. the apply_resource, delete_resource, and
post_resource tools will not be available. You can enable write operations by
using the --read-write flag:
# 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
Rate Limiting
MKP includes a built-in rate limiting mechanism to protect the server from excessive API calls, which is particularly important when used with AI agents. The rate limiter uses a token bucket algorithm and applies different limits based on the operation type:
- Read operations (list_resources, get_resource): 120 requests per minute
- Write operations (apply_resource, delete_resource): 30 requests per minute
- Default for other operations: 60 requests per minute
Rate limits are applied per client session, ensuring fair resource allocation across multiple clients. The rate limiting feature can be enabled or disabled via the command line flag:
# Run with rate limiting enabled (default)
./build/mkp-server
# Run with rate limiting disabled
./build/mkp-server --enable-rate-limiting=false
Development
Running tests
task test
Formatting code
task fmt
Linting code
task lint
Updating dependencies
task deps
Contributing
We welcome contributions to this MCP server! If you'd like to contribute, please review the CONTRIBUTING guide for details on how to get started.
If you run into a bug or have a feature request, please
open an issue in the repository or
join us in the #mcp-servers channel on our
community Discord server.
License
This project is licensed under the Apache v2 License - see the LICENSE file for details.
Star History
Repository Owner
Organization
Repository Details
Programming Languages
Tags
Join Our Newsletter
Stay updated with the latest AI tools, news, and offers by subscribing to our weekly newsletter.
Related MCPs
Discover similar Model Context Protocol servers
MCP K8S Go
Golang-based MCP server that enables AI-driven interactions with Kubernetes clusters.
MCP K8S Go provides a server implementation of the Model Context Protocol for managing and interacting with Kubernetes clusters. It offers functionality to list, retrieve, create, and modify Kubernetes resources such as contexts, namespaces, pods, and nodes using standardized context-aware approaches. Designed for integration with AI assistants like Claude Desktop, it enables prompting and tool execution to manage cluster state, monitor events, fetch pod logs, and run in-pod commands. The solution supports deployment via various installation methods including Docker, Node.js, and Go binaries.
- ⭐ 356
- MCP
- strowk/mcp-k8s-go
metoro-mcp-server
Bridge Kubernetes observability data to LLMs via the Model Context Protocol.
Metoro MCP Server is an implementation of the Model Context Protocol (MCP) that enables seamless integration between Kubernetes observability data and large language models. It connects Metoro’s eBPF-based telemetry APIs to LLM applications such as the Claude Desktop App, allowing AI systems to query and analyze Kubernetes clusters. This solution supports both authenticated and demo modes for accessing real-time cluster insights.
- ⭐ 45
- MCP
- metoro-io/metoro-mcp-server
mcp-k8s-eye
Kubernetes management and diagnostics tool with MCP protocol support.
mcp-k8s-eye enables users to manage and analyze Kubernetes clusters using standardized Model Context Protocol (MCP) interfaces. It offers comprehensive resource operations, diagnostics, and resource usage monitoring through both stdio and SSE transports. Supporting generic and custom resource management along with advanced diagnostic tooling, it is geared for integration with AI clients and other MCP consumers.
- ⭐ 26
- MCP
- wenhuwang/mcp-k8s-eye
MCP Server Kubernetes
Connect and manage Kubernetes clusters via Model Context Protocol servers.
MCP Server Kubernetes enables seamless connection and management of Kubernetes clusters through the Model Context Protocol. It supports loading kubeconfig from multiple sources, integrates easily with Claude Code, Claude Desktop, and VS Code, and offers flexible authentication mechanisms. Users can control clusters using standard command-line tools and extension integrations for multiple environments.
- ⭐ 1,181
- MCP
- Flux159/mcp-server-kubernetes
Kanboard MCP Server
MCP server for seamless AI integration with Kanboard project management.
Kanboard MCP Server is a Go-based server implementing the Model Context Protocol (MCP) for integrating AI assistants with the Kanboard project management system. It enables users to manage projects, tasks, users, and workflows in Kanboard directly via natural language commands through compatible AI tools. With built-in support for secure authentication and high performance, it facilitates streamlined project operations between Kanboard and AI-powered clients like Cursor or Claude Desktop. The server is configurable and designed for compatibility with MCP standards.
- ⭐ 15
- MCP
- bivex/kanboard-mcp
K8M
AI-driven lightweight Kubernetes dashboard with integrated MCP and multi-cluster management.
K8M is an AI-enabled mini Kubernetes dashboard built with a focus on simplifying cluster management and enhancing user experience. Utilizing the Model Context Protocol (MCP), K8M offers visual management for MCP, allowing AI models to interact with Kubernetes resources and tools easily, supporting over 49 built-in MCP tools. It enables powerful multi-cluster management, integrates advanced AI capabilities such as chat-driven resource explanation and diagnostics, and supports custom large model integration including private deployments and models like Ollama.
- ⭐ 702
- MCP
- weibaohui/k8m
Didn't find tool you were looking for?