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

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

Beyond the annotations, the description discloses JSON-only request bodies, inability to upload files, raw API response passthrough, DELETE confirmation, typical latency/cost, and the absence of caching, pagination help, and extra retries. These are concrete behavioral traits that help an agent predict side effects. 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 front-loaded with purpose and usage, then moves through exclusions, safety behavior, and operational limits. Every sentence carries decision-relevant information for a generic passthrough tool, with no filler or repetition of schema details.

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 deliberately generic tool with no output schema, the description covers everything needed to invoke it correctly: HTTP method, path convention, optional body/query, reference link, JSON-only constraint, file upload exception, DELETE confirmation, cost/latency, and limitations. It sets correct expectations for response passthrough and lack of pagination/retries.

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 parameters are already documented at baseline. The description adds practical semantics: the path must start with /v1/, body and query are optional, and the API accepts JSON only. This goes beyond what the schema alone provides and justifies a score 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 opening sentence, 'Call any Qase REST endpoint directly, for the few things no dedicated tool covers,' gives a specific verb, resource, and role as a fallback. It explicitly distinguishes itself from siblings by positioning dedicated tools as the preferred route and this tool as the catch-all.

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 says to prefer a dedicated tool wherever one exists and gives the reason (enum normalization, validation, shaped responses). It also names qase_attachment_upload as the alternative for multipart uploads, and notes DELETE confirmation behavior. This is 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_uploadAInspect

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

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

Annotations already signal a non-read-only, non-idempotent operation, and the description adds meaningful context: uploading alone attaches nothing, the hash must be passed on, file_path will fail against remote servers, and each upload costs one API call. This goes well 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 longer than average, but every sentence earns its place: purpose, parameter choice, failure mode, downstream usage, and cost. It is front-loaded with the core purpose and the hash contract, making it easy to scan.

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

Completeness5/5

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

With no output schema, the description clearly states the return contract: the tool returns a hash to use in the attachments field of related tools. It also covers the critical failure mode and reuse recommendation, so an agent has enough context to call and use this tool 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 coverage is 100%, so the baseline is 3. The description reinforces the choice between file_base64 and file_path and confirms filename is always required, but most of this is already present in the schema. It adds little genuinely new per-parameter meaning.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Upload a file and get back the hash that other tools reference it by.' It also distinguishes this tool from qase_api by noting it is the only tool that sends multipart/form-data, so an agent can differentiate it from 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?

The description gives explicit when-to-use guidance: use file_base64 unless the server is on the same machine, file_path only works for local stdio servers, and the returned hash must be passed to specific sibling tools' attachments fields. It even explains why qase_api cannot handle these uploads, covering the main alternative.

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

qase_case_upsertAInspect

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) 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)
tagsNo
typeNoType label or numeric ID
layerNoLayer label or numeric ID
stepsNo
titleYesTest case title
statusNoStatus label or numeric ID
behaviorNoBehavior label or numeric ID
is_flakyNo
priorityNoPriority label or numeric ID (0=not set, 1=high, 2=medium, 3=low)
severityNoSeverity label or numeric ID
suite_idNo
automationNoAutomation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)
steps_typeNo
attachmentsNoAttachment hashes from qase_attachment_upload
descriptionNo
custom_fieldNo
milestone_idNo
preconditionsNo
postconditionsNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations mark this as a write operation (readOnlyHint=false, destructiveHint=false without idempotency), but the description adds meaningful behavior: enums normalize labels vs numeric IDs, steps can be classic or Gherkin, shared-step references resolve to shared_step_hash on read, and the review workflow may intercept direct writes. It doesn't spell out error semantics or whether update is partial or full, but the write path is well disclosed.

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 compact for 21 parameters, front-loaded with the create/update decision and alternatives. Every sentence adds useful guidance. The only waste is the measured timing detail ('Ten sequential calls measured 5.6s...') — it supports the bulk-create recommendation but is more evidence than need for an agent decision.

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

Completeness5/5

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

