Testkube MCP Server

Run, inspect and debug Testkube test workflows, executions, logs and artifacts from an MCP client

Official · Testkube Go Remote (hosted) · Streamable HTTPLocal · stdio TestingDevOps and monitoring

65 popularity score ★ 1.7k ⇣ 20k pulls

Connect your client

Remote (hosted)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

Claude Codeterminal, then /mcp → testkube → Authenticate inside Claude Code
claude mcp add --transport http testkube https://api.testkube.io/organizations/<ORGANIZATION_ID>/environments/<ENVIRONMENT_ID>/mcp
VS Codemcp.json
{ "servers": { "testkube": { "type": "http", "url": "https://api.testkube.io/organizations/<ORGANIZATION_ID>/environments/<ENVIRONMENT_ID>/mcp" } } }
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "testkube": {
      "url": "https://api.testkube.io/organizations/<ORGANIZATION_ID>/environments/<ENVIRONMENT_ID>/mcp"
    }
  }
}
Claude (desktop and web)Settings → Connectors → Add custom connector
https://api.testkube.io/organizations/<ORGANIZATION_ID>/environments/<ENVIRONMENT_ID>/mcp
Local (Docker)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs TK_ACCESS_TOKEN, TK_ORG_ID, TK_ENV_ID. Replace each <NAME> with your value.

