Skip to main content
Glama

tuskr-mcp-server

Implements a Model Context Protocol (MCP) server for the Tuskr REST API

Built on the FastMCP Python SDK.
Supports access token authentication.

Tools

Each tool wraps one Tuskr REST endpoint, or two for get_test_run_timeline. Endpoints are relative to https://api.tuskr.live/api/tenant/<tenant-id>/.

Tool

Method

Endpoint

Purpose

list_projects

GET

project

Lists projects, filterable by name and by status (active / archived).

create_project

POST

project

Creates a project. team is required: an object mapping a member's email address to a role name, with at least one entry. Role names are tenant specific and passed through unchecked. status is active or archived. The API has no delete endpoint for projects, so try it with a throwaway archived project.

list_test_cases

GET

test-case

Lists a project's test cases, filterable by test suite, section, key, name, test case type and custom fields. Use it to discover the case keys a project actually contains before recording results.

list_test_suites

GET

test-suite

Lists a project's test suites, each with its embedded sections, filterable by name. Use it to find the suite and section IDs that list_test_cases filters on.

list_test_runs

GET

test-run

Lists a project's test runs, filterable by name, key, status and assignee. filter_incomplete=True walks every page and returns only runs below 100% done.

add_test_case

POST

test-case

Creates a test case in an existing suite and section. Pass test_case_type too: Tuskr answers "Type is required" without one unless the tenant has a default type. Custom-field keys and value shapes are tenant specific. The estimate must be at least 1 minute: Tuskr stores 0 as its default of 15. The API has no delete endpoint for test cases, so try it on a sandbox project.

upsert_test_case

POST

test-case/upsert

Creates a test case or updates an existing one. Pass exactly one of test_case_id (update that case) or external_id (update the case with that external ID, or create it when none exists). Only the fields you pass are sent, so an update cannot clear a field. The suite and section are looked up by name only, and an ID is rejected as a missing suite or section. create_missing_suite and create_missing_section create the suite or section when no such name exists, so with them set an ID passed by mistake would become the new suite's or section's name.

create_test_run

POST

test-run

Creates a test run containing all cases in the project or a named subset.

copy_test_run

POST

test-run/copy

Copies an existing run and its case selection within the same project. Results are not carried over; every case starts untested.

add_test_run_results

POST

test-run-result/bulk

Records one status against one or many cases in a run, optionally with up to two file attachments (see Attachments). Pass project to resolve a run key or name inside that project instead of tenant-wide. Prefer a single call with a list of cases over repeated single calls.

get_test_run_results

GET

test-run/<id>/results

Fetches the cases in a run with their latest result, filterable by status and by test_cases. Pass status='FAILED' for a confirmation-test worklist. One page of 100 rows by default; fetch_all_pages=True walks every page. Each row's nested test case is trimmed to its ID, key, name and this run's result by default; trim_response=False keeps the full object, including its whole result history. Takes the run's ID, not its key.

bulk_export_test_runs

GET

test-run/bulk-export

Exports a project's test runs with their test cases and the latest result per case, in one call. Filterable by run IDs, status, completion status and assignee. Always narrow it with filter_ids or another filter when cases are included: a project's runs with all their cases run to tens of megabytes, so nested cases are trimmed by default (trim_response=False keeps them whole) and a response over the MCP size limit is replaced by an error naming the arguments that narrow it. filter_exclude_test_cases=True returns runs only. Run IDs are the UUIDs the API returns, not the R-numbered keys.

get_test_run_timeline

GET

test-run/<id>/results, test-run/<id>

Reports when testing in a run actually started and finished, derived from each case's resultHistory: first and last execution, span in minutes, distinct days with activity, an optional per-day breakdown and the cases never executed. Walks every results page, so it costs one call per 100 cases. Takes the run's ID, not its key.

get_test_run_details

GET

test-run/<id>/details

Fetches a run's metadata plus firstResultAt, lastResultAt and durationInMinutes. Takes the run's ID, not its key. The timestamps are null until a result is recorded, and Tuskr may leave them null for results recorded before it added the endpoint, so a null means unknown, not that the run has no results.

set_test_run_lock

POST

test-run/set-lock

Locks a run read-only, or unlocks it. One run per call.

archive_test_runs

POST

test-run/archive

Archives one or more runs by ID. The response is a bare boolean, so confirm the new state with list_test_runs(filter_status='archived'). Unarchiving is not exposed by the API and has to be done in the Tuskr UI.

delete_test_runs

DELETE

test-run/bulk

Deletes every run in the given projects that matches the filters: a case-sensitive name prefix and a minimum age in days, counted from the run's creation. Archived runs are included. It cannot target a single run by ID or key. At least one of name_starts_with or older_than_days is required, so a call cannot empty a project by accident; pass older_than_days=0 to match runs of any age. Runs go to the recycle bin unless purge=True, which deletes them permanently. Returns {"count": N}.

update_test_run

PUT

test-run/<id>

Adds test cases to an existing run and removes test cases from it, without losing the results already recorded, and switches a run between all cases and a chosen selection. test_cases is the full list to keep, not a delta, and every ID is a UUID. A case that already has a result in the run cannot be removed. Read the run's current case IDs with get_test_run_results and find a new case's ID with list_test_cases.

Result status keys such as PASSED and FAILED are configured per tenant, so use the keys defined in your own account.

add_test_run_results matches a test run given by key or name across the whole tenant by default, not within one project. When several projects have a run with the same key, for example R-1, Tuskr rejects the call with Multiple test runs found matching: R-1 and records nothing. Pass project (the project ID) to look the run up inside that project first: the key is matched exactly, ignoring case, then the name is matched exactly, and the call fails without recording anything when no run or several runs match. Passing the run's UUID also avoids the ambiguity and skips the lookup; list_test_runs returns it for a given project.

Tuskr rate-limits every plan at 10 requests/second. The bulk tools exist for that reason: batch where the endpoint allows it.

Attachments

add_test_run_results accepts an attachments list of local file paths, for screenshots and logs. Tuskr allows two files of 5 MB each per call and attaches every file to the result record of every test case in that call, so record cases that need different evidence in separate calls. Both limits are checked before the request is sent.

Attachments are off by default. The tool arguments are chosen by the model, so a plain path would let a prompt injection upload any file the server can read. Set TUSKR_ATTACHMENT_DIR to the one directory the server may read from. Relative paths resolve against it, and anything that resolves outside it, including through a symlink, is rejected. Because the server reads the files itself, this only works when the server runs on the machine that holds them (stdio, or an HTTP instance with the directory mounted).

The server also exposes one resource, resource://service_description, which describes its purpose to the client.

Related MCP server: MCP DevOps Test Server

Installation

Environment variables / .env file

Set up environment variables or configure the .env file using the .env.example template.

The following environment variables are supported:

TUSKR_TENANT_ID=<your tenant id>
TUSKR_ACCESS_TOKEN=<your access token>

(this doc desc https://tuskr.app/kb/latest/api)

and optionally

MCP_TRANSPORT=<transport type: http or stdio>
MCP_HOST=<host for HTTP transport>
MCP_PORT=<port for HTTP transport>
TUSKR_ATTACHMENT_DIR=<directory attachments may be read from>
TUSKR_BASE_URL=<Tuskr API base URL, default https://api.tuskr.live/api/tenant/>

TUSKR_BASE_URL only needs changing to point the server at a different Tuskr API host, such as a mock in tests. Keep the trailing slash.

In HTTP mode the Authorization and Tenant-ID headers of each request take precedence over TUSKR_ACCESS_TOKEN and TUSKR_TENANT_ID, so one server can serve several users with their own tokens.

Command Line Parameters

The MCP server supports the following command line parameters:

  • --transport: Transport type for the MCP server. Options: http (default) or stdio

  • --host: Host address for HTTP transport (default: 0.0.0.0)

  • --port: Port number for HTTP transport (default: 8000)

Note: The --host and --port parameters are only applicable when using the http transport.

Note: The default host 0.0.0.0 listens on every network interface, which is what a container needs. When you run the server directly on a workstation, pass --host 127.0.0.1 (or set MCP_HOST) so it is reachable only locally.

Default Values

  • Transport: http (can be overridden with MCP_TRANSPORT environment variable)

  • Host: 0.0.0.0 (can be overridden with MCP_HOST environment variable)

  • Port: 8000 (can be overridden with MCP_PORT environment variable)

Connect from client

HTTP Transport (Default)

Use the following template to connect the server via HTTP:

{
  "mcpServers": {
    "tuskr": {
      "transport": "http",
      "url": "http://<your-mcp-dns-or-ip>/mcp/",
      "headers": {
        "Authorization": "Bearer <your access token>",
        "Tenant-ID": "<your-tuskr-tenant-id>"
      }
    }
  }
}

The Authorization is mandatory.

The Tenant-ID is not required and can be set on the server side using the TUSKR_TENANT_ID env variable. It's convenient in case you have a single MCP Server for your organization.

Migrating from TUSKR_ACCOUNT_ID

Earlier versions of this server used the env var TUSKR_ACCOUNT_ID and the HTTP header Account-ID. These continue to work, but emit a deprecation warning. Tuskr's own documentation and UI consistently use the term "Tenant ID" (it is part of the REST URL path: /api/tenant/<tenant-id>/), so the preferred names are now TUSKR_TENANT_ID and the Tenant-ID HTTP header. Both names will be supported until a future major version removes the legacy names.

To migrate an existing config, replace TUSKR_ACCOUNT_ID with TUSKR_TENANT_ID; no other changes are required.

stdio Transport (for local development)

For local development and integration with tools like uvx, use the stdio transport:

{
  "mcpServers": {
    "tuskr": {
      "transport": "stdio",
      "command": "uvx",
      "args": ["tuskr-mcp-server", "--transport", "stdio"]
    }
  }
}

or use uv with source code:

{
  "mcpServers": {
    "tuskr": {
      "transport": "stdio",
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/your/tuskr-mcp-server",
        "run",
        "src/main.py",
        "--transport",
        "stdio"
      ]
    }
  }
}

Integrate with Claude

Worked examples for Claude Code and the Claude desktop app. Both name the server tuskr, so its tools appear as list_projects, list_test_runs and so on.

Claude Code

Run the server locally over stdio, with credentials passed as environment variables:

claude mcp add --transport stdio tuskr \
  --env TUSKR_TENANT_ID=<your tenant id> \
  --env TUSKR_ACCESS_TOKEN=<your access token> \
  -- uvx tuskr-mcp-server --transport stdio

Everything after -- is the command Claude Code runs to start the server, kept separate from Claude Code's own flags.

Or connect to a shared instance over HTTP:

claude mcp add --transport http tuskr https://<your-mcp-dns-or-ip>/mcp/ \
  --header "Authorization: Bearer <your access token>" \
  --header "Tenant-ID: <your-tuskr-tenant-id>"

Drop the Tenant-ID header if the instance already sets TUSKR_TENANT_ID server-side.

claude mcp add stores the configuration without validating credentials, so a wrong token is only reported when the server is first contacted. Run /mcp inside a session and check that tuskr shows as connected.

Add --scope project to write the entry to the repository's .mcp.json and share it with the team. Keep credentials out of a shared file: reference them as --env TUSKR_ACCESS_TOKEN=${TUSKR_ACCESS_TOKEN} and let each developer supply the value from their own environment.

Claude desktop app

Edit claude_desktop_config.json (Settings, Developer, Edit Config):

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

For a local stdio server:

{
  "mcpServers": {
    "tuskr": {
      "command": "uvx",
      "args": ["tuskr-mcp-server", "--transport", "stdio"],
      "env": {
        "TUSKR_TENANT_ID": "<your tenant id>",
        "TUSKR_ACCESS_TOKEN": "<your access token>"
      }
    }
  }
}

command has to resolve on the app's own PATH, which is not the same as your shell's. If the server fails to start, use the absolute path to uvx.

For a shared HTTP instance:

{
  "mcpServers": {
    "tuskr": {
      "type": "http",
      "url": "https://<your-mcp-dns-or-ip>/mcp/",
      "headers": {
        "Authorization": "Bearer <your access token>",
        "Tenant-ID": "<your-tuskr-tenant-id>"
      }
    }
  }
}

The type key is required on any entry that uses url; without it the entry is read as a stdio server and skipped. Restart the app after editing the file.

Check it works

Ask Claude to list your Tuskr projects. It should call list_projects and come back with project names and IDs. A useful follow-up, since it exercises a filter and a second tool: ask which test runs in a given project are not yet finished, which resolves to list_test_runs with filter_incomplete.

A request such as "mark C-14 and C-15 as passed in run R-3" resolves to a single add_test_run_results call. Bear in mind that several of these tools write to Tuskr, so point the server at a sandbox project while you are still exploring.

Development

Setup

  1. Clone repo

  2. Install development dependencies: uv sync --dev

  3. Create .env from .env.example

Running MCP service

HTTP Transport (Default)

uv run --env-file .env src/main.py

stdio Transport (for local development)

uv run --env-file .env src/main.py --transport stdio

Custom Host/Port

uv run --env-file .env src/main.py --host 127.0.0.1 --port 9000

Running tests

The project uses pytest for testing. The following command will run all tests

uv run pytest -vsx

Running linters

The project uses the ruff tool as a linter.

CI runs both of these and fails on any finding, so run them before pushing:

uv run ruff format --check .
uv run ruff check .

uv run ruff format . rewrites the files in place to fix formatting.

Dockerization

The following command allows to build a docker image

docker build -t tuskr-mcp .

and then run it with your .env file, publishing the server port:

docker run -it --rm --env-file .env -p 8000:8000 tuskr-mcp

The server is then reachable at http://localhost:8000/mcp/. If your .env sets MCP_PORT, publish that port instead.

Available Tools

16 tools
add_test_caseAdd Test CaseA

Creates a new test case in a project and returns it.

The test suite and section must already exist: this tool does not create them. There is no delete endpoint for test cases in the Tuskr API, so use a sandbox project while experimenting and name throwaway cases clearly.

Pass test_case_type as well: Tuskr rejects a create without one with "Type is required", at least on a tenant with no default type. Find a type's ID on the testCaseTypeId field of any list_test_cases row.

NameRequiredDescriptionDefault
nameYesname of the new test case
projectYesID or name of the project where to create the test case
test_suiteNoID or name of an existing test suite
descriptionNodescription of the test case
custom_fieldsNoobject of custom field values, keyed by the field's key. Keys and value shapes are specific to the tenant and depend on the field type. Tuskr's own example uses `stepsWithExpectedResults`, a `multi_select` field and a `date` field.
test_case_typeNoID or name of the test case type. Leave it unset only if the tenant has a default type
test_suite_sectionNoID or name of an existing section in the suite
estimated_time_in_minutesNoestimated execution time, whole minutes, at least 1. Tuskr silently replaces 0 with its default (15), so 0 is rejected here before any request

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that there is no delete endpoint (effectively irreversible), that creation fails with "Type is required" without `test_case_type`, and that the call returns the created object. It omits permission/auth or rate-limit context, but the key risk profile is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact paragraphs, front-loaded with purpose, then prerequisites, then the parameter gotcha. Every sentence carries actionable information and nothing is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers prerequisites, irreversibility, and the main failure mode. Only the shape of the returned object and any tenancy/permission caveats are left implicit, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3; the description adds real meaning beyond the schema by turning the optional-looking `test_case_type` into a practical requirement and explaining how to obtain a valid ID from the `testCaseTypeId` field of a `list_test_cases` row. That is genuinely useful cross-tool parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Creates a new test case in a project and returns it") and scopes where it happens. It does not distinguish itself from the close sibling `upsert_test_case`, so an agent still has to infer which one to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Useful prerequisites are given ("The test suite and section must already exist: this tool does not create them") plus a sandbox recommendation for experimentation. However, there is no explicit when-to-use-this-instead-of guidance against `upsert_test_case` or `list_test_cases`, so routing is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_test_run_resultsAdd Test Run ResultsA

Records a result against one or more test cases in a test run.

Tuskr exposes a single bulk endpoint for results, so one call applies the same status to every test case listed. Pass a single test case to record one result, or a list to record many in one request. Always prefer one call with a list over repeated single calls: Tuskr rate-limits every plan at 10 requests/second.

NameRequiredDescriptionDefault
statusYesresult status key, e.g. 'PASSED', 'FAILED', 'RETEST'. Status keys are configured per tenant, so use the keys defined in your own Tuskr account.
commentsNofree-text comment stored on every result created by this call
test_runYesID, key or name of the test run. Keys and names are matched across the whole tenant, not within one project. If several projects have a run with the same key or name (for example 'R-1'), Tuskr rejects the call with 'Multiple test runs found' and records nothing. Pass the run's UUID to avoid the ambiguity; list_test_runs returns it for a given project.
test_casesYesa single test case ID, key or name, or a list of them. The status is applied to every test case listed.
assigned_toNoID, name or email of the user. If present, the test cases in this test run will be assigned to this user.
attachmentsNoup to 2 local file paths (5 MB each), such as screenshots or logs. Tuskr attaches every file to the result record of EVERY test case in this call; there is no per-case attachment, so record cases that need different evidence in separate calls. Requires the server to run on the machine that holds the files and TUSKR_ATTACHMENT_DIR to be set; relative paths resolve against that directory and files outside it are rejected.
custom_fieldsNoJSON object mapping custom field keys to their values
time_spent_in_minutesNoexecution time recorded against every result

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden and does add useful traits: the 10 requests/second rate limit and the fact that one status is applied to every listed test case. However, it never says whether existing results are overwritten, whether the call is idempotent, or what permissions are required for a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: the action first, then the bulk semantics, then the batching directive with the rate-limit rationale. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description and rich schema together cover how to invoke the tool, but there is no output schema and the description never says what a successful call returns (result IDs, per-case status) or how overwrites behave. For a mutation with eight parameters, that leaves a real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all eight parameters in detail. The description reinforces the list-vs-single semantics of test_cases but adds little that is not already in the field descriptions, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (records) and resource (a result against test cases in a test run), and the bulk-endpoint explanation makes clear it is a write tool rather than a reader like get_test_run_results. It never names a sibling explicitly, which keeps it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete guidance: 'Pass a single test case to record one result, or a list to record many in one request' and 'Always prefer one call with a list over repeated single calls.' It stops short of naming alternatives or stating when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

archive_test_runsArchive Test RunsA

Archives one or more test runs.

Archiving hides a run from the default test-run list without deleting it. Archived runs remain readable: pass filter_status='archived' to list_test_runs to see them, or filter_status='active' to exclude them.

The endpoint is bulk. Reversing an archive is not exposed as a dedicated API action: Tuskr's own UI does it by sending the run's full object back with status changed to "active", which this server does not wrap yet. Restoring an archived run today means using the Tuskr UI.

The response is a bare boolean, not a run snapshot. Confirming the new status on a specific run needs a follow-up list_test_runs call with filter_status set.

NameRequiredDescriptionDefault
test_runsYesa single test run ID, or a list of them. Unlike the other test-run tools, this endpoint identifies runs by ID only, so a run name or key is not accepted.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the burden: it discloses non-destructive behavior ('hides... without deleting'), that the endpoint is bulk, that reversal is not available through this server, and that the response is a bare boolean rather than a run snapshot. That is exactly the context an agent needs before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its effect, then constraints and the response shape. It runs slightly long across several short paragraphs, but each one contributes a distinct fact (semantics, discoverability, reversibility, return value) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, unannotated, no-output-schema mutation tool, the description covers everything missing from structured data: effect, bulk nature, irreversibility, and return type. An agent can call this correctly and knows how to verify and revert.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself already documents that IDs only (no names/keys) are accepted, so the description does not repeat it. It does add adjacent value by naming filter_status values on the follow-up tool, which helps the agent verify results, though nothing further is said about the test_runs parameter itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Archives one or more test runs') and immediately clarifies the semantics of that verb (hides from default list, does not delete). This clearly separates it from destructive siblings and from list/read tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when/when-not guidance: use filter_status='archived' on list_test_runs to see archived runs, 'active' to exclude them, and states that restoring requires the Tuskr UI because no reverse action is wrapped. The boundary against alternatives is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_export_test_runsBulk Export Test RunsA

Exports test runs of a project together with their test cases and the latest result of each case, in one call.

One call can return several runs, where get_test_run_results needs a call per run and per page. Always narrow the export with filter_ids or the other filters when test cases are included: a project's runs with all their cases run to tens of megabytes. A response over the MCP size limit is replaced by an error saying how large it was and how to narrow it.

Run fields and the response envelope ({count, rows, meta}) are passed through as the API sends them, keys in the API's own capitalisation.

NameRequiredDescriptionDefault
pageNopage number to fetch, 100 runs per page. Default is 1.
filter_idsNoa test run ID, or a list of them, to export only those runs. These are the run IDs (UUIDs) the API returns, not the R-numbered keys: a key matches no run.
filter_statusNoto filter test runs by their status. Two supported values 'active' or 'archived'
trim_responseNoif True (default), each nested test case is reduced to ID, Key, Name, Suite, Section, Assigned To, Result Status, Result Created At, Result Created By and Result Issue Ids. The full case also carries its steps, expected results, preconditions and the latest result's comments, about 2 KB per case. Set it to False when those are genuinely needed, and narrow the export to a few runs.
filter_projectYesID of the project whose test runs are exported
filter_assigned_toNoid of the user to whom test runs are assigned
filter_completion_statusNoto filter test runs by completion. Two supported values 'completed' or 'incomplete'
filter_exclude_test_casesNoif True, rows carry the runs without their test cases, a few hundred bytes each. The API has been seen to return every matching run on the first page in this mode. Default is False.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and discloses important behavior: large responses can exceed the MCP size limit and return an error with guidance, run fields are passed through with API capitalization, and trim_response/filter_exclude_test_cases affect payload size. It does not mention authentication or permission requirements, but it covers the main operational risks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then supplies the key usage warning and output-shape note. Every sentence contributes useful context for a tool that can return very large responses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex export tool with no output schema and no annotations, the description explains the return envelope, payload size risk, trimming behavior, and API pass-through. Combined with the fully documented input schema, an agent has enough information to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all eight parameters in detail. The description reinforces narrowing with filter_ids and mentions response shaping, but it adds little parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: exporting test runs of a project together with their test cases and latest results in one call. It explicitly distinguishes itself from get_test_run_results by explaining that this tool avoids per-run and per-page calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for using this tool: exporting multiple runs with cases in one call, contrasted with get_test_run_results. It also warns to narrow the export with filter_ids or other filters when test cases are included, though it does not compare against every relevant sibling such as list_test_runs or get_test_run_details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copy_test_runCopy Test RunA

Creates a copy of an existing test run along with its test cases.

The copy is created in the same project as the source run: this endpoint takes no project parameter, so a run cannot be copied across projects. The case selection is carried over in full and cannot be narrowed here; use create_test_run when a different selection is needed. Results are not carried over: every case in the copy starts UNTESTED even if the source run had recorded results (verified live against a sandbox project).

Every optional argument below overrides the corresponding attribute on the copy. Leaving one unset keeps the source run's own value rather than clearing it.

NameRequiredDescriptionDefault
nameNoname for the new test run
deadlineNoYYYY-MM-DD date
test_runYesID or name of the test run to copy
assigned_toNoID, name, or email of the user. If specified, the new test run will be assigned to this user.
descriptionNodescription of the new test run

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that results are NOT carried over (every case starts UNTESTED, verified live), that cross-project copies are impossible, and how unset optional args behave. It stops short of stating permission/auth requirements, whether the copy inherits archived or lock state from the source, and whether the operation is idempotent or retry-safe — all material for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, then constraints are grouped into short topical paragraphs that each carry distinct information. Slightly long, and 'Every optional argument below' is a wasted clause that points at nothing, keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-annotation, no-output-schema mutation tool, the description covers the behaviors an agent most needs — project confinement, selection immutability, result reset, and override semantics. The significant remaining gap is the return value: it never says whether the response includes the new run's ID or name, which an agent needs to chain a follow-up call, and permissions are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, and the description earns above that by explaining merge semantics: each optional argument overrides the corresponding attribute on the copy, and leaving one unset preserves the source value rather than clearing it — a critical clarification given the schema shows empty-string defaults that would otherwise read as 'clear this field'. It does not enumerate the five parameters, and 'Every optional argument below' is a dangling reference that adds little per-parameter detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Creates a copy of an existing test run along with its test cases') and immediately scopes it against the sibling that competes for the same intent, naming create_test_run explicitly. An agent can distinguish it from create_test_run and list_test_runs without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it and when not to: the copy stays in the source project because there is no project parameter, the case selection cannot be narrowed here, and create_test_run is the alternative when a different selection is needed. These are concrete exclusions, not implied ones.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_test_runCreate Test RunC

Creates a new test run in a project.

NameRequiredDescriptionDefault
nameYesa new test run name
projectYesname or project ID where to create a test run
deadlineNoYYYY-MM-DD date
test_casesNolist of IDs, keys or names. Required if you have set `test_case_inclusion_type` to 'SPECIFIC'.
assigned_toNoID, name, or email of the user. If specified, the test run will be assigned to this user
descriptionNodescription of a test run
test_case_inclusion_typeYesOne of 'ALL' or 'SPECIFIC'. If you specify 'ALL', all test cases in the project will be included in the test run. If you specify 'SPECIFIC', then you will have to indicate the test cases to include as explained below.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure, and it states only that a record is created. It says nothing about side effects such as whether assigning a user triggers notifications, whether the run starts in an open/locked state, what happens with an empty test set, or whether creation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence, front-loaded, with no filler. It is efficient but so minimal that it reads as under-specification rather than disciplined concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 7-parameter mutation tool with no annotations and no output schema needs more: the return value (run ID or object?), failure modes for invalid project or test case names, and interaction between test_case_inclusion_type and test_cases are all left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every one of the 7 parameters (including the ALL/SPECIFIC inclusion semantics and the deadline format) is already documented in the schema. Per the baseline rule, the description adding no parameter detail still lands at 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (creates) plus resource (test run) with the scoping location (in a project). It does not, however, distinguish this from siblings such as copy_test_run, upsert_test_case, or update_test_run, so an agent gets the action but not the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to prefer this over copy_test_run or update_test_run, and no prerequisites (project permissions, existing test cases, assignment rules). The single clause 'in a project' is the only contextual hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_test_run_detailsGet Test Run DetailsA

Fetches a test run's details, including when execution started and ended.

Besides the run's metadata (id, key, name, project, description, references, assignedTo, externalId, deadline, status), the response carries three timing fields:

  • firstResultAt: timestamp of the first result marked in the run

  • lastResultAt: timestamp of the last result marked in the run

  • durationInMinutes: time between the two, computed by Tuskr

This is the direct way to answer "when did this run finish" or "how long did execution take". Deriving the same from each case's resultHistory via get_test_run_results is slower and needs one large call per run.

Caveat: Tuskr says it timestamps only results marked after this endpoint shipped (8 Sept 2026), so older runs may return null firstResultAt and lastResultAt with a meaningless durationInMinutes. This is not guaranteed: a run whose only result predates the release still returned real timestamps. A run with no results also returns nulls. A null therefore means unknown, not "no results yet"; check the run's results before concluding that.

The endpoint takes one test run per call. Tuskr rate-limits every plan at 10 requests/second.

NameRequiredDescriptionDefault
test_runYesID (UUID) of the test run. A key such as "R-2" is rejected with "Invalid test run ID". Resolve a key to its ID with list_test_runs(filter_key=...).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses the 10 requests/second rate limit, that only one run is fetched per call, and a detailed null-semantics caveat for firstResultAt/lastResultAt/durationInMinutes including the ambiguity that null means unknown rather than 'no results yet'. This is behavior an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the field list, then bullets for timing fields, with usage guidance and caveats ordered sensibly. Slightly bloated in the caveat section, where the aside about a run that 'still returned real timestamps' is an anecdote that muddies the otherwise crisp null rule.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the explicit enumeration of returned metadata and timing fields is necessary and present. Combined with the null caveat, rate limit, and single-run constraint, an agent has everything needed to call this, interpret the response, and avoid misreading nulls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the test_run parameter already documents that a UUID is required, that a key like 'R-2' is rejected, and how to resolve it via list_test_runs(filter_key=...). The description adds only that 'the endpoint takes one test run per call', so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('fetches a test run's details') and enumerates exactly what comes back, including the three timing fields that motivate the tool. It explicitly distinguishes itself from get_test_run_results by calling this 'the direct way' versus deriving timing from per-case resultHistory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete triggering questions ('when did this run finish', 'how long did execution take') and names the slower alternative with the reason to avoid it. It also states the precondition to check results before concluding from nulls, which is exactly the decision the agent needs to make after calling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_test_run_resultsGet Test Run ResultsA

Fetches the test cases in a test run together with their latest result.

The main use is confirmation testing: pass status='FAILED' to get back only the test cases that need re-checking after a fix.

NameRequiredDescriptionDefault
pageNopage number to fetch, 100 records per page. Default is 1. Ignored when fetch_all_pages is True.
statusNoa result status key, or a list of them, e.g. 'FAILED' or ['RETEST', 'FAILED']. Only test cases whose current status is one of these are returned. Status keys are configured per tenant, so use the keys defined in your own Tuskr account.
test_runYesID of the test run. Tuskr addresses the run in the URL path for this endpoint, so unlike the other tools a run name is not accepted here.
test_casesNoa test case ID, key or name, or a list of them. Only the matching test cases are returned.
trim_responseNoif True (default), each row's nested testCase object is reduced to id, key, name and testRunTestCases (this run's own result and its linked issue keys). The full object also carries the case's entire resultHistory and every issue key ever linked to it, which can push a busy run past the MCP transport size limit. Set it to False when that history is genuinely needed.
fetch_all_pagesNoif True, walks every page and returns the combined rows. Tuskr rate-limits every plan at 10 requests/second, so prefer a status or test_cases filter over fetching everything.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full behavioral burden. 'Fetches' implies a read, and the confirmation-testing framing is genuinely useful, but it says nothing about pagination (100 records/page, fetch_all_pages), the 10 req/s rate limit, or the default response trimming — all disclosed only in the schema text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose first and the most actionable hint second. Every sentence earns its place and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter retrieval tool with no output schema and no annotations, the description covers what it returns at a high level but omits paging behavior, response shape trimming, and rate-limit pressure — all left to the schema. Adequate, not self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines status, trim_response, page, and fetch_all_pages in detail. The description adds usage-level meaning for status ('pass FAILED to get only cases needing re-checking') but no format or syntax beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: fetches the test cases in a test run alongside their latest result. That is clearly distinct from siblings like add_test_run_results or get_test_run_timeline, though it never explicitly differentiates itself from get_test_run_details, which an agent could plausibly confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage scenario (confirmation testing after a fix) and the exact call pattern that serves it (status='FAILED'). It stops short of naming alternatives or stating when not to use it, so it is clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_test_run_timelineGet Test Run TimelineA

Reports when testing in a test run actually started and finished.

Use this instead of comparing a run's createdAt to its lockedAt. Those two bracket the run's administrative life, not its testing: a run is typically opened before anyone executes against it and locked well after the last result, so the gap between them can be twice the real duration.

This reads the per-execution timestamps Tuskr keeps on each test case and keeps only those recorded against this run, giving the true first and last execution, the span between them, and how many distinct days saw activity.

For a recent run, get_test_run_details is the cheaper way to get the first and last result times and the duration: one small call, where this tool fetches every results page untrimmed (100 cases per page). Use this tool when those timestamps come back null (Tuskr may not have recorded them for older results), or when you need the number of distinct days with activity, the daily breakdown, or the cases that were never executed.

NameRequiredDescriptionDefault
test_runYesID of the test run. This is the UUID after /test-run/ in the Tuskr URL. The underlying endpoint addresses the run in the URL path, so a run name or R-key is not accepted; resolve one to its ID with list_test_runs first.
include_daily_breakdownNoif True (default), adds executionsByDay, a map of date to execution count. Useful for telling a run worked steadily over a week from one tested in an afternoon after sitting idle. Its size is bounded by the run's span, so it stays small. Days are bucketed by UTC date, so an evening session in a UTC+2 or later timezone can straddle two buckets and read as two days of activity.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does: it discloses the cost profile (fetches every results page untrimmed, 100 cases per page vs. one small call), what data source it reads (per-execution timestamps filtered to this run), what is produced, and a real caveat about UTC-day bucketing splitting evening sessions. That is unusually rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the anti-pattern, then the cheaper alternative, then the escalation conditions. Every sentence carries decision-relevant information; length is justified by the risk of picking the wrong tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain returns, and it does: first and last execution, the span, distinct active days, daily breakdown, and never-executed cases. Combined with the cost and timezone caveats, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including a full description of test_run ID format and include_daily_breakdown semantics, so the baseline of 3 applies. The description restates the value of the daily breakdown and mentions never-executed cases but adds no parameter-level format or constraint information beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reports when testing in a test run actually started and finished, and immediately separates that from createdAt/lockedAt semantics. An agent can distinguish it from get_test_run_details without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the wrong approach to avoid (comparing createdAt to lockedAt) and names the sibling alternative (get_test_run_details) with the exact conditions that favor each: null timestamps, distinct-day counts, daily breakdown, or never-executed cases. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList ProjectsC

Retrives list of projects based on various filter criteria.

NameRequiredDescriptionDefault
pageNocontrols number of records in output, every page contains 100 records. Default is 1.
filter_nameNoto filter projects with name containing the specified value
filter_statusNoto filter projects by their status. Two supported values 'active' or 'archived'

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does not state that this is a read-only operation, how results are ordered, whether archived projects are included by default, or what the pagination/total behaviour is beyond the schema's '100 records per page' note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no padding, but it is terse to the point of under-specification rather than efficiently informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with full schema coverage the description could reasonably stop early, but with zero annotations an agent gets no confirmation of read-only safety, default (unfiltered) behaviour, or pagination expectations. Those gaps matter here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in detail (page semantics, name-contains matching, active/archived values). The description adds no meaning beyond that, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb and resource ('Retrives list of projects') and scopes it to filter criteria. Siblings are all test-run/test-case/test-suite resources, so the resource noun alone is enough to separate it; the misspelling 'Retrives' is cosmetic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'based on various filter criteria' gestures at filtering but never says when to use this tool versus other listing tools, nor that all filters are optional and unfiltered calls return everything. No prerequisite or exclusion guidance at all.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_test_casesList Test CasesA

Retrieves list of test cases of a project with support for various filters.

Use this to discover the test case keys a project actually contains before recording results against them with add_test_run_results.

NameRequiredDescriptionDefault
pageNocontrols number of records in output, every page contains 100 records. Default is 1.
filter_keyNoto filter test cases with key containing the specified value
filter_nameNoto filter test cases with name containing the specified value
filter_projectYesspecifies the project ID to filter the test cases associated with a particular project
filter_test_suiteNoID of the test suite to filter the test cases by. Only the ID works: a suite's key or name returns zero rows, not an error. Find suite IDs with list_test_suites.
filter_custom_fieldsNomaps a custom field's key to the value to filter on, e.g. {'priority_band': '<option-id>'}. The field key is whatever the tenant named it, so any project's own field set can be filtered here. Only fields applicable to test cases can be filtered; a field scoped to test run results is not reachable through this endpoint. Verified live by field type: dropdown: pass the option's ID, not its displayed label. Read the ID off any case that already has the field set, where it is returned inline as customFields.<field>.id. checkbox: pass a bool or the lowercase string 'true'/'false'. A bool is normalised to the lowercase form Tuskr expects. text: matches on substring, not equality. steps: NOT filterable. Tuskr accepts the parameter and returns every case in the project unfiltered. Numbers and multi-select remain unverified. Tuskr ignores a filter it does not understand instead of rejecting it, so a filter that fails to narrow the results means the field type or value shape is unsupported, not that nothing matched.
filter_test_case_typeNoID of the test case type to filter by. Read the ID off the testCaseTypeId field of any case row. Only the ID form is verified; a type's displayed name is untested as a filter value. Verified live: a valid ID narrows the result set, and an unknown value returns zero rows rather than an error or the unfiltered set, so an empty result can mean a mistyped ID, not that no case has that type.
filter_test_suite_sectionNoID of the test suite section to filter the test cases by. Only the ID works: a section name returns zero rows. Find section IDs with list_test_suites.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the burden. "Retrieves" implies a read-only operation, but the description says nothing about pagination behavior, result ordering, or what happens with unsupported filters — all of which live in the schema instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads what the tool does, the second front-loads when to use it. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter list tool with no output schema, the description plus the highly detailed schema is nearly sufficient. It stops short of describing the return shape or page-size limit, but the schema already carries that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema documents each filter's quirks in detail (suite IDs vs names, custom field types, empty-result semantics). The description itself only says "various filters," adding nothing beyond the structured data, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Retrieves list of test cases of a project") plus the filtering capability. It carves out a role relative to add_test_run_results, though it does not explicitly distinguish itself from list_test_suites or get_test_run_results, so it falls short of a full 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete scenario ("discover the test case keys a project actually contains before recording results") and names the follow-up tool add_test_run_results. No explicit when-not or alternative-for-the-same-data guidance, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_test_runsList Test RunsC

Retrieves list of test runs of a project with support for various filters.

NameRequiredDescriptionDefault
pageNocontrols number of records in output, every page contains 100 records. Default is 1. Ignored when filter_incomplete is True.
filter_keyNoto filter test runs with key containing the specified value
filter_nameNoto filter test runs with name containing the specified value
filter_statusNoto filter test runs by their status. Two supported values 'active' or 'archived'
filter_projectYesspecifies the project ID to filter the test runs associated with a particular project
filter_incompleteNoif True, fetches all pages and returns only test runs that are not 100% complete, with a trimmed payload (id, key, name, percentDone, counts, assignee, deadline, status). When False (default), returns the paginated response from the Tuskr API with every field intact. Either way the assignee on each row is reduced to id, fullName and email.
filter_assigned_toNoid of the user to whom test runs are assigned

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about pagination (100 records/page), the special all-pages/trimmed-payload mode of filter_incomplete, or the reduced assignee shape. All of that critical behavior lives only in the schema and is invisible at description level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence, front-loaded and waste-free, but its brevity comes from under-specification rather than economy. It says nothing that the name and schema do not already convey.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter read tool with no annotations and no output schema, the description omits required-parameter context (filter_project), pagination semantics, and the materially different response shape triggered by filter_incomplete. An agent could call it, but would not understand what it gets back.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 7 parameters well. The description adds nothing beyond 'various filters', landing at the baseline for fully-documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieves list of test runs of a project'), which is clearer than a tautology. However, it does not distinguish this from close siblings like get_test_run_details, bulk_export_test_runs, or archive_test_runs; 'with support for various filters' is too generic to route an agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance, and no alternatives named. The agent has to infer from sibling names whether listing, exporting, or fetching details is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_test_suitesList Test SuitesA

Retrieves list of test suites and their associated sections in a project.

Use this to discover suite and section IDs. Pass them to list_test_cases as filter_test_suite and filter_test_suite_section instead of reading the IDs off existing test case rows.

Each suite row embeds its sections. Returns Tuskr's raw rows, count and meta for a single page; this tool does not fetch further pages.

NameRequiredDescriptionDefault
pageNocontrols number of records in output, every page contains 100 records. Default is 1.
filter_nameNoto filter test suites with name containing the specified value
filter_projectYesspecifies the project ID to list the test suites of. Required.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the result shape ('raw rows, count and meta'), the nesting behavior ('Each suite row embeds its sections'), and the pagination limit ('does not fetch further pages'), which is the non-obvious failure mode. It stops short of stating read-only safety, auth requirements, or whether the rows are raw/untransformed in a way that matters for parsing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, each front-loaded with its most important claim: what it returns, why to call it, then the pagination caveat. No filler sentences and the limiting constraint comes last where it is easy to catch.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter read tool with no output schema and no annotations, the description covers purpose, downstream use, return shape, and pagination adequately. It leaves minor ambiguity about whether 'count' is a page count or total, and whether sections themselves can be filtered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so page and filter_project are already fully documented in the schema. The description adds no syntax or formatting detail for filter_name or page beyond pointing at the IDs the results yield. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieves list of test suites and their associated sections') with an explicit scope ('in a project'). The following sentence distinguishes it from the sibling list_test_cases by naming it and describing the different job each does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use ('discover suite and section IDs') and a concrete what-to-do-next ('Pass them to list_test_cases as filter_test_suite and filter_test_suite_section'). It even states an anti-pattern to avoid ('instead of reading the IDs off existing test case rows'), which is exactly the routing guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_test_run_lockSet Test Run LockA

Locks or unlocks a test run.

A locked test run is read-only: results can no longer be recorded against it and its test cases can no longer be edited. Locking is otherwise a manual action in the Tuskr UI, so this tool is what lets an automated workflow seal a run once execution is complete.

The endpoint accepts one test run per call, so locking several runs takes one call each. Tuskr rate-limits every plan at 10 requests/second.

NameRequiredDescriptionDefault
lockYesTrue to lock the test run, False to unlock it
test_runYesID or name of the test run to lock or unlock

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does well: it states the read-only consequence of locking, that results and test-case edits are blocked, the one-run-per-call cardinality, and a concrete rate limit of 10 requests/second. It omits auth/permission requirements and behavior when locking an already-locked run, which are the remaining gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, front-loaded with the action and its effect, then the workflow rationale, then operational constraints. Every sentence carries information an agent needs — consequences, use case, batching, rate limit — with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter mutation tool with no annotations and no output schema, the description supplies the safety profile (read-only side effect), the operational envelope (rate limit, single-run scope), and the workflow intent. It stops short of error/edge-case behavior — e.g., unlocking a run that isn't locked, or whether unlock fully restores editability — which leaves a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both 'lock' (boolean toggle) and 'test_run' (ID or name) are already documented in the schema, so the baseline is 3. The description adds only the cardinality constraint ('one test run per call'), which is modest added value rather than new semantics for either parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Locks or unlocks a test run.' It also clarifies a boundary against the likely-confusable sibling update_test_run by noting that locking is 'otherwise a manual action in the Tuskr UI,' implying this dedicated tool is the only path for lock state. An agent can distinguish it from update_test_run, archive_test_runs, and copy_test_run without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage context — 'lets an automated workflow seal a run once execution is complete' — rather than a bare when-to-use. It also implies when-not: once locked, results can't be recorded and cases can't be edited, so it shouldn't be called mid-execution. It never explicitly names update_test_run as the alternative for other mutations, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_test_runUpdate Test RunA

Adds test cases to an existing test run and removes test cases from it.

This is how to change which cases a run contains after it was created. It also switches a run between ALL and SPECIFIC case selection. Do not use add_test_run_results to add a case: recording a result for a case that is not in the run returns an empty list and stores nothing. Do not use copy_test_run either, which resets every result.

To add a case: read the run's current case IDs with get_test_run_results (the testCase.id of each row), append the new case's ID (the id of a list_test_cases row), and send the full list as test_cases.

To remove a case: send the run's current case IDs without that case. A case that already has a result in this run cannot be removed. Tuskr then answers HTTP 400 "Cannot remove test case because it already has results: ", and this tool returns that text as is.

test_cases is the complete selection, not a delta: it replaces the current one, so any case left out is removed. Cases that stay in the selection keep the results already recorded for them, also across a switch to ALL and back.

Switching from SPECIFIC to ALL takes no test_cases. Switching from ALL to SPECIFIC needs test_cases to include every case that already has a result in the run.

Every identifier here is a UUID, unlike create_test_run: keys and names are not accepted for the run, the project or the cases. The tool never sends the run's description, deadline or assignee, and a description stays unchanged. On success Tuskr returns the updated run.

NameRequiredDescriptionDefault
nameNonew name for the run. Leave unset to keep the current name.
projectNoID (UUID) of the project the run belongs to. Leave unset to keep the run in its current project.
test_runYesID (UUID) of the test run to update. list_test_runs returns it.
test_casesNofor 'SPECIFIC', the IDs (UUIDs) of every case the run should hold afterwards: a single ID or a list of them.
test_case_inclusion_typeYes'ALL' or 'SPECIFIC' (case-insensitive). With 'ALL' the run holds every case in the project and test_cases must be omitted. With 'SPECIFIC' test_cases is required.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: test_cases replaces rather than appends, omitted cases are removed, cases with existing results cannot be removed, the exact HTTP 400 error behavior is disclosed, identifiers must be UUIDs, and the tool does not modify description, deadline, or assignee. This is unusually complete for a mutation tool without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the length is justified by the complexity of a mutation tool with no annotations and five parameters. The core behavior and alternatives are front-loaded, and the procedural details are information-dense rather than repetitive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, lack of annotations, and lack of an output schema, the description covers everything an agent needs to invoke the tool correctly: selection semantics, UUID constraints, error behavior, switching rules, unchanged fields, and a brief success return statement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds critical meaning beyond the schema: test_cases is the complete selection rather than a delta, switching between ALL and SPECIFIC has different parameter requirements, and every identifier is a UUID rather than a key or name. These are high-value semantics that the schema descriptions alone do not fully convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: it adds and removes test cases in an existing test run and switches the run's case selection mode. It explicitly distinguishes itself from sibling tools such as add_test_run_results and copy_test_run, so an agent can identify the correct tool without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance, including negative guidance not to use add_test_run_results or copy_test_run for this purpose. It also provides step-by-step procedures for adding and removing cases and states exactly when test_cases is required versus omitted for ALL and SPECIFIC modes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_test_caseUpsert Test CaseA

Creates a test case or updates an existing one, and returns it.

This tool can both create new test cases and modify existing ones. Exactly one of test_case_id or external_id must be given:

  • test_case_id updates the test case with that ID; the case must already exist.

  • external_id updates the case with that external ID in the project, or creates a new case carrying that external ID when none exists.

Only the fields you pass are sent. A field left unset keeps its current value on an update, so this tool cannot clear a field to empty. Pass name when the call may create a case.

Unlike add_test_case, this endpoint looks the suite and section up by NAME only: a suite or section ID is answered with "Test suite does not exist". With create_missing_suite or create_missing_section set, an ID passed by mistake would instead create a suite or section named after it. The test case type accepts an ID or a name.

NameRequiredDescriptionDefault
nameNoname of the test case
projectYesID, name or external ID of the project
test_suiteNoname of the test suite (not its ID)
descriptionNodescription of the test case
external_idNoexternal ID used to find the case to update, or to assign to the case being created
test_case_idNoUUID of an existing test case to update
custom_fieldsNoobject of custom field values, keyed by the field's key. Keys and value shapes are specific to the tenant and depend on the field type. Tuskr's own example uses `stepsWithExpectedResults`, a `multi_select` field and a `date` field.
test_case_typeNoID or name of the test case type
test_suite_sectionNoname of the section in the suite (not its ID)
create_missing_suiteNocreate the test suite when it does not exist (Tuskr default: it does not)
create_missing_sectionNocreate the section when it does not exist (Tuskr default: it does not)
estimated_time_in_minutesNoestimated execution time, whole minutes, at least 1. Tuskr rejects 0 ("Validation min on estimatedTimeInMinutes failed"), so 0 is rejected here first

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does most of it well: partial-update semantics ('only the fields you pass are sent'), the inability to clear a field to empty, and the surprising side effect where a mistakenly-passed suite ID plus create_missing_suite creates a new suite. Still silent on permissions/auth requirements and overall idempotency guarantees, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core operation, then bullets the ID modes, then the field-merge and suite-lookup caveats. Slight redundancy in 'This tool can both create new test cases and modify existing ones' restating the opening sentence, but density of useful content is high.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter dual-mode mutation with no output schema, it covers the decision-critical semantics: mode selection, merge behavior, name-lookup pitfalls, and required name on create. It does not describe what the returned test case looks like or what error surfaces when both IDs are omitted, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds genuine semantics the schema does not: the mutual-exclusivity/at-least-one constraint on test_case_id and external_id, which one creates vs updates, and the name-only lookup rule for suite and section that the schema flags only as '(not its ID)'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Creates a test case or updates an existing one') and immediately scopes the dual-mode behavior. It explicitly contrasts itself with the sibling add_test_case, so an agent can route between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit selection rules for test_case_id vs external_id, states that name must be passed when a create may occur, and names add_test_case as the alternative for the ID-lookup path. The when-not guidance around create_missing_suite/section with mistaken IDs is exactly the kind of trap an agent needs warned about.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.1.5
    • Addedadd_test_case
    • Addedadd_test_run_results
    • Addedarchive_test_runs
    • Addedbulk_export_test_runs
    • Addedcopy_test_run
    • Changedcreate_test_run18 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / assigned_to / description
        Added value: +"ID, name, or email of the user. If specified, the test run will be assigned to this user"
      • removedInput schema / properties / assigned_to / title
        Removed value: -"Assigned To"
      • addedInput schema / properties / deadline / description
        Added value: +"YYYY-MM-DD date"
      • removedInput schema / properties / deadline / title
        Removed value: -"Deadline"
      • addedInput schema / properties / description / description
        Added value: +"description of a test run"
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • addedInput schema / properties / name / description
        Added value: +"a new test run name"
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • addedInput schema / properties / project / description
        Added value: +"name or project ID where to create a test run"
      • removedInput schema / properties / project / title
        Removed value: -"Project"
      • addedInput schema / properties / test_case_inclusion_type / description
        Added value: +"One of 'ALL' or 'SPECIFIC'. If you specify 'ALL', all test cases in the project will be included in the test run.\n                      If you specify 'SPECIFIC', then you will have to indicate the test cases to include as explained below."
      • removedInput schema / properties / test_case_inclusion_type / title
        Removed value: -"Test Case Inclusion Type"
      • addedInput schema / properties / test_cases / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / test_cases / description
        Added value: +"list of IDs, keys or names. Required if you have set `test_case_inclusion_type` to 'SPECIFIC'."
      • removedInput schema / properties / test_cases / items
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / test_cases / title
        Removed value: -"Test Cases"
      • removedInput schema / properties / test_cases / type
        Removed value: -"array"
    • Addedget_test_run_details
    • Addedget_test_run_results
    • Addedget_test_run_timeline
    • Changedlist_projects11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filter_name / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_name / description
        Added value: +"to filter projects with name containing the specified value"
      • removedInput schema / properties / filter_name / title
        Removed value: -"Filter Name"
      • removedInput schema / properties / filter_name / type
        Removed value: -"string"
      • addedInput schema / properties / filter_status / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_status / description
        Added value: +"to filter projects by their status. Two supported values 'active' or 'archived'"
      • removedInput schema / properties / filter_status / title
        Removed value: -"Filter Status"
      • removedInput schema / properties / filter_status / type
        Removed value: -"string"
      • addedInput schema / properties / page / description
        Added value: +"controls number of records in output, every page contains 100 records. Default is 1."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
    • Addedlist_test_cases
    • Changedlist_test_runs24 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filter_assigned_to / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_assigned_to / description
        Added value: +"id of the user to whom test runs are assigned"
      • removedInput schema / properties / filter_assigned_to / title
        Removed value: -"Filter Assigned To"
      • removedInput schema / properties / filter_assigned_to / type
        Removed value: -"string"
      • addedInput schema / properties / filter_incomplete / description
        Added value: +"if True, fetches all pages and returns only test runs that are not 100% complete,\nwith a trimmed payload (id, key, name, percentDone, counts, assignee, deadline, status).\nWhen False (default), returns the paginated response from the Tuskr API with every field\nintact. Either way the assignee on each row is reduced to id, fullName and email."
      • removedInput schema / properties / filter_incomplete / title
        Removed value: -"Filter Incomplete"
      • addedInput schema / properties / filter_key / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_key / description
        Added value: +"to filter test runs with key containing the specified value"
      • removedInput schema / properties / filter_key / title
        Removed value: -"Filter Key"
      • removedInput schema / properties / filter_key / type
        Removed value: -"string"
      • addedInput schema / properties / filter_name / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_name / description
        Added value: +"to filter test runs with name containing the specified value"
      • removedInput schema / properties / filter_name / title
        Removed value: -"Filter Name"
      • removedInput schema / properties / filter_name / type
        Removed value: -"string"
      • addedInput schema / properties / filter_project / description
        Added value: +"specifies the project ID to filter the test runs associated with a particular project"
      • removedInput schema / properties / filter_project / title
        Removed value: -"Filter Project"
      • addedInput schema / properties / filter_project / type
        Added value: +"string"
      • addedInput schema / properties / filter_status / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / filter_status / description
        Added value: +"to filter test runs by their status. Two supported values 'active' or 'archived'"
      • removedInput schema / properties / filter_status / title
        Removed value: -"Filter Status"
      • removedInput schema / properties / filter_status / type
        Removed value: -"string"
      • addedInput schema / properties / page / description
        Added value: +"controls number of records in output, every page contains 100 records. Default is 1.\nIgnored when filter_incomplete is True."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
    • Addedlist_test_suites
    • Addedset_test_run_lock
    • Addedupdate_test_run
    • Addedupsert_test_case
  2. 3 tool updatesv0.1.2
    • First observedcreate_test_run
    • First observedlist_projects
    • First observedlist_test_runs

TDQS

A3.6/5.0

Scored across 16 tools

Disambiguation4/5

Most tools target clearly distinct operations across test runs, test cases, results, suites, and projects. The main overlap is add_test_case vs upsert_test_case and the several run-reading tools, but the detailed descriptions explicitly differentiate them, reducing misselection risk.

Naming Consistency5/5

All tool names use snake_case with a predictable verb_noun structure such as create_test_run, get_test_run_results, and list_test_cases. Minor compound verbs like bulk_export are still readable and consistent with the overall convention.

Tool Count4/5

Sixteen tools is slightly above the ideal compact range but justified by the breadth of the test-management domain: runs, cases, results, suites, projects, export, archiving, and locking. Each tool maps to a reasonably distinct operation rather than redundant surface area.

Completeness3/5

The core lifecycle for test runs, test cases, and results is covered, including creation, listing, result recording, locking, archiving, and export. However, there are notable gaps: no dedicated suite/section management beyond listing, no project creation/update, no test run metadata editing, and no restore-from-archive operation.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    MCP server for Tuskr test management that allows browsing, searching, reading, creating, and updating test cases, suites, sections, and test runs from any MCP host like Cursor.
    17
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with Kiwi TCMS test management system through MCP, supporting read and write operations on test plans, cases, runs, and executions, with API key authentication.
    1
    AGPL 3.0