mcp-k8s-deployer
Provides tools to generate cloudflared tunnel target endpoints for exposing deployed services via Cloudflare tunnels.
Enables dynamic deployment of containerized applications to a Kubernetes cluster, including storage resolution, manifest generation, dry-run planning, and applying changes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-k8s-deployerdeploy nginx:latest with 2 replicas on port 80"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-k8s-deployer
A production-ready Model Context Protocol (MCP) server that empowers LLMs to dynamically orchestrate containerized application deployments to a Kubernetes cluster.
It handles configuration validation, interactive storage resolution, multi-resource manifest generation (Namespace, PersistentVolumeClaim, Deployment, Service), dry-run plan reviews, actual apply actions, and service endpoint extraction optimized for cloudflared tunnel routing.
Features
Interactive Storage Resolution: Dynamically checks whether to create a new PVC, bind to an existing PV, or prompt the user for more details depending on whether the StorageClass matches the cluster's default NFS setup.
Strict Input Validation: Enforces RFC 1123 compliant naming for apps, namespaces, and StorageClasses, validates port ranges, replicas, image tags, and Kubernetes storage sizes (e.g.
10Gi).Dry-run Planning & Actual Applying: Exposes separate planning (
plan_deployment) and apply (apply_deployment) stages. Planning runs a Kubernetes server-side dry-run to catch configuration errors before changes are committed.Enforced Review Step: The
apply_deploymenttool requires an explicitapproved=Trueparameter to enforce user verification of planned changes.Tunnel Mapping Helpers: Auto-formats endpoints to seamlessly configure public subdomains with
cloudflaredtunnels.
Related MCP server: Kube MCP
Prerequisites
Python: Version 3.10 or higher.
Kubernetes Cluster: Access to a running cluster (e.g., k3s, minikube, GKE, EKS) with cluster credentials.
Credentials: A valid kubeconfig file (defaults to
~/.kube/config).
Installation
From PyPI (recommended)
pip install mcp-k8s-deployerFrom source
git clone https://github.com/stwins60/mcp-k8s-deployer.git
cd mcp-k8s-deployer
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtVerify installation
python3 -m pytest -vConfiguration
The server supports configuration through environment variables or a YAML configuration file.
Environment Variables
Variable | Description | Default |
| Logging level ( |
|
| StorageClass name treated as default NFS-backed storage |
|
| Comma-separated list of allowed namespaces. If empty, all are allowed. |
|
| Path to the active cluster kubeconfig file |
|
| Default pod replicas count if unspecified |
|
| Default service port if unspecified |
|
| Default persistent volume size |
|
YAML Configuration File
Create a config.yaml file in the root of the project (or store it in /etc/mcp-k8s/config.yaml):
logging:
level: "INFO"
kubernetes:
kubeconfig_path: "" # Empty uses default ~/.kube/config
default_nfs_storage_class: "nfs"
allowed_namespaces: []
defaults:
replicas: 1
container_port: 80
storage_size: "10Gi"Exposed MCP Tools
1. choose_storage_option_tool
Assesses storage configuration based on StorageClass and PV requirements.
Arguments:
storage_class(str, required): The target storage class name (e.g.nfs,local-path).has_existing_pv(bool, required): Whether the user has an existing PersistentVolume (PV) created.existing_pv_name(str, optional): The name of the existing PV to bind statically.storage_size(str, optional): Desired disk size (e.g.5Gi).default_nfs_class(str, optional): Override the default NFS storage class config.
Returns: A JSON dictionary advising on PVC generation, PV binding, or actions required.
2. deploy_app_tool
Gathers configurations, validates inputs, and generates Kubernetes manifests in YAML format.
Arguments:
app_name(str, required)image(str, required)container_port(int, required)replicas(int, optional)namespace(str, optional)use_persistence(bool, optional)storage_class(str, optional)storage_size(str, optional)existing_pv_name(str, optional)env_vars(dict, optional)hostname(str, optional)
Returns: A multi-document YAML string representing the Namespace, PVC, Deployment, and Service.
3. plan_deployment_tool
Validates inputs, generates manifests, and runs a server-side dry-run apply against the cluster.
Arguments: Same as
deploy_app_tool.Returns: The generated manifests, dry-run actions list (e.g.,
Created,Patched), and validation status.
4. apply_deployment_tool
Applies approved manifests to the Kubernetes cluster.
Arguments:
manifests(str, required): The generated YAML manifests.approved(bool, required): Must be set toTrueto confirm.
Returns: Success status and array of resources created or patched.
5. create_namespace_tool
Creates a namespace if it doesn't already exist.
Arguments:
namespace(str, required)dry_run(bool, optional)
6. get_service_endpoint_tool
Computes the internal cluster Service DNS endpoint.
Arguments:
app_name(str),namespace(str),container_port(int).Returns: The service URL (e.g.
http://app.namespace.svc.cluster.local:80).
7. build_cloudflared_target_tool
Generates the exact target string to paste into a cloudflared tunnel mapping configuration.
Arguments:
app_name(str),namespace(str),container_port(int).
Claude Desktop Integration
Using the pip-installed package
Add the following to your Claude Desktop config (~/.config/Claude/claude_desktop_config.json on Linux):
{
"mcpServers": {
"kubernetes-deployer": {
"command": "mcp-k8s-deployer",
"env": {
"MCP_K8S_DEFAULT_NFS_STORAGE_CLASS": "nfs",
"MCP_K8S_LOG_LEVEL": "INFO"
}
}
}
}Using a local source checkout
{
"mcpServers": {
"kubernetes-deployer": {
"command": "/path/to/.venv/bin/python3",
"args": [
"/path/to/mcp-k8s-deployer/src/server.py"
],
"env": {
"MCP_K8S_DEFAULT_NFS_STORAGE_CLASS": "nfs",
"MCP_K8S_LOG_LEVEL": "INFO"
}
}
}
}Transport Selection (Stdio vs SSE)
By default, the server runs over standard input/output (stdio) transport, suitable for local integrations like Claude Desktop.
Running over Stdio (default)
python3 src/server.py --transport stdioRunning over SSE (HTTP web server)
python3 src/server.py --transport sse --host 0.0.0.0 --port 8000Or use environment variables:
export MCP_TRANSPORT=sse
export MCP_PORT=8000
python3 src/server.pyThe MCP endpoint will be accessible at http://<your-host>:8000/sse.
Typical Execution Flow
User Request: "Deploy my Node.js app
auth-serviceusingnode:18in thedevnamespace. It needs 5Gi of gp2 storage."Storage Decision: The LLM calls
choose_storage_option_tool(storage_class="gp2", has_existing_pv=False, storage_size="5Gi").Storage Advice: The server advises that
gp2is non-default and will rely on dynamic provisioning. The LLM presents this to the user.Planning: The user confirms. The LLM calls
plan_deployment_tool(...), which returns the planned resources and dry-run status.Confirmation: The LLM presents the YAML manifests for user review.
Execution: The user confirms. The LLM calls
apply_deployment_tool(manifests="...", approved=True).Mapping: The LLM calls
build_cloudflared_target_tool(...)and prints the Cloudflare Tunnel ingress target (e.g.,http://auth-service.dev.svc.cluster.local:80).
Distribution
PyPI
The package is published to PyPI automatically via GitHub Actions on every new GitHub Release using OIDC trusted publishing — no API tokens required.
To release a new version:
Update
versioninpyproject.tomlCommit and push to
masterCreate a new GitHub Release with a version tag (e.g.,
v1.0.1)
The workflow at .github/workflows/publish.yml will build and upload to PyPI automatically.
Docker
# Build the container image
docker build -t your-dockerhub-username/mcp-k8s-deployer:latest .
# Push to Docker Hub
docker push your-dockerhub-username/mcp-k8s-deployer:latestDocker Compose & Cloudflare Tunnel
Create a
.envfile with your Cloudflare token:CLOUDFLARE_TUNNEL_TOKEN=your_cloudflare_tunnel_token_hereStart the services:
docker compose up -dIn your Cloudflare Zero Trust Dashboard, configure a Public Hostname:
Domain:
mcp.yourdomain.comService Type:
HTTPURL:
mcp-server:8000
Your MCP server will be accessible at https://mcp.yourdomain.com/sse.
Links
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP-Native LLM Orchestration Agent
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Fail-closed policy guardrails for AI agents running kubectl, terraform, helm, and argocd.
Build, validate, and deploy multi-agent AI solutions from any AI environment.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLMs like Claude to securely execute Kubernetes CLI tools (kubectl, helm, istioctl, argocd) across multiple clusters through dynamic kubeconfig support, allowing natural language Kubernetes management and operations.5MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with and manage Kubernetes clusters, supporting operations on pods, deployments, services, configmaps, secrets, namespaces, metrics, and events with built-in safety features for destructive actions.95 npm1MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to interact with Kubernetes clusters through 50 specialized tools for comprehensive cluster management. Supports both local kubectl and remote SSH-based execution for managing pods, deployments, services, and other Kubernetes resources.49MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to manage Docker containers and Kubernetes resources through natural language, supporting operations like container management, image building, and pod/deployment/service management.9MIT