Qase MCP Server
OfficialThis Qase MCP server lets AI assistants read and write Qase Test Management data (projects, cases, runs, results, defects and more) through 40 task-oriented tools plus discovery/help meta tools.
Bootstrap & read: fetch any record by type/ID (
qase_get), or seed a whole project's structure — suites, milestones, environments, custom fields, users — in one call (qase_project_context).Search: query cases, runs, results, defects and plans with Qase Query Language (
qql_search), with syntax help viaqql_help.Test cases: create/update single cases (
qase_case_upsert), bulk-create up to 100 (qase_case_bulk_create), delete them, and manage suites, shared steps, milestones, test plans and environments.Runs & results: open/update runs, record up to 200 results into an existing run (
qase_result_record), complete or delete runs, delete individual results, and build regression runs from a suite, plan or case list (qase_regression_run).CI reporting: report a finished pipeline end-to-end — create run, record results, complete — in one call (
qase_ci_report).Defects: file and update defects, including failure triage with context written in (
qase_triage_defect).Test case reviews: propose create/edit reviews, bulk-open them, update proposals/reviewers, list status and delete drafts (approving/merging is UI-only).
Attachments: upload files (base64, path, or up to 20 per request) to get hashes, and delete them.
Custom fields: create/update workspace-wide custom fields and delete them.
External links: attach/detach Jira Cloud or Jira Server issues to cases and runs.
Projects: create projects (no update endpoint) and delete them entirely.
Escape hatch: call any Qase REST endpoint directly via
qase_apifor anything the dedicated tools don't cover.Meta/help: discover tools by task (
qase_discover_tools) and read a tool's full documentation on demand (qase_tool_help).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Qase MCP Serverlist test cases in project 'Mobile App'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qase MCP Server
Official Model Context Protocol (MCP) server for Qase Test Management Platform — connect AI assistants to your test cases, runs, defects, and more.
Table of Contents
Related MCP server: qtm4j-mcp-server
Overview
The Qase MCP Server lets AI assistants (Claude, Cursor, Codex, and any other MCP client) read and write Qase test cases, runs, results, defects, suites, milestones, and more — through a standardized protocol, with no custom integration code.
Features:
40 task-oriented tools (42 total, with
qase_discover_toolsandqase_tool_help) — consolidated from 83 v1 tools for lower token usage and better LLM accuracyComposite tools — multi-step workflows in a single call: CI reporting, defect triage, regression run setup
QQL support — Qase Query Language for advanced searches across cases, runs, results, defects, and plans
Project context bootstrap — one call returns full project structure (suites, milestones, environments, users, custom fields)
Test case review — propose new cases or changes for review, assign reviewers, and track status (approving and merging remain UI-only)
Short descriptions, documentation on demand — every tool is listed from the first request;
qase_tool_helpreturns a tool's full documentation when the agent first reaches for it, andqase_discover_toolssearches the catalogue by taskHosted or self-run — connect to
https://mcp.qase.io/mcp(orhttps://mcp-eu.qase.io/mcpon the EU cluster) with just your Qase login, or run the server locally with your own API tokenTenant-safe caching & HTTP resilience — two-tier cache (in-memory + optional Redis), connection pooling, retry with backoff
Escape hatch — direct REST API access for any endpoint via
qase_api
Use Cases
Scenario | Example prompt | Tool |
Bootstrap project context | "Show me the structure of project DEMO — suites, milestones, environments" |
|
Create or update a test case | "Create a high-priority smoke test case in project DEMO titled 'Login with valid credentials'" |
|
Report CI results | "Report these CI results for project DEMO: case 1 passed, case 2 failed with 'timeout error'" |
|
Triage a failed test | "Create a critical defect for the login timeout failure in run #42" |
|
Search with QQL | "Find all failed test results from the last 7 days in project DEMO" |
|
See Tools and docs/tools.md for the full reference.
Quick Start
Use the hosted Qase MCP (recommended)
No install, no API token — connect to the Qase-hosted server and sign in with your Qase account.
Note: The hosted Qase MCP is available on every paid plan. On the Free plan, or on a dedicated instance, run the server yourself with your own API token — that works everywhere.
Pick the URL for your region:
https://mcp.qase.io/mcpfor the main cloud (app.qase.io),https://mcp-eu.qase.io/mcpfor the EU cluster (app-eu.qase.io). The examples below use the main cloud; on the EU cluster substitute the EU URL and change nothing else.
Claude — open Settings → Connectors, find Qase Test Management, click Connect. (The directory connector is main-cloud; on the EU cluster add
https://mcp-eu.qase.io/mcpas a custom connector.)Cursor — add
{"mcpServers": {"qase": {"url": "https://mcp.qase.io/mcp"}}}to.cursor/mcp.json.Codex — add the URL
https://mcp.qase.io/mcpin Settings → MCPs → Add server, or configure~/.codex/config.tomlfor the CLI.VS Code — add
{"servers": {"qase": {"type": "http", "url": "https://mcp.qase.io/mcp"}}}to.vscode/mcp.json, or run MCP: Add Server.
Full per-client steps, other clients, and the active-workspace model: docs/connect.md.
Run it yourself
Install the package and provide your own API token:
npm install -g @qase/mcp-server
export QASE_API_TOKEN=your_api_token_hereThen point your MCP client's stdio config at the @qase/mcp-server binary. Full install options, client configs (Claude Desktop, Cursor, Claude Code, Codex, OpenCode), environment variables, and transports (stdio/SSE/streamable-HTTP): docs/self-run.md.
Building on top of this server
For integration authors only — if you use the server directly, nothing here applies to you.
If your product drives this server (a plugin, an agent, a wrapper CLI), it can identify itself so its usage is attributable in Qase analytics, independently of which AI host is connected:
QASE_MCP_INTEGRATION=quality-supervisor/1.4.0 # <name>/<version>, version optionalThe name must be on the allowlist in src/utils/integration-marker.ts — add yours in a PR. Anything unlisted or malformed is ignored, and the API call still succeeds. HTTP transports also accept the marker per request (X-Qase-Integration header or ?integration=). Details: docs/self-run.md.
Upgrading
From 2.x to 3.0.0: no tool was renamed and no argument changed, so prompts and automation keep working. What changed is the protocol underneath — the server speaks MCP 2026-07-28, sessions are gone, every tool is listed from the first request, and deleting takes two round trips. Self-hosting more than one replica now requires QASE_MCP_REQUEST_STATE_KEY.
From v1 to v2: v2 consolidated 83 v1 tools into 29 task-oriented tools (30 total, including a discovery tool), and has since grown to 40 (42 total). Tool names and response shapes have changed.
Both upgrades, with the complete v1 → v2 tool mapping table and before/after examples: docs/migration.md.
Tools
42 tools across 6 groups (40 task-oriented tools plus two meta tools: qase_discover_tools to search the catalogue and qase_tool_help to read a tool's full documentation). All of them are listed from the first request:
Group | Count | Description |
Read | 2 | Fetch any entity by type/ID, or bootstrap full project context in one call |
QQL | 2 | Search across cases, runs, results, defects, and plans with Qase Query Language |
Write | 32 | Create, update, and delete cases (single or up to 100 at once), runs, results, defects, suites, milestones, plans, shared steps, environments, and attachments; link cases and runs to Jira issues; propose and manage test case reviews |
Composite | 3 | Multi-step workflows in one call: CI reporting, defect triage, regression run setup |
Escape hatch | 1 | Direct REST API access for any endpoint not covered by the tools above |
Meta | 2 |
|
Full tool-by-tool reference with parameters: docs/tools.md.
Documentation
docs/connect.md — connect to the hosted Qase MCP (Claude, Cursor, Codex, other clients)
docs/self-run.md — install and run the server yourself (config, clients, transports)
docs/tools.md — full tool reference, groups, and the discovery model
docs/troubleshooting.md — auth, OAuth/connector, and SSL issues
docs/migration.md — upgrade guides: 2.x → 3.0.0, and the v1 → v2 tool mapping
Contributing
Contributions are welcome! See CONTRIBUTING.md for development setup, testing, and linting guidelines.
License
MIT License — see LICENSE for details.
Support
Documentation: https://docs.qase.io/en/articles/14984302-qase-mcp-server
Email: support@qase.io
GitHub Issues: https://github.com/qase-tms/qase-mcp-server/issues
Links
Qase Platform: https://qase.io
Qase Documentation: https://help.qase.io
API Documentation: https://developers.qase.io
MCP Protocol: https://modelcontextprotocol.io
Issue Tracker: https://github.com/qase-tms/qase-mcp-server/issues
Available Tools
42 toolsqase_apiCall Qase APIAInspect
Call any Qase REST endpoint directly, for the few things no dedicated tool covers: method, a /v1/… path on the configured host, optional body or query. Prefer a dedicated tool where one exists — they normalize enums and validate before spending a call. JSON only; uploads go through qase_attachment_upload. A DELETE asks for confirmation like the dedicated delete tools. Cost: one API call, 0.3-1.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body for POST/PUT/PATCH | |
| path | Yes | API path starting with a version segment (e.g., "/v1/project/DEMO/run") | |
| query | No | Query parameters | |
| method | No | HTTP method | GET |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only destructiveHint=false, so the description does real work: it discloses JSON-only payloads, that DELETE triggers a confirmation prompt like the dedicated delete tools, and an expected cost/latency (one API call, 0.3-1.5s). It stops short of covering auth expectations or how errors from arbitrary endpoints surface, which for an unbounded passthrough tool would be useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what the tool is and the routing rule, then the constraints (JSON, uploads, DELETE confirmation) and finally the cost. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unbounded REST passthrough with no output schema, the definition covers routing, format, confirmation behavior and cost. The remaining gap is error/response handling for arbitrary endpoints (e.g., how non-2xx responses are surfaced), which a generic caller would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new meaning by noting that dedicated tools 'normalize enums and validate' while this one does not — implying callers must supply raw, unvalidated values. It also clarifies the path is 'on the configured host' and that body/query are optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (call) and resource (any Qase REST endpoint) and immediately positions itself as the escape hatch 'for the few things no dedicated tool covers'. It is unmistakable against siblings like qase_get or the dedicated *_upsert/*_delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('only where no dedicated tool covers it'), an explicit preference ('Prefer a dedicated tool where one exists') with the reason (they normalize enums and validate before spending a call), and a named exclusion/alternative (uploads go through qase_attachment_upload).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_attachment_deleteDelete attachmentAIdempotentInspect
Delete an attachment by its hash (from qase_attachment_upload). Anything referencing it keeps the reference but the file is gone; this cannot be undone. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes | Attachment hash identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the lone idempotentHint annotation: it discloses that references remain dangling while the file itself is removed, that the action is irreversible, that user confirmation is requested, and even the cost (one API call, ~0.4s). These are exactly the consequences an agent needs before firing a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence front-loads the action and its key, then stacks consequence, irreversibility, confirmation, and cost without padding. Every clause carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, no output schema, and no nested objects, the definition covers everything needed: what to pass, where to get it, what happens after, and the interaction cost. Nothing material is missing for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the 'hash' parameter is already documented, but the description adds provenance ('from qase_attachment_upload'), telling the agent where a valid value comes from rather than just its type. That is genuine added meaning over the thin schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Delete an attachment') and identifies the identifying key ('by its hash'), immediately distinguishing it from siblings like qase_attachment_upload. An agent knows exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent to qase_attachment_upload as the source of the hash and notes a user-confirmation step before execution. It gives clear context for invoking the tool but does not enumerate when-not-to-use conditions, which is minor for a terminal delete operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_attachment_uploadUpload attachmentAInspect
Upload files and get back the hashes other tools reference them by. Pass file_base64 plus filename for one file, or files for several in one request; file_path only works when the server runs on the same machine as the file — never on the hosted connector. The hash must then be passed in an attachments field; uploading alone attaches nothing. This is the only tool that sends multipart/form-data, which is why qase_api cannot send files. Cost: one API call per request, dominated by size.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| file | No | Deprecated: use file_base64 or file_path. Accepts an absolute path or base64 content. | |
| files | No | Several files in one request, each entry with its own filename plus file_base64 or file_path. One round trip, hashes returned in the same order. Limits and sizing are in qase_tool_help. | |
| filename | No | Original filename with extension. Required for the single-file form. | |
| file_path | No | Single-file form. Absolute path on the machine running THIS server; a remote server cannot see it — send file_base64 instead. | |
| file_base64 | No | Single-file form. File content, base64 encoded. Use this unless the server runs on the same machine as the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=false, so the description does the real work: it discloses the hash-return contract, the remote-vs-local file_path limitation, the multipart/form-data uniqueness, and a cost model ('one API call per request, dominated by size'). These are behavioral traits no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the payoff (get back hashes), then layers mode selection, the attach step, and cost. Every sentence carries distinct, non-redundant information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value (ordered hashes) and the follow-up requirement, plus where limits live (qase_tool_help). For a 6-param upload tool with a two-step workflow, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter logic the schema doesn't state — single-file form (file_base64+filename) vs multi-file form (files), and the conditional validity of file_path based on server locality. It doesn't cover the deprecated `file` param or the code pattern, keeping it just below the top.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Upload files') and immediately names the output artifact (hashes other tools reference them by). It also differentiates itself from the qase_api sibling by explaining that this is the only tool that sends multipart/form-data, so an agent knows why to pick this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly distinguishes the three input modes: file_base64+filename for a single file, files for several, and file_path only when server and file share a machine (never on the hosted connector). It also discloses the two-step workflow — 'uploading alone attaches nothing' and the hash must be passed in an `attachments` field — so the agent knows this tool is not sufficient on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_case_bulk_createBulk create test casesAInspect
Create up to 100 test cases in one request — the batch form of qase_case_upsert, and the right tool whenever more than one case is being written. Same fields and enum handling as qase_case_upsert; creates only, update through qase_case_upsert with id. Cost: one API call regardless of batch size — ten cases measured 1.2s against 5.6s as ten separate calls.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| cases | Yes | Test cases to create, 1 to 100 per call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=false. The description adds that this tool creates only (never updates), the 100-case batch ceiling, and a concrete cost profile (one API call, 1.2s vs 5.6s). It stops short of disclosing failure behavior for a partially invalid batch, which is the notable residual gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the limit and the sibling relationship before the cost justification. The benchmark sentence is longer than strictly necessary but does earn its place by justifying batch use over loops.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 2-parameter batch-create tool with full schema coverage and no output schema needs little more. The one gap is atomicity: the description doesn't say whether a bad case rejects the whole batch or is skipped, which matters for a 100-item call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the batch fields and step structure are already documented in the schema. The description adds only that field and enum handling match qase_case_upsert, which is a light pointer rather than new per-parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (test cases) with scope (up to 100 per request) and explicitly positions itself as the batch form of qase_case_upsert. An agent can distinguish it from the single-case sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule — 'the right tool whenever more than one case is being written' — and names the alternative for the other case (update through qase_case_upsert with `id`). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_case_deleteDelete test caseAIdempotentInspect
Delete a test case by project code and ID. Its execution history goes with it and this cannot be undone; consider marking it deprecated through qase_case_upsert instead. No bulk delete — one call each, each asking the user for confirmation. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply idempotentHint, so the description carries the destructive profile and does so well: it discloses collateral damage ('its execution history goes with it'), irreversibility ('cannot be undone'), the one-per-call limitation, and a human confirmation requirement. It even quantifies cost at one API call / ~0.4s. Nothing contradicts idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences ordered by importance: what it does, what is destroyed plus the safer alternative, then the batching and cost constraints. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema, the description covers the full decision surface: scope, irreversibility, execution-history loss, the non-bulk constraint, the confirmation requirement, and the alternate safe path. An agent has everything needed to call it correctly or avoid it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (code, id) are already documented with pattern and range constraints. The description only restates that identification is by project code and ID, adding no format or edge-case detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a test case') and narrows the identifier to 'by project code and ID', which maps directly onto the two schema properties. An agent can distinguish it from qase_case_upsert and other *_delete siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to an alternative ('consider marking it deprecated through qase_case_upsert instead') and states an exclusion ('No bulk delete — one call each, each asking the user for confirmation'). Both when-to-use and when-not-to-use are covered.
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, without it creates. Enum fields accept a label such as "high" or the project's numeric ID. Writing more than one case? Use qase_case_bulk_create — one request instead of one per case. If the project has "Test case review" enabled, writes may need a review — run qase_discover_tools with "review". Cost: one API call, about 0.6s to create, 0.4s to update.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Case ID — if provided, updates the case; if omitted, creates a new one | |
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["smoke", "billing"] | |
| type | No | Type label or numeric ID | |
| layer | No | Layer label or numeric ID | |
| steps | No | Ordered test steps; omit for a case without steps | |
| title | Yes | Test case title | |
| status | No | Status label or numeric ID | |
| behavior | No | Behavior label or numeric ID | |
| is_flaky | No | Is flaky: 0=No, 1=Yes; a boolean works too. | |
| priority | No | Priority label or numeric ID (0=not set, 1=high, 2=medium, 3=low) | |
| severity | No | Severity label or numeric ID | |
| suite_id | No | ID of the suite that holds the case | |
| automation | No | Automation: 0=Manual, 1=To be automated, 2=Automated (label or ID) | |
| steps_type | No | Step style: "classic" action/expected, or "gherkin" scenario text | |
| attachments | No | Hashes from qase_attachment_upload | |
| description | No | Free-form description of what the case covers | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the case belongs to | |
| preconditions | No | State the system must be in before the steps run | |
| postconditions | No | State to restore or verify after the steps run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=false in annotations, the description carries most of the burden and does well: it discloses the review-gating workflow, per-operation latency cost, and the enum label-vs-numeric-ID convention. It does not state what happens to fields omitted on an update (partial merge vs. overwrite), which for an upsert tool is the remaining behavioral unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six tight sentences, front-loaded with the create/update rule, then scaling guidance, then prerequisites, then cost. No filler and nothing buried at the end that an agent needs first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 21-parameter tool with nested step objects and no output schema, the description covers the operation branch, sibling routing, and the review gate. The one omission is update semantics for partially supplied parameters, though 100% schema coverage and the absence of an output schema limit the severity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the useful convention that enum fields accept a label like 'high' or a numeric ID, but the schema already repeats 'label or numeric ID' on each such parameter, so the added meaning is marginal rather than substantial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair ('create or update a single test case') and immediately disambiguates the upsert semantics: id present means update, absent means create. This cleanly separates it from sibling qase_case_bulk_create and qase_case_delete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes multi-case writes to qase_case_bulk_create with the reason ('one request instead of one per case'), and names qase_discover_tools with the 'review' query when the project has Test case review enabled. Both an alternative and a conditional prerequisite are given, not implied.
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 finished CI run in one call: creates the run, records every result, completes it. Use qase_result_record instead when the run already exists and results arrive in stages. Each result needs a numeric case_id and a status; batches over 200 are split for you, up to 2000. Cost: three API operations behind one call, about 0.7s for a small run.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| title | Yes | Run title (e.g., "CI Build #1234") | |
| results | Yes | Test results to record, 1 to 2000 per call | |
| complete | No | Complete the run after recording results (default: true) | |
| is_autotest | No | Mark as automated run (default: true) | |
| environment_id | No | ID of the environment the build ran against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries most of the burden and does well: it discloses the composite nature (three API operations behind one call), the automatic batch splitting over 200, the 2000 ceiling, and an approximate latency. It stops short of stating auth/permission requirements, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences with zero waste: the operation, the routing alternative, the batching constraint, and the cost. Each sentence adds a distinct piece of decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter composite tool with no output schema, the description covers the operation, the alternative, batching limits, and cost. The main omission is what the call returns (e.g., run id) and permission requirements, but these are minor against an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so fields like case_id, status enum, complete, and is_autotest are already documented in the schema. The description only restates that each result needs a numeric case_id and a status, adding no syntax or semantic detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise compound verb+resource: creates a run, records every result, and completes it. It explicitly names the sibling it is not (qase_result_record) and the condition that selects it, so an agent can distinguish it from qase_run_upsert and qase_result_record without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('whole finished CI run in one call') and a named alternative with the distinguishing condition ('when the run already exists and results arrive in stages, use qase_result_record'). 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_custom_field_deleteDelete custom fieldAIdempotentInspect
Delete a custom field by ID. Reach is workspace-wide: it disappears from every project, with the values entered for it, and this cannot be undone. To remove it from one project only, edit projects_codes with qase_custom_field_upsert. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint, so the description carries the safety burden and does so richly: workspace-wide reach, that it removes the field and its entered values from every project, that it 'cannot be undone', and that it asks the user for confirmation first. It even discloses cost/latency, well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then scope/irreversibility, then the alternative, then confirmation and cost. Each sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete with no output schema, the description covers everything an agent needs: scope, irreversibility, confirmation behavior, and the sibling route to a narrower operation. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single required `id` parameter, and the description only adds 'by ID'. The schema already documents the field, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a custom field by ID') and immediately distinguishes itself from the sibling `qase_custom_field_upsert` by name. An agent can tell this apart from the upsert tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the condition that selects an alternative: 'To remove it from one project only, edit `projects_codes` with qase_custom_field_upsert.' This gives both when-to-use and a named alternative, leaving 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_custom_field_upsertCreate or update custom fieldAInspect
Create or update a custom field. On create, entity (case, run, defect) and type are required and fixed forever — the update endpoint cannot change them. Fields are workspace-wide; scope with projects_codes or is_enabled_for_all_projects. Read existing fields with qase_project_context or qase_get. Cost: one call to create, two to update, 0.5-0.9s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Custom field ID — if provided, updates; if omitted, creates | |
| type | No | Field type. Required when creating; cannot be changed later | |
| title | Yes | Field title | |
| value | No | Option titles — required for selectbox, radio and multiselect | |
| entity | No | What the field is attached to. Required when creating; cannot be changed later | |
| is_visible | No | Whether the field is shown on the entity | |
| is_required | No | Whether a value must be given on create | |
| placeholder | No | Hint shown in the empty field | |
| default_value | No | Value a new entity gets when none is entered | |
| is_filterable | No | Whether the field can be used as a filter | |
| projects_codes | No | Projects the field applies to. Ignored when is_enabled_for_all_projects is true | |
| is_enabled_for_all_projects | No | Apply to every project in the workspace, instead of only those in projects_codes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=false in annotations, the description does real work: it discloses that entity/type are fixed forever after create, that fields are workspace-wide with projects_codes/is_enabled_for_all_projects scoping, and gives per-call cost and latency. It omits one important behavior for an upsert with 12 params — whether an update merges or replaces unspecified fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the immutability constraint, then scoping, read alternative, and cost. No filler; each clause adds an actionable fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-output-schema mutation tool it covers purpose, key constraints, scoping, read alternatives, and cost. The only notable omission is update merge/replace semantics, which leaves one gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the id create-vs-update semantics and the projects_codes/is_enabled_for_all_projects precedence. The description largely restates what the schema already conveys, yielding the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create or update) plus resource (custom field), and the pairing with the qase_custom_field_delete sibling is unambiguous. The added note that entity/type are required on create and immutable afterwards further pins down what this tool does versus a generic upsert.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to alternatives for the read path ('Read existing fields with qase_project_context or qase_get') and effectively distinguishes create vs update via the id parameter. It stops short of stating when NOT to use it (e.g., use the delete tool to remove a field), so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_defect_deleteDelete defectAIdempotentInspect
Delete a defect by project code and ID; its links to results go with it and this cannot be undone. Usually resolving it through qase_defect_upsert with id is the right move, so the record survives. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint, so the description carries the real behavioral load: cascading loss of result links, irreversibility ('cannot be undone'), the confirmation gate, and a cost/latency estimate. That is exactly the context an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: impact, recommended alternative, then workflow and cost. Nothing is redundant and the destructive warning comes before the softer routing advice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter delete with no output schema and minimal annotations, the description covers consequences, reversibility, confirmation behavior, and alternatives. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both parameters documented (id as entity ID, code as project code with pattern/length constraints). The description restates 'project code and ID' without adding format or edge-case detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (a defect), plus the scoping keys (project code and ID). It also distinguishes itself from the sibling qase_defect_upsert, so an agent can route between the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative path ('Usually resolving it through qase_defect_upsert with `id` is the right move, so the record survives') and gives the condition that favors it. It also states the workflow prerequisite that user confirmation is requested first.
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: with id it updates, without it creates, and then title, actual_result and severity are required. Severity and status are labels ("blocker", "open"…), mapped for you. For a defect born from a specific test failure use qase_triage_defect; search with qql_search before filing a duplicate. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Defect ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["regression", "payments"] | |
| title | Yes | Defect title | |
| status | No | Set to "resolved" to resolve the defect | |
| severity | No | How bad the defect is — required when creating a defect | |
| attachments | No | Hashes from qase_attachment_upload | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| actual_result | No | What actually happened — required when creating a defect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only `destructiveHint: false` is annotated, so the description carries most of the burden and it does so well: it explains the create-vs-update switch, that severity/status labels are normalized for the caller, and gives a cost estimate (one API call, ~0.5s). It stops short of stating auth requirements or how partial updates merge with existing fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the create/update branch rule, then alternatives, then cost. Dense and mostly waste-free; the trailing latency note is mildly expendable but useful for planning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the 9-parameter, nested-object surface adequately: mode selection, conditional required fields, label normalization, sibling routing, and cost. With no output schema, it could say more about the returned defect identifier, but nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new conditional semantics: it says title, actual_result and severity are required when creating, which the schema's static `required` list ([code, title]) does not capture. The label-mapping note for severity/status is also additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource (create or update a defect) and immediately disambiguates the two modes via the `id` parameter. It also names the sibling it is not (qase_triage_defect) and the search tool to use, so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use qase_triage_defect when the defect originates from a specific test failure, and search with qql_search before filing a duplicate. The when-to-use and when-to-use-something-else conditions are both stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_discover_toolsDiscover more toolsARead-onlyIdempotentInspect
Search the tool catalogue by what you are trying to do — "delete", "milestone", "review", "custom field" — and get back the matching tools with their descriptions. Every tool is already listed and callable; use this when you do not know which one fits, rather than re-reading the whole list. Cost: no API call, matching happens in memory, about 3ms.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search query to find tools by name or description. Examples: "delete", "milestone", "attachment", "suite" | |
| category | No | Filter by tool category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful context the annotations cannot convey: no API call, in-memory matching, ~3ms cost. It does not describe result ordering or result-count limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before usage guidance and cost, and there is no filler. The inline query examples overlap with the schema's own examples, which is mild redundancy, but the single-paragraph structure is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so adequately ('matching tools with their descriptions'). Both optional parameters are documented in the schema, and the cost/behavior note is present. Only result cap/ordering is unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the query examples ('milestone', 'attachment', 'suite') appear in the schema itself as well. The description adds the illustrative query terms inline but nothing about how query and category combine, so baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (the tool catalogue) plus the intent-based matching mechanism and the return value (matching tools with their descriptions). It is immediately distinguishable from every sibling, all of which are Qase domain operations rather than meta-tool discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: 'use this when you do not know which one fits, rather than re-reading the whole list.' That names the alternative behavior to avoid. It does not explicitly contrast with the closest sibling, qase_tool_help, so it falls just short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_environment_deleteDelete environmentAIdempotentInspect
Delete an environment by project code and ID. Runs that referenced it lose the attribution, so filtering history by that environment stops working; this cannot be undone. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only idempotentHint, so the description carries most of the burden and delivers: runs lose their environment attribution, history filtering by that environment breaks, the action is irreversible, and the tool will ask the user to confirm first. It also gives a cost estimate (one API call, ~0.4s), which is uncommon and useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded, followed by consequences, then cost. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description covers what is destroyed, that it cannot be undone, that confirmation is requested, and the operational cost. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (id, code) are already documented with format constraints in the schema. The description only restates that the call is keyed by project code and ID, adding no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the two lookup keys: 'Delete an environment by project code and ID.' Among siblings it cleanly separates from qase_environment_upsert and from the many other *_delete tools tied to different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the stakes of deleting clear (attribution loss, irreversibility) and notes a confirmation prompt, which implicitly signals caution. However, it never states when to use this versus qase_environment_upsert (i.e., to modify instead of remove), so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_environment_upsertCreate or update environmentAInspect
Create or update an environment — a named target such as staging or production that runs are attributed to. With id it updates, without it creates. Existing environments come back from qase_project_context. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Environment ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code, e.g. DEMO | |
| host | No | Environment host/URL | |
| slug | No | URL-friendly identifier | |
| title | Yes | Environment title | |
| description | No | Free-form description of the environment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=false, so the description carries most of the burden, and it does add useful non-schema behavior: idempotent upsert semantics keyed on `id` and a concrete cost profile ('one API call, about 0.5s'). It does not disclose what happens to omitted fields on update (overwrite vs. preserve), which is the main remaining risk for a mutate tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler: purpose first, the decisive id rule second, the discovery hint and cost last. Nothing is buried and nothing repeats structured fields verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with full schema coverage and no output schema, the description covers purpose, create/update routing, discovery and cost — enough to call it correctly. It leaves unaddressed what the call returns on create (e.g., generated id) and the update-merge behavior, which are the only meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, code, host, slug, title and description. The description's only parameter-level statement ('with `id` it updates') duplicates the schema's own id description, adding no new syntax or constraint detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource ('create or update an environment') and clarifies the domain concept ('a named target such as staging or production that runs are attributed to'). The upsert duality is resolved immediately, so an agent can distinguish this from qase_environment_delete or the other *_upsert siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the decisive routing rule — 'With `id` it updates, without it creates' — and points to qase_project_context as the place to discover existing environments, which is real guidance rather than implication. It stops short of stating when not to use it (e.g., bulk creation or deletes), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_external_issue_linkLink external issueAIdempotentInspect
Link or unlink test cases and runs to issues in Jira Cloud or Jira Server — the only trackers supported. A case may link several issues; a run holds one, and a new link replaces it. Read links back with qase_get. Cost: one API call for the whole set of links, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| type | Yes | Issue tracker integration configured for the project | |
| links | Yes | Entities to link, processed in a single API request | |
| action | Yes | attach creates the link, detach removes it (for runs, clears the single link) | |
| entity | Yes | Entity to link — test case or test run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: only Jira Cloud/Server are supported, a case accepts multiple issues while a run holds exactly one and a new link replaces it, and the whole batch costs one API call (~0.5s). The annotations already cover safety (idempotentHint, destructiveHint=false), and the description usefully discloses the replacement semantics and cost, though it says nothing about permissions or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the tool's identity and scope, then the linking model, then cost and the read-back route. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no output schema, it covers scope, tracker constraints, per-entity link cardinality, batch cost, and how to verify results. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enums for entity/action/type are self-documenting, so the schema already carries the parameter meaning. The description's note about a run holding one issue largely restates the 'issues' schema description, adding little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (link/unlink) and resource (test cases and runs to Jira issues), and names the supported tracker scope, which immediately separates it from the defect/result/case tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule for the read side ('Read links back with qase_get') and explains the case-vs-run linking model, so an agent knows which path to take. It does not state when not to use this tool or contrast it with any write-side sibling, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_getGet recordARead-onlyIdempotentInspect
Fetch one known record by type and ID — case, suite, run, result, plan, defect, milestone, environment, shared_step, review, custom_field and more. Use it only when you already have the ID and want that one record; for several, anything filtered, or a loop over IDs, use qql_search — one search returns the whole page. Cost: one API call, 0.3-0.5s; ten in sequence measured 5.3s against 1.2s for one qql_search.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID (number) or hash (string) | |
| code | No | Project code (required for most entities) | |
| entity | Yes | Entity type to fetch | |
| fields | No | Optional field projection — only return these top-level fields. Pass ["*"] for all fields. | |
| include | No | Comma-separated list of related entities to include in the response. Cases and runs already request their external issue links by default ("external_issues" / "external_issue"); pass this only to override that. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes beyond them with measured cost/latency data ('one API call, 0.3-0.5s; ten in sequence measured 5.3s against 1.2s for one qql_search') plus a default-behavior note about external issue links. This is genuine behavioral context an agent can use for batching decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the routing exclusion, then the cost rationale. Three sentences, no filler, and the most decision-relevant information (when to pick qql_search) appears early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description covers invocation and routing well, and the schema handles parameters exhaustively. Its one gap is that it doesn't characterize the returned payload shape at all, which matters slightly more given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents id/code/fields/include in detail. The description restates entity types and the ID-lookup notion but adds no syntax or format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource + scope: 'Fetch one known record by type and ID', followed by an enumeration of entity types. It also explicitly distinguishes itself from the sibling qql_search, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the precise precondition ('only when you already have the ID') and the disallowed cases ('for several, anything filtered, or a loop over IDs, use qql_search'), naming the alternative tool. This is exactly the when/when-not/alternative structure the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_milestone_deleteDelete milestoneAIdempotentInspect
Delete a milestone by project code and ID. Runs and cases keep existing but lose the association, so release reporting built on it stops working; this cannot be undone. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only idempotentHint in annotations, the description carries the burden and delivers: runs/cases survive but lose the association, downstream release reporting breaks, the action is irreversible, the user is prompted for confirmation first, and it costs one API call (~0.4s). These are concrete behavioral facts beyond anything in the annotations, and they are consistent with idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then consequences, then operational cost. No sentence is filler; each adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema and minimal annotations, the description covers irreversibility, side effects on related entities, confirmation behavior, and cost — everything an agent needs to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (code, id) are already documented with patterns and constraints. The description only restates 'by project code and ID' and adds no format or validation nuance, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (milestone) scoped by the two required identifiers, which cleanly distinguishes it from the sibling qase_milestone_upsert. An agent can route here without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this matters (milestones that release reporting is built on) and notes a confirmation prompt will occur, which informs the decision. It does not explicitly name an alternative or state exclusions, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_milestone_upsertCreate or update milestoneAInspect
Create or update a milestone — a dated marker, typically a release, that runs and cases are grouped under. With id it updates, without it creates. Existing milestones come back from qase_project_context. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Milestone ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code, e.g. DEMO | |
| title | Yes | Milestone title | |
| status | No | active (default) or completed | |
| due_date | No | Due date as Unix timestamp | |
| description | No | Free-form description of the milestone |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries most of the burden. It adds real value with the cost estimate ('one API call, about 0.5s') and the discovery path via qase_project_context, but it does not disclose the key upsert semantics — whether an update overwrites or clears omitted optional fields like status and due_date — nor what the call returns. Useful but incomplete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core create/update distinction and the domain gloss front-loaded before the discovery hint and cost note. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with no output schema and minimal annotations, the description covers mode selection, prerequisite discovery, and latency cost. The remaining gap is the effect of partial updates on unmentioned fields, which matters for an upsert but is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; every parameter is already documented in the schema, including the id create-vs-update semantics and the status enum. The description adds no parameter-level detail (formats, date handling, code constraints) beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create or update) plus the resource, and defines what a milestone is in domain terms ('a dated marker, typically a release, that runs and cases are grouped under'). It also disambiguates the two modes: with `id` it updates, without it creates. An agent can distinguish this from qase_milestone_delete without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the mode-selection rule (id present = update, absent = create) and a concrete prerequisite pointer: fetch existing milestones from qase_project_context before deciding. It does not state when to prefer create-over-update beyond that rule, nor name alternatives such as qase_milestone_delete, so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_plan_deleteDelete test planAIdempotentInspect
Delete a test plan by project code and ID. Only the plan goes — its cases and the runs made from it stay — but anything launching it by ID breaks; this cannot be undone. To change its cases use qase_plan_upsert instead. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply idempotentHint, so the description carries the real burden and does so well: it discloses exactly what is destroyed (the plan only), what survives (cases and runs), the downstream consequence (anything launching by ID breaks), irreversibility, and confirmation behavior. Cost and latency are added bonuses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with zero filler, front-loaded with the core action and progressively layering impact, irreversibility, and the alternative. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema, the description covers everything an agent needs: scope of destruction, side effects, irreversibility, confirmation requirement, and the correct sibling for the adjacent intent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required parameters are fully documented there, so the description adds no format or constraint detail beyond "project code and ID." Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a test plan") and pins the scope with "by project code and ID." It also names qase_plan_upsert as the sibling for a different intent, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes case-modification intent to qase_plan_upsert and explains the prerequisite context (user is asked for confirmation). It gives a clear context for use but no explicit statement of when NOT to delete, so it stops short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_plan_upsertCreate or update test planAInspect
Create or update a test plan — a named, reusable set of case IDs such as a smoke or regression pack. With id it updates, without it creates. qase_regression_run turns a plan into a run in one call. Cost: one API call, about 0.5s, growing with the number of cases.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Plan ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code, e.g. DEMO | |
| cases | No | Case IDs to include | |
| title | Yes | Test plan title | |
| description | No | Free-form description of the plan |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description must carry the behavioral load. It does add cost/latency context ('one API call, about 0.5s, growing with the number of cases'), which is genuinely useful beyond annotations. However, it never says what happens to the existing case list on update (replace vs. append) or what is returned — a meaningful gap for an upsert tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core create/update rule, followed by the related-tool pointer and cost note. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter upsert with no output schema, the description covers the create/update duality, object meaning, sibling routing, and call cost. The remaining gap is the update-overwrite semantics for `cases` and any return value, which an upsert tool should ideally disclose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the create-vs-update meaning of `id`. The description's mention of `id` semantics largely restates that schema text and adds no syntax or format detail beyond it, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create/update) plus the resource, and defines the domain object plainly ('a named, reusable set of case IDs such as a smoke or regression pack'). It also names the sibling it hands off to (qase_regression_run), so the agent can distinguish it from adjacent tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete routing rule: supply `id` to update, omit it to create, and points to qase_regression_run for turning a plan into a run. It does not state exclusions (e.g. when to prefer qase_plan_delete or a bulk case tool), but the context is clear enough to select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_project_contextProject contextARead-onlyIdempotentInspect
Seed everything about a project in one call: details, the full suite tree, milestones, environments, custom fields and users — make it first when starting on a project. Each collection returns its first 100; check coverage and pass full: true to page. For one record by ID qase_get is cheaper; for filtered questions use qql_search. Cost: six API calls behind one, 0.5-1.3s cold, cached 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| full | No | Page through every collection instead of the first 100 of each (default: false). Use it when `coverage` reports one truncated; see qase_tool_help for what it costs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/non-destructive; the description adds real operational detail beyond them — each collection caps at 100, a `coverage` signal indicates truncation, and the cost profile (six API calls, 0.5-1.3s cold, 5-minute cache) lets the agent plan. No contradiction with the readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the payload ('seed everything about a project in one call') before paging rules, sibling routing, and cost. Every clause carries a distinct decision-relevant fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (the named collections, capped at 100 each) and surfaces the `coverage` field it must inspect, plus latency/caching expectations. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds workflow meaning the schema lacks: `full: true` should be driven by what `coverage` reports, and the cost of paging is deferred to qase_tool_help. That is genuine value beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('seed everything about a project in one call') and enumerates the exact resources covered: details, suite tree, milestones, environments, custom fields and users. It also names the siblings it is not (qase_get, qql_search), so an agent can place it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: 'make it first when starting on a project', 'for one record by ID qase_get is cheaper', 'for filtered questions use qql_search'. Both the when and the when-not are stated with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_project_createCreate projectAInspect
Create a project. The code must be unique in the workspace, and there is no update endpoint afterwards — title, code and access cannot be changed through the API, so choose them deliberately. Read an existing project with qase_project_context. Cost: one API call, about 1.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code — unique per workspace, 2 to 10 characters of uppercase letters, digits or underscores | |
| group | No | Team group hash — required when access is "group" | |
| title | Yes | Project title | |
| access | No | Who can access the project: everyone, a team group, or nobody but the owner | |
| settings | No | Additional project settings | |
| description | No | Free-form description of the project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries most of the load and does so well: it discloses the uniqueness constraint on code, the critical irreversibility fact that title/code/access cannot be changed later, and a cost/latency estimate (one API call, ~1.5s). These are exactly the traits an agent needs before committing to a write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and constraint, followed by the sibling pointer and cost. No filler and no repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter creation tool with a nested settings object and no output schema, the description covers the risk profile (irreversibility, uniqueness) but never says what comes back (e.g. created project id) or how to handle a code collision. Given 100% schema coverage the remaining gap is modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by marking title, code and access as immutable-after-creation and restating code uniqueness as a workspace-level constraint. It does not clarify the settings object or the access/group dependency, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Create a project") and explicitly routes reads to the sibling tool qase_project_context, so an agent can distinguish it from qase_project_delete and qase_project_context without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent when to act deliberately ("no update endpoint afterwards... choose them deliberately") and names the alternative for reading existing projects. It stops short of stating exclusions such as permission prerequisites or what to do if the code collides, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_project_deleteDelete projectAIdempotentInspect
Delete an entire project by code — every case, suite, run, result, defect and milestone in it, with no trash to recover from; this cannot be undone. The most destructive call in the API; confirm the code with qase_project_context first. Asks the user for confirmation and does not proceed without it. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry idempotentHint, so the description does the heavy lifting: it discloses irreversibility ('no trash to recover from; this cannot be undone'), severity ranking ('most destructive call in the API'), a mandatory confirmation gate, and cost/latency ('one API call, about 0.5s'). Nothing here is derivable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive scope in the first clause, then adds recovery, confirmation, and cost in compact clauses. Every sentence earns its place and the ordering matches what an agent needs to decide before acting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and the tool has one fully-documented parameter, so the description's job is risk framing and preconditions — both are covered. An agent has everything it needs to decide whether to call this and how to prepare.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'code' parameter, so the schema already documents the format and pattern. The description only restates 'by code' and adds a verification step, which is marginally useful but not new semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an entire project by code') and immediately enumerates the blast radius ('every case, suite, run, result, defect and milestone in it'). This clearly distinguishes it from the granular siblings such as qase_case_delete and qase_suite_delete without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('confirm the code with qase_project_context first') and the confirmation workflow ('does not proceed without it'), which is clear usage context. It stops short of explicitly routing narrower deletions to the granular delete siblings, which is the one missing piece of when-not guidance.
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 plan, or an explicit list of case IDs, in one step — it resolves the cases itself. It opens a run, it does not close one: for a finished pipeline use qase_ci_report; to assemble a run by hand use qase_run_upsert. Cost: two API calls behind one, about 1s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| title | Yes | Run title | |
| plan_id | No | Create run from an existing test plan | |
| suite_ids | No | Include cases from these suites | |
| description | No | What this regression run covers | |
| milestone_id | No | ID of the milestone the run belongs to | |
| include_cases | No | Explicit case IDs to include | |
| environment_id | No | ID of the environment the run executes against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only destructiveHint=false is annotated, so the description carries most of the burden, and it does add real context: it resolves cases itself, it is an open-only operation, and it costs two API calls (~1s). It stops short of stating whether it is idempotent on repeated calls or what happens if the run title collides, which are the remaining relevant traits for a create tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: the core action, the negative scope with its two routing alternatives, then the cost note. The most decision-relevant content (what it builds) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no output schema, and minimal annotations, the description supplies the operational context an agent needs — what it does, what it does not do, and latency. It is near-complete, missing only guidance on combining or prioritizing the case-source parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's framing of three case sources loosely maps to plan_id/suite_ids/include_cases but adds no mutual-exclusivity rules, precedence between the modes, or fallback behavior when more than one source is supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Build and start a test run') and enumerates the three accepted case sources — suite, plan, or explicit case IDs — in one step. An agent can distinguish it from qase_run_upsert and qase_ci_report without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes the tool as an opener, not a closer ('it opens a run, it does not close one'), and names both alternatives with the condition that selects them: qase_ci_report for a finished pipeline, qase_run_upsert for hand assembly. 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_result_deleteDelete test resultAIdempotentInspect
Delete one result from a run, by run ID and result hash. The case and the rest of the run are untouched; pass rates shift and this cannot be undone. To discard a whole run use qase_run_delete. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| hash | Yes | Result hash to delete | |
| run_id | Yes | Entity ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint=true, so the description carries most of the burden and does so well: scope of destruction ('the case and the rest of the run are untouched'), irreversibility ('cannot be undone'), a downstream side effect ('pass rates shift'), an interactive confirmation step, and a cost/latency estimate. Not a 5 only because it doesn't state auth or permission requirements; 'cannot be undone' is consistent with (not contradictory to) idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and target, then routing, then consequences, then cost. No filler; every sentence adds a distinct decision-relevant fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter destructive tool with no output schema, the description covers scope of impact, reversibility, the sibling alternative, the confirmation gate, and expected cost. An agent has everything needed to call it correctly and warn the user appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents code, run_id and hash, and the description adds no syntax or sourcing detail (e.g., where a result hash comes from or whether it can be retrieved). It merely restates that run ID and hash identify the target — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete), a precisely scoped resource (one result from a run), and the identifying keys (run ID, result hash). It also names the sibling it is not — qase_run_delete — so an agent can distinguish it from the whole-run deletion without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: discard a whole run -> qase_run_delete, and single result -> this tool. It also discloses a precondition that changes invocation behavior ('Asks the user for confirmation first'), which is usage 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_result_recordRecord test resultsAInspect
Record up to 200 results into an existing run — status, duration, comment, stacktrace, attachments — in one call, not one per test. Status is a label only: passed, failed, blocked, skipped, invalid. If the run does not exist yet and the job is finished, qase_ci_report creates, records and completes in one call. Cost: one API call for the whole list, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| run_id | Yes | Run ID to record results into | |
| results | Yes | Results to record, 1 to 200 per call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description does real work: it discloses the batch ceiling (200), the cost profile (one API call, about 0.5s), and that status is a label only rather than a gating value. It stops short of stating what happens on re-recording a case already in the run or whether a completed run accepts results, which matters for a mutation tool with thin annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: capability, status semantics, and alternative-tool routing, with cost last. The batch limit and the sibling routing are front-loaded where an agent will read them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter write tool with no output schema and only a destructiveHint annotation, the description covers batching, cost, status semantics and the sibling alternative. The remaining gap is run-state preconditions (must the run still be open?) and duplicate/overwrite behavior, neither of which is answered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so code, run_id and the results array (1–200) are already documented, and the description essentially restates maxItems and the status enum. The one genuine addition is the interpretive note that status is a label only, which is mild value over structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope ('Record up to 200 results into an existing run'), enumerates the payload fields, and names the sibling it is not (qase_ci_report) together with the condition that selects that sibling. An agent can distinguish it from qase_ci_report and qase_run_complete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not rule: 'If the run does not exist yet and the job is finished, qase_ci_report creates, records and completes in one call.' This directly routes the agent between the two competing tools on a concrete state condition, and the 'one call, not one per test' phrasing tells it not to loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_review_bulk_createBulk create case reviewsAInspect
Open several test case reviews in one request — the batch form of qase_review_create, for proposing more than one change. Same fields as qase_review_create; case_id for an edit review, omitted for a create review. The API has no endpoints for approving, merging or declining — those are UI-only; read status with qase_review_list. Cost: one API call regardless of batch size.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| reviews | Yes | Reviews to open. Validated as a whole: if any item is invalid, NOTHING is created. Once valid, each item is processed individually and reported separately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false. The description adds real behavioral context beyond that: the one-API-call cost model regardless of batch size, and the API's lack of approve/merge/decline endpoints. It doesn't restate the atomic all-or-nothing validation (that lives in the schema), so it complements rather than duplicates structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight paragraph with the core purpose and sibling relationship front-loaded. Every clause carries information; density is high but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers cost, field inheritance from the single-create sibling, and API limitations. It leaves return-value/reporting format and permission requirements implicit, which is a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description's only added semantics is the case_id edit-vs-create distinction, which the schema also states ('Omit for a new-case draft'). Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (bulk create case reviews) and explicitly frames itself as 'the batch form of qase_review_create.' An agent can distinguish it from the single-create sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selecting condition ('for proposing more than one change') and routes to alternatives: qase_review_create for the single case and qase_review_list to read status. It also rules out approving/merging/declining as UI-only. No explicit when-not-to-use beyond the batch-size condition, but coverage is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_review_createCreate case reviewAInspect
Open a test case review — the pull-request flow for cases. Pass case_id to propose changes to an existing case (send only the fields that change), or omit it to propose a new one. Several at once? Use qase_review_bulk_create. The API has no endpoints for approving, merging or declining — those are UI-only; read status with qase_review_list. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["smoke", "billing"] | |
| type | No | Type label or numeric ID | |
| layer | No | Layer label or numeric ID | |
| steps | No | Ordered test steps; omit for a case without steps | |
| title | No | Test case title | |
| status | No | Status label or numeric ID | |
| case_id | No | Test case to propose changes to. With it, an "edit" review is created and only the fields being changed need to be sent. Without it, a "create" review is opened for a brand-new case draft and `title` is required. | |
| behavior | No | Behavior label or numeric ID | |
| is_flaky | No | Is flaky: 0=No, 1=Yes; a boolean works too. | |
| priority | No | Priority label or numeric ID (0=not set, 1=high, 2=medium, 3=low) | |
| severity | No | Severity label or numeric ID | |
| suite_id | No | ID of the suite that holds the case | |
| reviewers | No | Reviewers: AUTHOR UUIDs (see qase_get { entity: "author" }) or emails, which resolve to them. Not user IDs. The token owner authors the review and cannot review their own review. Omit to assign them later in the UI. | |
| automation | No | Automation: 0=Manual, 1=To be automated, 2=Automated (label or ID) | |
| steps_type | No | Step style: "classic" action/expected, or "gherkin" scenario text | |
| attachments | No | Hashes from qase_attachment_upload | |
| description | No | Free-form description of what the case covers | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the case belongs to | |
| preconditions | No | State the system must be in before the steps run | |
| postconditions | No | State to restore or verify after the steps run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries real weight here: it discloses that approval/merge/decline are UI-only (a non-obvious capability gap that prevents futile calls) and gives a latency/call-cost estimate. It stops short of describing the review's resulting state (draft vs pending) or permission requirements beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose and the case_id decision, then alternatives, then the API limitation. No filler and no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter mutation tool with nested step objects and no output schema, the description covers routing, the edit/create branch, alternatives, cost, and the API's missing lifecycle endpoints. Nothing an agent needs to decide and call correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 22 parameters, including the edit-vs-create meaning of case_id. The description reinforces the case_id branch but adds no syntax, format, or default detail beyond the schema — the baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a test case review') and frames it memorably as 'the pull-request flow for cases', which immediately distinguishes it from case creation. It also names the two sibling tools an agent might confuse it with (qase_review_bulk_create, qase_review_list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit branch condition: pass `case_id` to edit, omit it to create, and 'send only the fields that change' for edits. It routes bulk work to qase_review_bulk_create and status checks to qase_review_list, and warns that approve/merge/decline have no API surface.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_review_deleteDelete case reviewAIdempotentInspect
Delete a review by ID. This removes the proposal entirely — it does not decline it, and declining is UI-only — and merged reviews cannot be deleted; the referenced case is untouched. Cannot be undone; asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Review ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only idempotentHint, so the description carries the destructive profile and it does so well: irreversible ('cannot be undone'), human-in-the-loop ('asks the user for confirmation first'), side-effect boundaries (case untouched, merged reviews rejected), plus a cost/time estimate. This is exactly the behavioral context structured fields do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core action, then the disambiguation, then the constraints and cost. No sentence is redundant with the name, title, or schema, and the operational cost note is short enough to earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param destructive delete with no output schema and only a single annotation, the description covers everything an agent needs: target identity, irreversibility, confirmation requirement, failure cases, and blast radius of the mutation. Nothing material is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params (id with exclusiveMinimum, code with pattern/length) are fully documented inline, so the schema does the heavy lifting. The description repeats only 'by ID' and adds no format, validation, or project-scoping nuance, which is the baseline expectation at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Delete a review by ID') and immediately disambiguates the operation from a superficially similar one ('this removes the proposal entirely — it does not decline it'). It also states the scope boundary that merged reviews are not deletable and the case is untouched, so an agent can distinguish this call from qase_review_update or qase_review_list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear negative conditions: not for declining (UI-only), not for merged reviews. That tells the agent when this tool will fail. It stops short of naming a positive alternative neighbor (e.g. qase_review_update / qase_review_bulk_create) or stating prerequisites, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_review_listList case reviewsARead-onlyIdempotentInspect
List a project's reviews with their current state — the only way to learn what happened to a review you opened, since the API has no endpoints for approving or merging — those are UI-only. Filter by status to see what is still open. For one review by ID, qase_get is cheaper. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| type | No | "create" proposes a new case, "edit" proposes changes to an existing one | |
| limit | No | Default 25, max 100 | |
| offset | No | Skip this many reviews, for paging | |
| search | No | Substring match on the review title | |
| status | No | Only reviews in this state | |
| case_id | No | Only reviews of this test case | |
| author_uuid | No | Only reviews opened by this author UUID | |
| reviewer_uuid | No | Only reviews this author UUID is a reviewer on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes further with two facts the structured data cannot convey: that approving/merging reviews has no API endpoint (UI-only), which bounds what this tool can ever return, and a cost/latency figure (~0.5s, one call). Neither 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then the alternative-tool routing, then cost. No sentence is redundant and the most decision-relevant constraint (no API path to approve/merge) appears early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter read-only list tool with no output schema, the description supplies the decision-relevant boundary (state is observable but not actionable via API) and a cost estimate. It stops short of describing result shape or how paging behaves in practice, but the offset/limit params in the schema largely cover that, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already documented in the schema (including status enum values, case_id and author/reviewer filters). The description only adds a light hint about using the status filter to find open reviews, which is marginal over the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List a project's reviews') plus the payload dimension ('with their current state'), and explicitly names the sibling alternative qase_get for single-review retrieval. An agent can distinguish this from qase_review_create/update/delete and qase_get without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('the only way to learn what happened to a review you opened'), when-not-to ('For one review by ID, qase_get is cheaper'), and a concrete usage pattern ('Filter by status to see what is still open'). Alternatives and their selecting conditions are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_review_updateUpdate case reviewAIdempotentInspect
Update an open review: the proposed case fields, the reviewers, or both, by review ID. IMPORTANT: changing the proposal RESETS every approval already given; updating only reviewers keeps them. The API has no endpoints for approving, merging or declining — those are UI-only; read status with qase_review_list. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Review ID | |
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["smoke", "billing"] | |
| type | No | Type label or numeric ID | |
| layer | No | Layer label or numeric ID | |
| steps | No | Ordered test steps; omit for a case without steps | |
| title | No | Test case title | |
| status | No | Status label or numeric ID | |
| behavior | No | Behavior label or numeric ID | |
| is_flaky | No | Is flaky: 0=No, 1=Yes; a boolean works too. | |
| priority | No | Priority label or numeric ID (0=not set, 1=high, 2=medium, 3=low) | |
| severity | No | Severity label or numeric ID | |
| suite_id | No | ID of the suite that holds the case | |
| reviewers | No | Replaces the current reviewer list; an empty array removes everyone. Omit to leave it unchanged. Author UUIDs or emails. Changing ONLY reviewers keeps existing approvals. | |
| automation | No | Automation: 0=Manual, 1=To be automated, 2=Automated (label or ID) | |
| steps_type | No | Step style: "classic" action/expected, or "gherkin" scenario text | |
| attachments | No | Hashes from qase_attachment_upload | |
| description | No | Free-form description of what the case covers | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the case belongs to | |
| preconditions | No | State the system must be in before the steps run | |
| postconditions | No | State to restore or verify after the steps run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing a real side effect — changing the proposal resets all existing approvals while editing only `reviewers` preserves them — plus cost and runtime. Minor tension worth noting: an operation that silently discards approvals while `destructiveHint: false` is declared; the description resolves it for the agent, but the annotation pair is not fully aligned with the behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight clauses, front-loaded with the purpose, then the destructive caveat, then the capability boundary, then cost. Every sentence carries actionable information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter mutation tool with no output schema, the description supplies the two things an agent cannot infer from the schema — the approval-reset side effect and the fact that approve/merge/decline live only in the UI — so a caller has everything needed to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself already documents the reviewers-replacement/reset semantics, so the description largely restates what the parameter docstrings provide. Baseline 3 is appropriate; it adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an open review') plus the exact editable surface (proposed case fields, reviewers, or both) keyed by review ID. This clearly separates it from qase_review_create, qase_review_delete and qase_review_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: approvals/merging/declining are UI-only and not callable here, and status is read via qase_review_list. It also gives the decision rule between editing the proposal versus only `reviewers`, which is exactly the when/when-not guidance this dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_run_completeComplete test runAIdempotentInspect
Mark a test run complete so it reports as finished. It is a reporting state, not a lock — results recorded afterwards still land and change its counts. If all results are in hand at once, qase_ci_report does this as its final step. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the idempotentHint/destructiveHint annotations by disclosing the key semantic that completion is a reporting state, not a lock, and that later results still land and change counts. It also gives an operational cost estimate (one API call, ~0.4s), which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then the non-obvious state semantics, then the alternative and cost. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, everything an agent needs is present: what it does, that it is non-destructive and idempotent in effect, how it interacts with later writes, and when the sibling qase_ci_report already covers it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (id and code are both documented with format, pattern and bounds), so the schema carries the parameter burden. The description adds no extra meaning about the two parameters, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark a test run complete') plus the observable outcome ('reports as finished'), which cleanly separates it from qase_run_delete and qase_run_upsert among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names a concrete alternative and the condition that selects it: 'If all results are in hand at once, qase_ci_report does this as its final step,' implying this tool is for the incremental/standalone case. No explicit statement of when not to call it, but the routing 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_deleteDelete test runAIdempotentInspect
Delete a test run by project code and ID, together with every result in it; this cannot be undone. Rarely what you want: to stop accepting results use qase_run_complete, to fix one result use qase_result_delete. Asks the user for confirmation first. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry idempotentHint, so the description properly carries the behavioral load: it discloses irreversibility, the cascading destruction of all contained results, a user-confirmation prompt, and the cost (~1 API call, ~0.4s). This is exactly the destructive-operation context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and scope, followed by the alternative routing and the safety/cost note. Every sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema, the description covers scope, cascade effect, irreversibility, confirmation behavior, alternatives, and cost. An agent can decide and call correctly with nothing missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (id and code both documented with format/pattern), so the schema does the heavy lifting. The description names the two keys but adds no format or constraint detail beyond it, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a test run'), names the exact scoping keys (project code and ID), and discloses the cascade ('together with every result in it'). It is immediately distinguishable from qase_result_delete and qase_run_complete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames when NOT to use it ('Rarely what you want') and routes to the right alternatives with the condition that selects each: qase_run_complete to stop accepting results, qase_result_delete to fix a single result. 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_run_upsertCreate or update test runAInspect
Create or update a test run — the container results are recorded into, so open it before qase_result_record. Scope it to a milestone, environment, plan or case list. To build one from a suite or plan use qase_regression_run; for a finished CI job use qase_ci_report, which opens, records and closes in one call. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Run ID — if provided, this is an update (note: Qase API has limited run update support) | |
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["nightly", "smoke"] | |
| cases | No | Case IDs to include | |
| title | Yes | Run title | |
| plan_id | No | Test plan to base run on | |
| end_time | No | RFC3339 end time | |
| start_time | No | RFC3339 start time | |
| description | No | What this run covers | |
| is_autotest | No | True when the run is produced by automation rather than a person | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| milestone_id | No | ID of the milestone the run belongs to | |
| environment_id | No | ID of the environment the run executes against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=false in annotations, the description carries most of the burden and delivers real context: the cost profile (one API call, ~0.5s) and the ordering requirement relative to qase_result_record. It does not disclose what an update does to pre-existing run data or that update support is limited, which is a gap for an upsert of 13 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the operation and workflow role, then scoping, then alternatives and cost. No filler; the em-dash clause is dense with useful information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with no output schema, the description covers purpose, ordering, alternatives and cost. It omits what the caller gets back (notably the run ID needed for the subsequent qase_result_record call) and any idempotency/update-overwrite behavior, but no output schema exists so return shape is not strictly required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema. The description adds framing by grouping milestone, environment, plan and case list as scoping axes, but does not add syntax, defaults, or interaction rules beyond what the schema says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create or update a test run") and immediately explains what the resource is for in the workflow ("the container results are recorded into"). It differentiates itself from siblings by naming qase_regression_run and qase_ci_report and the conditions that select them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing guidance ("open it before qase_result_record") plus two named alternatives with their own selection conditions: qase_regression_run for suites/plans and qase_ci_report for finished CI jobs. The agent has everything needed to route correctly without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_suite_deleteDelete suiteAIdempotentInspect
Delete a test suite by project code and ID. WARNING: the cases inside, and any child suites, are deleted with it along with their history, and delete_cases currently has no effect. Read the tree from qase_project_context and move what matters first. Asks the user for confirmation. Cost: one API call, about 0.4s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID | |
| code | Yes | Project code, e.g. DEMO | |
| delete_cases | No | Has no effect today: the server sends a field this endpoint does not accept, so the cases are deleted either way. Kept so existing callers do not break. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only idempotentHint in annotations, the description carries the real burden and delivers: it discloses the cascade (cases inside and child suites deleted with history), flags that delete_cases has no effect, notes the confirmation prompt, and gives cost/latency. This is exactly the context annotations cannot express for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the WARNING, then the recovery advice, confirmation behavior, and cost. Dense but every sentence carries decision-relevant information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet for a destructive delete the description covers cascade effects, the misleading parameter, prerequisite context, confirmation behavior, and cost. An agent has everything needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented. The description mentions project code and ID and reinforces the no-op nature of delete_cases, but adds no syntax or format detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a test suite') plus the identifying scope (project code and ID). An agent can distinguish it from qase_suite_upsert and the other *_delete siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite workflow ('Read the tree from qase_project_context and move what matters first') and notes it asks for user confirmation. It doesn't explicitly contrast with alternatives like qase_suite_upsert, but the destructive-warning framing makes the when-to-use condition unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_suite_upsertCreate or update suiteAInspect
Create or update a test suite — the folder cases live in. With id it updates, without it creates; nest with parent_id. The existing tree comes back from qase_project_context, so read it rather than guess parent IDs. Cost: one API call, about 0.5s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Suite ID — if provided, updates; if omitted, creates | |
| code | Yes | Project code, e.g. DEMO | |
| title | Yes | Suite title | |
| parent_id | No | Parent suite ID for nesting | |
| description | No | What this suite groups — shown under the suite title in the tree | |
| preconditions | No | Setup every case in this suite assumes, inherited by its child suites |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=false; the description adds genuinely new operational context (one API call, ~0.5s cost), which helps an agent budget calls. However, for a mutation tool it omits the important update semantics — whether omitted fields like description/preconditions are cleared or preserved on update — and says nothing about the return value. Useful but incomplete behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then the id branch, then the prerequisite pointer, then cost. Every sentence carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should cover return behavior, and it does not — an agent cannot tell whether the new/updated suite ID comes back, which matters for nesting child suites afterward. The update-merge semantics for optional fields (description, preconditions) are also unstated. Adequate but with real gaps for a 6-parameter upsert.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including id ('if provided, updates; if omitted, creates') and parent_id ('Parent suite ID for nesting'). The description restates those same semantics for id and parent_id rather than adding format or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or update a test suite') and immediately clarifies the domain concept ('the folder cases live in'). The upsert split is spelled out: 'With `id` it updates, without it creates.' An agent can distinguish this from qase_suite_delete and qase_case_upsert without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the branch condition selecting update vs create, and gives a concrete prerequisite/alternative path: read the tree from qase_project_context rather than guessing parent IDs. This is the rare 'when to use it and how to prepare' guidance that prevents incorrect calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qase_tool_helpTool documentationARead-onlyIdempotentInspect
Read the full documentation of one tool before calling it for the first time in a session. Every description in the tool list is deliberately short — what the tool is for and what it costs — and the details that prevent a wrong first call live here: argument semantics, limits, what cannot be undone, and which tool to use instead. Pass the tool name exactly as listed. Cost: no API call, static text, about 1ms. Cheaper than one rejected call.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | The tool name, exactly as it appears in the tool list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lowered, and the description still adds useful facts: no API call, static text, about 1ms, and that it surfaces limits and irreversible actions. It does not mention caching, session scope persistence, or error behavior for a bad tool name, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core instruction and rationale, and each sentence contributes either a usage rule or a cost/benefit claim. It is slightly longer than strictly needed for a one-parameter meta-tool, with a touch of persuasive framing, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity meta-tool with rich annotations and no output schema, the description covers what it returns (argument semantics, limits, irreversible actions, alternatives), when to call it, and its cost profile. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required 'tool' parameter, so the baseline is 3. The description's 'Pass the tool name exactly as listed' merely reinforces the schema's own wording rather than adding new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read the full documentation of one tool' — and explains its role relative to the rest of the tool list. It does not, however, explicitly distinguish itself from sibling help/meta tools such as qase_discover_tools or qql_help, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear activation condition: read it before calling a tool for the first time in a session, which implies it is unnecessary on subsequent calls. It also frames the value proposition against blindly calling a tool ('Cheaper than one rejected call'), but names no alternative meta-tool to use in other situations.
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 context written into it; title, actual_result and severity are required. The API has no way to attach runs or results to a defect — reference them in actual_result. For a defect unrelated to a failure use qase_defect_upsert. Cost: one API call, about 0.5s; file one defect per distinct cause.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Project code, e.g. DEMO | |
| tags | No | Tag names, e.g. ["regression", "payments"] | |
| title | Yes | Defect title | |
| severity | Yes | Required by the API | |
| attachments | No | Hashes from qase_attachment_upload | |
| description | No | Extra context beyond the observed behavior | |
| custom_field | No | Custom fields by ID, e.g. { "12": "value" } | |
| actual_result | Yes | Observed behavior. Required by the API |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries the real burden and delivers: it discloses an API capability gap ('no way to attach runs or results to a defect') with the workaround of embedding references in actual_result, plus cost (~one API call, ~0.5s). It stops short of covering permissions or duplicate/error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and required fields, then the capability limitation, then the alternative tool and cost. No filler and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with a nested custom_field object and no output schema, the definition covers required fields, the attachment/result limitation, the alternative tool, and the per-cause batching rule. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters including code, severity enum, attachments hashes, and custom_field shape. The description only restates which fields are required, adding no syntax or format detail beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+source ('Create a defect from a test failure') and names the sibling it is not for ('For a defect unrelated to a failure use qase_defect_upsert'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rule to qase_defect_upsert for the non-failure case, plus a cardinality rule ('file one defect per distinct cause') that tells the agent how many calls to make. Both when-to-use and when-not-to-use are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qql_helpQQL syntax helpARead-onlyIdempotentInspect
Read the QQL reference before writing a query. Pass a topic: overview, syntax, entities, operators, functions, examples, aggregation or enumValues. Field names differ per entity and from the write tools, and a query naming an unknown attribute is rejected — read entities first. Cost: no API call, about 2ms; cheaper than one rejected qql_search.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which section to return (required — one section per call): - overview: what QQL is, overall query structure, subscription requirement - syntax: structure, ordering, custom fields, case-sensitivity, boolean and date fields - entities: the fields available on each entity — field names are NOT uniform across entities, so read this before writing a query against an unfamiliar one - operators: comparison, matching, set, null, and logical operators - functions: currentUser, activeUsers, and the now/startOf*/endOf* date functions - examples: ready-made queries for common questions - aggregation: SELECT (COUNT/MIN/MAX/AVG/SUM/FIRST/LAST), GROUP BY, HAVING — use this to count or summarise instead of paging through rows - enumValues: the valid values for priority, severity, and the per-entity status fields |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real context the annotations do not: zero API-call cost, ~2ms latency, one section per call, and the failure mode where a query naming an unknown attribute is rejected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the parameter, then the topic list, then the cost/rationale. Every clause carries information, though the enum list is partially duplicated in the schema and could have been trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a documentation-lookup tool with no output schema, the description covers what is returned (reference sections), call cost, and the sequencing rule for a first query. Only the exact return shape (text vs structured) is unspecified, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema fully enumerates and explains all eight topic values, so the baseline is 3. The description restates the enum list but adds little syntax guidance beyond it, apart from the cross-entity field-name warning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Read the QQL reference before writing a query', with the exact selector parameter named. It is clearly distinguishable from qql_search (which executes queries) and qase_tool_help (general tool help).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: before writing a query, and specifically 'read `entities` first' when field names are unfamiliar. It also gives a concrete cost-based rationale ('cheaper than one rejected qql_search'), which is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qql_searchSearch with QQLARead-onlyIdempotentInspect
Search any entity with Qase Query Language — filtering, cross-project, sorting, aggregation — and the right way to fetch many records at once instead of looping over qase_get. Call qql_help first for syntax, fields and enum values. Use qase_get when you already know the one ID you want. Cost: one API call, 0.5-0.9s per page; ten records here cost 1.2s against 5.3s as ten qase_get calls.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 10, max: 100) | |
| query | Yes | QQL query expression. Examples: - entity = "case" and project = "DEMO" and status = "Actual" - entity = "defect" and severity = "blocker" and status = "open" - entity = "result" and status = "failed" and ended >= now("-7d") - entity = "run" and milestone ~ "Sprint 12" See QQL documentation for full syntax and examples. | |
| offset | No | Number of results to skip for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds valuable context beyond them: per-page latency (0.5-0.9s), page-based costing, and a measured comparison against the loop alternative (1.2s vs 5.3s). It stops short of describing the result shape or pagination termination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then routing (qql_help), then the alternative (qase_get), then cost evidence. Four compact sentences, none redundant, all actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema, the description covers purpose, prerequisites, alternative routing, and cost/pagination framing. It could say more about what a page of results looks like, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (query, limit, offset) are already documented with examples. The description's 'per page' phrasing hints at paging but adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search any entity with Qase Query Language') and enumerates scope: filtering, cross-project, sorting, aggregation. It explicitly contrasts with the sibling qase_get, so an agent can tell the two apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('the right way to fetch many records at once instead of looping over qase_get'), a prerequisite ('Call qql_help first for syntax, fields and enum values'), and an alternative with its selecting condition ('Use qase_get when you already know the one ID you want').
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.
42 tool updates
v3.0.0- Changed
qase_api3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / query / propertyNamesAdded value: +{ + "type": "string" +}
- Added
qase_attachment_delete - Changed
qase_attachment_upload7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / file / descriptionPrevious value: -"Deprecated: prefer file_base64 or file_path, which say which one you mean. Accepts either an absolute path to an existing file or base64 content."New value: +"Deprecated: use file_base64 or file_path. Accepts an absolute path or base64 content." - changed
Input schema / properties / file_base64 / descriptionPrevious value: -"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option. Base64 grows a file by a third and the whole request body is capped at 10 MB by default, so this form carries roughly 7 MB of file; larger ones need a local stdio server and file_path."New value: +"Single-file form. File content, base64 encoded. Use this unless the server runs on the same machine as the file." - changed
Input schema / properties / file_path / descriptionPrevious value: -"Single-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead."New value: +"Single-file form. Absolute path on the machine running THIS server; a remote server cannot see it — send file_base64 instead." - changed
Input schema / properties / files / descriptionPrevious value: -"Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Those are Qase limits; on a network transport the request body itself caps out at 10 MB by default, so base64 content has to fit in that. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order."New value: +"Several files in one request, each entry with its own filename plus file_base64 or file_path. One round trip, hashes returned in the same order. Limits and sizing are in qase_tool_help." - removed
Input schema / properties / files / items / additionalPropertiesRemoved value: -false
- Changed
qase_case_bulk_create14 fields changed- added
Input schema / $defsAdded value: +{ + "step": { + "properties": { + "action": { + "description": "Step action (classic steps). Not needed when `shared` is set.", + "type": "string" + }, + "attachments": { + "description": "Hashes from qase_attachment_upload", + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "description": "Test data", + "type": "string" + }, + "expected_result": { + "description": "Expected result", + "type": "string" + }, + "shared": { + "description": "Hash from `qase_shared_step_upsert` to reuse here; then `action` is not needed.", + "type": "string" + }, + "shared_step_hash": { + "description": "Alias for `shared`, the spelling a case reads back.", + "type": "string" + }, + "steps": { + "description": "Nested substeps, nesting further if needed.", + "items": { + "$ref": "#/$defs/step" + }, + "type": "array" + }, + "value": { + "description": "Gherkin scenario text (when steps_type is \"gherkin\")", + "type": "string" + } + }, + "type": "object" + } +} - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cases / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / cases / items / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - changed
Input schema / properties / cases / items / properties / automation / descriptionPrevious value: -"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"New value: +"Automation: 0=Manual, 1=To be automated, 2=Automated (label or ID)" - changed
Input schema / properties / cases / items / properties / custom_field / descriptionPrevious value: -"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"New value: +"Custom fields by ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / cases / items / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / cases / items / properties / is_flaky / descriptionPrevious value: -"Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too."New value: +"Is flaky: 0=No, 1=Yes; a boolean works too." - added
Input schema / properties / cases / items / properties / steps / items / $refAdded value: +"#/$defs/step" - removed
Input schema / properties / cases / items / properties / steps / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cases / items / properties / steps / items / propertiesRemoved value: -{ - "action": { - "description": "Step action (classic steps). Not needed when `shared` is set.", - "type": "string" - }, - "attachments": { - "description": "Attachment hashes from qase_attachment_upload", - "items": { - "type": "string" - }, - "type": "array" - }, - "data": { - "description": "Test data", - "type": "string" - }, - "expected_result": { - "description": "Expected result", - "type": "string" - }, - "shared": { - "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" - }, - "shared_step_hash": { - "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", - "type": "string" - }, - "steps": { - "description": "Nested substeps. Same structure as parent steps, supports further nesting.", - "items": { - "additionalProperties": true, - "properties": { - "action": { - "description": "Step action (classic steps). Not needed when `shared` is set.", - "type": "string" - }, - "attachments": { - "description": "Attachment hashes from qase_attachment_upload", - "items": { - "type": "string" - }, - "type": "array" - }, - "data": { - "description": "Test data", - "type": "string" - }, - "expected_result": { - "description": "Expected result", - "type": "string" - }, - "shared": { - "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" - }, - "shared_step_hash": { - "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", - "type": "string" - }, - "value": { - "description": "Gherkin scenario text (when steps_type is \"gherkin\")", - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "value": { - "description": "Gherkin scenario text (when steps_type is \"gherkin\")", - "type": "string" - } -} - removed
Input schema / properties / cases / items / properties / steps / items / typeRemoved value: -"object" - changed
Input schema / properties / cases / items / properties / steps_type / descriptionPrevious value: -"How steps are written: \"classic\" action/expected pairs, or \"gherkin\" scenario text"New value: +"Step style: \"classic\" action/expected, or \"gherkin\" scenario text" - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO"
- Added
qase_case_delete - Changed
qase_case_upsert13 fields changed- added
Input schema / $defsAdded value: +{ + "step": { + "properties": { + "action": { + "description": "Step action (classic steps). Not needed when `shared` is set.", + "type": "string" + }, + "attachments": { + "description": "Hashes from qase_attachment_upload", + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "description": "Test data", + "type": "string" + }, + "expected_result": { + "description": "Expected result", + "type": "string" + }, + "shared": { + "description": "Hash from `qase_shared_step_upsert` to reuse here; then `action` is not needed.", + "type": "string" + }, + "shared_step_hash": { + "description": "Alias for `shared`, the spelling a case reads back.", + "type": "string" + }, + "steps": { + "description": "Nested substeps, nesting further if needed.", + "items": { + "$ref": "#/$defs/step" + }, + "type": "array" + }, + "value": { + "description": "Gherkin scenario text (when steps_type is \"gherkin\")", + "type": "string" + } + }, + "type": "object" + } +} - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - changed
Input schema / properties / automation / descriptionPrevious value: -"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"New value: +"Automation: 0=Manual, 1=To be automated, 2=Automated (label or ID)" - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / custom_field / descriptionPrevious value: -"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"New value: +"Custom fields by ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +} - changed
Input schema / properties / is_flaky / descriptionPrevious value: -"Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too."New value: +"Is flaky: 0=No, 1=Yes; a boolean works too." - added
Input schema / properties / steps / items / $refAdded value: +"#/$defs/step" - removed
Input schema / properties / steps / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / steps / items / propertiesRemoved value: -{ - "action": { - "description": "Step action (classic steps). Not needed when `shared` is set.", - "type": "string" - }, - "attachments": { - "description": "Attachment hashes from qase_attachment_upload", - "items": { - "type": "string" - }, - "type": "array" - }, - "data": { - "description": "Test data", - "type": "string" - }, - "expected_result": { - "description": "Expected result", - "type": "string" - }, - "shared": { - "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" - }, - "shared_step_hash": { - "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", - "type": "string" - }, - "steps": { - "description": "Nested substeps. Same structure as parent steps, supports further nesting.", - "items": { - "additionalProperties": true, - "properties": { - "action": { - "description": "Step action (classic steps). Not needed when `shared` is set.", - "type": "string" - }, - "attachments": { - "description": "Attachment hashes from qase_attachment_upload", - "items": { - "type": "string" - }, - "type": "array" - }, - "data": { - "description": "Test data", - "type": "string" - }, - "expected_result": { - "description": "Expected result", - "type": "string" - }, - "shared": { - "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" - }, - "shared_step_hash": { - "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", - "type": "string" - }, - "value": { - "description": "Gherkin scenario text (when steps_type is \"gherkin\")", - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "value": { - "description": "Gherkin scenario text (when steps_type is \"gherkin\")", - "type": "string" - } -} - removed
Input schema / properties / steps / items / typeRemoved value: -"object" - changed
Input schema / properties / steps_type / descriptionPrevious value: -"How steps are written: \"classic\" action/expected pairs, or \"gherkin\" scenario text"New value: +"Step style: \"classic\" action/expected, or \"gherkin\" scenario text"
- Changed
qase_ci_report5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - removed
Input schema / properties / results / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / results / items / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - changed
Output schema / (root)Previous value: -{ - "properties": { - "results_recorded": { - "description": "Number of results recorded", - "type": "integer" - }, - "run_id": { - "description": "Created run ID", - "type": "integer" - }, - "run_status": { - "enum": [ - "active", - "complete", - "complete_failed" - ], - "type": "string" - } - }, - "required": [ - "run_id", - "run_status", - "results_recorded" - ], - "type": "object" -}New value: +null
- Added
qase_custom_field_delete - Added
qase_custom_field_upsert - Added
qase_defect_delete - Changed
qase_defect_upsert5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / custom_field / descriptionPrevious value: -"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"New value: +"Custom fields by ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
qase_discover_tools3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / activateRemoved value: -{ - "default": true, - "description": "If true (default), found tools are activated and become available for use", - "type": "boolean" -} - changed
Output schema / (root)Previous value: -{ - "properties": { - "activated": { - "description": "Number of newly activated tools", - "type": "integer" - }, - "found": { - "description": "Number of matching tools", - "type": "integer" - }, - "tools": { - "items": { - "properties": { - "description": { - "type": "string" - }, - "destructive": { - "type": "boolean" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "found", - "activated", - "tools" - ], - "type": "object" -}New value: +null
- Added
qase_environment_delete - Added
qase_environment_upsert - Added
qase_external_issue_link - Changed
qase_get2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / id / anyOfPrevious value: -[ - { - "description": "Entity ID (positive integer)", - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "description": "Hash identifier", - "maxLength": 255, - "minLength": 1, - "type": "string" - } -]New value: +[ + { + "description": "Entity ID", + "exclusiveMinimum": 0, + "type": "integer" + }, + { + "description": "Hash identifier", + "maxLength": 255, + "minLength": 1, + "type": "string" + } +]
- Added
qase_milestone_delete - Added
qase_milestone_upsert - Added
qase_plan_delete - Added
qase_plan_upsert - Changed
qase_project_context4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / full / descriptionPrevious value: -"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."New value: +"Page through every collection instead of the first 100 of each (default: false). Use it when `coverage` reports one truncated; see qase_tool_help for what it costs." - changed
Output schema / (root)Previous value: -{ - "properties": { - "coverage": { - "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" - }, - "custom_fields": { - "description": "Custom fields list", - "type": "object" - }, - "environments": { - "description": "Environments list", - "type": "object" - }, - "milestones": { - "description": "Milestones list", - "type": "object" - }, - "project": { - "description": "Project details", - "type": "object" - }, - "suites": { - "description": "Suites list with entities array", - "type": "object" - }, - "users": { - "description": "Team members list", - "type": "object" - } - }, - "required": [ - "project", - "suites", - "milestones", - "environments", - "coverage" - ], - "type": "object" -}New value: +null
- Added
qase_project_create - Added
qase_project_delete - Changed
qase_regression_run3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Output schema / (root)Previous value: -{ - "properties": { - "cases_added": { - "description": "Number of cases added to the run", - "type": "integer" - }, - "run": { - "description": "Full run entity", - "type": "object" - }, - "run_id": { - "description": "Created run ID", - "type": "integer" - } - }, - "required": [ - "run_id", - "cases_added" - ], - "type": "object" -}New value: +null
- Added
qase_result_delete - Changed
qase_result_record7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - removed
Input schema / properties / results / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / results / items / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - added
Input schema / properties / results / items / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +} - removed
Input schema / properties / results / items / properties / steps / items / additionalPropertiesRemoved value: -false - changed
Input schema / properties / results / items / properties / steps / items / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload"
- Added
qase_review_bulk_create - Added
qase_review_create - Added
qase_review_delete - Added
qase_review_list - Added
qase_review_update - Changed
qase_run_complete3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / id / descriptionPrevious value: -"Entity ID (positive integer)"New value: +"Entity ID"
- Added
qase_run_delete - Changed
qase_run_upsert4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / custom_field / descriptionPrevious value: -"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"New value: +"Custom fields by ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +}
- Added
qase_shared_step_delete - Added
qase_shared_step_upsert - Added
qase_suite_delete - Changed
qase_suite_upsert2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO"
- Added
qase_tool_help - Changed
qase_triage_defect6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / attachments / descriptionPrevious value: -"Attachment hashes from qase_attachment_upload"New value: +"Hashes from qase_attachment_upload" - changed
Input schema / properties / code / descriptionPrevious value: -"Project code (2-10 uppercase letters, numbers, or underscores)"New value: +"Project code, e.g. DEMO" - changed
Input schema / properties / custom_field / descriptionPrevious value: -"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }"New value: +"Custom fields by ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / custom_field / propertyNamesAdded value: +{ + "type": "string" +} - changed
Output schema / (root)Previous value: -{ - "properties": { - "defect": { - "description": "Full defect entity", - "type": "object" - }, - "defect_id": { - "description": "Created defect ID", - "type": "integer" - } - }, - "required": [ - "defect_id" - ], - "type": "object" -}New value: +null
- Changed
qql_help1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
qql_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / (root)Previous value: -{ - "properties": { - "entities": { - "description": "Matching entities", - "items": { - "type": "object" - }, - "type": "array" - }, - "total": { - "description": "Total matching entities", - "type": "integer" - } - }, - "required": [ - "total", - "entities" - ], - "type": "object" -}New value: +null
1 tool update
v2.7.5- Changed
qase_attachment_upload2 fields changed- changed
Input schema / properties / file_base64 / descriptionPrevious value: -"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option."New value: +"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option. Base64 grows a file by a third and the whole request body is capped at 10 MB by default, so this form carries roughly 7 MB of file; larger ones need a local stdio server and file_path." - changed
Input schema / properties / files / descriptionPrevious value: -"Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order."New value: +"Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Those are Qase limits; on a network transport the request body itself caps out at 10 MB by default, so base64 content has to fit in that. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order."
2 tool updates
v2.7.4- Changed
qase_api3 fields changed- changed
Input schema / properties / path / descriptionPrevious value: -"API path starting with /v1/ (e.g., \"/v1/project/DEMO/run\")"New value: +"API path starting with a version segment (e.g., \"/v1/project/DEMO/run\")" - removed
Input schema / properties / path / minLengthRemoved value: -1 - added
Input schema / properties / path / patternAdded value: +"^\\/v\\d+\\/\\S*$"
- Changed
qase_attachment_upload5 fields changed- changed
Input schema / properties / file_base64 / descriptionPrevious value: -"File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option."New value: +"Single-file form. File content, base64 encoded. Use this whenever the server is not on the same machine as the file — including the hosted connector, where it is the only option." - changed
Input schema / properties / file_path / descriptionPrevious value: -"Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead."New value: +"Single-file form. Absolute path to a file on the machine running THIS server. Only usable for a local stdio server; a remote server cannot see your filesystem — send file_base64 instead." - changed
Input schema / properties / filename / descriptionPrevious value: -"Original filename with extension"New value: +"Original filename with extension. Required for the single-file form." - added
Input schema / properties / filesAdded value: +{ + "description": "Several files in one request — each entry carries its own filename and either file_base64 or file_path. Qase accepts at most 20 files, 32 MB per file and 128 MB in total per request. Prefer this over one call per file: it is a single round trip and returns the hashes in the same order.", + "items": { + "additionalProperties": false, + "properties": { + "file_base64": { + "description": "File content, base64 encoded. The only option on a remote server.", + "type": "string" + }, + "file_path": { + "description": "Absolute path to a file on the machine running THIS server.", + "type": "string" + }, + "filename": { + "description": "Original filename with extension", + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "code", - "filename" -]New value: +[ + "code" +]
3 tool updates
v2.7.0- Added
qase_case_bulk_create - Added
qase_run_complete - Added
qase_suite_upsert
6 tool updates
v2.5.1- Changed
qase_case_upsert9 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"Free-form description of what the case covers" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the case belongs to" - added
Input schema / properties / postconditions / descriptionAdded value: +"State to restore or verify after the steps run" - added
Input schema / properties / preconditions / descriptionAdded value: +"State the system must be in before the steps run" - added
Input schema / properties / steps / descriptionAdded value: +"Ordered test steps; omit for a case without steps" - added
Input schema / properties / steps_type / descriptionAdded value: +"How steps are written: \"classic\" action/expected pairs, or \"gherkin\" scenario text" - added
Input schema / properties / suite_id / descriptionAdded value: +"ID of the suite that holds the case" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"smoke\", \"billing\"]"
- Changed
qase_ci_report1 field changed- added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the build ran against"
- Changed
qase_defect_upsert4 fields changed- added
Input schema / properties / actual_result / descriptionAdded value: +"What actually happened — required when creating a defect" - added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / severity / descriptionAdded value: +"How bad the defect is — required when creating a defect" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"regression\", \"payments\"]"
- Changed
qase_regression_run3 fields changed- added
Input schema / properties / description / descriptionAdded value: +"What this regression run covers" - added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the run executes against" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the run belongs to"
- Changed
qase_run_upsert6 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"What this run covers" - added
Input schema / properties / environment_id / descriptionAdded value: +"ID of the environment the run executes against" - added
Input schema / properties / is_autotest / descriptionAdded value: +"True when the run is produced by automation rather than a person" - added
Input schema / properties / milestone_id / descriptionAdded value: +"ID of the milestone the run belongs to" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"nightly\", \"smoke\"]"
- Changed
qase_triage_defect3 fields changed- added
Input schema / properties / custom_field / descriptionAdded value: +"Custom field values keyed by field ID, e.g. { \"12\": \"value\" }" - added
Input schema / properties / description / descriptionAdded value: +"Extra context beyond the observed behavior" - added
Input schema / properties / tags / descriptionAdded value: +"Tag names, e.g. [\"regression\", \"payments\"]"
1 tool update
v2.5.0- Changed
qase_case_upsert2 fields changed- added
Input schema / properties / is_flaky / descriptionAdded value: +"Is flaky label or numeric ID (0=No, 1=Yes). A boolean is accepted too." - changed
Input schema / properties / is_flaky / typePrevious value: -"boolean"New value: +"string"
2 tool updates
v2.4.1- Changed
qase_ci_report2 fields changed- changed
Input schema / properties / results / descriptionPrevious value: -"Test results to record"New value: +"Test results to record, 1 to 2000 per call" - added
Input schema / properties / results / maxItemsAdded value: +2000
- Changed
qase_result_record2 fields changed- changed
Input schema / properties / results / descriptionPrevious value: -"One or more results to record"New value: +"Results to record, 1 to 200 per call" - added
Input schema / properties / results / maxItemsAdded value: +200
7 tool updates
v2.2.1- Added
qase_attachment_upload - Changed
qase_case_upsert3 fields changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload" - changed
Input schema / properties / steps / items / properties / attachments / descriptionPrevious value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload" - changed
Input schema / properties / steps / items / properties / steps / items / properties / attachments / descriptionPrevious value: -"Attachment hashes"New value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_ci_report1 field changed- added
Input schema / properties / results / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_defect_upsert1 field changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_get1 field changed- changed
Input schema / properties / entity / enumPrevious value: -[ - "case", - "suite", - "run", - "result", - "plan", - "defect", - "milestone", - "environment", - "shared_step", - "shared_parameter", - "configuration", - "attachment", - "author", - "user", - "custom_field" -]New value: +[ + "case", + "suite", + "run", + "result", + "plan", + "defect", + "milestone", + "environment", + "shared_step", + "shared_parameter", + "configuration", + "attachment", + "author", + "user", + "review", + "custom_field" +]
- Changed
qase_result_record2 fields changed- added
Input schema / properties / results / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload" - added
Input schema / properties / results / items / properties / steps / items / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
- Changed
qase_triage_defect1 field changed- added
Input schema / properties / attachments / descriptionAdded value: +"Attachment hashes from qase_attachment_upload"
4 tool updates
v2.1.1- Changed
qase_project_context3 fields changed- added
Input schema / properties / fullAdded value: +{ + "description": "Page through every suite, milestone, environment, custom field, and user instead of fetching only the first 100 of each (default: false). Use this when a collection is reported as truncated and you need the complete set — it costs one API call per 100 entities and can return thousands of items, so prefer the targeted list tools or qql_search when you only need a subset.", + "type": "boolean" +} - added
Output schema / properties / coverageAdded value: +{ + "description": "Per-collection completeness: each of suites, milestones, environments, custom_fields, and users maps to { total, loaded, truncated }. When truncated is true the list holds only the first `loaded` of `total` entities — re-call with full: true for the rest.", + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "project", - "suites", - "milestones", - "environments" -]New value: +[ + "project", + "suites", + "milestones", + "environments", + "coverage" +]
- Changed
qase_triage_defect7 fields changed- changed
Input schema / properties / actual_result / descriptionPrevious value: -"Observed behavior"New value: +"Observed behavior. Required by the API" - removed
Input schema / properties / failed_result_idsRemoved value: -{ - "description": "Result hashes to link to this defect (from the run)", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / run_idRemoved value: -{ - "description": "Run containing the failed results", - "exclusiveMinimum": 0, - "type": "integer" -} - added
Input schema / properties / severity / descriptionAdded value: +"Required by the API" - changed
Input schema / requiredPrevious value: -[ - "code", - "title" -]New value: +[ + "code", + "title", + "severity", + "actual_result" +] - removed
Output schema / properties / linked_resultsRemoved value: -{ - "description": "Number of linked result hashes", - "type": "integer" -} - changed
Output schema / requiredPrevious value: -[ - "defect_id", - "linked_results" -]New value: +[ + "defect_id" +]
- Changed
qql_help3 fields changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Specific help topic, or omit for general overview"New value: +"Which section to return (required — one section per call):\n- overview: what QQL is, overall query structure, subscription requirement\n- syntax: structure, ordering, custom fields, case-sensitivity, boolean and date fields\n- entities: the fields available on each entity — field names are NOT uniform across entities, so read this before writing a query against an unfamiliar one\n- operators: comparison, matching, set, null, and logical operators\n- functions: currentUser, activeUsers, and the now/startOf*/endOf* date functions\n- examples: ready-made queries for common questions\n- aggregation: SELECT (COUNT/MIN/MAX/AVG/SUM/FIRST/LAST), GROUP BY, HAVING — use this to count or summarise instead of paging through rows\n- enumValues: the valid values for priority, severity, and the per-entity status fields" - changed
Input schema / properties / topic / enumPrevious value: -[ - "syntax", - "entities", - "operators", - "functions", - "examples" -]New value: +[ + "overview", + "syntax", + "entities", + "operators", + "functions", + "examples", + "aggregation", + "enumValues" +] - added
Input schema / requiredAdded value: +[ + "topic" +]
- Changed
qql_search2 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"QQL query expression. Examples:\n- entity = \"case\" and project = \"DEMO\" and status = \"Actual\"\n- entity = \"defect\" and severity = \"blocker\" and status = \"open\"\n- entity = \"result\" and status = \"failed\" and created >= now(\"-7d\")\n- entity = \"run\" and milestone ~ \"Sprint 12\"\nSee QQL documentation for full syntax and examples."New value: +"QQL query expression. Examples:\n- entity = \"case\" and project = \"DEMO\" and status = \"Actual\"\n- entity = \"defect\" and severity = \"blocker\" and status = \"open\"\n- entity = \"result\" and status = \"failed\" and ended >= now(\"-7d\")\n- entity = \"run\" and milestone ~ \"Sprint 12\"\nSee QQL documentation for full syntax and examples." - changed
Input schema / properties / query / maxLengthPrevious value: -1000New value: +2000
2 tool updates
v2.0.3- Changed
qase_case_upsert6 fields changed- changed
Input schema / properties / steps / items / properties / action / descriptionPrevious value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set." - added
Input schema / properties / steps / items / properties / sharedAdded value: +{ + "description": "Hash of an existing shared step to insert at this position, from `qase_shared_step_upsert`. The step then reuses that shared step instead of defining its own content, so `action` can be omitted. Reading the case back reports the link as `shared_step_hash`.", + "type": "string" +} - added
Input schema / properties / steps / items / properties / shared_step_hashAdded value: +{ + "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", + "type": "string" +} - changed
Input schema / properties / steps / items / properties / steps / items / properties / action / descriptionPrevious value: -"Step action (classic steps)"New value: +"Step action (classic steps). Not needed when `shared` is set." - added
Input schema / properties / steps / items / properties / steps / items / properties / sharedAdded value: +{ + "description": "Hash of an existing shared step to insert at this position, from `qase_shared_step_upsert`. The step then reuses that shared step instead of defining its own content, so `action` can be omitted. Reading the case back reports the link as `shared_step_hash`.", + "type": "string" +} - added
Input schema / properties / steps / items / properties / steps / items / properties / shared_step_hashAdded value: +{ + "description": "Alias for `shared` — the name used when reading a case. Sent to the API as `shared`.", + "type": "string" +}
- Changed
qase_get1 field changed- added
Input schema / properties / includeAdded value: +{ + "description": "Comma-separated list of related entities to include in the response. Cases and runs already request their external issue links by default (\"external_issues\" / \"external_issue\"); pass this only to override that.", + "type": "string" +}
90 tool updates
v2.0.0- Removed
attach_external_issue - Removed
bulk_create_cases - Removed
complete_run - Removed
create_case - Removed
create_configuration_group - Removed
create_custom_field - Removed
create_defect - Removed
create_environment - Removed
create_milestone - Removed
create_plan - Removed
create_project - Removed
create_result - Removed
create_results_bulk - Removed
create_run - Removed
create_shared_step - Removed
create_suite - Removed
delete_attachment - Removed
delete_case - Removed
delete_configuration_group - Removed
delete_custom_field - Removed
delete_defect - Removed
delete_environment - Removed
delete_milestone - Removed
delete_plan - Removed
delete_project - Removed
delete_result - Removed
delete_run - Removed
delete_run_public_link - Removed
delete_shared_step - Removed
delete_suite - Removed
detach_external_issue - Removed
get_attachment - Removed
get_author - Removed
get_case - Removed
get_custom_field - Removed
get_defect - Removed
get_environment - Removed
get_milestone - Removed
get_plan - Removed
get_project - Removed
get_result - Removed
get_run - Removed
get_run_public_link - Removed
get_shared_parameter - Removed
get_shared_step - Removed
get_suite - Removed
get_user - Removed
grant_project_access - Removed
list_attachments - Removed
list_authors - Removed
list_cases - Removed
list_configurations - Removed
list_custom_fields - Removed
list_defects - Removed
list_environments - Removed
list_milestones - Removed
list_plans - Removed
list_projects - Removed
list_results - Removed
list_runs - Removed
list_shared_parameters - Removed
list_shared_steps - Removed
list_suites - Removed
list_system_fields - Removed
list_users - Added
qase_api - Added
qase_case_upsert - Added
qase_ci_report - Added
qase_defect_upsert - Added
qase_discover_tools - Added
qase_get - Added
qase_project_context - Added
qase_regression_run - Added
qase_result_record - Added
qase_run_upsert - Added
qase_triage_defect - Changed
qql_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "entities": { + "description": "Matching entities", + "items": { + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Total matching entities", + "type": "integer" + } + }, + "required": [ + "total", + "entities" + ], + "type": "object" +}
- Removed
resolve_defect - Removed
revoke_project_access - Removed
update_case - Removed
update_custom_field - Removed
update_defect - Removed
update_defect_status - Removed
update_environment - Removed
update_milestone - Removed
update_plan - Removed
update_result - Removed
update_shared_step - Removed
update_suite - Removed
upload_attachment
3 tool updates
v1.1.8- Changed
bulk_create_cases1 field changed- changed
Input schema / properties / cases / items / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
- Changed
create_case1 field changed- changed
Input schema / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
- Changed
update_case1 field changed- changed
Input schema / properties / automation / descriptionPrevious value: -"Automation status"New value: +"Automation status (label, slug, or numeric ID: 0=Manual / is-not-automated, 1=To be automated, 2=Automated)"
80 tool updates
v1.1.7- First observed
attach_external_issue - First observed
bulk_create_cases - First observed
complete_run - First observed
create_case - First observed
create_configuration_group - First observed
create_custom_field - First observed
create_defect - First observed
create_environment - First observed
create_milestone - First observed
create_plan - First observed
create_project - First observed
create_result - First observed
create_results_bulk - First observed
create_run - First observed
create_shared_step - First observed
create_suite - First observed
delete_attachment - First observed
delete_case - First observed
delete_configuration_group - First observed
delete_custom_field - First observed
delete_defect - First observed
delete_environment - First observed
delete_milestone - First observed
delete_plan - First observed
delete_project - First observed
delete_result - First observed
delete_run - First observed
delete_run_public_link - First observed
delete_shared_step - First observed
delete_suite - First observed
detach_external_issue - First observed
get_attachment - First observed
get_author - First observed
get_case - First observed
get_custom_field - First observed
get_defect - First observed
get_environment - First observed
get_milestone - First observed
get_plan - First observed
get_project - First observed
get_result - First observed
get_run - First observed
get_run_public_link - First observed
get_shared_parameter - First observed
get_shared_step - First observed
get_suite - First observed
get_user - First observed
grant_project_access - First observed
list_attachments - First observed
list_authors - First observed
list_cases - First observed
list_configurations - First observed
list_custom_fields - First observed
list_defects - First observed
list_environments - First observed
list_milestones - First observed
list_plans - First observed
list_projects - First observed
list_results - First observed
list_runs - First observed
list_shared_parameters - First observed
list_shared_steps - First observed
list_suites - First observed
list_system_fields - First observed
list_users - First observed
qql_help - First observed
qql_search - First observed
resolve_defect - First observed
revoke_project_access - First observed
update_case - First observed
update_custom_field - First observed
update_defect - First observed
update_defect_status - First observed
update_environment - First observed
update_milestone - First observed
update_plan - First observed
update_result - First observed
update_shared_step - First observed
update_suite - First observed
upload_attachment
TDQS
Scored across 42 tools
Each tool has a clearly delineated purpose, with extensive cross-references in descriptions guiding the agent to the right tool (e.g., upsert vs bulk create, ci_report vs result_record). The presence of discovery/help tools reinforces clarity. No overlapping functionality that would cause misselection.
Tool names predominantly follow a qase_<entity>_<action> snake_case pattern, with a few exceptions for special operations (e.g., qase_get, qase_api, qase_discover_tools). The convention is consistent and readable, though not perfectly uniform.
42 tools is on the high side, but justified by the breadth of the Qase platform (cases, runs, defects, reviews, etc.). Each tool addresses a distinct operation or entity, and the set avoids redundant tools by providing upsert rather than separate create/update. Still, the volume may feel heavy.
The tool set covers the full CRUD lifecycle for major entities (cases, runs, results, defects, reviews, milestones, etc.), plus bulk operations, search, and a generic API fallback. Known API limitations (e.g., review approval is UI-only) are documented, so no gaps in achievable operations.
Maintenance
Related MCP Connectors
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Official DevSpeak MCP server — translate technical text into formal specs from any AI IDE or agent
Official Miro MCP server - Supports context to code and creating diagrams, docs, and data tables.
Related MCP Servers
- AlicenseCqualityFmaintenanceA TypeScript-based MCP server that provides integration with the Qase test management platform, allowing you to manage projects, test cases, runs, results, plans, suites, and shared steps.2612MIT
- AlicenseAqualityCmaintenanceMCP server for QTM4J (QMetry Test Management for Jira) Open API, enabling test case and cycle management via natural language.2138 npmMIT

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