Skip to content

MCP tool reference

This page is generated from apps/worker/src/mcp/registry.ts — every tool the Probara MCP server registers is listed below with its exact name, description, and input fields. It can never drift from the server: regenerate it with pnpm mcp-tools:generate whenever a tool is added, removed, or renamed.

Call this to create a new project in the caller organization. Requires name (string) and id (an uppercase project code starting with a letter, e.g. “ACME”). Returns the created project, including its ulid.

Parameters

  • name — required
  • id — required
  • description — optional
  • idempotency_key — optional

Call this to list projects in the caller organization with offset pagination. Accepts page (1-based) and pageSize, plus optional q/include/filters. Returns items plus page, pageSize, and total so you can page through the full collection by incrementing page.

Parameters

  • page — optional
  • pageSize — optional
  • q — optional
  • include — optional
  • memberUlid — optional
  • runs — optional
  • defects — optional
  • milestones — optional
  • cases — optional

Call this to check whether a candidate project id is free before creating a project. Requires id (the candidate uppercase project code). Returns { available: boolean }.

Parameters

  • id — required

Call this to fetch a single project within the caller organization. Requires project_id (the project’s human-readable code, e.g. “ACME” — the same value returned as id by create_project).

Parameters

  • project_id — required

Call this to update a project’s name, id, or description. Requires project_id and at least one of name/id/description to change.

Parameters

  • project_id — required
  • name — optional
  • id — optional
  • description — optional
  • idempotency_key — optional

Call this to permanently delete a project. Requires project_id. Returns { deleted: true } on success.

Parameters

  • project_id — required
  • idempotency_key — optional

Call this to create a new suite inside a project. Requires project_id (the project code) and name; optionally description and parentUlid to nest under an existing suite in the same project. Returns the created suite, including its ulid and displayId.

Parameters

  • project_id — required
  • name — required
  • description — optional
  • parentUlid — optional
  • idempotency_key — optional

Call this to list the root-level suites of a project with cursor pagination. Requires project_id. Accepts limit and cursor; feed the returned nextCursor back as cursor to fetch the next page — the field is absent once you have reached the last page.

Parameters

  • project_id — required
  • limit — optional
  • cursor — optional

Call this to fetch a suite by its human-readable display id (e.g. “ACME-S3”). Requires project_id and display_id.

Parameters

  • project_id — required
  • display_id — required

Call this to list the direct child suites of a parent suite with cursor pagination. Requires project_id and suite_ulid (the parent suite’s ulid). Accepts limit and cursor.

Parameters

  • project_id — required
  • suite_ulid — required
  • limit — optional
  • cursor — optional

Call this to deep-clone a suite (and by default its cases) into a destination project/suite. Requires project_id (the source suite’s project) and suite_ulid (the source suite), plus destinationProjectCode and destinationSuiteUlid (null clones into the destination project root); optionally prefix and strategy (“casesAndSuites” default, or “suitesOnly” to clone structure only, no cases).

Parameters

  • project_id — required
  • suite_ulid — required
  • destinationProjectCode — required
  • destinationSuiteUlid — required
  • prefix — optional
  • strategy — optional
  • idempotency_key — optional

Call this to fetch a single suite by its ulid. Requires suite_ulid.

Parameters

  • suite_ulid — required

Call this to update a suite’s name, description, or parent. Requires suite_ulid and at least one of name/description/parentUlid to change.

Parameters

  • suite_ulid — required
  • name — optional
  • description — optional
  • parentUlid — optional
  • idempotency_key — optional

Call this to permanently delete a suite. Requires suite_ulid. If the suite (or its descendants) still has test cases, caseDisposition (“deleteCases” or “moveToParent”) is required. Returns { deleted: true } on success.

Parameters

  • suite_ulid — required
  • caseDisposition — optional
  • idempotency_key — optional

Call this to read the active/archived/total test case counts for a suite and its descendants. Requires suite_ulid.

Parameters

  • suite_ulid — required

Call this to read the ordered list of steps (and their committed attachments) for a test case. Requires case_ulid.

Parameters

  • case_ulid — required

Call this to replace ALL steps of a test case with a new ordered list in one write. Requires case_ulid and steps (an array of { position, action, data?, expected?, attachments? }); include a previously staged attachment reference (ulid + position) in a step to commit it. Returns the full replacement list.

Parameters

  • case_ulid — required
  • steps — required
  • idempotency_key — optional

Call this to create a new test case inside a project. Requires project_id (the project code) and title; optionally description, suiteUlid, milestoneUlid, tags, and an initial ordered steps array. Returns the created test case, including its ulid and displayId.

Parameters

  • project_id — required
  • title — required
  • description — optional
  • suiteUlid — optional
  • milestoneUlid — optional
  • tags — optional
  • steps — optional
  • idempotency_key — optional

Call this to list the test cases of a project with cursor pagination. Requires project_id. Accepts limit and cursor (feed the returned nextCursor back as cursor for the next page), plus optional suiteUlid, archived (“true”/“false”), and milestoneUlid filters.

Parameters

  • project_id — required
  • limit — optional
  • cursor — optional
  • suiteUlid — optional
  • archived — optional
  • milestoneUlid — optional