With 21 parameters, 52% schema coverage, nested objects, no output schema, and a complex upsert flow, this description covers all critical aspects: the id branch, enum values, shared steps, review-mode caveat, and the bulk alternative. Nothing an agent needs to invoke it correctly is missing from the core decision path.

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 only 52%, and this description compensates for the largest gap by explaining the core branching parameter semantics: id selects update vs create. It also gives meaning to enum fields collectively, and clarifies the steps object structure including the alias shared_step_hash for shared. That's exactly the kind of meaning the raw schema lacks.

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 the exact verb-resource relationship: 'Create or update a single test case' and immediately clarifies the id-based branching. This differentiates it from qase_case_bulk_create by name and by role. The first sentence alone gives an agent everything needed to decide whether this tool applies.

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 says when to use qase_case_bulk_create instead: 'Writing more than one case? Use qase_case_bulk_create instead.' It also instructs running qase_discover_tools with 'review' when the project has Test case review enabled, directing the agent to alternatives when direct writes may be blocked. That's excellent routing guidance, not just description.

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

qase_ci_reportAInspect

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. Cost: one tool call covering three API operations. 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
completeNoComplete the run after recording results (default: true)
is_autotestNoMark as automated run (default: true)
environment_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
run_idYesCreated run ID
run_statusYes
results_recordedYesNumber of results recorded

TDQS

A4.4/5.0
Behavior4/5

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

The description adds rich context beyond annotations, including the create/record/complete sequence, the no-half-open-run guarantee, and performance trade-offs. However, it states that the run is always completed, while the schema's `complete` parameter defaults to true but can be false, making that guarantee conditional.

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 behavior, then provides explicit routing rules and a useful cost/performance note. Every sentence contributes to selection or invocation, and the structure makes it easy to scan.

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

Completeness4/5

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

For a multi-step tool with six parameters and an output schema, the description is nearly complete: it explains the workflow, result shape, and alternatives. The only gap is the unconditional 'completes it' language, which should acknowledge the `complete` parameter's ability to leave the run open.

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 high (83%), so the baseline is 3. The description adds only a compact restatement of result requirements like numeric `case_id`, status, and optional attachment hashes; it does not add meaningful semantics for top-level parameters such as `code`, `title`, `environment_id`, or `complete` beyond what the schema already provides.

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: 'Report a whole CI run in one call: creates the run, records every result, and completes it.' It clearly identifies the operation and distinguishes it from the related split tools without requiring schema inspection.

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

Usage Guidelines5/5

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

It gives explicit selection guidance: use this after a pipeline finishes, use qase_result_record when the run already exists and results arrive in stages, and use qase_run_upsert when the run must stay open. These conditional rules fully route an agent to the correct sibling tool.

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

qase_defect_upsertAInspect

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)
tagsNo
titleYesDefect title
statusNoSet to "resolved" to resolve the defect
severityNo
attachmentsNoAttachment hashes from qase_attachment_upload
custom_fieldNo
actual_resultNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, openWorld=true, idempotent=false, destructive=false), the description discloses create/update branching, mandatory-field rejection, server-side severity label mapping, the dedicated resolve endpoint for status='resolved', and the lack of run/result attachment. No statement contradicts 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.

Conciseness4/5

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

The description is well front-loaded and every major sentence adds operational value, but the final cost sentence repeats 'about 0.5s' three times, introducing unnecessary redundancy. Apart from that, the structure is clear and scannable.

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

Completeness4/5

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

For a 9-parameter upsert with nested objects and no output schema, the description covers the critical invocation decisions: create vs update, required fields, label handling, resolve behavior, alternatives, duplicate avoidance, and cost. It does not describe return values or custom_field semantics, but those gaps do not block correct selection and invocation.

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?

