Skip to main content
Glama
qase-tms

Qase MCP Server

Official
by qase-tms

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.

npm version License: MIT MCP Registry

Table of Contents

Related MCP server: qtm4j-mcp-server

Overview

The Qase MCP Server lets AI assistants (Claude, Cursor, Codex, and any other MCP client) read and write Qase test cases, runs, results, defects, suites, milestones, and more — through a standardized protocol, with no custom integration code.

Features:

  • 40 task-oriented tools (41 total, including qase_discover_tools) — consolidated from 83 v1 tools for lower token usage and better LLM accuracy

  • Composite 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/mcp with just your Qase login, or run the server locally with your own API token

  • Tenant-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"

qase_project_context

Create or update a test case

"Create a high-priority smoke test case in project DEMO titled 'Login with valid credentials'"

qase_case_upsert

Report CI results

"Report these CI results for project DEMO: case 1 passed, case 2 failed with 'timeout error'"

qase_ci_report

Triage a failed test

"Create a critical defect for the login timeout failure in run #42"

qase_triage_defect

Search with QQL

"Find all failed test results from the last 7 days in project DEMO"

qql_search

See Tools and docs/tools.md for the full reference.

Quick Start

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/mcp in Settings → MCPs → Add server, or configure ~/.codex/config.toml for 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_here

Then point your MCP client's stdio config at the @qase/mcp-server binary. Full install options, client configs (Claude Desktop, Cursor, Claude Code, Codex, OpenCode), environment variables, and transports (stdio/SSE/streamable-HTTP): docs/self-run.md.

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 optional

The name must be on the allowlist in src/utils/integration-marker.ts — add yours in a PR. Anything unlisted or malformed is ignored, and the API call still succeeds. HTTP transports also accept the marker per request (X-Qase-Integration header or ?integration=). Details: docs/self-run.md.

Upgrading from v1

v2 consolidated 83 v1 tools into 29 task-oriented tools (30 total, including a discovery tool), and has since grown to 36 (37 total). Tool names and response shapes have changed. See docs/migration.md for the complete tool mapping table, response format changes, and before/after examples.

Tools

41 tools across 6 groups (40 task-oriented tools plus qase_discover_tools for on-demand activation of secondary tools). 17 are listed from the start; the rest stay hidden until qase_discover_tools activates them:

Group

Count

Description

Read

2

Fetch any entity by type/ID, or bootstrap full project context in one call

QQL

2

Search across cases, runs, results, defects, and plans with Qase Query Language

Write

32

Create, update, and delete cases (single or up to 100 at once), runs, results, defects, suites, milestones, plans, shared steps, environments, and attachments; link cases and runs to Jira issues; propose and manage test case reviews

Composite

3

Multi-step workflows in one call: CI reporting, defect triage, regression run setup

Escape hatch

1

Direct REST API access for any endpoint not covered by the tools above

Meta

1

qase_discover_tools — find and activate secondary tools on demand

Full tool-by-tool reference with parameters and the discovery model: docs/tools.md.

Documentation

Contributing

Contributions are welcome! See CONTRIBUTING.md for development setup, testing, and linting guidelines.

License

MIT License — see LICENSE for details.

Support

Available Tools

17 tools
qase_apiCall Qase APIAInspect

Call any Qase REST endpoint directly, for the few things no dedicated tool covers. Pass the HTTP method, a path starting with a version segment such as /v1/, and an optional body or query. The path must be an endpoint path on the configured Qase host; a full URL, or one that resolves to another host, is refused. See developers.qase.io for the reference. Prefer a dedicated tool wherever one exists: they normalize enums, validate arguments before spending a round trip, and shape the response for a model. This one hands back whatever the API returns. It sends JSON only and cannot upload files — multipart uploads go through qase_attachment_upload. A DELETE through this tool asks for confirmation the same way the dedicated delete tools do. Cost: one API call, typically 0.3-1.5s depending on the endpoint. No caching, no pagination help, no retries beyond the client defaults.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoRequest body for POST/PUT/PATCH
pathYesAPI path starting with a version segment (e.g., "/v1/project/DEMO/run")
queryNoQuery parameters
methodNoHTTP methodGET

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses that it sends JSON only, cannot upload files, asks confirmation for DELETE, returns raw API responses, and has no caching, pagination, or retries. It also states typical cost/time. This substantially exceeds what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical, but every sentence earns its place: purpose, path constraints, alternatives, body/format limits, confirmation behavior, performance, and caveats. It is front-loaded with the core purpose and structured logically, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic passthrough tool with no output schema, the description covers path formulation, host restriction, HTTP methods, body/query, file upload exclusion, DELETE confirmation, cost, and limitations. This is sufficient for a model to decide when to call it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters are already documented in the schema (100% coverage), so the baseline is 3. The description adds genuine extra meaning by explaining that the path must target the configured Qase host and that full URLs are refused, while also clarifying the default GET method and optional body/query.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Call') and a clear resource ('any Qase REST endpoint'), and explicitly frames it as the fallback for 'the few things no dedicated tool covers.' This differentiates it from the dedicated sibling tools immediately and explains the path format and optional body/query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to 'Prefer a dedicated tool wherever one exists' and explains why, then routes file uploads to qase_attachment_upload. This gives the agent crisp when-to-use vs. alternatives guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_attachment_uploadUpload attachmentAInspect

