@smartbear/mcp 0.12.1 → 0.13.2

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 (89) hide show
  1. package/README.md +30 -6
  2. package/dist/bugsnag/client/api/CurrentUser.js +50 -26
  3. package/dist/bugsnag/client/api/Error.js +156 -93
  4. package/dist/bugsnag/client/api/Project.js +398 -276
  5. package/dist/bugsnag/client/api/api.js +4087 -3837
  6. package/dist/bugsnag/client/api/base.js +155 -173
  7. package/dist/bugsnag/client/api/configuration.js +28 -25
  8. package/dist/bugsnag/client/filters.js +11 -20
  9. package/dist/bugsnag/client.js +1398 -1281
  10. package/dist/bugsnag/input-schemas.js +39 -57
  11. package/dist/collaborator/client.js +335 -371
  12. package/dist/common/bugsnag.js +5 -3
  13. package/dist/common/cache.js +50 -57
  14. package/dist/common/client-registry.js +106 -119
  15. package/dist/common/info.js +7 -3
  16. package/dist/common/register-clients.js +0 -16
  17. package/dist/common/server.js +270 -228
  18. package/dist/common/tools.js +19 -0
  19. package/dist/common/transport-http.js +252 -343
  20. package/dist/common/transport-stdio.js +40 -37
  21. package/dist/common/zod-utils.js +20 -0
  22. package/dist/index.js +18 -23
  23. package/dist/package.json.js +11 -0
  24. package/dist/pactflow/client/ai.js +142 -169
  25. package/dist/pactflow/client/base.js +41 -51
  26. package/dist/pactflow/client/prompt-utils.js +93 -84
  27. package/dist/pactflow/client/prompts.js +95 -92
  28. package/dist/pactflow/client/tools.js +94 -83
  29. package/dist/pactflow/client/utils.js +60 -64
  30. package/dist/pactflow/client.js +399 -320
  31. package/dist/qmetry/client/api/client-api.js +43 -41
  32. package/dist/qmetry/client/api/error-handler.js +264 -310
  33. package/dist/qmetry/client/auto-resolve.js +78 -99
  34. package/dist/qmetry/client/automation.js +139 -162
  35. package/dist/qmetry/client/handlers.js +49 -46
  36. package/dist/qmetry/client/issues.js +133 -115
  37. package/dist/qmetry/client/project.js +153 -174
  38. package/dist/qmetry/client/requirement.js +82 -70
  39. package/dist/qmetry/client/testcase.js +240 -208
  40. package/dist/qmetry/client/testsuite.js +332 -293
  41. package/dist/qmetry/client/tools/automation-tools.js +291 -288
  42. package/dist/qmetry/client/tools/index.js +16 -13
  43. package/dist/qmetry/client/tools/issue-tools.js +534 -543
  44. package/dist/qmetry/client/tools/project-tools.js +635 -656
  45. package/dist/qmetry/client/tools/requirement-tools.js +525 -528
  46. package/dist/qmetry/client/tools/testcase-tools.js +773 -786
  47. package/dist/qmetry/client/tools/testsuite-tools.js +1069 -1083
  48. package/dist/qmetry/client/utils.js +8 -14
  49. package/dist/qmetry/client.js +111 -109
  50. package/dist/qmetry/config/constants.js +48 -44
  51. package/dist/qmetry/config/rest-endpoints.js +51 -48
  52. package/dist/qmetry/types/automation.js +7 -7
  53. package/dist/qmetry/types/common.js +763 -1049
  54. package/dist/qmetry/types/issues.js +26 -19
  55. package/dist/qmetry/types/project.js +32 -25
  56. package/dist/qmetry/types/requirements.js +26 -21
  57. package/dist/qmetry/types/testcase.js +55 -44
  58. package/dist/qmetry/types/testsuite.js +66 -52
  59. package/dist/reflect/client.js +284 -226
  60. package/dist/swagger/client/api.js +645 -662
  61. package/dist/swagger/client/configuration.js +31 -33
  62. package/dist/swagger/client/portal-types.js +204 -244
  63. package/dist/swagger/client/registry-types.js +62 -96
  64. package/dist/swagger/client/tools.js +148 -158
  65. package/dist/swagger/client/user-management-types.js +11 -22
  66. package/dist/swagger/client.js +143 -135
  67. package/dist/swagger/config-utils.js +10 -16
  68. package/dist/zephyr/client.js +43 -42
  69. package/dist/zephyr/common/api-client.js +35 -30
  70. package/dist/zephyr/common/auth-service.js +16 -13
  71. package/dist/zephyr/common/rest-api-schemas.js +3173 -5146
  72. package/dist/zephyr/tool/environment/get-environments.js +66 -66
  73. package/dist/zephyr/tool/priority/get-priorities.js +41 -41
  74. package/dist/zephyr/tool/project/get-project.js +37 -37
  75. package/dist/zephyr/tool/project/get-projects.js +46 -46
  76. package/dist/zephyr/tool/status/get-statuses.js +47 -47
  77. package/dist/zephyr/tool/test-case/get-test-case.js +37 -37
  78. package/dist/zephyr/tool/test-case/get-test-cases.js +62 -62
  79. package/dist/zephyr/tool/test-cycle/get-test-cycle.js +37 -37
  80. package/dist/zephyr/tool/test-cycle/get-test-cycles.js +70 -70
  81. package/dist/zephyr/tool/test-execution/get-test-execution.js +37 -37
  82. package/dist/zephyr/tool/test-execution/get-test-executions.js +43 -43
  83. package/package.json +5 -5
  84. package/dist/bugsnag/client/api/index.js +0 -6
  85. package/dist/common/types.js +0 -6
  86. package/dist/qmetry/client/tools/types.js +0 -1
  87. package/dist/swagger/client/index.js +0 -6
  88. package/dist/tests/unit/bugsnag/utils/factories.js +0 -86
  89. package/dist/zephyr/tool/zephyr-tool.js +0 -1