Call this to search test cases (and optionally suites) within a project by a text term. Requires project_id and q. Accepts scope (“all” default, “cases”, or “suites”), limit, and cf (repeatable — pass the same argument more than once for several “<fieldUlid>:<value[,value…]>” filters at once, every entry ANDed together). Returns items and total.

Parameters

  • project_id — required
  • q — optional
  • scope — optional
  • cf — optional
  • limit — optional

Call this to fetch a test case by its human-readable display id (e.g. “ACME-42”). Requires project_id and display_id.

Parameters

  • project_id — required
  • display_id — required

Call this to clone a single test case into a destination project/suite. Requires project_id (the source case’s project) and case_ulid (the source case), plus destinationProjectCode and destinationSuiteUlid (null clones into the destination project root); optionally prefix, applied to the cloned title.

Parameters

  • project_id — required
  • case_ulid — required
  • destinationProjectCode — required
  • destinationSuiteUlid — required
  • prefix — optional
  • idempotency_key — optional

Call this to archive several test cases in one project in a single call. Requires project_id and caseUlids (1-200 ulids). Returns { affected, unchanged } counts.

Parameters

  • project_id — required
  • caseUlids — required
  • idempotency_key — optional

Call this to clone several suites and/or loose test cases from one project into a destination project in a single call. Requires project_id, destinationProjectCode, destinationSuiteUlid (null for the destination root), strategy (“casesAndSuites” or “suitesOnly”), and at least one non-empty array of caseUlids/suiteUlids. Returns { destinationProjectCode, suitesCreated, casesCloned }.

Parameters

  • project_id — required
  • caseUlids — required
  • suiteUlids — required
  • destinationProjectCode — required
  • destinationSuiteUlid — required
  • strategy — required
  • idempotency_key — optional

Call this to fetch a single test case by its ulid. Requires case_ulid.

Parameters

  • case_ulid — required

Call this to update a test case in one consolidated write. Requires case_ulid and at least one of patch (title/description/suiteUlid/milestoneUlid/tags), steps (full replacement list), or customFieldValues.

Parameters

  • case_ulid — required
  • patch — optional
  • steps — optional
  • customFieldValues — optional
  • idempotency_key — optional

Call this to permanently delete a test case. Requires case_ulid. Returns { deleted: true } on success.

Parameters

  • case_ulid — required
  • idempotency_key — optional

Call this to archive an active test case. Requires case_ulid.

Parameters

  • case_ulid — required
  • idempotency_key — optional

Call this to restore an archived test case to active. Requires case_ulid.

Parameters

  • case_ulid — required
  • idempotency_key — optional

Call this to upload ONE image attachment (png/jpeg/webp) for a test case step, before including its returned reference in replace_test_case_steps. Requires case_ulid, filename, content_type, and data_base64 (the raw file bytes, base64-encoded). Decoded bytes must not exceed 10 MiB. Returns the staged attachment reference to reuse in a step’s attachments array.

Parameters

  • case_ulid — required
  • filename — required
  • content_type — required
  • data_base64 — required
  • idempotency_key — optional

Call this to permanently delete a committed step attachment. Requires case_ulid and attachment_ulid. Returns { deleted: true } on success.

Parameters

  • case_ulid — required
  • attachment_ulid — required
  • idempotency_key — optional

Call this to create a new test run inside a project. Requires project_id (the project code) and name. Requires caseUlids (at least one) UNLESS planUlid is supplied, in which case an omitted caseUlids seeds from the plan’s current selection — a run cannot be created empty either way. Optionally description, environmentId, environment (legacy free-text), defaultAssigneeUlid, caseAssignees, startedAt, milestoneId, customFieldValues (an array of { fieldUlid, value } to seed the run’s custom fields in the same call), planUlid (link the run to a test plan), and configurationUlids (tag the run with one configuration combination — at most one value per group, rejected otherwise). This ONE call creates ONE run: linking a plan and naming a combination never fans out into several runs, even when the plan has many combinations — call it once per combination you actually want a run for. Returns the created run, including its ulid.

Parameters

  • project_id — required
  • name — required
  • description — optional
  • environmentId — optional
  • environment — optional
  • defaultAssigneeUlid — optional
  • caseUlids — optional
  • caseAssignees — optional
  • startedAt — optional
  • milestoneId — optional
  • customFieldValues — optional
  • planUlid — optional
  • configurationUlids — optional
  • idempotency_key — optional

Call this to list runs in a project with offset pagination. Requires project_id. Accepts page (1-based), pageSize, q, status (comma-separated projected statuses), env (repeatable — pass the same argument more than once to filter by several environment names at once), authorUlid, assigneeUlid (“empty” for unassigned), milestoneUlid, and cf (repeatable — pass the same argument more than once for several “<fieldUlid>:<value[,value…]>” run custom-field filters at once, every entry ANDed together). Returns items plus page, pageSize, and total.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • status — optional
  • env — optional
  • authorUlid — optional
  • assigneeUlid — optional
  • milestoneUlid — optional
  • cf — optional

Call this to list the distinct environment names used by runs in a project (no paging — the full set is returned). Requires project_id.

Parameters

  • project_id — required