Upload files and get back the hashes that other tools reference them by — screenshots, logs, HAR files, videos. For one file pass file_base64 with the base64-encoded bytes, or file_path with an absolute path, plus filename with its extension. For several, pass files — one entry per file, each with its own filename — and they go up in a single request, hashes returned in the same order. Use file_base64 unless the server runs on the same machine as the file: a remote server, the hosted connector included, cannot see your filesystem, and file_path will simply not find the file. Qase accepts at most 20 files, 32 MB per file and 128 MB per request; a request over any of those is refused here before anything is sent, so split it across calls. The returned hash is what goes in the attachments field of qase_case_upsert, qase_result_record, qase_defect_upsert or qase_triage_defect — uploading alone attaches nothing, the hash has to be passed on. This is the only tool that sends multipart/form-data, which is why qase_api cannot send them. Upload once and reuse the hash rather than re-uploading the same evidence per case. Cost: one API call per request whatever the number of files, dominated by total size rather than round trip — well under a second for a screenshot, seconds for a video. Base64 inflates the payload by about a third.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
fileNoDeprecated: prefer file_base64 or file_path, which say which one you mean. Accepts either an absolute path to an existing file or base64 content.
filesNoSeveral files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order.
filenameNoOriginal filename with extension. Required for the single-file form.
file_pathNoSingle-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead.
file_base64NoSingle-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses important behavior: uploads alone attach nothing, hashes are returned in input order, requests over 20 files/32 MB per file/128 MB total are refused before being sent, and there is one API call per request with cost implications and base64 inflation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and the most critical usage constraints, and it is dense rather than padded. It is slightly longer than strictly necessary and some details repeat schema descriptions, but the extra cost and performance context earns most of its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly explains the return value (hashes) and how those hashes are consumed by sibling tools. It covers validation limits, the local/remote filesystem distinction, and the integration path into attachments fields, so an agent has enough context to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds real selection semantics: single-file forms via file_base64/file_path plus filename, multi-file form via files, and the exact condition for choosing file_base64 over file_path. It also clarifies that hashes come back in the same order as the files.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: uploading files and returning the hashes other tools reference. It names example content types (screenshots, logs, HAR files, videos) and distinguishes itself from siblings by noting it is the only tool that sends multipart/form-data, which qase_api cannot do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: use file_base64 unless the server is local, since a remote server cannot see the filesystem. It also names the alternative (qase_api) and why it cannot handle this case, and advises reusing hashes instead of re-uploading per case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_case_bulk_createBulk create test casesAInspect

Create up to 100 test cases in one request — the batch form of qase_case_upsert, and the right tool whenever more than one case is being written. Takes a list of cases with the same fields and the same enum handling as qase_case_upsert: labels ("high", "blocker") or numeric IDs both work, steps classic or Gherkin. The batch is validated as a whole, so an invalid item means nothing is created, and each item is then reported individually. Returns the IDs in the order submitted. This creates only; to change an existing case use qase_case_upsert with its id. Cost: one API call regardless of batch size. Ten cases measured 1.2s here against 5.6s as ten separate qase_case_upsert calls — four times faster and one tenth of the calls. Split larger imports across several calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
casesYesTest cases to create, 1 to 100 per call

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses atomicity ('batch is validated as a whole, so an invalid item means nothing is created'), return behavior ('Returns the IDs in the order submitted'), and performance characteristics ('four times faster and one tenth of the calls'). These go well beyond the annotations, which only indicate openWorldHint and non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it front-loads the core purpose and sibling distinction, then explains batch behavior, return format, and performance. The structure flows logically from what to use, to how it behaves, to cost/benefit. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested steps, multiple enum fields, shared steps), the description covers the essential behavioral aspects that an agent must know: atomicity, return order, and the relationship to qase_case_upsert for field semantics. It also covers the performance consideration for deciding between batch and individual calls. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: it clarifies enum handling ('labels ("high", "blocker") or numeric IDs both work'), steps formats ('steps classic or Gherkin'), and the atomicity of the `cases` parameter. This enhances understanding of how parameters behave, moving beyond the schema's field-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool creates up to 100 test cases in one request and explicitly positions itself as the batch form of qase_case_upsert. The verb and resource are specific, and the description immediately distinguishes it from the sibling tool, making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it: 'the right tool whenever more than one case is being written.' Also provides exclusion guidance: 'This creates only; to change an existing case use qase_case_upsert with its `id`.' Additionally advises splitting larger imports across multiple calls, covering both when and when-not scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_case_upsertCreate or update test caseAInspect

