NestDaddy

Kubernetes Ephemeral Job

io.github.inhuman/mcp-k8s-ephemeral-job ยท v0.7.1

Runs a command in a throwaway Kubernetes pod and returns exit code, output and artifacts.

Connect Runs on your machine

Terminal
claude mcp add mcp-k8s-ephemeral-job -e MCP_K8S_ALLOWED_IMAGES=<MCP_K8S_ALLOWED_IMAGES> -e MCP_K8S_KUBECONFIG=<MCP_K8S_KUBECONFIG> -e MCP_K8S_NAMESPACE=<MCP_K8S_NAMESPACE> -e MCP_K8S_TRANSPORT=<MCP_K8S_TRANSPORT> -e MCP_K8S_DEFAULT_TIMEOUT_S=<MCP_K8S_DEFAULT_TIMEOUT_S> -e MCP_K8S_MAX_TIMEOUT_S=<MCP_K8S_MAX_TIMEOUT_S> -e MCP_K8S_MAX_OUTPUT_BYTES=<MCP_K8S_MAX_OUTPUT_BYTES> -e MCP_K8S_MAX_ARTIFACT_BYTES=<MCP_K8S_MAX_ARTIFACT_BYTES> -e MCP_K8S_MAX_CONCURRENT=<MCP_K8S_MAX_CONCURRENT> -e MCP_K8S_DEFAULT_CPU=<MCP_K8S_DEFAULT_CPU> -e MCP_K8S_DEFAULT_MEMORY=<MCP_K8S_DEFAULT_MEMORY> -e MCP_K8S_SIDECAR_IMAGE=<MCP_K8S_SIDECAR_IMAGE> -e MCP_K8S_CLONE_IMAGE=<MCP_K8S_CLONE_IMAGE> -e MCP_K8S_CLONE_SECRET=<MCP_K8S_CLONE_SECRET> -e MCP_K8S_CACHE_PVC=<MCP_K8S_CACHE_PVC> -e MCP_K8S_CACHE_MOUNT_PATH=<MCP_K8S_CACHE_MOUNT_PATH> -e MCP_K8S_JOB_EXTRA_ENV=<MCP_K8S_JOB_EXTRA_ENV> -e MCP_K8S_AUTH_TOKEN=<MCP_K8S_AUTH_TOKEN> -- docker run -i --rm docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1
claude_desktop_config.json
{
  "mcpServers": {
    "mcp-k8s-ephemeral-job": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
      ],
      "env": {
        "MCP_K8S_ALLOWED_IMAGES": "<MCP_K8S_ALLOWED_IMAGES>",
        "MCP_K8S_KUBECONFIG": "<MCP_K8S_KUBECONFIG>",
        "MCP_K8S_NAMESPACE": "<MCP_K8S_NAMESPACE>",
        "MCP_K8S_TRANSPORT": "<MCP_K8S_TRANSPORT>",
        "MCP_K8S_DEFAULT_TIMEOUT_S": "<MCP_K8S_DEFAULT_TIMEOUT_S>",
        "MCP_K8S_MAX_TIMEOUT_S": "<MCP_K8S_MAX_TIMEOUT_S>",
        "MCP_K8S_MAX_OUTPUT_BYTES": "<MCP_K8S_MAX_OUTPUT_BYTES>",
        "MCP_K8S_MAX_ARTIFACT_BYTES": "<MCP_K8S_MAX_ARTIFACT_BYTES>",
        "MCP_K8S_MAX_CONCURRENT": "<MCP_K8S_MAX_CONCURRENT>",
        "MCP_K8S_DEFAULT_CPU": "<MCP_K8S_DEFAULT_CPU>",
        "MCP_K8S_DEFAULT_MEMORY": "<MCP_K8S_DEFAULT_MEMORY>",
        "MCP_K8S_SIDECAR_IMAGE": "<MCP_K8S_SIDECAR_IMAGE>",
        "MCP_K8S_CLONE_IMAGE": "<MCP_K8S_CLONE_IMAGE>",
        "MCP_K8S_CLONE_SECRET": "<MCP_K8S_CLONE_SECRET>",
        "MCP_K8S_CACHE_PVC": "<MCP_K8S_CACHE_PVC>",
        "MCP_K8S_CACHE_MOUNT_PATH": "<MCP_K8S_CACHE_MOUNT_PATH>",
        "MCP_K8S_JOB_EXTRA_ENV": "<MCP_K8S_JOB_EXTRA_ENV>",
        "MCP_K8S_AUTH_TOKEN": "<MCP_K8S_AUTH_TOKEN>"
      }
    }
  }
}
~/.cursor/mcp.json
{
  "mcpServers": {
    "mcp-k8s-ephemeral-job": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
      ],
      "env": {
        "MCP_K8S_ALLOWED_IMAGES": "<MCP_K8S_ALLOWED_IMAGES>",
        "MCP_K8S_KUBECONFIG": "<MCP_K8S_KUBECONFIG>",
        "MCP_K8S_NAMESPACE": "<MCP_K8S_NAMESPACE>",
        "MCP_K8S_TRANSPORT": "<MCP_K8S_TRANSPORT>",
        "MCP_K8S_DEFAULT_TIMEOUT_S": "<MCP_K8S_DEFAULT_TIMEOUT_S>",
        "MCP_K8S_MAX_TIMEOUT_S": "<MCP_K8S_MAX_TIMEOUT_S>",
        "MCP_K8S_MAX_OUTPUT_BYTES": "<MCP_K8S_MAX_OUTPUT_BYTES>",
        "MCP_K8S_MAX_ARTIFACT_BYTES": "<MCP_K8S_MAX_ARTIFACT_BYTES>",
        "MCP_K8S_MAX_CONCURRENT": "<MCP_K8S_MAX_CONCURRENT>",
        "MCP_K8S_DEFAULT_CPU": "<MCP_K8S_DEFAULT_CPU>",
        "MCP_K8S_DEFAULT_MEMORY": "<MCP_K8S_DEFAULT_MEMORY>",
        "MCP_K8S_SIDECAR_IMAGE": "<MCP_K8S_SIDECAR_IMAGE>",
        "MCP_K8S_CLONE_IMAGE": "<MCP_K8S_CLONE_IMAGE>",
        "MCP_K8S_CLONE_SECRET": "<MCP_K8S_CLONE_SECRET>",
        "MCP_K8S_CACHE_PVC": "<MCP_K8S_CACHE_PVC>",
        "MCP_K8S_CACHE_MOUNT_PATH": "<MCP_K8S_CACHE_MOUNT_PATH>",
        "MCP_K8S_JOB_EXTRA_ENV": "<MCP_K8S_JOB_EXTRA_ENV>",
        "MCP_K8S_AUTH_TOKEN": "<MCP_K8S_AUTH_TOKEN>"
      }
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "mcp-k8s-ephemeral-job": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
      ],
      "env": {
        "MCP_K8S_ALLOWED_IMAGES": "<MCP_K8S_ALLOWED_IMAGES>",
        "MCP_K8S_KUBECONFIG": "<MCP_K8S_KUBECONFIG>",
        "MCP_K8S_NAMESPACE": "<MCP_K8S_NAMESPACE>",
        "MCP_K8S_TRANSPORT": "<MCP_K8S_TRANSPORT>",
        "MCP_K8S_DEFAULT_TIMEOUT_S": "<MCP_K8S_DEFAULT_TIMEOUT_S>",
        "MCP_K8S_MAX_TIMEOUT_S": "<MCP_K8S_MAX_TIMEOUT_S>",
        "MCP_K8S_MAX_OUTPUT_BYTES": "<MCP_K8S_MAX_OUTPUT_BYTES>",
        "MCP_K8S_MAX_ARTIFACT_BYTES": "<MCP_K8S_MAX_ARTIFACT_BYTES>",
        "MCP_K8S_MAX_CONCURRENT": "<MCP_K8S_MAX_CONCURRENT>",
        "MCP_K8S_DEFAULT_CPU": "<MCP_K8S_DEFAULT_CPU>",
        "MCP_K8S_DEFAULT_MEMORY": "<MCP_K8S_DEFAULT_MEMORY>",
        "MCP_K8S_SIDECAR_IMAGE": "<MCP_K8S_SIDECAR_IMAGE>",
        "MCP_K8S_CLONE_IMAGE": "<MCP_K8S_CLONE_IMAGE>",
        "MCP_K8S_CLONE_SECRET": "<MCP_K8S_CLONE_SECRET>",
        "MCP_K8S_CACHE_PVC": "<MCP_K8S_CACHE_PVC>",
        "MCP_K8S_CACHE_MOUNT_PATH": "<MCP_K8S_CACHE_MOUNT_PATH>",
        "MCP_K8S_JOB_EXTRA_ENV": "<MCP_K8S_JOB_EXTRA_ENV>",
        "MCP_K8S_AUTH_TOKEN": "<MCP_K8S_AUTH_TOKEN>"
      }
    }
  }
}

Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.