Call this to “run again”: clone a run into a new run in the same project (“Run again”). Requires project_id, run_ulid (the source run), and title. Optionally cloneAssignees (carry each case’s assignee into the new run) and statusFilter (an array of outcome statuses — omitted/empty clones every case). Returns the created run.

Parameters

  • project_id — required
  • run_ulid — required
  • title — required
  • cloneAssignees — optional
  • statusFilter — optional
  • idempotency_key — optional

Call this to fetch a single run by its ulid. Requires run_ulid.

Parameters

  • run_ulid — required

Call this to update a run’s name, description, defaultAssigneeUlid, environmentId, milestoneId, or configurationUlids (replace-set: an array replaces the whole combination, [] clears it, omitted leaves it untouched). Requires run_ulid and at least one field to change. Does NOT accept customFieldValues — call set_run_custom_field_values to reconcile a run’s custom-field values instead. A configuration-only body is still rejected on an aborted run — aborted runs are terminal-frozen and take no exception.

Parameters

  • run_ulid — required
  • name — optional
  • description — optional
  • defaultAssigneeUlid — optional
  • environmentId — optional
  • milestoneId — optional
  • configurationUlids — optional
  • idempotency_key — optional

Call this to REPLACE the full set of cases on a run with the given desired selection — this is DESTRUCTIVE: any case currently on the run whose ulid is not in caseUlids is removed. An empty caseUlids array removes every case from the run. Requires run_ulid and caseUlids (may be empty); optionally caseAssignees.

Parameters

  • run_ulid — required
  • caseUlids — required
  • caseAssignees — optional
  • idempotency_key — optional

Call this to close an open run, finalizing its aggregate outcome. Requires run_ulid. Returns the closed run (state=“closed”, finishedAt set).

Parameters

  • run_ulid — required
  • idempotency_key — optional

Call this to abort an open run before it finishes, recomputing its aggregate outcome from cases executed so far. Requires run_ulid. Returns the aborted run (abortedAt set).

Parameters

  • run_ulid — required
  • idempotency_key — optional

Call this to permanently delete a run. Requires run_ulid. Only the owner or admin role may delete a run — any other role is rejected as forbidden. Returns { deleted: true } on success.

Parameters

  • run_ulid — required
  • idempotency_key — optional

Call this to reconcile a run’s custom-field values to an EXACT desired set: values for fields not present in the input are cleared (or rejected if the field is required). Requires run_ulid and values (an array of { fieldUlid, value }). Returns { customFieldValues } with the full resulting set. There is no single-value update tool for runs — call this with the full desired set.

Parameters

  • run_ulid — required
  • values — required
  • idempotency_key — optional

Call this to mark up to 500 run cases with the SAME status in one batch. Requires run_ulid, caseUlids (1-500), and status (passed/failed/skipped/blocked). Rejects if the run is closed. Returns { affected, unchanged }.

Parameters

  • run_ulid — required
  • caseUlids — required
  • status — required
  • idempotency_key — optional

Call this to assign (or unassign, with assigneeUlid = null) up to 500 run cases in one batch. Requires run_ulid, caseUlids (1-500), and assigneeUlid. Rejects if the run is closed. Returns { affected, unchanged }.

Parameters

  • run_ulid — required
  • caseUlids — required
  • assigneeUlid — required
  • idempotency_key — optional

Call this to reset up to 500 marked run cases back to retested in one batch. Requires run_ulid and caseUlids (1-500). Rejects if the run is closed. Returns { affected, unchanged }.

Parameters

  • run_ulid — required
  • caseUlids — required
  • idempotency_key — optional

Call this to remove up to 500 cases from a run in one batch. Requires run_ulid and caseUlids (1-500). Rejects if the run is closed. Returns { affected, unchanged }.

Parameters

  • run_ulid — required
  • caseUlids — required
  • idempotency_key — optional

Call this to atomically submit the SAME result to up to 500 run cases in one batch, optionally creating or attaching ONE defect linked to every affected case. Requires run_ulid, caseUlids (1-500), and status. Optionally totalDurationMs, notes, attachments, and defect (only valid when status is failed or blocked): defect.mode=“create” carries a full new defect (title required) or defect.mode=“attach” carries an existing defectUlid with an optional reopen flag. Rejects if the run is closed. Returns { affected, defect? }.

Parameters

  • run_ulid — required
  • caseUlids — required
  • status — required
  • totalDurationMs — optional
  • notes — optional
  • attachments — optional
  • defect — optional
  • idempotency_key — optional

Call this to set a single step’s status within a run case. Requires run_ulid, run_case_ulid, step_ulid, and status (passed/failed/skipped/blocked). This only changes the STEP row — the parent case’s own status is untouched (call mark_run_case to mark the case itself). Returns { caseStatus } — the case’s current status, read before this write.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • step_ulid — required
  • status — required
  • idempotency_key — optional

Call this to persist a step’s actualResult text and reconcile its committed result-attachment refs to an exact set. Requires run_ulid, run_case_ulid, and step_ulid. Optionally actualResult (null clears the saved text, omitted leaves it unchanged) and attachments (present reconciles to that exact set by ulid; omitted leaves committed attachments untouched). Rejects if the run is closed, or if the run case is already marked (no longer untested). Returns { actualResult }.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • step_ulid — required
  • actualResult — optional
  • attachments — optional
  • idempotency_key — optional