Create or update a single test case. With id it updates that case, without id it creates a new one. Enum fields (priority, severity, type, layer, behavior, automation, is_flaky) accept either a label such as "high" or "blocker" or the project's numeric ID — the server normalizes both. Steps can be classic action/expected pairs or Gherkin, and may reference shared steps by hash. Writing more than one case? Use qase_case_bulk_create instead: it takes a list and sends one request. If the project has "Test case review" enabled, direct writes may need to go through a review — run qase_discover_tools with "review" for those tools. Cost: one API call, about 0.6s to create and 0.4s to update. Ten sequential calls measured 5.6s against 1.2s for one qase_case_bulk_create writing the same ten, so a loop is roughly four times slower.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoCase ID — if provided, updates the case; if omitted, creates a new one
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
tagsNoTag names, e.g. ["smoke", "billing"]
typeNoType label or numeric ID
layerNoLayer label or numeric ID
stepsNoOrdered test steps; omit for a case without steps
titleYesTest case title
statusNoStatus label or numeric ID
behaviorNoBehavior label or numeric ID
is_flakyNoIs flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too.
priorityNoPriority label or numeric ID (0=not set, 1=high, 2=medium, 3=low)
severityNoSeverity label or numeric ID
suite_idNoID of the suite that holds the case
automationNoAutomation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)
steps_typeNoHow steps are written: "classic" action/expected pairs, or "gherkin" scenario text
attachmentsNoAttachment hashes from qase_attachment_upload
descriptionNoFree-form description of what the case covers
custom_fieldNoCustom field values keyed by field ID, e.g. { "12": "value" }
milestone_idNoID of the milestone the case belongs to
preconditionsNoState the system must be in before the steps run
postconditionsNoState to restore or verify after the steps run

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
titleYesRun title (e.g., "CI Build #1234")
resultsYesTest results to record, 1 to 2000 per call
completeNoComplete the run after recording results (default: true)
is_autotestNoMark as automated run (default: true)
environment_idNoID of the environment the build ran against

Output Schema

ParametersJSON Schema
NameRequiredDescription
run_idYesCreated run ID
run_statusYes
results_recordedYesNumber of results recorded

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDefect ID — if provided, updates; if omitted, creates
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
tagsNoTag names, e.g. ["regression", "payments"]
titleYesDefect title
statusNoSet to "resolved" to resolve the defect
severityNoHow bad the defect is — required when creating a defect
attachmentsNoAttachment hashes from qase_attachment_upload
custom_fieldNoCustom field values keyed by field ID, e.g. { "12": "value" }
actual_resultNoWhat actually happened — required when creating a defect

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 toolsA
Read-onlyIdempotent
Inspect

