Qase MCP Server
OfficialThis server connects AI assistants to the Qase test management platform, letting them read and write test cases, runs, results, defects, suites, milestones, plans, shared steps, environments, attachments, and more through MCP.
Read records: Fetch any entity by type/ID with
qase_get, or bootstrap full project context (suites, milestones, environments, custom fields, users) withqase_project_context.QQL search: Run Qase Query Language searches across cases, runs, results, defects, and plans with
qql_search, plus syntax help viaqql_help.Create/update test cases: Single-case upsert or bulk-create up to 100 cases with labels, steps (classic or Gherkin), attachments, custom fields, and more.
Manage test runs: Create/update runs, record up to 200 results per call, complete runs, or report an entire CI run in one call with
qase_ci_report.Handle defects: Create or update defects, or triage a failure directly into a defect with failure context.
Build regression runs: Launch a run from suites, a test plan, or explicit case IDs with
qase_regression_run.Manage suites: Create or update suites and nest them under parents.
Upload attachments: Upload files (base64 or local path) to get hashes usable across cases, results, and defects.
Discover hidden tools: Use
qase_discover_toolsto activate secondary tools for deletes, milestones, plans, environments, shared steps, parameters, external issue links, reviews, and project/custom-field management.Escape hatch: Call any Qase REST endpoint directly with
qase_apifor operations not covered by dedicated tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Qase MCP Serverlist test cases in project 'Mobile App'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qase MCP Server
Official Model Context Protocol (MCP) server for Qase Test Management Platform — connect AI assistants to your test cases, runs, defects, and more.
Table of Contents
Related MCP server: qtm4j-mcp-server
Overview
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.
Features:
40 task-oriented tools (41 total, including
qase_discover_tools) — consolidated from 83 v1 tools for lower token usage and better LLM accuracyComposite tools — multi-step workflows in a single call: CI reporting, defect triage, regression run setup
QQL support — Qase Query Language for advanced searches across cases, runs, results, defects, and plans
Project context bootstrap — one call returns full project structure (suites, milestones, environments, users, custom fields)
Test case review — propose new cases or changes for review, assign reviewers, and track status (approving and merging remain UI-only)
Tool discovery — secondary tools stay hidden until needed, keeping the default tool list small
Hosted or self-run — connect to
https://mcp.qase.io/mcpwith just your Qase login, or run the server locally with your own API tokenTenant-safe caching & HTTP resilience — two-tier cache (in-memory + optional Redis), connection pooling, retry with backoff
Escape hatch — direct REST API access for any endpoint via
qase_api
Use Cases
Scenario | Example prompt | Tool |
Bootstrap project context | "Show me the structure of project DEMO — suites, milestones, environments" |
|
Create or update a test case | "Create a high-priority smoke test case in project DEMO titled 'Login with valid credentials'" |
|
Report CI results | "Report these CI results for project DEMO: case 1 passed, case 2 failed with 'timeout error'" |
|
Triage a failed test | "Create a critical defect for the login timeout failure in run #42" |
|
Search with QQL | "Find all failed test results from the last 7 days in project DEMO" |
|
See Tools and docs/tools.md for the full reference.
Quick Start
Use the hosted Qase MCP (recommended)
No install, no API token — connect to the Qase-hosted server and sign in with your Qase account.
Note: The hosted Qase MCP requires the Enterprise plan and a workspace on Qase's main cloud (
qase.io). On another plan, or on a dedicated instance, run the server yourself with your own API token — that works everywhere.
Claude — open Settings → Connectors, find Qase Test Management, click Connect.
Cursor — add
{"mcpServers": {"qase": {"url": "https://mcp.qase.io/mcp"}}}to.cursor/mcp.json.Codex — add the URL
https://mcp.qase.io/mcpin Settings → MCPs → Add server, or configure~/.codex/config.tomlfor the CLI.VS Code — add
{"servers": {"qase": {"type": "http", "url": "https://mcp.qase.io/mcp"}}}to.vscode/mcp.json, or run MCP: Add Server.
Full per-client steps, other clients, and the active-workspace model: docs/connect.md.
Run it yourself
Install the package and provide your own API token:
npm install -g @qase/mcp-server
export QASE_API_TOKEN=your_api_token_hereThen 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.
Building on top of this server
For integration authors only — if you use the server directly, nothing here applies to you.
If your product drives this server (a plugin, an agent, a wrapper CLI), it can identify itself so its usage is attributable in Qase analytics, independently of which AI host is connected:
QASE_MCP_INTEGRATION=quality-supervisor/1.4.0 # <name>/<version>, version optionalThe name must be on the allowlist in src/utils/integration-marker.ts — add yours in a PR. Anything unlisted or malformed is ignored, and the API call still succeeds. HTTP transports also accept the marker per request (X-Qase-Integration header or ?integration=). Details: docs/self-run.md.
Upgrading from v1
v2 consolidated 83 v1 tools into 29 task-oriented tools (30 total, including a discovery tool), and has since grown to 36 (37 total). Tool names and response shapes have changed. See docs/migration.md for the complete tool mapping table, response format changes, and before/after examples.
Tools
41 tools across 6 groups (40 task-oriented tools plus qase_discover_tools for on-demand activation of secondary tools). 17 are listed from the start; the rest stay hidden until qase_discover_tools activates them:
Group | Count | Description |
Read | 2 | Fetch any entity by type/ID, or bootstrap full project context in one call |
QQL | 2 | Search across cases, runs, results, defects, and plans with Qase Query Language |
Write | 32 | 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; propose and manage test case reviews |
Composite | 3 | Multi-step workflows in one call: CI reporting, defect triage, regression run setup |
Escape hatch | 1 | Direct REST API access for any endpoint not covered by the tools above |
Meta | 1 |
|
Full tool-by-tool reference with parameters and the discovery model: docs/tools.md.
Documentation
docs/connect.md — connect to the hosted Qase MCP (Claude, Cursor, Codex, other clients)
docs/self-run.md — install and run the server yourself (config, clients, transports)
docs/tools.md — full tool reference, groups, and the discovery model
docs/troubleshooting.md — auth, OAuth/connector, and SSL issues
docs/migration.md — v1 → v2 tool mapping and migration guide
Contributing
Contributions are welcome! See CONTRIBUTING.md for development setup, testing, and linting guidelines.
License
MIT License — see LICENSE for details.
Support
Documentation: https://docs.qase.io/en/articles/14984302-qase-mcp-server
Email: support@qase.io
GitHub Issues: https://github.com/qase-tms/qase-mcp-server/issues
Links
Qase Platform: https://qase.io
Qase Documentation: https://help.qase.io
API Documentation: https://developers.qase.io
MCP Protocol: https://modelcontextprotocol.io
Issue Tracker: https://github.com/qase-tms/qase-mcp-server/issues
Available Tools
17 toolsqase_apiCall Qase APIAInspect
Call any Qase REST endpoint directly, for the few things no dedicated tool covers. Pass the HTTP method, a path starting with a version segment such as /v1/, and an optional body or query. The path must be an endpoint path on the configured Qase host; a full URL, or one that resolves to another host, is refused. See developers.qase.io for the reference. Prefer a dedicated tool wherever one exists: they normalize enums, validate arguments before spending a round trip, and shape the response for a model. This one hands back whatever the API returns. It sends JSON only and cannot upload files — multipart uploads go through qase_attachment_upload. A DELETE through this tool asks for confirmation the same way the dedicated delete tools do. Cost: one API call, typically 0.3-1.5s depending on the endpoint. No caching, no pagination help, no retries beyond the client defaults.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body for POST/PUT/PATCH | |
| path | Yes | API path starting with a version segment (e.g., "/v1/project/DEMO/run") | |
| query | No | Query parameters | |
| method | No | HTTP method | GET |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that it sends JSON only, cannot upload files, asks confirmation for DELETE, returns raw API responses, and has no caching, pagination, or retries. It also states typical cost/time. This substantially exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical, but every sentence earns its place: purpose, path constraints, alternatives, body/format limits, confirmation behavior, performance, and caveats. It is front-loaded with the core purpose and structured logically, with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic passthrough tool with no output schema, the description covers path formulation, host restriction, HTTP methods, body/query, file upload exclusion, DELETE confirmation, cost, and limitations. This is sufficient for a model to decide when to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are already documented in the schema (100% coverage), so the baseline is 3. The description adds genuine extra meaning by explaining that the path must target the configured Qase host and that full URLs are refused, while also clarifying the default GET method and optional body/query.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Call') and a clear resource ('any Qase REST endpoint'), and explicitly frames it as the fallback for 'the few things no dedicated tool covers.' This differentiates it from the dedicated sibling tools immediately and explains the path format and optional body/query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Prefer a dedicated tool wherever one exists' and explains why, then routes file uploads to qase_attachment_upload. This gives the agent crisp when-to-use vs. alternatives guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_attachment_uploadUpload attachmentAInspect
Upload files and get back the hashes that other tools reference them by — screenshots, logs, HAR files, videos. For one file pass file_base64 with the base64-encoded bytes, or file_path with an absolute path, plus filename with its extension. For several, pass files — one entry per file, each with its own filename — and they go up in a single request, hashes returned in the same order. Use file_base64 unless the server runs on the same machine as the file: a remote server, the hosted connector included, cannot see your filesystem, and file_path will simply not find the file. Qase accepts at most 20 files, 32 MB per file and 128 MB per request; a request over any of those is refused here before anything is sent, so split it across calls. The returned hash is what goes in the attachments field of qase_case_upsert, qase_result_record, qase_defect_upsert or qase_triage_defect — uploading alone attaches nothing, the hash has to be passed on. This is the only tool that sends multipart/form-data, which is why qase_api cannot send them. Upload once and reuse the hash rather than re-uploading the same evidence per case. Cost: one API call per request whatever the number of files, dominated by total size rather than round trip — well under a second for a screenshot, seconds for a video. Base64 inflates the payload by about a third.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| file | No | Deprecated: prefer file_base64 or file_path, which say which one you mean. Accepts either an absolute path to an existing file or base64 content. | |
| files | No | Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order. | |
| filename | No | Original filename with extension. Required for the single-file form. | |
| file_path | No | Single-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead. | |
| file_base64 | No | Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses important behavior: uploads alone attach nothing, hashes are returned in input order, requests over 20 files/32 MB per file/128 MB total are refused before being sent, and there is one API call per request with cost implications and base64 inflation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and the most critical usage constraints, and it is dense rather than padded. It is slightly longer than strictly necessary and some details repeat schema descriptions, but the extra cost and performance context earns most of its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return value (hashes) and how those hashes are consumed by sibling tools. It covers validation limits, the local/remote filesystem distinction, and the integration path into attachments fields, so an agent has enough context to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds real selection semantics: single-file forms via file_base64/file_path plus filename, multi-file form via files, and the exact condition for choosing file_base64 over file_path. It also clarifies that hashes come back in the same order as the files.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: uploading files and returning the hashes other tools reference. It names example content types (screenshots, logs, HAR files, videos) and distinguishes itself from siblings by noting it is the only tool that sends multipart/form-data, which qase_api cannot do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: use file_base64 unless the server is local, since a remote server cannot see the filesystem. It also names the alternative (qase_api) and why it cannot handle this case, and advises reusing hashes instead of re-uploading per case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_case_bulk_createBulk create test casesAInspect
Create up to 100 test cases in one request — the batch form of qase_case_upsert, and the right tool whenever more than one case is being written. Takes a list of cases with the same fields and the same enum handling as qase_case_upsert: labels ("high", "blocker") or numeric IDs both work, steps classic or Gherkin. The batch is validated as a whole, so an invalid item means nothing is created, and each item is then reported individually. Returns the IDs in the order submitted. This creates only; to change an existing case use qase_case_upsert with its id. Cost: one API call regardless of batch size. Ten cases measured 1.2s here against 5.6s as ten separate qase_case_upsert calls — four times faster and one tenth of the calls. Split larger imports across several calls.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| cases | Yes | Test cases to create, 1 to 100 per call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses atomicity ('batch is validated as a whole, so an invalid item means nothing is created'), return behavior ('Returns the IDs in the order submitted'), and performance characteristics ('four times faster and one tenth of the calls'). These go well beyond the annotations, which only indicate openWorldHint and non-destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it front-loads the core purpose and sibling distinction, then explains batch behavior, return format, and performance. The structure flows logically from what to use, to how it behaves, to cost/benefit. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested steps, multiple enum fields, shared steps), the description covers the essential behavioral aspects that an agent must know: atomicity, return order, and the relationship to qase_case_upsert for field semantics. It also covers the performance consideration for deciding between batch and individual calls. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: it clarifies enum handling ('labels ("high", "blocker") or numeric IDs both work'), steps formats ('steps classic or Gherkin'), and the atomicity of the `cases` parameter. This enhances understanding of how parameters behave, moving beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates up to 100 test cases in one request and explicitly positions itself as the batch form of qase_case_upsert. The verb and resource are specific, and the description immediately distinguishes it from the sibling tool, making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'the right tool whenever more than one case is being written.' Also provides exclusion guidance: 'This creates only; to change an existing case use qase_case_upsert with its `id`.' Additionally advises splitting larger imports across multiple calls, covering both when and when-not scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_case_upsertCreate or update test caseAInspect
Create or update a single test case. With id it updates that case, without id it creates a new one. Enum fields (priority, severity, type, layer, behavior, automation, is_flaky) accept either a label such as "high" or "blocker" or the project's numeric ID — the server normalizes both. Steps can be classic action/expected pairs or Gherkin, and may reference shared steps by hash. Writing more than one case? Use qase_case_bulk_create instead: it takes a list and sends one request. If the project has "Test case review" enabled, direct writes may need to go through a review — run qase_discover_tools with "review" for those tools. Cost: one API call, about 0.6s to create and 0.4s to update. Ten sequential calls measured 5.6s against 1.2s for one qase_case_bulk_create writing the same ten, so a loop is roughly four times slower.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Case ID — if provided, updates the case; if omitted, creates a new one | |
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| tags | No | Tag names, e.g. ["smoke", "billing"] | |
| type | No | Type label or numeric ID | |
| layer | No | Layer label or numeric ID | |
| steps | No | Ordered test steps; omit for a case without steps | |
| title | Yes | Test case title | |
| status | No | Status label or numeric ID | |
| behavior | No | Behavior label or numeric ID | |
| is_flaky | No | Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too. | |
| priority | No | Priority label or numeric ID (0=not set, 1=high, 2=medium, 3=low) | |
| severity | No | Severity label or numeric ID | |
| suite_id | No | ID of the suite that holds the case | |
| automation | No | Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated) | |
| steps_type | No | How steps are written: "classic" action/expected pairs, or "gherkin" scenario text | |
| attachments | No | Attachment hashes from qase_attachment_upload | |
| description | No | Free-form description of what the case covers | |
| custom_field | No | Custom field values keyed by field ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the case belongs to | |
| preconditions | No | State the system must be in before the steps run | |
| postconditions | No | State to restore or verify after the steps run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds substantive behavior: enum labels and numeric IDs are normalized by the server, steps support classic/Gherkin/shared-hash references, and direct writes may be gated by 'Test case review.' It even discloses measured latency and cost tradeoffs, which no annotation captures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core create/update behavior, then moves through enum normalization, steps, bulk alternative, review caveat, and cost data. Every sentence carries distinct information; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-parameter nested-object tool with no output schema, the description covers the operational decisions an agent actually needs: when to create vs. update, when to switch to bulk, how enum values are normalized, how shared steps are referenced, and how review may block writes. The tradeoff of not stating the success return payload is minor against the richness of the schema and the behavioral guidance provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% parameter description coverage, so the baseline is 3, but the description adds genuinely useful cross-cutting semantics: the label-or-ID normalization rule, the boolean-accepted-for-is_flaky behavior, and the classic-vs-Gherkin step distinction. This goes well beyond restating individual parameter schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair: 'Create or update a single test case.' It immediately explains the id-based branch that selects create vs. update, and it explicitly distinguishes itself from qase_case_bulk_create. An agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Writing more than one case? Use qase_case_bulk_create instead.' It also explains when to consult qase_discover_tools for review-enabled projects. This is direct when-to-use and when-not-to-use guidance, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_ci_reportReport CI resultsAInspect
Report a whole CI run in one call: creates the run, records every result, and completes it. This is the tool for a pipeline that has just finished — it replaces qase_run_upsert, then qase_result_record, then qase_run_complete, and leaves no half-open run behind if the agent stops early. Each result needs a numeric case_id plus a status, and may carry duration, comment, stacktrace and attachment hashes. Use qase_result_record instead when the run already exists and results arrive in stages; use qase_run_upsert when you need the run left open. A batch larger than 200 is split across requests for you, up to 2000 results in one report. Cost: one tool call covering three API operations, plus one extra request per 200 results. A run with two results measured about 0.7s, against roughly 1.5s for the same work as three separate calls, and it grows with the number of results rather than with the number of round trips.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| title | Yes | Run title (e.g., "CI Build #1234") | |
| results | Yes | Test results to record, 1 to 2000 per call | |
| complete | No | Complete the run after recording results (default: true) | |
| is_autotest | No | Mark as automated run (default: true) | |
| environment_id | No | ID of the environment the build ran against |
Output Schema
| Name | Required | Description |
|---|---|---|
| run_id | Yes | Created run ID |
| run_status | Yes | |
| results_recorded | Yes | Number of results recorded |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnly=false, openWorld=true, idempotent=false, destructive=false, so mutation is expected. The description adds valuable behavior beyond that: it guarantees no half-open run if the agent stops early, auto-splits batches larger than 200, caps at 2000 results, and states cost/latency tradeoffs versus three separate calls. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but front-loads the core purpose and usage, then layers in parameter notes, batching, cost, and latency. A small amount of redundancy exists between 'creates the run, records every result, and completes it' and the later replacement list of sibling calls, but each paragraph earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, an output schema exists, and the annotations and schema cover safety and constraints, the description is complete: it explains the orchestration, alternatives, result requirements, batching limits, cost profile, and completion behavior. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds some meaning by emphasizing that each result needs a numeric case_id plus a status and may carry duration, comment, stacktrace, and attachment hashes, but these map directly to schema properties and do not substantially deepen their semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific composite action ('Report a whole CI run in one call') and enumerates the three sub-steps it performs: creates the run, records every result, completes it. It explicitly distinguishes itself from qase_run_upsert, qase_result_record, and qase_run_complete, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'tool for a pipeline that has just finished.' It also names alternatives with conditions: use qase_result_record when the run already exists and results arrive in stages, and qase_run_upsert when the run needs to be left open. This is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_defect_upsertCreate or update defectAInspect
Create or update a defect — a tracked problem found by testing. Without id it creates, with id it updates. Creating one requires title, actual_result and severity; the API rejects a defect missing any of the three. Severity is given as a label ("blocker", "critical", "major", "normal", "minor", "trivial") and the server maps it to the workspace's numeric ID, custom options included. Status is a label too ("open", "in_progress", "resolved", "invalid") and passes through as written; setting it to "resolved" on an existing defect goes through the dedicated resolve endpoint. When the defect comes from a specific test failure, use qase_triage_defect instead. The API has no way to attach runs or results to a defect, so reference the failing results in the text rather than expecting a link. Find existing defects with qql_search before filing a duplicate. Cost: one API call, about 0.5s, plus a cached lookup of the severity options.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Defect ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| tags | No | Tag names, e.g. ["regression", "payments"] | |
| title | Yes | Defect title | |
| status | No | Set to "resolved" to resolve the defect | |
| severity | No | How bad the defect is — required when creating a defect | |
| attachments | No | Attachment hashes from qase_attachment_upload | |
| custom_field | No | Custom field values keyed by field ID, e.g. { "12": "value" } | |
| actual_result | No | What actually happened — required when creating a defect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses crucial behavioral traits: required fields for creation, server-side severity mapping, the status pass-through and dedicated resolve endpoint, the lack of ability to attach runs/results, and the cost (one API call plus a cached lookup). These are non-obvious behaviors that materially affect how the agent invokes the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, then covers requirements, label semantics, alternatives, a limitation, and cost. Every sentence contributes actionable information; no redundancy or filler. It is concise despite its length because it packs unique insights.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no output schema, the description covers all essential aspects: creation requirements, label handling, status behavior, alternative routing, duplicate prevention, and operational cost. It also clarifies a critical limitation (no attaching runs/results). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds significant semantic value: it explains the create vs update logic for `id`, the required-fields constraint for creation, the label-to-ID mapping for `severity`, and the resolve behavior for `status`. This goes well beyond the schema's bare descriptions and helps the agent set parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Create or update') and the resource ('defect'), and explicitly distinguishes it from qase_triage_defect. It also explains the create/update behavior based on presence of `id`, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool vs alternatives: 'When the defect comes from a specific test failure, use qase_triage_defect instead.' It also advises finding existing defects with qql_search before filing a duplicate, preventing redundant calls. This is exactly what an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_discover_toolsDiscover more toolsARead-onlyIdempotentInspect
Find and switch on tools that are hidden by default. Only core tools appear in the tool list; deletes, test plans, milestones, environments, shared steps and parameters, external issue links, case reviews, and project and custom-field management all exist but stay hidden until discovered. Search by what you are trying to do — "delete", "milestone", "plan", "review", "custom field" — and matching tools are activated and become callable. Every word in the query must appear in a tool's name or description, so prefer two or three words over a sentence. Activation is announced to your client with notifications/tools/list_changed: if a tool listed as activated here is still absent from your tool list, your client did not act on that notification — call the same endpoint through qase_api rather than reporting the capability as missing. Never conclude a capability is missing without searching here first. Cost: no API call, matching happens in memory, about 3ms. Free to call as often as needed.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search query to find tools by name or description. Examples: "delete", "milestone", "attachment", "suite" | |
| activate | No | If true (default), found tools are activated and become available for use | |
| category | No | Filter by tool category |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | Number of matching tools |
| tools | Yes | |
| activated | Yes | Number of newly activated tools |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations. It explains the activation mechanism (notifications/tools/list_changed), the in-memory matching behavior, the cost (no API call, ~3ms), and the idempotent nature (free to call as often as needed). It also warns about a potential failure mode (client not acting on the notification) and how to handle it. This is rich behavioral context that annotations alone don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the core purpose and then providing usage details. It's longer than ideal, but every sentence earns its place: the search strategy, activation mechanism, fallback to qase_api, and cost note are all actionable. The only minor issue is that the cost and 'free to call' details could be seen as slightly redundant with the idempotentHint annotation, but they add practical context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a discovery tool with an output schema and rich annotations, the description is complete. It covers what the tool does, how to use it effectively, what to expect after activation, and how to handle edge cases. The output schema presumably describes the list of activated tools, so the description doesn't need to explain return values. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description adds value by explaining the query matching semantics (every word must appear in a tool's name or description) and the activation default behavior. It doesn't add much about the category parameter, but the schema's enum and description cover that adequately. The description's query guidance is genuinely useful beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: find and activate hidden tools. It uses a specific verb ('find and switch on') and resource ('tools that are hidden by default'), and distinguishes itself from siblings by explaining that only core tools appear in the list and this tool discovers the rest. It also names the sibling qase_api as an alternative for a specific scenario, which helps an agent differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: whenever a capability seems missing, search here first before concluding it's absent. It also gives concrete search strategies (use two or three words, every word must match) and explains when to use qase_api instead (if activation notification wasn't acted on). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_getGet recordARead-onlyIdempotentInspect
Fetch one known record by type and ID: case, suite, run, result, plan, defect, milestone, environment, shared_step, shared_parameter, configuration, attachment, author, user, review, or custom_field. code is required for project-scoped entities and can be omitted for global ones (user, author, attachment, custom_field). Narrow the payload with fields, or pass ["*"] for everything. Use this only when you already know the ID and want a single record. For several records, for anything filtered or cross-project, or when you are about to call this in a loop, use qql_search instead — one search returns the whole page at once. Cost: one API call, 0.3-0.5s. Ten of these in sequence measured 5.3s against 1.2s for a single qql_search returning the same ten records, so a loop over IDs is roughly four times slower and ten times more calls.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID (number) or hash (string) | |
| code | No | Project code (required for most entities) | |
| entity | Yes | Entity type to fetch | |
| fields | No | Optional field projection — only return these top-level fields. Pass ["*"] for all fields. | |
| include | No | Comma-separated list of related entities to include in the response. Cases and runs already request their external issue links by default ("external_issues" / "external_issue"); pass this only to override that. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description goes further by adding cost/latency data, a loop-vs-search performance comparison, entity-scoped code requirements, and default include behavior for external issue links — all useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but not padded: purpose first, then usage constraints, then the alternative with concrete performance evidence. The measured benchmark numbers are slightly detailed but directly support the warning against looping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool covering many entity types with no output schema, this description leaves little to inference. It covers invocation pattern, entity scoping, field narrowing, include defaults, alternatives, and performance tradeoffs. Only exact return shape is absent, which is not critical for a single-record fetch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a description, so the baseline is 3. The description adds meaningful nuance: code is required for project-scoped entities but can be omitted for global ones, fields narrows the payload, and include overrides the default external-issue links for cases/runs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Fetch one known record by type and ID') and enumerates the supported entity types, so an agent knows exactly what the tool returns. It also distinguishes itself from qql_search by noting it is for a single known record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool ('only when you already know the ID and want a single record'). It then names the alternative (qql_search) and specifies when to use it instead: for several records, filtered/cross-project queries, or loops.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_project_contextProject contextARead-onlyIdempotentInspect
Seed everything about a project in one call: project details, the full suite tree, milestones, environments, custom fields, and users. This is the first call to make when starting work on a project — it replaces six separate list calls and gives the model the metadata it needs to build any later query. Each collection returns its first 100 entities; the coverage field reports { total, loaded, truncated } per collection, so check it before assuming a list is complete, and pass full: true to page through everything. For a single record you already have the ID for, qase_get is cheaper; for filtered or cross-project questions, use qql_search. Cost: six API calls behind one tool call, 0.5-1.3s cold, and 16-48KB of response depending on project size. Cached for 5 minutes, so repeat calls inside that window return in about 5ms. full: true costs one extra call per 100 entities and can return thousands of items.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| full | No | Page through every suite, milestone, environment, custom field, and user instead of fetching only the first 100 of each (default: false). Use this when a collection is reported as truncated and you need the complete set — it costs one API call per 100 entities and can return thousands of items, so prefer the targeted list tools or qql_search when you only need a subset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| users | No | Team members list |
| suites | Yes | Suites list with entities array |
| project | Yes | Project details |
| coverage | Yes | Per-collection completeness: each of suites, milestones, environments, custom_fields, and users maps to { total, loaded, truncated }. When truncated is true the list holds only the first `loaded` of `total` entities — re-call with full: true for the rest. |
| milestones | Yes | Milestones list |
| environments | Yes | Environments list |
| custom_fields | No | Custom fields list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering the read-only/idempotent safety profile, the description adds substantial behavioral context: cost (six API calls behind one call), cold latency (0.5-1.3s), response size (16-48KB), a 5-minute cache with ~5ms repeat calls, and the truncation/coverage semantics per collection. The warning to check the coverage field before assuming completeness is exactly the kind of behavior an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place, and the structure is optimally front-loaded: purpose first, then when to call, the truncation caveat, alternatives, then cost/caching details. The length looks long, but for a tool that aggregates six calls and has real cost and truncation implications, the density is justified and there is zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex seeding tool, the description covers everything an agent needs: what is returned, truncation behavior and how to detect it, how to get the full set, cost and latency, caching, and routing to alternatives. The presence of an output schema means return shapes need no description, and the annotations carry the safety profile, so this is complete rather than padded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics to the `full` parameter beyond the schema: when to use it (collection reported as truncated), its cost model (one extra call per 100 entities), and its risk (can return thousands of items, prefer targeted tools). The `code` parameter gets no additional description-level semantics, but the schema already fully covers it. One step above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-plus-resource statement ('Seed everything about a project in one call') and enumerates the exact contents (project details, suite tree, milestones, environments, custom fields, users). It actively distinguishes itself from siblings by noting it replaces six list calls and by naming qase_get and qql_search as cheaper or better-suited alternatives for other scenarios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is front and center: 'This is the first call to make when starting work on a project.' It also names concrete when-not-to-use cases with alternatives ('For a single record you already have the ID for, qase_get is cheaper; for filtered or cross-project questions, use qql_search') and reiterates the preference for targeted tools in the full parameter's schema description. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_regression_runBuild regression runAInspect
Build and start a test run from a suite, a test plan, or an explicit list of case IDs, in one step. Use it to launch a regression cycle without first querying for cases and then creating a run around them — give it the source and it resolves the cases itself. For a run you assemble by hand, use qase_run_upsert and pass the case IDs. For a pipeline that has already finished and just needs its results filed, use qase_ci_report instead: this tool opens a run, it does not close one. Cost: two API calls behind one tool call — resolving the source, then creating the run — roughly 1s, growing with the number of cases the source resolves to.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| title | Yes | Run title | |
| plan_id | No | Create run from an existing test plan | |
| suite_ids | No | Include cases from these suites | |
| description | No | What this regression run covers | |
| milestone_id | No | ID of the milestone the run belongs to | |
| include_cases | No | Explicit case IDs to include | |
| environment_id | No | ID of the environment the run executes against |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | No | Full run entity |
| run_id | Yes | Created run ID |
| cases_added | Yes | Number of cases added to the run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the tool costs two API calls behind one tool call, roughly 1s latency growing with resolved case count, and that it opens a run but does not close one. These are concrete side effects and operational traits not inferable from readOnlyHint=false and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with a clear flow: capability, use case, sibling alternatives, cost/latency. No filler or repetition of schema fields; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutating tool with a rich description, annotations, and output schema, this is nearly complete. The only gap is that the 'or' among source types is not made an explicit exactly-one-of rule, and the schema does not enforce it, so an agent could call with none or several sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by framing plan_id, suite_ids, and include_cases as alternative 'sources' and explaining that the tool resolves cases itself, which is meaning beyond individual property descriptions. It does not detail per-parameter syntax, but the schema already carries that burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Build and start a test run from a suite, a test plan, or an explicit list of case IDs.' It also names sibling tools (qase_run_upsert, qase_ci_report) and clarifies what this tool is not ('it does not close one'), so an agent can distinguish it without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('launch a regression cycle without first querying for cases') and when-not-to-use routes: hand-assembled runs go to qase_run_upsert and finished pipelines to qase_ci_report. This is direct alternative selection, not just implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_result_recordRecord test resultsAInspect
Record up to 200 results into an existing run. A case says what should be tested; a result says what happened when it ran — status, duration, comment, stacktrace, attachments — so a result always needs a run to live in. Pass several results in one call rather than calling once per test: the tool takes a list and sends them together. 200 is the ceiling for one call, and a longer list is refused before anything is written — split it into consecutive calls rather than dropping the tail. If the run does not exist yet and this is a finished CI job, qase_ci_report is the single call that creates the run, records the results and completes it, and it splits a larger batch for you. Status is a label, one of "passed", "failed", "blocked", "skipped" or "invalid" — unlike the case enums, numeric IDs are not accepted here. Cost: one API call for the whole list, about 0.5s for a small batch, growing with payload rather than with the number of results.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| run_id | Yes | Run ID to record results into | |
| results | Yes | Results to record, 1 to 200 per call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (only hints), so description carries the burden. It discloses non-read-only nature, batching behavior, refusal of over-limit lists, cost (one API call, latency scaling with payload), and that status accepts only labels (no numeric IDs). This far exceeds annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the main purpose, then logically builds to usage, alternatives, status rules, and cost. Each sentence adds value without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and complex batching rules, the description covers purpose, when to use, batching limits, alternative path, status semantics, and cost. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, so baseline is 3. The description adds meaningful semantics: explains status label enum, that result requires a run, and clarifies the batching parameter. It also clarifies the 'code' and 'run_id' indirectly through the run-existence context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Record up to 200 results into an existing run.' It also distinguishes itself from qase_ci_report and clarifies the relationship between case and result, making it unambiguous among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use qase_ci_report instead (when run doesn't exist and CI job is finished), and advises batching multiple results in one call. It also warns against exceeding the 200 limit and how to handle longer lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_run_completeComplete test runAIdempotentInspect
Mark a test run as complete so it reports as finished rather than in progress. Call it once the results are in; a run left open keeps showing as running and skews dashboards and any "is the release ready" question asked later. Note that completing does not seal the run: the API still accepts results recorded into it afterwards, and they change its counts, so completion is a reporting state rather than a lock. If the results are all in hand at once, qase_ci_report does this as its final step and you do not need this call. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID (positive integer) | |
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=true, but the description adds crucial non-obvious behavior: completing does not seal the run; the API still accepts later results and changes counts. This is a significant behavioral nuance beyond the annotations. The cost estimate also adds transparency. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, usage trigger, consequence, behavioral caveat, alternative, and cost. The purpose is front-loaded, and the caveat is essential context. Nothing is redundant or tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema and no nested objects, the description covers all needed aspects: what it does, when to call it, the non-locking behavior, the alternative tool, and cost. An agent has everything necessary to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters (code and id), so the schema already fully documents them. The description does not add any parameter-level detail, but it doesn't need to. Baseline of 3 is appropriate because the schema carries the burden and the description adds no extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Mark') and resource ('a test run'), and states the precise effect: 'so it reports as finished rather than in progress.' It clearly differentiates from the sibling qase_ci_report by noting that tool does this as its final step, so an agent can distinguish when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call it once the results are in' and explains the consequence of not doing so (skewed dashboards). It also explicitly names the alternative (qase_ci_report) and the condition under which this tool is not needed, leaving no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_run_upsertCreate or update test runAInspect
Create or update a test run. Without id it opens a new run; with id it updates that one. A run is the container results are recorded into, so open it before calling qase_result_record. Optionally scope it to a milestone, an environment, a plan, or an explicit list of case IDs. To build a run from a suite or plan without listing cases yourself, use qase_regression_run. For a CI job that has already finished, use qase_ci_report instead — it opens the run, files the results and closes it in one call, so no half-finished run is left behind. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Run ID — if provided, this is an update (note: Qase API has limited run update support) | |
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| tags | No | Tag names, e.g. ["nightly", "smoke"] | |
| cases | No | Case IDs to include | |
| title | Yes | Run title | |
| plan_id | No | Test plan to base run on | |
| end_time | No | RFC3339 end time | |
| start_time | No | RFC3339 start time | |
| description | No | What this run covers | |
| is_autotest | No | True when the run is produced by automation rather than a person | |
| custom_field | No | Custom field values keyed by field ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the run belongs to | |
| environment_id | No | ID of the environment the run executes against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal this is a non-read, non-idempotent write, and the description builds on that by explaining create-vs-update behavior, the need to open a run before recording results, and that qase_ci_report avoids leaving half-finished runs. It adds meaningful operational context without contradicting annotations, though it could more prominently surface Qase's limited update support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences with zero waste: the core operation and id-based mode switch are front-loaded, followed by lifecycle context, alternatives, and cost. Every sentence earns its place, and none of it merely repeats the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with no output schema, the description covers operation mode, sequencing with qase_result_record, alternative sibling tools, optional scoping, and cost. The schema covers detailed field semantics, so the agent has everything necessary to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by mapping id to the create/update control flow and grouping optional parameters into meaningful scoping dimensions (milestone, environment, plan, explicit case IDs). This helps an agent decide which parameters matter, even though per-field details are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a clear verb-resource pair ('Create or update a test run') and immediately disambiguates the two modes by presence of id. It also distinguishes itself from siblings such as qase_regression_run, qase_ci_report, and qase_result_record, so an agent can tell it apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to call this tool ('open it before calling qase_result_record') and when not to: use qase_regression_run for suite/plan expansion and qase_ci_report for finished CI jobs. This is strong when/when-not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_suite_upsertCreate or update suiteAInspect
Create or update a test suite — the folder cases live in. Without id it creates, with id it updates. Nest a suite by passing parent_id; the whole existing tree comes back from qase_project_context, so read that first rather than guessing at parent IDs. Building a deep tree means one call per node, so create parents before children and reuse the IDs returned. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Suite ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| title | Yes | Suite title | |
| parent_id | No | Parent suite ID for nesting | |
| description | No | What this suite groups — shown under the suite title in the tree | |
| preconditions | No | Setup every case in this suite assumes, inherited by its child suites |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, openWorldHint=true, and idempotentHint=false, so the description doesn't need to restate those. It adds behavioral context by disclosing the cost (one API call, ~0.5s) and the single-call-per-node limitation, which is not available from annotations. It also hints at non-idempotency by noting the upsert behavior, though that is also clear from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each carrying essential information: the core purpose, the create/update distinction, and the nesting workflow plus cost. There is no redundancy or filler; every sentence earns its place, and critical info (upsert semantics) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and no output schema, the description covers the key operational necessities: how to determine create vs update, when to consult project_context, the per-node call limitation, and the need to reuse returned IDs. It does not explicitly describe the return format, but it implies the tool returns IDs (reuse the IDs returned), which is sufficient for correct invocation. Minor gaps remain, but for the complexity it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented. The description adds workflow-level meaning beyond the schema: it explains that parent_id should be sourced from project_context and that the returned IDs should be reused when building deep trees. This adds practical value to understanding how to combine parameters effectively, which is above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates or updates a test suite ('the folder cases live in'), with a specific verb and resource. It distinguishes it from similar tools like qase_case_upsert by explicitly naming the resource type. The id-based create/update behavior is stated upfront, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it says to read qase_project_context first rather than guessing parent IDs, and explains the one-call-per-node constraint for deep trees, telling users to create parents before children. This directly aids in correct usage and points to a sibling tool for needed context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_triage_defectTriage failure into defectAInspect
Create a defect from a test failure, with the failure context written into it. Requires title, actual_result and severity — the API rejects a defect missing any of the three. Note: the API offers no way to attach existing runs or results to a defect. The runs and results seen on a defect in the UI are populated by the test runner when it reports a result as a defect, so there is nothing to pass here for that — reference the failing results inside actual_result instead, and do not expect a link to appear. For a defect unrelated to a test failure use qase_defect_upsert. Cost: one API call, about 0.5s. Triaging a whole run means one call per defect, so cluster identical failures and file one defect per distinct cause rather than one per failed test.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code (2-10 uppercase letters, numbers, or underscores) | |
| tags | No | Tag names, e.g. ["regression", "payments"] | |
| title | Yes | Defect title | |
| severity | Yes | Required by the API | |
| attachments | No | Attachment hashes from qase_attachment_upload | |
| description | No | Extra context beyond the observed behavior | |
| custom_field | No | Custom field values keyed by field ID, e.g. { "12": "value" } | |
| actual_result | Yes | Observed behavior. Required by the API |
Output Schema
| Name | Required | Description |
|---|---|---|
| defect | No | Full defect entity |
| defect_id | Yes | Created defect ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining API rejection behavior for missing required fields, the impossibility of attaching existing runs/results, why no link will appear, and the cost profile (about 0.5s per call, one call per defect). This gives the agent crucial execution expectations. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, required fields, a key API limitation, alternative tool, cost, and triage strategy. It is front-loaded with the core purpose and stays focused despite covering a complex behavioral caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 8 parameters, and output schema, the description covers the essential operational context: when to use it, what the API rejects, what to expect in the UI, how to handle failure context, and how to batch triage efficiently. The output schema exists, so not restating return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful guidance beyond the schema, especially for actual_result: 'reference the failing results inside actual_result instead' and 'do not expect a link to appear'. It also reinforces that title, actual_result, and severity are mandatory, which complements the schema's required list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Create a defect from a test failure' and clarifies the distinguishing scope, including what the tool is not for by pointing to qase_defect_upsert for unrelated defects. This clearly separates it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use for test failures, and for unrelated defects use qase_defect_upsert. It also provides practical usage advice for batch triage: cluster identical failures and file one defect per distinct cause rather than one per failed test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qql_helpQQL syntax helpARead-onlyIdempotentInspect
Read the QQL reference before writing a query. Pass a topic: overview, syntax, entities, operators, functions, examples, aggregation, or enumValues. entities lists the fields each entity actually exposes, and enumValues gives the accepted values for status, priority, severity and the rest — both matter, because QQL rejects a query naming an attribute that does not exist on the entity rather than ignoring it, and the field names differ from those in the write tools. Read this once per session before the first qql_search rather than guessing and retrying. Cost: no API call, static text, about 2ms. Free to call, and cheaper than one rejected query.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which section to return (required — one section per call): - overview: what QQL is, overall query structure, subscription requirement - syntax: structure, ordering, custom fields, case-sensitivity, boolean and date fields - entities: the fields available on each entity — field names are NOT uniform across entities, so read this before writing a query against an unfamiliar one - operators: comparison, matching, set, null, and logical operators - functions: currentUser, activeUsers, and the now/startOf*/endOf* date functions - examples: ready-made queries for common questions - aggregation: SELECT (COUNT/MIN/MAX/AVG/SUM/FIRST/LAST), GROUP BY, HAVING — use this to count or summarise instead of paging through rows - enumValues: the valid values for priority, severity, and the per-entity status fields |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that this makes no API call, returns static text, costs about 2ms, and is free. It also explains QQL's rejection behavior for nonexistent attributes, which is important context for the agent's subsequent query-writing behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the crucial instruction, then listing topics, key caveats, and cost. Every sentence adds practical value, and the repeated topic list serves as an orienting summary rather than pure redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter static-help tool with strong readOnly/idempotent annotations, the description fully covers when to call, how to call, why it matters, what it costs, and what behavior to expect. No output schema is needed because the tool returns static reference text, which the description clearly states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents each topic in detail, so the baseline is 3. The description adds meaning by highlighting entities and enumValues as critical topics and warning that field names differ from those in write tools, which goes beyond the schema's enumerated list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear imperative—'Read the QQL reference before writing a query'—and defines the tool as the QQL syntax reference with a bounded topic set. It distinguishes itself from qql_search by positioning itself as the pre-query reference step rather than the query execution tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call this tool before the first qql_search, once per session, and 'rather than guessing and retrying.' It also names the sibling qql_search and provides a cost rationale for using help first, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qql_searchSearch with QQLARead-onlyIdempotentInspect
Search any entity with Qase Query Language: filtering, cross-project queries, sorting, and aggregation. This is the right tool for every question that is not "give me this one record by ID" — "cases without automation", "results that failed this week", "open blockers across projects" — and the right way to fetch many records at once instead of looping over qase_get. Call qql_help first for the syntax, the fields available per entity, and the enum values; a query naming an unknown attribute is rejected outright. Use qase_get instead when you already know the entity and its ID and want just that one. Cost: one API call. 0.5-0.9s for pages up to 50 records; a page of 100 measured 0.9-2.8s depending on how much each record carries. Prefer one search over N single fetches: the same ten records cost 1.2s here against 5.3s as ten qase_get calls.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 10, max: 100) | |
| query | Yes | QQL query expression. Examples: - entity = "case" and project = "DEMO" and status = "Actual" - entity = "defect" and severity = "blocker" and status = "open" - entity = "result" and status = "failed" and ended >= now("-7d") - entity = "run" and milestone ~ "Sprint 12" See QQL documentation for full syntax and examples. | |
| offset | No | Number of results to skip for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total matching entities |
| entities | Yes | Matching entities |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the lower bar applies and the description earns credit for adding context beyond them: performance characteristics (0.5-0.9s for up to 50 records, 0.9-2.8s for 100), a one-API-call cost, and the rejection behavior for unknown attributes. This is genuinely useful disclosure that annotations do not provide, though it does not describe return structure (covered by the output schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the flow is logical, but the tail carries two-and-a-half sentences of benchmark numbers (0.5-0.9s, 0.9-2.8s, 1.2s vs 5.3s) that are excessive for tool selection and repeat the same point twice: 'fetch many records at once instead of looping over qase_get' and later 'Prefer one search over N single fetches'. The cost-comparison redundancy could be trimmed to a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a QQL search tool with cross-project scope, the description is near-complete: it covers when to use it, the error behavior for bad queries, performance expectations, and the prerequisite of qql_help. Return values are covered by the existing output schema, so nothing the agent needs to invoke it correctly is missing. Only the verbosity of the benchmark data keeps this from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the query parameter already ships with syntax examples, so the baseline of 3 applies. The description adds the advisory to 'Call qql_help first for the syntax, the fields available per entity, and the enum values,' which is useful query-parameter guidance, but it adds no format or syntax detail beyond what the schema already provides. It sits at baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource-capability statement: 'Search any entity with Qase Query Language: filtering, cross-project queries, sorting, and aggregation.' It then explicitly contrasts itself with the sibling qase_get by enumerating the non-ID questions it covers ('cases without automation', 'results that failed this week'). An agent can tell this tool apart from any sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it ('the right tool for every question that is not give me this one record by ID'), names the exact alternative ('Use qase_get instead when you already know the entity and its ID'), and instructs calling qql_help first for syntax. Both exclusions and the routing condition are spelled out with concrete examples — nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v2.7.4- Changed
qase_api3 fields changed- changed
Input schema / properties / path / descriptionPrevious value: -"API path starting with /v1/ (e.g., \"/v1/project/DEMO/run\")"New value: +"API path starting with a version segment (e.g., \"/v1/project/DEMO/run\")" - removed
Input schema / properties / path / minLengthRemoved value: -1 - added
Input schema / properties / path / patternAdded value: +"^\\/v\\d+\\/\\S*$"
- Changed
qase_attachment_upload5 fields changed- changed
Input schema / properties / file_base64 / descriptionPrevious value: -"File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option."New value: +"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option." - changed
Input schema / properties / file_path / descriptionPrevious value: -"Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead."New value: +"Single-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead." - changed
Input schema / properties / filename / descriptionPrevious value: -"Original filename with extension"New value: +"Original filename with extension. Required for the single-file form." - added
Input schema / properties / filesAdded value: +{ + "description": "Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order.", + "items": { + "additionalProperties": false, + "properties": { + "file_base64": { + "description": "File content, base64 encoded. The only option on a remote server.", + "type": "string" + }, + "file_path": { + "description": "Absolute path to a file on the machine running THIS server.", + "type": "string" + }, + "filename": { + "description": "Original filename with extension", + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "code", - "filename" -]New value: +[ + "code" +]
3 tool updates
v2.7.0- Added
qase_case_bulk_create - Added
qase_run_complete - Added
qase_suite_upsert
6 tool updates
v2.5.1- Changed
qase_case_upsert9 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"Free-form description of what the case covers" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the case belongs to" - added
Input schema / properties / postconditions / descriptionAdded value: +"State to restore or verify after the steps run" - added
Input schema / properties / preconditions / descriptionAdded value: +"State the system must be in before the steps run" - added
Input schema / properties / steps / descriptionAdded value: +"Ordered test steps; omit for a case without steps" - added
Input schema / properties / steps_type / descriptionAdded value: +"How steps are written: \"classic\" action/expected pairs, or \"gherkin\" scenario text" - added
Input schema / properties / suite_id / descriptionAdded value: +"ID of the suite that holds the case" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"smoke\", \"billing\"]"
- Changed
qase_ci_report1 field changed- added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the build ran against"
- Changed
qase_defect_upsert4 fields changed- added
Input schema / properties / actual_result / descriptionAdded value: +"What actually happened — required when creating a defect" - added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / severity / descriptionAdded value: +"How bad the defect is — required when creating a defect" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"regression\", \"payments\"]"
- Changed
qase_regression_run3 fields changed- added
Input schema / properties / description / descriptionAdded value: +"What this regression run covers" - added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the run executes against" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the run belongs to"
- Changed
qase_run_upsert6 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"What this run covers" - added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the run executes against" - added
Input schema / properties / is_autotest / descriptionAdded value: +"True when the run is produced by automation rather than a person" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the run belongs to" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"nightly\", \"smoke\"]"
- Changed
qase_triage_defect3 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"Extra context beyond the observed behavior" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"regression\", \"payments\"]"
1 tool update
v2.5.0- Changed
qase_case_upsert2 fields changed- added
Input schema / properties / is_flaky / descriptionAdded value: +"Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too." - changed
Input schema / properties / is_flaky / typePrevious value: -"boolean"New value: +"string"
2 tool updates
v2.4.1- Changed
qase_ci_report2 fields changed- changed
Input schema / properties / results / descriptionPrevious value: -"Test results to record"New value: +"Test results to record, 1 to 2000 per call" - added
Input schema / properties / results / maxItemsAdded value: +2000
- Changed
qase_result_record2 fields changed- changed
Input schema / properties / results / descriptionPrevious value: -"One or more results to record"New value: +"Results to record, 1 to 200 per call" - added
Input schema / properties / results / maxItemsAdded value: +200
7 tool updates
v2.2.1- Added
qase_attachment_upload - Changed
qase_case_upsert3 fields changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload" - changed
Input schema / properties / steps / items / properties / attachments / descriptionPrevious value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload" - changed
Input schema / properties / steps / items / properties / steps / items / properties / attachments / descriptionPrevious value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_ci_report1 field changed- added
Input schema / properties / results / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_defect_upsert1 field changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_get1 field changed- changed
Input schema / properties / entity / enumPrevious value: -[ - "case", - "suite", - "run", - "result", - "plan", - "defect", - "milestone", - "environment", - "shared_step", - "shared_parameter", - "configuration", - "attachment", - "author", - "user", - "custom_field" -]New value: +[ + "case", + "suite", + "run", + "result", + "plan", + "defect", + "milestone", + "environment", + "shared_step", + "shared_parameter", + "configuration", + "attachment", + "author", + "user", + "review", + "custom_field" +]
- Changed
qase_result_record2 fields changed- added
Input schema / properties / results / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload" - added
Input schema / properties / results / items / properties / steps / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_triage_defect1 field changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
4 tool updates
v2.1.1- Changed
qase_project_context3 fields changed- added
Input schema / properties / fullAdded value: +{ + "description": "Page through every suite, milestone, environment, custom field, and user instead of fetching only the first 100 of each (default: false). Use this when a collection is reported as truncated and you need the complete set — it costs one API call per 100 entities and can return thousands of items, so prefer the targeted list tools or qql_search when you only need a subset.", + "type": "boolean" +} - added
Output schema / properties / coverageAdded value: +{ + "description": "Per-collection completeness: each of suites, milestones, environments, custom_fields, and users maps to { total, loaded, truncated }. When truncated is true the list holds only the first `loaded` of `total` entities — re-call with full: true for the rest.", + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "project", - "suites", - "milestones", - "environments" -]New value: +[ + "project", + "suites", + "milestones", + "environments", + "coverage" +]
- Changed
qase_triage_defect7 fields changed- changed
Input schema / properties / actual_result / descriptionPrevious value: -"Observed behavior"New value: +"Observed behavior. Required by the API" - removed
Input schema / properties / failed_result_idsRemoved value: -{ - "description": "Result hashes to link to this defect (from the run)", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / run_idRemoved value: -{ - "description": "Run containing the failed results", - "exclusiveMinimum": 0, - "type": "integer" -} - added
Input schema / properties / severity / descriptionAdded value: +"Required by the API" - changed
Input schema / requiredPrevious value: -[ - "code", - "title" -]New value: +[ + "code", + "title", + "severity", + "actual_result" +] - removed
Output schema / properties / linked_resultsRemoved value: -{ - "description": "Number of linked result hashes", - "type": "integer" -} - changed
Output schema / requiredPrevious value: -[ - "defect_id", - "linked_results" -]New value: +[ + "defect_id" +]
- Changed
qql_help3 fields changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Specific help topic, or omit for general overview"New value: +"Which section to return (required — one section per call):\n- overview: what QQL is, overall query structure, subscription requirement\n- syntax: structure, ordering, custom fields, case-sensitivity, boolean and date fields\n- entities: the fields available on each entity — field names are NOT uniform across entities, so read this before writing a query against an unfamiliar one\n- operators: comparison, matching, set, null, and logical operators\n- functions: currentUser, activeUsers, and the now/startOf*/endOf* date functions\n- examples: ready-made queries for common questions\n- aggregation: SELECT (COUNT/MIN/MAX/AVG/SUM/FIRST/LAST), GROUP BY, HAVING — use this to count or summarise instead of paging through rows\n- enumValues: the valid values for priority, severity, and the per-entity status fields" - changed
Input schema / properties / topic / enumPrevious value: -[ - "syntax", - "entities", - "operators", - "functions", - "examples" -]New value: +[ + "overview", + "syntax", + "entities", + "operators", + "functions", + "examples", + "aggregation", + "enumValues" +] - added
Input schema / requiredAdded value: +[ + "topic" +]
- Changed
qql_search2 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"QQL query expression. Examples:\n- entity = \"case\" and project = \"DEMO\" and status = \"Actual\"\n- entity = \"defect\" and severity = \"blocker\" and status = \"open\"\n- entity = \"result\" and status = \"failed\" and created >= now(\"-7d\")\n- entity = \"run\" and milestone ~ \"Sprint 12\"\nSee QQL documentation for full syntax and examples."New value: +"QQL query expression. Examples:\n- entity = \"case\" and project = \"DEMO\" and status = \"Actual\"\n- entity = \"defect\" and severity = \"blocker\" and status = \"open\"\n- entity = \"result\" and status = \"failed\" and ended >= now(\"-7d\")\n- entity = \"run\" and milestone ~ \"Sprint 12\"\nSee QQL documentation for full syntax and examples." - changed
Input schema / properties / query / maxLengthPrevious value: -1000New value: +2000
2 tool updates
v2.0.3- Changed
qase_case_upsert6 fields changed- changed
Input schema / properties / steps / items / properties / action / descriptionPrevious value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set." - added
Input schema / properties / steps / items / properties / sharedAdded value: +{ + "description": "Hash of an existing shared step to insert at this position, from `qase_shared_step_upsert`. The step then reuses that shared step instead of defining its own content, so `action` can be omitted. Reading the case back reports the link as `shared_step_hash`.", + "type": "string" +} - added
Input schema / properties / steps / items / properties / shared_step_hashAdded value: +{ + "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", + "type": "string" +} - changed
Input schema / properties / steps / items / properties / steps / items / properties / action / descriptionPrevious value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set." - added
Input schema / properties / steps / items / properties / steps / items / properties / sharedAdded value: +{ + "description": "Hash of an existing shared step to insert at this position, from `qase_shared_step_upsert`. The step then reuses that shared step instead of defining its own content, so `action` can be omitted. Reading the case back reports the link as `shared_step_hash`.", + "type": "string" +} - added
Input schema / properties / steps / items / properties / steps / items / properties / shared_step_hashAdded value: +{ + "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", + "type": "string" +}
- Changed
qase_get1 field changed- added
Input schema / properties / includeAdded value: +{ + "description": "Comma-separated list of related entities to include in the response. Cases and runs already request their external issue links by default (\"external_issues\" / \"external_issue\"); pass this only to override that.", + "type": "string" +}
90 tool updates
v2.0.0- Removed
attach_external_issue - Removed
bulk_create_cases - Removed
complete_run - Removed
create_case - Removed
create_configuration_group - Removed
create_custom_field - Removed
create_defect - Removed
create_environment - Removed
create_milestone - Removed
create_plan - Removed
create_project - Removed
create_result - Removed
create_results_bulk - Removed
create_run - Removed
create_shared_step - Removed
create_suite - Removed
delete_attachment - Removed
delete_case - Removed
delete_configuration_group - Removed
delete_custom_field - Removed
delete_defect - Removed
delete_environment - Removed
delete_milestone - Removed
delete_plan - Removed
delete_project - Removed
delete_result - Removed
delete_run - Removed
delete_run_public_link - Removed
delete_shared_step - Removed
delete_suite - Removed
detach_external_issue - Removed
get_attachment - Removed
get_author - Removed
get_case - Removed
get_custom_field - Removed
get_defect - Removed
get_environment - Removed
get_milestone - Removed
get_plan - Removed
get_project - Removed
get_result - Removed
get_run - Removed
get_run_public_link - Removed
get_shared_parameter - Removed
get_shared_step - Removed
get_suite - Removed
get_user - Removed
grant_project_access - Removed
list_attachments - Removed
list_authors - Removed
list_cases - Removed
list_configurations - Removed
list_custom_fields - Removed
list_defects - Removed
list_environments - Removed
list_milestones - Removed
list_plans - Removed
list_projects - Removed
list_results - Removed
list_runs - Removed
list_shared_parameters - Removed
list_shared_steps - Removed
list_suites - Removed
list_system_fields - Removed
list_users - Added
qase_api - Added
qase_case_upsert - Added
qase_ci_report - Added
qase_defect_upsert - Added
qase_discover_tools - Added
qase_get - Added
qase_project_context - Added
qase_regression_run - Added
qase_result_record - Added
qase_run_upsert - Added
qase_triage_defect - Changed
qql_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "entities": { + "description": "Matching entities", + "items": { + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Total matching entities", + "type": "integer" + } + }, + "required": [ + "total", + "entities" + ], + "type": "object" +}
- Removed
resolve_defect - Removed
revoke_project_access - Removed
update_case - Removed
update_custom_field - Removed
update_defect - Removed
update_defect_status - Removed
update_environment - Removed
update_milestone - Removed
update_plan - Removed
update_result - Removed
update_shared_step - Removed
update_suite - Removed
upload_attachment
3 tool updates
v1.1.8- Changed
bulk_create_cases1 field changed- changed
Input schema / properties / cases / items / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
- Changed
create_case1 field changed- changed
Input schema / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
- Changed
update_case1 field changed- changed
Input schema / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
80 tool updates
v1.1.7- First observed
attach_external_issue - First observed
bulk_create_cases - First observed
complete_run - First observed
create_case - First observed
create_configuration_group - First observed
create_custom_field - First observed
create_defect - First observed
create_environment - First observed
create_milestone - First observed
create_plan - First observed
create_project - First observed
create_result - First observed
create_results_bulk - First observed
create_run - First observed
create_shared_step - First observed
create_suite - First observed
delete_attachment - First observed
delete_case - First observed
delete_configuration_group - First observed
delete_custom_field - First observed
delete_defect - First observed
delete_environment - First observed
delete_milestone - First observed
delete_plan - First observed
delete_project - First observed
delete_result - First observed
delete_run - First observed
delete_run_public_link - First observed
delete_shared_step - First observed
delete_suite - First observed
detach_external_issue - First observed
get_attachment - First observed
get_author - First observed
get_case - First observed
get_custom_field - First observed
get_defect - First observed
get_environment - First observed
get_milestone - First observed
get_plan - First observed
get_project - First observed
get_result - First observed
get_run - First observed
get_run_public_link - First observed
get_shared_parameter - First observed
get_shared_step - First observed
get_suite - First observed
get_user - First observed
grant_project_access - First observed
list_attachments - First observed
list_authors - First observed
list_cases - First observed
list_configurations - First observed
list_custom_fields - First observed
list_defects - First observed
list_environments - First observed
list_milestones - First observed
list_plans - First observed
list_projects - First observed
list_results - First observed
list_runs - First observed
list_shared_parameters - First observed
list_shared_steps - First observed
list_suites - First observed
list_system_fields - First observed
list_users - First observed
qql_help - First observed
qql_search - First observed
resolve_defect - First observed
revoke_project_access - First observed
update_case - First observed
update_custom_field - First observed
update_defect - First observed
update_defect_status - First observed
update_environment - First observed
update_milestone - First observed
update_plan - First observed
update_result - First observed
update_shared_step - First observed
update_suite - First observed
upload_attachment
TDQS
Scored across 17 tools
Each tool targets a distinct action/resource: single vs bulk case writes, CI vs staged run recording, get-by-ID vs QQL search, and general vs triage defects are all clearly separated. The only intentionally overlapping tool is qase_api, but its description explicitly defers to dedicated tools.
Most tools follow a qase_<resource>_<action> pattern (qase_case_upsert, qase_run_complete, qase_suite_upsert), and the qql_ prefix cleanly groups the search-language tools. A few names (qase_get, qase_api, qase_discover_tools, qase_triage_defect) deviate from the resource-first pattern, but the convention is still predictable.
At 17 tools the server is at the low end of the heavy range (16-25), though each tool has a clear role and several are deliberate compound/escape-hatch tools. It is a reasonable count for Qase's broad domain, but more than a tightly curated 3-15 tool set.
Core workflows are well covered: project context, suites, cases, runs, results, defects, attachments, and general read/search. Delete, plan/milestone, review, and custom-field operations are hidden behind qase_discover_tools rather than present in the visible set, and qase_api covers edge cases, so gaps are minor and workaroundable.
Maintenance
Related MCP Connectors
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Official DevSpeak MCP server — translate technical text into formal specs from any AI IDE or agent
Official Miro MCP server - Supports context to code and creating diagrams, docs, and data tables.
Related MCP Servers
- AlicenseCqualityFmaintenanceA TypeScript-based MCP server that provides integration with the Qase test management platform, allowing you to manage projects, test cases, runs, results, plans, suites, and shared steps.2612MIT
- AlicenseAqualityCmaintenanceMCP server for QTM4J (QMetry Test Management for Jira) Open API, enabling test case and cycle management via natural language.2132 npmMIT

Nhost MCP Serverofficial
AlicenseNot gradedqualityFmaintenanceOfficial MCP server for the Nhost backend platform. Manage Postgres data, GraphQL, auth, storage, migrations and Hasura metadata via AI assistants.5MIT
QA Touch MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceOfficial MCP server for QA Touch, enabling AI assistants to manage test cases, defects, test runs, and more via natural language.108 npmMIT