Call this to list every case on a run (the route returns the full set — no real paging exists yet, so nextCursor is always absent). Requires run_ulid.

Parameters

  • run_ulid — required

Call this to fetch full detail for one run case, including steps, linked defects, and result attachments. Requires run_ulid and run_case_ulid.

Parameters

  • run_ulid — required
  • run_case_ulid — required

Call this to add one or more cases to a run (additive — existing cases are untouched). Requires run_ulid and caseUlids (at least one).

Parameters

  • run_ulid — required
  • caseUlids — required
  • idempotency_key — optional

Call this to remove one case from a run. Requires run_ulid and run_case_ulid. Returns { deleted: true } on success.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • idempotency_key — optional

Call this to reset a marked run case back to retested, ready for re-execution. Requires run_ulid and run_case_ulid.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • idempotency_key — optional

Call this to reopen an individual run case (there is no run-level reopen — this is the per-case equivalent). Requires run_ulid and run_case_ulid.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • idempotency_key — optional

Call this to submit a result for a single run case — the single-case “submit result” gesture. Requires run_ulid and run_case_ulid, plus status (passed/failed/skipped/blocked). Optionally assigneeUlid and elapsedMs. Appends a result row and returns the case with the new resultUlid.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • assigneeUlid — optional
  • status — optional
  • elapsedMs — optional
  • idempotency_key — optional

Call this to list the append-only result log for a run (cursor pagination). Requires run_ulid.

Parameters

  • run_ulid — required

Call this to fetch the full snapshot for one result: the result row, case header, frozen steps, legacy fields, and result attachments. Requires run_ulid and result_ulid.

Parameters

  • run_ulid — required
  • result_ulid — required

Call this to enrich an EXISTING result with notes and/or durationMs — never its outcome, never a new result row. Requires run_ulid and result_ulid, plus at least one of notes or durationMs. Rejects with a conflict if the run is closed.

Parameters

  • run_ulid — required
  • result_ulid — required
  • notes — optional
  • durationMs — optional
  • idempotency_key — optional

Call this to upload ONE evidence file of ANY content type for a run result, before including its returned reference in commit_result_attachments. Requires run_ulid, result_ulid, filename, content_type, and data_base64 (the raw file bytes, base64-encoded). Decoded bytes must not exceed 32 MiB. Content type is not pre-checked here — an executable file type is rejected by the server after upload. Rejects if the run is closed. Returns the staged attachment reference.

Parameters

  • run_ulid — required
  • result_ulid — required
  • filename — required
  • content_type — required
  • data_base64 — required
  • idempotency_key — optional

Call this to reconcile a result’s committed attachments to an EXACT set: staged references are promoted, existing references are kept (position may change), and any committed attachment absent from the list is removed. Requires run_ulid, result_ulid, and attachments (the desired reference set, from stage_result_attachment). Rejects if the run is closed. Returns { attachments }.

Parameters

  • run_ulid — required
  • result_ulid — required
  • attachments — required
  • idempotency_key — optional

Call this to permanently delete a committed result attachment. Requires run_ulid, result_ulid, and attachment_ulid. Rejects if the run is closed. Returns { deleted: true }.

Parameters

  • run_ulid — required
  • result_ulid — required
  • attachment_ulid — required
  • idempotency_key — optional

Call this to upload ONE image attachment (png/jpeg/webp) for a run-case step result, before including its returned reference in save_run_case_step_result. Requires run_ulid, run_case_ulid, step_ulid, filename, content_type, and data_base64 (the raw file bytes, base64-encoded). Decoded bytes must not exceed 10 MiB. Rejects if the run is closed. Returns the staged attachment reference.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • step_ulid — required
  • filename — required
  • content_type — required
  • data_base64 — required
  • idempotency_key — optional

Call this to permanently delete a committed run-case step result attachment. Requires run_ulid, run_case_ulid, step_ulid, and attachment_ulid. Rejects if the run is closed. Returns { deleted: true }.

Parameters

  • run_ulid — required
  • run_case_ulid — required
  • step_ulid — required
  • attachment_ulid — required
  • idempotency_key — optional

Call this to create a new test plan inside a project. Requires project_id (the project code) and name. Optionally description and status (defaults to draft). Returns the created plan, including its ulid.

Parameters

  • project_id — required
  • name — required
  • description — optional
  • status — optional
  • idempotency_key — optional

Call this to list test plans in a project with offset pagination. Requires project_id. Accepts page (1-based) and pageSize. Returns items plus page, pageSize, and total.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional

Call this to fetch a single test plan by its ulid. Requires plan_ulid.

Parameters

  • plan_ulid — required

Call this to update a test plan’s name, description, status, or milestoneId. Requires plan_ulid and at least one field to change.

Parameters

  • plan_ulid — required
  • name — optional
  • description — optional
  • status — optional
  • milestoneId — optional
  • idempotency_key — optional

Call this to permanently delete a test plan. Requires plan_ulid. Returns { deleted: true }.

Parameters

  • plan_ulid — required
  • idempotency_key — optional

Call this to REPLACE a plan’s entire case selection with the given ordered list — this is DESTRUCTIVE: any case currently selected whose ulid is not in caseUlids is dropped. Duplicate ulids are rejected. Requires plan_ulid and caseUlids (may be empty to clear the selection). Optionally caseAssignees. Returns the new selection as { items }.

