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”). 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— 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
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 (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— requiredname— requireddescription— optionalenvironmentId— optionalenvironment— optionaldefaultAssigneeUlid— optionalcaseUlids— optionalcaseAssignees— optionalstartedAt— optionalmilestoneId— optionalcustomFieldValues— optionalplanUlid— 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— 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 (may be empty); 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.
Parameters
run_ulid— requiredrun_case_ulid— requiredstep_ulid— requiredstatus— requiredidempotency_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). Returns { actualResult }.
Parameters
run_ulid— requiredrun_case_ulid— requiredstep_ulid— requiredactualResult— optionalattachments— 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 one or more cases to a run (additive — existing cases are untouched). Requires run_ulid and caseUlids (at least one).
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 (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— 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— requiredentity— optionaltype— requiredplaceholder— 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— optionalentity— optionaltype— optionalplaceholder— 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 (an array, ANDed as one CSV filter — owner/admin/member/viewer). 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 (owner|admin|member|viewer). 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 (array, 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 (admin|member|viewer). Optionally locale. Returns { ulid } of the created invitation.
Parameters
org_id— requiredemail— requiredrole— requiredlocale— 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