k8s-pilot

**The Central Pilot for Your Kubernetes Fleets βοΈβοΈ**
`k8s_pilot` is a lightweight, centralized control plane server for managing **multiple Kubernetes clusters** at once.
With powerful tools and intuitive APIs, you can observe and control all your clusters from one cockpit.
---
## π Overview
- π Supports **multi-cluster context switching**
- π§ Enables **CRUD operations** on most common Kubernetes resources
- π **Readonly mode** for safe cluster inspection
- βοΈ Powered by [MCP](https://modelcontextprotocol.io/) for Claude AI and beyond
- π **Streamable HTTP** transport support for remote access
- π€ **MCP Prompts** for guided operations
- π **Context-aware logging** for write operations
---
## π§° Prerequisites
- Python **3.13** or higher
- [`uv`](https://github.com/astral-sh/uv) package manager
- Access to Kubernetes clusters (`~/.kube/config` or in-cluster config)
```bash
# Install uv (if not installed)
# For MacOS
brew install uv
# For Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
```
## Installation
```bash
# Clone the repository
git clone https://github.com/bourbonkk/k8s-pilot.git
cd k8s-pilot
# Launch with uv + MCP
uv run --with "mcp[cli]>=1.28.0,<2" python k8s_pilot.py
```
## π What's New in v2.0
- **Streamable HTTP Transport**: Remote cluster management via HTTP (in addition to stdio)
- **MCP Prompts**: Built-in prompt templates for common K8s operations
- **Context-aware Logging**: Write operations now report progress via MCP context
- **Bug Fixes**: Fixed missing API clients for Ingress and RBAC resources
- **Security**: Added readonly checks for node modification operations
- **Dockerfile**: Modernized with `uv` package manager for faster builds
## Usage
### Normal Mode (Full Access)
```bash
# Start with full read/write access
uv run --with "mcp[cli]>=1.28.0,<2" python k8s_pilot.py
```
### Readonly Mode (Safe Inspection)
```bash
# Start in readonly mode - only read operations allowed
uv run --with "mcp[cli]>=1.28.0,<2" python k8s_pilot.py --readonly
```
### Streamable HTTP Mode (Remote Access)
```bash
# Start with Streamable HTTP transport for remote access
uv run --with "mcp[cli]>=1.28.0,<2" python k8s_pilot.py --transport streamable-http
```
### Command Line Options
```bash
# Show help
uv run --with "mcp[cli]>=1.28.0,<2" python k8s_pilot.py --help
```
### Run via Docker
You can run k8s-pilot directly using the published Docker image without installing `uv` locally.
Make sure to mount your `~/.kube/config` so the container can access your clusters.
```bash
docker run -i --rm \
-v ~/.kube/config:/root/.kube/config \
ghcr.io/bourbonkk/k8s-pilot:latest
```
## Readonly Mode
The `--readonly` flag enables a safety mode that prevents any write operations to your Kubernetes clusters. This is perfect for:
- **Cluster inspection** without risk of accidental changes
- **Audit scenarios** where you need to view but not modify
- **Learning environments** where you want to explore safely
- **Production monitoring** with zero risk of modifications
### Protected Operations (Blocked in Readonly Mode)
- `pod_create`, `pod_update`, `pod_delete`
- `deployment_create`, `deployment_update`, `deployment_delete`
- `service_create`, `service_update`, `service_delete`
- `configmap_create`, `configmap_update`, `configmap_delete`
- `secret_create`, `secret_update`, `secret_delete`
- `namespace_create`, `namespace_delete`
- All other create/update/delete operations
### Allowed Operations (Always Available)
- `pod_list`, `pod_detail`, `pod_logs`
- `deployment_list`, `deployment_get`
- `service_list`, `service_get`
- `configmap_list`, `configmap_get`
- `secret_list`, `secret_get`
- `namespace_list`, `namespace_get`
- All other list/get operations
## MCP Prompts
k8s-pilot includes built-in prompt templates for common operations:
| Prompt | Description |
|--------|-------------|
| `troubleshoot_pod` | Step-by-step pod troubleshooting guide |
| `deployment_guide` | Guided application deployment workflow |
| `cluster_health_check` | Comprehensive cluster health assessment |
| `namespace_cleanup` | Safe namespace cleanup procedure |
## Usage with Claude Desktop
Use this config to run k8s_pilot MCP server from within Claude:
```json
{
"mcpServers": {
"k8s_pilot": {
"command": "uv",
"args": [
"--directory",
"<path-to-cloned-repo>/k8s-pilot",
"run",
"--with",
"mcp[cli]>=1.28.0,<2",
"python",
"k8s_pilot.py"
]
}
}
}
```
For readonly mode, use this configuration:
```json
{
"mcpServers": {
"k8s_pilot_readonly": {
"command": "uv",
"args": [
"--directory",
"<path-to-cloned-repo>/k8s-pilot",
"run",
"--with",
"mcp[cli]>=1.28.0,<2",
"python",
"k8s_pilot.py",
"--readonly"
]
}
}
}
```
For Docker, use this configuration (replace `YOUR_USERNAME` with your actual Mac user name):
```json
{
"mcpServers": {
"k8s_pilot_docker": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"/Users/YOUR_USERNAME/.kube/config:/root/.kube/config",
"ghcr.io/bourbonkk/k8s-pilot:latest"
]
}
}
}
```
Replace `<path-to-cloned-repo>` with the actual directory where you cloned the repo.
## Scenario
Create a Deployment using the nginx:latest image in the pypy namespace, and also create a Service that connects to it.

## Key Features
### Multi-Cluster Management
- Seamlessly interact with multiple Kubernetes clusters
- Perform context-aware operations
- Easily switch between clusters via MCP prompts
### Resource Control
- View, create, update, delete:
- Deployments, Services, Pods
- ConfigMaps, Secrets, Ingresses
- StatefulSets, DaemonSets
- Roles, ClusterRoles
- PersistentVolumes & Claims
### Namespace Operations
- Create/delete namespaces
- List all resources in a namespace
- Manage labels and resource quotas
### Node Management
- View node details and conditions
- Cordon/uncordon, label/taint nodes
- List pods per node
# License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
TDQS
Scored across 57 tools
Each tool targets a distinct Kubernetes resource or operation (e.g., clusterrole_create vs clusterrole_delete, pod_logs vs pod_detail). There is no ambiguity between tools as they clearly differentiate by resource and action.
Tool names mix styles: some use verb_noun (e.g., create_namespace), others use noun_verb (e.g., configmap_create). Additionally, there are inconsistencies like plural vs singular (list_namespaces vs clusterrole_list). This makes naming unpredictable.
57 tools is high for a Kubernetes MCP server. While the scope is broad, many tools are redundant or could be combined (e.g., separate add/remove label tools for namespaces and nodes). The count exceeds typical ranges, but it is still manageable.
The server covers various resources but has notable gaps: missing deployment_create and deployment_get, no pod creation, no support for common resources like HPA, NetworkPolicy, or RBAC bindings. This limits its ability to perform complete workflows.