@qase/mcp-server 1.1.8 → 2.0.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 (284) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +75 -542
  3. package/build/auth/client-context.d.ts +12 -0
  4. package/build/auth/client-context.d.ts.map +1 -0
  5. package/build/auth/client-context.js +12 -0
  6. package/build/auth/client-context.js.map +1 -0
  7. package/build/auth/jwks-verifier.d.ts +15 -0
  8. package/build/auth/jwks-verifier.d.ts.map +1 -0
  9. package/build/auth/jwks-verifier.js +31 -0
  10. package/build/auth/jwks-verifier.js.map +1 -0
  11. package/build/auth/mcp-guard.d.ts +15 -0
  12. package/build/auth/mcp-guard.d.ts.map +1 -0
  13. package/build/auth/mcp-guard.js +44 -0
  14. package/build/auth/mcp-guard.js.map +1 -0
  15. package/build/auth/oauth-config.d.ts +40 -0
  16. package/build/auth/oauth-config.d.ts.map +1 -0
  17. package/build/auth/oauth-config.js +34 -0
  18. package/build/auth/oauth-config.js.map +1 -0
  19. package/build/auth/proxy-provider.d.ts +31 -0
  20. package/build/auth/proxy-provider.d.ts.map +1 -0
  21. package/build/auth/proxy-provider.js +87 -0
  22. package/build/auth/proxy-provider.js.map +1 -0
  23. package/build/auth/token-type.d.ts +7 -0
  24. package/build/auth/token-type.d.ts.map +1 -0
  25. package/build/auth/token-type.js +10 -0
  26. package/build/auth/token-type.js.map +1 -0
  27. package/build/cache/circuit-breaker.d.ts +33 -0
  28. package/build/cache/circuit-breaker.d.ts.map +1 -0
  29. package/build/cache/circuit-breaker.js +68 -0
  30. package/build/cache/circuit-breaker.js.map +1 -0
  31. package/build/cache/index.d.ts +24 -0
  32. package/build/cache/index.d.ts.map +1 -0
  33. package/build/cache/index.js +86 -0
  34. package/build/cache/index.js.map +1 -0
  35. package/build/cache/keys.d.ts +25 -0
  36. package/build/cache/keys.d.ts.map +1 -0
  37. package/build/cache/keys.js +36 -0
  38. package/build/cache/keys.js.map +1 -0
  39. package/build/cache/layered.d.ts +31 -0
  40. package/build/cache/layered.d.ts.map +1 -0
  41. package/build/cache/layered.js +88 -0
  42. package/build/cache/layered.js.map +1 -0
  43. package/build/cache/memory.d.ts +32 -0
  44. package/build/cache/memory.d.ts.map +1 -0
  45. package/build/cache/memory.js +108 -0
  46. package/build/cache/memory.js.map +1 -0
  47. package/build/cache/metrics.d.ts +31 -0
  48. package/build/cache/metrics.d.ts.map +1 -0
  49. package/build/cache/metrics.js +95 -0
  50. package/build/cache/metrics.js.map +1 -0
  51. package/build/cache/prom-format.d.ts +7 -0
  52. package/build/cache/prom-format.d.ts.map +1 -0
  53. package/build/cache/prom-format.js +16 -0
  54. package/build/cache/prom-format.js.map +1 -0
  55. package/build/cache/redis-bus.d.ts +29 -0
  56. package/build/cache/redis-bus.d.ts.map +1 -0
  57. package/build/cache/redis-bus.js +50 -0
  58. package/build/cache/redis-bus.js.map +1 -0
  59. package/build/cache/redis.d.ts +32 -0
  60. package/build/cache/redis.d.ts.map +1 -0
  61. package/build/cache/redis.js +89 -0
  62. package/build/cache/redis.js.map +1 -0
  63. package/build/cache/types.d.ts +38 -0
  64. package/build/cache/types.d.ts.map +1 -0
  65. package/build/cache/types.js +2 -0
  66. package/build/cache/types.js.map +1 -0
  67. package/build/client/index.d.ts +10 -3
  68. package/build/client/index.d.ts.map +1 -1
  69. package/build/client/index.js +75 -50
  70. package/build/client/index.js.map +1 -1
  71. package/build/http/agent.d.ts +16 -0
  72. package/build/http/agent.d.ts.map +1 -0
  73. package/build/http/agent.js +16 -0
  74. package/build/http/agent.js.map +1 -0
  75. package/build/http/dedupe.d.ts +14 -0
  76. package/build/http/dedupe.d.ts.map +1 -0
  77. package/build/http/dedupe.js +69 -0
  78. package/build/http/dedupe.js.map +1 -0
  79. package/build/http/index.d.ts +6 -0
  80. package/build/http/index.d.ts.map +1 -0
  81. package/build/http/index.js +4 -0
  82. package/build/http/index.js.map +1 -0
  83. package/build/http/retry.d.ts +18 -0
  84. package/build/http/retry.d.ts.map +1 -0
  85. package/build/http/retry.js +52 -0
  86. package/build/http/retry.js.map +1 -0
  87. package/build/index.d.ts +1 -18
  88. package/build/index.d.ts.map +1 -1
  89. package/build/index.js +95 -63
  90. package/build/index.js.map +1 -1
  91. package/build/operations-v2/composites/ci-report.d.ts +2 -0
  92. package/build/operations-v2/composites/ci-report.d.ts.map +1 -0
  93. package/build/operations-v2/composites/ci-report.js +99 -0
  94. package/build/operations-v2/composites/ci-report.js.map +1 -0
  95. package/build/operations-v2/composites/regression-run.d.ts +2 -0
  96. package/build/operations-v2/composites/regression-run.d.ts.map +1 -0
  97. package/build/operations-v2/composites/regression-run.js +81 -0
  98. package/build/operations-v2/composites/regression-run.js.map +1 -0
  99. package/build/operations-v2/composites/triage-defect.d.ts +2 -0
  100. package/build/operations-v2/composites/triage-defect.d.ts.map +1 -0
  101. package/build/operations-v2/composites/triage-defect.js +67 -0
  102. package/build/operations-v2/composites/triage-defect.js.map +1 -0
  103. package/build/operations-v2/escape/api.d.ts +2 -0
  104. package/build/operations-v2/escape/api.d.ts.map +1 -0
  105. package/build/operations-v2/escape/api.js +34 -0
  106. package/build/operations-v2/escape/api.js.map +1 -0
  107. package/build/operations-v2/index.d.ts +19 -0
  108. package/build/operations-v2/index.d.ts.map +1 -0
  109. package/build/operations-v2/index.js +25 -0
  110. package/build/operations-v2/index.js.map +1 -0
  111. package/build/operations-v2/meta/discover.d.ts +9 -0
  112. package/build/operations-v2/meta/discover.d.ts.map +1 -0
  113. package/build/operations-v2/meta/discover.js +76 -0
  114. package/build/operations-v2/meta/discover.js.map +1 -0
  115. package/build/{operations/search.d.ts → operations-v2/qql/index.d.ts} +1 -1
  116. package/build/operations-v2/qql/index.d.ts.map +1 -0
  117. package/build/{operations/search.js → operations-v2/qql/index.js} +34 -9
  118. package/build/operations-v2/qql/index.js.map +1 -0
  119. package/build/operations-v2/read/get.d.ts +2 -0
  120. package/build/operations-v2/read/get.d.ts.map +1 -0
  121. package/build/operations-v2/read/get.js +91 -0
  122. package/build/operations-v2/read/get.js.map +1 -0
  123. package/build/operations-v2/read/project-context.d.ts +2 -0
  124. package/build/operations-v2/read/project-context.d.ts.map +1 -0
  125. package/build/operations-v2/read/project-context.js +102 -0
  126. package/build/operations-v2/read/project-context.js.map +1 -0
  127. package/build/operations-v2/write/attachments.d.ts +2 -0
  128. package/build/operations-v2/write/attachments.d.ts.map +1 -0
  129. package/build/operations-v2/write/attachments.js +58 -0
  130. package/build/operations-v2/write/attachments.js.map +1 -0
  131. package/build/operations-v2/write/cases.d.ts +2 -0
  132. package/build/operations-v2/write/cases.d.ts.map +1 -0
  133. package/build/operations-v2/write/cases.js +121 -0
  134. package/build/operations-v2/write/cases.js.map +1 -0
  135. package/build/operations-v2/write/defects.d.ts +2 -0
  136. package/build/operations-v2/write/defects.d.ts.map +1 -0
  137. package/build/operations-v2/write/defects.js +81 -0
  138. package/build/operations-v2/write/defects.js.map +1 -0
  139. package/build/operations-v2/write/environments.d.ts +2 -0
  140. package/build/operations-v2/write/environments.d.ts.map +1 -0
  141. package/build/operations-v2/write/environments.js +56 -0
  142. package/build/operations-v2/write/environments.js.map +1 -0
  143. package/build/operations-v2/write/milestones.d.ts +2 -0
  144. package/build/operations-v2/write/milestones.d.ts.map +1 -0
  145. package/build/operations-v2/write/milestones.js +56 -0
  146. package/build/operations-v2/write/milestones.js.map +1 -0
  147. package/build/operations-v2/write/plans.d.ts +2 -0
  148. package/build/operations-v2/write/plans.d.ts.map +1 -0
  149. package/build/operations-v2/write/plans.js +55 -0
  150. package/build/operations-v2/write/plans.js.map +1 -0
  151. package/build/operations-v2/write/results.d.ts +2 -0
  152. package/build/operations-v2/write/results.d.ts.map +1 -0
  153. package/build/operations-v2/write/results.js +72 -0
  154. package/build/operations-v2/write/results.js.map +1 -0
  155. package/build/operations-v2/write/runs.d.ts +2 -0
  156. package/build/operations-v2/write/runs.d.ts.map +1 -0
  157. package/build/operations-v2/write/runs.js +84 -0
  158. package/build/operations-v2/write/runs.js.map +1 -0
  159. package/build/operations-v2/write/shared-steps.d.ts +2 -0
  160. package/build/operations-v2/write/shared-steps.d.ts.map +1 -0
  161. package/build/operations-v2/write/shared-steps.js +60 -0
  162. package/build/operations-v2/write/shared-steps.js.map +1 -0
  163. package/build/operations-v2/write/suites.d.ts +2 -0
  164. package/build/operations-v2/write/suites.d.ts.map +1 -0
  165. package/build/operations-v2/write/suites.js +63 -0
  166. package/build/operations-v2/write/suites.js.map +1 -0
  167. package/build/prompts/index.d.ts +31 -0
  168. package/build/prompts/index.d.ts.map +1 -0
  169. package/build/prompts/index.js +229 -0
  170. package/build/prompts/index.js.map +1 -0
  171. package/build/transports/sse.d.ts.map +1 -1
  172. package/build/transports/sse.js +6 -0
  173. package/build/transports/sse.js.map +1 -1
  174. package/build/transports/streamableHttp.d.ts +6 -1
  175. package/build/transports/streamableHttp.d.ts.map +1 -1
  176. package/build/transports/streamableHttp.js +128 -16
  177. package/build/transports/streamableHttp.js.map +1 -1
  178. package/build/utils/auth-context.d.ts +8 -0
  179. package/build/utils/auth-context.d.ts.map +1 -1
  180. package/build/utils/auth-context.js +18 -0
  181. package/build/utils/auth-context.js.map +1 -1
  182. package/build/utils/case-enums.d.ts +5 -3
  183. package/build/utils/case-enums.d.ts.map +1 -1
  184. package/build/utils/case-enums.js +77 -59
  185. package/build/utils/case-enums.js.map +1 -1
  186. package/build/utils/output-schemas.d.ts +16 -0
  187. package/build/utils/output-schemas.d.ts.map +1 -0
  188. package/build/utils/output-schemas.js +82 -0
  189. package/build/utils/output-schemas.js.map +1 -0
  190. package/build/utils/registry.d.ts +42 -9
  191. package/build/utils/registry.d.ts.map +1 -1
  192. package/build/utils/registry.js +64 -11
  193. package/build/utils/registry.js.map +1 -1
  194. package/build/utils/response-shape.d.ts +23 -0
  195. package/build/utils/response-shape.d.ts.map +1 -0
  196. package/build/utils/response-shape.js +73 -0
  197. package/build/utils/response-shape.js.map +1 -0
  198. package/build/utils/rich-response.d.ts +58 -0
  199. package/build/utils/rich-response.d.ts.map +1 -0
  200. package/build/utils/rich-response.js +93 -0
  201. package/build/utils/rich-response.js.map +1 -0
  202. package/build/utils/server-context.d.ts +65 -0
  203. package/build/utils/server-context.d.ts.map +1 -0
  204. package/build/utils/server-context.js +67 -0
  205. package/build/utils/server-context.js.map +1 -0
  206. package/build/version.d.ts +1 -1
  207. package/build/version.js +1 -1
  208. package/docs/connect.md +81 -0
  209. package/docs/migration.md +351 -0
  210. package/docs/self-run.md +270 -0
  211. package/docs/tools.md +109 -0
  212. package/docs/troubleshooting.md +144 -0
  213. package/package.json +11 -2
  214. package/server.json +8 -2
  215. package/build/operations/attachments.d.ts +0 -8
  216. package/build/operations/attachments.d.ts.map +0 -1
  217. package/build/operations/attachments.js +0 -146
  218. package/build/operations/attachments.js.map +0 -1
  219. package/build/operations/authors.d.ts +0 -8
  220. package/build/operations/authors.d.ts.map +0 -1
  221. package/build/operations/authors.js +0 -70
  222. package/build/operations/authors.js.map +0 -1
  223. package/build/operations/cases.d.ts +0 -8
  224. package/build/operations/cases.d.ts.map +0 -1
  225. package/build/operations/cases.js +0 -370
  226. package/build/operations/cases.js.map +0 -1
  227. package/build/operations/configurations.d.ts +0 -10
  228. package/build/operations/configurations.d.ts.map +0 -1
  229. package/build/operations/configurations.js +0 -125
  230. package/build/operations/configurations.js.map +0 -1
  231. package/build/operations/custom-fields.d.ts +0 -8
  232. package/build/operations/custom-fields.d.ts.map +0 -1
  233. package/build/operations/custom-fields.js +0 -172
  234. package/build/operations/custom-fields.js.map +0 -1
  235. package/build/operations/defects.d.ts +0 -8
  236. package/build/operations/defects.d.ts.map +0 -1
  237. package/build/operations/defects.js +0 -256
  238. package/build/operations/defects.js.map +0 -1
  239. package/build/operations/environments.d.ts +0 -8
  240. package/build/operations/environments.d.ts.map +0 -1
  241. package/build/operations/environments.js +0 -154
  242. package/build/operations/environments.js.map +0 -1
  243. package/build/operations/milestones.d.ts +0 -8
  244. package/build/operations/milestones.d.ts.map +0 -1
  245. package/build/operations/milestones.js +0 -155
  246. package/build/operations/milestones.js.map +0 -1
  247. package/build/operations/plans.d.ts +0 -8
  248. package/build/operations/plans.d.ts.map +0 -1
  249. package/build/operations/plans.js +0 -158
  250. package/build/operations/plans.js.map +0 -1
  251. package/build/operations/projects.d.ts +0 -8
  252. package/build/operations/projects.d.ts.map +0 -1
  253. package/build/operations/projects.js +0 -192
  254. package/build/operations/projects.js.map +0 -1
  255. package/build/operations/results.d.ts +0 -8
  256. package/build/operations/results.d.ts.map +0 -1
  257. package/build/operations/results.js +0 -214
  258. package/build/operations/results.js.map +0 -1
  259. package/build/operations/runs.d.ts +0 -8
  260. package/build/operations/runs.d.ts.map +0 -1
  261. package/build/operations/runs.js +0 -224
  262. package/build/operations/runs.js.map +0 -1
  263. package/build/operations/search.d.ts.map +0 -1
  264. package/build/operations/search.js.map +0 -1
  265. package/build/operations/shared-parameters.d.ts +0 -10
  266. package/build/operations/shared-parameters.d.ts.map +0 -1
  267. package/build/operations/shared-parameters.js +0 -93
  268. package/build/operations/shared-parameters.js.map +0 -1
  269. package/build/operations/shared-steps.d.ts +0 -8
  270. package/build/operations/shared-steps.d.ts.map +0 -1
  271. package/build/operations/shared-steps.js +0 -160
  272. package/build/operations/shared-steps.js.map +0 -1
  273. package/build/operations/suites.d.ts +0 -8
  274. package/build/operations/suites.d.ts.map +0 -1
  275. package/build/operations/suites.js +0 -169
  276. package/build/operations/suites.js.map +0 -1
  277. package/build/operations/system-fields.d.ts +0 -10
  278. package/build/operations/system-fields.d.ts.map +0 -1
  279. package/build/operations/system-fields.js +0 -47
  280. package/build/operations/system-fields.js.map +0 -1
  281. package/build/operations/users.d.ts +0 -10
  282. package/build/operations/users.d.ts.map +0 -1
  283. package/build/operations/users.js +0 -78
  284. package/build/operations/users.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/escape/api.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ import { getApiClient } from '../../client/index.js';
3
+ import { toolRegistry } from '../../utils/registry.js';
4
+ const Schema = z.object({
5
+ method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).default('GET').describe('HTTP method'),
6
+ path: z.string().min(1).describe('API path starting with /v1/ (e.g., "/v1/project/DEMO/run")'),
7
+ body: z.record(z.any()).optional().describe('Request body for POST/PUT/PATCH'),
8
+ query: z.record(z.string()).optional().describe('Query parameters'),
9
+ });
10
+ async function handler(args) {
11
+ const client = getApiClient();
12
+ const { method, path, body, query } = args;
13
+ return client.request(path, {
14
+ method,
15
+ data: body,
16
+ params: query,
17
+ });
18
+ }
19
+ toolRegistry.register({
20
+ name: 'qase_api',
21
+ description: 'Direct Qase REST API call for endpoints not covered by other tools. ' +
22
+ 'Pass the HTTP method, path (starting with /v1/), and optional body/query. ' +
23
+ 'See https://developers.qase.io for API reference. Use this as an escape hatch ' +
24
+ 'when the dedicated tools do not cover your use case.',
25
+ schema: Schema,
26
+ handler,
27
+ annotations: {
28
+ readOnlyHint: false,
29
+ destructiveHint: false,
30
+ idempotentHint: false,
31
+ openWorldHint: true,
32
+ },
33
+ });
34
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/operations-v2/escape/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;IAChG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IAC9F,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACpE,CAAC,CAAC;AAEH,KAAK,UAAU,OAAO,CAAC,IAA4B;IACjD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1B,MAAM;QACN,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC;AAED,YAAY,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,sEAAsE;QACtE,4EAA4E;QAC5E,gFAAgF;QAChF,sDAAsD;IACxD,MAAM,EAAE,MAAM;IACd,OAAO;IACP,WAAW,EAAE;QACX,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;KACpB;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import './read/project-context.js';
2
+ import './read/get.js';
3
+ import './qql/index.js';
4
+ import './write/cases.js';
5
+ import './write/runs.js';
6
+ import './write/results.js';
7
+ import './write/defects.js';
8
+ import './write/suites.js';
9
+ import './write/milestones.js';
10
+ import './write/plans.js';
11
+ import './write/shared-steps.js';
12
+ import './write/environments.js';
13
+ import './write/attachments.js';
14
+ import './composites/ci-report.js';
15
+ import './composites/triage-defect.js';
16
+ import './composites/regression-run.js';
17
+ import './meta/discover.js';
18
+ import './escape/api.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations-v2/index.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,CAAC;AACnC,OAAO,eAAe,CAAC;AAGvB,OAAO,gBAAgB,CAAC;AAGxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AACjC,OAAO,yBAAyB,CAAC;AACjC,OAAO,wBAAwB,CAAC;AAGhC,OAAO,2BAA2B,CAAC;AACnC,OAAO,+BAA+B,CAAC;AACvC,OAAO,gCAAgC,CAAC;AAGxC,OAAO,oBAAoB,CAAC;AAG5B,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ // Read tools
2
+ import './read/project-context.js';
3
+ import './read/get.js';
4
+ // QQL tools
5
+ import './qql/index.js';
6
+ // Write tools
7
+ import './write/cases.js';
8
+ import './write/runs.js';
9
+ import './write/results.js';
10
+ import './write/defects.js';
11
+ import './write/suites.js';
12
+ import './write/milestones.js';
13
+ import './write/plans.js';
14
+ import './write/shared-steps.js';
15
+ import './write/environments.js';
16
+ import './write/attachments.js';
17
+ // Composites
18
+ import './composites/ci-report.js';
19
+ import './composites/triage-defect.js';
20
+ import './composites/regression-run.js';
21
+ // Meta tools
22
+ import './meta/discover.js';
23
+ // Escape hatch
24
+ import './escape/api.js';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operations-v2/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,2BAA2B,CAAC;AACnC,OAAO,eAAe,CAAC;AAEvB,YAAY;AACZ,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,kBAAkB,CAAC;AAC1B,OAAO,iBAAiB,CAAC;AACzB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,yBAAyB,CAAC;AACjC,OAAO,yBAAyB,CAAC;AACjC,OAAO,wBAAwB,CAAC;AAEhC,aAAa;AACb,OAAO,2BAA2B,CAAC;AACnC,OAAO,+BAA+B,CAAC;AACvC,OAAO,gCAAgC,CAAC;AAExC,aAAa;AACb,OAAO,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool Discovery Meta-Tool
3
+ *
4
+ * Searches and activates additional Qase tools on demand.
5
+ * By default, only core tools are visible to reduce context token usage.
6
+ * This tool lets the agent discover and activate tools for specific needs.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/meta/discover.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Tool Discovery Meta-Tool
3
+ *
4
+ * Searches and activates additional Qase tools on demand.
5
+ * By default, only core tools are visible to reduce context token usage.
6
+ * This tool lets the agent discover and activate tools for specific needs.
7
+ */
8
+ import { z } from 'zod';
9
+ import { toolRegistry, ReadAnnotation } from '../../utils/registry.js';
10
+ import { DiscoverToolsOutput } from '../../utils/output-schemas.js';
11
+ const Schema = z.object({
12
+ query: z
13
+ .string()
14
+ .optional()
15
+ .describe('Search query to find tools by name or description. ' +
16
+ 'Examples: "delete", "milestone", "attachment", "suite"'),
17
+ category: z
18
+ .enum(['read', 'write', 'delete', 'composite', 'all'])
19
+ .optional()
20
+ .describe('Filter by tool category'),
21
+ activate: z
22
+ .boolean()
23
+ .optional()
24
+ .default(true)
25
+ .describe('If true (default), found tools are activated and become available for use'),
26
+ });
27
+ async function handler(args) {
28
+ const { query, category, activate } = args;
29
+ let matches = query ? toolRegistry.searchTools(query) : toolRegistry.getAllTools();
30
+ // Filter by category based on tool annotations
31
+ if (category && category !== 'all') {
32
+ matches = matches.filter((t) => {
33
+ const ann = t.annotations;
34
+ switch (category) {
35
+ case 'delete':
36
+ return ann?.destructiveHint === true;
37
+ case 'read':
38
+ return ann?.readOnlyHint === true;
39
+ case 'write':
40
+ return !ann?.readOnlyHint && !ann?.destructiveHint;
41
+ case 'composite':
42
+ return (t.name.startsWith('qase_ci_') ||
43
+ t.name.startsWith('qase_triage_') ||
44
+ t.name.startsWith('qase_regression_'));
45
+ default:
46
+ return true;
47
+ }
48
+ });
49
+ }
50
+ // Activate matched tools if requested
51
+ const activated = [];
52
+ if (activate) {
53
+ const names = matches.map((t) => t.name);
54
+ activated.push(...toolRegistry.activateTools(names));
55
+ }
56
+ return {
57
+ found: matches.length,
58
+ activated: activated.length,
59
+ tools: matches.map((t) => ({
60
+ name: t.name,
61
+ description: t.description,
62
+ destructive: t.annotations?.destructiveHint ?? false,
63
+ })),
64
+ };
65
+ }
66
+ toolRegistry.register({
67
+ name: 'qase_discover_tools',
68
+ description: 'Search for and activate additional Qase tools. By default, only core tools are visible. ' +
69
+ 'Use this to find tools for specific needs: deletions, milestone management, attachments, etc. ' +
70
+ 'Found tools are automatically activated and become available for use.',
71
+ schema: Schema,
72
+ handler,
73
+ annotations: ReadAnnotation,
74
+ outputSchema: DiscoverToolsOutput,
75
+ });
76
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/operations-v2/meta/discover.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,4 @@
5
5
  * QQL enables powerful cross-project querying with complex filters.
6
6
  */
7
7
  export {};
8
- //# sourceMappingURL=search.d.ts.map
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/qql/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -5,10 +5,12 @@
5
5
  * QQL enables powerful cross-project querying with complex filters.
6
6
  */
7
7
  import { z } from 'zod';
8
- import { getApiClient } from '../client/index.js';
9
- import { toolRegistry, ReadAnnotation } from '../utils/registry.js';
10
- import { toResultAsync, createToolError } from '../utils/errors.js';
11
- import { QqlExamples } from '../utils/qql-helpers.js';
8
+ import { getApiClient } from '../../client/index.js';
9
+ import { toolRegistry, ReadAnnotation } from '../../utils/registry.js';
10
+ import { toResultAsync, createToolError } from '../../utils/errors.js';
11
+ import { QqlExamples } from '../../utils/qql-helpers.js';
12
+ import { QqlSearchOutput } from '../../utils/output-schemas.js';
13
+ import { richResult, summaryBlock, dataBlock, markdownTable } from '../../utils/rich-response.js';
12
14
  // ============================================================================
13
15
  // SCHEMAS
14
16
  // ============================================================================
@@ -61,10 +63,32 @@ async function qqlSearch(args) {
61
63
  const result = await toResultAsync(client.search.search(query, limit || 10, offset || 0));
62
64
  return result.match((response) => {
63
65
  const r = response.data.result;
64
- return {
65
- total: r?.total,
66
- entities: r?.entities,
67
- };
66
+ const total = r?.total ?? 0;
67
+ const entities = r?.entities ?? [];
68
+ const lines = [`Found **${total}** results (showing ${entities.length})`];
69
+ if (entities.length > 0) {
70
+ // Check if entities have status_text or status for table view
71
+ const hasStatus = entities.some((e) => e.status_text || e.status !== undefined);
72
+ if (hasStatus) {
73
+ const headers = ['ID', 'Title', 'Status'];
74
+ const rows = entities.map((e) => [
75
+ String(e.id ?? '?'),
76
+ (e.title || e.case?.title || e.actual_result || '-').substring(0, 60),
77
+ String(e.status_text || e.status || '-'),
78
+ ]);
79
+ lines.push('', markdownTable(headers, rows));
80
+ }
81
+ else {
82
+ lines.push('');
83
+ for (const e of entities) {
84
+ const id = e.id ?? '?';
85
+ const title = e.title || e.case?.title || e.actual_result || `#${id}`;
86
+ lines.push(`- **#${id}** ${title}`);
87
+ }
88
+ }
89
+ }
90
+ const structured = { total, entities };
91
+ return richResult([summaryBlock(lines.join('\n')), dataBlock(structured)], structured);
68
92
  }, (error) => {
69
93
  throw createToolError(error, 'search operation');
70
94
  });
@@ -126,6 +150,7 @@ toolRegistry.register({
126
150
  schema: QqlSearchSchema,
127
151
  handler: qqlSearch,
128
152
  annotations: ReadAnnotation,
153
+ outputSchema: QqlSearchOutput,
129
154
  });
130
155
  toolRegistry.register({
131
156
  name: 'qql_help',
@@ -134,4 +159,4 @@ toolRegistry.register({
134
159
  handler: getQqlHelp,
135
160
  annotations: ReadAnnotation,
136
161
  });
137
- //# sourceMappingURL=search.js.map
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/operations-v2/qql/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/read/get.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ import { getApiClient } from '../../client/index.js';
3
+ import { toolRegistry, ReadAnnotation } from '../../utils/registry.js';
4
+ import { toResultAsync, createToolError } from '../../utils/errors.js';
5
+ import { ProjectCodeSchema, IdSchema, HashSchema } from '../../utils/validation.js';
6
+ import { projectFields } from '../../utils/response-shape.js';
7
+ const ENTITIES_REQUIRING_CODE = new Set([
8
+ 'case',
9
+ 'suite',
10
+ 'run',
11
+ 'result',
12
+ 'plan',
13
+ 'defect',
14
+ 'milestone',
15
+ 'environment',
16
+ 'shared_step',
17
+ 'shared_parameter',
18
+ 'configuration',
19
+ ]);
20
+ const Schema = z.object({
21
+ entity: z
22
+ .enum([
23
+ 'case',
24
+ 'suite',
25
+ 'run',
26
+ 'result',
27
+ 'plan',
28
+ 'defect',
29
+ 'milestone',
30
+ 'environment',
31
+ 'shared_step',
32
+ 'shared_parameter',
33
+ 'configuration',
34
+ 'attachment',
35
+ 'author',
36
+ 'user',
37
+ 'custom_field',
38
+ ])
39
+ .describe('Entity type to fetch'),
40
+ code: ProjectCodeSchema.optional().describe('Project code (required for most entities)'),
41
+ id: z.union([IdSchema, HashSchema]).describe('Entity ID (number) or hash (string)'),
42
+ fields: z
43
+ .array(z.string())
44
+ .optional()
45
+ .describe('Optional field projection — only return these top-level fields. Pass ["*"] for all fields.'),
46
+ });
47
+ const FETCHERS = {
48
+ case: (c, code, id) => c.cases.getCase(code, id),
49
+ suite: (c, code, id) => c.suites.getSuite(code, id),
50
+ run: (c, code, id) => c.runs.getRun(code, id),
51
+ result: (c, code, id) => c.results.getResult(code, id),
52
+ plan: (c, code, id) => c.plans.getPlan(code, id),
53
+ defect: (c, code, id) => c.defects.getDefect(code, id),
54
+ milestone: (c, code, id) => c.milestones.getMilestone(code, id),
55
+ environment: (c, code, id) => c.environment.getEnvironment(code, id),
56
+ shared_step: (c, code, id) => c.sharedSteps.getSharedStep(code, id),
57
+ shared_parameter: (c, _code, id) => c.sharedParameters.getSharedParameter(String(id)),
58
+ configuration: (c, code, _id) => c.configurations.getConfigurations(code),
59
+ attachment: (c, _code, id) => c.attachments.getAttachment(id),
60
+ author: (c, _code, id) => c.authors.getAuthor(id),
61
+ user: (c, _code, id) => c.users.getUser(id),
62
+ custom_field: (c, _code, id) => c.customFields.getCustomField(id),
63
+ };
64
+ async function handler(args) {
65
+ const { entity, code, id, fields: fieldList } = args;
66
+ if (ENTITIES_REQUIRING_CODE.has(entity) && !code) {
67
+ throw createToolError(`Project code is required for entity type "${entity}"`, 'get operation');
68
+ }
69
+ const client = getApiClient();
70
+ const fetcher = FETCHERS[entity];
71
+ if (!fetcher)
72
+ throw createToolError(`Unknown entity type: ${entity}`, 'get operation');
73
+ const result = await toResultAsync(fetcher(client, code || '', id));
74
+ return result.match((response) => {
75
+ const data = response.data.result;
76
+ return fieldList ? projectFields(data, fieldList) : data;
77
+ }, (error) => {
78
+ throw createToolError(error, 'get operation');
79
+ });
80
+ }
81
+ toolRegistry.register({
82
+ name: 'qase_get',
83
+ description: 'Get any Qase entity by type and ID. Supports field projection via the `fields` parameter. ' +
84
+ 'For project-scoped entities (case, suite, run, result, plan, defect, milestone, environment, ' +
85
+ 'shared_step, shared_parameter, configuration), `code` is required. ' +
86
+ 'For global entities (user, author, attachment, custom_field), `code` can be omitted.',
87
+ schema: Schema,
88
+ handler,
89
+ annotations: ReadAnnotation,
90
+ });
91
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/operations-v2/read/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/read/project-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ import { getApiClient } from '../../client/index.js';
3
+ import { toolRegistry, ReadAnnotation } from '../../utils/registry.js';
4
+ import { toResultAsync } from '../../utils/errors.js';
5
+ import { ProjectCodeSchema } from '../../utils/validation.js';
6
+ import { richResult, summaryBlock, dataBlock } from '../../utils/rich-response.js';
7
+ import { ProjectContextOutput } from '../../utils/output-schemas.js';
8
+ import { getCache, buildCacheKey, hashToken } from '../../cache/index.js';
9
+ import { getEffectiveToken } from '../../utils/auth-context.js';
10
+ const Schema = z.object({
11
+ code: ProjectCodeSchema,
12
+ });
13
+ async function handler(args) {
14
+ const { code } = args;
15
+ const cache = await getCache();
16
+ const host = process.env.QASE_API_DOMAIN || 'api.qase.io';
17
+ const key = buildCacheKey({
18
+ host,
19
+ tenantId: hashToken(getEffectiveToken()),
20
+ resource: 'project_context',
21
+ scope: code,
22
+ });
23
+ const cached = await cache.get(key);
24
+ if (cached)
25
+ return cached;
26
+ const client = getApiClient();
27
+ const [projectRes, suitesRes, milestonesRes, envsRes, customFieldsRes, usersRes] = await Promise.allSettled([
28
+ toResultAsync(client.projects.getProject(code)),
29
+ toResultAsync(client.suites.getSuites(code, undefined, 100, 0)),
30
+ toResultAsync(client.milestones.getMilestones(code, undefined, 100, 0)),
31
+ toResultAsync(client.environment.getEnvironments(code, undefined, undefined, 100, 0)),
32
+ toResultAsync(client.customFields.getCustomFields(undefined, undefined, 100, 0)),
33
+ toResultAsync(client.users.getUsers()),
34
+ ]);
35
+ const extract = (settled) => {
36
+ if (settled.status === 'fulfilled') {
37
+ return settled.value.match((r) => r.data.result, () => null);
38
+ }
39
+ return null;
40
+ };
41
+ const context = {
42
+ project: extract(projectRes),
43
+ suites: extract(suitesRes),
44
+ milestones: extract(milestonesRes),
45
+ environments: extract(envsRes),
46
+ custom_fields: extract(customFieldsRes),
47
+ users: extract(usersRes),
48
+ };
49
+ const TTL = 5 * 60 * 1000; // 5 minutes
50
+ await cache.set(key, context, TTL);
51
+ const project = context.project;
52
+ const projectName = project?.title || code;
53
+ const suitesList = context.suites?.entities ?? [];
54
+ const milestonesList = context.milestones?.entities ?? [];
55
+ const envsList = context.environments?.entities ?? [];
56
+ const customFieldsList = context.custom_fields?.entities ?? [];
57
+ const usersList = context.users?.entities ?? [];
58
+ const lines = [
59
+ `## Project: ${projectName} (${code})`,
60
+ '',
61
+ `- **Suites:** ${suitesList.length}`,
62
+ `- **Milestones:** ${milestonesList.length}`,
63
+ `- **Environments:** ${envsList.length}`,
64
+ `- **Custom fields:** ${customFieldsList.length}`,
65
+ `- **Team members:** ${usersList.length}`,
66
+ ];
67
+ if (envsList.length > 0) {
68
+ lines.push('', '**Environments:** ' + envsList.map((e) => e.title).join(', '));
69
+ }
70
+ if (milestonesList.length > 0) {
71
+ lines.push('', '**Milestones:**');
72
+ for (const m of milestonesList.slice(0, 10)) {
73
+ const status = m.status ? ` \`${m.status}\`` : '';
74
+ lines.push(`- ${m.title}${status}`);
75
+ }
76
+ if (milestonesList.length > 10)
77
+ lines.push(`- _...and ${milestonesList.length - 10} more_`);
78
+ }
79
+ if (suitesList.length > 0) {
80
+ const topLevel = suitesList.filter((s) => !s.parent_id);
81
+ lines.push('', `**Top-level suites** (${topLevel.length} of ${suitesList.length} total):`);
82
+ for (const s of topLevel.slice(0, 10)) {
83
+ lines.push(`- ${s.title}`);
84
+ }
85
+ if (topLevel.length > 10)
86
+ lines.push(`- _...and ${topLevel.length - 10} more_`);
87
+ }
88
+ const summary = lines.join('\n');
89
+ return richResult([summaryBlock(summary), dataBlock(context)], context);
90
+ }
91
+ toolRegistry.register({
92
+ name: 'qase_project_context',
93
+ description: 'Get full project context in one call: project details, suites tree, milestones, ' +
94
+ 'environments, custom fields, and users. Cached for 5 minutes. Use this as the ' +
95
+ 'first call when starting work with a project — it seeds all the metadata the LLM ' +
96
+ 'needs without making 6 separate list calls.',
97
+ schema: Schema,
98
+ handler,
99
+ annotations: ReadAnnotation,
100
+ outputSchema: ProjectContextOutput,
101
+ });
102
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../../src/operations-v2/read/project-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/write/attachments.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { createReadStream, existsSync } from 'fs';
3
+ import { getApiClient } from '../../client/index.js';
4
+ import { toolRegistry, CreateAnnotation, DeleteAnnotation } from '../../utils/registry.js';
5
+ import { toResultAsync, createToolError } from '../../utils/errors.js';
6
+ import { ProjectCodeSchema, HashSchema } from '../../utils/validation.js';
7
+ const UploadSchema = z.object({
8
+ code: ProjectCodeSchema,
9
+ file: z.string().describe('File content as base64 encoded string or absolute file path'),
10
+ filename: z.string().describe('Original filename with extension'),
11
+ });
12
+ const DeleteSchema = z.object({
13
+ hash: HashSchema.describe('Attachment hash identifier'),
14
+ });
15
+ function prepareFileData(file, filename) {
16
+ if (file.startsWith('/') && existsSync(file)) {
17
+ return { name: filename, value: createReadStream(file) };
18
+ }
19
+ const isBase64 = /^[A-Za-z0-9+/=\s]+$/.test(file);
20
+ return {
21
+ name: filename,
22
+ value: Buffer.from(file, isBase64 ? 'base64' : undefined),
23
+ };
24
+ }
25
+ async function upload(args) {
26
+ const client = getApiClient();
27
+ const { code, file, filename } = args;
28
+ const fileData = prepareFileData(file, filename);
29
+ const result = await toResultAsync(client.attachments.uploadAttachment(code, [fileData]));
30
+ return result.match((r) => r.data.result, (e) => {
31
+ throw createToolError(e, 'attachment operation');
32
+ });
33
+ }
34
+ async function del(args) {
35
+ const client = getApiClient();
36
+ const result = await toResultAsync(client.attachments.deleteAttachment(args.hash));
37
+ return result.match(() => ({ success: true, hash: args.hash }), (e) => {
38
+ throw createToolError(e, 'attachment operation');
39
+ });
40
+ }
41
+ toolRegistry.register({
42
+ name: 'qase_attachment_upload',
43
+ description: 'Upload a file attachment. Accepts the file as a base64 encoded string or an absolute path. ' +
44
+ 'Returns the attachment hash that can be referenced in test cases and results.',
45
+ schema: UploadSchema,
46
+ handler: upload,
47
+ annotations: CreateAnnotation,
48
+ visibility: 'discoverable',
49
+ });
50
+ toolRegistry.register({
51
+ name: 'qase_attachment_delete',
52
+ description: 'Delete an attachment by its hash.',
53
+ schema: DeleteSchema,
54
+ handler: del,
55
+ annotations: DeleteAnnotation,
56
+ visibility: 'discoverable',
57
+ });
58
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/operations-v2/write/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cases.d.ts","sourceRoot":"","sources":["../../../src/operations-v2/write/cases.ts"],"names":[],"mappings":""}