@smartbear/mcp 0.24.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/bearq/tool/tasks/chat-with-qa-lead.js +1 -0
  2. package/dist/bearq/tool/tasks/expand-application-model.js +1 -0
  3. package/dist/bearq/tool/tasks/get-task-status.js +1 -0
  4. package/dist/bearq/tool/tasks/get-task.js +1 -0
  5. package/dist/bearq/tool/tasks/refine-all-draft-tests.js +1 -0
  6. package/dist/bearq/tool/tasks/refine-test-cases.js +1 -0
  7. package/dist/bearq/tool/tasks/refine-tests-in-functional-areas.js +1 -0
  8. package/dist/bearq/tool/tasks/run-regression-tests.js +1 -0
  9. package/dist/bearq/tool/tasks/run-test-cases.js +1 -0
  10. package/dist/bearq/tool/tasks/run-tests-in-functional-areas.js +1 -0
  11. package/dist/bearq/tool/tasks/stop-task.js +1 -0
  12. package/dist/bearq/tool/tasks/wait-for-task.js +1 -0
  13. package/dist/bugsnag/client.js +1 -0
  14. package/dist/bugsnag/tool/error/get-error.js +1 -0
  15. package/dist/bugsnag/tool/error/list-project-errors.js +1 -0
  16. package/dist/bugsnag/tool/error/update-error.js +1 -0
  17. package/dist/bugsnag/tool/event/get-event-details-from-dashboard-url.js +1 -0
  18. package/dist/bugsnag/tool/event/get-event.js +1 -0
  19. package/dist/bugsnag/tool/event/list-error-events.js +1 -0
  20. package/dist/bugsnag/tool/performance/get-network-endpoint-groupings.js +1 -0
  21. package/dist/bugsnag/tool/performance/get-span-group.js +1 -0
  22. package/dist/bugsnag/tool/performance/get-trace.js +1 -0
  23. package/dist/bugsnag/tool/performance/list-span-groups.js +1 -0
  24. package/dist/bugsnag/tool/performance/list-spans.js +1 -0
  25. package/dist/bugsnag/tool/performance/list-trace-fields.js +1 -0
  26. package/dist/bugsnag/tool/performance/set-network-endpoint-groupings.js +1 -0
  27. package/dist/bugsnag/tool/project/get-current-project.js +1 -0
  28. package/dist/bugsnag/tool/project/list-project-event-filters.js +1 -0
  29. package/dist/bugsnag/tool/project/list-projects.js +1 -0
  30. package/dist/bugsnag/tool/release/get-build.js +1 -0
  31. package/dist/bugsnag/tool/release/get-release.js +1 -0
  32. package/dist/bugsnag/tool/release/list-releases.js +1 -0
  33. package/dist/collaborator/client.js +10 -0
  34. package/dist/common/client-registry.js +17 -9
  35. package/dist/common/server.js +44 -1
  36. package/dist/common/transport-http.js +24 -20
  37. package/dist/common/transport-stdio.js +7 -5
  38. package/dist/package.json.js +1 -1
  39. package/dist/pactflow/client/tools.js +102 -0
  40. package/dist/qmetry/client/tools/automation-tools.js +2 -0
  41. package/dist/qmetry/client/tools/issue-tools.js +6 -0
  42. package/dist/qmetry/client/tools/project-tools.js +9 -0
  43. package/dist/qmetry/client/tools/requirement-tools.js +5 -0
  44. package/dist/qmetry/client/tools/testcase-tools.js +7 -0
  45. package/dist/qmetry/client/tools/testsuite-tools.js +11 -0
  46. package/dist/qtm4j/client.js +25 -1
  47. package/dist/qtm4j/config/constants.js +101 -1
  48. package/dist/qtm4j/config/field-resolution.types.js +3 -1
  49. package/dist/qtm4j/http/api-client.js +20 -2
  50. package/dist/qtm4j/resolver/resolver-registry.js +7 -1
  51. package/dist/qtm4j/resolver/resolvers/requirement-id-resolver.js +28 -0
  52. package/dist/qtm4j/resolver/resolvers/test-cycle-uid-resolver.js +28 -0
  53. package/dist/qtm4j/schema/linked-items.schema.js +95 -0
  54. package/dist/qtm4j/schema/requirements.schema.js +109 -0
  55. package/dist/qtm4j/schema/test-cycle.link.schema.js +260 -0
  56. package/dist/qtm4j/tool/project/get-projects.js +2 -1
  57. package/dist/qtm4j/tool/project/set-project-context.js +2 -1
  58. package/dist/qtm4j/tool/requirement/get-linked-testcases.js +93 -0
  59. package/dist/qtm4j/tool/requirement/link-testcases.js +107 -0
  60. package/dist/qtm4j/tool/requirement/unlink-testcases.js +97 -0
  61. package/dist/qtm4j/tool/test-automation/get-automation-history.js +2 -1
  62. package/dist/qtm4j/tool/test-automation/upload-automation-result.js +2 -1
  63. package/dist/qtm4j/tool/test-case/create-test-case.js +2 -1
  64. package/dist/qtm4j/tool/test-case/get-linked-requirements.js +67 -0
  65. package/dist/qtm4j/tool/test-case/get-test-cases.js +2 -1
  66. package/dist/qtm4j/tool/test-case/get-test-steps.js +2 -1
  67. package/dist/qtm4j/tool/test-case/link-requirements.js +124 -0
  68. package/dist/qtm4j/tool/test-case/unlink-requirements.js +116 -0
  69. package/dist/qtm4j/tool/test-case/update-test-case.js +2 -1
  70. package/dist/qtm4j/tool/test-cycle/create-test-cycle.js +2 -1
  71. package/dist/qtm4j/tool/test-cycle/get-linked-requirements.js +71 -0
  72. package/dist/qtm4j/tool/test-cycle/link-requirements.js +91 -0
  73. package/dist/qtm4j/tool/test-cycle/link-testcases.js +118 -0
  74. package/dist/qtm4j/tool/test-cycle/search-linked-testcases.js +114 -0
  75. package/dist/qtm4j/tool/test-cycle/search-test-cycle.js +2 -1
  76. package/dist/qtm4j/tool/test-cycle/unlink-requirements.js +87 -0
  77. package/dist/qtm4j/tool/test-cycle/unlink-testcases.js +103 -0
  78. package/dist/qtm4j/tool/test-cycle/update-test-cycle.js +2 -1
  79. package/dist/reflect/tool/recording/add-prompt-step.js +1 -0
  80. package/dist/reflect/tool/recording/add-segment.js +1 -0
  81. package/dist/reflect/tool/recording/connect-to-session.js +1 -0
  82. package/dist/reflect/tool/recording/delete-previous-step.js +1 -0
  83. package/dist/reflect/tool/recording/get-screenshot.js +1 -0
  84. package/dist/reflect/tool/suites/cancel-suite-execution.js +1 -0
  85. package/dist/reflect/tool/suites/execute-suite.js +1 -0
  86. package/dist/reflect/tool/suites/get-suite-execution-status.js +1 -0
  87. package/dist/reflect/tool/suites/list-suite-executions.js +1 -0
  88. package/dist/reflect/tool/suites/list-suites.js +1 -0
  89. package/dist/reflect/tool/tests/get-test-status.js +1 -0
  90. package/dist/reflect/tool/tests/list-segments.js +1 -0
  91. package/dist/reflect/tool/tests/list-tests.js +1 -0
  92. package/dist/reflect/tool/tests/run-test.js +1 -0
  93. package/dist/swagger/client/tools.js +23 -0
  94. package/dist/zephyr/tool/environment/get-environments.js +1 -0
  95. package/dist/zephyr/tool/folder/create-folder.js +1 -0
  96. package/dist/zephyr/tool/issue-link/get-test-cases.js +1 -0
  97. package/dist/zephyr/tool/issue-link/get-test-cycles.js +1 -0
  98. package/dist/zephyr/tool/issue-link/get-test-executions.js +1 -0
  99. package/dist/zephyr/tool/priority/get-priorities.js +1 -0
  100. package/dist/zephyr/tool/project/get-project.js +1 -0
  101. package/dist/zephyr/tool/project/get-projects.js +1 -0
  102. package/dist/zephyr/tool/status/get-statuses.js +1 -0
  103. package/dist/zephyr/tool/test-case/create-issue-link.js +1 -0
  104. package/dist/zephyr/tool/test-case/create-test-case.js +1 -0
  105. package/dist/zephyr/tool/test-case/create-test-script.js +1 -0
  106. package/dist/zephyr/tool/test-case/create-test-steps.js +1 -0
  107. package/dist/zephyr/tool/test-case/create-web-link.js +1 -0
  108. package/dist/zephyr/tool/test-case/get-links.js +1 -0
  109. package/dist/zephyr/tool/test-case/get-test-case.js +1 -0
  110. package/dist/zephyr/tool/test-case/get-test-cases.js +1 -0
  111. package/dist/zephyr/tool/test-case/get-test-script.js +1 -0
  112. package/dist/zephyr/tool/test-case/get-test-steps.js +1 -0
  113. package/dist/zephyr/tool/test-case/update-test-case.js +1 -0
  114. package/dist/zephyr/tool/test-cycle/create-issue-link.js +1 -0
  115. package/dist/zephyr/tool/test-cycle/create-test-cycle.js +1 -0
  116. package/dist/zephyr/tool/test-cycle/create-web-link.js +1 -0
  117. package/dist/zephyr/tool/test-cycle/get-links.js +1 -0
  118. package/dist/zephyr/tool/test-cycle/get-test-cycle.js +1 -0
  119. package/dist/zephyr/tool/test-cycle/get-test-cycles.js +1 -0
  120. package/dist/zephyr/tool/test-cycle/update-test-cycle.js +1 -0
  121. package/dist/zephyr/tool/test-execution/create-issue-link.js +1 -0
  122. package/dist/zephyr/tool/test-execution/create-test-execution.js +1 -0
  123. package/dist/zephyr/tool/test-execution/get-test-execution-links.js +1 -0
  124. package/dist/zephyr/tool/test-execution/get-test-execution.js +1 -0
  125. package/dist/zephyr/tool/test-execution/get-test-executions.js +1 -0
  126. package/dist/zephyr/tool/test-execution/get-test-steps.js +1 -0
  127. package/dist/zephyr/tool/test-execution/update-test-execution.js +1 -0
  128. package/dist/zephyr/tool/test-execution/update-test-steps.js +1 -0
  129. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ import zod__default from "zod";
2
+ import { SearchTestCaseResponse } from "./get-test-case.schema.js";
3
+ const GetLinkedRequirementsBody = zod__default.object({
4
+ key: zod__default.string().describe(
5
+ "Test case key in '{PROJECT_KEY}-TC-{number}' format (e.g., 'SCRUM-TC-145'). Required."
6
+ ),
7
+ versionNo: zod__default.number().int().optional().describe(
8
+ "Test case version number to retrieve linked requirements for. Defaults to the latest version."
9
+ ),
10
+ maxResults: zod__default.number().int().min(1).max(100).optional().describe("Maximum results per page (1-100). Default: 50."),
11
+ startAt: zod__default.number().int().min(0).optional().describe("Zero-indexed offset for pagination. Default: 0."),
12
+ sort: zod__default.string().optional().describe("Sort pattern in 'field:asc|desc' format. Default: 'key:desc'.")
13
+ });
14
+ const LinkedRequirementSchema = zod__default.object({
15
+ id: zod__default.number().int().describe("Jira issue ID."),
16
+ key: zod__default.string().describe("Jira issue key (e.g., 'SCRUM-1')."),
17
+ summary: zod__default.string().optional().describe("Requirement summary."),
18
+ status: zod__default.object({
19
+ id: zod__default.number().optional(),
20
+ name: zod__default.string().optional(),
21
+ iconUrl: zod__default.string().optional(),
22
+ color: zod__default.string().optional()
23
+ }).optional(),
24
+ priority: zod__default.object({
25
+ id: zod__default.number().optional(),
26
+ name: zod__default.string().optional(),
27
+ iconUrl: zod__default.string().optional()
28
+ }).optional(),
29
+ issueType: zod__default.object({
30
+ id: zod__default.number().optional(),
31
+ name: zod__default.string().optional(),
32
+ iconUrl: zod__default.string().optional()
33
+ }).optional(),
34
+ tcVersionNo: zod__default.number().int().optional().describe("Test case version this requirement is linked to.")
35
+ }).passthrough();
36
+ const GetLinkedRequirementsResponse = zod__default.object({
37
+ startAt: zod__default.number().int(),
38
+ maxResults: zod__default.number().int(),
39
+ total: zod__default.number().int().describe("Total linked requirements (across all pages)."),
40
+ data: zod__default.array(LinkedRequirementSchema).describe("Linked requirements on this page.")
41
+ });
42
+ const SprintFilter = zod__default.object({
43
+ boardName: zod__default.string(),
44
+ sprintName: zod__default.string()
45
+ });
46
+ const GetLinkedTestCasesFilter = zod__default.object({
47
+ key: zod__default.string().optional().describe("Test case key (e.g., 'SCRUM-TC-145')."),
48
+ summary: zod__default.string().optional(),
49
+ folderId: zod__default.number().int().optional().describe("Folder ID."),
50
+ description: zod__default.string().optional(),
51
+ assignee: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of assignees."),
52
+ reporter: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of reporters."),
53
+ createdBy: zod__default.array(zod__default.string()).optional(),
54
+ updatedBy: zod__default.array(zod__default.string()).optional(),
55
+ createdOn: zod__default.string().optional().describe("Date range 'dd/MMM/yyyy,dd/MMM/yyyy' for creation date."),
56
+ updatedOn: zod__default.string().optional().describe("Date range 'dd/MMM/yyyy,dd/MMM/yyyy' for last update date."),
57
+ labels: zod__default.array(zod__default.string()).optional().describe("Jira label names."),
58
+ components: zod__default.array(zod__default.string()).optional().describe("Jira component names."),
59
+ testCaseStatus: zod__default.string().optional().describe("Test case archive status: 'active', 'archived', or 'deleted'."),
60
+ latestExecutionResult: zod__default.array(zod__default.string()).optional().describe("Latest execution results (e.g., ['passed', 'failed'])."),
61
+ fixVersions: zod__default.array(zod__default.string()).optional().describe("Fix version names."),
62
+ sprint: zod__default.array(SprintFilter).optional(),
63
+ status: zod__default.array(zod__default.string()).optional().describe("Test case status names."),
64
+ priority: zod__default.array(zod__default.string()).optional().describe("Priority names (e.g., ['High', 'Low'])."),
65
+ estimatedTime: zod__default.string().optional(),
66
+ requirementIds: zod__default.array(zod__default.number().int()).optional().describe("Requirement IDs."),
67
+ searchText: zod__default.string().optional().describe("Free-text search."),
68
+ searchInFields: zod__default.array(zod__default.string()).optional().describe("Fields to search in (e.g., ['summary', 'description'])."),
69
+ filterId: zod__default.number().int().optional().describe("Saved filter ID."),
70
+ isAutomated: zod__default.boolean().optional(),
71
+ aiGenerated: zod__default.boolean().optional()
72
+ });
73
+ const GetLinkedTestCasesForRequirementBody = zod__default.object({
74
+ requirementKey: zod__default.string().describe(
75
+ "Jira requirement key (e.g., 'SCRUM-1'). Resolved to the internal Jira issue ID automatically."
76
+ ),
77
+ filter: GetLinkedTestCasesFilter.optional().describe(
78
+ "Optional filter to narrow down the linked test cases. projectId is auto-filled from the active project context."
79
+ ),
80
+ fields: zod__default.string().optional().describe(
81
+ "Comma-separated field names to include in each result. Allowed: summary, priority, status, estimatedTime, executed, description, assignee, reporter, labels, components, fixVersions, sprint, isAutomated, folder, updated, created, seqNo, flakyScore, passRateScore."
82
+ ),
83
+ maxResults: zod__default.number().int().min(1).max(100).optional().describe("Maximum results per page (1-100). Default: 50."),
84
+ startAt: zod__default.number().int().min(0).optional().describe("Zero-indexed offset for pagination. Default: 0."),
85
+ sort: zod__default.string().optional().describe(
86
+ "Sort in 'field:asc|desc' format. Allowed fields: key, summary, created, updated, estimatedTime, status, priority, latestVersionNo, seqNo, flakyScore, passRateScore."
87
+ )
88
+ });
89
+ export {
90
+ GetLinkedRequirementsBody,
91
+ GetLinkedRequirementsResponse,
92
+ GetLinkedTestCasesFilter,
93
+ GetLinkedTestCasesForRequirementBody,
94
+ SearchTestCaseResponse as GetLinkedTestCasesResponse
95
+ };
@@ -0,0 +1,109 @@
1
+ import zod__default from "zod";
2
+ zod__default.object({
3
+ id: zod__default.string(),
4
+ versionNo: zod__default.number().int()
5
+ });
6
+ const SprintFilter = zod__default.object({
7
+ boardName: zod__default.string(),
8
+ sprintName: zod__default.string()
9
+ });
10
+ const LinkTestCaseFilter = zod__default.object({
11
+ key: zod__default.string().optional().describe("Test case key (e.g., 'SCRUM-TC-145')."),
12
+ summary: zod__default.string().optional().describe("Test case summary to filter by."),
13
+ folderId: zod__default.number().int().optional().describe("Folder ID to filter by."),
14
+ description: zod__default.string().optional().describe("Test case description to filter by."),
15
+ assignee: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of assignees."),
16
+ reporter: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of reporters."),
17
+ createdBy: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of creators."),
18
+ updatedBy: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of last updaters."),
19
+ createdOn: zod__default.string().optional().describe(
20
+ "Creation date range as comma-separated start,end in dd/MMM/yyyy format (e.g., '01/Jan/2024,31/Jan/2024')."
21
+ ),
22
+ updatedOn: zod__default.string().optional().describe(
23
+ "Update date range as comma-separated start,end in dd/MMM/yyyy format."
24
+ ),
25
+ labels: zod__default.array(zod__default.string()).optional().describe("Jira label names."),
26
+ components: zod__default.array(zod__default.string()).optional().describe("Jira component names."),
27
+ latestExecutionResult: zod__default.array(zod__default.string()).optional().describe(
28
+ "Latest execution results to filter by (e.g., ['passed', 'failed'])."
29
+ ),
30
+ fixVersions: zod__default.array(zod__default.string()).optional().describe("Jira fix version names."),
31
+ sprint: zod__default.array(SprintFilter).optional().describe(
32
+ "Sprint filters with boardName and sprintName (e.g., [{boardName:'board1', sprintName:'sprint1'}])."
33
+ ),
34
+ status: zod__default.array(zod__default.string()).optional().describe("Test case status names (e.g., ['To Do', 'In Progress'])."),
35
+ priority: zod__default.array(zod__default.string()).optional().describe("Priority names (e.g., ['High', 'Low'])."),
36
+ estimatedTime: zod__default.string().optional().describe("Estimated time filter in HH:MM:SS format."),
37
+ requirementIds: zod__default.array(zod__default.number().int()).optional().describe("Jira issue IDs of linked requirements."),
38
+ excludeRequirementId: zod__default.number().int().optional().describe("Exclude test cases already linked to this requirement ID."),
39
+ searchText: zod__default.string().optional().describe("Free-text search across test case fields."),
40
+ searchInFields: zod__default.array(zod__default.string()).optional().describe("Fields to search in (e.g., ['summary', 'description'])."),
41
+ filterId: zod__default.number().int().optional().describe("Saved filter ID."),
42
+ isAutomated: zod__default.boolean().optional().describe("Filter automated test cases."),
43
+ withChild: zod__default.boolean().optional().describe("Include test cases in child folders."),
44
+ aiGenerated: zod__default.boolean().optional().describe("Filter AI-generated test cases."),
45
+ excludeUids: zod__default.array(zod__default.string()).optional().describe("Test case UIDs to exclude from the filter result.")
46
+ });
47
+ const UnlinkTestCaseFilter = zod__default.object({
48
+ key: zod__default.string().optional().describe("Test case key."),
49
+ summary: zod__default.string().optional(),
50
+ folderId: zod__default.number().int().optional(),
51
+ description: zod__default.string().optional(),
52
+ assignee: zod__default.array(zod__default.string()).optional(),
53
+ reporter: zod__default.array(zod__default.string()).optional(),
54
+ createdBy: zod__default.array(zod__default.string()).optional(),
55
+ updatedBy: zod__default.array(zod__default.string()).optional(),
56
+ createdOn: zod__default.string().optional(),
57
+ updatedOn: zod__default.string().optional(),
58
+ labels: zod__default.array(zod__default.string()).optional(),
59
+ components: zod__default.array(zod__default.string()).optional(),
60
+ latestExecutionResult: zod__default.array(zod__default.string()).optional(),
61
+ fixVersions: zod__default.array(zod__default.string()).optional(),
62
+ sprint: zod__default.array(SprintFilter).optional(),
63
+ status: zod__default.array(zod__default.string()).optional(),
64
+ priority: zod__default.array(zod__default.string()).optional(),
65
+ estimatedTime: zod__default.string().optional(),
66
+ requirementIds: zod__default.array(zod__default.number().int()).optional(),
67
+ searchText: zod__default.string().optional(),
68
+ searchInFields: zod__default.array(zod__default.string()).optional(),
69
+ filterId: zod__default.number().int().optional(),
70
+ isAutomated: zod__default.boolean().optional(),
71
+ excludeTestCases: zod__default.array(zod__default.object({ id: zod__default.string(), versionNo: zod__default.number().int() })).optional().describe("Test cases to exclude from the filter result.")
72
+ });
73
+ const LinkTestCasesToRequirementBody = zod__default.object({
74
+ requirementKey: zod__default.string().describe(
75
+ "Jira requirement key (e.g., 'SCRUM-1'). Resolved to the internal Jira issue ID automatically."
76
+ ),
77
+ testCaseKeys: zod__default.array(zod__default.string()).optional().describe(
78
+ "Test case keys to link (e.g., ['SCRUM-TC-1', 'SCRUM-TC-2']). Resolved to internal IDs and latest versions automatically. Provide this OR filter — not both."
79
+ ),
80
+ filter: LinkTestCaseFilter.optional().describe(
81
+ "Filter criteria to select test cases to link. Use instead of testCaseKeys when selecting by criteria. projectId is auto-filled from the active project context."
82
+ ),
83
+ sort: zod__default.string().optional().describe(
84
+ "Sort order for filter results in 'field:asc|desc' format (e.g., 'key:asc'). Allowable fields: key, summary, created, updated, estimatedTime, status, priority, latestVersionNo, flakyScore, passRateScore."
85
+ )
86
+ });
87
+ const UnlinkTestCasesFromRequirementBody = zod__default.object({
88
+ requirementKey: zod__default.string().describe(
89
+ "Jira requirement key (e.g., 'SCRUM-1'). Resolved to the internal Jira issue ID automatically."
90
+ ),
91
+ testCaseKeys: zod__default.array(zod__default.string()).optional().describe(
92
+ "Test case keys to unlink (e.g., ['SCRUM-TC-1', 'SCRUM-TC-2']). Resolved to internal IDs and latest versions automatically. Provide this OR filter — not both."
93
+ ),
94
+ filter: UnlinkTestCaseFilter.optional().describe(
95
+ "Filter criteria to select test cases to unlink. Use instead of testCaseKeys when selecting by criteria. projectId is auto-filled from the active project context."
96
+ )
97
+ });
98
+ const RequirementTestCaseLinkResponse = zod__default.object({
99
+ requirementKey: zod__default.string(),
100
+ linked: zod__default.literal(true).optional(),
101
+ unlinked: zod__default.literal(true).optional()
102
+ });
103
+ export {
104
+ LinkTestCaseFilter,
105
+ LinkTestCasesToRequirementBody,
106
+ RequirementTestCaseLinkResponse,
107
+ UnlinkTestCaseFilter,
108
+ UnlinkTestCasesFromRequirementBody
109
+ };
@@ -0,0 +1,260 @@
1
+ import zod__default from "zod";
2
+ const SprintFilter = zod__default.object({
3
+ boardName: zod__default.string(),
4
+ sprintName: zod__default.string()
5
+ });
6
+ const TestCaseVersionSkip = zod__default.object({
7
+ testCaseId: zod__default.string(),
8
+ version: zod__default.number().int()
9
+ });
10
+ const LinkToCycleTestCaseFilter = zod__default.object({
11
+ key: zod__default.string().optional().describe("Test case key (e.g., 'SCRUM-TC-145')."),
12
+ summary: zod__default.string().optional().describe("Test case summary."),
13
+ folderId: zod__default.number().int().optional().describe("Folder ID."),
14
+ description: zod__default.string().optional().describe("Test case description."),
15
+ assignee: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of assignees."),
16
+ reporter: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of reporters."),
17
+ createdBy: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of creators."),
18
+ updatedBy: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of last updaters."),
19
+ createdOn: zod__default.string().optional().describe("Creation date range as 'dd/MMM/yyyy,dd/MMM/yyyy'."),
20
+ updatedOn: zod__default.string().optional().describe("Update date range as 'dd/MMM/yyyy,dd/MMM/yyyy'."),
21
+ labels: zod__default.array(zod__default.string()).optional().describe("Jira label names."),
22
+ components: zod__default.array(zod__default.string()).optional().describe("Jira component names."),
23
+ latestExecutionResult: zod__default.array(zod__default.string()).optional().describe("Latest execution results (e.g., ['passed', 'failed'])."),
24
+ fixVersions: zod__default.array(zod__default.string()).optional().describe("Jira fix version names."),
25
+ sprint: zod__default.array(SprintFilter).optional().describe("Sprint filters with boardName and sprintName."),
26
+ status: zod__default.array(zod__default.string()).optional().describe("Test case status names."),
27
+ priority: zod__default.array(zod__default.string()).optional().describe("Priority names (e.g., ['High', 'Low'])."),
28
+ isAutomated: zod__default.boolean().optional().describe("Filter automated test cases."),
29
+ archived: zod__default.boolean().optional().describe("Filter archived test cases."),
30
+ shareable: zod__default.boolean().optional().describe("Filter shareable test cases."),
31
+ estimatedTime: zod__default.string().optional().describe("Estimated time in HH:MM:SS format."),
32
+ requirementIds: zod__default.array(zod__default.number().int()).optional().describe("Jira issue IDs of linked requirements."),
33
+ requirementJQL: zod__default.string().optional().describe("JQL to filter by linked requirements."),
34
+ excludeRequirementId: zod__default.number().int().optional().describe("Exclude test cases linked to this requirement ID."),
35
+ excludeCycleId: zod__default.string().optional().describe("Exclude test cases already in this test cycle ID."),
36
+ searchText: zod__default.string().optional().describe("Free-text search across test case fields."),
37
+ searchInFields: zod__default.array(zod__default.string()).optional().describe("Fields to search in (e.g., ['summary', 'description'])."),
38
+ filterId: zod__default.number().int().optional().describe("Saved filter ID."),
39
+ issueKeys: zod__default.array(zod__default.string()).optional().describe("Jira issue keys to filter by."),
40
+ withChild: zod__default.boolean().optional().describe("Include test cases in child folders."),
41
+ aiGenerated: zod__default.boolean().optional().describe("Filter AI-generated test cases."),
42
+ skipTestcase: zod__default.array(zod__default.number().int()).optional().describe("Test case IDs to skip."),
43
+ testCaseVersionIds: zod__default.array(zod__default.number().int()).optional().describe("Specific test case version IDs to include."),
44
+ excludeUids: zod__default.array(zod__default.string()).optional().describe("Test case UIDs to exclude."),
45
+ skipTestCaseVersions: zod__default.array(TestCaseVersionSkip).optional().describe("Test case versions to skip (each with testCaseId and version)."),
46
+ excludeTestCases: zod__default.array(TestCaseVersionSkip).optional().describe(
47
+ "Test case versions to exclude (each with testCaseId and version)."
48
+ )
49
+ });
50
+ const UnlinkFromCycleTestCaseFilter = zod__default.object({
51
+ key: zod__default.string().optional().describe("Test case key (e.g., 'SCRUM-TC-145')."),
52
+ summary: zod__default.string().optional(),
53
+ searchText: zod__default.string().optional(),
54
+ description: zod__default.string().optional(),
55
+ assignee: zod__default.array(zod__default.string()).optional(),
56
+ reporter: zod__default.array(zod__default.string()).optional(),
57
+ labels: zod__default.array(zod__default.string()).optional(),
58
+ components: zod__default.array(zod__default.string()).optional(),
59
+ fixVersions: zod__default.array(zod__default.string()).optional(),
60
+ sprint: zod__default.array(SprintFilter).optional(),
61
+ build: zod__default.array(zod__default.string()).optional().describe("Build names."),
62
+ status: zod__default.array(zod__default.string()).optional(),
63
+ priority: zod__default.array(zod__default.string()).optional(),
64
+ executionResult: zod__default.array(zod__default.string()).optional().describe("Execution results (e.g., ['Pass', 'Fail', 'Blocked'])."),
65
+ environment: zod__default.array(zod__default.string()).optional().describe("Environment names."),
66
+ tcWithDefects: zod__default.boolean().optional().describe("Filter test cases with defects."),
67
+ estimatedTime: zod__default.string().optional(),
68
+ actualTime: zod__default.string().optional(),
69
+ testCaseStatus: zod__default.string().optional().describe("Test case approval status."),
70
+ executionAssignee: zod__default.array(zod__default.string()).optional().describe("Jira account IDs of execution assignees."),
71
+ requirementId: zod__default.array(zod__default.number().int()).optional().describe("Requirement IDs linked to test cases."),
72
+ isAutomated: zod__default.boolean().optional(),
73
+ searchInFields: zod__default.array(zod__default.string()).optional().describe("Fields to search in (e.g., ['summary', 'description'])."),
74
+ createdBy: zod__default.array(zod__default.string()).optional(),
75
+ createdOn: zod__default.string().optional(),
76
+ updatedBy: zod__default.array(zod__default.string()).optional(),
77
+ updatedOn: zod__default.string().optional(),
78
+ filterId: zod__default.number().int().optional(),
79
+ folderId: zod__default.number().int().optional(),
80
+ executedBy: zod__default.string().optional().describe("Jira account ID of the user who executed the test case."),
81
+ executionPlannedDate: zod__default.string().optional().describe("Planned execution date."),
82
+ aiGenerated: zod__default.boolean().optional(),
83
+ excludeTestCases: zod__default.array(TestCaseVersionSkip).optional().describe("Test case versions to exclude from results."),
84
+ skipTestCaseVersions: zod__default.array(TestCaseVersionSkip).optional().describe("Test case versions to skip.")
85
+ });
86
+ const LinkTestCasesToCycleBody = zod__default.object({
87
+ cycleKey: zod__default.string().describe(
88
+ "Test Cycle key (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
89
+ ),
90
+ testCaseKeys: zod__default.array(zod__default.string()).optional().describe(
91
+ "Test case keys to link (e.g., ['SCRUM-TC-1', 'SCRUM-TC-2']). Resolved to internal IDs and latest versions automatically. Provide this OR filter — not both."
92
+ ),
93
+ filter: LinkToCycleTestCaseFilter.optional().describe(
94
+ "Filter criteria to select test cases to link. projectId is auto-filled from the active project context."
95
+ ),
96
+ sort: zod__default.string().optional().describe(
97
+ "Sort order in 'field:asc|desc' format (e.g., 'createdOn:desc'). Default is 'createdOn:desc'."
98
+ ),
99
+ assignee: zod__default.string().optional().describe("Jira account ID of the assignee for the linked executions."),
100
+ environmentId: zod__default.number().int().optional().describe("Environment ID from 'Get all environments in a project'."),
101
+ buildId: zod__default.number().int().optional().describe("Build ID from 'Get all builds in a project'."),
102
+ actualTime: zod__default.string().optional().describe("Actual time spent in HH:mm format (e.g., '02:30')."),
103
+ startNewExecution: zod__default.boolean().optional().describe("Start a new execution for linked test cases. Default is false."),
104
+ executionPlannedDate: zod__default.string().optional().describe(
105
+ "Planned execution date in yyyy-MM-dd format (e.g., '2023-12-31')."
106
+ ),
107
+ qiGenerated: zod__default.boolean().optional().describe("Flag indicating AI-generated test cases. Default is false.")
108
+ });
109
+ const UnlinkTestCasesFromCycleBody = zod__default.object({
110
+ cycleKey: zod__default.string().describe(
111
+ "Test Cycle key (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
112
+ ),
113
+ testCaseKeys: zod__default.array(zod__default.string()).optional().describe(
114
+ "Test case keys to unlink (e.g., ['SCRUM-TC-1', 'SCRUM-TC-2']). Resolved to internal IDs and latest versions automatically. Provide this OR filter or unlinkAll — not combined."
115
+ ),
116
+ unlinkAll: zod__default.boolean().optional().describe(
117
+ "If true, all test cases are unlinked from the cycle. Ignores testCaseKeys and filter."
118
+ ),
119
+ filter: UnlinkFromCycleTestCaseFilter.optional().describe(
120
+ "Filter criteria to select test cases to unlink. projectId is auto-filled from the active project context."
121
+ )
122
+ });
123
+ const TestCycleLinkResponse = zod__default.object({
124
+ cycleKey: zod__default.string(),
125
+ linked: zod__default.literal(true).optional(),
126
+ unlinked: zod__default.literal(true).optional()
127
+ });
128
+ const SearchLinkedTestCasesInCycleFilter = zod__default.object({
129
+ key: zod__default.string().optional().describe("Jira issue key (e.g., 'PROJ-123')."),
130
+ summary: zod__default.string().optional().describe("Test case summary text."),
131
+ description: zod__default.string().optional().describe("Test case description text."),
132
+ searchText: zod__default.string().optional().describe("Free-text search within fields."),
133
+ searchInFields: zod__default.array(zod__default.string()).optional().describe("Fields to search in (e.g., ['summary', 'description'])."),
134
+ assignee: zod__default.array(zod__default.string()).optional().describe("Jira user UUIDs of assignees."),
135
+ reporter: zod__default.array(zod__default.string()).optional().describe("Jira user UUIDs of reporters."),
136
+ labels: zod__default.array(zod__default.string()).optional().describe("Label names."),
137
+ components: zod__default.array(zod__default.string()).optional().describe("Component names."),
138
+ fixVersions: zod__default.array(zod__default.string()).optional().describe("Fix version names."),
139
+ status: zod__default.array(zod__default.string()).optional().describe("Test case status names."),
140
+ priority: zod__default.array(zod__default.string()).optional().describe("Priority names (e.g., ['High', 'Low'])."),
141
+ executionResult: zod__default.array(zod__default.string()).optional().describe("Execution result values (e.g., ['Pass', 'Fail', 'Blocked'])."),
142
+ environment: zod__default.array(zod__default.string()).optional().describe("Environment names."),
143
+ tcWithDefects: zod__default.boolean().optional().describe("Filter test cases that have defects linked."),
144
+ isAutomated: zod__default.boolean().optional().describe("Filter automated test cases."),
145
+ folderId: zod__default.number().int().optional().describe("Folder ID to filter by."),
146
+ executionAssignee: zod__default.array(zod__default.string()).optional().describe("Jira user UUIDs of execution assignees."),
147
+ executionPlannedDate: zod__default.string().optional().describe(
148
+ "Planned execution date range in 'dd/mmm/yyyy,dd/mmm/yyyy' format."
149
+ ),
150
+ createdOn: zod__default.string().optional().describe("Creation date range in 'dd/mmm/yyyy,dd/mmm/yyyy' format."),
151
+ updatedOn: zod__default.string().optional().describe("Last-updated date range in 'dd/mmm/yyyy,dd/mmm/yyyy' format."),
152
+ createdBy: zod__default.array(zod__default.string()).optional().describe("Jira user UUIDs of creators."),
153
+ updatedBy: zod__default.array(zod__default.string()).optional().describe("Jira user UUIDs of last updaters."),
154
+ aiGenerated: zod__default.boolean().optional().describe("Filter AI-generated test cases."),
155
+ filterId: zod__default.number().int().optional().describe("Saved filter ID.")
156
+ });
157
+ const SearchLinkedTestCasesInCycleBody = zod__default.object({
158
+ cycleKey: zod__default.string().describe(
159
+ "Test Cycle key in '{PROJECT_KEY}-TR-{id}' format (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
160
+ ),
161
+ fields: zod__default.array(zod__default.string()).optional().describe(
162
+ "Fields to include in each result object. Allowed: id, key, summary, description, executionResult, status, priority, environment, tcWithDefects, estimatedTime, actualTime, createdOn, updatedOn, sprint, seqNo, latestTcExecutionId, customFields, flakyScore, passRateScore. Omit to return all fields."
163
+ ),
164
+ maxResults: zod__default.number().int().min(1).max(100).optional().default(50).describe("Maximum results per page (1-100). Default: 50."),
165
+ sort: zod__default.string().optional().describe(
166
+ "Sort pattern in 'field:asc|desc' format (e.g., 'key:desc'). Allowed sort fields: id, key, summary, description, executionResult, status, priority, environment, tcWithDefects, estimatedTime, actualTime, createdOn, updatedOn, sprint, flakyScore, passRateScore."
167
+ ),
168
+ startAt: zod__default.number().int().min(0).optional().default(0).describe("Zero-indexed offset for pagination. Default: 0."),
169
+ filter: SearchLinkedTestCasesInCycleFilter.optional().describe(
170
+ "Optional filter criteria to narrow down results. projectId is auto-filled from the active project context."
171
+ )
172
+ });
173
+ const TestCycleExecutionSchema = zod__default.object({
174
+ id: zod__default.string().optional().describe("Internal test case execution ID."),
175
+ key: zod__default.string().optional().describe("Test case key (e.g., 'SCRUM-TC-145')."),
176
+ summary: zod__default.string().optional().describe("Test case summary."),
177
+ description: zod__default.string().nullable().optional(),
178
+ executionResult: zod__default.string().nullable().optional().describe("Execution result (e.g., 'Pass', 'Fail', 'Blocked')."),
179
+ status: zod__default.any().optional().describe("Test case status."),
180
+ priority: zod__default.any().optional().describe("Test case priority."),
181
+ environment: zod__default.string().nullable().optional(),
182
+ tcWithDefects: zod__default.boolean().optional(),
183
+ estimatedTime: zod__default.string().nullable().optional(),
184
+ actualTime: zod__default.string().nullable().optional(),
185
+ createdOn: zod__default.string().nullable().optional(),
186
+ updatedOn: zod__default.string().nullable().optional(),
187
+ sprint: zod__default.any().nullable().optional(),
188
+ seqNo: zod__default.number().nullable().optional(),
189
+ latestTcExecutionId: zod__default.string().nullable().optional(),
190
+ customFields: zod__default.any().nullable().optional(),
191
+ flakyScore: zod__default.number().nullable().optional(),
192
+ passRateScore: zod__default.number().nullable().optional()
193
+ }).passthrough();
194
+ const SearchLinkedTestCasesInCycleResponse = zod__default.object({
195
+ total: zod__default.number().int().describe(
196
+ "Total test case executions matching the filter (across all pages)."
197
+ ),
198
+ startAt: zod__default.number().int().describe("Offset of this page."),
199
+ maxResults: zod__default.number().int().describe("Page size used for this response."),
200
+ data: zod__default.array(TestCycleExecutionSchema).describe("Test case execution entries on this page.")
201
+ });
202
+ const GetLinkedRequirementsForCycleBody = zod__default.object({
203
+ cycleKey: zod__default.string().describe(
204
+ "Test cycle key in '{PROJECT_KEY}-TR-{id}' format (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
205
+ ),
206
+ maxResults: zod__default.number().int().min(1).max(100).optional().default(50).describe("Maximum results per page (1-100). Default: 50."),
207
+ startAt: zod__default.number().int().min(0).optional().default(0).describe("Zero-indexed offset for pagination. Default: 0."),
208
+ sort: zod__default.string().optional().describe(
209
+ "Sort pattern in 'field:asc|desc' format. Allowed fields: key, status, priority. Default: 'key:desc'."
210
+ )
211
+ });
212
+ const LinkRequirementsToCycleBody = zod__default.object({
213
+ cycleKey: zod__default.string().describe(
214
+ "Test cycle key in '{PROJECT_KEY}-TR-{id}' format (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
215
+ ),
216
+ requirementKeys: zod__default.array(zod__default.string()).optional().describe(
217
+ "List of Jira requirement keys to link (e.g., ['SCRUM-1', 'SCRUM-2']). Resolved to internal IDs automatically. Provide this OR filter.jql — not both."
218
+ ),
219
+ filter: zod__default.object({
220
+ jql: zod__default.string().describe(
221
+ 'JQL query to filter requirements to link (e.g., "project = DEMO AND issuetype = Story").'
222
+ )
223
+ }).optional().describe(
224
+ "JQL filter to select requirements to link. Use instead of requirementKeys when filtering by JQL."
225
+ )
226
+ });
227
+ const LinkRequirementsToCycleResponse = zod__default.object({
228
+ cycleKey: zod__default.string(),
229
+ linked: zod__default.literal(true)
230
+ });
231
+ const UnlinkRequirementsFromCycleBody = zod__default.object({
232
+ cycleKey: zod__default.string().describe(
233
+ "Test cycle key in '{PROJECT_KEY}-TR-{id}' format (e.g., 'SCRUM-TR-1'). Resolved to the internal cycle UID automatically."
234
+ ),
235
+ requirementKeys: zod__default.array(zod__default.string()).optional().describe(
236
+ "List of Jira requirement keys to unlink (e.g., ['SCRUM-1', 'SCRUM-2']). Resolved to internal IDs automatically. Provide this OR unLinkAll — not both."
237
+ ),
238
+ unLinkAll: zod__default.boolean().optional().describe(
239
+ "If true, all requirements are unlinked from the cycle. Ignores requirementKeys."
240
+ )
241
+ });
242
+ const UnlinkRequirementsFromCycleResponse = zod__default.object({
243
+ cycleKey: zod__default.string(),
244
+ unlinked: zod__default.literal(true)
245
+ });
246
+ export {
247
+ GetLinkedRequirementsForCycleBody,
248
+ LinkRequirementsToCycleBody,
249
+ LinkRequirementsToCycleResponse,
250
+ LinkTestCasesToCycleBody,
251
+ LinkToCycleTestCaseFilter,
252
+ SearchLinkedTestCasesInCycleBody,
253
+ SearchLinkedTestCasesInCycleFilter,
254
+ SearchLinkedTestCasesInCycleResponse,
255
+ TestCycleLinkResponse,
256
+ UnlinkFromCycleTestCaseFilter,
257
+ UnlinkRequirementsFromCycleBody,
258
+ UnlinkRequirementsFromCycleResponse,
259
+ UnlinkTestCasesFromCycleBody
260
+ };
@@ -1,9 +1,10 @@
1
1
  import { Tool } from "../../../common/tools.js";
2
- import { TOOL_NAMES, RESPONSE_FIELDS, PAGINATION, ENDPOINTS } from "../../config/constants.js";
2
+ import { TOOL_NAMES, TOOLSETS, RESPONSE_FIELDS, PAGINATION, ENDPOINTS } from "../../config/constants.js";
3
3
  import { GetProjectsResponse, GetProjectsBody } from "../../schema/project.schema.js";
4
4
  class GetProjects extends Tool {
5
5
  specification = {
6
6
  title: TOOL_NAMES.GET_PROJECTS.TITLE,
7
+ toolset: TOOLSETS.PROJECTS,
7
8
  summary: TOOL_NAMES.GET_PROJECTS.SUMMARY,
8
9
  readOnly: true,
9
10
  idempotent: true,
@@ -1,5 +1,5 @@
1
1
  import { Tool, ToolError } from "../../../common/tools.js";
2
- import { TOOL_NAMES, ENDPOINTS, PAGINATION, RESPONSE_FIELDS } from "../../config/constants.js";
2
+ import { TOOL_NAMES, TOOLSETS, ENDPOINTS, PAGINATION, RESPONSE_FIELDS } from "../../config/constants.js";
3
3
  import { SetProjectContextResponse, SetProjectContextBody, GetProjectsResponse } from "../../schema/project.schema.js";
4
4
  const PROJECT_SEARCH_MAX_RESULTS = 10;
5
5
  const ERRORS = {
@@ -9,6 +9,7 @@ const ERRORS = {
9
9
  class SetProjectContext extends Tool {
10
10
  specification = {
11
11
  title: TOOL_NAMES.SET_PROJECT_CONTEXT.TITLE,
12
+ toolset: TOOLSETS.PROJECTS,
12
13
  summary: TOOL_NAMES.SET_PROJECT_CONTEXT.SUMMARY,
13
14
  readOnly: false,
14
15
  idempotent: true,
@@ -0,0 +1,93 @@
1
+ import { Tool, ToolError } from "../../../common/tools.js";
2
+ import { TOOLSETS, TOOL_NAMES, ENDPOINTS } from "../../config/constants.js";
3
+ import { ResolverKeys } from "../../config/field-resolution.types.js";
4
+ import { GetLinkedTestCasesForRequirementBody } from "../../schema/linked-items.schema.js";
5
+ import { SearchTestCaseResponse } from "../../schema/get-test-case.schema.js";
6
+ class GetLinkedTestCasesForRequirement extends Tool {
7
+ specification = {
8
+ title: TOOL_NAMES.GET_LINKED_TESTCASES_FOR_REQUIREMENT.TITLE,
9
+ summary: TOOL_NAMES.GET_LINKED_TESTCASES_FOR_REQUIREMENT.SUMMARY,
10
+ readOnly: true,
11
+ idempotent: true,
12
+ toolset: TOOLSETS.REQUIREMENTS,
13
+ inputSchema: GetLinkedTestCasesForRequirementBody,
14
+ outputSchema: SearchTestCaseResponse,
15
+ purpose: "Retrieve all test cases linked to a specific Jira requirement in QTM4J. The requirement's human-readable key (e.g. 'SCRUM-1') is resolved to the internal Jira issue ID automatically. Returns a paginated list of linked test cases with their metadata. Use the filter to narrow results by status, priority, labels, folder, and more. PREREQUISITE: set_project_context must be called before this tool.",
16
+ useCases: [
17
+ "Check which test cases cover a Jira story or bug",
18
+ "Audit requirement traceability — find all test cases for a given requirement",
19
+ "Filter linked test cases by status or priority before a release",
20
+ "Retrieve test case keys to use in update or link operations"
21
+ ],
22
+ examples: [
23
+ {
24
+ description: "Get all test cases linked to a requirement",
25
+ parameters: { requirementKey: "SCRUM-1" },
26
+ expectedOutput: "Paginated list of linked test cases"
27
+ },
28
+ {
29
+ description: "Get high priority linked test cases",
30
+ parameters: {
31
+ requirementKey: "SCRUM-5",
32
+ filter: { priority: ["High"] },
33
+ fields: "key,summary,status,priority",
34
+ sort: "key:asc"
35
+ },
36
+ expectedOutput: "Filtered high-priority test cases linked to requirement"
37
+ },
38
+ {
39
+ description: "Paginate through linked test cases",
40
+ parameters: {
41
+ requirementKey: "SCRUM-1",
42
+ maxResults: 20,
43
+ startAt: 20
44
+ },
45
+ expectedOutput: "Second page of linked test cases"
46
+ }
47
+ ],
48
+ hints: [
49
+ "PREREQUISITE: set_project_context must be called before this tool. NEVER auto-select a project.",
50
+ "REQUIREMENT KEY FORMAT: '{PROJECT_KEY}-{number}' — e.g. 'SCRUM-1'.",
51
+ "projectId in filter is auto-filled from the active project context — do not set it manually.",
52
+ "Use the fields param to limit response size — only request fields you need.",
53
+ "Paginate using startAt — increment by maxResults until startAt >= total.",
54
+ "filter.testCaseStatus can be 'active', 'archived', or 'deleted' to filter by archive state."
55
+ ],
56
+ outputDescription: "Paginated response with total, startAt, maxResults, and data array of linked test case objects."
57
+ };
58
+ handle = async (rawArgs) => {
59
+ const args = GetLinkedTestCasesForRequirementBody.parse(rawArgs);
60
+ const fieldResolver = this.client.getResolverRegistry();
61
+ const context = fieldResolver.requireProjectContext();
62
+ const reqMap = await fieldResolver.getResolver(ResolverKeys.SearchableField.REQUIREMENT_KEY_TO_ID).resolveAndReturn(context.projectId, [args.requirementKey]);
63
+ const reqEntry = reqMap[args.requirementKey];
64
+ if (!reqEntry) {
65
+ throw new ToolError(
66
+ `Requirement '${args.requirementKey}' not found in project '${context.projectKey}'. Verify the key is a valid Jira issue key.`
67
+ );
68
+ }
69
+ const requirementId = Number(reqEntry.id);
70
+ const queryParams = {
71
+ fields: args.fields,
72
+ maxResults: args.maxResults,
73
+ startAt: args.startAt,
74
+ sort: args.sort
75
+ };
76
+ const body = {};
77
+ if (args.filter) {
78
+ body.filter = { ...args.filter, projectId: context.projectId };
79
+ }
80
+ const response = await this.client.getApiClient().post(
81
+ ENDPOINTS.GET_LINKED_TESTCASES_FOR_REQUIREMENT(requirementId),
82
+ body,
83
+ queryParams
84
+ );
85
+ return {
86
+ structuredContent: SearchTestCaseResponse.parse(response),
87
+ content: []
88
+ };
89
+ };
90
+ }
91
+ export {
92
+ GetLinkedTestCasesForRequirement
93
+ };