package/README.md CHANGED
@@ -75,6 +75,9 @@ Alternatively, you can use `npx` (or globally install) the `@smartbear/mcp` pack
75
75
  "BUGSNAG_PROJECT_API_KEY": "${input:bugsnag_project_api_key}",
76
76
  "REFLECT_API_TOKEN": "${input:reflect_api_token}",
77
77
  "SWAGGER_API_KEY": "${input:swagger_api_key}",
78
+ "SWAGGER_PORTAL_BASE_PATH": "${input:swagger_portal_base_path}",
79
+ "SWAGGER_REGISTRY_BASE_PATH": "${input:swagger_registry_base_path}",
80
+ "SWAGGER_UI_BASE_PATH": "${input:swagger_ui_base_path}",
78
81
  "PACT_BROKER_BASE_URL": "${input:pact_broker_base_url}",
79
82
  "PACT_BROKER_TOKEN": "${input:pact_broker_token}",
80
83
  "PACT_BROKER_USERNAME": "${input:pact_broker_username}",
@@ -83,9 +86,9 @@ Alternatively, you can use `npx` (or globally install) the `@smartbear/mcp` pack
83
86
  "QMETRY_BASE_URL": "${input:qmetry_base_url}",
84
87
  "ZEPHYR_API_TOKEN": "${input:zephyr_api_token}",
85
88
  "ZEPHYR_BASE_URL": "${input:zephyr_base_url}",
86
- "COLLAB_BASE_URL": "${input:collab_base_url}",
87
- "COLLAB_USERNAME": "${input:collab_username}",
88
- "COLLAB_LOGIN_TICKET": "${input:collab_login_ticket}"
89
+ "COLLABORATOR_BASE_URL": "${input:collab_base_url}",
90
+ "COLLABORATOR_USERNAME": "${input:collab_username}",
91
+ "COLLABORATOR_LOGIN_TICKET": "${input:collab_login_ticket}"
89
92
  }
90
93
  }
91
94
  },
