@qase/mcp-server 1.1.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/CHANGELOG.md +38 -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 +21 -0
  108. package/build/operations-v2/index.d.ts.map +1 -0
  109. package/build/operations-v2/index.js +27 -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 +79 -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 +115 -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/case-fields.d.ts +206 -0
  132. package/build/operations-v2/write/case-fields.d.ts.map +1 -0
  133. package/build/operations-v2/write/case-fields.js +79 -0
  134. package/build/operations-v2/write/case-fields.js.map +1 -0
  135. package/build/operations-v2/write/cases-bulk.d.ts +2 -0
  136. package/build/operations-v2/write/cases-bulk.d.ts.map +1 -0
  137. package/build/operations-v2/write/cases-bulk.js +54 -0
  138. package/build/operations-v2/write/cases-bulk.js.map +1 -0
  139. package/build/operations-v2/write/cases.d.ts +2 -0
  140. package/build/operations-v2/write/cases.d.ts.map +1 -0
  141. package/build/operations-v2/write/cases.js +52 -0
  142. package/build/operations-v2/write/cases.js.map +1 -0
  143. package/build/operations-v2/write/defects.d.ts +2 -0
  144. package/build/operations-v2/write/defects.d.ts.map +1 -0
  145. package/build/operations-v2/write/defects.js +81 -0
  146. package/build/operations-v2/write/defects.js.map +1 -0
  147. package/build/operations-v2/write/environments.d.ts +2 -0
  148. package/build/operations-v2/write/environments.d.ts.map +1 -0
  149. package/build/operations-v2/write/environments.js +56 -0
  150. package/build/operations-v2/write/environments.js.map +1 -0
  151. package/build/operations-v2/write/external-issues.d.ts +2 -0
  152. package/build/operations-v2/write/external-issues.d.ts.map +1 -0
  153. package/build/operations-v2/write/external-issues.js +96 -0
  154. package/build/operations-v2/write/external-issues.js.map +1 -0
  155. package/build/operations-v2/write/milestones.d.ts +2 -0
  156. package/build/operations-v2/write/milestones.d.ts.map +1 -0
  157. package/build/operations-v2/write/milestones.js +56 -0
  158. package/build/operations-v2/write/milestones.js.map +1 -0
  159. package/build/operations-v2/write/plans.d.ts +2 -0
  160. package/build/operations-v2/write/plans.d.ts.map +1 -0
  161. package/build/operations-v2/write/plans.js +55 -0
  162. package/build/operations-v2/write/plans.js.map +1 -0
  163. package/build/operations-v2/write/results.d.ts +2 -0
  164. package/build/operations-v2/write/results.d.ts.map +1 -0
  165. package/build/operations-v2/write/results.js +72 -0
  166. package/build/operations-v2/write/results.js.map +1 -0
  167. package/build/operations-v2/write/runs.d.ts +2 -0
  168. package/build/operations-v2/write/runs.d.ts.map +1 -0
  169. package/build/operations-v2/write/runs.js +84 -0
  170. package/build/operations-v2/write/runs.js.map +1 -0
  171. package/build/operations-v2/write/shared-steps.d.ts +2 -0
  172. package/build/operations-v2/write/shared-steps.d.ts.map +1 -0
  173. package/build/operations-v2/write/shared-steps.js +60 -0
  174. package/build/operations-v2/write/shared-steps.js.map +1 -0
  175. package/build/operations-v2/write/suites.d.ts +2 -0
  176. package/build/operations-v2/write/suites.d.ts.map +1 -0
  177. package/build/operations-v2/write/suites.js +63 -0
  178. package/build/operations-v2/write/suites.js.map +1 -0
  179. package/build/prompts/index.d.ts +31 -0
  180. package/build/prompts/index.d.ts.map +1 -0
  181. package/build/prompts/index.js +229 -0
  182. package/build/prompts/index.js.map +1 -0
  183. package/build/transports/sse.d.ts.map +1 -1
  184. package/build/transports/sse.js +6 -0
  185. package/build/transports/sse.js.map +1 -1
  186. package/build/transports/streamableHttp.d.ts +6 -1
  187. package/build/transports/streamableHttp.d.ts.map +1 -1
  188. package/build/transports/streamableHttp.js +128 -16
  189. package/build/transports/streamableHttp.js.map +1 -1
  190. package/build/utils/auth-context.d.ts +8 -0
  191. package/build/utils/auth-context.d.ts.map +1 -1
  192. package/build/utils/auth-context.js +18 -0
  193. package/build/utils/auth-context.js.map +1 -1
  194. package/build/utils/case-enums.d.ts +5 -3
  195. package/build/utils/case-enums.d.ts.map +1 -1
  196. package/build/utils/case-enums.js +77 -59
  197. package/build/utils/case-enums.js.map +1 -1
  198. package/build/utils/output-schemas.d.ts +16 -0
  199. package/build/utils/output-schemas.d.ts.map +1 -0
  200. package/build/utils/output-schemas.js +82 -0
  201. package/build/utils/output-schemas.js.map +1 -0
  202. package/build/utils/registry.d.ts +42 -9
  203. package/build/utils/registry.d.ts.map +1 -1
  204. package/build/utils/registry.js +64 -11
  205. package/build/utils/registry.js.map +1 -1
  206. package/build/utils/response-shape.d.ts +23 -0
  207. package/build/utils/response-shape.d.ts.map +1 -0
  208. package/build/utils/response-shape.js +73 -0
  209. package/build/utils/response-shape.js.map +1 -0
  210. package/build/utils/rich-response.d.ts +58 -0
  211. package/build/utils/rich-response.d.ts.map +1 -0
  212. package/build/utils/rich-response.js +93 -0
  213. package/build/utils/rich-response.js.map +1 -0
  214. package/build/utils/server-context.d.ts +65 -0
  215. package/build/utils/server-context.d.ts.map +1 -0
  216. package/build/utils/server-context.js +67 -0
  217. package/build/utils/server-context.js.map +1 -0
  218. package/build/version.d.ts +1 -1
  219. package/build/version.js +1 -1
  220. package/docs/connect.md +81 -0
  221. package/docs/migration.md +351 -0
  222. package/docs/self-run.md +270 -0
  223. package/docs/tools.md +111 -0
  224. package/docs/troubleshooting.md +144 -0
  225. package/package.json +11 -2
  226. package/server.json +8 -2
  227. package/build/operations/attachments.d.ts +0 -8
  228. package/build/operations/attachments.d.ts.map +0 -1
  229. package/build/operations/attachments.js +0 -146
  230. package/build/operations/attachments.js.map +0 -1
  231. package/build/operations/authors.d.ts +0 -8
  232. package/build/operations/authors.d.ts.map +0 -1
  233. package/build/operations/authors.js +0 -70
  234. package/build/operations/authors.js.map +0 -1
  235. package/build/operations/cases.d.ts +0 -8
  236. package/build/operations/cases.d.ts.map +0 -1
  237. package/build/operations/cases.js +0 -370
  238. package/build/operations/cases.js.map +0 -1
  239. package/build/operations/configurations.d.ts +0 -10
  240. package/build/operations/configurations.d.ts.map +0 -1
  241. package/build/operations/configurations.js +0 -125
  242. package/build/operations/configurations.js.map +0 -1
  243. package/build/operations/custom-fields.d.ts +0 -8
  244. package/build/operations/custom-fields.d.ts.map +0 -1
  245. package/build/operations/custom-fields.js +0 -172
  246. package/build/operations/custom-fields.js.map +0 -1
  247. package/build/operations/defects.d.ts +0 -8
  248. package/build/operations/defects.d.ts.map +0 -1
  249. package/build/operations/defects.js +0 -256
  250. package/build/operations/defects.js.map +0 -1
  251. package/build/operations/environments.d.ts +0 -8
  252. package/build/operations/environments.d.ts.map +0 -1
  253. package/build/operations/environments.js +0 -154
  254. package/build/operations/environments.js.map +0 -1
  255. package/build/operations/milestones.d.ts +0 -8
  256. package/build/operations/milestones.d.ts.map +0 -1
  257. package/build/operations/milestones.js +0 -155
  258. package/build/operations/milestones.js.map +0 -1
  259. package/build/operations/plans.d.ts +0 -8
  260. package/build/operations/plans.d.ts.map +0 -1
  261. package/build/operations/plans.js +0 -158
  262. package/build/operations/plans.js.map +0 -1
  263. package/build/operations/projects.d.ts +0 -8
  264. package/build/operations/projects.d.ts.map +0 -1
  265. package/build/operations/projects.js +0 -192
  266. package/build/operations/projects.js.map +0 -1
  267. package/build/operations/results.d.ts +0 -8
  268. package/build/operations/results.d.ts.map +0 -1
  269. package/build/operations/results.js +0 -214
  270. package/build/operations/results.js.map +0 -1
  271. package/build/operations/runs.d.ts +0 -8
  272. package/build/operations/runs.d.ts.map +0 -1
  273. package/build/operations/runs.js +0 -224
  274. package/build/operations/runs.js.map +0 -1
  275. package/build/operations/search.d.ts.map +0 -1
  276. package/build/operations/search.js.map +0 -1
  277. package/build/operations/shared-parameters.d.ts +0 -10
  278. package/build/operations/shared-parameters.d.ts.map +0 -1
  279. package/build/operations/shared-parameters.js +0 -93
  280. package/build/operations/shared-parameters.js.map +0 -1
  281. package/build/operations/shared-steps.d.ts +0 -8
  282. package/build/operations/shared-steps.d.ts.map +0 -1
  283. package/build/operations/shared-steps.js +0 -160
  284. package/build/operations/shared-steps.js.map +0 -1
  285. package/build/operations/suites.d.ts +0 -8
  286. package/build/operations/suites.d.ts.map +0 -1
  287. package/build/operations/suites.js +0 -169
  288. package/build/operations/suites.js.map +0 -1
  289. package/build/operations/system-fields.d.ts +0 -10
  290. package/build/operations/system-fields.d.ts.map +0 -1
  291. package/build/operations/system-fields.js +0 -47
  292. package/build/operations/system-fields.js.map +0 -1
  293. package/build/operations/users.d.ts +0 -10
  294. package/build/operations/users.d.ts.map +0 -1
  295. package/build/operations/users.js +0 -78
  296. package/build/operations/users.js.map +0 -1
package/README.md CHANGED
@@ -1,576 +1,119 @@
1
1
  # Qase MCP Server
2
2
 
3
- Official Model Context Protocol (MCP) server for [Qase Test Management Platform](https://qase.io).
3
+ Official [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for [Qase Test Management Platform](https://qase.io) — connect AI assistants to your test cases, runs, defects, and more.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@qase/mcp-server)](https://www.npmjs.com/package/@qase/mcp-server)
6
- [![npm downloads](https://img.shields.io/npm/dm/@qase/mcp-server)](https://www.npmjs.com/package/@qase/mcp-server)
7
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.qase%2Fmcp--server-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=io.qase%2Fmcp-server)
8
+
9
+ ## Table of Contents
10
+
11
+ - [Overview](#overview)
12
+ - [Use Cases](#use-cases)
13
+ - [Quick Start](#quick-start)
14
+ - [Use the hosted Qase MCP (recommended)](#use-the-hosted-qase-mcp-recommended)
15
+ - [Run it yourself](#run-it-yourself)
16
+ - [Upgrading from v1](#upgrading-from-v1)
17
+ - [Tools](#tools)
18
+ - [Documentation](#documentation)
19
+ - [Contributing](#contributing)
20
+ - [License](#license)
21
+ - [Support](#support)
22
+ - [Links](#links)
8
23
 
9
24
  ## Overview
10
25
 
11
- The Qase MCP Server provides seamless integration between AI assistants (Claude, Cursor, etc.) and the Qase Test Management Platform. It enables AI assistants to interact with your test cases, test runs, defects, and other Qase entities through a standardized protocol.
26
+ The Qase MCP Server lets AI assistants (Claude, Cursor, Codex, and any other MCP client) read and write Qase test cases, runs, results, defects, suites, milestones, and more through a standardized protocol, with no custom integration code.
12
27
 
13
- ### Features
28
+ **Features:**
14
29
 
15
- - **Complete Qase API Coverage** - Access all Qase entities and operations
16
- - **QQL Support** - Powerful Qase Query Language for advanced searches
17
- - **Type-Safe** - Full TypeScript implementation with comprehensive validation
18
- - **Custom Domains** - Support for enterprise custom domains
30
+ - **31 task-oriented tools** (32 total, including `qase_discover_tools`) consolidated from 83 v1 tools for lower token usage and better LLM accuracy
31
+ - **Composite tools** — multi-step workflows in a single call: CI reporting, defect triage, regression run setup
32
+ - **QQL support** Qase Query Language for advanced searches across cases, runs, results, defects, and plans
33
+ - **Project context bootstrap** one call returns full project structure (suites, milestones, environments, users, custom fields)
34
+ - **Tool discovery** — secondary tools stay hidden until needed, keeping the default tool list small
35
+ - **Hosted or self-run** — connect to `https://mcp.qase.io/mcp` with just your Qase login, or run the server locally with your own API token
36
+ - **Tenant-safe caching & HTTP resilience** — two-tier cache (in-memory + optional Redis), connection pooling, retry with backoff
37
+ - **Escape hatch** — direct REST API access for any endpoint via `qase_api`
19
38
 
20
- ### Supported Entities
39
+ ## Use Cases
21
40
 
22
- The server provides tools for managing:
41
+ | Scenario | Example prompt | Tool |
42
+ | --- | --- | --- |
43
+ | Bootstrap project context | "Show me the structure of project DEMO — suites, milestones, environments" | `qase_project_context` |
44
+ | Create or update a test case | "Create a high-priority smoke test case in project DEMO titled 'Login with valid credentials'" | `qase_case_upsert` |
45
+ | Report CI results | "Report these CI results for project DEMO: case 1 passed, case 2 failed with 'timeout error'" | `qase_ci_report` |
46
+ | Triage a failed test | "Create a critical defect for the login timeout failure in run #42" | `qase_triage_defect` |
47
+ | Search with QQL | "Find all failed test results from the last 7 days in project DEMO" | `qql_search` |
23
48
 
24
- - **Projects** - Create and manage test projects
25
- - **Test Cases** - Create, update, and organize test cases
26
- - **Test Suites** - Organize tests into hierarchical suites
27
- - **Test Runs** - Execute test runs and track progress
28
- - **Test Results** - Record and analyze test execution results
29
- - **Test Plans** - Define and manage test plans
30
- - **Defects** - Track and manage bugs
31
- - **Milestones** - Organize work by sprints/releases
32
- - **Environments** - Manage test environments
33
- - **Shared Steps** - Create reusable test steps
34
- - **Shared Parameters** - Define reusable test data
35
- - **Attachments** - Upload and manage files
36
- - **Custom Fields** - Define custom metadata
37
- - **Configurations** - Manage test configurations
38
- - **Users** - User management operations
39
- - **QQL Search** - Advanced cross-project queries
49
+ See [Tools](#tools) and [docs/tools.md](docs/tools.md) for the full reference.
40
50
 
41
- ## Installation
51
+ ## Quick Start
42
52
 
43
- ### Prerequisites
53
+ ### Use the hosted Qase MCP (recommended)
44
54
 
45
- - Node.js 18+
46
- - Qase account with API token ([Get your token](https://app.qase.io/user/api/token))
55
+ No install, no API token — connect to the Qase-hosted server and sign in with your Qase account.
47
56
 
48
- ### Option 1: Install from NPM (Recommended)
57
+ > **Note:** The hosted Qase MCP is available on the **Enterprise** plan in Qase. On other plans, [run the server yourself](#run-it-yourself) with your own API token.
49
58
 
50
- ```bash
51
- npm install -g @qase/mcp-server
52
- ```
53
-
54
- ### Option 2: Install from Source (Development)
55
-
56
- ```bash
57
- # Clone the repository
58
- git clone https://github.com/qase-tms/qase-mcp-server.git
59
- cd qase-mcp-server
60
-
61
- # Install dependencies
62
- npm install
63
-
64
- # Build the server
65
- npm run build
66
- ```
67
-
68
- ## Configuration
69
-
70
- ### Environment Variables
71
-
72
- Create a `.env` file or set environment variables:
73
-
74
- ```bash
75
- # Required: Your Qase API token
76
- QASE_API_TOKEN=your_api_token_here
77
-
78
- # Optional: Custom API domain for enterprise customers
79
- QASE_API_DOMAIN=api.qase.io
80
- ```
81
-
82
- Get your API token from: https://app.qase.io/user/api/token
83
-
84
- ### Custom Domains (Enterprise)
85
-
86
- If you're using Qase Enterprise with a custom domain:
87
-
88
- ```bash
89
- QASE_API_DOMAIN=api.yourcompany.qase.io
90
- ```
91
-
92
- ## Integration
93
-
94
- ### Claude Desktop
95
-
96
- Add to your Claude Desktop configuration file:
97
-
98
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
99
- **Windows**: `%APPDATA%/Claude/claude_desktop_config.json`
100
-
101
- ```json
102
- {
103
- "mcpServers": {
104
- "qase": {
105
- "command": "npx",
106
- "args": ["-y", "@qase/mcp-server"],
107
- "env": {
108
- "QASE_API_TOKEN": "your_api_token_here"
109
- }
110
- }
111
- }
112
- }
113
- ```
114
-
115
- Or, if installed from source:
116
-
117
- ```json
118
- {
119
- "mcpServers": {
120
- "qase": {
121
- "command": "node",
122
- "args": ["/absolute/path/to/qase-mcp-server/build/index.js"],
123
- "env": {
124
- "QASE_API_TOKEN": "your_api_token_here"
125
- }
126
- }
127
- }
128
- }
129
- ```
59
+ - **Claude** — open **Settings → Connectors**, find **Qase Test Management**, click **Connect**.
60
+ - **Cursor** add `{"mcpServers": {"qase": {"url": "https://mcp.qase.io/mcp"}}}` to `.cursor/mcp.json`.
61
+ - **Codex** — add the URL `https://mcp.qase.io/mcp` in **Settings → MCPs → Add server**, or configure `~/.codex/config.toml` for the CLI.
62
+ - **VS Code** — add `{"servers": {"qase": {"type": "http", "url": "https://mcp.qase.io/mcp"}}}` to `.vscode/mcp.json`, or run **MCP: Add Server**.
130
63
 
131
- ### Cursor
132
-
133
- 1. Open Cursor Settings
134
- 2. Navigate to MCP settings
135
- 3. Add the Qase MCP server:
136
-
137
- ```json
138
- {
139
- "mcpServers": {
140
- "qase": {
141
- "command": "npx",
142
- "args": ["-y", "@qase/mcp-server"],
143
- "env": {
144
- "QASE_API_TOKEN": "your_api_token_here"
145
- }
146
- }
147
- }
148
- }
149
- ```
150
-
151
- ### Claude Code
152
-
153
- You can add the Qase MCP server to Claude Code using the CLI command:
64
+ Full per-client steps, other clients, and the active-workspace model: **[docs/connect.md](docs/connect.md)**.
154
65
 
155
- ```bash
156
- claude mcp add qase -- npx -y @qase/mcp-server
157
- ```
66
+ ### Run it yourself
158
67
 
159
- Set the required environment variable:
68
+ Install the package and provide your own API token:
160
69
 
161
70
  ```bash
71
+ npm install -g @qase/mcp-server
162
72
  export QASE_API_TOKEN=your_api_token_here
163
73
  ```
164
74
 
165
- Alternatively, add a `.mcp.json` file to your project root for automatic project-scoped configuration:
166
-
167
- ```json
168
- {
169
- "mcpServers": {
170
- "qase": {
171
- "command": "npx",
172
- "args": ["-y", "@qase/mcp-server"],
173
- "env": {
174
- "QASE_API_TOKEN": "your_api_token_here"
175
- }
176
- }
177
- }
178
- }
179
- ```
180
-
181
- You can also use the `--scope` flag to choose where the configuration is stored:
182
-
183
- ```bash
184
- # Project-scoped (saved in .mcp.json)
185
- claude mcp add --scope project qase -- npx -y @qase/mcp-server
186
-
187
- # User-scoped (available in all projects)
188
- claude mcp add --scope user qase -- npx -y @qase/mcp-server
189
- ```
190
-
191
- ### OpenAI Codex CLI
192
-
193
- Codex CLI uses TOML configuration. Add the Qase MCP server to `~/.codex/config.toml` (global) or `.codex/config.toml` in your project root:
194
-
195
- ```toml
196
- [mcp_servers.qase]
197
- command = "npx"
198
- args = ["-y", "@qase/mcp-server"]
199
-
200
- [mcp_servers.qase.env]
201
- QASE_API_TOKEN = "your_api_token_here"
202
- ```
203
-
204
- > **Note:** The section name `mcp_servers` must use an underscore — `mcp-servers` or `mcpservers` will be silently ignored.
205
-
206
- ### OpenCode
207
-
208
- Add an `opencode.json` file to your project root (or `~/.config/opencode/opencode.json` for global configuration):
209
-
210
- ```json
211
- {
212
- "mcp": {
213
- "qase": {
214
- "type": "local",
215
- "command": ["npx", "-y", "@qase/mcp-server"],
216
- "environment": {
217
- "QASE_API_TOKEN": "your_api_token_here"
218
- }
219
- }
220
- }
221
- }
222
- ```
223
-
224
- > **Note:** OpenCode uses a different format from other MCP clients — the command and args are combined into a single `command` array, env vars go under `environment`, and servers are nested under `mcp` (not `mcpServers`).
225
-
226
- ## Usage Examples
227
-
228
- ### Basic Operations
229
-
230
- #### List All Projects
231
-
232
- ```
233
- Can you list all my Qase projects?
234
- ```
235
-
236
- #### Create a Test Case
237
-
238
- ```
239
- Create a test case in project DEMO titled "Login with valid credentials" with steps for entering username, password, and clicking login
240
- ```
241
-
242
- #### Search with QQL
243
-
244
- ```
245
- Find all failed test results from the last 7 days in project DEMO
246
- ```
247
-
248
- ### Advanced QQL Queries
249
-
250
- #### Find Flaky Tests
251
-
252
- ```
253
- Search for all flaky test cases in project DEMO that are not automated
254
- ```
255
-
256
- The server will execute:
257
- ```
258
- entity = "case" and project = "DEMO" and isFlaky = true and automation = "Not automated"
259
- ```
260
-
261
- #### Find Open Blocker Defects
262
-
263
- ```
264
- Show me all open blocker defects in project DEMO
265
- ```
266
-
267
- #### Find Tests by Author
268
-
269
- ```
270
- Find all test cases created by john@example.com in the last month
271
- ```
272
-
273
- ### Working with Test Runs
274
-
275
- #### Create and Execute a Test Run
276
-
277
- ```
278
- Create a test run in project DEMO called "Sprint 24 Regression" including all test cases from the "Authentication" suite, then add a passed result for case ID 123
279
- ```
280
-
281
- ## Available Tools
282
-
283
- ### Projects (6 tools)
284
- - `list_projects` - Get all projects
285
- - `get_project` - Get project details
286
- - `create_project` - Create new project
287
- - `delete_project` - Delete project
288
- - `grant_project_access` - Grant user/group access
289
- - `revoke_project_access` - Revoke access
290
-
291
- ### Test Cases (8 tools)
292
- - `list_cases` - List all test cases
293
- - `get_case` - Get test case details
294
- - `create_case` - Create new test case
295
- - `update_case` - Update test case
296
- - `delete_case` - Delete test case
297
- - `bulk_create_cases` - Create multiple cases
298
- - `attach_external_issue` - Link external issue (Jira, etc.)
299
- - `detach_external_issue` - Unlink external issue
300
-
301
- ### Case enum values
302
-
303
- `create_case`, `bulk_create_cases`, and `update_case` automatically normalize friendly labels to whatever numeric IDs your workspace currently configures for the built-in system fields (`priority`, `severity`, `type`, `behavior`, `status`, `layer`). The server fetches `/v1/system_field` and caches the available options so you can keep using the titles or slugs you see in Qase while still satisfying the API’s numeric requirements.
304
-
305
- The normalization does not touch `automation`/`is_flaky`, so pass those values as the API expects (strings or booleans).
306
- The server keeps any existing label in place when it does not match a known enum so invalid values still bubble up as errors from Qase.
307
-
308
- ### Test Runs (7 tools)
309
- - `list_runs` - List test runs
310
- - `get_run` - Get run details
311
- - `create_run` - Create new run
312
- - `delete_run` - Delete run
313
- - `complete_run` - Mark run as complete
314
- - `get_run_public_link` - Get public link
315
- - `delete_run_public_link` - Remove public link
316
-
317
- ### Test Results (6 tools)
318
- - `list_results` - List test results
319
- - `get_result` - Get result details
320
- - `create_result` - Create test result
321
- - `create_results_bulk` - Create multiple results
322
- - `update_result` - Update result
323
- - `delete_result` - Delete result
324
-
325
- ### Test Plans (5 tools)
326
- - `list_plans` - List test plans
327
- - `get_plan` - Get plan details
328
- - `create_plan` - Create test plan
329
- - `update_plan` - Update test plan
330
- - `delete_plan` - Delete test plan
331
-
332
- ### Suites (5 tools)
333
- - `list_suites` - List suites
334
- - `get_suite` - Get suite details
335
- - `create_suite` - Create suite
336
- - `update_suite` - Update suite
337
- - `delete_suite` - Delete suite
338
-
339
- ### Defects (7 tools)
340
- - `list_defects` - List defects
341
- - `get_defect` - Get defect details
342
- - `create_defect` - Create defect
343
- - `update_defect` - Update defect
344
- - `delete_defect` - Delete defect
345
- - `resolve_defect` - Mark as resolved
346
- - `update_defect_status` - Update status
347
-
348
- ### Milestones (5 tools)
349
- - `list_milestones` - List milestones
350
- - `get_milestone` - Get milestone details
351
- - `create_milestone` - Create milestone
352
- - `update_milestone` - Update milestone
353
- - `delete_milestone` - Delete milestone
354
-
355
- ### Environments (5 tools)
356
- - `list_environments` - List environments
357
- - `get_environment` - Get environment details
358
- - `create_environment` - Create environment
359
- - `update_environment` - Update environment
360
- - `delete_environment` - Delete environment
361
-
362
- ### Shared Steps (5 tools)
363
- - `list_shared_steps` - List shared steps
364
- - `get_shared_step` - Get shared step details
365
- - `create_shared_step` - Create shared step
366
- - `update_shared_step` - Update shared step
367
- - `delete_shared_step` - Delete shared step
368
-
369
- ### Shared Parameters (5 tools)
370
- - `list_shared_parameters` - List parameters
371
- - `get_shared_parameter` - Get parameter details
372
- - `create_shared_parameter` - Create parameter
373
- - `update_shared_parameter` - Update parameter
374
- - `delete_shared_parameter` - Delete parameter
375
-
376
- ### Supporting Entities
377
- - **Attachments** (4 tools) - File management
378
- - **Authors** (2 tools) - Author information
379
- - **Custom Fields** (5 tools) - Custom field management
380
- - **System Fields** (1 tool) - System field info
381
- - **Configurations** (3 tools) - Configuration management
382
- - **Users** (2 tools) - User management
383
-
384
- ### QQL Search (2 tools)
385
- - `qql_search` - Execute QQL query
386
- - `qql_help` - Get QQL syntax help
387
-
388
- **Total: 83 tools available**
389
-
390
- ## Development
391
-
392
- ### Building from Source
393
-
394
- ```bash
395
- npm run build
396
- ```
397
-
398
- ### Running Tests
399
-
400
- ```bash
401
- # Run all tests
402
- npm test
403
-
404
- # Run with coverage
405
- npm run test:coverage
406
-
407
- # Watch mode
408
- npm run test:watch
409
- ```
410
-
411
- ### Linting
75
+ Then point your MCP client's stdio config at the `@qase/mcp-server` binary. Full install options, client configs (Claude Desktop, Cursor, Claude Code, Codex, OpenCode), environment variables, and transports (stdio/SSE/streamable-HTTP): **[docs/self-run.md](docs/self-run.md)**.
412
76
 
413
- ```bash
414
- # Check for issues
415
- npm run lint
416
-
417
- # Auto-fix issues
418
- npm run lint -- --fix
419
- ```
420
-
421
- ### Debugging
422
-
423
- Use the MCP Inspector for interactive debugging:
424
-
425
- ```bash
426
- npm run inspector
427
- ```
428
-
429
- Set your API token when prompted, then interact with tools in the inspector UI.
430
-
431
- ### Transport Options
77
+ ## Upgrading from v1
432
78
 
433
- The server supports multiple transport types for different use cases:
79
+ v2 consolidates 83 v1 tools into **29 task-oriented tools** (30 total, including a discovery tool). Tool names and response shapes have changed. See **[docs/migration.md](docs/migration.md)** for the complete tool mapping table, response format changes, and before/after examples.
434
80
 
435
- #### Stdio Transport (Default)
81
+ ## Tools
436
82
 
437
- Used by MCP clients like Claude Desktop and Cursor:
83
+ 32 tools across 6 groups (31 task-oriented tools plus `qase_discover_tools` for on-demand activation of secondary tools):
438
84
 
439
- ```bash
440
- npm start
441
- # or
442
- npm run start:stdio
443
- ```
444
-
445
- #### SSE Transport
446
-
447
- Server-Sent Events for web-based clients:
448
-
449
- ```bash
450
- npm run start:sse
451
- # Server runs on http://localhost:3000/sse
452
- # Health check: http://localhost:3000/health
453
- ```
454
-
455
- #### Streamable HTTP Transport
85
+ | Group | Count | Description |
86
+ | --- | --- | --- |
87
+ | Read | 2 | Fetch any entity by type/ID, or bootstrap full project context in one call |
88
+ | QQL | 2 | Search across cases, runs, results, defects, and plans with Qase Query Language |
89
+ | Write | 23 | Create, update, and delete cases (single or up to 100 at once), runs, results, defects, suites, milestones, plans, shared steps, environments, and attachments; link cases and runs to Jira issues |
90
+ | Composite | 3 | Multi-step workflows in one call: CI reporting, defect triage, regression run setup |
91
+ | Escape hatch | 1 | Direct REST API access for any endpoint not covered by the tools above |
92
+ | Meta | 1 | `qase_discover_tools` — find and activate secondary tools on demand |
456
93
 
457
- Full HTTP-based transport with session management:
94
+ Full tool-by-tool reference with parameters and the discovery model: **[docs/tools.md](docs/tools.md)**.
458
95
 
459
- ```bash
460
- npm run start:http
461
- # Server runs on http://localhost:3000/mcp
462
- # Health check: http://localhost:3000/health
463
- ```
96
+ ## Documentation
464
97
 
465
- #### Custom Configuration
466
-
467
- ```bash
468
- # Custom port and host
469
- node build/index.js --transport streamable-http --port 8080 --host 0.0.0.0
470
-
471
- # Available options:
472
- # --transport: stdio | sse | streamable-http (default: stdio)
473
- # --port: Port number (default: 3000)
474
- # --host: Host address (default: 0.0.0.0)
475
- ```
476
-
477
- ## Troubleshooting
478
-
479
- ### Authentication Errors
480
-
481
- **Error**: `Authentication failed: Please check your QASE_API_TOKEN`
482
-
483
- **Solution**:
484
- 1. Verify your API token is correct: https://app.qase.io/user/api/token
485
- 2. Ensure the token is set in your environment or config file
486
- 3. Check for extra spaces or quotes in the token value
487
-
488
- ### Connection Errors
489
-
490
- **Error**: `Network error` or `ECONNREFUSED`
491
-
492
- **Solution**:
493
- 1. Check your internet connection
494
- 2. Verify the API domain is correct (especially for enterprise customers)
495
- 3. Check if Qase is accessible: https://api.qase.io/v1/
496
-
497
- ### SSL Certificate Errors
498
-
499
- **Error**: `unable to get local issuer certificate`
500
-
501
- This error typically occurs in corporate environments with:
502
- - SSL-intercepting proxy servers
503
- - Self-signed certificates
504
- - Internal Certificate Authorities (CA)
505
-
506
- **Solution**: Add the `NODE_EXTRA_CA_CERTS` environment variable pointing to your CA certificate file:
507
-
508
- ```json
509
- {
510
- "mcpServers": {
511
- "qase": {
512
- "command": "npx",
513
- "args": ["-y", "@qase/mcp-server"],
514
- "env": {
515
- "QASE_API_TOKEN": "your_api_token_here",
516
- "NODE_EXTRA_CA_CERTS": "/path/to/your/certificate.pem"
517
- }
518
- }
519
- }
520
- }
521
- ```
522
-
523
- To find your certificate:
524
- - **Corporate environments**: Contact your IT department for the CA certificate
525
- - **macOS**: Export from Keychain Access (System Roots → your CA → Export as .pem)
526
- - **Windows**: Export from Certificate Manager (certmgr.msc)
527
- - **Linux**: Usually in `/etc/ssl/certs/` or `/etc/pki/tls/certs/`
528
-
529
- ### Custom Domain Issues
530
-
531
- **Error**: `Invalid domain` or connection errors with custom domain
532
-
533
- **Solution**:
534
- 1. Ensure `QASE_API_DOMAIN` is set to just the domain (e.g., `api.company.qase.io`)
535
- 2. Don't include `https://` or `/v1` in the domain
536
- 3. Verify with your Qase administrator
537
-
538
- ### No Tools Showing in MCP Client
539
-
540
- **Error**: MCP client shows "no tools, prompts or resources" or 0 tools available
541
-
542
- **Solution**:
543
- 1. Verify your MCP configuration has the correct command and arguments
544
- 2. Check that `QASE_API_TOKEN` is set in the `env` section
545
- 3. Restart your MCP client completely (close and reopen)
546
- 4. Check the MCP client logs for connection errors
547
- 5. Verify the server is built: `npm run build`
548
-
549
- ### Tool Not Found
550
-
551
- **Error**: `Unknown tool: tool_name`
552
-
553
- **Solution**:
554
- 1. Ensure you're using the latest version: `npm update -g @qase/mcp-server`
555
- 2. Check the tool name spelling matches the documentation
556
- 3. Restart your MCP client after updating
98
+ - **[docs/connect.md](docs/connect.md)** — connect to the hosted Qase MCP (Claude, Cursor, Codex, other clients)
99
+ - **[docs/self-run.md](docs/self-run.md)** — install and run the server yourself (config, clients, transports)
100
+ - **[docs/tools.md](docs/tools.md)** — full tool reference, groups, and the discovery model
101
+ - **[docs/troubleshooting.md](docs/troubleshooting.md)** auth, OAuth/connector, and SSL issues
102
+ - **[docs/migration.md](docs/migration.md)** v1 v2 tool mapping and migration guide
557
103
 
558
104
  ## Contributing
559
105
 
560
- Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
106
+ Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing, and linting guidelines.
561
107
 
562
- ### Development Guidelines
108
+ ## License
563
109
 
564
- - Follow TypeScript best practices
565
- - Add unit tests for new features
566
- - Update documentation for new tools
567
- - Ensure all tests pass: `npm test`
568
- - Ensure linting passes: `npm run lint`
569
- - Maintain code coverage above 70%
110
+ MIT License see [LICENSE](LICENSE) for details.
570
111
 
571
- ## License
112
+ ## Support
572
113
 
573
- MIT License - see [LICENSE](LICENSE) file for details
114
+ - **Documentation**: https://docs.qase.io/en/articles/14984302-qase-mcp-server
115
+ - **Email**: support@qase.io
116
+ - **GitHub Issues**: https://github.com/qase-tms/qase-mcp-server/issues
574
117
 
575
118
  ## Links
576
119
 
@@ -579,13 +122,3 @@ MIT License - see [LICENSE](LICENSE) file for details
579
122
  - **API Documentation**: https://developers.qase.io
580
123
  - **MCP Protocol**: https://modelcontextprotocol.io
581
124
  - **Issue Tracker**: https://github.com/qase-tms/qase-mcp-server/issues
582
-
583
- ## Support
584
-
585
- - **Documentation**: https://help.qase.io
586
- - **Email**: support@qase.io
587
- - **GitHub Issues**: https://github.com/qase-tms/qase-mcp-server/issues
588
-
589
- ---
590
-
591
- Made with ❤️ by [Qase](https://qase.io)
@@ -0,0 +1,12 @@
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+ /**
3
+ * Per-request storage for the OAuth `/authorize` request's `redirect_uri`.
4
+ *
5
+ * The proxy is transparent: it echoes the incoming redirect_uri back through
6
+ * `getClient` so the MCP SDK's local redirect_uri check passes, then forwards
7
+ * the request to auth.qase.io, which is the authoritative validator of a
8
+ * client's registered redirect URIs. Empty/undefined when no redirect_uri is
9
+ * present on the request.
10
+ */
11
+ export declare const authorizeRedirectUriStorage: AsyncLocalStorage<string | undefined>;
12
+ //# sourceMappingURL=client-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context.d.ts","sourceRoot":"","sources":["../../src/auth/client-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,uCAA8C,CAAC"}