Search / io.github.inhuman/mcp-k8s-ephemeral-job
Kubernetes Ephemeral Job
L0· runs locallyRuns a command in a throwaway Kubernetes pod and returns exit code, output and artifacts.
v0.7.1 · active · repository · descriptor JSON · versions
Search / io.github.inhuman/mcp-k8s-ephemeral-job
L0· runs locallyRuns a command in a throwaway Kubernetes pod and returns exit code, output and artifacts.
v0.7.1 · active · repository · descriptor JSON · versions
{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"--volume",
"${kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m",
"-e",
"MCP_K8S_ALLOWED_IMAGES",
"-e",
"MCP_K8S_KUBECONFIG",
"-e",
"MCP_K8S_NAMESPACE",
"-e",
"MCP_K8S_TRANSPORT",
"-e",
"MCP_K8S_DEFAULT_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_OUTPUT_BYTES",
"-e",
"MCP_K8S_MAX_ARTIFACT_BYTES",
"-e",
"MCP_K8S_MAX_CONCURRENT",
"-e",
"MCP_K8S_DEFAULT_CPU",
"-e",
"MCP_K8S_DEFAULT_MEMORY",
"-e",
"MCP_K8S_SIDECAR_IMAGE",
"-e",
"MCP_K8S_CLONE_SECRET",
"-e",
"MCP_K8S_AUTH_TOKEN",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "${MCP_K8S_ALLOWED_IMAGES}",
"MCP_K8S_KUBECONFIG": "/kube/config",
"MCP_K8S_NAMESPACE": "mcp-ephemeral",
"MCP_K8S_TRANSPORT": "stdio",
"MCP_K8S_DEFAULT_TIMEOUT_S": "60",
"MCP_K8S_MAX_TIMEOUT_S": "600",
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576",
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760",
"MCP_K8S_MAX_CONCURRENT": "10",
"MCP_K8S_DEFAULT_CPU": "1",
"MCP_K8S_DEFAULT_MEMORY": "512Mi",
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36",
"MCP_K8S_CLONE_SECRET": "${MCP_K8S_CLONE_SECRET}",
"MCP_K8S_AUTH_TOKEN": "${MCP_K8S_AUTH_TOKEN}"
}
}
}
}claude mcp add mcp-k8s-ephemeral-job -e "MCP_K8S_ALLOWED_IMAGES=${MCP_K8S_ALLOWED_IMAGES}" -e "MCP_K8S_KUBECONFIG=/kube/config" -e "MCP_K8S_NAMESPACE=mcp-ephemeral" -e "MCP_K8S_TRANSPORT=stdio" -e "MCP_K8S_DEFAULT_TIMEOUT_S=60" -e "MCP_K8S_MAX_TIMEOUT_S=600" -e "MCP_K8S_MAX_OUTPUT_BYTES=1048576" -e "MCP_K8S_MAX_ARTIFACT_BYTES=10485760" -e "MCP_K8S_MAX_CONCURRENT=10" -e "MCP_K8S_DEFAULT_CPU=1" -e "MCP_K8S_DEFAULT_MEMORY=512Mi" -e "MCP_K8S_SIDECAR_IMAGE=busybox:1.36" -e "MCP_K8S_CLONE_SECRET=${MCP_K8S_CLONE_SECRET}" -e "MCP_K8S_AUTH_TOKEN=${MCP_K8S_AUTH_TOKEN}" -- docker --volume "${kubeconfig_dir}:/kube:ro" --read-only --cap-drop ALL --security-opt no-new-privileges --memory 256m -e MCP_K8S_ALLOWED_IMAGES -e MCP_K8S_KUBECONFIG -e MCP_K8S_NAMESPACE -e MCP_K8S_TRANSPORT -e MCP_K8S_DEFAULT_TIMEOUT_S -e MCP_K8S_MAX_TIMEOUT_S -e MCP_K8S_MAX_OUTPUT_BYTES -e MCP_K8S_MAX_ARTIFACT_BYTES -e MCP_K8S_MAX_CONCURRENT -e MCP_K8S_DEFAULT_CPU -e MCP_K8S_DEFAULT_MEMORY -e MCP_K8S_SIDECAR_IMAGE -e MCP_K8S_CLONE_SECRET -e MCP_K8S_AUTH_TOKEN docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1[mcp_servers.mcp-k8s-ephemeral-job]
command = "docker"
args = ["--volume", "${kubeconfig_dir}:/kube:ro", "--read-only", "--cap-drop", "ALL", "--security-opt", "no-new-privileges", "--memory", "256m", "-e", "MCP_K8S_ALLOWED_IMAGES", "-e", "MCP_K8S_KUBECONFIG", "-e", "MCP_K8S_NAMESPACE", "-e", "MCP_K8S_TRANSPORT", "-e", "MCP_K8S_DEFAULT_TIMEOUT_S", "-e", "MCP_K8S_MAX_TIMEOUT_S", "-e", "MCP_K8S_MAX_OUTPUT_BYTES", "-e", "MCP_K8S_MAX_ARTIFACT_BYTES", "-e", "MCP_K8S_MAX_CONCURRENT", "-e", "MCP_K8S_DEFAULT_CPU", "-e", "MCP_K8S_DEFAULT_MEMORY", "-e", "MCP_K8S_SIDECAR_IMAGE", "-e", "MCP_K8S_CLONE_SECRET", "-e", "MCP_K8S_AUTH_TOKEN", "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"]
env = { "MCP_K8S_ALLOWED_IMAGES" = "${MCP_K8S_ALLOWED_IMAGES}", "MCP_K8S_KUBECONFIG" = "/kube/config", "MCP_K8S_NAMESPACE" = "mcp-ephemeral", "MCP_K8S_TRANSPORT" = "stdio", "MCP_K8S_DEFAULT_TIMEOUT_S" = "60", "MCP_K8S_MAX_TIMEOUT_S" = "600", "MCP_K8S_MAX_OUTPUT_BYTES" = "1048576", "MCP_K8S_MAX_ARTIFACT_BYTES" = "10485760", "MCP_K8S_MAX_CONCURRENT" = "10", "MCP_K8S_DEFAULT_CPU" = "1", "MCP_K8S_DEFAULT_MEMORY" = "512Mi", "MCP_K8S_SIDECAR_IMAGE" = "busybox:1.36", "MCP_K8S_CLONE_SECRET" = "${MCP_K8S_CLONE_SECRET}", "MCP_K8S_AUTH_TOKEN" = "${MCP_K8S_AUTH_TOKEN}" }
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mcp-k8s-ephemeral-job": {
"type": "local",
"command": [
"docker",
"--volume",
"{env:kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m",
"-e",
"MCP_K8S_ALLOWED_IMAGES",
"-e",
"MCP_K8S_KUBECONFIG",
"-e",
"MCP_K8S_NAMESPACE",
"-e",
"MCP_K8S_TRANSPORT",
"-e",
"MCP_K8S_DEFAULT_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_OUTPUT_BYTES",
"-e",
"MCP_K8S_MAX_ARTIFACT_BYTES",
"-e",
"MCP_K8S_MAX_CONCURRENT",
"-e",
"MCP_K8S_DEFAULT_CPU",
"-e",
"MCP_K8S_DEFAULT_MEMORY",
"-e",
"MCP_K8S_SIDECAR_IMAGE",
"-e",
"MCP_K8S_CLONE_SECRET",
"-e",
"MCP_K8S_AUTH_TOKEN",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
],
"enabled": true,
"environment": {
"MCP_K8S_ALLOWED_IMAGES": "{env:MCP_K8S_ALLOWED_IMAGES}",
"MCP_K8S_KUBECONFIG": "/kube/config",
"MCP_K8S_NAMESPACE": "mcp-ephemeral",
"MCP_K8S_TRANSPORT": "stdio",
"MCP_K8S_DEFAULT_TIMEOUT_S": "60",
"MCP_K8S_MAX_TIMEOUT_S": "600",
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576",
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760",
"MCP_K8S_MAX_CONCURRENT": "10",
"MCP_K8S_DEFAULT_CPU": "1",
"MCP_K8S_DEFAULT_MEMORY": "512Mi",
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36",
"MCP_K8S_CLONE_SECRET": "{env:MCP_K8S_CLONE_SECRET}",
"MCP_K8S_AUTH_TOKEN": "{env:MCP_K8S_AUTH_TOKEN}"
}
}
}
}{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"--volume",
"${kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m",
"-e",
"MCP_K8S_ALLOWED_IMAGES",
"-e",
"MCP_K8S_KUBECONFIG",
"-e",
"MCP_K8S_NAMESPACE",
"-e",
"MCP_K8S_TRANSPORT",
"-e",
"MCP_K8S_DEFAULT_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_OUTPUT_BYTES",
"-e",
"MCP_K8S_MAX_ARTIFACT_BYTES",
"-e",
"MCP_K8S_MAX_CONCURRENT",
"-e",
"MCP_K8S_DEFAULT_CPU",
"-e",
"MCP_K8S_DEFAULT_MEMORY",
"-e",
"MCP_K8S_SIDECAR_IMAGE",
"-e",
"MCP_K8S_CLONE_SECRET",
"-e",
"MCP_K8S_AUTH_TOKEN",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "${MCP_K8S_ALLOWED_IMAGES}",
"MCP_K8S_KUBECONFIG": "/kube/config",
"MCP_K8S_NAMESPACE": "mcp-ephemeral",
"MCP_K8S_TRANSPORT": "stdio",
"MCP_K8S_DEFAULT_TIMEOUT_S": "60",
"MCP_K8S_MAX_TIMEOUT_S": "600",
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576",
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760",
"MCP_K8S_MAX_CONCURRENT": "10",
"MCP_K8S_DEFAULT_CPU": "1",
"MCP_K8S_DEFAULT_MEMORY": "512Mi",
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36",
"MCP_K8S_CLONE_SECRET": "${MCP_K8S_CLONE_SECRET}",
"MCP_K8S_AUTH_TOKEN": "${MCP_K8S_AUTH_TOKEN}"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=mcp-k8s-ephemeral-job&config=eyJjb21tYW5kIjoiZG9ja2VyIiwiYXJncyI6WyItLXZvbHVtZSIsIiR7a3ViZWNvbmZpZ19kaXJ9Oi9rdWJlOnJvIiwiLS1yZWFkLW9ubHkiLCItLWNhcC1kcm9wIiwiQUxMIiwiLS1zZWN1cml0eS1vcHQiLCJuby1uZXctcHJpdmlsZWdlcyIsIi0tbWVtb3J5IiwiMjU2bSIsIi1lIiwiTUNQX0s4U19BTExPV0VEX0lNQUdFUyIsIi1lIiwiTUNQX0s4U19LVUJFQ09ORklHIiwiLWUiLCJNQ1BfSzhTX05BTUVTUEFDRSIsIi1lIiwiTUNQX0s4U19UUkFOU1BPUlQiLCItZSIsIk1DUF9LOFNfREVGQVVMVF9USU1FT1VUX1MiLCItZSIsIk1DUF9LOFNfTUFYX1RJTUVPVVRfUyIsIi1lIiwiTUNQX0s4U19NQVhfT1VUUFVUX0JZVEVTIiwiLWUiLCJNQ1BfSzhTX01BWF9BUlRJRkFDVF9CWVRFUyIsIi1lIiwiTUNQX0s4U19NQVhfQ09OQ1VSUkVOVCIsIi1lIiwiTUNQX0s4U19ERUZBVUxUX0NQVSIsIi1lIiwiTUNQX0s4U19ERUZBVUxUX01FTU9SWSIsIi1lIiwiTUNQX0s4U19TSURFQ0FSX0lNQUdFIiwiLWUiLCJNQ1BfSzhTX0NMT05FX1NFQ1JFVCIsIi1lIiwiTUNQX0s4U19BVVRIX1RPS0VOIiwiZG9ja2VyLmlvL2lkY29uc3RydWN0L21jcC1rOHMtZXBoZW1lcmFsLWpvYjp2MC43LjEiXSwiZW52Ijp7Ik1DUF9LOFNfQUxMT1dFRF9JTUFHRVMiOiIke01DUF9LOFNfQUxMT1dFRF9JTUFHRVN9IiwiTUNQX0s4U19LVUJFQ09ORklHIjoiL2t1YmUvY29uZmlnIiwiTUNQX0s4U19OQU1FU1BBQ0UiOiJtY3AtZXBoZW1lcmFsIiwiTUNQX0s4U19UUkFOU1BPUlQiOiJzdGRpbyIsIk1DUF9LOFNfREVGQVVMVF9USU1FT1VUX1MiOiI2MCIsIk1DUF9LOFNfTUFYX1RJTUVPVVRfUyI6IjYwMCIsIk1DUF9LOFNfTUFYX09VVFBVVF9CWVRFUyI6IjEwNDg1NzYiLCJNQ1BfSzhTX01BWF9BUlRJRkFDVF9CWVRFUyI6IjEwNDg1NzYwIiwiTUNQX0s4U19NQVhfQ09OQ1VSUkVOVCI6IjEwIiwiTUNQX0s4U19ERUZBVUxUX0NQVSI6IjEiLCJNQ1BfSzhTX0RFRkFVTFRfTUVNT1JZIjoiNTEyTWkiLCJNQ1BfSzhTX1NJREVDQVJfSU1BR0UiOiJidXN5Ym94OjEuMzYiLCJNQ1BfSzhTX0NMT05FX1NFQ1JFVCI6IiR7TUNQX0s4U19DTE9ORV9TRUNSRVR9IiwiTUNQX0s4U19BVVRIX1RPS0VOIjoiJHtNQ1BfSzhTX0FVVEhfVE9LRU59In19"
}{
"servers": {
"mcp-k8s-ephemeral-job": {
"type": "stdio",
"command": "docker",
"args": [
"--volume",
"${kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m",
"-e",
"MCP_K8S_ALLOWED_IMAGES",
"-e",
"MCP_K8S_KUBECONFIG",
"-e",
"MCP_K8S_NAMESPACE",
"-e",
"MCP_K8S_TRANSPORT",
"-e",
"MCP_K8S_DEFAULT_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_OUTPUT_BYTES",
"-e",
"MCP_K8S_MAX_ARTIFACT_BYTES",
"-e",
"MCP_K8S_MAX_CONCURRENT",
"-e",
"MCP_K8S_DEFAULT_CPU",
"-e",
"MCP_K8S_DEFAULT_MEMORY",
"-e",
"MCP_K8S_SIDECAR_IMAGE",
"-e",
"MCP_K8S_CLONE_SECRET",
"-e",
"MCP_K8S_AUTH_TOKEN",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "${MCP_K8S_ALLOWED_IMAGES}",
"MCP_K8S_KUBECONFIG": "/kube/config",
"MCP_K8S_NAMESPACE": "mcp-ephemeral",
"MCP_K8S_TRANSPORT": "stdio",
"MCP_K8S_DEFAULT_TIMEOUT_S": "60",
"MCP_K8S_MAX_TIMEOUT_S": "600",
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576",
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760",
"MCP_K8S_MAX_CONCURRENT": "10",
"MCP_K8S_DEFAULT_CPU": "1",
"MCP_K8S_DEFAULT_MEMORY": "512Mi",
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36",
"MCP_K8S_CLONE_SECRET": "${MCP_K8S_CLONE_SECRET}",
"MCP_K8S_AUTH_TOKEN": "${MCP_K8S_AUTH_TOKEN}"
}
}
}
}{
"mcpServers": {
"mcp-k8s-ephemeral-job": {
"command": "docker",
"args": [
"--volume",
"${kubeconfig_dir}:/kube:ro",
"--read-only",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"--memory",
"256m",
"-e",
"MCP_K8S_ALLOWED_IMAGES",
"-e",
"MCP_K8S_KUBECONFIG",
"-e",
"MCP_K8S_NAMESPACE",
"-e",
"MCP_K8S_TRANSPORT",
"-e",
"MCP_K8S_DEFAULT_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_TIMEOUT_S",
"-e",
"MCP_K8S_MAX_OUTPUT_BYTES",
"-e",
"MCP_K8S_MAX_ARTIFACT_BYTES",
"-e",
"MCP_K8S_MAX_CONCURRENT",
"-e",
"MCP_K8S_DEFAULT_CPU",
"-e",
"MCP_K8S_DEFAULT_MEMORY",
"-e",
"MCP_K8S_SIDECAR_IMAGE",
"-e",
"MCP_K8S_CLONE_SECRET",
"-e",
"MCP_K8S_AUTH_TOKEN",
"docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
],
"env": {
"MCP_K8S_ALLOWED_IMAGES": "${MCP_K8S_ALLOWED_IMAGES}",
"MCP_K8S_KUBECONFIG": "/kube/config",
"MCP_K8S_NAMESPACE": "mcp-ephemeral",
"MCP_K8S_TRANSPORT": "stdio",
"MCP_K8S_DEFAULT_TIMEOUT_S": "60",
"MCP_K8S_MAX_TIMEOUT_S": "600",
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576",
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760",
"MCP_K8S_MAX_CONCURRENT": "10",
"MCP_K8S_DEFAULT_CPU": "1",
"MCP_K8S_DEFAULT_MEMORY": "512Mi",
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36",
"MCP_K8S_CLONE_SECRET": "${MCP_K8S_CLONE_SECRET}",
"MCP_K8S_AUTH_TOKEN": "${MCP_K8S_AUTH_TOKEN}"
}
}
}
}extensions:
"mcp-k8s-ephemeral-job":
enabled: true
name: "mcp-k8s-ephemeral-job"
type: stdio
cmd: "docker"
args:
- "--volume"
- "${kubeconfig_dir}:/kube:ro"
- "--read-only"
- "--cap-drop"
- "ALL"
- "--security-opt"
- "no-new-privileges"
- "--memory"
- "256m"
- "-e"
- "MCP_K8S_ALLOWED_IMAGES"
- "-e"
- "MCP_K8S_KUBECONFIG"
- "-e"
- "MCP_K8S_NAMESPACE"
- "-e"
- "MCP_K8S_TRANSPORT"
- "-e"
- "MCP_K8S_DEFAULT_TIMEOUT_S"
- "-e"
- "MCP_K8S_MAX_TIMEOUT_S"
- "-e"
- "MCP_K8S_MAX_OUTPUT_BYTES"
- "-e"
- "MCP_K8S_MAX_ARTIFACT_BYTES"
- "-e"
- "MCP_K8S_MAX_CONCURRENT"
- "-e"
- "MCP_K8S_DEFAULT_CPU"
- "-e"
- "MCP_K8S_DEFAULT_MEMORY"
- "-e"
- "MCP_K8S_SIDECAR_IMAGE"
- "-e"
- "MCP_K8S_CLONE_SECRET"
- "-e"
- "MCP_K8S_AUTH_TOKEN"
- "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1"
envs:
"MCP_K8S_ALLOWED_IMAGES": "${MCP_K8S_ALLOWED_IMAGES}"
"MCP_K8S_KUBECONFIG": "/kube/config"
"MCP_K8S_NAMESPACE": "mcp-ephemeral"
"MCP_K8S_TRANSPORT": "stdio"
"MCP_K8S_DEFAULT_TIMEOUT_S": "60"
"MCP_K8S_MAX_TIMEOUT_S": "600"
"MCP_K8S_MAX_OUTPUT_BYTES": "1048576"
"MCP_K8S_MAX_ARTIFACT_BYTES": "10485760"
"MCP_K8S_MAX_CONCURRENT": "10"
"MCP_K8S_DEFAULT_CPU": "1"
"MCP_K8S_DEFAULT_MEMORY": "512Mi"
"MCP_K8S_SIDECAR_IMAGE": "busybox:1.36"
"MCP_K8S_CLONE_SECRET": "${MCP_K8S_CLONE_SECRET}"
"MCP_K8S_AUTH_TOKEN": "${MCP_K8S_AUTH_TOKEN}"
timeout: 300
Placeholders to fill from your own secret store: ${MCP_K8S_CLONE_SECRET}, ${MCP_K8S_AUTH_TOKEN}. The registry never accepts secret values.
This is a local package: the command runs on your machine.
Not scored: fewer than three checks apply, usually because no remote answered a credential-free probe or the server is a local package.
protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)auth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptions, tools.description_length, tools.schemas, tools.annotations, tools.directory_hints, tools.token_cost, tools.api_dumptool list unknown (behind auth, not probed, or empty)stability.changes, stability.rug_pulltool list unknowndeps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI packageNo tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo ~liveness-unmeasured ~updated-93d-ago -unpinned-packages(1)
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1 | oci | unpinned | docker | MCP_K8S_CLONE_SECRET, MCP_K8S_AUTH_TOKEN |
No tools observed. Local packages are never executed by the registry.
Schemas: list_tools.
{
"name": "io.github.inhuman/mcp-k8s-ephemeral-job",
"title": "Kubernetes Ephemeral Job",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"version": "0.7.1",
"packages": [
{
"transport": {
"type": "stdio"
},
"identifier": "docker.io/idconstruct/mcp-k8s-ephemeral-job:v0.7.1",
"runtimeHint": "docker",
"registryType": "oci",
"runtimeArguments": [
{
"name": "--volume",
"type": "named",
"value": "{kubeconfig_dir}:/kube:ro",
"variables": {
"kubeconfig_dir": {
"isRequired": true,
"description": "Host directory holding your kubeconfig, e.g. /home/you/.kube"
}
},
"description": "Mount the kubeconfig directory read-only so the server can reach the cluster."
},
{
"name": "--read-only",
"type": "named",
"description": "Read-only root filesystem — the server writes nothing locally."
},
{
"name": "--cap-drop",
"type": "named",
"value": "ALL",
"description": "Drop all Linux capabilities."
},
{
"name": "--security-opt",
"type": "named",
"value": "no-new-privileges",
"description": "Block privilege escalation."
},
{
"name": "--memory",
"type": "named",
"value": "256m",
"description": "Memory limit for the server process itself."
}
],
"environmentVariables": [
{
"name": "MCP_K8S_ALLOWED_IMAGES",
"isRequired": true,
"description": "Strict image allowlist (CSV). Empty means every call is rejected, so this must be set."
},
{
"name": "MCP_K8S_KUBECONFIG",
"default": "/kube/config",
"description": "Path to the kubeconfig inside the container. Empty = use in-cluster credentials."
},
{
"name": "MCP_K8S_NAMESPACE",
"default": "mcp-ephemeral",
"description": "Namespace the ephemeral pods are created in. Needs a Role/RoleBinding for jobs and pods."
},
{
"name": "MCP_K8S_TRANSPORT",
"default": "stdio",
"description": "MCP transport: stdio | http | sse. Must be 'stdio' for direct docker/stdio use."
},
{
"name": "MCP_K8S_DEFAULT_TIMEOUT_S",
"default": "60",
"description": "Default wall-clock timeout per job, seconds."
},
{
"name": "MCP_K8S_MAX_TIMEOUT_S",
"default": "600",
"description": "Maximum wall-clock timeout a caller may request, seconds."
},
{
"name": "MCP_K8S_MAX_OUTPUT_BYTES",
"default": "1048576",
"description": "Cap on combined stdout/stderr before truncation."
},
{
"name": "MCP_K8S_MAX_ARTIFACT_BYTES",
"default": "10485760",
"description": "Cap on the total size of returned artifacts."
},
{
"name": "MCP_K8S_MAX_CONCURRENT",
"default": "10",
"description": "Maximum ephemeral pods running at the same time."
},
{
"name": "MCP_K8S_DEFAULT_CPU",
"default": "1",
"description": "Pod CPU request; limits come from the caller or the namespace LimitRange."
},
{
"name": "MCP_K8S_DEFAULT_MEMORY",
"default": "512Mi",
"description": "Pod memory request; limits come from the caller or the namespace LimitRange."
},
{
"name": "MCP_K8S_SIDECAR_IMAGE",
"default": "busybox:1.36",
"description": "Helper image used to inject input files and collect artifacts."
},
{
"name": "MCP_K8S_CLONE_IMAGE",
"description": "Image carrying git for the clone init container. Empty disables the clone field."
},
{
"name": "MCP_K8S_CLONE_SECRET",
"isSecret": true,
"description": "Secret with git tokens, mounted only on the cloner. Empty disables the clone field."
},
{
"name": "MCP_K8S_CACHE_PVC",
"description": "Existing PVC mounted into every job pod as a shared cache. Empty = no cache."
},
{
"name": "MCP_K8S_CACHE_MOUNT_PATH",
"description": "Where the cache PVC is mounted, e.g. /go/pkg/mod. Empty = no cache."
},
{
"name": "MCP_K8S_JOB_EXTRA_ENV",
"description": "JSON object of env vars added to every job pod; caller keys win on collision."
},
{
"name": "MCP_K8S_AUTH_TOKEN",
"isSecret": true,
"description": "Optional X-MCP-AUTH token required on every request (http/sse transports only)."
}
]
}
],
"repository": {
"url": "https://github.com/inhuman/mcp-k8s-ephemeral-job",
"source": "github"
},
"description": "Runs a command in a throwaway Kubernetes pod and returns exit code, output and artifacts."
}