@@ -114,6 +117,24 @@ Alternatively, you can use `npx` (or globally install) the `@smartbear/mcp` pack
114
117
  "description": "Swagger API Key - leave blank to disable Swagger tools",
115
118
  "password": true
116
119
  },
120
+ {
121
+ "id": "swagger_portal_base_path",
122
+ "type": "promptString",
123
+ "description": "Swagger Portal API base path - only needed for on-premise installations (leave blank for cloud)",
124
+ "password": false
125
+ },
126
+ {
127
+ "id": "swagger_registry_base_path",
128
+ "type": "promptString",
129
+ "description": "Swagger Registry API base path - only needed for on-premise installations (leave blank for cloud)",
130
+ "password": false
131
+ },
132
+ {
133
+ "id": "swagger_ui_base_path",
134
+ "type": "promptString",
135
+ "description": "Swagger UI base path - only needed for on-premise installations (leave blank for cloud)",
136
+ "password": false
137
+ },
117
138
  {
118
139
  "id": "pact_broker_base_url",
119
140
  "type": "promptString",
@@ -203,6 +224,9 @@ Add the following configuration to your `claude_desktop_config.json` to launch t
203
224
  "BUGSNAG_PROJECT_API_KEY": "your_project_api_key",
204
225
  "REFLECT_API_TOKEN": "your_reflect_token",
205
226
  "SWAGGER_API_KEY": "your_swagger_key",
227
+ "SWAGGER_PORTAL_BASE_PATH": "https://api.portal.swaggerhub.com/v1",
228
+ "SWAGGER_REGISTRY_BASE_PATH": "https://api.swaggerhub.com",
229
+ "SWAGGER_UI_BASE_PATH": "https://app.swaggerhub.com",
206
230
  "PACT_BROKER_BASE_URL": "your_pactflow_or_pactbroker_base_url",
207
231
  "PACT_BROKER_TOKEN": "your_pactflow_token",
208
232
  "PACT_BROKER_USERNAME": "your_pact_broker_username",
@@ -211,9 +235,9 @@ Add the following configuration to your `claude_desktop_config.json` to launch t
211
235
  "QMETRY_BASE_URL": "https://testmanagement.qmetry.com",
212
236
  "ZEPHYR_API_TOKEN": "your_zephyr_api_token",
213
237
  "ZEPHYR_BASE_URL": "https://api.zephyrscale.smartbear.com/v2",
214
- "COLLAB_BASE_URL": "your collab base url",
215
- "COLLAB_USERNAME": "your collab user name",
216
- "COLLAB_LOGIN_TICKET": "your collab login ticket"
238
+ "COLLABORATOR_BASE_URL": "your collab base url",
239
+ "COLLABORATOR_USERNAME": "your collab user name",
240
+ "COLLABORATOR_LOGIN_TICKET": "your collab login ticket"
217
241
  }
218
242
  }
219
243
  }
@@ -1,29 +1,53 @@
1
- import { CurrentUserApiFetchParamCreator, } from "./api.js";
2
1
  import { BaseAPI } from "./base.js";
2
+ import { CurrentUserApiFetchParamCreator } from "./api.js";
3
3
  import { ProjectAPI } from "./Project.js";
