PluginBench
MCP Server
Maintained
MIT

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.

transport: stdio
Config generated by PluginBench — verify against the source before use.
Environment / auth
  • MCP_K8S_ALLOWED_IMAGES
    required

    Strict image allowlist (CSV). Empty means every call is rejected, so this must be set.

  • MCP_K8S_KUBECONFIG

    Path to the kubeconfig inside the container. Empty = use in-cluster credentials.

  • MCP_K8S_NAMESPACE

    Namespace the ephemeral pods are created in. Needs a Role/RoleBinding for jobs and pods.

  • MCP_K8S_TRANSPORT

    MCP transport: stdio | http | sse. Must be 'stdio' for direct docker/stdio use.

  • MCP_K8S_DEFAULT_TIMEOUT_S

    Default wall-clock timeout per job, seconds.

  • MCP_K8S_MAX_TIMEOUT_S

    Maximum wall-clock timeout a caller may request, seconds.

  • MCP_K8S_MAX_OUTPUT_BYTES

    Cap on combined stdout/stderr before truncation.

  • MCP_K8S_MAX_ARTIFACT_BYTES

    Cap on the total size of returned artifacts.

  • MCP_K8S_MAX_CONCURRENT

    Maximum ephemeral pods running at the same time.

  • MCP_K8S_DEFAULT_CPU

    Pod CPU request; limits come from the caller or the namespace LimitRange.

  • MCP_K8S_DEFAULT_MEMORY

    Pod memory request; limits come from the caller or the namespace LimitRange.

  • MCP_K8S_SIDECAR_IMAGE

    Helper image used to inject input files and collect artifacts.

  • MCP_K8S_CLONE_IMAGE

    Image carrying git for the clone init container. Empty disables the clone field.

  • MCP_K8S_CLONE_SECRET
    secret

    Secret with git tokens, mounted only on the cloner. Empty disables the clone field.

  • MCP_K8S_CACHE_PVC

    Existing PVC mounted into every job pod as a shared cache. Empty = no cache.

  • MCP_K8S_CACHE_MOUNT_PATH

    Where the cache PVC is mounted, e.g. /go/pkg/mod. Empty = no cache.

  • MCP_K8S_JOB_EXTRA_ENV

    JSON object of env vars added to every job pod; caller keys win on collision.

  • MCP_K8S_AUTH_TOKEN
    secret

    Optional X-MCP-AUTH token required on every request (http/sse transports only).

Claude Desktop
~/Library/Application Support/Claude/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",
        "--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>"
      }
    }
  }
}
Cursor
~/.cursor/mcp.json
{
  "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>"
      }
    }
  }
}
Windsurf
~/.codeium/windsurf/mcp_config.json
{
  "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>"
      }
    }
  }
}
VS Code
.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",
        "--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 Code
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 256m

Related MCP servers

Exec Sandbox

Maintained

Single exec tool running caller Python in a network-isolated locked-down sandbox.

1
Go
MIT
View repository →

SSH Fleet

Maintained

Curated ssh_probe diagnostics and single-host ssh_exec over an allowlisted SSH fleet.

0
Go
MIT
View repository →