Parameters

  • plan_ulid — required
  • caseUlids — required
  • caseAssignees — optional
  • idempotency_key — optional

Call this to list a plan’s selected cases (no paging — the full selection is returned). Requires plan_ulid.

Parameters

  • plan_ulid — required

Call this to change one selected case’s assignee within a plan (null clears it). Requires plan_ulid, plan_case_ulid, and assigneeUlid.

Parameters

  • plan_ulid — required
  • plan_case_ulid — required
  • assigneeUlid — required
  • idempotency_key — optional

Call this to list the runs linked to a plan, most-recent first (no paging — the full set is returned). Each item is a full run plus comboKey/comboLabel identifying its configuration combination (empty for a plain, unconfigured run). Requires plan_ulid. Create a run for a plan with create_run (planUlid + configurationUlids).

Parameters

  • plan_ulid — required

Call this to REPLACE a plan’s entire configuration-value selection (the axes of the generate-run matrix) with the given set — DESTRUCTIVE, duplicate ulids rejected. Requires plan_ulid and configurationUlids (may be empty to clear the matrix). Returns the new selection as { items }.

Parameters

  • plan_ulid — required
  • configurationUlids — required
  • idempotency_key — optional

Call this to list a plan’s selected configuration values (no paging — the full selection is returned). Requires plan_ulid.

Parameters

  • plan_ulid — required

Call this to REPLACE a plan’s entire excluded-combination set, scoping which combinations the plan intends to cover — DESTRUCTIVE, duplicate keys rejected. Requires plan_ulid and comboKeys (may be empty to clear all exclusions; use get_test_plan_combinations to read each candidate combination’s comboKey). To actually create a run for a combination, call create_run with the plan’s planUlid and the combination’s configurationUlids. Returns { comboKeys }.

Parameters

  • plan_ulid — required
  • comboKeys — required
  • idempotency_key — optional

Call this to preview every candidate configuration combination for a plan, each with its comboKey, included flag (false when excluded), and ordered configuration values — plus includedCount/totalCount. Requires plan_ulid.

Parameters

  • plan_ulid — required

Call this to create a new milestone inside a project. Requires project_id (the project code) and name. Optionally description, status (defaults to upcoming), startAt/dueAt/forecastAt (epoch milliseconds; dueAt must be >= startAt when both are set), and parentId (an existing milestone in the same project — the hierarchy is strictly one level, a child cannot itself have children). Returns the created milestone, including its ulid.

Parameters

  • project_id — required
  • name — required
  • description — optional
  • status — optional
  • startAt — optional
  • dueAt — optional
  • forecastAt — optional
  • parentId — optional
  • idempotency_key — optional

Call this to list milestones in a project with offset pagination. Requires project_id. Accepts page (1-based), pageSize, q, status (comma-separated), and view (“flat” default, or “tree” — pages over parent milestones only, each carrying its live direct children nested one level deep). Returns items plus page, pageSize, and total either way.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • status — optional
  • view — optional

Call this to fetch a single milestone by its ulid. Requires milestone_ulid.

Parameters

  • milestone_ulid — required

Call this to update a milestone’s name, description, status, startAt/dueAt/forecastAt, or parentId. Requires milestone_ulid and at least one field to change; dueAt must remain >= startAt when both are set.

Parameters

  • milestone_ulid — required
  • name — optional
  • description — optional
  • status — optional
  • startAt — optional
  • dueAt — optional
  • forecastAt — optional
  • parentId — optional
  • idempotency_key — optional

Call this to permanently delete a milestone. Requires milestone_ulid. Returns { deleted: true } on success.

Parameters

  • milestone_ulid — required
  • idempotency_key — optional

Call this to create a new environment inside a project. Requires project_id (the project code), name, and slug (lowercase alphanumeric segments joined by single hyphens, e.g. “pre-prod”). Optionally description, url, and isDefault (defaults to false). Returns the created environment, including its ulid.

Parameters

  • project_id — required
  • name — required
  • slug — required
  • description — optional
  • url — optional
  • isDefault — optional
  • idempotency_key — optional

Call this to list environments in a project with offset pagination. Requires project_id. Accepts page (1-based) and pageSize. Returns items plus page, pageSize, and total.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional

Call this to fetch a single environment by its ulid. Requires environment_ulid.

Parameters

  • environment_ulid — required

Call this to update an environment’s name, slug, description, url, or isDefault. Requires environment_ulid and at least one field to change.

Parameters

  • environment_ulid — required
  • name — optional
  • slug — optional
  • description — optional
  • url — optional
  • isDefault — optional
  • idempotency_key — optional

Call this to permanently delete an environment. Requires environment_ulid. Returns { deleted: true } on success.

Parameters

  • environment_ulid — required
  • idempotency_key — optional

Call this to create a new configuration group inside a project (e.g. “Browser”, “OS”). Requires project_id (the project code) and name. Rejects with a conflict if a group with the same name already exists in the project. Returns the created group, including its ulid.

Parameters

  • project_id — required
  • name — required
  • idempotency_key — optional

