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.
create_project
Section titled “create_project”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”). Requires the project management permission, so only an owner or admin role may create a project — a member or viewer token receives 403 forbidden. Returns the created project, including its ulid.
Parameters
name— requiredid— requireddescription— optionalidempotency_key— optional
list_projects
Section titled “list_projects”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— optionalpageSize— optionalq— optionalinclude— optionalmemberUlid— optionalruns— optionaldefects— optionalmilestones— optionalcases— optionalstatus— optional
check_project_id_available
Section titled “check_project_id_available”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
get_project
Section titled “get_project”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
update_project
Section titled “update_project”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— requiredname— optionalid— optionaldescription— optionalidempotency_key— optional
delete_project
Section titled “delete_project”Call this to permanently delete a project. Requires project_id. Returns { deleted: true } on success.
Parameters
project_id— requiredidempotency_key— optional
archive_project
Section titled “archive_project”Call this to archive an active project. Requires project_id. Reversible: hides the project from list_projects by default; does not gate reads/writes or release a project seat.
Parameters
project_id— requiredidempotency_key— optional
unarchive_project
Section titled “unarchive_project”Call this to restore an archived project to active. Requires project_id.
Parameters
project_id— requiredidempotency_key— optional
create_suite
Section titled “create_suite”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— requiredname— requireddescription— optionalparentUlid— optionalidempotency_key— optional
list_suites
Section titled “list_suites”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— requiredlimit— optionalcursor— optional
get_suite_by_display_id
Section titled “get_suite_by_display_id”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— requireddisplay_id— required
list_suite_children
Section titled “list_suite_children”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— requiredsuite_ulid— requiredlimit— optionalcursor— optional
clone_suite
Section titled “clone_suite”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— requiredsuite_ulid— requireddestinationProjectCode— requireddestinationSuiteUlid— requiredprefix— optionalstrategy— optionalidempotency_key— optional
get_suite
Section titled “get_suite”Call this to fetch a single suite by its ulid. Requires suite_ulid.
Parameters
suite_ulid— required
update_suite
Section titled “update_suite”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— requiredname— optionaldescription— optionalparentUlid— optionalidempotency_key— optional
delete_suite
Section titled “delete_suite”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— requiredcaseDisposition— optionalidempotency_key— optional
get_suite_case_counts
Section titled “get_suite_case_counts”Call this to read the active/archived/total test case counts for a suite and its descendants. Requires suite_ulid.
Parameters
suite_ulid— required
get_test_case_steps
Section titled “get_test_case_steps”Call this to read the ordered list of steps (and their committed attachments) for a test case. Requires case_ulid.
Parameters
case_ulid— required
replace_test_case_steps
Section titled “replace_test_case_steps”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— requiredsteps— requiredidempotency_key— optional
create_test_case
Section titled “create_test_case”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— requiredtitle— requireddescription— optionalsuiteUlid— optionalmilestoneUlid— optionaltags— optionalsteps— optionalidempotency_key— optional
list_test_cases
Section titled “list_test_cases”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— requiredlimit— optionalcursor— optionalsuiteUlid— optionalarchived— optionalmilestoneUlid— optional
search_test_cases
Section titled “search_test_cases”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— requiredq— optionalscope— optionalcf— optionallimit— optional
get_test_case_by_display_id
Section titled “get_test_case_by_display_id”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— requireddisplay_id— required
clone_test_case
Section titled “clone_test_case”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— requiredcase_ulid— requireddestinationProjectCode— requireddestinationSuiteUlid— requiredprefix— optionalidempotency_key— optional
bulk_archive_test_cases
Section titled “bulk_archive_test_cases”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— requiredcaseUlids— requiredidempotency_key— optional
bulk_clone_test_cases
Section titled “bulk_clone_test_cases”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— requiredcaseUlids— requiredsuiteUlids— requireddestinationProjectCode— requireddestinationSuiteUlid— requiredstrategy— requiredidempotency_key— optional
get_test_case
Section titled “get_test_case”Call this to fetch a single test case by its ulid. Requires case_ulid.
Parameters
case_ulid— required
update_test_case
Section titled “update_test_case”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— requiredpatch— optionalsteps— optionalcustomFieldValues— optionalidempotency_key— optional
delete_test_case
Section titled “delete_test_case”Call this to permanently delete a test case. Requires case_ulid. Returns { deleted: true } on success.
Parameters
case_ulid— requiredidempotency_key— optional
archive_test_case
Section titled “archive_test_case”Call this to archive an active test case. Requires case_ulid.
Parameters
case_ulid— requiredidempotency_key— optional
unarchive_test_case
Section titled “unarchive_test_case”Call this to restore an archived test case to active. Requires case_ulid.
Parameters
case_ulid— requiredidempotency_key— optional
stage_step_attachment
Section titled “stage_step_attachment”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— requiredfilename— requiredcontent_type— requireddata_base64— requiredidempotency_key— optional
delete_step_attachment
Section titled “delete_step_attachment”Call this to permanently delete a committed step attachment. Requires case_ulid and attachment_ulid. Returns { deleted: true } on success.
Parameters
case_ulid— requiredattachment_ulid— requiredidempotency_key— optional
create_run
Section titled “create_run”Call this to create a new test run inside a project. Requires project_id (the project code) and name. Requires caseUlids (1-5000) 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— requiredname— requireddescription— optionalenvironmentId— optionalenvironment— optionaldefaultAssigneeUlid— optionalcaseUlids— optionalcaseAssignees— optionalstartedAt— optionalmilestoneId— optionalcustomFieldValues— optionalplanUlid— optionaltags— optionalconfigurationUlids— optionalidempotency_key— optional
list_runs
Section titled “list_runs”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— requiredpage— optionalpageSize— optionalq— optionalstatus— optionalenv— optionalauthorUlid— optionalassigneeUlid— optionalmilestoneUlid— optionalcf— optional
list_run_environments
Section titled “list_run_environments”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
clone_run
Section titled “clone_run”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— requiredrun_ulid— requiredtitle— requiredcloneAssignees— optionalstatusFilter— optionalidempotency_key— optional
get_run
Section titled “get_run”Call this to fetch a single run by its ulid. Requires run_ulid.
Parameters
run_ulid— required
update_run
Section titled “update_run”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— requiredname— optionaldescription— optionaldefaultAssigneeUlid— optionalenvironmentId— optionalmilestoneId— optionaltags— optionalconfigurationUlids— optionalidempotency_key— optional
reconcile_run_cases
Section titled “reconcile_run_cases”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 (0-5000); optionally caseAssignees.
Parameters
run_ulid— requiredcaseUlids— requiredcaseAssignees— optionalidempotency_key— optional
close_run
Section titled “close_run”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— requiredidempotency_key— optional
abort_run
Section titled “abort_run”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— requiredidempotency_key— optional
delete_run
Section titled “delete_run”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— requiredidempotency_key— optional
set_run_custom_field_values
Section titled “set_run_custom_field_values”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— requiredvalues— requiredidempotency_key— optional
bulk_mark_run_cases
Section titled “bulk_mark_run_cases”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— requiredcaseUlids— requiredstatus— requiredidempotency_key— optional
bulk_assign_run_cases
Section titled “bulk_assign_run_cases”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— requiredcaseUlids— requiredassigneeUlid— requiredidempotency_key— optional
bulk_retry_run_cases
Section titled “bulk_retry_run_cases”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— requiredcaseUlids— requiredidempotency_key— optional
bulk_remove_run_cases
Section titled “bulk_remove_run_cases”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— requiredcaseUlids— requiredidempotency_key— optional
bulk_submit_run_result
Section titled “bulk_submit_run_result”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— requiredcaseUlids— requiredstatus— requiredtotalDurationMs— optionalnotes— optionalattachments— optionaldefect— optionalidempotency_key— optional
mark_run_case_step
Section titled “mark_run_case_step”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. Pass amendResult=true only to correct a step of an already-recorded attempt: it skips the project’s step-to-case derivation so no result row is appended, and it is rejected with 422 unless the run case is already in a terminal status.
Parameters
run_ulid— requiredrun_case_ulid— requiredstep_ulid— requiredstatus— requiredamendResult— optionalidempotency_key— optional
save_run_case_step_result
Section titled “save_run_case_step_result”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). Pass amendResult=true only to correct the note of an already-recorded attempt: it lifts that already-marked rejection for a run case in a terminal status, and is itself rejected with 422 on any other status. Returns { actualResult }.
Parameters
run_ulid— requiredrun_case_ulid— requiredstep_ulid— requiredactualResult— optionalattachments— optionalamendResult— optionalidempotency_key— optional
list_run_cases
Section titled “list_run_cases”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
get_run_case
Section titled “get_run_case”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— requiredrun_case_ulid— required
add_run_cases
Section titled “add_run_cases”Call this to add up to 500 cases to a run (additive — existing cases are untouched). Requires run_ulid and caseUlids (1-500).
Parameters
run_ulid— requiredcaseUlids— requiredidempotency_key— optional
remove_run_case
Section titled “remove_run_case”Call this to remove one case from a run. Requires run_ulid and run_case_ulid. Returns { deleted: true } on success.
Parameters
run_ulid— requiredrun_case_ulid— requiredidempotency_key— optional
retry_run_case
Section titled “retry_run_case”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— requiredrun_case_ulid— requiredidempotency_key— optional
open_run_case
Section titled “open_run_case”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— requiredrun_case_ulid— requiredidempotency_key— optional
mark_run_case
Section titled “mark_run_case”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— requiredrun_case_ulid— requiredassigneeUlid— optionalstatus— optionalelapsedMs— optionalidempotency_key— optional
list_results
Section titled “list_results”Call this to list the append-only result log for a run (cursor pagination). Requires run_ulid.
Parameters
run_ulid— required
get_result
Section titled “get_result”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— requiredresult_ulid— required
patch_result
Section titled “patch_result”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— requiredresult_ulid— requirednotes— optionaldurationMs— optionalidempotency_key— optional
stage_result_attachment
Section titled “stage_result_attachment”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— requiredresult_ulid— requiredfilename— requiredcontent_type— requireddata_base64— requiredidempotency_key— optional
commit_result_attachments
Section titled “commit_result_attachments”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— requiredresult_ulid— requiredattachments— requiredidempotency_key— optional
delete_result_attachment
Section titled “delete_result_attachment”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— requiredresult_ulid— requiredattachment_ulid— requiredidempotency_key— optional
stage_run_case_step_result_attachment
Section titled “stage_run_case_step_result_attachment”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— requiredrun_case_ulid— requiredstep_ulid— requiredfilename— requiredcontent_type— requireddata_base64— requiredidempotency_key— optional
delete_run_case_step_result_attachment
Section titled “delete_run_case_step_result_attachment”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— requiredrun_case_ulid— requiredstep_ulid— requiredattachment_ulid— requiredidempotency_key— optional
create_test_plan
Section titled “create_test_plan”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— requiredname— requireddescription— optionalstatus— optionalidempotency_key— optional
list_test_plans
Section titled “list_test_plans”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— requiredpage— optionalpageSize— optional
get_test_plan
Section titled “get_test_plan”Call this to fetch a single test plan by its ulid. Requires plan_ulid.
Parameters
plan_ulid— required
update_test_plan
Section titled “update_test_plan”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— requiredname— optionaldescription— optionalstatus— optionalmilestoneId— optionalidempotency_key— optional
delete_test_plan
Section titled “delete_test_plan”Call this to permanently delete a test plan. Requires plan_ulid. Returns { deleted: true }.
Parameters
plan_ulid— requiredidempotency_key— optional
replace_test_plan_cases
Section titled “replace_test_plan_cases”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 (0-5000; may be empty to clear the selection). Optionally caseAssignees. Returns the new selection as { items }.
Parameters
plan_ulid— requiredcaseUlids— requiredcaseAssignees— optionalidempotency_key— optional
list_test_plan_cases
Section titled “list_test_plan_cases”Call this to list a plan’s selected cases (no paging — the full selection is returned). Requires plan_ulid.
Parameters
plan_ulid— required
patch_test_plan_case
Section titled “patch_test_plan_case”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— requiredplan_case_ulid— requiredassigneeUlid— requiredidempotency_key— optional
list_test_plan_runs
Section titled “list_test_plan_runs”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
replace_test_plan_configurations
Section titled “replace_test_plan_configurations”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— requiredconfigurationUlids— requiredidempotency_key— optional
list_test_plan_configurations
Section titled “list_test_plan_configurations”Call this to list a plan’s selected configuration values (no paging — the full selection is returned). Requires plan_ulid.
Parameters
plan_ulid— required
set_test_plan_excluded_combinations
Section titled “set_test_plan_excluded_combinations”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— requiredcomboKeys— requiredidempotency_key— optional
get_test_plan_combinations
Section titled “get_test_plan_combinations”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
create_milestone
Section titled “create_milestone”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— requiredname— requireddescription— optionalstatus— optionalstartAt— optionaldueAt— optionalforecastAt— optionalparentId— optionalidempotency_key— optional
list_milestones
Section titled “list_milestones”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— requiredpage— optionalpageSize— optionalq— optionalstatus— optionalview— optional
get_milestone
Section titled “get_milestone”Call this to fetch a single milestone by its ulid. Requires milestone_ulid.
Parameters
milestone_ulid— required
update_milestone
Section titled “update_milestone”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— requiredname— optionaldescription— optionalstatus— optionalstartAt— optionaldueAt— optionalforecastAt— optionalparentId— optionalidempotency_key— optional
delete_milestone
Section titled “delete_milestone”Call this to permanently delete a milestone. Requires milestone_ulid. Returns { deleted: true } on success.
Parameters
milestone_ulid— requiredidempotency_key— optional
create_environment
Section titled “create_environment”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— requiredname— requiredslug— requireddescription— optionalurl— optionalisDefault— optionalidempotency_key— optional
list_environments
Section titled “list_environments”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— requiredpage— optionalpageSize— optional
get_environment
Section titled “get_environment”Call this to fetch a single environment by its ulid. Requires environment_ulid.
Parameters
environment_ulid— required
update_environment
Section titled “update_environment”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— requiredname— optionalslug— optionaldescription— optionalurl— optionalisDefault— optionalidempotency_key— optional
delete_environment
Section titled “delete_environment”Call this to permanently delete an environment. Requires environment_ulid. Returns { deleted: true } on success.
Parameters
environment_ulid— requiredidempotency_key— optional
create_configuration_group
Section titled “create_configuration_group”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— requiredname— requiredidempotency_key— optional
list_configuration_groups
Section titled “list_configuration_groups”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— requiredpage— optionalpageSize— optionalinclude— optional
get_configuration_group
Section titled “get_configuration_group”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— requiredinclude— optional
update_configuration_group
Section titled “update_configuration_group”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— requiredname— optionalidempotency_key— optional
delete_configuration_group
Section titled “delete_configuration_group”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— requiredidempotency_key— optional
create_configuration
Section titled “create_configuration”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— requiredname— requiredidempotency_key— optional
list_configurations
Section titled “list_configurations”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
update_configuration
Section titled “update_configuration”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— requiredname— optionalidempotency_key— optional
delete_configuration
Section titled “delete_configuration”Call this to permanently delete a configuration value by its ulid. Requires configuration_ulid. Returns { deleted: true } on success.
Parameters
configuration_ulid— requiredidempotency_key— optional
create_defect
Section titled “create_defect”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— requiredtitle— requireddescription— optionalassigneeUlid— optionaltags— optionalmilestoneUlid— optionalcustomFieldValues— optionalidempotency_key— optional
list_defects
Section titled “list_defects”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— requiredpage— optionalpageSize— optionalq— optionalstatus— optionalseverity— optionalpriority— optionalassigneeUlid— optionalaging— optionalfields— optionalmilestoneUlid— optionalcf— optional
get_defect_metrics
Section titled “get_defect_metrics”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
get_defect
Section titled “get_defect”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
update_defect
Section titled “update_defect”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— requiredtitle— optionaldescription— optionalstatus— optionalresolution— optionalassigneeUlid— optionaltags— optionalmilestoneUlid— optionalduplicateOfUlid— optionalidempotency_key— optional
delete_defect
Section titled “delete_defect”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— requiredidempotency_key— optional
list_run_defects
Section titled “list_run_defects”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
link_defect_case
Section titled “link_defect_case”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— requiredtestCaseUlid— requiredidempotency_key— optional
unlink_defect_case
Section titled “unlink_defect_case”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— requiredlink_ulid— requiredidempotency_key— optional
dismiss_defect_case
Section titled “dismiss_defect_case”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— requiredtestCaseUlid— requiredidempotency_key— optional
link_defect_result
Section titled “link_defect_result”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— requiredresultUlid— requiredstepSnapshotUlid— optionalidempotency_key— optional
list_defect_result_links
Section titled “list_defect_result_links”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— requiredlimit— optionalcursor— optional
unlink_defect_result
Section titled “unlink_defect_result”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— requiredlink_ulid— requiredidempotency_key— optional
list_defect_affected_cases
Section titled “list_defect_affected_cases”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— requiredlimit— optionalcursor— optional
upload_defect_attachment
Section titled “upload_defect_attachment”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— requiredfilename— requiredcontent_type— requireddata_base64— requiredidempotency_key— optional
list_defect_attachments
Section titled “list_defect_attachments”Call this to list every attachment persisted on a defect. Requires defect_ulid. Returns { attachments } — a bare passthrough, no pagination.
Parameters
defect_ulid— required
delete_defect_attachment
Section titled “delete_defect_attachment”Call this to permanently delete a defect attachment. Requires defect_ulid and attachment_ulid. Returns { deleted: true }.
Parameters
defect_ulid— requiredattachment_ulid— requiredidempotency_key— optional
set_defect_custom_field_values
Section titled “set_defect_custom_field_values”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— requiredvalues— requiredidempotency_key— optional
patch_defect_custom_field_value
Section titled “patch_defect_custom_field_value”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— requiredfield_ulid— requiredvalue— optionalidempotency_key— optional
list_custom_fields
Section titled “list_custom_fields”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— requiredpage— optionalpageSize— optionalq— optionalentity— optionaltype— optionalgroup— optionallocales— optional
create_custom_field
Section titled “create_custom_field”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— requiredtitle— requiredtitleI18n— optionalentity— optionaltype— requiredplaceholder— optionalplaceholderI18n— optionaldefaultValue— optionalisRequired— optionalallProjects— optionalprojectUlids— optionaloptions— optionalidempotency_key— optional
update_custom_field
Section titled “update_custom_field”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— requiredfield_ulid— requiredtitle— optionaltitleI18n— optionalentity— optionaltype— optionalplaceholder— optionalplaceholderI18n— optionaldefaultValue— optionalisRequired— optionalallProjects— optionalprojectUlids— optionaloptions— optionalidempotency_key— optional
delete_custom_field
Section titled “delete_custom_field”Call this to permanently delete a custom-field definition. Requires org_id and field_ulid. Returns { deleted: true }.
Parameters
org_id— requiredfield_ulid— requiredidempotency_key— optional
reset_custom_field
Section titled “reset_custom_field”Call this to restore a system/default custom field to its original definition. Requires org_id and field_ulid. Returns { field }.
Parameters
org_id— requiredfield_ulid— requiredidempotency_key— optional
set_test_case_custom_field_values
Section titled “set_test_case_custom_field_values”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— requiredvalues— requiredidempotency_key— optional
patch_test_case_custom_field_value
Section titled “patch_test_case_custom_field_value”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— requiredfield_ulid— requiredvalue— optionalidempotency_key— optional
get_current_organization
Section titled “get_current_organization”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.
list_org_members
Section titled “list_org_members”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 (one or more role slugs from this organization’s roles list, system or custom, ANDed as one CSV filter). Returns items plus page, pageSize, and total.
Parameters
org_id— requiredpage— optionalpageSize— optionalq— optionalrole— optional
update_org_member_role
Section titled “update_org_member_role”Call this to change a member’s role. Requires org_id, user_ulid, and role — a role slug from this organization’s roles list (system or custom). Returns { member }.
Parameters
org_id— requireduser_ulid— requiredrole— requiredidempotency_key— optional
remove_org_member
Section titled “remove_org_member”Call this to remove a member from the organization. Requires org_id and user_ulid. Returns { deleted: true }.
Parameters
org_id— requireduser_ulid— requiredidempotency_key— optional
list_org_invitations
Section titled “list_org_invitations”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 (one or more role slugs from this organization’s roles list, system or custom, ANDed as one CSV filter). Returns items plus page, pageSize, and total.
Parameters
org_id— requiredpage— optionalpageSize— optionalq— optionalstatus— optionalrole— optional
create_invitation
Section titled “create_invitation”Call this to invite a new member by email. Requires org_id, email, and role — a role slug from this organization’s roles list (system or custom); owner cannot be invited. Optionally locale. Returns { ulid } of the created invitation.
Parameters
org_id— requiredemail— requiredrole— requiredlocale— optionalgrantAllPrivateProjects— optionalidempotency_key— optional
bulk_create_invitations
Section titled “bulk_create_invitations”Call this to invite up to 50 addresses at once with ONE shared role. Requires org_id, emails (1-50), and role — a role slug from this organization’s roles list (system or custom); owner cannot be invited. Optionally locale, applied to the WHOLE list (no per-address role or locale). Optionally grantAllPrivateProjects, applied to the WHOLE list: when true, each invitee is granted every private project of the organization once they accept. Returns { results: [{ email, status }] }, one entry per distinct submitted address, status one of created, duplicate_pending, already_member, invalid_email.
Parameters
org_id— requiredemails— requiredrole— requiredgrantAllPrivateProjects— optionallocale— optionalidempotency_key— optional
resend_invitation
Section titled “resend_invitation”Call this to resend a pending invitation email. Requires org_id and invitation_ulid. Returns { ulid }.
Parameters
org_id— requiredinvitation_ulid— requiredidempotency_key— optional
revoke_invitation
Section titled “revoke_invitation”Call this to revoke a pending invitation. Requires org_id and invitation_ulid. Returns { deleted: true }.
Parameters
org_id— requiredinvitation_ulid— requiredidempotency_key— optional
list_audit_events
Section titled “list_audit_events”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— requiredlimit— optionalcursor— optionalactorUlid— optionalentityType— optional
list_defect_audit_events
Section titled “list_defect_audit_events”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— requiredlimit— optionalcursor— optional
list_run_audit_events
Section titled “list_run_audit_events”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— requiredlimit— optionalcursor— optional
stage_import
Section titled “stage_import”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— requiredfilename— requiredcontent_type— requireddata_base64— requiredidempotency_key— optional
create_import
Section titled “create_import”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— requireduploadUlid— requiredsourceFormat— requiredtargetSuiteUlid— requiredreplaceMatching— requiredidempotency_key— optional
report_defect_from_result
Section titled “report_defect_from_result”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— requiredtitle— requiredresultUlid— requiredtestCaseUlids— requireddescription— optionalidempotency_key— optional
list_tags
Section titled “list_tags”Call this to list an organization’s tag catalog with offset pagination. Requires org_id (from get_current_organization). Accepts page, pageSize, q (name substring) and authorUlid (one or more member ULIDs, comma-separated). Each tag carries its author and its usage counts across test cases, defects and test runs; the counts cover only the projects the caller may read. Returns items plus page, pageSize, and total.
Parameters
org_id— requiredpage— optionalpageSize— optionalq— optionalauthorUlid— optional
create_tag
Section titled “create_tag”Call this to add a tag to the organization catalog. Requires org_id and name. Names are trimmed and unique per organization; a duplicate is refused as a conflict. Returns the created tag, including its ulid and its three (zero) usage counts.
Parameters
org_id— requiredname— requiredidempotency_key— optional
update_tag
Section titled “update_tag”Call this to rename a tag. Requires org_id, tag_ulid and name. The rename reaches every test case, defect and test run the tag is attached to without changing any of them. Returns the renamed tag with its current usage counts.
Parameters
org_id— requiredtag_ulid— requiredname— optionalidempotency_key— optional
delete_tag
Section titled “delete_tag”Call this to permanently delete a tag. Requires org_id and tag_ulid. Deleting a tag detaches it from every test case, defect and test run that carries it, leaving those otherwise intact. Returns { deleted: true }.
Parameters
org_id— requiredtag_ulid— requiredidempotency_key— optional
bulk_delete_tags
Section titled “bulk_delete_tags”Call this to delete several tags at once. Requires org_id and ulids (1-100 tag ULIDs). Each deletion detaches the tag from every test case, defect and test run that carries it. A ULID this organization does not own, or one already removed, is skipped rather than failing the request. Returns { deleted: <count actually removed> }.
Parameters
org_id— requiredulids— requiredidempotency_key— optional