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:

  • 36 task-oriented tools (37 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

37 tools across 6 groups (36 task-oriented tools plus qase_discover_tools for on-demand activation of secondary tools):

Group

Count

Description

Read

2

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

QQL

2

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

Write

28

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

Composite

3

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

Escape hatch

1

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

Meta

1

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

14 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 /v1/, and an optional body or query. See developers.qase.io for the reference. Prefer a dedicated tool wherever one exists: they normalize enums, validate arguments before spending a round trip, and shape the response for a model. This one hands back whatever the API returns. It sends JSON only and cannot upload files — multipart uploads go through qase_attachment_upload. A DELETE through this tool asks for confirmation the same way the dedicated delete tools do. Cost: one API call, typically 0.3-1.5s depending on the endpoint. No caching, no pagination help, no retries beyond the client defaults.

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

TDQS

A4.7/5.0
Behavior5/5

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

Even with annotations present, the description adds substantial behavioral context beyond them: JSON-only requests, no file uploads, DELETE confirmation behavior, passthrough of raw API responses, cost/latency expectations, and no caching/pagination/retries. This is exactly the kind of operational transparency a passthrough tool needs.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, invocation pattern, external reference, dedicated-tool preference, response behavior, file-upload limitation, DELETE handling, and performance expectations. It is front-loaded with the most decision-relevant information.

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

Completeness5/5

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

For a generic, open-ended API passthrough with no output schema, this description covers the essential operational and selection context: what it returns, what it cannot do, how it behaves for DELETE, cost/latency, and the lack of caching/pagination helpers. Nothing critical is missing for an agent to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description mentions passing the HTTP method, a /v1/ path, and optional body/query, but the schema already documents these parameters and their constraints. The description adds little new parameter-level meaning beyond pointing to the external API reference.

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

Purpose5/5

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

The description begins with a specific verb and resource: 'Call any Qase REST endpoint directly,' and immediately scopes it to 'the few things no dedicated tool covers.' This clearly distinguishes qase_api from the dedicated sibling tools, making its role unmistakable.

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

Usage Guidelines5/5

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

It explicitly says to 'Prefer a dedicated tool wherever one exists' and gives concrete reasoning: they normalize enums, validate arguments, and shape responses. It also names a sibling alternative for multipart uploads ('qase_attachment_upload'), giving agents clear when-to-use and when-not-to-use guidance.

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

qase_attachment_uploadUpload attachmentAInspect

Upload a file and get back the hash that other tools reference it by — screenshots, logs, HAR files, videos. Pass file_base64 with the base64-encoded bytes, or file_path with an absolute path; filename with its extension is always required. Use file_base64 unless the server runs on the same machine as the file: a remote server, the hosted connector included, cannot see your filesystem, and file_path will simply not find the file. The returned hash is what goes in the attachments field of qase_case_upsert, qase_result_record, qase_defect_upsert or qase_triage_defect — uploading alone attaches nothing, the hash has to be passed on. This is the only tool that sends multipart/form-data, which is why qase_api cannot send them. Upload once and reuse the hash rather than re-uploading the same evidence per case. Cost: one API call per file, dominated by file size rather than round trip — well under a second for a screenshot, seconds for a video. Base64 inflates the payload by about a third.

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.
filenameYesOriginal filename with extension
file_pathNoAbsolute 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_base64NoFile 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?

Annotations are minimal (only readOnlyHint, openWorldHint, etc.), so the description carries the full behavioral burden. It discloses that uploading alone attaches nothing, that the returned hash must be passed on, that file_path fails on remote servers, and gives cost/performance characteristics (base64 inflation, sub-second for screenshots). This is rich, non-obvious behavior beyond the schema.

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

Conciseness5/5

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

Every sentence earns its place: purpose, parameter choice, usage workflow, and cost are all covered with zero filler. The critical distinction between file_base64 and file_path is front-loaded, and the 'hash must be passed on' warning is placed prominently.

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

Completeness5/5

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

For a file-upload tool with no output schema, the description is exceptionally complete: it states what is returned, how the return value is consumed by other tools, the required parameter format, the only multipart/form-data sender, reuse guidance, and performance expectations. Nothing an agent needs to correctly invoke it is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by clarifying the required extension in filename, differentiating file_base64 vs file_path with explicit guidance on when to use each, and noting that the 'file' field is deprecated. This goes beyond the schema descriptions, warranting a 4.

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

Purpose5/5

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

Description states a specific verb ('Upload') and resource ('a file'), and makes the purpose explicit by explaining the returned hash is used by other tools. It distinguishes itself from siblings by noting it is the only tool that sends multipart/form-data, which qase_api cannot do.

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

Usage Guidelines5/5

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

Provides clear when-to-use guidance: it tells the agent to prefer file_base64 unless the server is local, explicitly names qase_api as the alternative it is not, and advises to reuse hashes instead of re-uploading. These exclusions and conditions leave nothing to inference.

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

qase_case_upsertCreate or update test caseAInspect

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

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, shared steps and parameters, attachments, external issue links, case reviews, defect triage, and project and custom-field management all exist but stay hidden until discovered. Search by what you are trying to do — "delete", "milestone", "attachment", "review", "custom field" — and matching tools are activated and become callable. Every word in the query must appear in a tool's name or description, so prefer two or three words over a sentence. Never conclude a capability is missing without searching here first. Cost: no API call, matching happens in memory, about 3ms. Free to call as often as needed.

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.9/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, the description adds valuable behavioral context: hidden tools are activated and become callable, matching happens in memory, there is no API call, and it costs about 3ms. This goes well beyond the annotations and clearly communicates side effects, performance, and cost.

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

Conciseness5/5

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

The description is moderately long but every sentence earns its place: it explains the problem, provides concrete examples, gives query-tuning advice, sets expectations about cost, and instructs the agent not to assume missing capabilities. The most important purpose is front-loaded, and the practical usage rules follow naturally.

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

Completeness5/5

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

The description is complete for an agent to call this tool correctly: it explains why the tool exists, how to search, what activation means, when to use it as a fallback, and the cost profile. The output schema covers return values, so the absence of return-value detail in the description is not a gap.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds meaningful guidance about the query parameter—search by intent, matching rules, and preference for short queries—which enhances the agent's ability to use it effectively. It does not add detail about category or activate, but the schema covers those adequately.

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

Purpose5/5

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

The description clearly states a specific verb and resource: 'Find and switch on tools that are hidden by default.' It goes on to enumerate exactly what kinds of hidden tools exist, making the purpose highly concrete and distinguishing it from the qase_* sibling tools, which are the tools being discovered.

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

Usage Guidelines5/5

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

Provides explicit usage guidance: search by intent, use two or three words instead of a full sentence, and 'Never conclude a capability is missing without searching here first.' It also explains the matching constraint that every word must appear in a tool's name or description, which directly informs query formulation.

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

qase_getGet 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_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_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. 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\"]"
  2. 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"
  3. 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
  4. 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"
  5. 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
  6. 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"
        +}
  7. 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
  8. 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)"
  9. 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.1/5.0

