@qase/mcp-server 1.1.7 → 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 -551
  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 -61
  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 +78 -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 +12 -3
  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 -338
  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
package/README.md CHANGED
@@ -1,585 +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
+ - **29 task-oriented tools** (30 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:
160
-
161
- ```bash
162
- export QASE_API_TOKEN=your_api_token_here
163
- ```
164
-
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
- Add a `.codex/config.json` file to your project root:
194
-
195
- ```json
196
- {
197
- "mcpServers": {
198
- "qase": {
199
- "command": "npx",
200
- "args": ["-y", "@qase/mcp-server"],
201
- "env": {
202
- "QASE_API_TOKEN": "your_api_token_here"
203
- }
204
- }
205
- }
206
- }
207
- ```
208
-
209
- Set the required environment variable before running Codex:
68
+ Install the package and provide your own API token:
210
69
 
211
70
  ```bash
71
+ npm install -g @qase/mcp-server
212
72
  export QASE_API_TOKEN=your_api_token_here
213
73
  ```
214
74
 
215
- ### OpenCode
216
-
217
- Add an `opencode.json` file to your project root (or `~/.config/opencode/opencode.json` for global configuration):
218
-
219
- ```json
220
- {
221
- "mcp": {
222
- "qase": {
223
- "type": "local",
224
- "command": ["npx", "-y", "@qase/mcp-server"],
225
- "environment": {
226
- "QASE_API_TOKEN": "your_api_token_here"
227
- }
228
- }
229
- }
230
- }
231
- ```
232
-
233
- > **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`).
234
-
235
- ## Usage Examples
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)**.
236
76
 
237
- ### Basic Operations
77
+ ## Upgrading from v1
238
78
 
239
- #### List All Projects
240
-
241
- ```
242
- Can you list all my Qase projects?
243
- ```
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 **[MIGRATION.md](MIGRATION.md)** for the complete tool mapping table, response format changes, and before/after examples.
244
80
 
245
- #### Create a Test Case
81
+ ## Tools
246
82
 
247
- ```
248
- Create a test case in project DEMO titled "Login with valid credentials" with steps for entering username, password, and clicking login
249
- ```
83
+ 30 tools across 6 groups (29 task-oriented tools plus `qase_discover_tools` for on-demand activation of secondary tools):
250
84
 
251
- #### Search with QQL
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 | 21 | Create, update, and delete cases, runs, results, defects, suites, milestones, plans, shared steps, environments, and attachments |
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 |
252
93
 
253
- ```
254
- Find all failed test results from the last 7 days in project DEMO
255
- ```
94
+ Full tool-by-tool reference with parameters and the discovery model: **[docs/tools.md](docs/tools.md)**.
256
95
 
257
- ### Advanced QQL Queries
96
+ ## Documentation
258
97
 
259
- #### Find Flaky Tests
260
-
261
- ```
262
- Search for all flaky test cases in project DEMO that are not automated
263
- ```
264
-
265
- The server will execute:
266
- ```
267
- entity = "case" and project = "DEMO" and isFlaky = true and automation = "Not automated"
268
- ```
269
-
270
- #### Find Open Blocker Defects
271
-
272
- ```
273
- Show me all open blocker defects in project DEMO
274
- ```
275
-
276
- #### Find Tests by Author
277
-
278
- ```
279
- Find all test cases created by john@example.com in the last month
280
- ```
281
-
282
- ### Working with Test Runs
283
-
284
- #### Create and Execute a Test Run
285
-
286
- ```
287
- 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
288
- ```
289
-
290
- ## Available Tools
291
-
292
- ### Projects (6 tools)
293
- - `list_projects` - Get all projects
294
- - `get_project` - Get project details
295
- - `create_project` - Create new project
296
- - `delete_project` - Delete project
297
- - `grant_project_access` - Grant user/group access
298
- - `revoke_project_access` - Revoke access
299
-
300
- ### Test Cases (8 tools)
301
- - `list_cases` - List all test cases
302
- - `get_case` - Get test case details
303
- - `create_case` - Create new test case
304
- - `update_case` - Update test case
305
- - `delete_case` - Delete test case
306
- - `bulk_create_cases` - Create multiple cases
307
- - `attach_external_issue` - Link external issue (Jira, etc.)
308
- - `detach_external_issue` - Unlink external issue
309
-
310
- ### Case enum values
311
-
312
- `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.
313
-
314
- The normalization does not touch `automation`/`is_flaky`, so pass those values as the API expects (strings or booleans).
315
- 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.
316
-
317
- ### Test Runs (7 tools)
318
- - `list_runs` - List test runs
319
- - `get_run` - Get run details
320
- - `create_run` - Create new run
321
- - `delete_run` - Delete run
322
- - `complete_run` - Mark run as complete
323
- - `get_run_public_link` - Get public link
324
- - `delete_run_public_link` - Remove public link
325
-
326
- ### Test Results (6 tools)
327
- - `list_results` - List test results
328
- - `get_result` - Get result details
329
- - `create_result` - Create test result
330
- - `create_results_bulk` - Create multiple results
331
- - `update_result` - Update result
332
- - `delete_result` - Delete result
333
-
334
- ### Test Plans (5 tools)
335
- - `list_plans` - List test plans
336
- - `get_plan` - Get plan details
337
- - `create_plan` - Create test plan
338
- - `update_plan` - Update test plan
339
- - `delete_plan` - Delete test plan
340
-
341
- ### Suites (5 tools)
342
- - `list_suites` - List suites
343
- - `get_suite` - Get suite details
344
- - `create_suite` - Create suite
345
- - `update_suite` - Update suite
346
- - `delete_suite` - Delete suite
347
-
348
- ### Defects (7 tools)
349
- - `list_defects` - List defects
350
- - `get_defect` - Get defect details
351
- - `create_defect` - Create defect
352
- - `update_defect` - Update defect
353
- - `delete_defect` - Delete defect
354
- - `resolve_defect` - Mark as resolved
355
- - `update_defect_status` - Update status
356
-
357
- ### Milestones (5 tools)
358
- - `list_milestones` - List milestones
359
- - `get_milestone` - Get milestone details
360
- - `create_milestone` - Create milestone
361
- - `update_milestone` - Update milestone
362
- - `delete_milestone` - Delete milestone
363
-
364
- ### Environments (5 tools)
365
- - `list_environments` - List environments
366
- - `get_environment` - Get environment details
367
- - `create_environment` - Create environment
368
- - `update_environment` - Update environment
369
- - `delete_environment` - Delete environment
370
-
371
- ### Shared Steps (5 tools)
372
- - `list_shared_steps` - List shared steps
373
- - `get_shared_step` - Get shared step details
374
- - `create_shared_step` - Create shared step
375
- - `update_shared_step` - Update shared step
376
- - `delete_shared_step` - Delete shared step
377
-
378
- ### Shared Parameters (5 tools)
379
- - `list_shared_parameters` - List parameters
380
- - `get_shared_parameter` - Get parameter details
381
- - `create_shared_parameter` - Create parameter
382
- - `update_shared_parameter` - Update parameter
383
- - `delete_shared_parameter` - Delete parameter
384
-
385
- ### Supporting Entities
386
- - **Attachments** (4 tools) - File management
387
- - **Authors** (2 tools) - Author information
388
- - **Custom Fields** (5 tools) - Custom field management
389
- - **System Fields** (1 tool) - System field info
390
- - **Configurations** (3 tools) - Configuration management
391
- - **Users** (2 tools) - User management
392
-
393
- ### QQL Search (2 tools)
394
- - `qql_search` - Execute QQL query
395
- - `qql_help` - Get QQL syntax help
396
-
397
- **Total: 83 tools available**
398
-
399
- ## Development
400
-
401
- ### Building from Source
402
-
403
- ```bash
404
- npm run build
405
- ```
406
-
407
- ### Running Tests
408
-
409
- ```bash
410
- # Run all tests
411
- npm test
412
-
413
- # Run with coverage
414
- npm run test:coverage
415
-
416
- # Watch mode
417
- npm run test:watch
418
- ```
419
-
420
- ### Linting
421
-
422
- ```bash
423
- # Check for issues
424
- npm run lint
425
-
426
- # Auto-fix issues
427
- npm run lint -- --fix
428
- ```
429
-
430
- ### Debugging
431
-
432
- Use the MCP Inspector for interactive debugging:
433
-
434
- ```bash
435
- npm run inspector
436
- ```
437
-
438
- Set your API token when prompted, then interact with tools in the inspector UI.
439
-
440
- ### Transport Options
441
-
442
- The server supports multiple transport types for different use cases:
443
-
444
- #### Stdio Transport (Default)
445
-
446
- Used by MCP clients like Claude Desktop and Cursor:
447
-
448
- ```bash
449
- npm start
450
- # or
451
- npm run start:stdio
452
- ```
453
-
454
- #### SSE Transport
455
-
456
- Server-Sent Events for web-based clients:
457
-
458
- ```bash
459
- npm run start:sse
460
- # Server runs on http://localhost:3000/sse
461
- # Health check: http://localhost:3000/health
462
- ```
463
-
464
- #### Streamable HTTP Transport
465
-
466
- Full HTTP-based transport with session management:
467
-
468
- ```bash
469
- npm run start:http
470
- # Server runs on http://localhost:3000/mcp
471
- # Health check: http://localhost:3000/health
472
- ```
473
-
474
- #### Custom Configuration
475
-
476
- ```bash
477
- # Custom port and host
478
- node build/index.js --transport streamable-http --port 8080 --host 0.0.0.0
479
-
480
- # Available options:
481
- # --transport: stdio | sse | streamable-http (default: stdio)
482
- # --port: Port number (default: 3000)
483
- # --host: Host address (default: 0.0.0.0)
484
- ```
485
-
486
- ## Troubleshooting
487
-
488
- ### Authentication Errors
489
-
490
- **Error**: `Authentication failed: Please check your QASE_API_TOKEN`
491
-
492
- **Solution**:
493
- 1. Verify your API token is correct: https://app.qase.io/user/api/token
494
- 2. Ensure the token is set in your environment or config file
495
- 3. Check for extra spaces or quotes in the token value
496
-
497
- ### Connection Errors
498
-
499
- **Error**: `Network error` or `ECONNREFUSED`
500
-
501
- **Solution**:
502
- 1. Check your internet connection
503
- 2. Verify the API domain is correct (especially for enterprise customers)
504
- 3. Check if Qase is accessible: https://api.qase.io/v1/
505
-
506
- ### SSL Certificate Errors
507
-
508
- **Error**: `unable to get local issuer certificate`
509
-
510
- This error typically occurs in corporate environments with:
511
- - SSL-intercepting proxy servers
512
- - Self-signed certificates
513
- - Internal Certificate Authorities (CA)
514
-
515
- **Solution**: Add the `NODE_EXTRA_CA_CERTS` environment variable pointing to your CA certificate file:
516
-
517
- ```json
518
- {
519
- "mcpServers": {
520
- "qase": {
521
- "command": "npx",
522
- "args": ["-y", "@qase/mcp-server"],
523
- "env": {
524
- "QASE_API_TOKEN": "your_api_token_here",
525
- "NODE_EXTRA_CA_CERTS": "/path/to/your/certificate.pem"
526
- }
527
- }
528
- }
529
- }
530
- ```
531
-
532
- To find your certificate:
533
- - **Corporate environments**: Contact your IT department for the CA certificate
534
- - **macOS**: Export from Keychain Access (System Roots → your CA → Export as .pem)
535
- - **Windows**: Export from Certificate Manager (certmgr.msc)
536
- - **Linux**: Usually in `/etc/ssl/certs/` or `/etc/pki/tls/certs/`
537
-
538
- ### Custom Domain Issues
539
-
540
- **Error**: `Invalid domain` or connection errors with custom domain
541
-
542
- **Solution**:
543
- 1. Ensure `QASE_API_DOMAIN` is set to just the domain (e.g., `api.company.qase.io`)
544
- 2. Don't include `https://` or `/v1` in the domain
545
- 3. Verify with your Qase administrator
546
-
547
- ### No Tools Showing in MCP Client
548
-
549
- **Error**: MCP client shows "no tools, prompts or resources" or 0 tools available
550
-
551
- **Solution**:
552
- 1. Verify your MCP configuration has the correct command and arguments
553
- 2. Check that `QASE_API_TOKEN` is set in the `env` section
554
- 3. Restart your MCP client completely (close and reopen)
555
- 4. Check the MCP client logs for connection errors
556
- 5. Verify the server is built: `npm run build`
557
-
558
- ### Tool Not Found
559
-
560
- **Error**: `Unknown tool: tool_name`
561
-
562
- **Solution**:
563
- 1. Ensure you're using the latest version: `npm update -g @qase/mcp-server`
564
- 2. Check the tool name spelling matches the documentation
565
- 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
+ - **[MIGRATION.md](MIGRATION.md)** — v1 → v2 tool mapping and migration guide
566
103
 
567
104
  ## Contributing
568
105
 
569
- 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.
570
107
 
571
- ### Development Guidelines
108
+ ## License
572
109
 
573
- - Follow TypeScript best practices
574
- - Add unit tests for new features
575
- - Update documentation for new tools
576
- - Ensure all tests pass: `npm test`
577
- - Ensure linting passes: `npm run lint`
578
- - Maintain code coverage above 70%
110
+ MIT License see [LICENSE](LICENSE) for details.
579
111
 
580
- ## License
112
+ ## Support
581
113
 
582
- 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
583
117
 
584
118
  ## Links
585
119
 
@@ -588,13 +122,3 @@ MIT License - see [LICENSE](LICENSE) file for details
588
122
  - **API Documentation**: https://developers.qase.io
589
123
  - **MCP Protocol**: https://modelcontextprotocol.io
590
124
  - **Issue Tracker**: https://github.com/qase-tms/qase-mcp-server/issues
591
-
592
- ## Support
593
-
594
- - **Documentation**: https://help.qase.io
595
- - **Email**: support@qase.io
596
- - **GitHub Issues**: https://github.com/qase-tms/qase-mcp-server/issues
597
-
598
- ---
599
-
600
- 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"}