With schema coverage at 56%, the description compensates by explaining the functional meaning of id, title/actual_result/severity requirements, and the enum labels for severity and status. It also clarifies how severity labels map to workspace IDs, which the schema does not convey.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Create or update a defect') and explains the create/update distinction by id, making the operation unambiguous. It also names the nearby sibling qase_triage_defect, so the agent can tell this tool apart from the test-failure-specific alternative.

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 use qase_triage_defect when the defect stems from a specific test failure, and instructs the agent to search with qql_search before filing duplicates. It also warns that runs/results cannot be attached to a defect, outlining when not to expect linking behavior.

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

qase_discover_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?

It discloses behaviors beyond the annotations: hidden-by-default state, in-memory matching, no API call, ~3ms cost, and that matching tools become activated and callable. These details complement the readOnlyHint, openWorldHint, and idempotentHint annotations without contradicting them.

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, hidden capabilities, usage trigger, query constraints, and cost. The description is dense but well-organized and front-loaded with the core purpose.

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

Completeness5/5

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

For a discovery tool with readOnly, openWorld, and idempotent annotations plus an output schema, the description covers all essential information: what the tool does, when to use it, how to search, side effects, and cost. Nothing needed for correct invocation 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 description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining query matching semantics and giving concrete example queries, though it does not add detail for the activate or category parameters.

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 first sentence names a specific verb ('Find and switch on') and resource ('tools that are hidden by default'), and the description lists concrete hidden capabilities such as deletes, attachments, and custom-field management. This makes it clearly distinguishable from sibling tools like qase_get or qase_api.

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: never conclude a capability is missing without searching here first. It also provides query strategy, examples, and the rule that every word in the query must appear in a tool name or description.

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

qase_getA
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.6/5.0
Behavior4/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive, so the description doesn't need to repeat that. It adds useful behavioral context: one API call, measured latency, and a concrete performance penalty for doing this in a loop instead of using qql_search. It doesn't cover error/not-found behavior, but that is a minor gap given the strong 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?

The description is front-loaded with the operation and entity list, followed by code requirements, then usage boundaries, then cost guidance. Every sentence earns its place, and the measured performance comparison directly supports the recommended routing to qql_search.

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

Completeness4/5

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

For a single-record fetch tool, the description covers scope, code requirements, field projection, and alternative routing, which is enough for correct selection and invocation. It could mention response/error shape and the include parameter more explicitly, but the schema covers include and annotations cover safety.

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 baseline is 3. The description adds meaningful nuance beyond the schema: code is required for project-scoped entities but can be omitted for global ones, and fields can be narrowed or set to ['*']. It does not add much about the include parameter, but the schema already documents that.

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 action and resource: 'Fetch one known record by type and ID', and enumerates all 16 supported entity types. This clearly distinguishes it from qql_search, which is for batched/filtered lookup, without requiring an agent to open 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 an explicit selection rule: 'Use this only when you already know the ID and want a single record.' It names the alternative, qql_search, and lists the exact conditions that should route an agent away from this tool: several records, filtered or 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_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?

The description adds substantial behavioral context beyond the annotations: 100-entity pagination limits per collection, the coverage field shape, truncation semantics, full:true behavior, cold vs. cached latency, response size, and cost in API calls. It also confirms read-only/idempotent behavior through 'Cached for 5 minutes' and 'repeat calls... return in about 5ms.'

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, first-call guidance, pagination behavior, alternatives, cost, latency, caching, and full-mode tradeoffs are all relevant for correct tool selection and invocation. The core purpose is front-loaded before performance and alternative details.

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 this complexity, the description covers what the tool returns, pagination limits, truncation detection, when to pass full:true, cost implications, alternatives, and caching behavior. The output schema handles the detailed return structure, so nothing essential is missing from the description.

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 both parameters are already documented. The description adds extra meaning for the full parameter by explaining the cost model ('one extra call per 100 entities') and directing users toward targeted tools when only a subset is needed. That goes beyond the schema 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 gives a specific verb and resource with an explicit inventory: 'Seed everything about a project in one call: project details, the full suite tree, milestones, environments, custom fields, and users.' It also clearly distinguishes itself from siblings by naming qase_get and qql_search as alternatives for different query patterns.

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?

Usage context is explicit: 'This is the first call to make when starting work on a project' and it 'replaces six separate list calls.' It also states when not to use it: 'For a single record you already have the ID for, qase_get is cheaper; for filtered or cross-project questions, use qql_search.' This gives the agent clear decision rules.

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

qase_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
descriptionNo
milestone_idNo
include_casesNoExplicit case IDs to include
environment_idNo

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish that the operation is not read-only, not idempotent, and not destructive. The description adds useful context beyond annotations: it resolves the source into cases, makes two API calls, and opens a run without closing one, including a rough latency estimate.

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 every sentence earns its place: purpose, alternative routing, and behavioral/cost notes. The core purpose is front-loaded, and there is no filler or repetition.

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

Completeness4/5

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

For a tool with 8 parameters and an output schema, the description covers the main invocation decision, the source-resolution behavior, and sibling alternatives. It is slightly incomplete only in not explaining the optional milestone/environment/description parameters or whether source selectors are mutually exclusive, but the schema and output schema mitigate the gap.

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 63%, so the description needs to add moderate value. It clarifies the semantics of the three source selectors (plan_id, suite_ids, include_cases) by explaining the tool resolves cases itself, but optional parameters such as milestone_id, environment_id, and description remain undocumented in both schema and description.

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 starts with a specific verb phrase, 'Build and start a test run from a suite, a test plan, or an explicit list of case IDs,' naming the resource and supported sources. It also explicitly differentiates the tool from qase_run_upsert and qase_ci_report, so an agent can select it without opening sibling 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?

It gives clear when-to-use guidance: launch a regression cycle from a source without first querying cases. It names alternatives and the conditions that select them — qase_run_upsert for hand-assembled runs, qase_ci_report for already-finished pipelines — and clarifies that this tool opens but does not close a run.

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

qase_result_recordAInspect

Record one or more 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. 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. 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
resultsYesOne or more results to record

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as a non-read-only, non-idempotent write. The description adds useful behavior: results require an existing run, results are sent together in one API call, status must be a string label rather than a numeric ID, and cost grows with payload size. Repeated-call semantics (append vs. update) are not disclosed, but core behavior is well conveyed.

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 each sentence carries informational weight: definition, batching, alternative tool, status constraints, and cost. There is slight redundancy between 'Pass several results in one call' and 'takes a list and sends them together,' but the structure remains purposeful.

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?

With no output schema, the description does not explain return values, but that is not critical for invoking the tool correctly. It covers the run prerequisite, batching behavior, status format, cost expectation, and the main sibling alternative. It could explicitly mention qase_run_upsert for non-CI run creation, but the given guidance is largely sufficient.

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 by clarifying the status enum usage, explicitly rejecting numeric IDs unlike case enums, and stressing that the results argument is a batchable 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 first sentence states a specific verb and resource: 'Record one or more results into an existing run.' The case-vs-result distinction and the explicit alternative to qase_ci_report make its scope unmistakable.

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

Usage Guidelines4/5

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

The description explicitly instructs batching multiple results into one call instead of calling per test, and names qase_ci_report as the correct alternative for a finished CI job without an existing run. It does not state what to do when a run is missing outside a CI context, but the prerequisite is clear.

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

qase_run_upsertAInspect

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)
tagsNo
casesNoCase IDs to include
titleYesRun title
plan_idNoTest plan to base run on
end_timeNoRFC3339 end time
start_timeNoRFC3339 start time
descriptionNo
is_autotestNo
custom_fieldNo
milestone_idNo
environment_idNo

TDQS

A4.8/5.0
Behavior5/5

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

The description carries the behavioral burden well despite minimal annotations. It reveals the create/update branch, the ordering dependency with qase_result_record, the role of a run as a results container, and the operational cost of one API call. This goes beyond what the annotations provide and contains no contradiction with them.

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 compact, front-loaded with the core behavior, and every clause earns its place. It packs branching behavior, ordering, scoping options, alternative-tool routing, and cost into a few tight sentences with no filler.

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

Completeness4/5

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

For a 13-parameter tool with no output schema, the description provides essential context: sequencing, scoping options, and tool-selection rules. A small gap is that it does not warn about the limited update support mentioned in the schema, but overall the description gives an agent enough to call this 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 description coverage is only 54%, so the description meaningfully compensates by explaining the defining behavior of 'id' (new vs update) and summarizing how milestone, environment, plan, and case IDs scope the run. It does not explain every optional parameter like custom_field or timestamps, but the schema already provides basic descriptions for those.

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 or update a test run.' It immediately clarifies the create-vs-update branching based on 'id' and distinguishes itself from nearby siblings like qase_result_record, qase_regression_run, and qase_ci_report.

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?

Usage guidance is explicit and actionable: open the run before calling qase_result_record; use qase_regression_run when building from a suite or plan; use qase_ci_report when the CI job has already finished. It gives clear selection criteria and even explains why the alternative avoids leaving a half-finished run.

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

qase_triage_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)
tagsNo
titleYesDefect title
severityYesRequired by the API
attachmentsNoAttachment hashes from qase_attachment_upload
descriptionNo
custom_fieldNo
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 disclosing API rejection behavior for missing fields, the inability to attach existing runs/results, the lack of a link in the UI, cost/latency, and per-defect call behavior. It does not contradict the readOnly/idempotent/destructive annotations.

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

Conciseness5/5

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

Every sentence carries operational information: purpose, requirements, API limitation, alternative tool, latency, and batching guidance. It is dense but not bloated, and the most important facts are front-loaded.

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 deciding whether and how to call this tool: it explains purpose, required fields, API limitations, expected behavior, cost, and the right alternative. With an output schema present, describing return values is unnecessary.

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 description adds meaningful parameter guidance: title, actual_result, and severity are required by the API, and failing results should be referenced inside actual_result. Schema coverage is 63%, so the description partially compensates, though optional params like tags, description, and custom_field remain unexplained.

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 'Create a defect from a test failure,' giving a specific verb, resource, and trigger context. It also explicitly names qase_defect_upsert as the alternative for non-failure defects, making sibling differentiation clear.

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 states exactly when to use this tool (test failures) and when not to (unrelated defects, use qase_defect_upsert). It also provides operational guidance: cluster identical failures, file one defect per distinct cause, and expect one API call per defect.

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

qql_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.2/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description adds value beyond them: no API call, static text, ~2ms latency, and free invocations. It also discloses the failure mode it guards against (rejected queries from nonexistent attributes) and that field names diverge from write tools. No contradiction with annotations; only the output format of the returned reference text is left unspecified.

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?

Every sentence earns its place: purpose, critical topics, rationale, session cadence, and cost. The inline topic list partially duplicates the schema enum, and the most actionable instruction ('once per session') sits mid-description rather than front-loaded, but the density of useful information justifies the length.

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

Completeness4/5

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

For a single-parameter, static-reference tool with fully documented enum values and strong annotations, the description covers everything essential: when to call, which topics exist, which matter most, why, and cost. The only gap is the unspecified shape of the returned reference text, which is minor given the low complexity and absence of an output schema.

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% with rich per-enum-value descriptions, so the baseline is 3. The description adds meaning by highlighting which topics matter most (entities, enumValues) and why — field names differ from write tools and unknown attributes cause rejection rather than being ignored. This elevates understanding beyond what the schema alone provides.

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

Purpose4/5

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

