Kubernetes Ephemeral Job MCP Server
io.github.inhuman/mcp-k8s-ephemeral-job
What is the Kubernetes Ephemeral Job MCP server?
Runs a command in a throwaway Kubernetes pod and returns exit code, output and artifacts.
How to install Kubernetes Ephemeral Job
Copy-paste configuration for popular MCP clients.
MCP_K8S_ALLOWED_IMAGESrequiredStrict image allowlist (CSV). Empty means every call is rejected, so this must be set.
MCP_K8S_KUBECONFIGPath to the kubeconfig inside the container. Empty = use in-cluster credentials.
MCP_K8S_NAMESPACENamespace the ephemeral pods are created in. Needs a Role/RoleBinding for jobs and pods.
MCP_K8S_TRANSPORTMCP transport: stdio | http | sse. Must be 'stdio' for direct docker/stdio use.
MCP_K8S_DEFAULT_TIMEOUT_SDefault wall-clock timeout per job, seconds.
MCP_K8S_MAX_TIMEOUT_SMaximum wall-clock timeout a caller may request, seconds.
MCP_K8S_MAX_OUTPUT_BYTESCap on combined stdout/stderr before truncation.
MCP_K8S_MAX_ARTIFACT_BYTESCap on the total size of returned artifacts.
MCP_K8S_MAX_CONCURRENTMaximum ephemeral pods running at the same time.
MCP_K8S_DEFAULT_CPUPod CPU request; limits come from the caller or the namespace LimitRange.
MCP_K8S_DEFAULT_MEMORYPod memory request; limits come from the caller or the namespace LimitRange.
MCP_K8S_SIDECAR_IMAGEHelper image used to inject input files and collect artifacts.
MCP_K8S_CLONE_IMAGEImage carrying git for the clone init container. Empty disables the clone field.
MCP_K8S_CLONE_SECRETsecretSecret with git tokens, mounted only on the cloner. Empty disables the clone field.
MCP_K8S_CACHE_PVCExisting PVC mounted into every job pod as a shared cache. Empty = no cache.
MCP_K8S_CACHE_MOUNT_PATHWhere the cache PVC is mounted, e.g. /go/pkg/mod. Empty = no cache.
MCP_K8S_JOB_EXTRA_ENVJSON object of env vars added to every job pod; caller keys win on collision.
MCP_K8S_AUTH_TOKENsecretOptional X-MCP-AUTH token required on every request (http/sse transports only).
{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1",
"--volume",
"{kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "<YOUR_MCP_K8S_ALLOWED_IMAGES>",
"MCP_K8S_KUBECONFIG": "<YOUR_MCP_K8S_KUBECONFIG>",
"MCP_K8S_NAMESPACE": "<YOUR_MCP_K8S_NAMESPACE>",
"MCP_K8S_TRANSPORT": "<YOUR_MCP_K8S_TRANSPORT>",
"MCP_K8S_DEFAULT_TIMEOUT_S": "<YOUR_MCP_K8S_DEFAULT_TIMEOUT_S>",
"MCP_K8S_MAX_TIMEOUT_S": "<YOUR_MCP_K8S_MAX_TIMEOUT_S>",
"MCP_K8S_MAX_OUTPUT_BYTES": "<YOUR_MCP_K8S_MAX_OUTPUT_BYTES>",
"MCP_K8S_MAX_ARTIFACT_BYTES": "<YOUR_MCP_K8S_MAX_ARTIFACT_BYTES>",
"MCP_K8S_MAX_CONCURRENT": "<YOUR_MCP_K8S_MAX_CONCURRENT>",
"MCP_K8S_DEFAULT_CPU": "<YOUR_MCP_K8S_DEFAULT_CPU>",
"MCP_K8S_DEFAULT_MEMORY": "<YOUR_MCP_K8S_DEFAULT_MEMORY>",
"MCP_K8S_SIDECAR_IMAGE": "<YOUR_MCP_K8S_SIDECAR_IMAGE>",
"MCP_K8S_CLONE_IMAGE": "<YOUR_MCP_K8S_CLONE_IMAGE>",
"MCP_K8S_CLONE_SECRET": "<YOUR_MCP_K8S_CLONE_SECRET>",
"MCP_K8S_CACHE_PVC": "<YOUR_MCP_K8S_CACHE_PVC>",
"MCP_K8S_CACHE_MOUNT_PATH": "<YOUR_MCP_K8S_CACHE_MOUNT_PATH>",
"MCP_K8S_JOB_EXTRA_ENV": "<YOUR_MCP_K8S_JOB_EXTRA_ENV>",
"MCP_K8S_AUTH_TOKEN": "<YOUR_MCP_K8S_AUTH_TOKEN>"
}
}
}
}{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1",
"--volume",
"{kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "<YOUR_MCP_K8S_ALLOWED_IMAGES>",
"MCP_K8S_KUBECONFIG": "<YOUR_MCP_K8S_KUBECONFIG>",
"MCP_K8S_NAMESPACE": "<YOUR_MCP_K8S_NAMESPACE>",
"MCP_K8S_TRANSPORT": "<YOUR_MCP_K8S_TRANSPORT>",
"MCP_K8S_DEFAULT_TIMEOUT_S": "<YOUR_MCP_K8S_DEFAULT_TIMEOUT_S>",
"MCP_K8S_MAX_TIMEOUT_S": "<YOUR_MCP_K8S_MAX_TIMEOUT_S>",
"MCP_K8S_MAX_OUTPUT_BYTES": "<YOUR_MCP_K8S_MAX_OUTPUT_BYTES>",
"MCP_K8S_MAX_ARTIFACT_BYTES": "<YOUR_MCP_K8S_MAX_ARTIFACT_BYTES>",
"MCP_K8S_MAX_CONCURRENT": "<YOUR_MCP_K8S_MAX_CONCURRENT>",
"MCP_K8S_DEFAULT_CPU": "<YOUR_MCP_K8S_DEFAULT_CPU>",
"MCP_K8S_DEFAULT_MEMORY": "<YOUR_MCP_K8S_DEFAULT_MEMORY>",
"MCP_K8S_SIDECAR_IMAGE": "<YOUR_MCP_K8S_SIDECAR_IMAGE>",
"MCP_K8S_CLONE_IMAGE": "<YOUR_MCP_K8S_CLONE_IMAGE>",
"MCP_K8S_CLONE_SECRET": "<YOUR_MCP_K8S_CLONE_SECRET>",
"MCP_K8S_CACHE_PVC": "<YOUR_MCP_K8S_CACHE_PVC>",
"MCP_K8S_CACHE_MOUNT_PATH": "<YOUR_MCP_K8S_CACHE_MOUNT_PATH>",
"MCP_K8S_JOB_EXTRA_ENV": "<YOUR_MCP_K8S_JOB_EXTRA_ENV>",
"MCP_K8S_AUTH_TOKEN": "<YOUR_MCP_K8S_AUTH_TOKEN>"
}
}
}
}{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1",
"--volume",
"{kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "<YOUR_MCP_K8S_ALLOWED_IMAGES>",
"MCP_K8S_KUBECONFIG": "<YOUR_MCP_K8S_KUBECONFIG>",
"MCP_K8S_NAMESPACE": "<YOUR_MCP_K8S_NAMESPACE>",
"MCP_K8S_TRANSPORT": "<YOUR_MCP_K8S_TRANSPORT>",
"MCP_K8S_DEFAULT_TIMEOUT_S": "<YOUR_MCP_K8S_DEFAULT_TIMEOUT_S>",
"MCP_K8S_MAX_TIMEOUT_S": "<YOUR_MCP_K8S_MAX_TIMEOUT_S>",
"MCP_K8S_MAX_OUTPUT_BYTES": "<YOUR_MCP_K8S_MAX_OUTPUT_BYTES>",
"MCP_K8S_MAX_ARTIFACT_BYTES": "<YOUR_MCP_K8S_MAX_ARTIFACT_BYTES>",
"MCP_K8S_MAX_CONCURRENT": "<YOUR_MCP_K8S_MAX_CONCURRENT>",
"MCP_K8S_DEFAULT_CPU": "<YOUR_MCP_K8S_DEFAULT_CPU>",
"MCP_K8S_DEFAULT_MEMORY": "<YOUR_MCP_K8S_DEFAULT_MEMORY>",
"MCP_K8S_SIDECAR_IMAGE": "<YOUR_MCP_K8S_SIDECAR_IMAGE>",
"MCP_K8S_CLONE_IMAGE": "<YOUR_MCP_K8S_CLONE_IMAGE>",
"MCP_K8S_CLONE_SECRET": "<YOUR_MCP_K8S_CLONE_SECRET>",
"MCP_K8S_CACHE_PVC": "<YOUR_MCP_K8S_CACHE_PVC>",
"MCP_K8S_CACHE_MOUNT_PATH": "<YOUR_MCP_K8S_CACHE_MOUNT_PATH>",
"MCP_K8S_JOB_EXTRA_ENV": "<YOUR_MCP_K8S_JOB_EXTRA_ENV>",
"MCP_K8S_AUTH_TOKEN": "<YOUR_MCP_K8S_AUTH_TOKEN>"
}
}
}
}{
"servers": {
"mcp-k8s-ephemeral-job": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1",
"--volume",
"{kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "<YOUR_MCP_K8S_ALLOWED_IMAGES>",
"MCP_K8S_KUBECONFIG": "<YOUR_MCP_K8S_KUBECONFIG>",
"MCP_K8S_NAMESPACE": "<YOUR_MCP_K8S_NAMESPACE>",
"MCP_K8S_TRANSPORT": "<YOUR_MCP_K8S_TRANSPORT>",
"MCP_K8S_DEFAULT_TIMEOUT_S": "<YOUR_MCP_K8S_DEFAULT_TIMEOUT_S>",
"MCP_K8S_MAX_TIMEOUT_S": "<YOUR_MCP_K8S_MAX_TIMEOUT_S>",
"MCP_K8S_MAX_OUTPUT_BYTES": "<YOUR_MCP_K8S_MAX_OUTPUT_BYTES>",
"MCP_K8S_MAX_ARTIFACT_BYTES": "<YOUR_MCP_K8S_MAX_ARTIFACT_BYTES>",
"MCP_K8S_MAX_CONCURRENT": "<YOUR_MCP_K8S_MAX_CONCURRENT>",
"MCP_K8S_DEFAULT_CPU": "<YOUR_MCP_K8S_DEFAULT_CPU>",
"MCP_K8S_DEFAULT_MEMORY": "<YOUR_MCP_K8S_DEFAULT_MEMORY>",
"MCP_K8S_SIDECAR_IMAGE": "<YOUR_MCP_K8S_SIDECAR_IMAGE>",
"MCP_K8S_CLONE_IMAGE": "<YOUR_MCP_K8S_CLONE_IMAGE>",
"MCP_K8S_CLONE_SECRET": "<YOUR_MCP_K8S_CLONE_SECRET>",
"MCP_K8S_CACHE_PVC": "<YOUR_MCP_K8S_CACHE_PVC>",
"MCP_K8S_CACHE_MOUNT_PATH": "<YOUR_MCP_K8S_CACHE_MOUNT_PATH>",
"MCP_K8S_JOB_EXTRA_ENV": "<YOUR_MCP_K8S_JOB_EXTRA_ENV>",
"MCP_K8S_AUTH_TOKEN": "<YOUR_MCP_K8S_AUTH_TOKEN>"
}
}
}
}claude mcp add mcp-k8s-ephemeral-job --env MCP_K8S_ALLOWED_IMAGES=<YOUR_MCP_K8S_ALLOWED_IMAGES> --env MCP_K8S_KUBECONFIG=<YOUR_MCP_K8S_KUBECONFIG> --env MCP_K8S_NAMESPACE=<YOUR_MCP_K8S_NAMESPACE> --env MCP_K8S_TRANSPORT=<YOUR_MCP_K8S_TRANSPORT> --env MCP_K8S_DEFAULT_TIMEOUT_S=<YOUR_MCP_K8S_DEFAULT_TIMEOUT_S> --env MCP_K8S_MAX_TIMEOUT_S=<YOUR_MCP_K8S_MAX_TIMEOUT_S> --env MCP_K8S_MAX_OUTPUT_BYTES=<YOUR_MCP_K8S_MAX_OUTPUT_BYTES> --env MCP_K8S_MAX_ARTIFACT_BYTES=<YOUR_MCP_K8S_MAX_ARTIFACT_BYTES> --env MCP_K8S_MAX_CONCURRENT=<YOUR_MCP_K8S_MAX_CONCURRENT> --env MCP_K8S_DEFAULT_CPU=<YOUR_MCP_K8S_DEFAULT_CPU> --env MCP_K8S_DEFAULT_MEMORY=<YOUR_MCP_K8S_DEFAULT_MEMORY> --env MCP_K8S_SIDECAR_IMAGE=<YOUR_MCP_K8S_SIDECAR_IMAGE> --env MCP_K8S_CLONE_IMAGE=<YOUR_MCP_K8S_CLONE_IMAGE> --env MCP_K8S_CLONE_SECRET=<YOUR_MCP_K8S_CLONE_SECRET> --env MCP_K8S_CACHE_PVC=<YOUR_MCP_K8S_CACHE_PVC> --env MCP_K8S_CACHE_MOUNT_PATH=<YOUR_MCP_K8S_CACHE_MOUNT_PATH> --env MCP_K8S_JOB_EXTRA_ENV=<YOUR_MCP_K8S_JOB_EXTRA_ENV> --env MCP_K8S_AUTH_TOKEN=<YOUR_MCP_K8S_AUTH_TOKEN> -- docker run -i --rm docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1 --volume {kubeconfig_dir}:/kube:ro --read-only --cap-drop ALL --security-opt no-new-privileges --memory 256mRelated MCP servers
Exec Sandbox
Single exec tool running caller Python in a network-isolated locked-down sandbox.
SSH Fleet
Curated ssh_probe diagnostics and single-host ssh_exec over an allowlisted SSH fleet.