4
- export class CurrentUserAPI extends BaseAPI {
5
- static organizationFields = [
6
- "id",
7
- "name",
8
- "slug",
9
- ];
10
- /**
11
- * List the current user's organizations
12
- * GET /user/organizations
13
- */
14
- async listUserOrganizations(admin, perPage, options = {}) {
15
- const localVarFetchArgs = CurrentUserApiFetchParamCreator(this.configuration).listUserOrganizations(admin, perPage, options);
16
- return await this.requestArray(localVarFetchArgs.url, localVarFetchArgs.options, true, CurrentUserAPI.organizationFields);
17
- }
18
- /**
19
- * List projects for a given organization
20
- * GET /organizations/{organization_id}/projects
21
- * @param organizationId The organization ID
22
- * @param options Optional parameters for filtering, pagination, etc.
23
- * @returns A promise that resolves to the list of projects in the organization
24
- */
25
- async getOrganizationProjects(organizationId, q, sort, direction, perPage, options) {
26
- const localVarFetchArgs = CurrentUserApiFetchParamCreator(this.configuration).getOrganizationProjects(organizationId, q, sort, direction, perPage, options);
27
- return await this.requestArray(localVarFetchArgs.url, localVarFetchArgs.options, true, ProjectAPI.projectFields);
28
- }
4
+ class CurrentUserAPI extends BaseAPI {
5
+ static organizationFields = [
6
+ "id",
7
+ "name",
8
+ "slug"
9
+ ];
10
+ /**
11
+ * List the current user's organizations
12
+ * GET /user/organizations
13
+ */
14
+ async listUserOrganizations(admin, perPage, options = {}) {
15
+ const localVarFetchArgs = CurrentUserApiFetchParamCreator(
16
+ this.configuration
17
+ ).listUserOrganizations(admin, perPage, options);
18
+ return await this.requestArray(
19
+ localVarFetchArgs.url,
20
+ localVarFetchArgs.options,
21
+ true,
22
+ CurrentUserAPI.organizationFields
23
+ );
24
+ }
25
+ /**
26
+ * List projects for a given organization
27
+ * GET /organizations/{organization_id}/projects
28
+ * @param organizationId The organization ID
29
+ * @param options Optional parameters for filtering, pagination, etc.
30
+ * @returns A promise that resolves to the list of projects in the organization
31
+ */
32
+ async getOrganizationProjects(organizationId, q, sort, direction, perPage, options) {
33
+ const localVarFetchArgs = CurrentUserApiFetchParamCreator(
34
+ this.configuration
35
+ ).getOrganizationProjects(
36
+ organizationId,
37
+ q,
38
+ sort,
39
+ direction,
40
+ perPage,
41
+ options
42
+ );
43
+ return await this.requestArray(
44
+ localVarFetchArgs.url,
45
+ localVarFetchArgs.options,
46
+ true,
47
+ ProjectAPI.projectFields
48
+ );
49
+ }
29
50
  }
51
+ export {
52
+ CurrentUserAPI
53
+ };
@@ -1,102 +1,165 @@
1
1
  import { toUrlSearchParams } from "../filters.js";
2
- import { ErrorsApiFetchParamCreator, } from "./api.js";
3
2
  import { BaseAPI } from "./base.js";
4
- export class ErrorAPI extends BaseAPI {
5
- static filterFields = ["url", "project_url", "events_url"];
6
- /**
7
- * View an Error on a Project
8
- * GET /projects/{project_id}/errors/{error_id}
9
- */
10
- async viewErrorOnProject(projectId, errorId) {
11
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).viewErrorOnProject(projectId, errorId);
12
- return await this.requestObject(localVarFetchArgs.url, localVarFetchArgs.options);
3
+ import { ErrorsApiFetchParamCreator } from "./api.js";
4
+ class ErrorAPI extends BaseAPI {
5
+ static filterFields = ["url", "project_url", "events_url"];
6
+ /**
7
+ * View an Error on a Project
8
+ * GET /projects/{project_id}/errors/{error_id}
9
+ */
10
+ async viewErrorOnProject(projectId, errorId) {
11
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
12
+ this.configuration
13
+ ).viewErrorOnProject(projectId, errorId);
14
+ return await this.requestObject(
15
+ localVarFetchArgs.url,
16
+ localVarFetchArgs.options
17
+ );
18
+ }
19
+ /**
20
+ * Get the latest Event in a Project, with optional filters
21
+ * GET /projects/{project_id}/events
22
+ */
23
+ async listEventsOnProject(projectId, base, sort, direction, perPage, filters, fullReports, nextUrl) {
24
+ if (nextUrl) {
25
+ direction = void 0;
26
+ sort = void 0;
27
+ base = void 0;
13
28
  }
14
- /**
15
- * Get the latest Event in a Project, with optional filters
16
- * GET /projects/{project_id}/events
17
- */
18
- async listEventsOnProject(projectId, base, sort, direction, perPage, filters, fullReports, nextUrl) {
19
- if (nextUrl) {
20
- // Don't allow override of these params when using nextUrl
21
- direction = undefined;
22
- sort = undefined;
23
- base = undefined;
24
- }
25
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).listEventsOnProject(projectId, base ?? undefined, sort, direction, perPage, undefined, // Filters are encoded separately below
26
- fullReports, undefined);
27
- const url = new URL(nextUrl ?? localVarFetchArgs.url, this.configuration.basePath);
28
- if (perPage) {
29
- // Allow override of per page, even with nextUrl
30
- url.searchParams.set("per_page", perPage.toString());
31
- }
32
- if (!nextUrl && filters) {
33
- // Apply our own encoding of filters
34
- toUrlSearchParams(filters).forEach((value, key) => {
35
- url.searchParams.append(key, value);
36
- });
37
- }
38
- return await this.requestArray(url.toString(), localVarFetchArgs.options, false);
29
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
30
+ this.configuration
31
+ ).listEventsOnProject(
32
+ projectId,
33
+ base ?? void 0,
34
+ sort,
35
+ direction,
36
+ perPage,
37
+ void 0,
38
+ // Filters are encoded separately below
39
+ fullReports,
40
+ void 0
41
+ );
42
+ const url = new URL(
43
+ nextUrl ?? localVarFetchArgs.url,
44
+ this.configuration.basePath
45
+ );
46
+ if (perPage) {
47
+ url.searchParams.set("per_page", perPage.toString());
39
48
  }
40
- /**
41
- * View an Event by ID
42
- * GET /projects/{project_id}/events/{event_id}
43
- */
44
- async viewEventById(projectId, eventId) {
45
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).viewEventById(projectId, eventId);
46
- return await this.requestObject(localVarFetchArgs.url, localVarFetchArgs.options);
49
+ if (!nextUrl && filters) {
50
+ toUrlSearchParams(filters).forEach((value, key) => {
51
+ url.searchParams.append(key, value);
52
+ });
47
53
  }
48
- /**
49
- * List the Errors on a Project
50
- * GET /projects/{project_id}/errors
51
- */
52
- async listProjectErrors(projectId, base, sort, direction, perPage, filters, nextUrl) {
53
- if (nextUrl) {
54
- // Don't allow override of these params when using nextUrl
55
- direction = undefined;
56
- sort = undefined;
57
- base = undefined;
58
- }
59
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).listProjectErrors(projectId, base ?? undefined, sort, direction, undefined, undefined, // Filters are encoded separately below
60
- undefined, undefined);
61
- const url = new URL(nextUrl ?? localVarFetchArgs.url, this.configuration.basePath);
62
- if (perPage) {
63
- // Allow override of per page, even with nextUrl
64
- url.searchParams.set("per_page", perPage.toString());
65
- }
66
- if (!nextUrl && filters) {
67
- // Apply our own encoding of filters
68
- toUrlSearchParams(filters).forEach((value, key) => {
69
- url.searchParams.append(key, value);
70
- });
71
- }
72
- return await this.requestArray(url.toString(), localVarFetchArgs.options, false);
54
+ return await this.requestArray(
55
+ url.toString(),
56
+ localVarFetchArgs.options,
57
+ false
58
+ // Paginate results
59
+ );
60
+ }
61
+ /**
62
+ * View an Event by ID
63
+ * GET /projects/{project_id}/events/{event_id}
64
+ */
65
+ async viewEventById(projectId, eventId) {
66
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
67
+ this.configuration
68
+ ).viewEventById(projectId, eventId);
69
+ return await this.requestObject(
70
+ localVarFetchArgs.url,
71
+ localVarFetchArgs.options
72
+ );
73
+ }
74
+ /**
75
+ * List the Errors on a Project
76
+ * GET /projects/{project_id}/errors
77
+ */
78
+ async listProjectErrors(projectId, base, sort, direction, perPage, filters, nextUrl) {
79
+ if (nextUrl) {
80
+ direction = void 0;
81
+ sort = void 0;
82
+ base = void 0;
73
83
  }
74
- /**
75
- * Update an Error on a Project
76
- * PATCH /projects/{project_id}/errors/{error_id}
77
- */
78
- async updateErrorOnProject(projectId, errorId, body) {
79
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).updateErrorOnProject(body, projectId, errorId);
80
- return await this.requestObject(localVarFetchArgs.url, localVarFetchArgs.options);
84
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
85
+ this.configuration
86
+ ).listProjectErrors(
87
+ projectId,
88
+ base ?? void 0,
89
+ sort,
90
+ direction,
91
+ void 0,
92
+ void 0,
93
+ // Filters are encoded separately below
94
+ void 0,
95
+ void 0
96
+ );
97
+ const url = new URL(
98
+ nextUrl ?? localVarFetchArgs.url,
99
+ this.configuration.basePath
100
+ );
101
+ if (perPage) {
102
+ url.searchParams.set("per_page", perPage.toString());
81
103
  }
82
- /**
83
- * List Pivots on an Error
84
- * GET /projects/{project_id}/errors/{error_id}/pivots
85
- */
86
- async getPivotValuesOnAnError(projectId, errorId, filters, summarySize, pivots, perPage) {
87
- const localVarFetchArgs = ErrorsApiFetchParamCreator(this.configuration).listPivotsOnAnError(projectId, errorId, undefined, // filters are encoded separately below
88
- summarySize, pivots, undefined);
89
- const url = new URL(localVarFetchArgs.url, this.configuration.basePath);
90
- if (perPage) {
91
- // Allow override of per page, even with nextUrl
92
- url.searchParams.set("per_page", perPage.toString());
93
- }
94
- if (filters) {
95
- // Apply our own encoding of filters
96
- toUrlSearchParams(filters).forEach((value, key) => {
97
- url.searchParams.append(key, value);
98
- });
99
- }
100
- return await this.requestArray(url.toString(), localVarFetchArgs.options, false);
104
+ if (!nextUrl && filters) {
105
+ toUrlSearchParams(filters).forEach((value, key) => {
106
+ url.searchParams.append(key, value);
107
+ });
101
108
  }
109
+ return await this.requestArray(
110
+ url.toString(),
111
+ localVarFetchArgs.options,
112
+ false
113
+ // Paginate results
114
+ );
115
+ }
116
+ /**
117
+ * Update an Error on a Project
118
+ * PATCH /projects/{project_id}/errors/{error_id}
119
+ */
120
+ async updateErrorOnProject(projectId, errorId, body) {
121
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
122
+ this.configuration
123
+ ).updateErrorOnProject(body, projectId, errorId);
124
+ return await this.requestObject(
125
+ localVarFetchArgs.url,
126
+ localVarFetchArgs.options
127
+ );
128
+ }
129
+ /**
130
+ * List Pivots on an Error
131
+ * GET /projects/{project_id}/errors/{error_id}/pivots
132
+ */
133
+ async getPivotValuesOnAnError(projectId, errorId, filters, summarySize, pivots, perPage) {
134
+ const localVarFetchArgs = ErrorsApiFetchParamCreator(
135
+ this.configuration
136
+ ).listPivotsOnAnError(
137
+ projectId,
138
+ errorId,
139
+ void 0,
140
+ // filters are encoded separately below
141
+ summarySize,
142
+ pivots,
143
+ void 0
144
+ // perPage handled in url search params below
145
+ );
146
+ const url = new URL(localVarFetchArgs.url, this.configuration.basePath);
147
+ if (perPage) {
148
+ url.searchParams.set("per_page", perPage.toString());
149
+ }
150
+ if (filters) {
151
+ toUrlSearchParams(filters).forEach((value, key) => {
152
+ url.searchParams.append(key, value);
153
+ });
154
+ }
155
+ return await this.requestArray(
156
+ url.toString(),
157
+ localVarFetchArgs.options,
158
+ false
159
+ // Paginate results
160
+ );
161
+ }
102
162
  }
163
+ export {
164
+ ErrorAPI
165
+ };