{"openapi":"3.1.0","info":{"title":"PractiTest (BYOK) API","version":"0.1.0","description":"PractiTest (BYOK) lets an AI assistant read your own PractiTest data through the PractiTest API with a key you supply (PractiTest API token (personal or account token, US data center)). Read-only: 12 tools (list_projects, list_fields, list_requirements, list_tests, get_test, get_test_run_status_counts, list_steps, list_test_sets, list_instances, list_runs, list_milestones, list_issues). The BYOK...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-practitest.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-practitest/docs"},"termsOfService":"https://connectorbay.com/byok-practitest/terms"},"servers":[{"url":"https://byok-practitest.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-practitest/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_projects":{"post":{"operationId":"list_projects","summary":"List the PractiTest projects the token can see, with name, creation time and whether automation, issue deletion and time","description":"List the PractiTest projects the token can see, with name, creation time and whether automation, issue deletion and time management are on. Use for \"Which projects do I have in PractiTest\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"title":"list_projectsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_fields":{"post":{"operationId":"list_fields","summary":"List the system and custom fields of a project with name, format, possible values and the entities they apply to. Use fo","description":"List the system and custom fields of a project with name, format, possible values and the entities they apply to. Use for \"Which custom fields does my PractiTest project have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_fieldsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_requirements":{"post":{"operationId":"list_requirements","summary":"List the requirements of a project with name, run status, last run, version, priority, folder and times. Custom field va","description":"List the requirements of a project with name, run status, last run, version, priority, folder and times. Custom field values and assignees are not returned. Use for \"Which requirements in PractiTest project 4566 are failing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"display_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with these display ids, comma separated (not the system ids).","title":"Display Ids"},"name_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries whose name contains this text, not case sensitive.","title":"Name Like"},"name_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with exactly this name, case sensitive.","title":"Name Exact"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_requirementsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tests":{"post":{"operationId":"list_tests","summary":"List the tests of a project with name, description, step count, status, run status, last run, type, estimated duration, ","description":"List the tests of a project with name, description, step count, status, run status, last run, type, estimated duration, version, priority and times. Custom field values, author and assignee are not returned. Use for \"Which tests in PractiTest project 4566 failed on their last run\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"display_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with these display ids, comma separated (not the system ids).","title":"Display Ids"},"name_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries whose name contains this text, not case sensitive.","title":"Name Like"},"name_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with exactly this name, case sensitive.","title":"Name Exact"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_testsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_test":{"post":{"operationId":"get_test","summary":"Get one test with name, description, step count, status, run status, last run, type, estimated duration, version and pri","description":"Get one test with name, description, step count, status, run status, last run, type, estimated duration, version and priority. Use for \"Show PractiTest test 1850360 in project 4566\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"test_id":{"description":"System id of the test (list_tests returns it, not the display id).","minimum":1,"title":"Test Id","type":"integer"}},"required":["project_id","test_id"],"title":"get_testArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_test_run_status_counts":{"post":{"operationId":"get_test_run_status_counts","summary":"Count the tests of a project by last run status (passed, failed, not completed, no run, blocked). Use for \"How many test","description":"Count the tests of a project by last run status (passed, failed, not completed, no run, blocked). Use for \"How many tests pass and fail in PractiTest project 4566\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"}},"required":["project_id"],"title":"get_test_run_status_countsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_steps":{"post":{"operationId":"list_steps","summary":"List the test steps of a project with kind, test, name, description, expected result and position. Use for \"What are the","description":"List the test steps of a project with kind, test, name, description, expected result and position. Use for \"What are the steps of PractiTest test 257245\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"test_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only steps of these tests, comma separated system ids.","title":"Test Ids"},"name_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries whose name contains this text, not case sensitive.","title":"Name Like"},"name_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with exactly this name, case sensitive.","title":"Name Exact"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_stepsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_test_sets":{"post":{"operationId":"list_test_sets","summary":"List the test sets of a project with name, description, instance count, run status, last run, milestone, estimated and a","description":"List the test sets of a project with name, description, instance count, run status, last run, milestone, estimated and actual duration. Custom field values and assignees are not returned. Use for \"Which PractiTest test sets are failing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"display_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with these display ids, comma separated (not the system ids).","title":"Display Ids"},"name_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries whose name contains this text, not case sensitive.","title":"Name Like"},"name_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with exactly this name, case sensitive.","title":"Name Exact"},"duration":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to include estimated and actual duration.","title":"Duration"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_test_setsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_instances":{"post":{"operationId":"list_instances","summary":"List the instances (a test inside a test set) of a project with name, set, test, run status, last run, last run duration","description":"List the instances (a test inside a test set) of a project with name, set, test, run status, last run, last run duration, priority and version. Use for \"Which test instances in PractiTest set 96530 passed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"set_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only instances of these test sets, comma separated system ids.","title":"Set Ids"},"test_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only instances of these tests, comma separated system ids.","title":"Test Ids"},"name_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries whose name contains this text, not case sensitive.","title":"Name Like"},"name_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with exactly this name, case sensitive.","title":"Name Exact"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_instancesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_runs":{"post":{"operationId":"list_runs","summary":"List the test runs of a project with status, instance, test, run type, version, duration and times. The output of automa","description":"List the test runs of a project with status, instance, test, run type, version, duration and times. The output of automated runs and the tester are not returned. Use for \"Which PractiTest runs for test 80893 failed recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"test_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only runs of these tests, comma separated system ids.","title":"Test Ids"},"set_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only runs of these test sets, comma separated system ids.","title":"Set Ids"},"instance_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only runs of these instances, comma separated system ids.","title":"Instance Ids"},"run_type":{"anyOf":[{"enum":["AutomatedRun","ManualRun"],"type":"string"},{"type":"null"}],"default":null,"description":"Only runs of this type.","title":"Run Type"},"updated_hours_ago":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only runs updated within this many hours.","title":"Updated Hours Ago"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_runsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_milestones":{"post":{"operationId":"list_milestones","summary":"List the milestones of a project (sprints, releases) with name, description, status, type, start and end date. Use for \"","description":"List the milestones of a project (sprints, releases) with name, description, status, type, start and end date. Use for \"What milestones does my PractiTest project have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_milestonesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_issues":{"post":{"operationId":"list_issues","summary":"List the issues of a project with title, run status, last run, version, priority and times. Custom field values and assi","description":"List the issues of a project with title, run status, last run, version, priority and times. Custom field values and assignees are not returned. Use for \"Which issues does my PractiTest project have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Id of the PractiTest project (list_projects returns it).","minimum":1,"title":"Project Id","type":"integer"},"display_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries with these display ids, comma separated (not the system ids).","title":"Display Ids"},"title_like":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only issues whose title contains this text, not case sensitive.","title":"Title Like"},"title_exact":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only issues with exactly this title, case sensitive.","title":"Title Exact"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries per page (1 to 100, default 100).","title":"Page Size"}},"required":["project_id"],"title":"list_issuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}