The description states a specific action — read the QQL reference — and enumerates the eight available topics, making the tool's function clear. It distinguishes itself from the qql_search sibling by framing this as the prerequisite reference lookup. Slight deduction: the phrasing is advisory ('Read the QQL reference before writing a query') rather than declarative about what the tool returns, so an agent must infer that the deliverable is the reference text for the requested topic.

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 names the alternative (qql_search), prescribes cadence ('once per session before the first qql_search'), and discourages the anti-pattern ('rather than guessing and retrying'). It also justifies the rule by disclosing the consequence — QQL rejects queries naming nonexistent attributes instead of ignoring them, and field names differ from the write tools. Nothing about when or when not to call is left to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 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"
  2. 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
  3. 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"
        +}
  4. 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
  5. 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)"
  6. 80 tool updatesv1.1.7
    • First observedattach_external_issue
    • First observedbulk_create_cases
    • First observedcomplete_run
    • First observedcreate_case
    • First observedcreate_configuration_group
    • First observedcreate_custom_field
    • First observedcreate_defect
    • First observedcreate_environment
    • First observedcreate_milestone
    • First observedcreate_plan
    • First observedcreate_project
    • First observedcreate_result
    • First observedcreate_results_bulk
    • First observedcreate_run
    • First observedcreate_shared_step
    • First observedcreate_suite
    • First observeddelete_attachment
    • First observeddelete_case
    • First observeddelete_configuration_group
    • First observeddelete_custom_field
    • First observeddelete_defect
    • First observeddelete_environment
    • First observeddelete_milestone
    • First observeddelete_plan
    • First observeddelete_project
    • First observeddelete_result
    • First observeddelete_run
    • First observeddelete_run_public_link
    • First observeddelete_shared_step
    • First observeddelete_suite
    • First observeddetach_external_issue
    • First observedget_attachment
    • First observedget_author
    • First observedget_case
    • First observedget_custom_field
    • First observedget_defect
    • First observedget_environment
    • First observedget_milestone
    • First observedget_plan
    • First observedget_project
    • First observedget_result
    • First observedget_run
    • First observedget_run_public_link
    • First observedget_shared_parameter
    • First observedget_shared_step
    • First observedget_suite
    • First observedget_user
    • First observedgrant_project_access
    • First observedlist_attachments
    • First observedlist_authors
    • First observedlist_cases
    • First observedlist_configurations
    • First observedlist_custom_fields
    • First observedlist_defects
    • First observedlist_environments
    • First observedlist_milestones
    • First observedlist_plans
    • First observedlist_projects
    • First observedlist_results
    • First observedlist_runs
    • First observedlist_shared_parameters
    • First observedlist_shared_steps
    • First observedlist_suites
    • First observedlist_system_fields
    • First observedlist_users
    • First observedqql_help
    • First observedqql_search
    • First observedresolve_defect
    • First observedrevoke_project_access
    • First observedupdate_case
    • First observedupdate_custom_field
    • First observedupdate_defect
    • First observedupdate_defect_status
    • First observedupdate_environment
    • First observedupdate_milestone
    • First observedupdate_plan
    • First observedupdate_result
    • First observedupdate_shared_step
    • First observedupdate_suite
    • First observedupload_attachment

TDQS

A4.4/5.0
Disambiguation4/5

Most tools target clearly distinct resources and lifecycle stages: case/defect/run upserts, result recording, CI reporting, search, and project context are easy to tell apart. The main ambiguity is qase_defect_upsert versus qase_triage_defect, which are nearly identical in behavior, and qase_api intentionally overlaps everything, though its description mitigates that.

Naming Consistency3/5

The qase_/qql_ prefixes give the set cohesion, but the action/noun ordering is inconsistent: qase_case_upsert and qase_result_record are noun_verb, qase_triage_defect and qase_discover_tools are verb_noun, and qase_get, qase_api, and qase_project_context follow no shared pattern. Names are readable, but not predictable enough for a consistent convention.

Tool Count5/5

14 tools is well-scoped for a Qase test management server: cases, runs, results, defects, attachments, search, context seeding, CI reporting, and a generic REST fallback are all covered without bloat. The hidden-tools mechanism keeps the core list focused while allowing expansion on demand.

Completeness5/5

The visible tools cover the major workflows, and qase_api provides a direct REST escape hatch for anything not dedicated. qase_discover_tools explicitly exposes hidden capabilities like deletes, shared steps, reviews, and project management, while qql_search and qase_project_context fill read/query needs. There are no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessSlow

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/qase-tms/qase-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server