Scored across 14 tools

Disambiguation2/5

Several tools overlap heavily. qase_case_upsert, qase_run_upsert, and qase_defect_upsert all follow the same create-or-update pattern, while qase_ci_report and qase_run_upsert + qase_result_record can accomplish the same CI reporting workflow. qql_search vs qase_get vs qase_api vs qase_case_upsert also blur since qql_search can likely create/update via actions, and qase_api can do anything. There is also a hidden-tool discovery mechanism that makes the actual scope hard to determine.

Naming Consistency4/5

Most tool names follow a consistent qase_<domain>_<action> pattern (qase_get, qql_search, qase_case_upsert, qase_result_record). However, qql_search and qql_help break the qase_ prefix convention, and the verb-object order varies (qase_case_upsert vs qase_ci_report vs qase_discover_tools), creating minor inconsistency.

Tool Count3/5

14 tools is within an acceptable range, but the design splits the surface into visible core tools and hidden tools that must be discovered via qase_discover_tools. This means the effective tool count is much larger than 14, and the server intentionally hides capabilities, which complicates the set's coherence and predictability.

Completeness3/5

The server covers project context, search, CRUD for cases/runs/defects, CI reporting, and attachments. However, some obvious operations like deleting a case or run are hidden behind qase_discover_tools, update for runs is present but incomplete without a dedicated complete operation, and integration between defects and results is explicitly missing due to API limitations.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers