Skip to main content
Glama
vilaabo

zephyr-scale-mcp

by vilaabo

zephyr-scale-mcp

MCP server for Zephyr Scale on self-hosted Jira Server / Data Center (formerly TM4J). It gives an AI agent — Claude Code, Claude Desktop, Cursor, any MCP client — 54 tools over your test management: test cases, folders, test cycles, executions, test plans, attachments and automation imports, through the Zephyr Scale REST API v1 at {JIRA_BASE_URL}/rest/atm/1.0.

Node TypeScript Tests License API

npm: zephyr-scale-mcp · MCP Registry: io.github.vilaabo/zephyr-scale-mcp · Русская версия →

⚠️ Scope: Server / Data Center only. Zephyr Scale Cloud (API v2) and Zephyr Squad are different APIs and are out of scope — this server will not work against them.

Why this exists

Most Zephyr MCP servers target the Cloud API. If your Jira is on-premise you get the v1 API instead, and v1 has teeth: test runs are immutable after creation, folders cannot be listed, statuses are case-sensitive internal names, BDD scripts reject a Feature: header, and older plugin builds are missing whole endpoints. This server encodes that knowledge instead of leaving the agent to discover it one 400 at a time.

  • 54 tools (42 public + 12 opt-in internal-API tools), each with a description that states the endpoint, the constraints a caller cannot guess, and the exact response shape.

  • Composite tools for the API's blind spotsadd_test_steps merges steps by id (read → merge → write) so nothing is silently deleted; recreate_test_run_with_items works around run immutability and can carry the last results over; get_issue_test_coverage, get_test_run_summary, clone_test_case, move_test_cases_to_folder.

  • Degradation on older builds — automatic fallback when the paginated results endpoint is absent, and a per-item fallback when the bulk create endpoint is broken. Both were found on a real legacy instance, not in a changelog.

  • Plumbing that fails loudly — strict zod input validation, Retry-After-aware retries with exponential backoff, error messages carrying actionable hints, read-only mode, secrets kept out of logs and tool output.

  • 1181 unit and contract tests (vitest + msw, no network) plus a gated end-to-end scenario against a real instance.

Related MCP server: mcp-zephyr-scale

Quick start

Requirements: Node.js >= 20, Jira Server/DC with the Zephyr Scale plugin, and a Personal Access Token (Jira 8.14+) or a username/password pair.

Nothing to clone — the package is on npm. Claude Code:

claude mcp add zephyr-scale \
  --env JIRA_BASE_URL=https://jira.example.com \
  --env JIRA_PAT=<personal access token> \
  --env ZEPHYR_DEFAULT_PROJECT_KEY=PROJ \
  --env ZEPHYR_ALLOW_INTERNAL_API=true \
  -- npx -y zephyr-scale-mcp

Claude Desktop / any MCP client (claude_desktop_config.json, .mcp.json):

{
  "mcpServers": {
    "zephyr-scale": {
      "command": "npx",
      "args": ["-y", "zephyr-scale-mcp"],
      "env": {
        "JIRA_BASE_URL": "https://jira.example.com",
        "JIRA_PAT": "<personal access token>",
        "ZEPHYR_DEFAULT_PROJECT_KEY": "PROJ",
        "ZEPHYR_ALLOW_INTERNAL_API": "true"
      }
    }
  }
}
git clone https://github.com/vilaabo/zephyr-scale-mcp.git
cd zephyr-scale-mcp
npm install
npm run build        # -> dist/index.js

Then point the client at the build: "command": "node", "args": ["/path/to/zephyr-scale-mcp/dist/index.js"].

ZEPHYR_ALLOW_INTERNAL_API=true is optional and recommended. It registers 12 extra tools that reach the things the public API cannot do at all: editing a test run in place — renaming or moving it (update_test_run) and adding or removing cases without changing its key (add_test_cases_to_run, remove_test_cases_from_run) — plus listing the folder tree (get_folder_tree), deleting folders (delete_folder), editing older executions (update_test_result_by_id) and reading the exact status names the API silently expects (get_status_options). These call the same undocumented /rest/tests/1.0 endpoints the Jira UI itself uses; the vendor does not support them and they may differ or be absent on another Zephyr Scale version. Leave the flag off if that trade-off is not acceptable — the other 42 tools are unaffected.

Then ask the agent to run health_check. It verifies connectivity and credentials via GET /rest/api/2/myself and, when ZEPHYR_DEFAULT_PROJECT_KEY is set, that the Zephyr plugin answers on /rest/atm/1.0.

What you can ask your agent to do

  • "Create the folder /Regression/Payments and add step-by-step test cases for the checkout flow described in this document."

  • "Find every Draft case in /Regression, review them, and set the ready ones to Approved."

  • "Create a cycle for sprint 42 with all smoke cases, then record the results from this report — step by step where the script has steps."

  • "Which test cases cover PROJ-123, and when did each of them last pass?" — traceability from the issue to its cases and their latest executions.

  • "Take this ZIP of Cucumber JSON reports and publish it as a new cycle in PROJ." — automation import; scenarios are matched to BDD cases by their @TestCaseKey=PROJ-T1 tag.

  • "Add two steps to PROJ-T55 after step 3." — existing steps and their ids survive.

  • "Recreate cycle PROJ-R7 with three more cases, keep the results, and delete the original."

Configuration

Variable

Required

Default

Purpose

JIRA_BASE_URL

yes

Jira base URL without a trailing /, e.g. https://jira.example.com

JIRA_AUTH

no

pat

pat | basic

JIRA_PAT

with pat

Jira Server/DC Personal Access Token

JIRA_USERNAME, JIRA_PASSWORD

with basic

Basic-auth credentials

JIRA_TIMEOUT_MS

no

30000

Per-request timeout

JIRA_MAX_RETRIES

no

2

Retries for GET and for any 429/503, honoring Retry-After, otherwise exponential backoff with jitter

JIRA_TLS_REJECT_UNAUTHORIZED

no

true

false accepts self-signed certificates — this disables TLS verification process-wide and prints a warning to stderr

ZEPHYR_DEFAULT_PROJECT_KEY

no

Used whenever a tool is called without projectKey

ZEPHYR_READONLY

no

false

true makes every write tool refuse with an error; read tools keep working

ZEPHYR_ALLOW_INTERNAL_API

no

false

true registers the 12 UNOFFICIAL tools backed by the internal /rest/tests/1.0 API

ZEPHYR_LOG_LEVEL

no

info

debug | info | warn | error

Two guarantees the tests cover: JIRA_PAT and JIRA_PASSWORD never appear in logs, tool output or error messages — in any encoding they can take on the way out: raw, JSON-escaped, or the base64 basic-auth token (error text carries the method and path only — never the query string, which may contain data) — and stdout is reserved for the MCP protocol, every log line goes to stderr. One deliberate exception: a secret shorter than six characters is left alone, because redacting it would corrupt unrelated output while protecting nothing; the server warns about it at startup.

Configuration is validated at startup: all problems are reported at once and the process exits with a non-zero code rather than starting half-configured.

Tools

54 tools. The 42 public ones are always registered; the 12 in the last group only with ZEPHYR_ALLOW_INTERNAL_API=true.

Tool

What it does

create_test_case

Create a case with a STEP_BY_STEP / PLAIN_TEXT / BDD script, parameters, custom fields, Call-to-Test steps

get_test_case

Read a case, optionally narrowed by fields; step ids come back here

search_test_cases

TQL search with pagination; a query longer than 1500 characters is sent as POST /testcase/search (which supports only projectKey, key, name)

update_test_case

Partial update; testScript.steps is synchronized by id (see limitation 7)

add_test_steps

Insert steps at a position without losing the existing ones — read, merge by id, write back

set_test_script

Replace the whole script or change its format; destructive by design

clone_test_case

Copy a case inside its project with fresh step ids; links, attachments and history are not copied

move_test_cases_to_folder

Bulk-move by explicit keys or by source folder; a failing case does not abort the rest

delete_test_case

Permanent delete of the case, its script and its history

create_test_cases_bulk

Create many cases in one call, with a per-case fallback on broken bulk endpoints

link_issues_to_test_cases

Bulk-link cases to Jira issues (additive)

get_test_cases_linked_to_issue

Reverse lookup: issue → cases

get_issue_test_coverage

Traceability report: issue → linked cases → latest execution of each

Tool

What it does

create_test_run

Create a cycle with its complete item list — optionally with each item's execution result in the same call

get_test_run

Read a cycle including its items

search_test_runs

TQL search — for runs only projectKey and folder are searchable