Call this to list configuration groups in a project with offset pagination. Requires project_id. Accepts page (1-based), pageSize, and optional include=“values” to embed each group’s nested values in the response. Returns items plus page, pageSize, and total.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional
  • include — optional

Call this to fetch a single configuration group by its ulid. Requires group_ulid. Optional include=“values” embeds the group’s nested values in the response.

Parameters

  • group_ulid — required
  • include — optional

Call this to rename a configuration group. Requires group_ulid and name. Rejects with a conflict if another group in the same project already has that name.

Parameters

  • group_ulid — required
  • name — optional
  • idempotency_key — optional

Call this to delete a configuration group. Requires group_ulid. The group disappears from group-scoped reads; its nested values are NOT deleted and stay individually addressable via update_configuration and delete_configuration by their own configuration_ulid. Returns { deleted: true } on success.

Parameters

  • group_ulid — required
  • idempotency_key — optional

Call this to add a new configuration value under a group (e.g. “Chrome” under “Browser”). Requires group_ulid and name. Rejects with a conflict if a value with the same name already exists in the group. Returns the created value, including its ulid.

Parameters

  • group_ulid — required
  • name — required
  • idempotency_key — optional

Call this to list every configuration value nested under a group. Requires group_ulid. The underlying route has no independent pagination — every live value is returned in one page.

Parameters

  • group_ulid — required

Call this to rename a configuration value standalone by its own ulid (not nested under a group path). Requires configuration_ulid and name. Rejects with a conflict if another value in the same group already has that name.

Parameters

  • configuration_ulid — required
  • name — optional
  • idempotency_key — optional

Call this to permanently delete a configuration value by its ulid. Requires configuration_ulid. Returns { deleted: true } on success.

Parameters

  • configuration_ulid — required
  • idempotency_key — optional

Call this to report a new defect inside a project. Requires project_id (the project code) and title. Optionally description, assigneeUlid, tags, milestoneUlid, and customFieldValues (array of {fieldUlid, value}). Returns the created defect (status defaults to “open”), including its ulid and defectNumber.

Parameters

  • project_id — required
  • title — required
  • description — optional
  • assigneeUlid — optional
  • tags — optional
  • milestoneUlid — optional
  • customFieldValues — optional
  • idempotency_key — optional

Call this to list defects in a project with offset pagination. Requires project_id. Accepts page (1-based), pageSize, q (matches “D-<n>“/a bare number as the defect number, otherwise a title substring), status/severity/priority/assigneeUlid (each an array, ANDed as one CSV filter), aging (an age-bucket key), milestoneUlid, fields (custom-field ulids to embed on each item), and cf (repeatable — pass the same argument more than once for several “<fieldUlid>:<value[,value…]>” filters at once, every entry ANDed together). Returns items plus page, pageSize, and total.

Parameters

  • project_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • status — optional
  • severity — optional
  • priority — optional
  • assigneeUlid — optional
  • aging — optional
  • fields — optional
  • milestoneUlid — optional
  • cf — optional

Call this to fetch project-scoped defect metrics: totalOpen, openBySeverity, aging buckets, reopenRate, mttrMs, byMilestone, and maxAgeDaysOpen. Requires project_id. The aggregate never includes another project’s defects.

Parameters

  • project_id — required

Call this to fetch a single defect by its ulid, including occurrence/affected-case counts and embedded custom-field values. Requires defect_ulid.

Parameters

  • defect_ulid — required

Call this to update a defect’s title, description, status, resolution, assigneeUlid, tags, milestoneUlid, or duplicateOfUlid. Requires defect_ulid and at least one field to change. status is a plain enum (open|in_progress|resolved|closed) validated against the transition graph server-side — there is no separate “resolve”/“reopen” tool. resolution is required when status becomes resolved or closed, and duplicateOfUlid is only allowed alongside resolution=“duplicate”.

Parameters

  • defect_ulid — required
  • title — optional
  • description — optional
  • status — optional
  • resolution — optional
  • assigneeUlid — optional
  • tags — optional
  • milestoneUlid — optional
  • duplicateOfUlid — optional
  • idempotency_key — optional

Call this to permanently delete a defect. Requires defect_ulid. The route allow-lists owner, admin, AND member — only a viewer role is rejected as forbidden. Returns { deleted: true } on success.

Parameters

  • defect_ulid — required
  • idempotency_key — optional

Call this to list the defects linked within a run (no paging — the full set is returned, each item carrying linkCountInRun and systemFieldValues). Requires run_ulid.

Parameters

  • run_ulid — required

Call this to manually link a defect to a test case. Requires defect_ulid and testCaseUlid (must belong to the same project as the defect). Idempotent: re-linking the same pair returns the existing link and also clears any prior dismissal for that pair. Returns the created link, including its ulid.

Parameters

  • defect_ulid — required
  • testCaseUlid — required
  • idempotency_key — optional

Call this to remove a manual defect-case link. Requires defect_ulid and link_ulid (from link_defect_case). Returns { deleted: true } on success.

Parameters

  • defect_ulid — required
  • link_ulid — required
  • idempotency_key — optional

Call this to dismiss a defect-case association (hides the case from the defect’s affected-cases list without deleting any run history). Requires defect_ulid and testCaseUlid (must belong to the same project as the defect). Idempotent: re-dismissing the same pair refreshes the dismissal timestamp. Returns the dismissal record.

