@smartbear/mcp 0.24.0 → 0.25.0

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 (137) hide show
  1. package/dist/bearq/client.js +12 -13
  2. package/dist/bearq/tool/tasks/chat-with-qa-lead.js +1 -0
  3. package/dist/bearq/tool/tasks/expand-application-model.js +1 -0
  4. package/dist/bearq/tool/tasks/get-task-status.js +1 -0
  5. package/dist/bearq/tool/tasks/get-task.js +1 -0
  6. package/dist/bearq/tool/tasks/refine-all-draft-tests.js +1 -0
  7. package/dist/bearq/tool/tasks/refine-test-cases.js +1 -0
  8. package/dist/bearq/tool/tasks/refine-tests-in-functional-areas.js +1 -0
  9. package/dist/bearq/tool/tasks/run-regression-tests.js +1 -0
  10. package/dist/bearq/tool/tasks/run-test-cases.js +1 -0
  11. package/dist/bearq/tool/tasks/run-tests-in-functional-areas.js +1 -0
  12. package/dist/bearq/tool/tasks/stop-task.js +1 -0
  13. package/dist/bearq/tool/tasks/wait-for-task.js +1 -0
  14. package/dist/bugsnag/client.js +24 -44
  15. package/dist/bugsnag/tool/error/get-error.js +1 -0
  16. package/dist/bugsnag/tool/error/list-project-errors.js +1 -0
  17. package/dist/bugsnag/tool/error/update-error.js +1 -0
  18. package/dist/bugsnag/tool/event/get-event-details-from-dashboard-url.js +1 -0
  19. package/dist/bugsnag/tool/event/get-event.js +1 -0
  20. package/dist/bugsnag/tool/event/list-error-events.js +1 -0
  21. package/dist/bugsnag/tool/performance/get-network-endpoint-groupings.js +1 -0
  22. package/dist/bugsnag/tool/performance/get-span-group.js +1 -0
  23. package/dist/bugsnag/tool/performance/get-trace.js +1 -0
  24. package/dist/bugsnag/tool/performance/list-span-groups.js +1 -0
  25. package/dist/bugsnag/tool/performance/list-spans.js +1 -0
  26. package/dist/bugsnag/tool/performance/list-trace-fields.js +1 -0
  27. package/dist/bugsnag/tool/performance/set-network-endpoint-groupings.js +1 -0
  28. package/dist/bugsnag/tool/project/get-current-project.js +1 -0
  29. package/dist/bugsnag/tool/project/list-project-event-filters.js +1 -0
  30. package/dist/bugsnag/tool/project/list-projects.js +1 -0
  31. package/dist/bugsnag/tool/release/get-build.js +1 -0
  32. package/dist/bugsnag/tool/release/get-release.js +1 -0
  33. package/dist/bugsnag/tool/release/list-releases.js +1 -0
  34. package/dist/collaborator/client.js +24 -19
  35. package/dist/common/client-registry.js +63 -29
  36. package/dist/common/server.js +57 -1
  37. package/dist/common/transport-http.js +90 -69
  38. package/dist/common/transport-stdio.js +29 -24
  39. package/dist/package.json.js +1 -1
  40. package/dist/pactflow/client/tools.js +102 -0
  41. package/dist/pactflow/client.js +30 -43
  42. package/dist/qmetry/client/tools/automation-tools.js +2 -0
  43. package/dist/qmetry/client/tools/issue-tools.js +6 -0
  44. package/dist/qmetry/client/tools/project-tools.js +9 -0
  45. package/dist/qmetry/client/tools/requirement-tools.js +5 -0
  46. package/dist/qmetry/client/tools/testcase-tools.js +7 -0
  47. package/dist/qmetry/client/tools/testsuite-tools.js +11 -0
  48. package/dist/qmetry/client.js +20 -18
  49. package/dist/qtm4j/client.js +42 -32
  50. package/dist/qtm4j/config/constants.js +101 -1
  51. package/dist/qtm4j/config/field-resolution.types.js +3 -1
  52. package/dist/qtm4j/http/api-client.js +20 -2
  53. package/dist/qtm4j/resolver/resolver-registry.js +7 -1
  54. package/dist/qtm4j/resolver/resolvers/requirement-id-resolver.js +28 -0
  55. package/dist/qtm4j/resolver/resolvers/test-cycle-uid-resolver.js +28 -0
  56. package/dist/qtm4j/schema/linked-items.schema.js +95 -0
  57. package/dist/qtm4j/schema/requirements.schema.js +109 -0
  58. package/dist/qtm4j/schema/test-cycle.link.schema.js +260 -0
  59. package/dist/qtm4j/tool/project/get-projects.js +2 -1
  60. package/dist/qtm4j/tool/project/set-project-context.js +2 -1
  61. package/dist/qtm4j/tool/requirement/get-linked-testcases.js +93 -0
  62. package/dist/qtm4j/tool/requirement/link-testcases.js +107 -0
  63. package/dist/qtm4j/tool/requirement/unlink-testcases.js +97 -0
  64. package/dist/qtm4j/tool/test-automation/get-automation-history.js +2 -1
  65. package/dist/qtm4j/tool/test-automation/upload-automation-result.js +2 -1
  66. package/dist/qtm4j/tool/test-case/create-test-case.js +2 -1
  67. package/dist/qtm4j/tool/test-case/get-linked-requirements.js +67 -0
  68. package/dist/qtm4j/tool/test-case/get-test-cases.js +2 -1
  69. package/dist/qtm4j/tool/test-case/get-test-steps.js +2 -1
  70. package/dist/qtm4j/tool/test-case/link-requirements.js +124 -0
  71. package/dist/qtm4j/tool/test-case/unlink-requirements.js +116 -0
  72. package/dist/qtm4j/tool/test-case/update-test-case.js +2 -1
  73. package/dist/qtm4j/tool/test-cycle/create-test-cycle.js +2 -1
  74. package/dist/qtm4j/tool/test-cycle/get-linked-requirements.js +71 -0
  75. package/dist/qtm4j/tool/test-cycle/link-requirements.js +91 -0
  76. package/dist/qtm4j/tool/test-cycle/link-testcases.js +118 -0
  77. package/dist/qtm4j/tool/test-cycle/search-linked-testcases.js +114 -0
  78. package/dist/qtm4j/tool/test-cycle/search-test-cycle.js +2 -1
  79. package/dist/qtm4j/tool/test-cycle/unlink-requirements.js +87 -0
  80. package/dist/qtm4j/tool/test-cycle/unlink-testcases.js +103 -0
  81. package/dist/qtm4j/tool/test-cycle/update-test-cycle.js +2 -1
  82. package/dist/reflect/client.js +15 -24
  83. package/dist/reflect/config/constants.js +0 -2
  84. package/dist/reflect/tool/recording/add-prompt-step.js +1 -0
  85. package/dist/reflect/tool/recording/add-segment.js +1 -0
  86. package/dist/reflect/tool/recording/connect-to-session.js +1 -0
  87. package/dist/reflect/tool/recording/delete-previous-step.js +1 -0
  88. package/dist/reflect/tool/recording/get-screenshot.js +1 -0
  89. package/dist/reflect/tool/suites/cancel-suite-execution.js +1 -0
  90. package/dist/reflect/tool/suites/execute-suite.js +1 -0
  91. package/dist/reflect/tool/suites/get-suite-execution-status.js +1 -0
  92. package/dist/reflect/tool/suites/list-suite-executions.js +1 -0
  93. package/dist/reflect/tool/suites/list-suites.js +1 -0
  94. package/dist/reflect/tool/tests/get-test-status.js +1 -0
  95. package/dist/reflect/tool/tests/list-segments.js +1 -0
  96. package/dist/reflect/tool/tests/list-tests.js +1 -0
  97. package/dist/reflect/tool/tests/run-test.js +1 -0
  98. package/dist/swagger/client/tools.js +23 -0
  99. package/dist/swagger/client.js +25 -28
  100. package/dist/zephyr/client.js +14 -21
  101. package/dist/zephyr/tool/environment/get-environments.js +1 -0
  102. package/dist/zephyr/tool/folder/create-folder.js +1 -0
  103. package/dist/zephyr/tool/issue-link/get-test-cases.js +1 -0
  104. package/dist/zephyr/tool/issue-link/get-test-cycles.js +1 -0
  105. package/dist/zephyr/tool/issue-link/get-test-executions.js +1 -0
  106. package/dist/zephyr/tool/priority/get-priorities.js +1 -0
  107. package/dist/zephyr/tool/project/get-project.js +1 -0
  108. package/dist/zephyr/tool/project/get-projects.js +1 -0
  109. package/dist/zephyr/tool/status/get-statuses.js +1 -0
  110. package/dist/zephyr/tool/test-case/create-issue-link.js +1 -0
  111. package/dist/zephyr/tool/test-case/create-test-case.js +1 -0
  112. package/dist/zephyr/tool/test-case/create-test-script.js +1 -0
  113. package/dist/zephyr/tool/test-case/create-test-steps.js +1 -0
  114. package/dist/zephyr/tool/test-case/create-web-link.js +1 -0
  115. package/dist/zephyr/tool/test-case/get-links.js +1 -0
  116. package/dist/zephyr/tool/test-case/get-test-case.js +1 -0
  117. package/dist/zephyr/tool/test-case/get-test-cases.js +1 -0
  118. package/dist/zephyr/tool/test-case/get-test-script.js +1 -0
  119. package/dist/zephyr/tool/test-case/get-test-steps.js +1 -0
  120. package/dist/zephyr/tool/test-case/update-test-case.js +1 -0
  121. package/dist/zephyr/tool/test-cycle/create-issue-link.js +1 -0
  122. package/dist/zephyr/tool/test-cycle/create-test-cycle.js +1 -0
  123. package/dist/zephyr/tool/test-cycle/create-web-link.js +1 -0
  124. package/dist/zephyr/tool/test-cycle/get-links.js +1 -0
  125. package/dist/zephyr/tool/test-cycle/get-test-cycle.js +1 -0
  126. package/dist/zephyr/tool/test-cycle/get-test-cycles.js +1 -0
  127. package/dist/zephyr/tool/test-cycle/update-test-cycle.js +1 -0
  128. package/dist/zephyr/tool/test-execution/create-issue-link.js +1 -0
  129. package/dist/zephyr/tool/test-execution/create-test-execution.js +1 -0
  130. package/dist/zephyr/tool/test-execution/get-test-execution-links.js +1 -0
  131. package/dist/zephyr/tool/test-execution/get-test-execution.js +1 -0
  132. package/dist/zephyr/tool/test-execution/get-test-executions.js +1 -0
  133. package/dist/zephyr/tool/test-execution/get-test-steps.js +1 -0
  134. package/dist/zephyr/tool/test-execution/update-test-execution.js +1 -0
  135. package/dist/zephyr/tool/test-execution/update-test-steps.js +1 -0
  136. package/package.json +1 -1
  137. package/dist/common/request-context.js +0 -20
@@ -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
+ };
@@ -0,0 +1,107 @@
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 { RequirementTestCaseLinkResponse, LinkTestCasesToRequirementBody } from "../../schema/requirements.schema.js";
5
+ class LinkTestCasesToRequirement extends Tool {
6
+ specification = {
7
+ title: TOOL_NAMES.LINK_TESTCASES_TO_REQUIREMENT.TITLE,
8
+ summary: TOOL_NAMES.LINK_TESTCASES_TO_REQUIREMENT.SUMMARY,
9
+ readOnly: false,
10
+ idempotent: false,
11
+ toolset: TOOLSETS.REQUIREMENTS,
12
+ inputSchema: LinkTestCasesToRequirementBody,
13
+ outputSchema: RequirementTestCaseLinkResponse,
14
+ purpose: "Link test cases to a Jira requirement in QTM4J using the requirement's human-readable key. Test cases can be specified by their keys (e.g. 'SCRUM-TC-1'), which are resolved to internal IDs and latest versions automatically. Alternatively, use a filter object to select test cases by criteria such as status, priority, labels, or folder. The active project ID is injected automatically into the filter. Test cases that cannot be linked are reported in warnings. PREREQUISITE: set_project_context must be called before this tool.",
15
+ useCases: [
16
+ "Link specific test cases to a Jira story or bug by requirement key",
17
+ "Build traceability between Jira requirements and QTM4J test cases",
18
+ "Link all test cases matching a filter to a requirement",
19
+ "Associate test cases with a requirement as part of sprint planning"
20
+ ],
21
+ examples: [
22
+ {
23
+ description: "Link two test cases by key",
24
+ parameters: {
25
+ requirementKey: "SCRUM-1",
26
+ testCaseKeys: ["SCRUM-TC-10", "SCRUM-TC-11"]
27
+ },
28
+ expectedOutput: "Test cases linked to requirement SCRUM-1"
29
+ },
30
+ {
31
+ description: "Link test cases matching a filter",
32
+ parameters: {
33
+ requirementKey: "SCRUM-1",
34
+ filter: { priority: ["High"], status: ["To Do"] }
35
+ },
36
+ expectedOutput: "Filtered test cases linked to requirement"
37
+ },
38
+ {
39
+ description: "Link test cases in a specific folder",
40
+ parameters: {
41
+ requirementKey: "SCRUM-5",
42
+ filter: { folderId: 42, withChild: true },
43
+ sort: "key:asc"
44
+ },
45
+ expectedOutput: "Folder test cases linked to requirement"
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
+ "TEST CASE KEY FORMAT: '{PROJECT_KEY}-TC-{number}' — e.g. 'SCRUM-TC-145'.",
52
+ "Provide either testCaseKeys or filter — not both.",
53
+ "projectId in filter is auto-filled from the active project context — do not set it manually.",
54
+ "filter.excludeRequirementId excludes test cases already linked to that requirement ID.",
55
+ "If a test case key cannot be resolved, it is reported in warnings and other test cases are still linked."
56
+ ],
57
+ outputDescription: "Confirmation with the requirement key and linked: true. Warnings included if any test cases could not be resolved or linked."
58
+ };
59
+ handle = async (rawArgs) => {
60
+ const args = LinkTestCasesToRequirementBody.parse(rawArgs);
61
+ const fieldResolver = this.client.getResolverRegistry();
62
+ const context = fieldResolver.requireProjectContext();
63
+ const warnings = [];
64
+ const reqMap = await fieldResolver.getResolver(ResolverKeys.SearchableField.REQUIREMENT_KEY_TO_ID).resolveAndReturn(context.projectId, [args.requirementKey]);
65
+ const reqEntry = reqMap[args.requirementKey];
66
+ if (!reqEntry) {
67
+ throw new ToolError(
68
+ `Requirement '${args.requirementKey}' not found in project '${context.projectKey}'. Verify the key is a valid Jira issue key.`
69
+ );
70
+ }
71
+ const requirementId = Number(reqEntry.id);
72
+ const body = {};
73
+ if (args.testCaseKeys?.length) {
74
+ const uidMap = await fieldResolver.getResolver(ResolverKeys.SearchableField.TEST_CASE_KEY_TO_UID).resolveAndReturn(context.projectId, args.testCaseKeys);
75
+ const testcases = [];
76
+ for (const tcKey of args.testCaseKeys) {
77
+ const resolved = uidMap[tcKey];
78
+ if (resolved) {
79
+ testcases.push({
80
+ id: resolved.uid,
81
+ versionNo: resolved.latestVersion
82
+ });
83
+ } else {
84
+ warnings.push(
85
+ `Test case '${tcKey}' could not be resolved and was skipped.`
86
+ );
87
+ }
88
+ }
89
+ if (testcases.length > 0) body.testcases = testcases;
90
+ }
91
+ if (args.filter) {
92
+ body.filter = { ...args.filter, projectId: context.projectId };
93
+ }
94
+ if (args.sort) body.sort = args.sort;
95
+ await this.client.getApiClient().post(ENDPOINTS.LINK_TESTCASES_TO_REQUIREMENT(requirementId), body);
96
+ return {
97
+ structuredContent: RequirementTestCaseLinkResponse.parse({
98
+ requirementKey: args.requirementKey,
99
+ linked: true
100
+ }),
101
+ content: warnings.length > 0 ? [{ type: "text", text: `Note: ${warnings.join(" | ")}` }] : []
102
+ };
103
+ };
104
+ }
105
+ export {
106
+ LinkTestCasesToRequirement
107
+ };
@@ -0,0 +1,97 @@
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 { RequirementTestCaseLinkResponse, UnlinkTestCasesFromRequirementBody } from "../../schema/requirements.schema.js";
5
+ class UnlinkTestCasesFromRequirement extends Tool {
6
+ specification = {
7
+ title: TOOL_NAMES.UNLINK_TESTCASES_FROM_REQUIREMENT.TITLE,
8
+ summary: TOOL_NAMES.UNLINK_TESTCASES_FROM_REQUIREMENT.SUMMARY,
9
+ readOnly: false,
10
+ idempotent: false,
11
+ toolset: TOOLSETS.REQUIREMENTS,
12
+ inputSchema: UnlinkTestCasesFromRequirementBody,
13
+ outputSchema: RequirementTestCaseLinkResponse,
14
+ purpose: "Unlink test cases from a Jira requirement in QTM4J using the requirement's human-readable key. Test cases can be specified by their keys (e.g. 'SCRUM-TC-1'), which are resolved to internal IDs and latest versions automatically. Alternatively, use a filter object to select test cases to unlink by criteria. The active project ID is injected automatically into the filter. Test cases that cannot be unlinked are reported in warnings. PREREQUISITE: set_project_context must be called before this tool.",
15
+ useCases: [
16
+ "Remove specific test cases from a Jira requirement",
17
+ "Unlink test cases matching a filter from a requirement",
18
+ "Clean up stale or incorrect test case links on a requirement",
19
+ "Remove traceability links as part of sprint cleanup"
20
+ ],
21
+ examples: [
22
+ {
23
+ description: "Unlink specific test cases by key",
24
+ parameters: {
25
+ requirementKey: "SCRUM-1",
26
+ testCaseKeys: ["SCRUM-TC-10", "SCRUM-TC-11"]
27
+ },
28
+ expectedOutput: "Test cases unlinked from requirement SCRUM-1"
29
+ },
30
+ {
31
+ description: "Unlink test cases matching a filter",
32
+ parameters: {
33
+ requirementKey: "SCRUM-1",
34
+ filter: { status: ["Done"], labels: ["Deprecated"] }
35
+ },
36
+ expectedOutput: "Filtered test cases unlinked from requirement"
37
+ }
38
+ ],
39
+ hints: [
40
+ "PREREQUISITE: set_project_context must be called before this tool. NEVER auto-select a project.",
41
+ "REQUIREMENT KEY FORMAT: '{PROJECT_KEY}-{number}' — e.g. 'SCRUM-1'.",
42
+ "TEST CASE KEY FORMAT: '{PROJECT_KEY}-TC-{number}' — e.g. 'SCRUM-TC-145'.",
43
+ "Provide either testCaseKeys or filter — not both.",
44
+ "projectId in filter is auto-filled from the active project context — do not set it manually.",
45
+ "filter.excludeTestCases can be used to exclude specific test cases when using filter-based unlinking.",
46
+ "If a test case key cannot be resolved, it is reported in warnings and other test cases are still unlinked."
47
+ ],
48
+ outputDescription: "Confirmation with the requirement key and unlinked: true. Warnings included if any test cases could not be resolved or unlinked."
49
+ };
50
+ handle = async (rawArgs) => {
51
+ const args = UnlinkTestCasesFromRequirementBody.parse(rawArgs);
52
+ const fieldResolver = this.client.getResolverRegistry();
53
+ const context = fieldResolver.requireProjectContext();
54
+ const warnings = [];
55
+ const reqMap = await fieldResolver.getResolver(ResolverKeys.SearchableField.REQUIREMENT_KEY_TO_ID).resolveAndReturn(context.projectId, [args.requirementKey]);
56
+ const reqEntry = reqMap[args.requirementKey];
57
+ if (!reqEntry) {
58
+ throw new ToolError(
59
+ `Requirement '${args.requirementKey}' not found in project '${context.projectKey}'. Verify the key is a valid Jira issue key.`
60
+ );
61
+ }
62
+ const requirementId = Number(reqEntry.id);
63
+ const body = {};
64
+ if (args.testCaseKeys?.length) {
65
+ const uidMap = await fieldResolver.getResolver(ResolverKeys.SearchableField.TEST_CASE_KEY_TO_UID).resolveAndReturn(context.projectId, args.testCaseKeys);
66
+ const testcases = [];
67
+ for (const tcKey of args.testCaseKeys) {
68
+ const resolved = uidMap[tcKey];
69
+ if (resolved) {
70
+ testcases.push({
71
+ id: resolved.uid,
72
+ versionNo: resolved.latestVersion
73
+ });
74
+ } else {
75
+ warnings.push(
76
+ `Test case '${tcKey}' could not be resolved and was skipped.`
77
+ );
78
+ }
79
+ }
80
+ if (testcases.length > 0) body.testcases = testcases;
81
+ }
82
+ if (args.filter) {
83
+ body.filter = { ...args.filter, projectId: context.projectId };
84
+ }
85
+ await this.client.getApiClient().delete(ENDPOINTS.UNLINK_TESTCASES_FROM_REQUIREMENT(requirementId), body);
86
+ return {
87
+ structuredContent: RequirementTestCaseLinkResponse.parse({
88
+ requirementKey: args.requirementKey,
89
+ unlinked: true
90
+ }),
91
+ content: warnings.length > 0 ? [{ type: "text", text: `Note: ${warnings.join(" | ")}` }] : []
92
+ };
93
+ };
94
+ }
95
+ export {
96
+ UnlinkTestCasesFromRequirement
97
+ };
@@ -1,9 +1,10 @@
1
1
  import { Tool } from "../../../common/tools.js";
2
- import { TOOL_NAMES, ENDPOINTS } from "../../config/constants.js";
2
+ import { TOOL_NAMES, TOOLSETS, ENDPOINTS } from "../../config/constants.js";
3
3
  import { GetAutomationHistoryResponse, GetAutomationHistoryBody } from "../../schema/automation.schema.js";
4
4
  class GetAutomationHistory extends Tool {
5
5
  specification = {
6
6
  title: TOOL_NAMES.GET_AUTOMATION_HISTORY.TITLE,
7
+ toolset: TOOLSETS.TEST_AUTOMATION,
7
8
  summary: TOOL_NAMES.GET_AUTOMATION_HISTORY.SUMMARY,
8
9
  readOnly: true,
9
10
  idempotent: true,
@@ -1,12 +1,13 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { extname } from "node:path";
3
3
  import { Tool, ToolError } from "../../../common/tools.js";
4
- import { TOOL_NAMES, AUTOMATION_RESULT_DIRS, AUTOMATION_LIMITS, ENDPOINTS } from "../../config/constants.js";
4
+ import { TOOL_NAMES, TOOLSETS, AUTOMATION_RESULT_DIRS, AUTOMATION_LIMITS, ENDPOINTS } from "../../config/constants.js";
5
5
  import { UploadAutomationResultResponse, UploadAutomationResultBody } from "../../schema/automation.schema.js";
6
6
  const SUPPORTED_EXTENSIONS = /* @__PURE__ */ new Set([".xml", ".json", ".zip"]);
7
7
  class UploadAutomationResult extends Tool {
8
8
  specification = {
9
9
  title: TOOL_NAMES.UPLOAD_AUTOMATION_RESULT.TITLE,
10
+ toolset: TOOLSETS.TEST_AUTOMATION,
10
11
  summary: TOOL_NAMES.UPLOAD_AUTOMATION_RESULT.SUMMARY,
11
12
  readOnly: false,
12
13
  idempotent: false,
@@ -1,5 +1,5 @@
1
1
  import { Tool } from "../../../common/tools.js";
2
- import { TOOL_NAMES, ENDPOINTS } from "../../config/constants.js";
2
+ import { TOOL_NAMES, TOOLSETS, ENDPOINTS } from "../../config/constants.js";
3
3
  import { ResolverKeys, InputField } from "../../config/field-resolution.types.js";
4
4
  import { CreateTestCaseResponse, CreateTestCaseBody } from "../../schema/test-case.schema.js";
5
5
  const FIELD_CONFIG = {
@@ -13,6 +13,7 @@ class CreateTestCase extends Tool {
13
13
  // ─── Tool Specification ────────────────────────────────────────────────────
14
14
  specification = {
15
15
  title: TOOL_NAMES.CREATE_TEST_CASE.TITLE,
16
+ toolset: TOOLSETS.TEST_CASES,
16
17
  summary: TOOL_NAMES.CREATE_TEST_CASE.SUMMARY,
17
18
  readOnly: false,
18
19
  idempotent: false,