delete_test_run

Permanent delete of the cycle and all its results

get_test_run_results

Page through the executions of a cycle, with the legacy flat-endpoint fallback

get_test_run_summary

Last execution per item: byStatus counts verbatim, executionProgressPct, passRatePct when a literal Pass status exists

recreate_test_run_with_items

The public workaround for run immutability: rebuild under a new key with cases added or removed, optionally carrying the last results over and deleting the original

Tool

What it does

create_test_result

Append a new execution to a run item, including per-step scriptResults

update_last_test_result

Partial update of the most recent execution of an item

create_test_results_bulk

Many executions for one cycle in a single call

get_latest_result_for_test_case

The execution of a case with the greatest stored execution date, across all cycles — not necessarily the one recorded last

Items that exist several times in a run (per environment or per assignee) are disambiguated with matchEnvironment / matchUserKey, sent as query parameters.

Tool

What it does

create_test_plan

Create a plan; returns { key }, e.g. PROJ-P123

get_test_plan

Read a plan with its linked runs and issues

update_test_plan

Partial update

delete_test_plan

Permanent delete

search_test_plans

TQL search; the searchable field set varies by Zephyr Scale version

Tool

What it does

create_folder

Create a case / plan / cycle folder from a full path; with recursive (default true) a 400 on the full path triggers creating each parent prefix and one retry — 403, 409 and 5xx propagate untouched

rename_folder

Rename one folder segment by its numeric id (and optionally set its custom fields)

Tool

What it does

upload_attachment

Attach a local file to a case, a case step, a cycle, a result or a result step (multipart)

list_attachments

List the attachments of any of those targets; each record carries the id and url the other tools need

download_attachment

Save an attachment by id or by the url list_attachments returned — that url must be on the configured Jira host. The only public tool that reads from the internal API: attachment content is served by /rest/tests/1.0/attachment/{id}, which exists regardless of ZEPHYR_ALLOW_INTERNAL_API

delete_attachment

Permanently delete one attachment by numeric id

Tool

What it does

upload_automation_results

Publish a ZIP of results in Zephyr's custom JSON format; always creates a new cycle

upload_cucumber_results

Publish a ZIP of Cucumber JSON reports; scenarios are matched by their @TestCaseKey=PROJ-T1 tag

download_feature_files

Export BDD cases as a ZIP of .feature files; tql is required and uses the testCase.-prefixed dialect. The archive is written only after its PK signature is verified, so an HTML login page served with HTTP 200 fails instead of leaving a corrupt file

Tool

What it does

health_check

Jira reachability, credentials, and whether the Zephyr plugin answers

list_environments

The project's environments — the exact case-sensitive names results reference

create_environment

Create an environment in the project

find_jira_user

Resolve the Jira user key (JIRAUSER10000) that owner / executedBy / assignedTo require

Registered only with ZEPHYR_ALLOW_INTERNAL_API=true. These call /rest/tests/1.0, the undocumented API behind the Jira UI. The vendor does not support it: endpoints may differ or be absent on another Zephyr Scale version, and a 404/405 from one of these tools means exactly that. Every request shape below was either captured from the Jira UI's own traffic or verified live against a real instance — never guessed. Errors from this layer carry a hint saying so.

Tool

What it does

update_test_run

Rename a cycle, move it to another folder (by numeric folder id) or change its planned dates in place, keeping its key, items and results. No PUT /testrun exists in the public API

add_test_cases_to_run

Append cases to an existing cycle in place; the key and the existing results survive

remove_test_cases_from_run

Remove items from an existing cycle in place — their whole execution history dies with them

reorder_test_run_items

Reorder the items of an existing cycle; a cycle already in the requested order makes no write at all

link_issues_to_test_run

Link Jira issues to an existing cycle — the public API rejects an issueLinks field on runs outright, so this is the only way

link_test_run_to_plan

Associate an existing cycle with a test plan after creation (the public API accepts testPlanKey only at creation)

delete_test_results

Delete individual executions by numeric id. The last execution of an item cannot be deleted

update_test_result_by_id

Edit any execution in an item's history, including older ones; status is resolved from its case-sensitive name to the internal id

get_folder_tree

The full folder tree of a project with the numeric ids rename_folder, delete_folder and update_test_run need. Each entity type has its own tree

get_status_options

The exact internal names of the project's execution statuses, case statuses or priorities — the values the public API silently ignores when they are wrong

get_custom_field_definitions

Custom field definitions per entity type: names, types, required flags, options

delete_folder

Delete a folder by numeric id. What happens to a non-empty folder is version-specific — empty it first

Working around API v1

These are the constraints the server is built around. Every tool description repeats the ones relevant to it, so the agent sees them at call time.

  1. Test runs are immutable. There is no PUT /testrun: a run cannot be renamed, moved, or have cases added or removed. Its items are fixed at creation and the run status is derived from item statuses. Escape hatches: recreate_test_run_with_items (public, produces a new key) or the internal update_test_run / add_test_cases_to_run / remove_test_cases_from_run (same key).

  2. Folders are never created implicitly. create_test_case, create_test_run and create_test_plan fail with 400 on an unknown folder. Folders also cannot be listed through the public API, and renaming needs the numeric id returned by create_folder — or get_folder_tree with the internal API enabled.

  3. owner / executedBy / assignedTo take a Jira user key (JIRAUSER10000), never a username or an e-mail. find_jira_user resolves it.

  4. TQL is strict: spaces around operators are mandatory, string values go in double quotes, AND is the only connector (no OR), and folder paths start with /. Test runs are searchable by projectKey and folder only. For single/multi-choice custom fields = does not work — use IN.

  5. Statuses, priorities and environments are case-sensitive internal names. Built-in statuses are shown localized in the UI (the label you see for Draft may be a translation) while custom ones use their literal names — get_status_options shows what the API actually expects. A wrong execution status is silently ignored by the public API.

  6. A BDD script is the scenario body only — bare Given / When / Then / And / But lines. Text wrapped in Feature: / Scenario: is rejected with 400 Invalid BDD Script; the wrapper is generated on export.

  7. STEP_BY_STEP steps are synchronized by id on PUT: a step without an id is created, a step with an id is updated, and every stored step missing from the list is deleted. Always send the complete final list with ids carried over from get_test_case — or let add_test_steps do the read-merge-write.

  8. Deprecated fields are intentionally not accepted: use issueLinks instead of issueKey, actualEndDate instead of executionDate, executedBy instead of userKey.

Quirks of older plugin builds