Claude CodeTerminal
claude mcp add testkube -e TK_ACCESS_TOKEN=<TK_ACCESS_TOKEN> -e TK_ORG_ID=<TK_ORG_ID> -e TK_ENV_ID=<TK_ENV_ID> -- docker run --rm -i -e TK_ACCESS_TOKEN -e TK_ORG_ID -e TK_ENV_ID kubeshop/mcp-server:2.15.0
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "testkube": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "TK_ACCESS_TOKEN",
        "-e",
        "TK_ORG_ID",
        "-e",
        "TK_ENV_ID",
        "kubeshop/mcp-server:2.15.0"
      ],
      "env": {
        "TK_ACCESS_TOKEN": "<TK_ACCESS_TOKEN>",
        "TK_ORG_ID": "<TK_ORG_ID>",
        "TK_ENV_ID": "<TK_ENV_ID>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "testkube": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "TK_ACCESS_TOKEN",
        "-e",
        "TK_ORG_ID",
        "-e",
        "TK_ENV_ID",
        "kubeshop/mcp-server:2.15.0"
      ],
      "env": {
        "TK_ACCESS_TOKEN": "<TK_ACCESS_TOKEN>",
        "TK_ORG_ID": "<TK_ORG_ID>",
        "TK_ENV_ID": "<TK_ENV_ID>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "testkube": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "TK_ACCESS_TOKEN",
        "-e",
        "TK_ORG_ID",
        "-e",
        "TK_ENV_ID",
        "kubeshop/mcp-server:2.15.0"
      ],
      "env": {
        "TK_ACCESS_TOKEN": "<TK_ACCESS_TOKEN>",
        "TK_ORG_ID": "<TK_ORG_ID>",
        "TK_ENV_ID": "<TK_ENV_ID>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.testkube]
command = "docker"
args = ["run", "--rm", "-i", "-e", "TK_ACCESS_TOKEN", "-e", "TK_ORG_ID", "-e", "TK_ENV_ID", "kubeshop/mcp-server:2.15.0"]

[mcp_servers.testkube.env]
TK_ACCESS_TOKEN = "<TK_ACCESS_TOKEN>"
TK_ORG_ID = "<TK_ORG_ID>"
TK_ENV_ID = "<TK_ENV_ID>"
Gemini CLITerminal
gemini mcp add --scope user -e TK_ACCESS_TOKEN=<TK_ACCESS_TOKEN> -e TK_ORG_ID=<TK_ORG_ID> -e TK_ENV_ID=<TK_ENV_ID> testkube docker -- run --rm -i -e TK_ACCESS_TOKEN -e TK_ORG_ID -e TK_ENV_ID kubeshop/mcp-server:2.15.0

Settings 6

TK_ACCESS_TOKEN secret Required: Testkube API token, or a user access token for the board tools. The server exits without it.
TK_ORG_ID Required: Organization ID (tkcorg_…).
TK_ENV_ID Required: Environment ID (tkcenv_…).
TK_CONTROL_PLANE_URL Optional: API address, set it for on-prem. Default https://api.testkube.io.
TK_DASHBOARD_URL Optional: Dashboard address used in links. Derived from the control plane URL (api. becomes app.) when unset.
TK_MCP_SHTTP_AUTH_TOKEN secret Optional: Bearer token clients must send to the HTTP transport. Required for shttp, must differ from TK_ACCESS_TOKEN. For --transport=shttp.

In a container, a setting goes in with -e NAME=value after docker run.

What it does

Testkube is Kubeshop's platform for running tests as workflows inside Kubernetes. Its MCP server ships in the Testkube CLI and works against one Testkube environment at a time. From a client you can list, create, update and start TestWorkflows and workflow templates. You can follow executions, wait for them to finish, abort or retag them, and pull their logs and artifacts.

For debugging there are per-execution resource metrics, resource history over many runs, and JSONPath queries over workflow definitions and execution records. It also serves the YAML schemas for workflows and execution data and builds links into the Testkube dashboard. The insight tools read the performance and test series Testkube collects for the current environment.

Insights board tools arrived in 2.15.0. They list, create, edit, render and delete boards and the reports on them. Boards belong to the organization, not to one environment. The code refuses them for API tokens (boards.go), so they only work with a signed-in user: the hosted endpoint with your own account, or the CLI after `testkube login`. With the Docker image they work only if TK_ACCESS_TOKEN holds a user access token.

You can use it three ways. There is a hosted endpoint on the Testkube Control Plane, which the makers recommend. There is `testkube mcp serve` in the CLI, and there is the kubeshop/mcp-server Docker image, which starts in environment-variable mode. Both local ways speak stdio by default, or streamable HTTP with `--transport=shttp`.

The overview lists 39 tools. The server registers 43 in pkg/mcp/server.go, because the docs still leave out the four insight tools. query_workflows and query_executions are added only when the control plane answers on the endpoints they need, so an older on-prem control plane may show fewer.

What it needs

To run it yourselfDocker
Runs onmacOS, Windows, Linux
TestkubeFree tierTestkube Cloud or a self-hosted Enterprise control plane, with an organization and environment

For the Docker way, create an API token under Organization Settings → API Tokens with roles that cover what you want to do, and note the org ID (tkcorg_…) and environment ID (tkcenv_…). The board tools need a user access token instead of an API token. The hosted endpoint needs no install. On self-hosted installs an admin must first set MCP_ENABLED in Helm and turn the endpoint on for each environment. In Claude Code you finish sign-in through /mcp → Authenticate.

Limits

  • Not covered Works on one organization and environment per server. Another environment needs a second server.
  • Limit The nine board tools refuse API tokens. They need a signed-in user, so they fail with the Docker image's usual tkcapi_ token.
  • Limit The Docker docs and Docker Hub snippets name kubeshop/testkube-mcp-server, which has 0 pulls and no current release. Use kubeshop/mcp-server.
  • Limit The image ENTRYPOINT already runs mcp serve, so the trailing mcp serve in the docs' snippets is not needed.
  • Limit With --transport=shttp the server will not start without TK_MCP_SHTTP_AUTH_TOKEN, and it must differ from TK_ACCESS_TOKEN (config.go).
  • Limit In shttp mode it binds localhost unless --shttp-host is given, also in Docker. The docs' -p 8080:8080 snippet needs --shttp-host=0.0.0.0 to be reachable.
  • Limit TK_DEBUG appears in the docs and registry entry, but the serve command reads only its --debug flag.
  • Limit The overview's tool list leaves out the four insight tools.
  • Not covered On self-hosted Testkube the hosted endpoint is off until an admin enables it.

Works on one organization and environment per server; to reach another environment you run or register a second one. The Docker setup page and the Docker Hub entry both give the image as kubeshop/testkube-mcp-server, which has no published tags, so their snippets fail to pull. The working image is kubeshop/mcp-server (the one the MCP registry entry names). Its ENTRYPOINT already runs `mcp serve`, so the trailing `mcp serve` in the docs is not needed. The overview's list of 30 tools leaves out the four insight tools added by 2.14.0. On self-hosted Testkube the hosted endpoint is off by default.

Who it suits

Suits teams that already run tests on Testkube and want an assistant to start workflows, wait for results and dig into failed runs through logs, artifacts and resource metrics. It can create and update workflows, abort runs and delete boards, so a token with a narrow role is the cautious choice. Pick the hosted endpoint for per-user OAuth with nothing to install, and for the board tools, which need a user session. The Docker image fits CI jobs or machines that use an API token. It does nothing without a Testkube account and drives only tests defined in Testkube.

Tools 43

30 only read, 11 change things, 2 can delete or overwrite. A ? marks an optional parameter.

list_workflows
List TestWorkflows, with filters
get_workflow
Show one workflow's details
get_workflow_definition
Return a workflow's YAML
get_workflow_metrics
Performance metrics for a workflow
create_workflow changes
Create a new TestWorkflow
update_workflow changes
Change an existing workflow
run_workflow changes
Start a workflow execution
list_workflowtemplates
List workflow templates, optionally by label
get_workflowtemplate_definition
Return a template's YAML
create_workflowtemplate changes
Create a workflow template
update_workflowtemplate changes
Change a workflow template
list_agents
List runners that executions can target
list_executions
List workflow executions
get_execution_info
Details of one execution
get_workflow_execution_metrics
Resource use of a single execution
get_workflow_resource_history
Resource trends and outliers across many runs
fetch_execution_logs
Get an execution's logs
lookup_execution_id
Turn an execution name into its ID
wait_for_executions
Block until given executions finish
abort_workflow_execution changes
Cancel a running execution
update_execution_tags changes
Replace the tags on an execution
list_artifacts
List files an execution produced
read_artifact
Read an artifact's content
query_workflows
JSONPath query across workflow definitions
query_executions
JSONPath query across execution records
get_workflow_schema
YAML schema for TestWorkflow definitions
get_execution_schema
YAML schema for execution data
build_dashboard_url
Make a Testkube dashboard link for a resource
list_labels
List labels in use
list_resource_groups
List resource groups
list_insight_series
List the collected insight seriesworkflow?: stringsource?: stringmetricKey?: stringidentityFilters?: stringq?: stringpage?: stringpageSize?: string
list_insight_metric_keys
List distinct insight metric keysworkflow?: stringsource?: stringidentityFilters?: stringq?: stringpage?: stringpageSize?: string
get_insight_metric_series
Time series for one insight metricmeasure?: stringseriesId?: stringaggregate?: stringsegment?: stringworkflow?: stringidentityFilters?: stringstatus?: stringtagFilter?: stringstartDate?: stringendDate?: stringmaxSamples?: number
list_insight_executions
Executions behind an insight metricmeasure?: stringidentityFilters?: stringworkflow?: stringstatus?: stringtagFilter?: stringstartDate?: stringendDate?: stringpage?: stringpageSize?: string
list_boards
List Insights boards you can see, shared and privatename?: stringvisibility?: stringfavorite?: stringpage?: numberpageSize?: number
get_board
Show a board with its reports and layoutboard: string
create_board changes
Create an empty board, shared with the organization unless private is setname: stringdescription?: stringslug?: stringprivate?: boolean
update_board changes
Change a board's name, description, slug, visibility or layoutboard: stringname?: stringdescription?: stringslug?: stringprivate?: booleanlayout?: object
add_board_report changes
Add a report (chart) of a given kind to a boardboard: stringkind: enumname: stringdescription?: stringparams?: objectfilters?: object
update_board_report changes
Change a report's title, kind, params or filtersboard: stringreportId: stringname?: stringdescription?: stringkind?: stringparams?: objectfilters?: objectreplaceParams?: boolean
remove_board_report deletes
Remove one report from a boardboard: stringreportId: string
delete_board deletes
Delete a board and every report on itboard: string
render_board
Return the numbers each report on a board showsboard: stringreportId?: stringscope?: enumtimeZone?: stringmaxSamples?: number

Similar servers