Tools

This server runs locally, so its tools are listed by your MCP client once it starts.

Environment variables

NameDescription
MCP_K8S_ALLOWED_IMAGES
Required
Strict image allowlist (CSV). Empty means every call is rejected, so this must be set.
MCP_K8S_KUBECONFIG
Optional
Path to the kubeconfig inside the container. Empty = use in-cluster credentials.
MCP_K8S_NAMESPACE
Optional
Namespace the ephemeral pods are created in. Needs a Role/RoleBinding for jobs and pods.
MCP_K8S_TRANSPORT
Optional
MCP transport: stdio | http | sse. Must be 'stdio' for direct docker/stdio use.
MCP_K8S_DEFAULT_TIMEOUT_S
Optional
Default wall-clock timeout per job, seconds.
MCP_K8S_MAX_TIMEOUT_S
Optional
Maximum wall-clock timeout a caller may request, seconds.
MCP_K8S_MAX_OUTPUT_BYTES
Optional
Cap on combined stdout/stderr before truncation.
MCP_K8S_MAX_ARTIFACT_BYTES
Optional
Cap on the total size of returned artifacts.
MCP_K8S_MAX_CONCURRENT
Optional
Maximum ephemeral pods running at the same time.
MCP_K8S_DEFAULT_CPU
Optional
Pod CPU request; limits come from the caller or the namespace LimitRange.
MCP_K8S_DEFAULT_MEMORY
Optional
Pod memory request; limits come from the caller or the namespace LimitRange.
MCP_K8S_SIDECAR_IMAGE
Optional
Helper image used to inject input files and collect artifacts.
MCP_K8S_CLONE_IMAGE
Optional
Image carrying git for the clone init container. Empty disables the clone field.
MCP_K8S_CLONE_SECRET
Optional, secret
Secret with git tokens, mounted only on the cloner. Empty disables the clone field.
MCP_K8S_CACHE_PVC
Optional
Existing PVC mounted into every job pod as a shared cache. Empty = no cache.
MCP_K8S_CACHE_MOUNT_PATH
Optional
Where the cache PVC is mounted, e.g. /go/pkg/mod. Empty = no cache.
MCP_K8S_JOB_EXTRA_ENV
Optional
JSON object of env vars added to every job pod; caller keys win on collision.
MCP_K8S_AUTH_TOKEN
Optional, secret
Optional X-MCP-AUTH token required on every request (http/sse transports only).

Details

Packagedocker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1 (OCI, stdio)
First published20 Jul 2026
Last updated20 Jul 2026
Registry nameio.github.inhuman/mcp-k8s-ephemeral-job

More cloud and devops servers See all

Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.