Parameters

  • defect_ulid — required
  • testCaseUlid — required
  • idempotency_key — optional

Call this to link a defect to a run result (one occurrence of the defect). Requires defect_ulid and resultUlid; optionally stepSnapshotUlid to pin the specific failing step. Idempotent: re-linking the same result returns the existing link. Returns the created link, including its ulid.

Parameters

  • defect_ulid — required
  • resultUlid — required
  • stepSnapshotUlid — optional
  • idempotency_key — optional

Call this to list the result links (occurrences) recorded on a defect, with cursor pagination. Requires defect_ulid. Accepts limit and cursor; feed the returned nextCursor back as cursor to fetch the next page — the field is absent once you have reached the last page.

Parameters

  • defect_ulid — required
  • limit — optional
  • cursor — optional

Call this to remove a defect-result link. Requires defect_ulid and link_ulid (from link_defect_result or list_defect_result_links). Returns { deleted: true } on success.

Parameters

  • defect_ulid — required
  • link_ulid — required
  • idempotency_key — optional

Call this to list the test cases affected by a defect (aggregated from result links and manual case links), with cursor pagination. Requires defect_ulid. Accepts limit and cursor; feed the returned nextCursor back as cursor to fetch the next page — the field is absent once you have reached the last page.

Parameters

  • defect_ulid — required
  • limit — optional
  • cursor — optional

Call this to upload ONE evidence file of ANY content type directly onto a defect (this is an immediate upload, not a stage-then-commit flow). Requires defect_ulid, filename, content_type, and data_base64 (the raw file bytes, base64-encoded). Decoded bytes must not exceed 33554432 bytes (32 MiB). Content type is not pre-checked here — an executable file type is rejected by the server after upload. Returns { attachments } with one persisted attachment reference.

Parameters

  • defect_ulid — required
  • filename — required
  • content_type — required
  • data_base64 — required
  • idempotency_key — optional

Call this to list every attachment persisted on a defect. Requires defect_ulid. Returns { attachments } — a bare passthrough, no pagination.

Parameters

  • defect_ulid — required

Call this to permanently delete a defect attachment. Requires defect_ulid and attachment_ulid. Returns { deleted: true }.

Parameters

  • defect_ulid — required
  • attachment_ulid — required
  • idempotency_key — optional

Call this to reconcile a defect’s custom-field values to an EXACT desired set: values for fields not present in the input are cleared (or rejected if the field is required). Requires defect_ulid and values (an array of { fieldUlid, value }). Returns { customFieldValues } with the full resulting set.

Parameters

  • defect_ulid — required
  • values — required
  • idempotency_key — optional

Call this to update ONE of a defect’s custom-field values, leaving every other value untouched. Requires defect_ulid, field_ulid, and value (an empty/null value clears the field, or is rejected if the field is required). Returns { customFieldValues } with the full resulting set.

Parameters

  • defect_ulid — required
  • field_ulid — required
  • value — optional
  • idempotency_key — optional

Call this to list an organization’s custom-field definitions (system + custom) with offset pagination. Requires org_id (from get_current_organization). Accepts page, pageSize, q (title substring), entity/type/group (each an array, ANDed as one CSV filter). Returns items plus page, pageSize, and total.

Parameters

  • org_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • entity — optional
  • type — optional
  • group — optional

Call this to create a new custom-field definition in an organization. Requires org_id, title, and type. Optionally entity (test_case, test_run, or defect; defaults to test_case), placeholder, defaultValue, isRequired, allProjects, projectUlids, and options (required for select/radio types). Returns { field }.

Parameters

  • org_id — required
  • title — required
  • entity — optional
  • type — required
  • placeholder — optional
  • defaultValue — optional
  • isRequired — optional
  • allProjects — optional
  • projectUlids — optional
  • options — optional
  • idempotency_key — optional

Call this to update one or more fields of an existing custom-field definition. Requires org_id, field_ulid, and at least one of title, entity, type, placeholder, defaultValue, isRequired, allProjects, projectUlids, or options. Returns { field }.

Parameters

  • org_id — required
  • field_ulid — required
  • title — optional
  • entity — optional
  • type — optional
  • placeholder — optional
  • defaultValue — optional
  • isRequired — optional
  • allProjects — optional
  • projectUlids — optional
  • options — optional
  • idempotency_key — optional

Call this to permanently delete a custom-field definition. Requires org_id and field_ulid. Returns { deleted: true }.

Parameters

  • org_id — required
  • field_ulid — required
  • idempotency_key — optional

Call this to restore a system/default custom field to its original definition. Requires org_id and field_ulid. Returns { field }.

Parameters

  • org_id — required
  • field_ulid — required
  • idempotency_key — optional

Call this to reconcile a test case’s custom-field values to an EXACT desired set: values for fields not present in the input are cleared (or rejected if the field is required). Requires case_ulid and values (an array of { fieldUlid, value }). Returns { customFieldValues } with the full resulting set.

Parameters

  • case_ulid — required
  • values — required
  • idempotency_key — optional

Call this to update ONE of a test case’s custom-field values, leaving every other value untouched. Requires case_ulid, field_ulid, and value (an empty/null value clears the field, or is rejected if the field is required). Returns { customFieldValues } with the full resulting set.

Parameters

  • case_ulid — required
  • field_ulid — required
  • value — optional
  • idempotency_key — optional

Call this FIRST to discover the caller organization: returns the ulid and name of the organization bound to the caller’s API token. No arguments. Every org-scoped tool below (members, invitations) requires the returned ulid as org_id.

Parameters: This tool takes no parameters.

Call this to list an organization’s members with offset pagination. Requires org_id (from get_current_organization). Accepts page, pageSize, q (email/name substring), and role (an array, ANDed as one CSV filter — owner/admin/member/viewer). Returns items plus page, pageSize, and total.

Parameters

  • org_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • role — optional

Call this to change a member’s role. Requires org_id, user_ulid, and role (owner|admin|member|viewer). Returns { member }.

Parameters

  • org_id — required
  • user_ulid — required
  • role — required
  • idempotency_key — optional

Call this to remove a member from the organization. Requires org_id and user_ulid. Returns { deleted: true }.

Parameters

  • org_id — required
  • user_ulid — required
  • idempotency_key — optional

Call this to list an organization’s invitations with offset pagination. Requires org_id. Accepts page, pageSize, q (email substring), status (array, ANDed as one CSV filter — pending|accepted|revoked|expired), and role (array, ANDed as one CSV filter). Returns items plus page, pageSize, and total.

Parameters

  • org_id — required
  • page — optional
  • pageSize — optional
  • q — optional
  • status — optional
  • role — optional

Call this to invite a new member by email. Requires org_id, email, and role (admin|member|viewer). Optionally locale. Returns { ulid } of the created invitation.

Parameters

  • org_id — required
  • email — required
  • role — required
  • locale — optional
  • idempotency_key — optional

Call this to resend a pending invitation email. Requires org_id and invitation_ulid. Returns { ulid }.

Parameters

  • org_id — required
  • invitation_ulid — required
  • idempotency_key — optional

Call this to revoke a pending invitation. Requires org_id and invitation_ulid. Returns { deleted: true }.

Parameters

  • org_id — required
  • invitation_ulid — required
  • idempotency_key — optional

Call this to list an organization’s audit trail with cursor pagination. Requires org_id (from get_current_organization). Gated to owner/admin roles — any other role is rejected as forbidden. Accepts limit, cursor (feed the returned nextCursor back to fetch the next page), actorUlid, and entityType (a comma-separated string of one or more entity types, ANDed — e.g. “defect” or “defect,test_case”). Returns { events, nextCursor } — nextCursor is null on the last page.

Parameters

  • org_id — required
  • limit — optional
  • cursor — optional
  • actorUlid — optional
  • entityType — optional

Call this to list a defect’s audit trail with cursor pagination. Requires defect_ulid. Accepts limit and cursor (feed the returned nextCursor back to fetch the next page). Returns { events, nextCursor } — nextCursor is null on the last page.

Parameters

  • defect_ulid — required
  • limit — optional
  • cursor — optional

Call this to list a run’s audit trail with cursor pagination. Requires run_ulid. Accepts limit and cursor (feed the returned nextCursor back to fetch the next page). Returns { events, nextCursor } — nextCursor is null on the last page.

Parameters

  • run_ulid — required
  • limit — optional
  • cursor — optional

Call this FIRST to stage a suite/case tree file (e.g. CSV) for import. Requires project_id, filename, content_type, and data_base64 (the raw file bytes, base64-encoded). Decoded bytes must not exceed 10485760 bytes (10 MiB). Returns { uploadUlid, byteSize, filename } — pass uploadUlid to create_import to commit the tree.

Parameters

  • project_id — required
  • filename — required
  • content_type — required
  • data_base64 — required
  • idempotency_key — optional

Call this to commit a staged import into an atomic suite/case tree. Requires project_id, uploadUlid (from stage_import), sourceFormat, targetSuiteUlid (a suite ulid to import under, or null for the project root), and replaceMatching (whether same-titled existing cases are replaced instead of duplicated). Returns the import report: counts (suitesCreated, casesCreated, casesReplaced, rowsFailed), created, replaced, failures, and warnings.

Parameters

  • project_id — required
  • uploadUlid — required
  • sourceFormat — required
  • targetSuiteUlid — required
  • replaceMatching — required
  • idempotency_key — optional

Composite convenience tool: creates a defect, links it to a run result, and links it to one or more test cases — three SEPARATE sequential dispatched calls. Requires project_id, title, resultUlid, and testCaseUlids (at least one). Optionally description. This tool is NOT ATOMIC at the MCP layer: if a later step fails, earlier steps are NOT rolled back (e.g. the defect may already exist even though a case link 422s) — the failure result includes a partial-state JSON block (defect, and resultLink/caseLinks if those steps already succeeded); call get_defect or list_defect_affected_cases afterward to confirm the actual state, then retry the failed step with link_defect_case/link_defect_result directly. For an atomic run-result submission use bulk_submit_run_result instead. Returns { defect, resultLink, caseLinks }.

Parameters

  • project_id — required
  • title — required
  • resultUlid — required
  • testCaseUlids — required
  • description — optional
  • idempotency_key — optional