All of the following was observed live on a real legacy Zephyr Scale Server instance and is covered by tests.

  • Cycle keys may use the -C prefix (PROJ-C34) instead of -R. Every run-key parameter takes the key as-is, so pass whatever your instance shows.

  • GET /testrun/{key}/testresults/page may not exist. get_test_run_results and get_test_run_summary fall back to the deprecated flat endpoint and paginate client-side, adding a note to the response. A run that genuinely does not exist still surfaces as a 404.

  • An overall status sent together with scriptResults is ignored. Send the step results first, then set the overall status with update_last_test_result.

  • POST /testcase/link-issues may answer 500. Link through update_test_case with issueLinks instead.

  • POST /testcase/bulk may answer HTTP 500 with an empty body for any payload while single creation works. create_test_cases_bulk falls back to creating the cases one by one — on any 5xx, and on a JSON 404 (which means "no such endpoint on this build", unlike the HTML 404 Jira serves when the plugin is absent) — and reports which ones succeeded (#1). Every other 4xx is a payload error and is not retried.

  • Posting a result for a case that is not among the run's items silently adds it to the run on this build; other builds reject the call with 400/404. The result tools document both.

  • The custom automation-results format is validated strictly. {"version": 1, "executions": [{"source", "result", "testCase": {"key"}}]} works; extra per-execution fields such as executionTime are rejected with Invalid Custom Format JSON file. Cucumber JSON reports work as-is when the scenario carries @TestCaseKey=PROJ-T1.

  • download_feature_files requires the tql query parameter — the API rejects the call without it.

  • The last execution of a run item cannot be deleted. delete_test_results rejects it; remove the item instead.

  • Custom fields may be absent entirely — the definitions endpoint then returns [].

Development

npm run typecheck    # tsc --noEmit, strict
npm test             # 1181 unit + contract tests (vitest + msw), no network
npm run build        # tsup -> dist/index.js
npm run smoke        # 13 end-to-end tests, ZEPHYR_E2E=1, real instance required

The smoke scenario is skipped unless ZEPHYR_E2E=1. It needs a real JIRA_BASE_URL, credentials and a dedicated ZEPHYR_DEFAULT_PROJECT_KEY — it creates and deletes real entities and leaves /mcp-smoke-* folders behind, since the public API cannot delete folders.

src/
├── index.ts             # bootstrap: config, tool registration, stdio transport
├── config.ts            # environment validation
├── http.ts              # fetch wrapper: auth, timeouts, retries, error normalization,
│                        #   multipart and binary bodies
├── schemas.ts           # shared parameter schemas, field shapes, recurring description constants
├── toolkit.ts           # defineTool(): strict zod input, read-only guard,
│                        #   JSON / isError response shaping, shared helpers
├── internal.ts          # the UNOFFICIAL /rest/tests/1.0 layer: key -> id resolution,
│                        #   run-item plumbing, status resolution, error hints
├── runResults.ts        # paged run results with the legacy fallback
├── log.ts               # leveled logger, stderr only
└── tools/               # one module per tool family: testCases, testRuns, testResults,
                         #   testPlans, folders, attachments, automation, misc,
                         #   runMaintenance, resultsMaintenance, internalRefs
test/                    # one test module per source module + negative contract tests
                         #   and the gated smoke scenario

Versioning and changelog

Version 1.0.0. Tool names, parameter names and response shapes are a public contract from this release on and change only in a major version. See CHANGELOG.md.

License

MIT

Available Tools

22 tools
add_test_stepsA

Add steps to a STEP_BY_STEP test case without losing the existing ones. Composite operation: reads the test case, merges the new steps at the requested position while preserving existing step ids (so nothing is deleted), and writes the full list back. position: 'append' (default) adds after the last step, 'prepend' before the first, an integer inserts at that 0-based index (clamped to the current length). Only valid when the current script is STEP_BY_STEP or the test case has no script yet (a step-by-step script is then created); for a PLAIN_TEXT or BDD script use set_test_script instead. Returns { key, totalSteps }.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesNew steps to insert, in order (no ids). A step carrying testCaseKey is a "Call to Test".
positionNo'append' (default), 'prepend', or a 0-based insertion index into the existing steps (clamped to the list length)
testCaseKeyYesTest case key, e.g. PROJ-T123

TDQS

A4.9/5.0
Behavior5/5

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

Without annotations, the description fully covers behavioral traits: composite operation (read, merge, write), position behavior (append/prepend/clamped integer), preservation of existing step ids, and return value { key, totalSteps }.

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?

Five sentences, front-loaded with purpose, efficient and no wasted words. Every sentence adds essential information.

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 of the operation (composite read-merge-write, position logic, script type restrictions) and lack of output schema, the description covers all necessary context completely.

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 is 3. The description adds value by explaining position options in detail, clarifying that steps carry no ids, and noting the 'Call to Test' special step.

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 starts with a specific verb and resource: 'Add steps to a STEP_BY_STEP test case without losing the existing ones.' It clearly distinguishes from sibling tools like set_test_script, which is for other script types.

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 states when to use: only when the script is STEP_BY_STEP or no script yet. Provides a clear alternative: for PLAIN_TEXT or BDD scripts, use set_test_script instead.

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

clone_test_caseA

Clone a Zephyr Scale test case within its project — composite read+create: reads the source test case and creates a copy with the same objective, precondition, status, priority, owner, labels, custom fields, parameters and (by default) test script. Step ids are never carried over (the copy gets fresh steps), and execution history/attachments are NOT copied. The copy's name defaults to ' (copy)'; folder defaults to the source folder. Returns { key, url, sourceKey }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of the copy (defaults to '<source name> (copy)')
folderNoFolder path for the copy, starting with '/' (defaults to the source folder; must exist)
testCaseKeyYesKey of the SOURCE test case, e.g. PROJ-T123
includeScriptNoCopy the test script too (default true)

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 full burden and excels: it discloses the composite operation, what is copied (objective, precondition, status, etc.), what is not (step ids, execution history, attachments), defaults for name and folder, and return format.

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?

The description is informative but slightly verbose; however, every sentence adds value and the structure is logical, starting with the main action then detailing specifics.

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 clone tool with 4 parameters and no output schema, the description is fully complete: it explains the return format ({ key, url, sourceKey }), covers all behaviors, and provides sufficient context for effective use.

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%, but the description adds significant meaning beyond the schema: it explains that folder must exist, name defaults to '<source name> (copy)', includeScript defaults true, and provides context for each 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?

The description clearly states the tool clones a Zephyr Scale test case within its project, distinguishing it from siblings like create_test_case or update_test_case by specifying it's a composite read+create operation.

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 explains when to use the tool and explicitly lists what is not copied (execution history, attachments), but could be more explicit about when not to use it or point to alternative tools for copying attachments/history.

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

create_folderA

Create a Zephyr Scale folder for test cases, test plans or test runs (test cycles). name is the FULL path from the root and must start with "/", e.g. "/Regression/Payments". With recursive=true (default) missing parent folders are created automatically: if the API rejects the full path with 400, every parent prefix is created from the root and the full path is retried. Folders are NOT auto-created by create_test_case / create_test_run — create them with this tool first. The public Server/DC API v1 cannot LIST folders, so keep the numeric id returned by create_folder — rename_folder needs it (otherwise the id can only be found in the Jira UI).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull folder path from the root, starting with "/", e.g. "/Regression/Payments"
typeYesFolder kind: TEST_CASE (test case folders), TEST_PLAN (test plan folders) or TEST_RUN (test cycle folders)
recursiveNoCreate missing parent folders automatically on a 400 response (default true). Handled client-side, never sent to the API.
projectKeyNoJira project key; defaults to ZEPHYR_DEFAULT_PROJECT_KEY

TDQS

A4.9/5.0
Behavior5/5

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

With empty annotations, description fully covers behavior: recursive handled client-side, auto-creation on 400, no auto-creation by other tools, and API limitation (cannot list folders). Discloses that id must be saved for later use.

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?

The description is relatively long but every sentence adds value. It is well-structured: purpose first, then parameter details, then behavioral notes. Could be slightly more concise, but justified given complexity.

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 no output schema and 4 parameters (2 required), the description covers all necessary context: usage, parameter semantics, behavioral quirks, dependencies (rename_folder). Complete guidance for correct invocation.

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% with descriptions, but the description adds significant context: explains name must be full path from root, recursive default true and client-side handling, projectKey defaults to environment variable. This goes beyond schema definitions.

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 clearly states the tool creates a Zephyr Scale folder for test cases, test plans, or test runs. It specifies the resource and action, and distinguishes from sibling tools like create_test_case and create_test_run by noting they do not auto-create folders.

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?

Provides explicit guidance: when to use (before test case/run creation), name format (absolute path starting with /), recursive behavior, and hierarchical name convention. Also advises keeping the numeric id since the API cannot list folders, and notes rename_folder needs it.

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

create_test_caseA

Create a Zephyr Scale test case (POST /testcase). Returns { key, url } with a key like PROJ-T123. Constraints: the folder, if given, MUST already exist — the API never creates folders (use create_folder first); status and priority are case-sensitive internal names (defaults 'Draft'/'Approved'/'Deprecated' and 'High'/'Normal'/'Low'; instances may define custom ones); owner is a Jira user key like JIRAUSER10000 (resolve with find_jira_user); estimatedTime is in milliseconds. testScript formats: STEP_BY_STEP with steps (a step carrying testCaseKey is a 'Call to Test' that inlines another test case), PLAIN_TEXT with text, or BDD with text holding ONLY Gherkin step lines (Given/When/Then/And/But, stored verbatim) — do NOT include 'Feature:'/'Scenario:' headers, the API rejects them with 400 'Invalid BDD Script'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTest case name
ownerNoOwner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
folderNoFull folder path from the root starting with "/", e.g. "/Regression/Payments". The folder MUST already exist (create it with create_folder).
labelsNoLabels; the API replaces spaces with underscores
statusNoTest case status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones.
priorityNoPriority. Defaults: 'High', 'Normal', 'Low' — case-sensitive; instances may define custom ones.
componentNoName of a Jira component of the project
objectiveNoObjective (HTML allowed)
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
parametersNoTest case parameters: { variables: [{name, type: FREE_TEXT | DATA_SET, dataSet?}], entries: [{<variable>: <value>}] }
projectKeyNoJira project key; defaults to ZEPHYR_DEFAULT_PROJECT_KEY
testScriptNoTest script. STEP_BY_STEP: {type, steps: [{description?, testData?, expectedResult?, testCaseKey?}]}; PLAIN_TEXT/BDD: {type, text}.
customFieldsNoCustom field values keyed by field name
preconditionNoPrecondition (HTML allowed)
estimatedTimeNoEstimated duration in milliseconds

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 fully discloses behavior: return value format, folder creation avoidance, case sensitivity of status/priority, owner key format, estimatedTime unit, and API rejection of invalid BDD scripts. This is comprehensive.

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?

The description is a single long paragraph but front-loaded with purpose. It packs much necessary detail without excessive verbosity. Some redundancy with schema descriptions could be trimmed, but overall well-structured.

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 (15 params, nested objects) and no output schema, the description covers return values, constraints, error responses, and parameter specifics. It addresses all likely questions an agent might have.

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 the schema already documents parameters. The description adds extra clarity on testScript formats (e.g., 'Call to Test', BDD restrictions) and relationships between parameters like folder and owner. This adds moderate value 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?

The description begins with 'Create a Zephyr Scale test case' specifying the verb and resource, and includes the HTTP method and return format. It clearly distinguishes from siblings like clone_test_case, update_test_case, and create_folder by referencing them.

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?

The description provides explicit constraints and prerequisites: folder must exist (use create_folder), owner must be a Jira user key (resolve with find_jira_user), and warns against incorrect BDD format. While it doesn't explicitly say when not to use this tool or list alternatives, the context is clear.

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

create_test_planA

Create a Zephyr Scale test plan (POST /testplan). Returns { key } with a key like PROJ-P123 (no UI url — it cannot be built reliably for test plans). Constraints: the folder, if given, MUST be an existing folder of type TEST_PLAN — the API never creates folders (use create_folder with type TEST_PLAN first); status is a case-sensitive internal name (defaults 'Draft'/'Approved'/'Deprecated'; instances may define custom ones); owner is a Jira user key like JIRAUSER10000 (resolve with find_jira_user).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTest plan name
ownerNoOwner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
folderNoFull TEST_PLAN folder path from the root starting with "/", e.g. "/Releases/2026". The folder MUST already exist — create it first with create_folder using type TEST_PLAN.
labelsNoLabels; the API replaces spaces with underscores
statusNoTest plan status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones.
objectiveNoObjective (HTML allowed)
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
projectKeyNoJira project key; defaults to ZEPHYR_DEFAULT_PROJECT_KEY
customFieldsNoCustom field values keyed by field name

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 full burden. It discloses the return format ({ key }), notes that no UI URL can be built, and lists constraints (folder existence, status case-sensitivity). However, it does not mention idempotency, rate limits, or potential side effects beyond resource creation.

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?

The description is front-loaded with the main action and return, then constraints. It is informative but slightly verbose with multiple parenthetical asides. Every sentence adds value, though some could be tightened.

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 no output schema, the description explains the return format. It covers creation constraints, parameter special cases, and provides necessary context for a complex creation tool with 9 parameters and nested objects.

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%, but the description adds value beyond the schema: it clarifies that folder MUST exist (schema only says 'full path'), status is case-sensitive (schema only lists defaults), and owner must be a resolved Jira user key (schema hints but description directs to find_jira_user).

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 clearly states the action 'Create a Zephyr Scale test plan' and specifies the HTTP method (POST /testplan). It distinguishes this tool from siblings like 'create_folder' and 'find_jira_user' by referencing them in constraints.

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?

The description provides explicit usage context: folder must already exist (ties to create_folder), status is case-sensitive and has defaults, owner is a Jira user key (ties to find_jira_user). It tells when to use alternatives (create_folder first) and includes constraints.

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

create_test_results_bulkA

Create NEW executions (test results) for several test cases of one test run in a single call. Every element's testCaseKey must already be one of the run's items — the run's item list is fixed when the run is created and this tool cannot extend it. In each element only the fields you pass are sent. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. Durations (executionTime) are in milliseconds; dates are ISO 8601. scriptResults record per-step outcomes as { index (0-based), status, comment? }. matchEnvironment / matchUserKey apply to the whole batch and disambiguate run items when the same test case is included in the run several times. Returns the array of created result ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
resultsYesOne entry per result to create; each targets an existing run item by testCaseKey
testRunKeyYesTest run (cycle) key, e.g. PROJ-R123
matchUserKeyNoRun-item selector, sent as the 'userKey' QUERY parameter (never in the body): when the same test case is included in the run as several items, targets the item by its executor's Jira user key (e.g. 'JIRAUSER10000').
matchEnvironmentNoRun-item selector, sent as the 'environment' QUERY parameter (never in the body): when the same test case is included in the run as several items, targets the item with this environment (case-sensitive). Distinct from the 'environment' body field, which sets the environment recorded on the result.

TDQS

A4.4/5.0
Behavior4/5

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

With empty annotations, the description carries full burden. It discloses creation behavior, immutability of run items, optional field sending, default statuses, units (ms for time, ISO 8601 for dates), scriptResults format, and batch-level disambiguation via matchEnvironment/matchUserKey as query parameters. Lacks error case disclosure but is otherwise thorough.

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 a single, well-organized paragraph of around 150 words. It front-loads the main purpose and every sentence provides necessary detail without redundancy. No wasted words.

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?

Given the tool's complexity (bulk creation, multiple parameters, nuanced behavior), the description is largely complete: it covers prerequisites, default statuses, units, date format, per-step results, disambiguation, and return value. Lack of error handling or permission notes 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 100%, but the description adds value beyond schema by clarifying the batch application of matchEnvironment/matchUserKey as query parameters, the requirement that testCaseKey be a run item, and the format of scriptResults. It enriches understanding of parameter behavior.

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 clearly states 'Create NEW executions (test results) for several test cases of one test run in a single call.' It specifies the verb (create), resource (executions/test results), and scope (bulk), distinguishing it from single-creation sibling create_test_result and other bulk tools for different resources.

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?

The description provides context on when to use: for bulk creation of results within a single run, with the constraint that testCaseKeys must already be run items. It implies exclusion of single-result operations but does not explicitly name alternatives or when not to use this tool.

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

create_test_runA

Create a Zephyr Scale test run (test cycle; key like PROJ-R123). IMPORTANT API v1 limitation: a test run is IMMUTABLE after creation — there is no PUT /testrun/{key}. A run cannot be renamed, moved to another folder, and test cases cannot be added to or removed from it later; the set of items is fixed ONLY at creation time. The run status is computed automatically from the statuses of its items and cannot be set directly. Therefore pass the COMPLETE list of test cases in items now — each item may also carry full execution result fields (status, executedBy, executionTime, actualStartDate/actualEndDate, per-step scriptResults, etc.), which allows importing a run together with its results in a single call. To record or update executions of the included items afterwards, use the test result tools. Item/result statuses default to 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' (case-sensitive; instances may define custom ones).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTest run name (cannot be changed after creation)
itemsNoTest cases to include in the run — this is the ONLY place where the run composition can be set. Each item requires testCaseKey and may carry full execution result fields (status, environment, executedBy, assignedTo, comment, executionTime, actualStartDate, actualEndDate, customFields, issueLinks, scriptResults).
ownerNoOwner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
folderNoFull path of a TEST_RUN folder starting with "/", e.g. "/Regression". The folder MUST already exist (create it with create_folder, type TEST_RUN); it is not created automatically.
versionNo
iterationNo
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
projectKeyNoJira project key; defaults to ZEPHYR_DEFAULT_PROJECT_KEY
testPlanKeyNoKey of the test plan to associate the run with, e.g. PROJ-P123
customFieldsNoCustom field values keyed by field name
plannedEndDateNoISO 8601 (passed through as-is)
plannedStartDateNoISO 8601, e.g. 2026-07-20T00:00:00Z (passed through as-is)

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 discloses behavioral traits: immutability, automatic status computation, case-sensitive status values, and the inability to rename or move. It also explains the default statuses.

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?

The description is structured with a clear 'IMPORTANT' section and front-loads critical limitations. However, it is somewhat verbose; a slightly more concise version would improve readability without losing value.

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 tool's complexity (12 parameters, nested objects, no output schema), the description is comprehensive. It covers creation constraints, parameter details, defaults, and references sibling tools, leaving minimal gaps for an AI agent.

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 high (83%), but the description adds meaningful context beyond the schema, such as the requirement for Jira user keys, folder existence precondition, and case sensitivity of statuses. This adds value while the schema already documents most parameters.

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 clearly states the tool creates a Zephyr Scale test run, specifying the key format (PROJ-R123). It distinguishes from siblings by explaining that after creation, updates to executions should use test result 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?

The description explicitly warns about the API v1 limitation: the test run is immutable after creation. It advises passing the complete list of items now and points to test result tools for later updates, providing clear when-to-use and when-not-to-use guidance.

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

delete_test_planA
Destructive

Permanently delete a Zephyr Scale test plan (DELETE /testplan/{testPlanKey}). This cannot be undone. Returns { deleted: true, key }.

ParametersJSON Schema
NameRequiredDescriptionDefault
testPlanKeyYesTest plan key, e.g. PROJ-P123

TDQS

A4/5.0
Behavior4/5

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

Adds 'This cannot be undone' and return value, going beyond the destructiveHint annotation. No contradictions.

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?

Single sentence with clear action, endpoint, and consequence. No wasted words.

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?

Covers key points: deletion, irreversibility, return value. Could mention permissions or side effects but adequate for low complexity.

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 has 100% description coverage with example (PROJ-P123). Tool description adds no further parameter details.

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?

Clearly states the action (permanently delete) and resource (test plan), with the HTTP endpoint. Distinct from sibling tools like delete_test_case or delete_test_run.

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?

Implies usage for permanent removal but lacks explicit guidance on when to use vs alternatives or when not to use (e.g., if test plan is linked to other data).

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

download_attachmentA
Read-only

Download a Zephyr Scale attachment to a local file. Address it either by attachmentId (from list_attachments or an upload response) or by the exact url field that list_attachments returns — pass exactly one of the two. Note: Zephyr Scale serves attachment content from /rest/tests/1.0/attachment/{id}; that is the URL the official list endpoint itself hands out, so this tool follows it. For safety, a passed url must point at the configured Jira host — credentials are never sent elsewhere. The file is written to outputPath on the machine running this MCP server (the parent directory must exist). Returns { savedTo, bytes }.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoExact download url as returned by list_attachments; must be on the configured Jira host
outputPathYesLocal path to write the file to (the parent directory must exist)
attachmentIdNoNumeric attachment id (from list_attachments or an upload response)

TDQS

A4.5/5.0
Behavior4/5

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

Discloses important behavioral traits: mutual exclusion of parameters, URL safety check, file writing prerequisites, and return format. Adds value beyond the readOnlyHint annotation.

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?

Concise and well-structured: first sentence states purpose, subsequent sentences detail usage and constraints. No unnecessary information.

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?

Completely covers all necessary aspects: action, parameters, safety, output format, and prerequisites. No gaps given the tool's simplicity and presence of annotations.

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?

Adds meaning beyond schema by explaining mutual exclusivity of attachmentId and url, and providing safety context. Schema coverage is 100% but description enriches understanding.

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?

Clearly states 'Download a Zephyr Scale attachment to a local file', specifying verb and resource. Differentiates from siblings like upload_attachment and delete_attachment.

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?

Provides clear instructions on addressing by attachmentId or url, safety constraints, and file writing requirements. Does not explicitly compare to alternatives but gives sufficient context.

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

get_issue_test_coverageA
Read-only

Traceability report for a Jira issue: lists the Zephyr Scale test cases linked to the issue together with the latest execution result of each (composite read-only: GET /issuelink/{issueKey}/testcases, then per case GET /testcase/{key} and GET /testcase/{key}/testresult/latest). lastResult is null when the case has never been executed. Makes up to 2 HTTP calls per case — cap the volume with maxCases (default 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
issueKeyYesJira issue key, e.g. PROJ-123
maxCasesNoMaximum number of linked cases to expand (default 50)
includeLastResultsNoFetch the latest execution result per case (default true)

TDQS

A4.7/5.0
Behavior5/5

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

Discloses composite nature (up to 2 HTTP calls per case), default cap (50), and that lastResult is null when never executed. Confirms readOnlyHint annotation. This adds significant context beyond 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?

Two sentences: first defines purpose, second explains technical details and caveats. No redundant information, front-loaded with the core functionality.

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 complexity (composite, multiple API calls) and no output schema, the description fully covers behavior: null results, volume cap, default behavior, and composite nature. It is sufficient for correct invocation.

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%, but description adds value by explaining default values (maxCases=50, includeLastResults=true) and the purpose of each parameter in context of the composite operation.

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 clearly states it generates a traceability report listing linked test cases and their latest execution results. It distinguishes from the sibling 'get_test_cases_linked_to_issue' by including results and calling it a composite read-only operation.

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?

The description implies usage for obtaining test coverage with results, and warns about the number of HTTP calls, advising to cap volume with maxCases. However, it does not explicitly state when not to use it (e.g., if only list is needed).

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

get_latest_result_for_test_caseA
Read-only

Get the latest (most recent) execution result of a test case across ALL test runs (cycles). Use get_test_run_results to read the results of one specific run instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
testCaseKeyYesTest case key, e.g. PROJ-T123

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, which is consistent. The description adds behavioral context: it returns the latest result across all runs, implying a broad scope. No destructive effects are mentioned, but none are needed.

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 two sentences, immediately states the core functionality, and includes a useful comparison. Every word earns its place.

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 tool's simplicity (single required parameter, no output schema, read-only operation), the description fully addresses what the agent needs to know. It covers purpose, scope, and alternative.

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?

The schema alone provides full coverage (100%) with a clear description for 'testCaseKey'. The tool description adds no extra semantic detail beyond the schema, so a baseline score of 3 is appropriate.

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 clearly states it retrieves the most recent execution result across all test runs. It specifies the verb 'get', the resource 'execution result', and distinguishes from the sibling tool 'get_test_run_results', which targets a specific run.

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?

The description explicitly contrasts with the sibling tool 'get_test_run_results', telling the agent when to use each. It could mention other alternatives, but the provided guidance is clear.

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

get_test_caseA
Read-only

Read a Zephyr Scale test case by key (GET /testcase/{testCaseKey}). Optionally restrict the payload with fields. STEP_BY_STEP scripts come back with per-step ids — those ids are required to edit steps safely via update_test_case (add_test_steps handles them automatically).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoReturn only these fields, e.g. ["key","name","status","testScript"]; sent to the API as a comma-separated list
testCaseKeyYesTest case key, e.g. PROJ-T123

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and description confirms read operation. Adds context about per-step ids and safe editing, going beyond the annotation. No contradictions.

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 concise sentences, front-loaded with primary action. No fluff.

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?

No output schema, but description hints at return values (per-step ids). Covers key usage context. Could briefly mention default return structure if fields not specified, but 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 100%. Description adds that fields are sent as comma-separated list and that the parameter is optional, providing extra meaning 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?

Clearly states 'Read a Zephyr Scale test case by key' with the API endpoint. Distinguishes from siblings like search_test_cases and update_test_case.

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?

Explains that fields parameter is optional and notes that per-step ids are required for safe editing via update_test_case. Provides helpful cross-tool context but lacks explicit when-not-to-use guidance.

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

get_test_planA
Read-only

Read a Zephyr Scale test plan by key (GET /testplan/{testPlanKey}). Optionally restrict the payload with fields. The response includes linked test runs and issues when present.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoReturn only these fields, e.g. ["key","name","status"]; sent to the API as a comma-separated list
testPlanKeyYesTest plan key, e.g. PROJ-P123

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, and the description confirms a read operation. It adds useful behavioral details about optional field restriction and response contents (linked test runs and issues).

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 with no wasted words. The first sentence includes the HTTP method and endpoint, front-loading the core purpose.

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 read tool with no output schema, the description covers the main functionality, options, and response content. It could mention that the response is a JSON object, but the tool's HTTP nature implies 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 coverage is 100%, so the schema already documents both parameters adequately. The description only briefly mentions optional field restriction, adding little 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?

The description clearly states the tool reads a test plan by key, uses HTTP GET, and specifies the endpoint. It distinguishes from siblings like search_test_plans which list multiple plans.

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?

The description lacks explicit guidance on when to use this tool versus alternatives like search_test_plans or get_test_run. It does not state when not to use it.

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

get_test_runA
Read-only

Read a Zephyr Scale test run (test cycle) by key, including its items. IMPORTANT API v1 limitation: a test run is IMMUTABLE after creation — there is no PUT /testrun/{key}. A run cannot be renamed, moved to another folder, and test cases cannot be added to or removed from it later; the set of items is fixed ONLY at creation time. The run status is computed automatically from the statuses of its items and cannot be set directly. Use get_test_run_results to page through the execution results of the run.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoRestrict the response to these fields (serialized comma-separated), e.g. ["key", "name", "status"]
testRunKeyYesTest run key, e.g. PROJ-R123

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses critical behavioral traits: immutability, absence of PUT endpoint, inability to rename/move/add/remove items, automatic status computation. No contradictions.

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?

Two well-organized paragraphs: first gives core purpose, second details limitations and alternatives. Efficient with no redundant text. Could be slightly more concise, but structure is good.

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 simple read tool with 2 parameters and no output schema, the description provides all necessary context: what it does, limitations, and related tool. No gaps.

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?

Both parameters have schema descriptions (100% coverage). The description adds valuable context about the return including items and status computation, which supplements the schema. Slightly above baseline 3.

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 clearly states the action ('Read'), the resource ('Zephyr Scale test run by key'), and the scope ('including its items'). It distinguishes this tool from siblings like get_test_run_results and create_test_run.

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 states when to use (to read a test run by key) and when not to (immutable after creation, no PUT). Provides alternative: use get_test_run_results for execution results. No ambiguity.

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

list_attachmentsA
Read-only

List the attachments of a Zephyr Scale test case, test run (cycle) or test result — optionally of a single step (GET /testcase/{key}[/step/{i}]/attachments, /testrun/{key}/attachments or /testresult/{id}[/step/{i}]/attachments). Addressing: target 'test_case' requires testCaseKey (stepIndex optional to address a specific step); target 'test_run' requires testRunKey (no step addressing — the API has no per-step endpoint for runs); target 'test_result' requires testResultId (stepIndex optional). Pass ONLY the identifier that matches the chosen target. Returns the attachment list as reported by the API; the numeric ids can be passed to delete_attachment.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesKind of entity the attachment belongs to: test_case, test_run or test_result
stepIndexNo0-based step index to address a single step instead of the whole entity (targets 'test_case' and 'test_result' only)
testRunKeyNoTest run (cycle) key, e.g. PROJ-R123 — required when target is 'test_run'
testCaseKeyNoTest case key, e.g. PROJ-T123 — required when target is 'test_case'
testResultIdNoNumeric test result id — required when target is 'test_result'. Result ids are returned by create_test_result / update_last_test_result / get_test_run_results.

TDQS

A4.8/5.0
Behavior4/5

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

Annotations show readOnlyHint: true; the description confirms it's a read operation. Adds context about the return format ('list as reported by the API') and that ids are usable for deletion. No pagination or error details, but adequate for the complexity.

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?

Single dense paragraph with clear front-loading of purpose followed by systematic breakdown of targets. Every sentence adds value with no redundancy.

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?

Covers all essential aspects for a list tool with multiple target types and step options. Mentions return value and downstream use of ids. No output schema, but description is self-sufficient.

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?

Adds significant meaning beyond the input schema: explains the addressing logic per target, where stepIndex is allowed, and where testResultId originates. Schema coverage is 100%, yet description enriches understanding.

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 clearly states the action ('List the attachments') and the resources (test case, test run, test result, optionally per step). It differentiates itself from siblings like delete_attachment and download_attachment by specifying exactly what it lists.

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?

Provides explicit guidance on when to use each target, which parameters are required ('Pass ONLY the identifier that matches the chosen target'), and how stepIndex applies. Mentions a sibling (delete_attachment) for context.

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

rename_folderA
Idempotent

Rename an existing Zephyr Scale folder by its numeric id (and optionally update its custom fields). name is the new name of that single folder segment, NOT a path — it must not contain "/" or "". The public Server/DC API v1 cannot LIST folders, so keep the numeric id returned by create_folder — rename_folder needs it (otherwise the id can only be found in the Jira UI).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew folder name (a single segment without "/" or "\")
folderIdYesNumeric folder id, as returned by create_folder (the API cannot list folders)
customFieldsNoCustom field values keyed by field name

TDQS

A4.5/5.0
Behavior4/5

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

Annotations provide idempotentHint=true, which the description does not contradict. Beyond that, the description discloses the name format constraint ('must not contain "/" or "\"') and explains why the numeric id is necessary (API cannot list folders). This adds behavioral context beyond the idempotency hint.

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 concise sentences: first states purpose and key parameters, second clarifies the name constraint, third explains the id sourcing limitation. No fluff, front-loaded with essential information. Every sentence serves a distinct purpose.

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 covers parameter constraints and a critical API limitation. However, it does not mention the return value or success/error behavior. Given no output schema, a brief note on expected output would improve completeness. Still, it provides enough for correct invocation.

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 the schema already documents all parameters. The description reinforces the name parameter's constraint ('single folder segment, NOT a path') and adds critical context about the folderId's origin ('as returned by create_folder'). This extra context goes 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 uses specific verb-resource pairing ('Rename an existing Zephyr Scale folder') and clearly identifies the required identifier ('numeric id'). It also distinguishes from sibling tools by noting the dependency on create_folder, which is the only way to obtain the id.

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 states the prerequisite: 'keep the numeric id returned by create_folder — rename_folder needs it (otherwise the id can only be found in the Jira UI).' This guides the agent on when to use this tool (after creation) and provides a critical constraint. Though alternatives are not listed, no sibling tool performs renaming, so no exclusion is needed.

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

search_test_plansA
Read-only

Search Zephyr Scale test plans with a TQL query (GET /testplan/search). Returns { startAt, maxResults, count, isLast, values }; isLast is the heuristic count < maxResults. Paginate with startAt (default 0) and maxResults (default 50; the API server-side default is 200). TQL syntax is strict: spaces around operators are mandatory, string values go in double quotes, and the only logical connector is AND (no OR). Commonly supported test plan fields are projectKey, folder, name and status (e.g. projectKey = "PROJ" AND status = "Approved") — the exact set varies by Zephyr Scale version.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesTQL query, e.g. projectKey = "PROJ" AND folder = "/Releases"
fieldsNoReturn only these fields, e.g. ["key","name","status"]; sent to the API as a comma-separated list
startAtNo0-based index of the first result to return (default 0)
maxResultsNoMaximum number of results to return (default 50; the API server-side default is 200)

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description reveals the return structure with isLast heuristic, pagination behavior (defaults and server-side limit), and strict TQL syntax rules (spaces, quotes, AND only). It also notes field variability by Zephyr version, providing essential behavioral context for correct usage.

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 concise at 6 sentences, front-loaded with the main purpose and endpoint. Every sentence provides essential information: purpose, return structure, pagination, TQL syntax, and common fields. No redundant or misleading statements.

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?

Despite lacking an output schema, the description fully explains the return value structure. It covers pagination, TQL syntax, and field constraints. With 4 parameters all documented, and no nested objects or enums, the description is complete for a search tool. The sibling tools confirm this is a read operation, and the description aligns perfectly.

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?

The input schema already has 100% description coverage for all 4 parameters. The description adds deeper meaning: explains the query parameter as TQL with syntax examples, clarifies the fields parameter is sent as comma-separated, and reveals the API server-side default for maxResults (200) which goes beyond the schema's stated default (50). This extra context justifies a score above baseline.

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 clearly states it searches Zephyr Scale test plans using a TQL query via the GET /testplan/search endpoint. It distinguishes from sibling tools like search_test_cases and search_test_runs by specifying 'test plans' and providing detailed TQL syntax rules.

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?

The description provides clear usage context, including pagination parameters and TQL syntax rules. While it doesn't explicitly state when not to use or name alternatives, the tool name and context signals make it obvious for searching test plans. The guidance on commonly supported fields adds practical value.

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

set_test_scriptA
DestructiveIdempotent

Replace a test case's ENTIRE script or change its format (PUT /testcase/{testCaseKey} with a full testScript). WARNING — destructive: switching a STEP_BY_STEP script to PLAIN_TEXT or BDD irreversibly deletes all existing steps, and a STEP_BY_STEP replacement deletes every existing step omitted from the list. Pass text for PLAIN_TEXT/BDD (for BDD only Gherkin step lines Given/When/Then/And/But, stored verbatim — no 'Feature:'/'Scenario:' headers, the API rejects them); pass steps for STEP_BY_STEP. Returns { key, url }.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoScript body — required for PLAIN_TEXT and BDD (Gherkin step lines only, no Feature:/Scenario: headers), not allowed for STEP_BY_STEP
typeYesNew script format
stepsNoComplete final list of steps — required for STEP_BY_STEP, not allowed otherwise. Existing steps omitted here are deleted; keep their ids (from get_test_case) to update them in place.
testCaseKeyYesTest case key, e.g. PROJ-T123

TDQS

A4.9/5.0
Behavior5/5

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

Beyond destructiveHint annotation, description details what gets destroyed (omitted steps, format switch) and specific constraints (BDD rejects headers). No contradiction with 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?

Single concise paragraph with front-loaded purpose. Every sentence adds essential information. No redundancy.

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?

Covers all necessary aspects: destructive warning, parameter conditions, return value ({ key, url }). No output schema needed. Complete for its complexity.

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%, but description adds critical context: text not allowed for STEP_BY_STEP, steps not allowed otherwise, BDD restrictions, and verbatim storage. Adds value beyond 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?

Description clearly states it replaces the entire script or changes format, with specific HTTP method and endpoint. Distinguishes from siblings like add_test_steps and update_test_case by focusing on script replacement.

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 warns about destructive behavior, states when to use (replace/change format), and gives format-specific instructions. Implicitly suggests using add_test_steps for incremental changes.

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

update_last_test_resultA
Idempotent

Update the LAST (most recent) test result of a run item. Partial update: ONLY the fields you pass are changed, everything else is preserved — do not send fields you do not want to modify. Older executions cannot be targeted; to record a new execution use create_test_result. The test case must already be one of the run's items (the run's composition is fixed at creation). Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. Durations (executionTime) are in milliseconds; dates are ISO 8601. scriptResults record per-step outcomes as { index (0-based), status, comment? }. If the same test case is included in the run as several items, disambiguate with matchEnvironment / matchUserKey.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoExecution status. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones.
commentNoComment (HTML allowed)
versionNo
iterationNo
assignedToNoAssignee. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
executedByNoExecutor. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
testRunKeyYesTest run (cycle) key, e.g. PROJ-R123
environmentNoEnvironment name as configured in the project (case-sensitive), e.g. "Chrome"
testCaseKeyYesTest case key, e.g. PROJ-T123 — must already be one of the run's items
customFieldsNoCustom field values keyed by field name
matchUserKeyNoRun-item selector, sent as the 'userKey' QUERY parameter (never in the body): when the same test case is included in the run as several items, targets the item by its executor's Jira user key (e.g. 'JIRAUSER10000').
actualEndDateNoISO 8601
executionTimeNoExecution duration in milliseconds
scriptResultsNoPer-step results (STEP_BY_STEP scripts)
actualStartDateNoISO 8601, e.g. 2026-07-20T14:00:00Z
matchEnvironmentNoRun-item selector, sent as the 'environment' QUERY parameter (never in the body): when the same test case is included in the run as several items, targets the item with this environment (case-sensitive). Distinct from the 'environment' body field, which sets the environment recorded on the result.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses key behaviors: partial update (only sent fields change), targeting only the latest result, requirement for run composition, and nuances like matchUserKey/matchEnvironment being query parameters. Annotations only provide idempotentHint, so the description carries the full behavioral burden and does so thoroughly.

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?

The description is front-loaded with the main purpose and structured logically. It covers all necessary details without being overly verbose, though a slightly tighter structure could improve conciseness.

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?

Given the complexity (17 parameters, nested objects, query parameters), the description is largely complete. It covers update semantics, limitations, data types, and disambiguation. The lack of return value description is a minor gap, but the tool's context (update) makes the return somewhat predictable.

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 high (88%), but the description adds value by explaining partial update semantics, duration units, date format, scriptResults structure, and special parameter behavior (e.g., query parameters vs body). This goes beyond schema descriptions.

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 specifies 'update the LAST (most recent) test result of a run item' with a clear verb and resource. It distinguishes from sibling 'create_test_result' by noting that older executions cannot be targeted. This provides precise purpose differentiation.

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 states when to use (update last result) and when not (use create_test_result for new execution). Also notes precondition that test case must already be a run item, and provides disambiguation hints for duplicate items. This is comprehensive guidance.

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

update_test_caseA
Idempotent

Update a Zephyr Scale test case (PUT /testcase/{testCaseKey}). PARTIAL update: only the fields you pass are changed; omitted fields keep their current values — never send empty placeholders. projectKey cannot be changed. STEP_BY_STEP step synchronization: when testScript.steps is passed, steps are matched by id — a step WITHOUT an id is CREATED, a step WITH an id is UPDATED, and any existing step MISSING from the list is DELETED. Therefore always pass the COMPLETE final list of steps, carrying over the ids of steps to keep (read them with get_test_case). To merely add steps, prefer add_test_steps, which performs that read-merge-write safely. Returns { key, url }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoTest case name
ownerNoOwner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
folderNoFull folder path from the root starting with "/", e.g. "/Regression/Payments". The folder MUST already exist (create it with create_folder).
labelsNoLabels; the API replaces spaces with underscores
statusNoTest case status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones.
priorityNoPriority. Defaults: 'High', 'Normal', 'Low' — case-sensitive; instances may define custom ones.
componentNoName of a Jira component of the project
objectiveNoObjective (HTML allowed)
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
parametersNoTest case parameters: { variables: [{name, type: FREE_TEXT | DATA_SET, dataSet?}], entries: [{<variable>: <value>}] }
testScriptNoTest script. STEP_BY_STEP: {type, steps: [{description?, testData?, expectedResult?, testCaseKey?}]}; PLAIN_TEXT/BDD: {type, text}.
testCaseKeyYesTest case key, e.g. PROJ-T123
customFieldsNoCustom field values keyed by field name
preconditionNoPrecondition (HTML allowed)
estimatedTimeNoEstimated duration in milliseconds

TDQS

A4.9/5.0
Behavior5/5

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

Discloses partial update (only passed fields changed), step sync with id-based matching, immutability of projectKey, and return format {key, url}. Despite idempotentHint annotation, the description adds critical behavioral context not available from annotations alone.

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?

Every sentence serves a purpose: partial update behavior, step sync logic, alternative tool recommendation, and return value. The most critical information (partial update, step behavior) is front-loaded, and the description is dense yet clear.

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?

Covers all key aspects for a complex 15-parameter tool: partial update semantics, step synchronization (with id-based rules), immutability constraints, and return value. No output schema exists, but the description provides the essential return structure.

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 descriptions already cover 100% of parameters, but the description adds valuable usage tips like 'never send empty placeholders', 'projectKey cannot be changed', and the step synchronization rule. This goes beyond the schema's property descriptions.

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 clearly states the tool updates a Zephyr Scale test case via PUT /testcase/{testCaseKey}, and distinguishes it from siblings like add_test_steps and set_test_script. The verb 'Update' and resource 'test case' are specific, and the partial update detail differentiates it from full replacement.

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 advises when to use add_test_steps instead for simple step additions, and explains the step synchronization behavior (create/update/delete based on id). Provides clear context for when this tool is appropriate versus alternatives.

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

update_test_planA
Idempotent

Update a Zephyr Scale test plan (PUT /testplan/{testPlanKey}). PARTIAL update: only the fields you pass are changed; omitted fields keep their current values — never send empty placeholders. projectKey cannot be changed. The same constraints as create_test_plan apply: the folder must be an existing TEST_PLAN folder, status is case-sensitive, owner is a Jira user key. Returns { key }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoTest plan name
ownerNoOwner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user.
folderNoFull TEST_PLAN folder path from the root starting with "/", e.g. "/Releases/2026". The folder MUST already exist — create it first with create_folder using type TEST_PLAN.
labelsNoLabels; the API replaces spaces with underscores
statusNoTest plan status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones.
objectiveNoObjective (HTML allowed)
issueLinksNoJira issue keys to link, e.g. ["PROJ-123"]
testPlanKeyYesTest plan key, e.g. PROJ-P123
customFieldsNoCustom field values keyed by field name

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only provide idempotentHint; description adds that it's a partial update, projectKey is immutable, and constraints from create_test_plan apply (folder existence, status case-sensitivity). Returns { key } gives basic output. No contradictions.

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?

Approximately 5 sentences, front-loaded with the partial update key point. Dense with useful info, no fluff, though could be slightly more compact.

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?

Covers main behavioral rules (partial update, immutable projectKey, constraints from create), and returns basic output shape. Good for a 9-parameter tool with nested objects, but no mention of versioning or conflict handling.

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 has 100% coverage; description adds value by noting partial update semantics, that owner must be a Jira user key resolved via find_jira_user, and that folder must already exist. Exceeds baseline.

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?

Clearly states it updates a Zephyr Scale test plan via PUT, specifies it's a partial update (only passed fields change), and contrasts with create_test_plan by noting the endpoint and immutable projectKey.

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 describes the partial update behavior, warns against sending empty placeholders, mentions projectKey cannot be changed, and directs to resolve owner via find_jira_user, with references to create_test_plan constraints.

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

upload_attachmentA

Upload a file as an attachment to a Zephyr Scale test case, test run (cycle) or test result — optionally to a single step (POST multipart/form-data to /testcase/{key}[/step/{i}]/attachments, /testrun/{key}/attachments or /testresult/{id}[/step/{i}]/attachments). Addressing: target 'test_case' requires testCaseKey (stepIndex optional to address a specific step); target 'test_run' requires testRunKey (no step addressing — the API has no per-step endpoint for runs); target 'test_result' requires testResultId (stepIndex optional). Pass ONLY the identifier that matches the chosen target. filePath must be an absolute path of a file ON THE MACHINE RUNNING THIS MCP SERVER (the file is read from local disk). Returns the attachment metadata reported by the API, or { uploaded, fileName, size } when the API responds with an empty body.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesKind of entity the attachment belongs to: test_case, test_run or test_result
fileNameNoFile name to store in Zephyr Scale; defaults to the basename of filePath
filePathYesAbsolute path of the file to upload on the machine running this MCP server
stepIndexNo0-based step index to address a single step instead of the whole entity (targets 'test_case' and 'test_result' only)
testRunKeyNoTest run (cycle) key, e.g. PROJ-R123 — required when target is 'test_run'
testCaseKeyNoTest case key, e.g. PROJ-T123 — required when target is 'test_case'
testResultIdNoNumeric test result id — required when target is 'test_result'. Result ids are returned by create_test_result / update_last_test_result / get_test_run_results.

TDQS

A4.4/5.0
Behavior4/5

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

With empty annotations, the description carries the full burden. It discloses that filePath must be an absolute path on the MCP server, explains the response format including a fallback for empty API responses, and notes step assignment constraints.

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?

The description is comprehensive but not overly verbose. It front-loads the main purpose and then systematically details the addressing rules. Every sentence adds necessary information.

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?

Despite no output schema, the description fully explains the return value. It covers all three target types, parameter constraints, file path requirements, and step addressing limitations, making it complete for an agent to invoke correctly.

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 description coverage is 100%, but the description adds value by clarifying which identifier is required per target, the stepIndex applicability, and the default for fileName. This goes beyond the schema's basic descriptions.

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?

Clearly states the tool uploads a file as an attachment to Zephyr Scale entities (test case, test run, test result) optionally to a step. Distinguishes from siblings like delete_attachment, download_attachment, list_attachments.

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?

Provides explicit guidance on target selection and required identifiers, including the limitation that test_run does not support step addressing. Though it doesn't state when not to use, the context is clear enough for an agent.

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. 23 tool updatesv0.1.2
    • Addedclone_test_case
    • Addedcreate_folder
    • Removedcreate_test_cases_bulk
    • Addedcreate_test_plan
    • Removedcreate_test_result
    • Addedcreate_test_results_bulk
    • Addedcreate_test_run
    • Removeddelete_attachment
    • Removeddelete_test_run
    • Removeddownload_feature_files
    • Addedget_issue_test_coverage
    • Addedget_latest_result_for_test_case
    • Addedget_test_plan
    • Removedget_test_run_results
    • Removedget_test_run_summary
    • Removedlink_issues_to_test_cases
    • Removedrecreate_test_run_with_items
    • Addedrename_folder
    • Removedsearch_test_cases
    • Removedsearch_test_runs
    • Addedupdate_test_plan
    • Removedupload_automation_results
    • Removedupload_cucumber_results
  2. 20 tool updates
    • Removedclone_test_case
    • Removedcreate_environment
    • Removedcreate_folder
    • Removedcreate_test_plan
    • Removedcreate_test_results_bulk
    • Removedcreate_test_run
    • Removeddelete_test_case
    • Addeddownload_feature_files
    • Removedfind_jira_user
    • Removedget_issue_test_coverage
    • Removedget_latest_result_for_test_case
    • Removedget_test_cases_linked_to_issue
    • Removedget_test_plan
    • Removedhealth_check
    • Removedlist_environments
    • Addedrecreate_test_run_with_items
    • Removedrename_folder
    • Removedupdate_test_plan
    • Addedupload_automation_results
    • Addedupload_cucumber_results
  3. 4 tool updatesv0.1.1
    • Removeddownload_feature_files
    • Removedrecreate_test_run_with_items
    • Removedupload_automation_results
    • Removedupload_cucumber_results
  4. 20 tool updates
    • Addedclone_test_case
    • Changedcreate_test_case1 field changed
      • changedInput schema / properties / testScript / properties / text / description
        Previous value: -"Script body for PLAIN_TEXT, or the full Gherkin document for BDD"New value: +"Script body for PLAIN_TEXT, or the Gherkin scenario body for BDD: ONLY Given/When/Then/And/But step lines — Server/DC rejects texts wrapped in \"Feature:\"/\"Scenario:\" headers with 400 \"Invalid BDD Script\" (a BDD test case IS a single scenario; the feature wrapper is generated on export)."
    • Changedcreate_test_cases_bulk1 field changed
      • changedInput schema / properties / testCases / items / properties / testScript / properties / text / description
        Previous value: -"Script body for PLAIN_TEXT, or the full Gherkin document for BDD"New value: +"Script body for PLAIN_TEXT, or the Gherkin scenario body for BDD: ONLY Given/When/Then/And/But step lines — Server/DC rejects texts wrapped in \"Feature:\"/\"Scenario:\" headers with 400 \"Invalid BDD Script\" (a BDD test case IS a single scenario; the feature wrapper is generated on export)."
    • Addedcreate_test_plan
    • Addeddelete_attachment
    • Addeddelete_test_plan
    • Addeddownload_attachment
    • Addeddownload_feature_files
    • Addedget_issue_test_coverage
    • Addedget_test_plan
    • Addedget_test_run_summary
    • Addedlist_attachments
    • Addedrecreate_test_run_with_items
    • Addedsearch_test_plans
    • Changedset_test_script1 field changed
      • changedInput schema / properties / text / description
        Previous value: -"Script body — required for PLAIN_TEXT and BDD (full Gherkin document), not allowed for STEP_BY_STEP"New value: +"Script body — required for PLAIN_TEXT and BDD (Gherkin step lines only, no Feature:/Scenario: headers), not allowed for STEP_BY_STEP"
    • Changedupdate_test_case1 field changed
      • changedInput schema / properties / testScript / properties / text / description
        Previous value: -"Script body for PLAIN_TEXT, or the full Gherkin document for BDD"New value: +"Script body for PLAIN_TEXT, or the Gherkin scenario body for BDD: ONLY Given/When/Then/And/But step lines — Server/DC rejects texts wrapped in \"Feature:\"/\"Scenario:\" headers with 400 \"Invalid BDD Script\" (a BDD test case IS a single scenario; the feature wrapper is generated on export)."
    • Addedupdate_test_plan
    • Addedupload_attachment
    • Addedupload_automation_results
    • Addedupload_cucumber_results
  5. 25 tool updatesv0.1.0
    • First observedadd_test_steps
    • First observedcreate_environment
    • First observedcreate_folder
    • First observedcreate_test_case
    • First observedcreate_test_cases_bulk
    • First observedcreate_test_result
    • First observedcreate_test_results_bulk
    • First observedcreate_test_run
    • First observeddelete_test_case
    • First observeddelete_test_run
    • First observedfind_jira_user
    • First observedget_latest_result_for_test_case
    • First observedget_test_case
    • First observedget_test_cases_linked_to_issue
    • First observedget_test_run
    • First observedget_test_run_results
    • First observedhealth_check
    • First observedlink_issues_to_test_cases
    • First observedlist_environments
    • First observedrename_folder
    • First observedsearch_test_cases
    • First observedsearch_test_runs
    • First observedset_test_script
    • First observedupdate_last_test_result
    • First observedupdate_test_case

TDQS

A4.4/5.0

Scored across 22 tools

Disambiguation5/5

Each tool targets a distinct resource and action (e.g., add_test_steps vs set_test_script, clone_test_case vs create_test_case, etc.), with no overlapping purposes. Agents can clearly differentiate between tools.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_test_case, update_test_plan, download_attachment). No mixing of conventions or vague verbs.

Tool Count5/5

22 tools is well-scoped for a test management server, covering core entities (test cases, plans, runs, folders, attachments) and common operations without bloat.

Completeness2/5

Missing several expected operations: delete_test_case, delete_test_run, delete_attachment, list_folders, search_test_cases, and get_test_run_results. These gaps will likely cause agent failures in standard workflows.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers