@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.
- package/CHANGELOG.md +38 -0
- package/README.md +75 -542
- package/build/auth/client-context.d.ts +12 -0
- package/build/auth/client-context.d.ts.map +1 -0
- package/build/auth/client-context.js +12 -0
- package/build/auth/client-context.js.map +1 -0
- package/build/auth/jwks-verifier.d.ts +15 -0
- package/build/auth/jwks-verifier.d.ts.map +1 -0
- package/build/auth/jwks-verifier.js +31 -0
- package/build/auth/jwks-verifier.js.map +1 -0
- package/build/auth/mcp-guard.d.ts +15 -0
- package/build/auth/mcp-guard.d.ts.map +1 -0
- package/build/auth/mcp-guard.js +44 -0
- package/build/auth/mcp-guard.js.map +1 -0
- package/build/auth/oauth-config.d.ts +40 -0
- package/build/auth/oauth-config.d.ts.map +1 -0
- package/build/auth/oauth-config.js +34 -0
- package/build/auth/oauth-config.js.map +1 -0
- package/build/auth/proxy-provider.d.ts +31 -0
- package/build/auth/proxy-provider.d.ts.map +1 -0
- package/build/auth/proxy-provider.js +87 -0
- package/build/auth/proxy-provider.js.map +1 -0
- package/build/auth/token-type.d.ts +7 -0
- package/build/auth/token-type.d.ts.map +1 -0
- package/build/auth/token-type.js +10 -0
- package/build/auth/token-type.js.map +1 -0
- package/build/cache/circuit-breaker.d.ts +33 -0
- package/build/cache/circuit-breaker.d.ts.map +1 -0
- package/build/cache/circuit-breaker.js +68 -0
- package/build/cache/circuit-breaker.js.map +1 -0
- package/build/cache/index.d.ts +24 -0
- package/build/cache/index.d.ts.map +1 -0
- package/build/cache/index.js +86 -0
- package/build/cache/index.js.map +1 -0
- package/build/cache/keys.d.ts +25 -0
- package/build/cache/keys.d.ts.map +1 -0
- package/build/cache/keys.js +36 -0
- package/build/cache/keys.js.map +1 -0
- package/build/cache/layered.d.ts +31 -0
- package/build/cache/layered.d.ts.map +1 -0
- package/build/cache/layered.js +88 -0
- package/build/cache/layered.js.map +1 -0
- package/build/cache/memory.d.ts +32 -0
- package/build/cache/memory.d.ts.map +1 -0
- package/build/cache/memory.js +108 -0
- package/build/cache/memory.js.map +1 -0
- package/build/cache/metrics.d.ts +31 -0
- package/build/cache/metrics.d.ts.map +1 -0
- package/build/cache/metrics.js +95 -0
- package/build/cache/metrics.js.map +1 -0
- package/build/cache/prom-format.d.ts +7 -0
- package/build/cache/prom-format.d.ts.map +1 -0
- package/build/cache/prom-format.js +16 -0
- package/build/cache/prom-format.js.map +1 -0
- package/build/cache/redis-bus.d.ts +29 -0
- package/build/cache/redis-bus.d.ts.map +1 -0
- package/build/cache/redis-bus.js +50 -0
- package/build/cache/redis-bus.js.map +1 -0
- package/build/cache/redis.d.ts +32 -0
- package/build/cache/redis.d.ts.map +1 -0
- package/build/cache/redis.js +89 -0
- package/build/cache/redis.js.map +1 -0
- package/build/cache/types.d.ts +38 -0
- package/build/cache/types.d.ts.map +1 -0
- package/build/cache/types.js +2 -0
- package/build/cache/types.js.map +1 -0
- package/build/client/index.d.ts +10 -3
- package/build/client/index.d.ts.map +1 -1
- package/build/client/index.js +75 -50
- package/build/client/index.js.map +1 -1
- package/build/http/agent.d.ts +16 -0
- package/build/http/agent.d.ts.map +1 -0
- package/build/http/agent.js +16 -0
- package/build/http/agent.js.map +1 -0
- package/build/http/dedupe.d.ts +14 -0
- package/build/http/dedupe.d.ts.map +1 -0
- package/build/http/dedupe.js +69 -0
- package/build/http/dedupe.js.map +1 -0
- package/build/http/index.d.ts +6 -0
- package/build/http/index.d.ts.map +1 -0
- package/build/http/index.js +4 -0
- package/build/http/index.js.map +1 -0
- package/build/http/retry.d.ts +18 -0
- package/build/http/retry.d.ts.map +1 -0
- package/build/http/retry.js +52 -0
- package/build/http/retry.js.map +1 -0
- package/build/index.d.ts +1 -18
- package/build/index.d.ts.map +1 -1
- package/build/index.js +95 -63
- package/build/index.js.map +1 -1
- package/build/operations-v2/composites/ci-report.d.ts +2 -0
- package/build/operations-v2/composites/ci-report.d.ts.map +1 -0
- package/build/operations-v2/composites/ci-report.js +99 -0
- package/build/operations-v2/composites/ci-report.js.map +1 -0
- package/build/operations-v2/composites/regression-run.d.ts +2 -0
- package/build/operations-v2/composites/regression-run.d.ts.map +1 -0
- package/build/operations-v2/composites/regression-run.js +81 -0
- package/build/operations-v2/composites/regression-run.js.map +1 -0
- package/build/operations-v2/composites/triage-defect.d.ts +2 -0
- package/build/operations-v2/composites/triage-defect.d.ts.map +1 -0
- package/build/operations-v2/composites/triage-defect.js +67 -0
- package/build/operations-v2/composites/triage-defect.js.map +1 -0
- package/build/operations-v2/escape/api.d.ts +2 -0
- package/build/operations-v2/escape/api.d.ts.map +1 -0
- package/build/operations-v2/escape/api.js +34 -0
- package/build/operations-v2/escape/api.js.map +1 -0
- package/build/operations-v2/index.d.ts +21 -0
- package/build/operations-v2/index.d.ts.map +1 -0
- package/build/operations-v2/index.js +27 -0
- package/build/operations-v2/index.js.map +1 -0
- package/build/operations-v2/meta/discover.d.ts +9 -0
- package/build/operations-v2/meta/discover.d.ts.map +1 -0
- package/build/operations-v2/meta/discover.js +79 -0
- package/build/operations-v2/meta/discover.js.map +1 -0
- package/build/{operations/search.d.ts → operations-v2/qql/index.d.ts} +1 -1
- package/build/operations-v2/qql/index.d.ts.map +1 -0
- package/build/{operations/search.js → operations-v2/qql/index.js} +34 -9
- package/build/operations-v2/qql/index.js.map +1 -0
- package/build/operations-v2/read/get.d.ts +2 -0
- package/build/operations-v2/read/get.d.ts.map +1 -0
- package/build/operations-v2/read/get.js +115 -0
- package/build/operations-v2/read/get.js.map +1 -0
- package/build/operations-v2/read/project-context.d.ts +2 -0
- package/build/operations-v2/read/project-context.d.ts.map +1 -0
- package/build/operations-v2/read/project-context.js +102 -0
- package/build/operations-v2/read/project-context.js.map +1 -0
- package/build/operations-v2/write/attachments.d.ts +2 -0
- package/build/operations-v2/write/attachments.d.ts.map +1 -0
- package/build/operations-v2/write/attachments.js +58 -0
- package/build/operations-v2/write/attachments.js.map +1 -0
- package/build/operations-v2/write/case-fields.d.ts +206 -0
- package/build/operations-v2/write/case-fields.d.ts.map +1 -0
- package/build/operations-v2/write/case-fields.js +79 -0
- package/build/operations-v2/write/case-fields.js.map +1 -0
- package/build/operations-v2/write/cases-bulk.d.ts +2 -0
- package/build/operations-v2/write/cases-bulk.d.ts.map +1 -0
- package/build/operations-v2/write/cases-bulk.js +54 -0
- package/build/operations-v2/write/cases-bulk.js.map +1 -0
- package/build/operations-v2/write/cases.d.ts +2 -0
- package/build/operations-v2/write/cases.d.ts.map +1 -0
- package/build/operations-v2/write/cases.js +52 -0
- package/build/operations-v2/write/cases.js.map +1 -0
- package/build/operations-v2/write/defects.d.ts +2 -0
- package/build/operations-v2/write/defects.d.ts.map +1 -0
- package/build/operations-v2/write/defects.js +81 -0
- package/build/operations-v2/write/defects.js.map +1 -0
- package/build/operations-v2/write/environments.d.ts +2 -0
- package/build/operations-v2/write/environments.d.ts.map +1 -0
- package/build/operations-v2/write/environments.js +56 -0
- package/build/operations-v2/write/environments.js.map +1 -0
- package/build/operations-v2/write/external-issues.d.ts +2 -0
- package/build/operations-v2/write/external-issues.d.ts.map +1 -0
- package/build/operations-v2/write/external-issues.js +96 -0
- package/build/operations-v2/write/external-issues.js.map +1 -0
- package/build/operations-v2/write/milestones.d.ts +2 -0
- package/build/operations-v2/write/milestones.d.ts.map +1 -0
- package/build/operations-v2/write/milestones.js +56 -0
- package/build/operations-v2/write/milestones.js.map +1 -0
- package/build/operations-v2/write/plans.d.ts +2 -0
- package/build/operations-v2/write/plans.d.ts.map +1 -0
- package/build/operations-v2/write/plans.js +55 -0
- package/build/operations-v2/write/plans.js.map +1 -0
- package/build/operations-v2/write/results.d.ts +2 -0
- package/build/operations-v2/write/results.d.ts.map +1 -0
- package/build/operations-v2/write/results.js +72 -0
- package/build/operations-v2/write/results.js.map +1 -0
- package/build/operations-v2/write/runs.d.ts +2 -0
- package/build/operations-v2/write/runs.d.ts.map +1 -0
- package/build/operations-v2/write/runs.js +84 -0
- package/build/operations-v2/write/runs.js.map +1 -0
- package/build/operations-v2/write/shared-steps.d.ts +2 -0
- package/build/operations-v2/write/shared-steps.d.ts.map +1 -0
- package/build/operations-v2/write/shared-steps.js +60 -0
- package/build/operations-v2/write/shared-steps.js.map +1 -0
- package/build/operations-v2/write/suites.d.ts +2 -0
- package/build/operations-v2/write/suites.d.ts.map +1 -0
- package/build/operations-v2/write/suites.js +63 -0
- package/build/operations-v2/write/suites.js.map +1 -0
- package/build/prompts/index.d.ts +31 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +229 -0
- package/build/prompts/index.js.map +1 -0
- package/build/transports/sse.d.ts.map +1 -1
- package/build/transports/sse.js +6 -0
- package/build/transports/sse.js.map +1 -1
- package/build/transports/streamableHttp.d.ts +6 -1
- package/build/transports/streamableHttp.d.ts.map +1 -1
- package/build/transports/streamableHttp.js +128 -16
- package/build/transports/streamableHttp.js.map +1 -1
- package/build/utils/auth-context.d.ts +8 -0
- package/build/utils/auth-context.d.ts.map +1 -1
- package/build/utils/auth-context.js +18 -0
- package/build/utils/auth-context.js.map +1 -1
- package/build/utils/case-enums.d.ts +5 -3
- package/build/utils/case-enums.d.ts.map +1 -1
- package/build/utils/case-enums.js +77 -59
- package/build/utils/case-enums.js.map +1 -1
- package/build/utils/output-schemas.d.ts +16 -0
- package/build/utils/output-schemas.d.ts.map +1 -0
- package/build/utils/output-schemas.js +82 -0
- package/build/utils/output-schemas.js.map +1 -0
- package/build/utils/registry.d.ts +42 -9
- package/build/utils/registry.d.ts.map +1 -1
- package/build/utils/registry.js +64 -11
- package/build/utils/registry.js.map +1 -1
- package/build/utils/response-shape.d.ts +23 -0
- package/build/utils/response-shape.d.ts.map +1 -0
- package/build/utils/response-shape.js +73 -0
- package/build/utils/response-shape.js.map +1 -0
- package/build/utils/rich-response.d.ts +58 -0
- package/build/utils/rich-response.d.ts.map +1 -0
- package/build/utils/rich-response.js +93 -0
- package/build/utils/rich-response.js.map +1 -0
- package/build/utils/server-context.d.ts +65 -0
- package/build/utils/server-context.d.ts.map +1 -0
- package/build/utils/server-context.js +67 -0
- package/build/utils/server-context.js.map +1 -0
- package/build/version.d.ts +1 -1
- package/build/version.js +1 -1
- package/docs/connect.md +81 -0
- package/docs/migration.md +351 -0
- package/docs/self-run.md +270 -0
- package/docs/tools.md +111 -0
- package/docs/troubleshooting.md +144 -0
- package/package.json +11 -2
- package/server.json +8 -2
- package/build/operations/attachments.d.ts +0 -8
- package/build/operations/attachments.d.ts.map +0 -1
- package/build/operations/attachments.js +0 -146
- package/build/operations/attachments.js.map +0 -1
- package/build/operations/authors.d.ts +0 -8
- package/build/operations/authors.d.ts.map +0 -1
- package/build/operations/authors.js +0 -70
- package/build/operations/authors.js.map +0 -1
- package/build/operations/cases.d.ts +0 -8
- package/build/operations/cases.d.ts.map +0 -1
- package/build/operations/cases.js +0 -370
- package/build/operations/cases.js.map +0 -1
- package/build/operations/configurations.d.ts +0 -10
- package/build/operations/configurations.d.ts.map +0 -1
- package/build/operations/configurations.js +0 -125
- package/build/operations/configurations.js.map +0 -1
- package/build/operations/custom-fields.d.ts +0 -8
- package/build/operations/custom-fields.d.ts.map +0 -1
- package/build/operations/custom-fields.js +0 -172
- package/build/operations/custom-fields.js.map +0 -1
- package/build/operations/defects.d.ts +0 -8
- package/build/operations/defects.d.ts.map +0 -1
- package/build/operations/defects.js +0 -256
- package/build/operations/defects.js.map +0 -1
- package/build/operations/environments.d.ts +0 -8
- package/build/operations/environments.d.ts.map +0 -1
- package/build/operations/environments.js +0 -154
- package/build/operations/environments.js.map +0 -1
- package/build/operations/milestones.d.ts +0 -8
- package/build/operations/milestones.d.ts.map +0 -1
- package/build/operations/milestones.js +0 -155
- package/build/operations/milestones.js.map +0 -1
- package/build/operations/plans.d.ts +0 -8
- package/build/operations/plans.d.ts.map +0 -1
- package/build/operations/plans.js +0 -158
- package/build/operations/plans.js.map +0 -1
- package/build/operations/projects.d.ts +0 -8
- package/build/operations/projects.d.ts.map +0 -1
- package/build/operations/projects.js +0 -192
- package/build/operations/projects.js.map +0 -1
- package/build/operations/results.d.ts +0 -8
- package/build/operations/results.d.ts.map +0 -1
- package/build/operations/results.js +0 -214
- package/build/operations/results.js.map +0 -1
- package/build/operations/runs.d.ts +0 -8
- package/build/operations/runs.d.ts.map +0 -1
- package/build/operations/runs.js +0 -224
- package/build/operations/runs.js.map +0 -1
- package/build/operations/search.d.ts.map +0 -1
- package/build/operations/search.js.map +0 -1
- package/build/operations/shared-parameters.d.ts +0 -10
- package/build/operations/shared-parameters.d.ts.map +0 -1
- package/build/operations/shared-parameters.js +0 -93
- package/build/operations/shared-parameters.js.map +0 -1
- package/build/operations/shared-steps.d.ts +0 -8
- package/build/operations/shared-steps.d.ts.map +0 -1
- package/build/operations/shared-steps.js +0 -160
- package/build/operations/shared-steps.js.map +0 -1
- package/build/operations/suites.d.ts +0 -8
- package/build/operations/suites.d.ts.map +0 -1
- package/build/operations/suites.js +0 -169
- package/build/operations/suites.js.map +0 -1
- package/build/operations/system-fields.d.ts +0 -10
- package/build/operations/system-fields.d.ts.map +0 -1
- package/build/operations/system-fields.js +0 -47
- package/build/operations/system-fields.js.map +0 -1
- package/build/operations/users.d.ts +0 -10
- package/build/operations/users.d.ts.map +0 -1
- package/build/operations/users.js +0 -78
- package/build/operations/users.js.map +0 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# Migration Guide: v1 → v2
|
|
2
|
+
|
|
3
|
+
> **Breaking change**: v2 replaces all 83 v1 tool names with a consolidated set of 29 task-oriented tools (30 total, including the `qase_discover_tools` discovery tool).
|
|
4
|
+
> Every tool name has changed. Update your prompts, workflows, and any automation that references tool names.
|
|
5
|
+
|
|
6
|
+
## What changed at a glance
|
|
7
|
+
|
|
8
|
+
| Area | v1 | v2 |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| Tool count | 83 | 29 task-oriented (30 total) |
|
|
11
|
+
| Naming convention | snake_case verbs (`list_cases`, `create_run`) | `qase_` prefix + noun+verb (`qase_case_upsert`) |
|
|
12
|
+
| Read tools | One tool per entity type | `qase_get` handles all entity types |
|
|
13
|
+
| List/search | Separate `list_*` per entity | `qql_search` with `entity=` parameter |
|
|
14
|
+
| Metadata bootstrap | 6 separate list calls | `qase_project_context` (single call, cached) |
|
|
15
|
+
| CI reporting | 3–4 manual steps | `qase_ci_report` composite |
|
|
16
|
+
| Response format | Pretty-printed JSON, nulls included | Compact JSON (no indent), nulls stripped |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Tool mapping table
|
|
21
|
+
|
|
22
|
+
All 83 v1 tools mapped to their v2 equivalents.
|
|
23
|
+
|
|
24
|
+
### Projects
|
|
25
|
+
|
|
26
|
+
| v1 tool | v2 equivalent | Notes |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `list_projects` | `qase_project_context` | Returns project + suites + milestones + envs + custom fields + users in one call |
|
|
29
|
+
| `get_project` | `qase_get` with `entity="project"` | No `code` required; pass project code as `id` |
|
|
30
|
+
| `create_project` | `qase_api` | Use escape hatch: `POST /project` |
|
|
31
|
+
| `delete_project` | `qase_api` | Use escape hatch: `DELETE /project/{code}` |
|
|
32
|
+
| `grant_project_access` | `qase_api` | Use escape hatch: `POST /project/{code}/access` |
|
|
33
|
+
| `revoke_project_access` | `qase_api` | Use escape hatch: `DELETE /project/{code}/access` |
|
|
34
|
+
|
|
35
|
+
### Test Cases
|
|
36
|
+
|
|
37
|
+
| v1 tool | v2 equivalent | Notes |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `list_cases` | `qql_search` with `entity="case"` | Supports full QQL filters |
|
|
40
|
+
| `get_case` | `qase_get` with `entity="case"` | Supports `fields` projection |
|
|
41
|
+
| `create_case` | `qase_case_upsert` (omit `id`) | Pass all case fields; no `id` = create |
|
|
42
|
+
| `update_case` | `qase_case_upsert` (include `id`) | Include `id` to update existing case |
|
|
43
|
+
| `delete_case` | `qase_case_delete` | — |
|
|
44
|
+
| `bulk_create_cases` | `qase_case_bulk_create` | Same shape: `cases` array, up to 100 per call |
|
|
45
|
+
| `attach_external_issue` | `qase_api` | Use escape hatch: `POST /case/{code}/{id}/external-issues` |
|
|
46
|
+
| `detach_external_issue` | `qase_api` | Use escape hatch: `DELETE /case/{code}/{id}/external-issues` |
|
|
47
|
+
|
|
48
|
+
### Test Suites
|
|
49
|
+
|
|
50
|
+
| v1 tool | v2 equivalent | Notes |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `list_suites` | `qase_project_context` | Suites tree is included in context response |
|
|
53
|
+
| `get_suite` | `qase_get` with `entity="suite"` | — |
|
|
54
|
+
| `create_suite` | `qase_suite_upsert` (omit `id`) | — |
|
|
55
|
+
| `update_suite` | `qase_suite_upsert` (include `id`) | — |
|
|
56
|
+
| `delete_suite` | `qase_suite_delete` | — |
|
|
57
|
+
|
|
58
|
+
### Test Runs
|
|
59
|
+
|
|
60
|
+
| v1 tool | v2 equivalent | Notes |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `list_runs` | `qql_search` with `entity="run"` | — |
|
|
63
|
+
| `get_run` | `qase_get` with `entity="run"` | — |
|
|
64
|
+
| `create_run` | `qase_run_upsert` (omit `id`) | Or use `qase_ci_report` / `qase_regression_run` composites |
|
|
65
|
+
| `delete_run` | `qase_run_delete` | — |
|
|
66
|
+
| `complete_run` | `qase_run_complete` | — |
|
|
67
|
+
| `get_run_public_link` | `qase_api` | Use escape hatch: `GET /run/{code}/{id}/public-link` |
|
|
68
|
+
| `delete_run_public_link` | `qase_api` | Use escape hatch: `DELETE /run/{code}/{id}/public-link` |
|
|
69
|
+
|
|
70
|
+
### Test Results
|
|
71
|
+
|
|
72
|
+
| v1 tool | v2 equivalent | Notes |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `list_results` | `qql_search` with `entity="result"` | — |
|
|
75
|
+
| `get_result` | `qase_get` with `entity="result"` | — |
|
|
76
|
+
| `create_result` | `qase_result_record` | Accepts single result or array via `results` |
|
|
77
|
+
| `create_results_bulk` | `qase_result_record` | Same tool handles bulk via `results` array |
|
|
78
|
+
| `update_result` | `qase_api` | Use escape hatch: `PATCH /result/{code}/{id}` |
|
|
79
|
+
| `delete_result` | `qase_result_delete` | — |
|
|
80
|
+
|
|
81
|
+
### Test Plans
|
|
82
|
+
|
|
83
|
+
| v1 tool | v2 equivalent | Notes |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `list_plans` | `qql_search` with `entity="plan"` | — |
|
|
86
|
+
| `get_plan` | `qase_get` with `entity="plan"` | — |
|
|
87
|
+
| `create_plan` | `qase_plan_upsert` (omit `id`) | — |
|
|
88
|
+
| `update_plan` | `qase_plan_upsert` (include `id`) | — |
|
|
89
|
+
| `delete_plan` | `qase_plan_delete` | — |
|
|
90
|
+
|
|
91
|
+
### Defects
|
|
92
|
+
|
|
93
|
+
| v1 tool | v2 equivalent | Notes |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `list_defects` | `qql_search` with `entity="defect"` | — |
|
|
96
|
+
| `get_defect` | `qase_get` with `entity="defect"` | — |
|
|
97
|
+
| `create_defect` | `qase_defect_upsert` (omit `id`) | Or use `qase_triage_defect` composite |
|
|
98
|
+
| `update_defect` | `qase_defect_upsert` (include `id`) | — |
|
|
99
|
+
| `delete_defect` | `qase_defect_delete` | — |
|
|
100
|
+
| `resolve_defect` | `qase_defect_upsert` with `status="resolved"` | Pass `id` + `status` field |
|
|
101
|
+
| `update_defect_status` | `qase_defect_upsert` with `status` field | Pass `id` + desired `status` |
|
|
102
|
+
|
|
103
|
+
### Milestones
|
|
104
|
+
|
|
105
|
+
| v1 tool | v2 equivalent | Notes |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| `list_milestones` | `qase_project_context` | Milestones are included in context response |
|
|
108
|
+
| `get_milestone` | `qase_get` with `entity="milestone"` | — |
|
|
109
|
+
| `create_milestone` | `qase_milestone_upsert` (omit `id`) | — |
|
|
110
|
+
| `update_milestone` | `qase_milestone_upsert` (include `id`) | — |
|
|
111
|
+
| `delete_milestone` | `qase_milestone_delete` | — |
|
|
112
|
+
|
|
113
|
+
### Environments
|
|
114
|
+
|
|
115
|
+
| v1 tool | v2 equivalent | Notes |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `list_environments` | `qase_project_context` | Environments are included in context response |
|
|
118
|
+
| `get_environment` | `qase_get` with `entity="environment"` | — |
|
|
119
|
+
| `create_environment` | `qase_environment_upsert` (omit `id`) | — |
|
|
120
|
+
| `update_environment` | `qase_environment_upsert` (include `id`) | — |
|
|
121
|
+
| `delete_environment` | `qase_environment_delete` | — |
|
|
122
|
+
|
|
123
|
+
### Shared Steps
|
|
124
|
+
|
|
125
|
+
| v1 tool | v2 equivalent | Notes |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| `list_shared_steps` | `qql_search` with `entity="shared_step"` | — |
|
|
128
|
+
| `get_shared_step` | `qase_get` with `entity="shared_step"` | — |
|
|
129
|
+
| `create_shared_step` | `qase_shared_step_upsert` (omit `id`) | — |
|
|
130
|
+
| `update_shared_step` | `qase_shared_step_upsert` (include `id`) | — |
|
|
131
|
+
| `delete_shared_step` | `qase_shared_step_delete` | — |
|
|
132
|
+
|
|
133
|
+
### Shared Parameters
|
|
134
|
+
|
|
135
|
+
| v1 tool | v2 equivalent | Notes |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `list_shared_parameters` | `qql_search` with `entity="shared_parameter"` | — |
|
|
138
|
+
| `get_shared_parameter` | `qase_get` with `entity="shared_parameter"` | No `code` required |
|
|
139
|
+
|
|
140
|
+
### Attachments
|
|
141
|
+
|
|
142
|
+
| v1 tool | v2 equivalent | Notes |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| `list_attachments` | `qase_api` | Use escape hatch: `GET /attachment` |
|
|
145
|
+
| `get_attachment` | `qase_get` with `entity="attachment"` | Pass hash as `id` |
|
|
146
|
+
| `upload_attachment` | `qase_attachment_upload` | — |
|
|
147
|
+
| `delete_attachment` | `qase_attachment_delete` | — |
|
|
148
|
+
|
|
149
|
+
### Authors
|
|
150
|
+
|
|
151
|
+
| v1 tool | v2 equivalent | Notes |
|
|
152
|
+
|---|---|---|
|
|
153
|
+
| `list_authors` | `qase_api` | Use escape hatch: `GET /author` |
|
|
154
|
+
| `get_author` | `qase_get` with `entity="author"` | — |
|
|
155
|
+
|
|
156
|
+
### Custom Fields
|
|
157
|
+
|
|
158
|
+
| v1 tool | v2 equivalent | Notes |
|
|
159
|
+
|---|---|---|
|
|
160
|
+
| `list_custom_fields` | `qase_project_context` | Custom fields are included in context response |
|
|
161
|
+
| `get_custom_field` | `qase_get` with `entity="custom_field"` | — |
|
|
162
|
+
| `create_custom_field` | `qase_api` | Use escape hatch: `POST /custom-field` |
|
|
163
|
+
| `update_custom_field` | `qase_api` | Use escape hatch: `PATCH /custom-field/{id}` |
|
|
164
|
+
| `delete_custom_field` | `qase_api` | Use escape hatch: `DELETE /custom-field/{id}` |
|
|
165
|
+
|
|
166
|
+
### System Fields
|
|
167
|
+
|
|
168
|
+
| v1 tool | v2 equivalent | Notes |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| `list_system_fields` | `qase_api` | Use escape hatch: `GET /system-field` |
|
|
171
|
+
|
|
172
|
+
### Configurations
|
|
173
|
+
|
|
174
|
+
| v1 tool | v2 equivalent | Notes |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| `list_configurations` | `qase_get` with `entity="configuration"` | Returns all config groups for a project |
|
|
177
|
+
| `create_configuration_group` | `qase_api` | Use escape hatch: `POST /configuration/{code}` |
|
|
178
|
+
| `delete_configuration_group` | `qase_api` | Use escape hatch: `DELETE /configuration/{code}/{id}` |
|
|
179
|
+
|
|
180
|
+
### Users
|
|
181
|
+
|
|
182
|
+
| v1 tool | v2 equivalent | Notes |
|
|
183
|
+
|---|---|---|
|
|
184
|
+
| `list_users` | `qase_project_context` | Users are included in context response |
|
|
185
|
+
| `get_user` | `qase_get` with `entity="user"` | — |
|
|
186
|
+
|
|
187
|
+
### QQL Search
|
|
188
|
+
|
|
189
|
+
| v1 tool | v2 equivalent | Notes |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `qql_search` | `qql_search` | Unchanged — same tool, same interface |
|
|
192
|
+
| `qql_help` | `qql_help` | Unchanged — same tool, same interface |
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Response format changes
|
|
197
|
+
|
|
198
|
+
In v1, responses were pretty-printed JSON with `null` values included:
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"id": 42,
|
|
203
|
+
"title": "Login test",
|
|
204
|
+
"description": null,
|
|
205
|
+
"preconditions": null,
|
|
206
|
+
"priority": 2
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
In v2, responses are compact JSON with `null` values stripped:
|
|
211
|
+
|
|
212
|
+
```json
|
|
213
|
+
{"id":42,"title":"Login test","priority":2}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
This reduces token usage significantly on large result sets. If your workflow parses response strings directly rather than using structured tool output, update your parsing logic accordingly.
|
|
217
|
+
|
|
218
|
+
Additionally, `qase_get` supports **field projection** via the `fields` parameter:
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{ "entity": "case", "code": "MYPROJECT", "id": 42, "fields": ["id", "title", "status"] }
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Pass `["*"]` to get all fields.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## New composite tools
|
|
229
|
+
|
|
230
|
+
These tools combine multiple API calls into a single operation, reducing round-trips and LLM context usage.
|
|
231
|
+
|
|
232
|
+
### `qase_ci_report`
|
|
233
|
+
|
|
234
|
+
Replaces the 3–4 step workflow of `create_run → create_results_bulk → complete_run`.
|
|
235
|
+
|
|
236
|
+
Accepts a project code, run title, and an array of test results. Creates the run, records all results, and optionally completes it in one call.
|
|
237
|
+
|
|
238
|
+
### `qase_triage_defect`
|
|
239
|
+
|
|
240
|
+
Streamlines the defect triage workflow. Creates a defect from a test failure description and optionally links it to failed result hashes from a run.
|
|
241
|
+
|
|
242
|
+
Replaces: `create_defect` (then manual linking).
|
|
243
|
+
|
|
244
|
+
### `qase_regression_run`
|
|
245
|
+
|
|
246
|
+
Sets up a regression test run in one call. Accepts case selection by suite IDs, explicit case IDs, or plan ID. Creates the run and populates it with all matching cases.
|
|
247
|
+
|
|
248
|
+
Replaces: `list_cases` (per suite) → `create_run` → manually adding cases.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Before / after examples
|
|
253
|
+
|
|
254
|
+
### Example 1: Report CI results
|
|
255
|
+
|
|
256
|
+
**v1 (3 calls)**
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
1. create_run { code: "PROJ", title: "CI Build #42", cases: [101, 102, 103] }
|
|
260
|
+
→ { id: 7 }
|
|
261
|
+
|
|
262
|
+
2. create_results_bulk { code: "PROJ", id: 7, results: [...] }
|
|
263
|
+
|
|
264
|
+
3. complete_run { code: "PROJ", id: 7 }
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**v2 (1 call)**
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
qase_ci_report {
|
|
271
|
+
code: "PROJ",
|
|
272
|
+
title: "CI Build #42",
|
|
273
|
+
results: [
|
|
274
|
+
{ case_id: 101, status: "passed", time_ms: 1200 },
|
|
275
|
+
{ case_id: 102, status: "failed", stacktrace: "AssertionError..." },
|
|
276
|
+
{ case_id: 103, status: "skipped" }
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
→ { run_id: 7, run_status: "complete", results_recorded: 3 }
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
### Example 2: Get project metadata before creating a test case
|
|
285
|
+
|
|
286
|
+
**v1 (up to 6 calls)**
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
1. list_suites { code: "PROJ" }
|
|
290
|
+
2. list_milestones { code: "PROJ" }
|
|
291
|
+
3. list_environments { code: "PROJ" }
|
|
292
|
+
4. list_custom_fields {}
|
|
293
|
+
5. list_users {}
|
|
294
|
+
6. get_project { code: "PROJ" }
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**v2 (1 call)**
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
qase_project_context { code: "PROJ" }
|
|
301
|
+
→ {
|
|
302
|
+
project: { ... },
|
|
303
|
+
suites: { entities: [...] },
|
|
304
|
+
milestones: { entities: [...] },
|
|
305
|
+
environments: { entities: [...] },
|
|
306
|
+
custom_fields: { entities: [...] },
|
|
307
|
+
users: { entities: [...] }
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Result is cached for 5 minutes — subsequent calls within the same session return instantly.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
### Example 3: Create or update a test case
|
|
316
|
+
|
|
317
|
+
**v1 (separate tools for create vs update)**
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
# Create:
|
|
321
|
+
create_case { code: "PROJ", title: "Login happy path", priority: "high" }
|
|
322
|
+
|
|
323
|
+
# Update:
|
|
324
|
+
update_case { code: "PROJ", id: 55, title: "Login happy path v2" }
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**v2 (single upsert tool)**
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
# Create (no id):
|
|
331
|
+
qase_case_upsert { code: "PROJ", title: "Login happy path", priority: "high" }
|
|
332
|
+
|
|
333
|
+
# Update (with id):
|
|
334
|
+
qase_case_upsert { code: "PROJ", id: 55, title: "Login happy path v2" }
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Escape hatch for unsupported operations
|
|
340
|
+
|
|
341
|
+
For v1 operations that have no direct v2 equivalent (project management, configuration groups, system fields, etc.), use `qase_api`:
|
|
342
|
+
|
|
343
|
+
```
|
|
344
|
+
qase_api {
|
|
345
|
+
method: "GET",
|
|
346
|
+
path: "/system-field",
|
|
347
|
+
query: {}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
This gives direct access to any Qase REST API endpoint. See the `qase_api` tool description for full parameter documentation.
|
package/docs/self-run.md
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# Self-Run Guide (Local / stdio)
|
|
2
|
+
|
|
3
|
+
Run the Qase MCP Server yourself, using your own `QASE_API_TOKEN`. This is the local/stdio path: you install the package (or build from source) and your MCP client launches it as a subprocess.
|
|
4
|
+
|
|
5
|
+
Prefer zero-install? Connect to the Qase-hosted MCP server instead — no local setup, no API token. See [Connect to the hosted Qase MCP](connect.md).
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 20+
|
|
10
|
+
- Qase account with API token ([Get your token](https://app.qase.io/user/api/token))
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
### Option 1: Install from NPM (Recommended)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @qase/mcp-server
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Option 2: Install from Source (Development)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Clone the repository
|
|
24
|
+
git clone https://github.com/qase-tms/qase-mcp-server.git
|
|
25
|
+
cd qase-mcp-server
|
|
26
|
+
|
|
27
|
+
# Install dependencies
|
|
28
|
+
npm install
|
|
29
|
+
|
|
30
|
+
# Build the server
|
|
31
|
+
npm run build
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Configuration
|
|
35
|
+
|
|
36
|
+
### Environment Variables
|
|
37
|
+
|
|
38
|
+
Create a `.env` file or set environment variables:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Required: Your Qase API token
|
|
42
|
+
QASE_API_TOKEN=your_api_token_here
|
|
43
|
+
|
|
44
|
+
# Optional: Custom API domain for enterprise customers
|
|
45
|
+
QASE_API_DOMAIN=api.qase.io
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Get your API token from: https://app.qase.io/user/api/token
|
|
49
|
+
|
|
50
|
+
### Custom Domains (Enterprise)
|
|
51
|
+
|
|
52
|
+
If you're using Qase Enterprise with a custom domain:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
QASE_API_DOMAIN=api.yourcompany.qase.io
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Client Setup (stdio)
|
|
59
|
+
|
|
60
|
+
### Claude Desktop
|
|
61
|
+
|
|
62
|
+
Add to your Claude Desktop configuration file:
|
|
63
|
+
|
|
64
|
+
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
65
|
+
**Windows**: `%APPDATA%/Claude/claude_desktop_config.json`
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"qase": {
|
|
71
|
+
"command": "npx",
|
|
72
|
+
"args": ["-y", "@qase/mcp-server"],
|
|
73
|
+
"env": {
|
|
74
|
+
"QASE_API_TOKEN": "your_api_token_here"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or, if installed from source:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"qase": {
|
|
87
|
+
"command": "node",
|
|
88
|
+
"args": ["/absolute/path/to/qase-mcp-server/build/index.js"],
|
|
89
|
+
"env": {
|
|
90
|
+
"QASE_API_TOKEN": "your_api_token_here"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Cursor
|
|
98
|
+
|
|
99
|
+
> Prefer no install and no API token? Connect Cursor to the hosted server instead — see [Connect to the hosted Qase MCP](connect.md).
|
|
100
|
+
|
|
101
|
+
To run the server locally with your own token:
|
|
102
|
+
|
|
103
|
+
1. Open Cursor Settings
|
|
104
|
+
2. Navigate to MCP settings
|
|
105
|
+
3. Add the Qase MCP server:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcpServers": {
|
|
110
|
+
"qase": {
|
|
111
|
+
"command": "npx",
|
|
112
|
+
"args": ["-y", "@qase/mcp-server"],
|
|
113
|
+
"env": {
|
|
114
|
+
"QASE_API_TOKEN": "your_api_token_here"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Claude Code
|
|
122
|
+
|
|
123
|
+
You can add the Qase MCP server to Claude Code using the CLI command:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
claude mcp add qase -- npx -y @qase/mcp-server
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Set the required environment variable:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
export QASE_API_TOKEN=your_api_token_here
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Alternatively, add a `.mcp.json` file to your project root for automatic project-scoped configuration:
|
|
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
|
+
You can also use the `--scope` flag to choose where the configuration is stored:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Project-scoped (saved in .mcp.json)
|
|
155
|
+
claude mcp add --scope project qase -- npx -y @qase/mcp-server
|
|
156
|
+
|
|
157
|
+
# User-scoped (available in all projects)
|
|
158
|
+
claude mcp add --scope user qase -- npx -y @qase/mcp-server
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### OpenAI Codex CLI
|
|
162
|
+
|
|
163
|
+
Add a `.codex/config.json` file to your project root:
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"mcpServers": {
|
|
168
|
+
"qase": {
|
|
169
|
+
"command": "npx",
|
|
170
|
+
"args": ["-y", "@qase/mcp-server"],
|
|
171
|
+
"env": {
|
|
172
|
+
"QASE_API_TOKEN": "your_api_token_here"
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Set the required environment variable before running Codex:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
export QASE_API_TOKEN=your_api_token_here
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### OpenCode
|
|
186
|
+
|
|
187
|
+
Add an `opencode.json` file to your project root (or `~/.config/opencode/opencode.json` for global configuration):
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"mcp": {
|
|
192
|
+
"qase": {
|
|
193
|
+
"type": "local",
|
|
194
|
+
"command": ["npx", "-y", "@qase/mcp-server"],
|
|
195
|
+
"environment": {
|
|
196
|
+
"QASE_API_TOKEN": "your_api_token_here"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
> **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`).
|
|
204
|
+
|
|
205
|
+
## Transports
|
|
206
|
+
|
|
207
|
+
The server supports multiple transport types for different use cases.
|
|
208
|
+
|
|
209
|
+
### Stdio Transport (Default)
|
|
210
|
+
|
|
211
|
+
Used by MCP clients like Claude Desktop and Cursor:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
npm start
|
|
215
|
+
# or
|
|
216
|
+
npm run start:stdio
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### SSE Transport
|
|
220
|
+
|
|
221
|
+
Server-Sent Events for web-based clients:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npm run start:sse
|
|
225
|
+
# Server runs on http://localhost:3000/sse
|
|
226
|
+
# Health check: http://localhost:3000/health
|
|
227
|
+
# Metrics: http://localhost:3000/metrics
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Streamable HTTP Transport
|
|
231
|
+
|
|
232
|
+
Full HTTP-based transport with session management:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm run start:http
|
|
236
|
+
# Server runs on http://localhost:3000/mcp
|
|
237
|
+
# Health check: http://localhost:3000/health
|
|
238
|
+
# Metrics: http://localhost:3000/metrics
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Custom Configuration
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# Custom port and host
|
|
245
|
+
node build/index.js --transport streamable-http --port 8080 --host 0.0.0.0
|
|
246
|
+
|
|
247
|
+
# Available options:
|
|
248
|
+
# --transport: stdio | sse | streamable-http (default: stdio)
|
|
249
|
+
# --port: Port number (default: 3000)
|
|
250
|
+
# --host: Host address (default: 0.0.0.0)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Monitoring
|
|
254
|
+
|
|
255
|
+
When using SSE or Streamable HTTP transport, a Prometheus-compatible `/metrics` endpoint is available:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
curl http://localhost:3000/metrics
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Metrics include:
|
|
262
|
+
- `qase_mcp_cache_hits_total` / `qase_mcp_cache_misses_total` - Cache hit/miss rates by tier (l1/l2)
|
|
263
|
+
- `qase_mcp_cache_errors_total` - Cache errors by tier
|
|
264
|
+
- `qase_mcp_circuit_breaker_state` - Redis circuit breaker state (0=closed, 1=half_open, 2=open)
|
|
265
|
+
|
|
266
|
+
> **Note:** This page covers running the server yourself with your own `QASE_API_TOKEN` (self-run). It does not cover operating the hosted OAuth proxy — that is internal operator documentation, not part of this guide.
|
|
267
|
+
|
|
268
|
+
## Troubleshooting
|
|
269
|
+
|
|
270
|
+
Server not starting, authentication errors, or connection issues? See [Troubleshooting](troubleshooting.md).
|