Qase MCP Server
OfficialThe Qase MCP Server connects AI assistants to the Qase Test Management Platform, enabling full read/write access to test-related entities via the Model Context Protocol. Here's what you can do:
Project Management — List, get, create, and delete projects; grant/revoke access for users or groups.
Test Cases — List, get, create, update, delete, and bulk-create test cases; attach/detach external issues (e.g., Jira).
Test Suites — List, get, create, update, and delete test suites, including nested suites via parent ID.
Test Runs — List, get, create, delete, and complete (close) test runs; manage public shareable links.
Test Results — List, get, create, update, delete, and bulk-create test results.
Test Plans — List, get, create, update, and delete test plans.
Shared Steps — List, get, create, update, and delete reusable shared steps.
Shared Parameters — List and get shared parameters.
Milestones — List, get, create, update, and delete milestones for organizing tests by release or sprint.
Defects — List, get, create, update, delete, and resolve defects; update defect status (open, in_progress, resolved, invalid).
Environments — List, get, create, update, and delete test environments (e.g., staging, production).
Attachments — List, get, upload (base64), and delete attachments.
Custom & System Fields — List, get, create, update, and delete custom field definitions; list built-in system fields.
Configurations — List configuration groups and items; create and delete configuration groups.
Users & Authors — List/get workspace users and test case authors.
QQL (Qase Query Language) — Search across cases, runs, results, defects, and plans using powerful QQL queries; get syntax help and examples.
Tool Discovery — Use qase_discover_tools to find and activate secondary tools on demand.
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:
36 task-oriented tools (37 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
37 tools across 6 groups (36 task-oriented tools plus qase_discover_tools for on-demand activation of secondary tools):
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 | 28 | 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
14 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 /v1/, and an optional body or query. 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 /v1/ (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?
Even with annotations present, the description adds substantial behavioral context beyond them: JSON-only requests, no file uploads, DELETE confirmation behavior, passthrough of raw API responses, cost/latency expectations, and no caching/pagination/retries. This is exactly the kind of operational transparency a passthrough tool needs.
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, invocation pattern, external reference, dedicated-tool preference, response behavior, file-upload limitation, DELETE handling, and performance expectations. It is front-loaded with the most decision-relevant information.
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, open-ended API passthrough with no output schema, this description covers the essential operational and selection context: what it returns, what it cannot do, how it behaves for DELETE, cost/latency, and the lack of caching/pagination helpers. Nothing critical is missing for an agent to invoke 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?
Schema description coverage is 100%, so the baseline is 3. The description mentions passing the HTTP method, a /v1/ path, and optional body/query, but the schema already documents these parameters and their constraints. The description adds little new parameter-level meaning beyond pointing to the external API reference.
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 begins with a specific verb and resource: 'Call any Qase REST endpoint directly,' and immediately scopes it to 'the few things no dedicated tool covers.' This clearly distinguishes qase_api from the dedicated sibling tools, making its role unmistakable.
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 'Prefer a dedicated tool wherever one exists' and gives concrete reasoning: they normalize enums, validate arguments, and shape responses. It also names a sibling alternative for multipart uploads ('qase_attachment_upload'), giving agents clear when-to-use and when-not-to-use guidance.
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 a file and get back the hash that other tools reference it by — screenshots, logs, HAR files, videos. Pass file_base64 with the base64-encoded bytes, or file_path with an absolute path; filename with its extension is always required. 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. 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 file, dominated by file 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. | |
| filename | Yes | Original filename with extension | |
| file_path | No | 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 | 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?
Annotations are minimal (only readOnlyHint, openWorldHint, etc.), so the description carries the full behavioral burden. It discloses that uploading alone attaches nothing, that the returned hash must be passed on, that file_path fails on remote servers, and gives cost/performance characteristics (base64 inflation, sub-second for screenshots). This is rich, non-obvious behavior beyond 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?
Every sentence earns its place: purpose, parameter choice, usage workflow, and cost are all covered with zero filler. The critical distinction between file_base64 and file_path is front-loaded, and the 'hash must be passed on' warning is placed prominently.
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 file-upload tool with no output schema, the description is exceptionally complete: it states what is returned, how the return value is consumed by other tools, the required parameter format, the only multipart/form-data sender, reuse guidance, and performance expectations. Nothing an agent needs to correctly invoke it 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 baseline is 3. The description adds value by clarifying the required extension in filename, differentiating file_base64 vs file_path with explicit guidance on when to use each, and noting that the 'file' field is deprecated. This goes beyond the schema descriptions, warranting a 4.
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?
Description states a specific verb ('Upload') and resource ('a file'), and makes the purpose explicit by explaining the returned hash is used by other tools. It 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?
Provides clear when-to-use guidance: it tells the agent to prefer file_base64 unless the server is local, explicitly names qase_api as the alternative it is not, and advises to reuse hashes instead of re-uploading. These exclusions and conditions leave nothing to inference.
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, shared steps and parameters, attachments, external issue links, case reviews, defect triage, and project and custom-field management all exist but stay hidden until discovered. Search by what you are trying to do — "delete", "milestone", "attachment", "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. 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?
Even though annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, the description adds valuable behavioral context: hidden tools are activated and become callable, matching happens in memory, there is no API call, and it costs about 3ms. This goes well beyond the annotations and clearly communicates side effects, performance, and cost.
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 moderately long but every sentence earns its place: it explains the problem, provides concrete examples, gives query-tuning advice, sets expectations about cost, and instructs the agent not to assume missing capabilities. The most important purpose is front-loaded, and the practical usage rules follow naturally.
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?
The description is complete for an agent to call this tool correctly: it explains why the tool exists, how to search, what activation means, when to use it as a fallback, and the cost profile. The output schema covers return values, so the absence of return-value detail in the description is not a gap.
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 the schema already documents all three parameters. The description adds meaningful guidance about the query parameter—search by intent, matching rules, and preference for short queries—which enhances the agent's ability to use it effectively. It does not add detail about category or activate, but the schema covers those adequately.
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 a specific verb and resource: 'Find and switch on tools that are hidden by default.' It goes on to enumerate exactly what kinds of hidden tools exist, making the purpose highly concrete and distinguishing it from the qase_* sibling tools, which are the tools being discovered.
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?
Provides explicit usage guidance: search by intent, use two or three words instead of a full sentence, and 'Never conclude a capability is missing without searching here first.' It also explains the matching constraint that every word must appear in a tool's name or description, which directly informs query formulation.
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_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_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.
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 14 tools
Several tools overlap heavily. qase_case_upsert, qase_run_upsert, and qase_defect_upsert all follow the same create-or-update pattern, while qase_ci_report and qase_run_upsert + qase_result_record can accomplish the same CI reporting workflow. qql_search vs qase_get vs qase_api vs qase_case_upsert also blur since qql_search can likely create/update via actions, and qase_api can do anything. There is also a hidden-tool discovery mechanism that makes the actual scope hard to determine.
Most tool names follow a consistent qase_<domain>_<action> pattern (qase_get, qql_search, qase_case_upsert, qase_result_record). However, qql_search and qql_help break the qase_ prefix convention, and the verb-object order varies (qase_case_upsert vs qase_ci_report vs qase_discover_tools), creating minor inconsistency.
14 tools is within an acceptable range, but the design splits the surface into visible core tools and hidden tools that must be discovered via qase_discover_tools. This means the effective tool count is much larger than 14, and the server intentionally hides capabilities, which complicates the set's coherence and predictability.
The server covers project context, search, CRUD for cases/runs/defects, CI reporting, and attachments. However, some obvious operations like deleting a case or run are hidden behind qase_discover_tools, update for runs is present but incomplete without a dedicated complete operation, and integration between defects and results is explicitly missing due to API limitations.
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.2126 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.113 npmMIT