Find and switch on tools that are hidden by default. Only core tools appear in the tool list; deletes, test plans, milestones, environments, shared steps and parameters, external issue links, case reviews, and project and custom-field management all exist but stay hidden until discovered. Search by what you are trying to do — "delete", "milestone", "plan", "review", "custom field" — and matching tools are activated and become callable. Every word in the query must appear in a tool's name or description, so prefer two or three words over a sentence. Activation is announced to your client with notifications/tools/list_changed: if a tool listed as activated here is still absent from your tool list, your client did not act on that notification — call the same endpoint through qase_api rather than reporting the capability as missing. Never conclude a capability is missing without searching here first. Cost: no API call, matching happens in memory, about 3ms. Free to call as often as needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch query to find tools by name or description. Examples: "delete", "milestone", "attachment", "suite"
activateNoIf true (default), found tools are activated and become available for use
categoryNoFilter by tool category

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundYesNumber of matching tools
toolsYes
activatedYesNumber of newly activated tools

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations. It explains the activation mechanism (notifications/tools/list_changed), the in-memory matching behavior, the cost (no API call, ~3ms), and the idempotent nature (free to call as often as needed). It also warns about a potential failure mode (client not acting on the notification) and how to handle it. This is rich behavioral context that annotations alone don't provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, front-loading the core purpose and then providing usage details. It's longer than ideal, but every sentence earns its place: the search strategy, activation mechanism, fallback to qase_api, and cost note are all actionable. The only minor issue is that the cost and 'free to call' details could be seen as slightly redundant with the idempotentHint annotation, but they add practical context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a discovery tool with an output schema and rich annotations, the description is complete. It covers what the tool does, how to use it effectively, what to expect after activation, and how to handle edge cases. The output schema presumably describes the list of activated tools, so the description doesn't need to explain return values. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description adds value by explaining the query matching semantics (every word must appear in a tool's name or description) and the activation default behavior. It doesn't add much about the category parameter, but the schema's enum and description cover that adequately. The description's query guidance is genuinely useful beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: find and activate hidden tools. It uses a specific verb ('find and switch on') and resource ('tools that are hidden by default'), and distinguishes itself from siblings by explaining that only core tools appear in the list and this tool discovers the rest. It also names the sibling qase_api as an alternative for a specific scenario, which helps an agent differentiate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: whenever a capability seems missing, search here first before concluding it's absent. It also gives concrete search strategies (use two or three words, every word must match) and explains when to use qase_api instead (if activation notification wasn't acted on). This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_getGet recordA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID (number) or hash (string)
codeNoProject code (required for most entities)
entityYesEntity type to fetch
fieldsNoOptional field projection — only return these top-level fields. Pass ["*"] for all fields.
includeNoComma-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

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
fullNoPage 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

ParametersJSON Schema
NameRequiredDescription
usersNoTeam members list
suitesYesSuites list with entities array
projectYesProject details
coverageYesPer-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.
milestonesYesMilestones list
environmentsYesEnvironments list
custom_fieldsNoCustom fields list

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
titleYesRun title
plan_idNoCreate run from an existing test plan
suite_idsNoInclude cases from these suites
descriptionNoWhat this regression run covers
milestone_idNoID of the milestone the run belongs to
include_casesNoExplicit case IDs to include
environment_idNoID of the environment the run executes against

Output Schema

ParametersJSON Schema
NameRequiredDescription
runNoFull run entity
run_idYesCreated run ID
cases_addedYesNumber of cases added to the run

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
run_idYesRun ID to record results into
resultsYesResults to record, 1 to 200 per call

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use qase_ci_report instead (when run doesn't exist and CI job is finished), and advises batching multiple results in one call. It also warns against exceeding the 200 limit and how to handle longer lists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_run_completeComplete test runA
Idempotent
Inspect

Mark a test run as complete so it reports as finished rather than in progress. Call it once the results are in; a run left open keeps showing as running and skews dashboards and any "is the release ready" question asked later. Note that completing does not seal the run: the API still accepts results recorded into it afterwards, and they change its counts, so completion is a reporting state rather than a lock. If the results are all in hand at once, qase_ci_report does this as its final step and you do not need this call. Cost: one API call, about 0.4s.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID (positive integer)
codeYesProject code (2-10 uppercase letters, numbers, or underscores)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and idempotentHint=true, but the description adds crucial non-obvious behavior: completing does not seal the run; the API still accepts later results and changes counts. This is a significant behavioral nuance beyond the annotations. The cost estimate also adds transparency. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, usage trigger, consequence, behavioral caveat, alternative, and cost. The purpose is front-loaded, and the caveat is essential context. Nothing is redundant or tangential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with no output schema and no nested objects, the description covers all needed aspects: what it does, when to call it, the non-locking behavior, the alternative tool, and cost. An agent has everything necessary to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters (code and id), so the schema already fully documents them. The description does not add any parameter-level detail, but it doesn't need to. Baseline of 3 is appropriate because the schema carries the burden and the description adds no extra meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Mark') and resource ('a test run'), and states the precise effect: 'so it reports as finished rather than in progress.' It clearly differentiates from the sibling qase_ci_report by noting that tool does this as its final step, so an agent can distinguish when to use each.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Call it once the results are in' and explains the consequence of not doing so (skewed dashboards). It also explicitly names the alternative (qase_ci_report) and the condition under which this tool is not needed, leaving no ambiguity about routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_run_upsertCreate or update test runAInspect

Create or update a test run. Without id it opens a new run; with id it updates that one. A run is the container results are recorded into, so open it before calling qase_result_record. Optionally scope it to a milestone, an environment, a plan, or an explicit list of case IDs. To build a run from a suite or plan without listing cases yourself, use qase_regression_run. For a CI job that has already finished, use qase_ci_report instead — it opens the run, files the results and closes it in one call, so no half-finished run is left behind. Cost: one API call, about 0.5s.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRun ID — if provided, this is an update (note: Qase API has limited run update support)
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
tagsNoTag names, e.g. ["nightly", "smoke"]
casesNoCase IDs to include
titleYesRun title
plan_idNoTest plan to base run on
end_timeNoRFC3339 end time
start_timeNoRFC3339 start time
descriptionNoWhat this run covers
is_autotestNoTrue when the run is produced by automation rather than a person
custom_fieldNoCustom field values keyed by field ID, e.g. { "12": "value" }
milestone_idNoID of the milestone the run belongs to
environment_idNoID of the environment the run executes against

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to call this tool ('open it before calling qase_result_record') and when not to: use qase_regression_run for suite/plan expansion and qase_ci_report for finished CI jobs. This is strong when/when-not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_suite_upsertCreate or update suiteAInspect

Create or update a test suite — the folder cases live in. Without id it creates, with id it updates. Nest a suite by passing parent_id; the whole existing tree comes back from qase_project_context, so read that first rather than guessing at parent IDs. Building a deep tree means one call per node, so create parents before children and reuse the IDs returned. Cost: one API call, about 0.5s.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoSuite ID — if provided, updates; if omitted, creates
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
titleYesSuite title
parent_idNoParent suite ID for nesting
descriptionNoWhat this suite groups — shown under the suite title in the tree
preconditionsNoSetup every case in this suite assumes, inherited by its child suites

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false, openWorldHint=true, and idempotentHint=false, so the description doesn't need to restate those. It adds behavioral context by disclosing the cost (one API call, ~0.5s) and the single-call-per-node limitation, which is not available from annotations. It also hints at non-idempotency by noting the upsert behavior, though that is also clear from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each carrying essential information: the core purpose, the create/update distinction, and the nesting workflow plus cost. There is no redundancy or filler; every sentence earns its place, and critical info (upsert semantics) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters and no output schema, the description covers the key operational necessities: how to determine create vs update, when to consult project_context, the per-node call limitation, and the need to reuse returned IDs. It does not explicitly describe the return format, but it implies the tool returns IDs (reuse the IDs returned), which is sufficient for correct invocation. Minor gaps remain, but for the complexity it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already documented. The description adds workflow-level meaning beyond the schema: it explains that parent_id should be sourced from project_context and that the returned IDs should be reused when building deep trees. This adds practical value to understanding how to combine parameters effectively, which is above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates or updates a test suite ('the folder cases live in'), with a specific verb and resource. It distinguishes it from similar tools like qase_case_upsert by explicitly naming the resource type. The id-based create/update behavior is stated upfront, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: it says to read qase_project_context first rather than guessing parent IDs, and explains the one-call-per-node constraint for deep trees, telling users to create parents before children. This directly aids in correct usage and points to a sibling tool for needed context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qase_triage_defectTriage failure into defectAInspect

Create a defect from a test failure, with the failure context written into it. Requires title, actual_result and severity — the API rejects a defect missing any of the three. Note: the API offers no way to attach existing runs or results to a defect. The runs and results seen on a defect in the UI are populated by the test runner when it reports a result as a defect, so there is nothing to pass here for that — reference the failing results inside actual_result instead, and do not expect a link to appear. For a defect unrelated to a test failure use qase_defect_upsert. Cost: one API call, about 0.5s. Triaging a whole run means one call per defect, so cluster identical failures and file one defect per distinct cause rather than one per failed test.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesProject code (2-10 uppercase letters, numbers, or underscores)
tagsNoTag names, e.g. ["regression", "payments"]
titleYesDefect title
severityYesRequired by the API
attachmentsNoAttachment hashes from qase_attachment_upload
descriptionNoExtra context beyond the observed behavior
custom_fieldNoCustom field values keyed by field ID, e.g. { "12": "value" }
actual_resultYesObserved behavior. Required by the API

Output Schema

ParametersJSON Schema
NameRequiredDescription
defectNoFull defect entity
defect_idYesCreated defect ID

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 helpA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesWhich 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

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv2.7.4
    • Changedqase_api3 fields changed
      • changedInput schema / properties / path / description
        Previous value: -"API path starting with /v1/ (e.g., \"/v1/project/DEMO/run\")"New value: +"API path starting with a version segment (e.g., \"/v1/project/DEMO/run\")"
      • removedInput schema / properties / path / minLength
        Removed value: -1
      • addedInput schema / properties / path / pattern
        Added value: +"^\\/v\\d+\\/\\S*$"
    • Changedqase_attachment_upload5 fields changed
      • changedInput schema / properties / file_base64 / description
        Previous value: -"File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option."New value: +"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option."
      • changedInput schema / properties / file_path / description
        Previous value: -"Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead."New value: +"Single-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead."
      • changedInput schema / properties / filename / description
        Previous value: -"Original filename with extension"New value: +"Original filename with extension. Required for the single-file form."
      • addedInput schema / properties / files
        Added value: +{
        +  "description": "Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "file_base64": {
        +        "description": "File content, base64 encoded. The only option on a remote server.",
        +        "type": "string"
        +      },
        +      "file_path": {
        +        "description": "Absolute path to a file on the machine running THIS server.",
        +        "type": "string"
        +      },
        +      "filename": {
        +        "description": "Original filename with extension",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "filename"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 20,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "code",
        -  "filename"
        -]New value: +[
        +  "code"
        +]
  2. 3 tool updatesv2.7.0
    • Addedqase_case_bulk_create
    • Addedqase_run_complete
    • Addedqase_suite_upsert
  3. 6 tool updatesv2.5.1
    • Changedqase_case_upsert9 fields changed
      • addedInput schema / properties / custom_field / description
        Added value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"
      • addedInput schema / properties / description / description
        Added value: +"Free-form description of what the case covers"
      • addedInput schema / properties / milestone_id / description
        Added value: +"ID of the milestone the case belongs to"
      • addedInput schema / properties / postconditions / description
        Added value: +"State to restore or verify after the steps run"
      • addedInput schema / properties / preconditions / description
        Added value: +"State the system must be in before the steps run"
      • addedInput schema / properties / steps / description
        Added value: +"Ordered test steps; omit for a case without steps"
      • addedInput schema / properties / steps_type / description
        Added value: +"How steps are written: \"classic\" action/expected pairs, or \"gherkin\" scenario text"
      • addedInput schema / properties / suite_id / description
        Added value: +"ID of the suite that holds the case"
      • addedInput schema / properties / tags / description
        Added value: +"Tag names, e.g. [\"smoke\", \"billing\"]"
    • Changedqase_ci_report1 field changed
      • addedInput schema / properties / environment_id / description
        Added value: +"ID of the environment the build ran against"
    • Changedqase_defect_upsert4 fields changed
      • addedInput schema / properties / actual_result / description
        Added value: +"What actually happened — required when creating a defect"
      • addedInput schema / properties / custom_field / description
        Added value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"
      • addedInput schema / properties / severity / description
        Added value: +"How bad the defect is — required when creating a defect"
      • addedInput schema / properties / tags / description
        Added value: +"Tag names, e.g. [\"regression\", \"payments\"]"
    • Changedqase_regression_run3 fields changed
      • addedInput schema / properties / description / description
        Added value: +"What this regression run covers"
      • addedInput schema / properties / environment_id / description
        Added value: +"ID of the environment the run executes against"
      • addedInput schema / properties / milestone_id / description
        Added value: +"ID of the milestone the run belongs to"
    • Changedqase_run_upsert6 fields changed
      • addedInput schema / properties / custom_field / description
        Added value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"
      • addedInput schema / properties / description / description
        Added value: +"What this run covers"
      • addedInput schema / properties / environment_id / description
        Added value: +"ID of the environment the run executes against"
      • addedInput schema / properties / is_autotest / description
        Added value: +"True when the run is produced by automation rather than a person"
      • addedInput schema / properties / milestone_id / description
        Added value: +"ID of the milestone the run belongs to"
      • addedInput schema / properties / tags / description
        Added value: +"Tag names, e.g. [\"nightly\", \"smoke\"]"
    • Changedqase_triage_defect3 fields changed
      • addedInput schema / properties / custom_field / description
        Added value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"
      • addedInput schema / properties / description / description
        Added value: +"Extra context beyond the observed behavior"
      • addedInput schema / properties / tags / description
        Added value: +"Tag names, e.g. [\"regression\", \"payments\"]"
  4. 1 tool updatev2.5.0
    • Changedqase_case_upsert2 fields changed
      • addedInput schema / properties / is_flaky / description
        Added value: +"Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too."
      • changedInput schema / properties / is_flaky / type
        Previous value: -"boolean"New value: +"string"
  5. 2 tool updatesv2.4.1
    • Changedqase_ci_report2 fields changed
      • changedInput schema / properties / results / description
        Previous value: -"Test results to record"New value: +"Test results to record, 1 to 2000 per call"
      • addedInput schema / properties / results / maxItems
        Added value: +2000
    • Changedqase_result_record2 fields changed
      • changedInput schema / properties / results / description
        Previous value: -"One or more results to record"New value: +"Results to record, 1 to 200 per call"
      • addedInput schema / properties / results / maxItems
        Added value: +200
  6. 7 tool updatesv2.2.1
    • Addedqase_attachment_upload
    • Changedqase_case_upsert3 fields changed
      • addedInput schema / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
      • changedInput schema / properties / steps / items / properties / attachments / description
        Previous value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload"
      • changedInput schema / properties / steps / items / properties / steps / items / properties / attachments / description
        Previous value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload"
    • Changedqase_ci_report1 field changed
      • addedInput schema / properties / results / items / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
    • Changedqase_defect_upsert1 field changed
      • addedInput schema / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
    • Changedqase_get1 field changed
      • changedInput schema / properties / entity / enum
        Previous 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"
        +]
    • Changedqase_result_record2 fields changed
      • addedInput schema / properties / results / items / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
      • addedInput schema / properties / results / items / properties / steps / items / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
    • Changedqase_triage_defect1 field changed
      • addedInput schema / properties / attachments / description
        Added value: +"Attachment hashes from qase_attachment_upload"
  7. 4 tool updatesv2.1.1
    • Changedqase_project_context3 fields changed
      • addedInput schema / properties / full
        Added 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"
        +}
      • addedOutput schema / properties / coverage
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "project",
        -  "suites",
        -  "milestones",
        -  "environments"
        -]New value: +[
        +  "project",
        +  "suites",
        +  "milestones",
        +  "environments",
        +  "coverage"
        +]
    • Changedqase_triage_defect7 fields changed
      • changedInput schema / properties / actual_result / description
        Previous value: -"Observed behavior"New value: +"Observed behavior. Required by the API"
      • removedInput schema / properties / failed_result_ids
        Removed value: -{
        -  "description": "Result hashes to link to this defect (from the run)",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / run_id
        Removed value: -{
        -  "description": "Run containing the failed results",
        -  "exclusiveMinimum": 0,
        -  "type": "integer"
        -}
      • addedInput schema / properties / severity / description
        Added value: +"Required by the API"
      • changedInput schema / required
        Previous value: -[
        -  "code",
        -  "title"
        -]New value: +[
        +  "code",
        +  "title",
        +  "severity",
        +  "actual_result"
        +]
      • removedOutput schema / properties / linked_results
        Removed value: -{
        -  "description": "Number of linked result hashes",
        -  "type": "integer"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "defect_id",
        -  "linked_results"
        -]New value: +[
        +  "defect_id"
        +]
    • Changedqql_help3 fields changed
      • changedInput schema / properties / topic / description
        Previous 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"
      • changedInput schema / properties / topic / enum
        Previous value: -[
        -  "syntax",
        -  "entities",
        -  "operators",
        -  "functions",
        -  "examples"
        -]New value: +[
        +  "overview",
        +  "syntax",
        +  "entities",
        +  "operators",
        +  "functions",
        +  "examples",
        +  "aggregation",
        +  "enumValues"
        +]
      • addedInput schema / required
        Added value: +[
        +  "topic"
        +]
    • Changedqql_search2 fields changed
      • changedInput schema / properties / query / description
        Previous 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."
      • changedInput schema / properties / query / maxLength
        Previous value: -1000New value: +2000
  8. 2 tool updatesv2.0.3
    • Changedqase_case_upsert6 fields changed
      • changedInput schema / properties / steps / items / properties / action / description
        Previous value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set."
      • addedInput schema / properties / steps / items / properties / shared
        Added 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"
        +}
      • addedInput schema / properties / steps / items / properties / shared_step_hash
        Added value: +{
        +  "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.",
        +  "type": "string"
        +}
      • changedInput schema / properties / steps / items / properties / steps / items / properties / action / description
        Previous value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set."
      • addedInput schema / properties / steps / items / properties / steps / items / properties / shared
        Added 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"
        +}
      • addedInput schema / properties / steps / items / properties / steps / items / properties / shared_step_hash
        Added value: +{
        +  "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.",
        +  "type": "string"
        +}
    • Changedqase_get1 field changed
      • addedInput schema / properties / include
        Added 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"
        +}
  9. 90 tool updatesv2.0.0
    • Removedattach_external_issue
    • Removedbulk_create_cases
    • Removedcomplete_run
    • Removedcreate_case
    • Removedcreate_configuration_group
    • Removedcreate_custom_field
    • Removedcreate_defect
    • Removedcreate_environment
    • Removedcreate_milestone
    • Removedcreate_plan
    • Removedcreate_project
    • Removedcreate_result
    • Removedcreate_results_bulk
    • Removedcreate_run
    • Removedcreate_shared_step
    • Removedcreate_suite
    • Removeddelete_attachment
    • Removeddelete_case
    • Removeddelete_configuration_group
    • Removeddelete_custom_field
    • Removeddelete_defect
    • Removeddelete_environment
    • Removeddelete_milestone
    • Removeddelete_plan
    • Removeddelete_project
    • Removeddelete_result
    • Removeddelete_run
    • Removeddelete_run_public_link
    • Removeddelete_shared_step
    • Removeddelete_suite
    • Removeddetach_external_issue
    • Removedget_attachment
    • Removedget_author
    • Removedget_case
    • Removedget_custom_field
    • Removedget_defect
    • Removedget_environment
    • Removedget_milestone
    • Removedget_plan
    • Removedget_project
    • Removedget_result
    • Removedget_run
    • Removedget_run_public_link
    • Removedget_shared_parameter
    • Removedget_shared_step
    • Removedget_suite
    • Removedget_user
    • Removedgrant_project_access
    • Removedlist_attachments
    • Removedlist_authors
    • Removedlist_cases
    • Removedlist_configurations
    • Removedlist_custom_fields
    • Removedlist_defects
    • Removedlist_environments
    • Removedlist_milestones
    • Removedlist_plans
    • Removedlist_projects
    • Removedlist_results
    • Removedlist_runs
    • Removedlist_shared_parameters
    • Removedlist_shared_steps
    • Removedlist_suites
    • Removedlist_system_fields
    • Removedlist_users
    • Addedqase_api
    • Addedqase_case_upsert
    • Addedqase_ci_report
    • Addedqase_defect_upsert
    • Addedqase_discover_tools
    • Addedqase_get
    • Addedqase_project_context
    • Addedqase_regression_run
    • Addedqase_result_record
    • Addedqase_run_upsert
    • Addedqase_triage_defect
    • Changedqql_search1 field changed
      • changedOutput 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"
        +}
    • Removedresolve_defect
    • Removedrevoke_project_access
    • Removedupdate_case
    • Removedupdate_custom_field
    • Removedupdate_defect
    • Removedupdate_defect_status
    • Removedupdate_environment
    • Removedupdate_milestone
    • Removedupdate_plan
    • Removedupdate_result
    • Removedupdate_shared_step
    • Removedupdate_suite
    • Removedupload_attachment
  10. 3 tool updatesv1.1.8
    • Changedbulk_create_cases1 field changed
      • changedInput schema / properties / cases / items / properties / automation / description
        Previous value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
    • Changedcreate_case1 field changed
      • changedInput schema / properties / automation / description
        Previous value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
    • Changedupdate_case1 field changed
      • changedInput schema / properties / automation / description
        Previous value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
  11. 80 tool updatesv1.1.7
    • First observedattach_external_issue
    • First observedbulk_create_cases
    • First observedcomplete_run
    • First observedcreate_case
    • First observedcreate_configuration_group
    • First observedcreate_custom_field
    • First observedcreate_defect
    • First observedcreate_environment
    • First observedcreate_milestone
    • First observedcreate_plan
    • First observedcreate_project
    • First observedcreate_result
    • First observedcreate_results_bulk
    • First observedcreate_run
    • First observedcreate_shared_step
    • First observedcreate_suite
    • First observeddelete_attachment
    • First observeddelete_case
    • First observeddelete_configuration_group
    • First observeddelete_custom_field
    • First observeddelete_defect
    • First observeddelete_environment
    • First observeddelete_milestone
    • First observeddelete_plan
    • First observeddelete_project
    • First observeddelete_result
    • First observeddelete_run
    • First observeddelete_run_public_link
    • First observeddelete_shared_step
    • First observeddelete_suite
    • First observeddetach_external_issue
    • First observedget_attachment
    • First observedget_author
    • First observedget_case
    • First observedget_custom_field
    • First observedget_defect
    • First observedget_environment
    • First observedget_milestone
    • First observedget_plan
    • First observedget_project
    • First observedget_result
    • First observedget_run
    • First observedget_run_public_link
    • First observedget_shared_parameter
    • First observedget_shared_step
    • First observedget_suite
    • First observedget_user
    • First observedgrant_project_access
    • First observedlist_attachments
    • First observedlist_authors
    • First observedlist_cases
    • First observedlist_configurations
    • First observedlist_custom_fields
    • First observedlist_defects
    • First observedlist_environments
    • First observedlist_milestones
    • First observedlist_plans
    • First observedlist_projects
    • First observedlist_results
    • First observedlist_runs
    • First observedlist_shared_parameters
    • First observedlist_shared_steps
    • First observedlist_suites
    • First observedlist_system_fields
    • First observedlist_users
    • First observedqql_help
    • First observedqql_search
    • First observedresolve_defect
    • First observedrevoke_project_access
    • First observedupdate_case
    • First observedupdate_custom_field
    • First observedupdate_defect
    • First observedupdate_defect_status
    • First observedupdate_environment
    • First observedupdate_milestone
    • First observedupdate_plan
    • First observedupdate_result
    • First observedupdate_shared_step
    • First observedupdate_suite
    • First observedupload_attachment

TDQS

A4.4/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct action/resource: single vs bulk case writes, CI vs staged run recording, get-by-ID vs QQL search, and general vs triage defects are all clearly separated. The only intentionally overlapping tool is qase_api, but its description explicitly defers to dedicated tools.

Naming Consistency4/5

Most tools follow a qase_<resource>_<action> pattern (qase_case_upsert, qase_run_complete, qase_suite_upsert), and the qql_ prefix cleanly groups the search-language tools. A few names (qase_get, qase_api, qase_discover_tools, qase_triage_defect) deviate from the resource-first pattern, but the convention is still predictable.

Tool Count3/5

At 17 tools the server is at the low end of the heavy range (16-25), though each tool has a clear role and several are deliberate compound/escape-hatch tools. It is a reasonable count for Qase's broad domain, but more than a tightly curated 3-15 tool set.

Completeness4/5

Core workflows are well covered: project context, suites, cases, runs, results, defects, attachments, and general read/search. Delete, plan/milestone, review, and custom-field operations are hidden behind qase_discover_tools rather than present in the visible set, and qase_api covers edge cases, so gaps are minor and workaroundable.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers