TestRail MCP Server
You can manage TestRail projects, test cases, runs, results, attachments, and metadata through AI assistants or CLI automation.
Discover & navigate: list projects, suites, sections, and users (
query_project,query_suite,mutate_suite,query_section,mutate_section,get_users)Manage test cases: retrieve, create, update, bulk-update, resolve custom fields, and export cases for RAG (
get_case,get_cases,add_case,update_case,update_cases,get_case_fields,resolve_case_field,export_cases_for_rag)Execute & track: create/update test runs, fetch tests, and add results by
test_idorcase_id(mutate_run,query_run,get_tests,add_results,add_results_for_cases,get_results)Handle attachments: upload files/directories (auto-zipped) and download or list attachments (
add_attachment,query_attachment)Retrieve metadata: get configurations, labels, priorities, statuses, and templates (
get_configurations,get_labels,get_priorities,get_statuses,get_templates)Control access: read/write/delete operations are permission-gated with per-tool allowlisting
Manages TestRail projects, tests cases, test runs, and results, enabling AI assistants to search, create, update test cases, kick off test runs, record results, and attach files through natural-language conversation.
What is the TestRail MCP Server?
The TestRail MCP Server is a free, open-source Model Context Protocol server that gives AI assistants direct, structured access to a TestRail instance through the TestRail API v2. Once configured, an assistant such as Claude Desktop, Cursor, Windsurf, or GitHub Copilot in VS Code can search test cases, draft new ones, start test runs, record results, and upload attachments on your behalf — without you leaving the chat window.
It exposes 35 tools, runs locally on Node.js 18+ over the MCP stdio transport, and is licensed under Apache 2.0. There is nothing to host or deploy: your MCP client launches it on demand with npx.
No context switching. No tedious copy-pasting. Just ask your AI.
Compatibility baseline: tested and validated against TestRail 10.6.2 (API v2). Older TestRail instances (including pre-7.x pagination) are also supported via built-in backward compatibility. TestRail Cloud and self-hosted TestRail Server both work.
Related MCP server: TestRail MCP Server
Table of contents
✨ Key Features & Capabilities
Capability | Description |
🔍 Intelligent Discovery | Browse projects, test suites, and sections to automatically map your QA organization. |
📋 Full Case Management | Fetch, create, update, and bulk-edit test cases with comprehensive custom field support. |
▶️ Actionable Execution | Create test runs, update results by |
🧠 Context-Aware AI | Dynamically exposes templates, fields, priorities, and statuses so LLMs generate valid, structured data. |
🖥️ CLI & CI/CD Native | Run every tool from bash, GitHub Actions, GitLab CI, or Jenkins with zero LLM overhead. |
🔐 Least-Privilege Controls | Per-mode permissions plus per-tool allowlisting; destructive deletes are off by default. |
🚀 Quick Start Guide
1. Obtain your TestRail API key
Navigate to My Settings → API Keys in TestRail and generate a new key. Copy it immediately — TestRail shows it only once. The API must also be enabled instance-wide under Administration → Site Settings → API.
2. Configure your MCP client
Add the server to your MCP client configuration. The Claude Desktop example is shown below; Cursor, Windsurf, and VS Code use the same pattern (see the collapsible sections).
🤖 Claude Desktop
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"testrail": {
"command": "npx",
"args": ["-y", "@uarlouski/testrail-mcp-server@latest"],
"env": {
"TESTRAIL_INSTANCE_URL": "https://your-instance.testrail.io",
"TESTRAIL_USERNAME": "your@email.com",
"TESTRAIL_API_KEY": "your-api-key",
"TESTRAIL_ENABLE_SHARED_STEPS": "true"
}
}
}
}Open Settings → MCP → Add new MCP server, or edit .cursor/mcp.json in your project (~/.cursor/mcp.json for all projects):
{
"mcpServers": {
"testrail": {
"command": "npx",
"args": ["-y", "@uarlouski/testrail-mcp-server@latest"],
"env": {
"TESTRAIL_INSTANCE_URL": "https://your-instance.testrail.io",
"TESTRAIL_USERNAME": "your@email.com",
"TESTRAIL_API_KEY": "your-api-key"
}
}
}
}Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"testrail": {
"command": "npx",
"args": ["-y", "@uarlouski/testrail-mcp-server@latest"],
"env": {
"TESTRAIL_INSTANCE_URL": "https://your-instance.testrail.io",
"TESTRAIL_USERNAME": "your@email.com",
"TESTRAIL_API_KEY": "your-api-key"
}
}
}
}Add to .vscode/mcp.json. The inputs block keeps your API key out of the file:
{
"inputs": [
{
"id": "testrail-api-key",
"type": "promptString",
"description": "TestRail API key",
"password": true
}
],
"servers": {
"testrail": {
"command": "npx",
"args": ["-y", "@uarlouski/testrail-mcp-server@latest"],
"env": {
"TESTRAIL_INSTANCE_URL": "https://your-instance.testrail.io",
"TESTRAIL_USERNAME": "your@email.com",
"TESTRAIL_API_KEY": "${input:testrail-api-key}"
}
}
}
}Any MCP-compliant client can use this server, because it speaks the standard MCP stdio transport. Point your client at the npx command with the required environment variables — no port, URL, or transport configuration needed.
3. See it in action
Restart your client completely, then turbo-charge your QA workflow by asking your AI assistant:
"List all projects in TestRail to find the latest active project."
"Show me all active users in the project to find the right assignee."
"Show me all test cases in section 5 of project 3."
"Create a comprehensive test case for 'Login Validation' with detailed steps."
"Start a new test run containing cases from section 5."
"Mark test case C1042 as passed with the comment 'verified on staging'."
Full per-client setup instructions, including troubleshooting, are in the Getting Started guide.
🖥️ Command Line Interface (CLI) & CI/CD Automation
In addition to interacting via AI assistants, you can invoke any TestRail tool directly from shell scripts, terminal environments, and automated CI/CD pipelines (GitHub Actions, GitLab CI, Jenkins) using testrail-cli or npx — with zero LLM overhead.
Deterministic Execution: Returns standard Unix exit codes (
0on success,1on error).Pipeline-Native Output: Emits clean JSON to
stdoutfor piping into tools likejq, while diagnostics and errors go tostderr.Zero Duplication: Reuses the exact same API client, retry logic, and validation schemas as the MCP server.
Invocation methods
# Method 1: Direct npx subcommand (Recommended)
npx @uarlouski/testrail-mcp-server cli <command> [flags]
# Method 2: Global or local binary
testrail-cli <command> [flags]
# Method 3: Via package runner
npx -p @uarlouski/testrail-mcp-server testrail-cli <command> [flags]Examples
Query projects (query_project)
# List all active projects
npx @uarlouski/testrail-mcp-server cli query_project --action many
# Query a single project by ID
npx @uarlouski/testrail-mcp-server cli query_project --action one --project_id 1Report automated test results (add_results_for_cases)
# Submit results by case_id — what your test framework already knows
npx @uarlouski/testrail-mcp-server cli add_results_for_cases \
--run_id 88 \
--results '[{"case_id":1042,"status_id":1,"comment":"Passed in CI"}]'Export cases for knowledge base / RAG (export_cases_for_rag)
# Export all cases for a project into Markdown & metadata sidecars
npx @uarlouski/testrail-mcp-server cli export_cases_for_rag \
--project_id 1 \
--output_dir ./rag_exports
# Export specific cases by ID (comma-separated list)
npx @uarlouski/testrail-mcp-server cli export_cases_for_rag \
--case_ids C101,C102,103 \
--output_dir ./rag_exportsCommand discovery & flag documentation
# List all available commands
npx @uarlouski/testrail-mcp-server cli --help
# Show parameter options for a specific tool
npx @uarlouski/testrail-mcp-server cli query_project --helpSee the CLI & CI/CD guide for complete GitHub Actions, GitLab CI, and Jenkins workflows.
⚙️ Environment Variables & Security Controls
Variable | Description | Required | Default |
| Your TestRail instance URL (e.g., | ✅ | |
| Your TestRail user email address | ✅ | |
| Your TestRail API key (Guide) | ✅ | |
| Set to |
| |
| Set to |
| |
| Set to |
| |
| Allow write operations (e.g. adding/updating test cases, test runs, sections) |
| |
| Allow read operations (e.g. retrieving projects, test cases, templates) |
| |
| Allow delete operations (e.g. deleting cases or shared steps). Enabled strictly via |
| |
| Preserved for backward compatibility with existing host configurations. |
| |
| Comma-separated list of specific tool names to disable (e.g., | - |
With only the three required credentials, 27 of the 35 tools are registered. Ready-made read-only and least-privilege configurations are in the Configuration guide.
🧰 Available Tools
All 35 tools, grouped by area. Each declares a read, write, or delete mode, which the server surfaces to clients as MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
Area | Tools | Reference |
Discovery & Navigation |
| |
Test Case Management |
| |
Execution & Tracking |
| |
Attachments & Media |
| |
Shared Steps |
| |
System Metadata |
| |
Deletion |
|
❓ Frequently Asked Questions
Any MCP-compliant client, because the server uses the standard MCP stdio transport. Setup is verified with Claude Desktop, Cursor, Windsurf, and VS Code. Other clients follow the same pattern: run npx -y @uarlouski/testrail-mcp-server@latest with three environment variables.
The server targets TestRail API v2 and is tested against TestRail 10.6.2. Older instances work too — the client detects whether an endpoint returns a modern paginated response or a legacy bare array, so pre-7.x instances need no configuration. Both TestRail Cloud and self-hosted TestRail Server are supported.
Access is layered rather than all-or-nothing. Every tool declares a read, write, or delete mode; deletes are disabled unless you explicitly set TESTRAIL_ALLOW_DELETE_OPERATIONS=true. You can disable all writes with TESTRAIL_ALLOW_WRITE_OPERATIONS=false, or block individual tools by name with TESTRAIL_DISABLED_TOOLS. The server runs locally and talks only to your TestRail instance — there is no telemetry and no third-party service in the middle.
Yes — Apache 2.0 licensed, with no paid tier, licence key, or usage limit. You need your own TestRail subscription, and whatever your AI assistant costs. The CLI has no LLM cost at all.
Yes. The package ships a testrail-cli binary exposing every tool as a subcommand, reusing the same API client, retry logic, and validation schemas. JSON on stdout, diagnostics on stderr, exit code 0 or 1 — see the CLI guide.
It can't. Before add_case or update_case sends anything, the server validates every field key against your instance's real schema (fetched via get_case_fields) and rejects unknown keys. Templates, priorities, statuses, and configurations are all exposed as tools too, so the model looks up correct IDs instead of guessing them.
Pass output_file to get_cases (or output_dir to export_cases_for_rag). The server paginates the full result set, writes raw JSON to disk, and returns only a short summary to the model.
More answers in the full FAQ.
📚 Documentation & Complete Tool Reference
For a comprehensive guide, detailed configuration options, and a complete breakdown of all available tools, visit the official documentation site:
👉 TestRail MCP Server Documentation
🚀 Getting Started: Per-client setup for Claude, Cursor, Windsurf, and VS Code.
⚙️ Configuration: Every environment variable, permission, and feature flag.
🧰 All Tools: All 35 tools with modes and feature flags in one table.
🔭 Discovery & Navigation: Exploring projects, suites, and sections.
📋 Test Case Management: Fetching, creating, and bulk-updating test cases.
▶️ Execution & Tracking: Managing test runs and submitting test results.
📎 Attachments: Automatically zipping and uploading files or directories.
🔗 Shared Steps: Managing reusable step definitions.
🖥️ CLI & CI/CD: Pipeline automation without an LLM.
🤝 Contributing
Open-source contributions are actively welcomed! Please feel free to open an issue for feature requests or submit a pull request for improvements.
📜 License
This project is licensed under the Apache License 2.0.
Available Tools
27 toolsadd_attachmentA
Add an attachment to a test case, test run, or test result in TestRail. If the file_path points to a directory, it will be automatically zipped before uploading. Maximum upload size is 256MB.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | The ID of the entity to attach the file to (e.g. 123 or 'C123' for cases, or numeric run / result ID) | |
| file_path | Yes | The path to the file or directory to attach. Directories will be automatically zipped. | |
| entity_type | Yes | The type of entity to attach the file to ('case', 'run', or 'result') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, not destructive, not idempotent), so the description is free to add operational detail. It contributes real behavior beyond annotations: automatic zipping when file_path is a directory and a 256MB maximum upload size. It does not say what happens on duplicate filenames or how large attachments are reported.
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, and the core action is front-loaded before the two conditional constraints. Every sentence carries information an agent would otherwise have to guess.
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 3-parameter mutation tool with full schema coverage, annotations covering safety, and no output schema, the description covers the notable edge cases (directories, size limit). The main gap is the absence of any statement about the result of a successful upload or failure modes, which an agent might want.
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 entity_type, entity_id, and file_path, including the 'C123'/numeric ID convention and the directory-zipping behavior. The description largely restates the file_path zip semantics, adding little meaning beyond structured fields; 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?
The description names a specific verb and resource ('Add an attachment') and enumerates the three target entity types (test case, test run, test result), so an agent knows exactly what the tool does. It stops short of explicitly differentiating itself from the sibling read counterpart query_attachment, which keeps it from a 5.
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?
Usage is implied by the purpose rather than stated: there is no explicit 'use this when...' or routing advice against siblings like query_attachment. It does supply practical preconditions (directory auto-zip, 256MB cap), which is useful but is constraint information rather than when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_caseA
Create a new test case in TestRail. The create operation requires knowing valid field names that are returned by get_case_fields tool.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title of the test case | |
| fields | No | A flat key-value map of case fields. The server merges all entries directly into the root of the TestRail API request body — there is no nested "fields" key in the API call. Must use system_name values from get_case_fields. Example: {"priority_id": 2, "template_id": 1, "labels": [1, 2]} Call get_case_fields with project_id first if field names are not already known. Using an unknown field name (e.g. 'label_ids') will result in an error. | |
| section_id | Yes | The ID of the section where the case should be created. Use query_section (action: "many") to find available sections |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, so the safety profile is covered structurally. The description adds the dependency on get_case_fields and the failure mode for unknown field names, but does not describe permissions, validation behavior, or what is returned.
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?
Two tight sentences; the core create action is front-loaded and the prerequisite follows. No wasted text, though the second sentence could be folded into the first without loss.
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 full schema coverage, no output schema, and annotations covering safety, the description plus schema is largely complete. The main omission is any note about what happens on success (created ID) or overlapping fields.
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 only the field-name provenance requirement, which the schema's 'fields' description already explains in detail. No additional parameter meaning beyond the structured fields.
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 ('Create a new test case in TestRail'), clearly distinct from update_case/get_case siblings by the verb. It does not explicitly name the sibling it is not, 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?
Names a concrete prerequisite and the tool that satisfies it: field names must come from get_case_fields, and unknown field names will error. This gives clear context for correct invocation, though it does not compare against update_case or otherwise state when-not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_resultsC
Add one or more test results to a test run
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The ID of the test run | |
| results | Yes | Array of results to add. Each result must have test_id and status_id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: it does not warn that re-adding the same result is non-idempotent (duplicates possible), nor describe permissions or what the call returns. For a mutation tool with no output schema, this is thin.
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 front-loaded sentence with zero filler; the action and scope come first. It is efficient but borders on under-specification rather than true conciseness, since no behavioral detail accompanies it.
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 non-idempotent write tool with no output schema, the description omits what happens on success (created IDs, duplicates) and does not route the agent to the sibling add_results_for_cases or the required lookup tools. Annotations carry the safety signal, but the remaining behavioral gap is significant.
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 itself documents run_id, the results array, and each nested field including cross-references to get_tests and get_statuses. The description adds no syntax, format, or batching semantics beyond what the schema already provides, 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 (add) and resource (test results) with scope (one or more, to a test run), so the core action is unambiguous. It does not differentiate from the near-identical sibling add_results_for_cases, which an agent could easily confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g. results must belong to an existing run), and no mention of the closely related add_results_for_cases alternative. The agent is left to infer the distinction from names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_results_for_casesB
Add one or more test results to a test run using case IDs instead of test IDs
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The ID of the test run | |
| results | Yes | Array of results to add. Each result must have case_id and status_id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the mutation/safety profile is covered structurally and is not contradicted. The description adds nothing beyond that — no note on failure behavior for invalid case/status IDs, batch atomicity, or permission requirements.
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 front-loaded sentence with zero filler that conveys the action and the case-ID-vs-test-ID distinction immediately.
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 non-idempotent write tool with no output schema, the description plus full schema and annotations cover the essentials, but the description contributes little on its own and omits any error/permission context an agent might need.
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 documents run_id, the results array structure, and even points to get_cases/get_statuses for ID lookup. The description adds no parameter meaning 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 (add), resource (test results), target (a test run), and the key distinguishing mechanic: case IDs rather than test IDs. This implicitly separates it from the sibling add_results, though it never names that sibling directly.
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 'using case IDs instead of test IDs' phrasing implies when to pick this over add_results, but it is never stated explicitly and no prerequisites (run must exist, valid status IDs, permissions) are given. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_caseBRead-onlyIdempotent
Get detailed information about a test case including its custom fields
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The ID of the test case (e.g. '123' or 'C123') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read semantics are covered. The description adds the useful detail that custom fields are included in the result, but says nothing about error behavior (e.g. missing case), depth of returned data, or format.
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, front-loaded sentence with no filler; the verb and the noteworthy detail (custom fields) come first. It is appropriately sized for a simple single-parameter lookup, though it could be marginally more informative without bloat.
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 read tool whose safety profile is covered by annotations, the definition is minimally adequate. With no output schema, the description only lightly sketches the return (detailed info plus custom fields) and omits noting what happens for an unknown case_id.
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 single case_id parameter (with example formats '123' or 'C123') is fully documented in the schema. The description adds no syntax or semantic detail beyond what the schema already 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?
The description names a specific verb (Get) and resource (test case) and adds a scope note about custom fields, which is useful. However, it does not explicitly distinguish itself from close siblings like get_cases (plural list) or get_case_fields, leaving the differentiation to inference.
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?
There is no statement of when to use this tool versus alternatives such as get_cases, get_case_fields, or query_test. The agent must infer usage purely from the name, with no exclusions or prerequisites offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_case_fieldsARead-onlyIdempotent
Get the field schema for test cases for a specific project. You should normally provide project_id to get fields applicable to your project. If you truly need all fields across all projects, you may omit project_id, but this is rarely what you want. Returns available fields with their types and options (for dropdown fields).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | The project ID to get fields for. This is the primary way to use this tool, as it returns only the fields relevant to your current project. If omitted, returns all fields across all projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false. The description adds value by describing the return format ('fields with their types and options for dropdown fields'), which is important since no output schema exists. It does not discuss auth or rate limits, but those are less critical for a read-only metadata 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, front-loaded with the main action, followed by parameter guidance and return value information. Every 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 simple read-only tool with one parameter and no output schema, the description covers purpose, parameter usage, and return format. An agent has enough information to call it correctly without needing to inspect other sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds normative guidance beyond the neutral schema text, telling the agent that project_id should normally be provided and that omitting it is rarely desirable. This meaningfully shapes parameter usage.
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: 'Get the field schema for test cases for a specific project.' This clearly distinguishes it from siblings like get_case, get_cases, and resolve_case_field, which deal with case data rather than field metadata.
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 guidance on when to provide project_id versus omitting it, including the normative warning that omitting is 'rarely what you want.' It does not name alternative tools or conditions for using them, so it falls short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_casesARead-onlyIdempotent
Get all test cases for a project. Filter by section, API params (priority, type), or any field including custom fields via 'where'. Returns case IDs, titles, and any additional requested fields.
| Name | Required | Description | Default |
|---|---|---|---|
| where | No | Optional client-side filter for any field including custom fields (filters after fetching all cases). Supports exact value matching. Example: {"custom_automation_status": 1, "priority_id": 2} | |
| fields | No | Additional fields to include in response beyond id, title, and suite_id (supports system fields such as updated_on, created_on, created_by, updated_by, as well as custom fields). Example: ["updated_on", "priority_id", "custom_automation_status"] | |
| filter | No | Optional API-side filters (more efficient for large datasets). Supported: priority_id, type_id, created_by, updated_by, milestone_id, refs, created_after, created_before, updated_after, updated_before. Use comma-separated values for IDs. Example: {"priority_id": "1,2", "type_id": "3"} | |
| section | No | Section filter configuration. Use query_section to find available sections | |
| suite_id | No | The ID of the test suite (required for multi-suite projects, i.e. suite_mode=3). Use query_suite to find available suites | |
| project_id | Yes | The ID of the project. Use query_project to find available projects | |
| output_file | No | Absolute file path to save the JSON response to. Use this for large datasets to avoid blowing up context limits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the return shape (case IDs, titles, requested fields), which is mildly useful, but the significant behavioral caveat — that 'where' fetches all cases first and filters client-side — lives only in the schema, and no auth or rate-limit context is given.
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 purpose followed by filtering and return shape. No filler, though the return-shape sentence is the only non-redundant addition.
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, so the description correctly compensates by naming the guaranteed return fields (IDs, titles) plus requested extras. With 100% schema coverage on parameters and annotations covering safety, the definition is nearly self-sufficient; only the client-side filtering cost is left undocumented in the description.
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 seven parameters thoroughly. The description summarizes the same filters (section, priority, type, custom fields via 'where') without adding syntax, format, or constraint detail beyond the schema — 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 and resource ('Get all test cases for a project') with scope, then names the filter dimensions and the return contents. An agent can distinguish this from the singular sibling get_case and from get_tests/get_results 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?
The description enumerates the filtering mechanisms (section, API params, 'where') but never says when to prefer this tool over get_case or get_tests, nor when to use the API-side 'filter' versus the client-side 'where'. Usage is implied by the filter list rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configurationsARead-onlyIdempotent
Get all configuration groups and configurations for a project in TestRail.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The ID of the project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only that the result is scoped to a single project and includes both groups and their configurations; it says nothing about ordering, pagination, or what happens if the project has no configurations. With annotations carrying the behavioral burden, a 3 is appropriate.
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?
One sentence, zero filler, with the resource and scope front-loaded. Nothing could be removed without losing 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 low-complexity, single-required-parameter read tool with a full schema and no output schema, the description covers what is needed to call it correctly. The one modest gap is that it does not sketch the shape of the returned data (groups each containing configurations), which would help an agent plan the follow-up 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?
The schema has a single parameter with 100% description coverage ('The ID of the project'), so the schema does the heavy lifting. The description reinforces the project scoping but adds no syntax, format, or lookup guidance beyond it. Baseline 3 for a fully documented single-parameter 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 pair: 'Get all configuration groups and configurations for a project.' It also names the scope (project) and the system (TestRail), which cleanly separates it from metadata siblings like get_priorities, get_statuses, and get_templates. It stops short of explicitly distinguishing itself from any specific alternative, which keeps it at 4 rather than 5.
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?
There is no explicit when-to-use or when-not-to-use statement, but the purpose is transparent enough that usage is implied: call it when you need the configuration groups available in a project. Given the sibling set is a group of orthogonal read-only lookups, no routing guidance is strictly needed, so this is minimum-viable rather than deficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_labelsARead-onlyIdempotent
Get all available test case labels (sometimes called tags) for a project. Returns label IDs and titles that can be used when creating or updating test cases.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The ID of the project to retrieve labels for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds information annotations do not carry: what the call returns (label IDs and titles) and its project scope. It still omits pagination or empty-result behavior, so it is not 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?
Two short sentences with no filler, and the core purpose is front-loaded before the return-value detail. 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?
With no output schema, the description usefully compensates by describing the return payload (label IDs and titles). For a single-parameter read-only lookup this is essentially complete, though a note on ordering, pagination, or empty results would close the last gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single, well-documented project_id parameter, so the schema carries the burden. The description only echoes the project scoping ('for a project') and adds no format or edge-case detail beyond the schema, making the baseline 3 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 ('Get all available test case labels ... for a project') and disambiguates terminology by noting labels are 'sometimes called tags'. It does not distinguish itself from similar lookup siblings like get_case_fields, get_priorities, or get_statuses, so it stops short of a 5.
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?
Usage is implied rather than explicit: the description notes the returned IDs and titles 'can be used when creating or updating test cases', which hints at why an agent would call it. There is no statement of when-not to use it or which sibling would be more appropriate for related lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prioritiesARead-onlyIdempotent
Get all available test case priorities (e.g. Critical, High, Medium, Low). Returns priority IDs and names that can be used when creating or updating test cases.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds useful linkage context — that the output feeds mutating calls — but says nothing about result size, ordering, or the fact that it takes no arguments.
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?
Two sentences, zero waste: the first names the resource and gives examples, the second explains the value of the return. The most actionable information (what it returns and why) 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?
For a simple, no-argument, read-only lookup with no output schema, the description gives enough to invoke correctly and use the result. It stops short of describing the exact response shape (ID/name field names) or whether an empty list is possible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. It correctly implies a parameterless global lookup rather than a filtered query.
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 ('Get all available test case priorities') and even enumerates representative values (Critical, High, Medium, Low), so the agent immediately knows what comes back. It does not explicitly differentiate itself from similar lookup siblings like get_labels, get_statuses, or get_templates, though the parallel pattern makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: the returned priority IDs and names 'can be used when creating or updating test cases,' which tells the agent this is a prerequisite lookup for add_case/update_case. There are no explicit exclusions or named alternatives, keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resultsCRead-onlyIdempotent
Get results for a specific test in TestRail.
| Name | Required | Description | Default |
|---|---|---|---|
| test_id | Yes | The ID of the test |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered elsewhere. The description adds nothing beyond that — no pagination, filtering behavior, or note on what happens for a nonexistent test_id.
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 efficient sentence with no filler and the key scope ('specific test') front-loaded. It is appropriately sized, though thin enough that it borders on under-specification rather than true conciseness.
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, so the description could reasonably say what a 'result' contains (status, comment, timestamps), but it does not. With a single fully documented parameter and complete annotations, the definition is minimally viable but not complete.
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?
With only one parameter and 100% schema description coverage, the schema fully documents test_id, so the baseline is 3. The description contributes no extra meaning about the ID's origin or expected format.
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 ('Get') and resource ('results') scoped to 'a specific test in TestRail', which is clear enough to act on. However, it does not distinguish itself from siblings like get_tests, query_test, or get_cases, which an agent could plausibly confuse it with.
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 no when-to-use guidance, no prerequisites, and never names an alternative such as get_tests or add_results_for_cases. The agent must infer the selection context entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusesARead-onlyIdempotent
Get all available test statuses (e.g. Passed, Failed, Blocked). Returns status IDs and names that can be used with add_result and get_tests
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds genuinely useful context beyond that: the shape of the return (status IDs and names) and the fact that those IDs feed into add_result and get_tests.
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?
Two short sentences, front-loaded with the purpose followed by the return/usage note. No filler, hedging, or redundant restatement of the name.
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 zero-param, read-only lookup with no output schema, the description covers purpose, returned content, and downstream usage, which is sufficient to call it correctly. It stops short of noting whether the status list is static or project-configurable, a minor gap for this tool class.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; per the baseline this scores 4. The schema itself carries no additional semantics that need explanation.
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 ("Get all available test statuses") and makes the resource concrete with examples (Passed, Failed, Blocked). It doesn't explicitly contrast itself with the other lookup siblings (get_labels, get_priorities, get_templates), but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence implies usage by naming downstream consumers (add_result, get_tests), which tells the agent this is a prerequisite lookup step. There is no explicit when-to-use/when-not guidance or mention of alternatives, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templatesARead-onlyIdempotent
Get available test case templates for a project. Template IDs determine which fields are available when creating or updating test cases
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The ID of the project. Use query_project to find available projects |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the semantic role of template IDs, but says nothing about error behavior for an invalid project_id, permissions, or whether the list is paginated or filtered.
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?
Two sentences, zero filler, and the core purpose is front-loaded before the explanatory clause. Every part 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 simple, read-only, single-parameter lookup there is no output schema, so the description carries some burden for describing returns; it partially does so by explaining what template IDs mean. A brief note on what a template record contains would make it fully complete, 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?
With a single parameter and 100% schema description coverage (including the 'use query_project to find available projects' hint), the schema already carries parameter semantics. The description adds no further format or constraint detail beyond what the schema provides, 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?
The description gives a specific verb and resource ('Get available test case templates for a project') and clarifies the value of the result by tying template IDs to the fields available when creating/updating cases. That implicitly separates it from siblings like get_case_fields or get_configurations, though no sibling is named outright.
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 second sentence implies when an agent would care about templates (before creating or updating a test case), which is useful implied usage. However, there is no explicit when-to-use, no stated prerequisite beyond project_id, and no routing away from alternatives such as get_case_fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_testsARead-onlyIdempotent
Get tests for a test run, optionally filtered by status (Deprecated: use query_test with action 'many' instead)
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The ID of the test run | |
| status_id | No | Optional array of status IDs to filter by. Use get_statuses to retrieve available status IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds only the deprecation status; it does not describe return format, pagination, or any permission constraints, so added value beyond annotations is modest.
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 front-loaded sentence states the primary action, then the optional filter, with the deprecation note in a concise parenthetical. There is no filler or 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 simple read-only tool with fully documented parameters and annotations covering safety, the description plus schema is nearly complete. The only minor gap is that it does not hint at the return shape, though no output schema exists and deprecation reduces the need.
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 parameters are fully documented in the schema. The description mentions the optional status filter but adds no syntax, format, or behavioral detail beyond what the schema already 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?
States a specific verb ('Get') and resource ('tests') scoped to a test run, and names its replacement (query_test with action 'many'). It is clear, but the generic term 'tests' is not explicitly contrasted with siblings like get_cases or get_results, leaving some ambiguity about what entity is returned.
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 marks the tool as deprecated and names the alternative call to use instead (query_test with action 'many'). That is direct when-not and alternative guidance, which is exactly what an agent needs to avoid invoking it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usersARead-onlyIdempotent
Get active users from TestRail. Resolves active users globally or per-project. If global fetch is forbidden (for non-admin accounts), falls back to merging users across all active projects so users referenced as reviewers or assignees can be resolved.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Optional ID of the project to retrieve users for. If omitted, attempts to fetch all users globally. | |
| fallback_all_projects | No | If true and global user retrieval is forbidden (non-admin), automatically falls back to fetching users across all active projects. |
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 goes further by disclosing an authorization constraint (non-admin accounts cannot fetch globally) and the compensating behavior of merging users across all active projects. That is exactly the kind of permission-dependent behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then scope, then fallback rationale. Every sentence carries information, though the third sentence partially restates the second's fallback concept.
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 no-required-param read tool with full annotation coverage, the definition is nearly complete: it explains scope, permission limits, and fallback. It does not describe the shape or fields of the returned user objects, which is the main residual gap given there is no output 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 coverage is 100%, so the schema already documents both project_id and fallback_all_projects, including defaults. The description restates the global-vs-project choice and the fallback rationale but adds no format or syntax detail beyond the schema, making the baseline 3 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 (get active users) plus the scope it operates over (global or per-project). No sibling retrieves users, so it is trivially distinguishable, but the description does not explicitly contrast itself with any other tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use — resolving users referenced as reviewers or assignees — and explains the exact condition that triggers the fallback path (global fetch forbidden for non-admin accounts). It stops short of stating when not to use the tool or naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mutate_runA
Create a new test run or update an existing one in TestRail. Set payload.action to 'create' or 'update' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The mutation payload containing the action (create or update) and the corresponding run attributes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is covered. The description adds only that this is a create/update mutation; it omits update semantics (does an update replace or merge unspecified fields?) and any permission or side-effect notes.
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?
Two short sentences, front-loaded with the operation and followed by the discriminator hint. Nothing redundant or 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?
Annotations cover safety and the schema fully covers inputs, so the core is adequate. Still, for a non-idempotent mutation the description leaves the update behavior and the divergence in required fields between create and update unexplained, which an agent must infer from 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%, and the schema itself documents action consts, project_id, run_id, case_ids and name more precisely than the description. The description's single sentence about payload.action adds nothing beyond the structured oneOf discriminator, 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 (create/update) and resource (test run) and names the platform (TestRail). It clearly reads as the write counterpart to the sibling query_run, though it never explicitly contrasts itself with that sibling or with mutate_suite/mutate_section.
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 that payload.action must be 'create' or 'update', which is a real usage hint for selecting the mode. However, it gives no guidance on when to prefer this tool over query_run, no prerequisites, and no warning about the two actions having different required fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mutate_sectionA
Create a new section or update an existing section in TestRail. Set payload.action to 'create' or 'update' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The mutation payload containing the action (create or update) and the corresponding section attributes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is covered structurally. The description adds that a single tool handles both create and update, which is useful context, but it does not disclose side effects like hierarchy changes from parent_id or how updates treat omitted 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?
Two tight sentences with zero filler, and the core purpose is front-loaded ahead of the action-selection detail. Every sentence 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?
With a fully documented schema and no output schema to explain, the description is nearly sufficient. It could be slightly stronger by noting the read sibling or that suite_id is conditionally required, but for a discriminated-union mutation tool the essentials are present.
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 discriminated union already documents every field, including action constants, suite_id requirements, and parent_id. The description merely restates the action mechanism, adding no semantics beyond the schema, 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?
The description states a specific verb pair (create/update) and resource (section), and clearly frames this as the mutation counterpart to the read tools. It is unambiguous what the tool does, though it never names a sibling (e.g. query_section) to help an agent pick between reading and mutating.
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 how to select the operation via payload.action ('create' or 'update'), which is genuine usage mechanics. However, it gives no when-to-use conditions, prerequisites (e.g. needing a suite_id for multi-suite projects), or alternatives to consider instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mutate_suiteB
Create a new test suite or update an existing one in TestRail. Set payload.action to 'create' or 'update' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The mutation payload containing the action (create or update) and the corresponding suite attributes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and non-idempotent, so the description's mutation framing adds little. It discloses nothing about permissions, whether update overwrites unspecified fields, error behavior, or side effects — all relevant for a non-idempotent write tool. No contradiction with annotations (create/update is not destructive).
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?
Two short sentences, front-loaded with the purpose and followed by the mode selector. No filler; both sentences earn their 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?
Adequate for a simple one-parameter mutation with no output schema, but it omits what an update actually changes and whether omitted fields are preserved — the main behavioral question an agent would have. Nothing about auth or failure modes either.
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 single payload parameter is fully documented with per-variant required fields, so the schema does the heavy lifting. The description only restates the action values already encoded as const in the schema, adding no extra semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resource ("Create a new test suite or update an existing one in TestRail") and names the discriminator between the two modes. It does not explicitly contrast with the read-only sibling query_suite, but the mutation intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent how to select the operation via payload.action='create'|'update', which is useful routing information. It gives no when-to-use vs when-not-to-use guidance (e.g., prefer query_suite to read, or which sibling to use for sections/runs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_attachmentARead-onlyIdempotent
Download a single attachment or list all attachments for a test case or test run in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds only the two operating modes, which the schema already describes; it does not mention that the 'one' mode writes to the local filesystem or any permission/size constraints. Modest added context, hence a 3.
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?
Two tight sentences, front-loaded with the operation and followed by the mode selector. No wasted clauses, though the second sentence largely duplicates what the schema's const enums already convey.
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 adequately signals the two outcomes (downloaded file vs. attachment list) and the mode discriminator. Annotations cover the safety profile. It stops short of noting where downloads land or what the list contains, but nothing essential to calling 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 action, attachment_id, entity_type, entity_id and output_file in detail. The description only restates the action discriminator values that the schema already fixates as consts, adding no format or semantics beyond it. 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?
The description states specific verbs and resource: 'Download a single attachment or list all attachments for a test case or test run in TestRail.' This cleanly contrasts with the sibling add_attachment, though it never names or explicitly excludes it. An agent can identify the operation 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?
It explains how to select the operation ('set payload.action to one or many') but gives no guidance on when to prefer one mode over the other, nor any exclusions relative to siblings like add_attachment. Usage is implied by the enum values rather than stated as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_projectARead-onlyIdempotent
Retrieve a single project or all projects in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that – no mention of pagination, result ordering, or filtering behavior for the 'many' case – so it does not enrich the structured context.
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?
Two short sentences, front-loaded with what is retrieved and then the operation selector. No filler and 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 read-only, single-parameter query tool whose annotations cover safety and whose schema fully documents the payload, the description is essentially sufficient. Minor gap: with no output schema, it does not hint at what a project record contains, but this is not strictly required 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%: the payload oneOf branches document 'one' (with project_id) and 'many' in full detail. The description restates the action values already enumerated in the schema and adds no new meaning, which fits 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?
The description states a specific verb ('Retrieve') and resource ('project'), and clarifies the two scopes: a single project or all projects. It clearly separates query_project from resource-differentiating siblings like query_suite, query_run, and query_test without needing 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?
It tells the agent how to select the operation ('Set payload.action to one or many') but gives no guidance on when to use each mode, no prerequisites, and no reference to alternative tools. Usage is implied rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_runARead-onlyIdempotent
Retrieve a single test run or all test runs for a project in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safe read-only profile is covered. The description adds the operation-mode distinction, but says nothing about pagination, return volume for 'many', authentication needs, or what happens when a run is not found.
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?
Two sentences, front-loaded with the retrieval purpose and followed immediately by the operation selector. There is no redundant or wasted language.
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 simple read-only retrieval tool with a richly described schema and complete annotations, the description is nearly sufficient. It omits no critical call-time requirement, though it could note the list-return behavior for 'many', which is the only minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the nested schema documents action, run_id, project_id, suite_id, and is_completed in detail. The description merely restates that action should be 'one' or 'many', adding no meaning beyond the structured parameters, 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?
The description states a specific verb and resource: retrieve test run(s) in TestRail. It also distinguishes the two supported scopes, single run versus all runs for a project, so an agent can quickly identify what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to select the operation via payload.action ('one' or 'many'), which is useful in-tool usage guidance. However, it does not state when to use this tool versus siblings like query_test, get_results, or mutate_run, so alternative selection 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.
query_sectionBRead-onlyIdempotent
Retrieve a single section or all sections for a project in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is fully covered elsewhere. The description adds no behavioral context beyond that—no mention of nested-tree return, large-result handling, or filtering behavior—so it earns little credit here.
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?
Two short, front-loaded sentences with no filler. The second sentence is marginally redundant with the schema's const values, but it keeps the definition compact.
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 read tool with complete annotations, 100% schema coverage and no output schema, the description plus schema give an agent everything needed to invoke it correctly. Sibling routing remains the only real gap, and that is minor for a straightforward query operation.
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 nested oneOf documents action, IDs, include_child, output_file, and name_pattern in detail. The description's restatement of 'one'/'many' duplicates the schema's const entries rather than extending them, 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 (Retrieve) and resource (section) and covers both modes of operation. It does not explicitly differentiate itself from mutate_section or the other query_* siblings, but the read-only intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence only explains how to encode the operation via payload.action; it never says when to choose this tool over a sibling such as mutate_section or how it relates to query_project/query_suite. Any prerequisites ('use query_suite/query_project to find IDs') live in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_suiteBRead-onlyIdempotent
Retrieve a single test suite or all test suites for a project in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds nothing beyond the schema-mandated action switch — no pagination, auth, or result-shape context.
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?
Two sentences, zero waste, with the core purpose front-loaded before the parameter hint. Nothing is padded or repeated.
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 simple read-only retrieval tool with 100% schema coverage and annotations carrying the safety profile, the description is largely sufficient. The only gap is the absence of an output schema paired with no mention of what the retrieval returns.
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%, including per-branch docs for action, suite_id and project_id, so the schema does the heavy lifting. The description restates the 'one'/'many' mechanism without adding syntax 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 ('Retrieve') and resource ('test suite'/'test suites') in TestRail, and explicitly covers both the single and list modes. It distinguishes itself from 'mutate_suite' implicitly via the read verb, but never names an alternative sibling, so it stops short of a 5.
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 ties each mode to a need (one suite vs. all suites for a project), which is implied guidance. However it never states when to prefer this tool over siblings like mutate_suite or query_project, and offers no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_testBRead-onlyIdempotent
Retrieve a single test by ID or all tests for a test run in TestRail. Set payload.action to 'one' or 'many' to specify the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | The payload containing the action ('one' or 'many') and corresponding parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed world, so safety is fully covered elsewhere. The description adds only the action-based dispatch model, which the schema already encodes via const values, and says nothing about pagination or result size handling.
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?
Two tight sentences with the operation description front-loaded and no filler. It is efficient, though it spends its second sentence on a fact the schema already states, leaving little room for genuinely additive 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 read-only query tool with 100% schema coverage and complete annotations, the description is serviceable but thin: it omits the status filtering, field selection, and large-dataset output_file escape hatch that the schema exposes, and leaves the get_tests overlap unresolved.
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 (test_id, run_id, fields, status_id, output_file) is already documented with examples in the schema. The description only restates the action toggle, adding no meaning beyond structured fields; 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?
The description gives a specific verb and resource ('Retrieve a single test by ID or all tests for a test run in TestRail') and names the exact dispatching field. It is clear on its own, but it never differentiates itself from the sibling get_tests, which plausibly covers the same ground.
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 explains how to select the operation ('Set payload.action to one or many'), which is invocation mechanics rather than when-to-use guidance. It offers no exclusions, prerequisites, or comparison to alternative tools like get_tests or get_results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_case_fieldARead-onlyIdempotent
Resolve numeric reference IDs of a Multi-select case field (type ID 12) into their textual values for a specific project.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | Yes | A single numeric ID or array of numeric IDs/references (e.g. [1, 55, 6] or 55) to resolve | |
| field_name | Yes | The system name of the Multi-select field (e.g. 'custom_case_feature_tags') | |
| project_id | Yes | The ID of the project to resolve field values for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description adds useful domain context (this is a lookup/normalization operation on type-12 fields), but says nothing about behavior on unknown/invalid refs, missing fields, or unmapped values.
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 front-loaded sentence with no filler. The verb, the input (numeric ref IDs), the constraint (type ID 12), the output (textual values) and the scope (specific project) are all delivered without 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 simple three-parameter lookup with no output schema, the description states the essential contract: numeric refs in, textual values out. What is missing is return shape detail (single value vs. mapping when an array is passed) and error behavior, which matters slightly given no output schema exists.
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 refs, field_name and project_id are all documented in the schema with examples. The description only echoes the project scoping and the fact that refs are numeric IDs, adding no syntax or format detail beyond the schema; 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?
The description gives a specific verb (Resolve), a precise resource (numeric reference IDs of a Multi-select case field), and the transformation performed (into textual values). It even pins the field type (type ID 12) and project scope, so an agent can distinguish it from generic field-listing siblings like get_case_fields.
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?
Usage is implied rather than stated: an agent can infer it is needed when it holds numeric ref IDs and needs their labels. However, no when-not-to-use is given and no alternative is named (e.g., that get_case_fields returns definitions rather than resolved values), so the routing 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.
update_caseA
Update a test case in TestRail. The update operation requires knowing valid field names that are returned by get_case_fields tool. Supports partial updates — only specify the fields you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | A flat key-value map of case fields. The server merges all entries directly into the root of the TestRail API request body — there is no nested "fields" key in the API call. Must use system_name values from get_case_fields. Example: {"priority_id": 2, "template_id": 1, "labels": [1, 2]} Call get_case_fields with project_id first if field names are not already known. Using an unknown field name (e.g. 'label_ids') will result in an error. | |
| case_id | Yes | The ID of the test case to update (e.g. '123' or 'C123') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower. The description still adds real behavior: the operation is a partial merge, and unknown field names are rejected because names must come from get_case_fields. Consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, zero filler, and the core action is front-loaded before the prerequisite and the partial-update caveat. Every sentence 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 a two-parameter mutation with no output schema, the description covers the prerequisite tool, the partial-update contract, and the field-name constraint. Return behavior after the update is unaddressed, but that is a minor gap given the schema's richness.
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%, including a detailed note on how 'fields' is merged into the request body. The description restates the partial-update rule but adds no syntax or format detail beyond the schema, 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 and resource ('Update a test case in TestRail') with a clear scope qualifier ('partial updates'). It does not distinguish itself from the sibling update_cases (plural), so an agent must infer which one to pick from the singular/plural naming alone.
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 and routes the agent to the right helper: valid field names come from get_case_fields, and 'only specify the fields you want to change' tells the agent how to call it. No guidance on when to prefer this over update_cases, and no stated exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_casesA
Bulk update multiple test cases with the same field values. The update operation requires knowing valid field names that are returned by get_case_fields tool. More efficient than calling update_case multiple times.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | A flat key-value map of case fields. The server merges all entries directly into the root of the TestRail API request body — there is no nested "fields" key in the API call. Must use system_name values from get_case_fields. Example: {"priority_id": 2, "template_id": 1, "labels": [1, 2]} Call get_case_fields with project_id first if field names are not already known. Using an unknown field name (e.g. 'label_ids') will result in an error. | |
| case_ids | Yes | Array of case IDs to update (e.g. [123, 456, 789]) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is largely covered structurally. The description adds the prerequisite lookup step, but much of that same detail (system_name requirement, merge-into-root behavior, error on unknown field names) is duplicated in the schema rather than delivering new behavioral context. It never addresses what happens to fields not included in the update or whether a partial failure leaves cases half-updated.
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 and scope, then prerequisite, then efficiency rationale. Each sentence earns its place, though the get_case_fields prerequisite is repeated verbatim in the schema's field description.
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 bulk mutation with full schema coverage and annotation coverage, the description supplies the operational context an agent needs: valid field names come from get_case_fields and bulk is preferred over repeated single updates. The remaining gap is batch semantics (all-or-nothing vs partial success), which no output schema exists to cover.
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 nested 'fields' object is thoroughly documented with examples, valid-name rules, and API merge semantics. The description adds no parameter-level information beyond what the schema already states, 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 and resource ('Bulk update multiple test cases') plus the key constraint that all cases receive the same field values. It also explicitly names the sibling it supersedes ('update_case'), so an agent can route between them 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 a clear alternative ('More efficient than calling update_case multiple times') and a hard prerequisite ('requires knowing valid field names that are returned by get_case_fields'). It stops short of explicit when-not guidance, e.g. whether single-case edits should still use update_case, but the selection context is easy to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v3.2.0- Added
query_test
1 tool update
v3.1.0- Changed
get_cases1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Additional fields to include in response beyond id, title, and suite_id. Use get_case_fields to see available fields. Example: [\"priority_id\", \"type_id\", \"custom_automation_status\"]"New value: +"Additional fields to include in response beyond id, title, and suite_id (supports system fields such as updated_on, created_on, created_by, updated_by, as well as custom fields). Example: [\"updated_on\", \"priority_id\", \"custom_automation_status\"]"
6 tool updates
v3.0.0- Removed
add_attachment_to_run - Changed
add_case1 field changed- changed
Input schema / properties / section_id / descriptionPrevious value: -"The ID of the section where the case should be created. Use get_sections to find available sections"New value: +"The ID of the section where the case should be created. Use query_section (action: \"many\") to find available sections"
- Changed
get_cases3 fields changed- changed
Input schema / properties / project_id / descriptionPrevious value: -"The ID of the project. Use get_projects to find available projects"New value: +"The ID of the project. Use query_project to find available projects" - changed
Input schema / properties / section / descriptionPrevious value: -"Section filter configuration. Use get_sections to find available sections"New value: +"Section filter configuration. Use query_section to find available sections" - changed
Input schema / properties / suite_id / descriptionPrevious value: -"The ID of the test suite (required for multi-suite projects, i.e. suite_mode=3). Use get_suites to find available suites"New value: +"The ID of the test suite (required for multi-suite projects, i.e. suite_mode=3). Use query_suite to find available suites"
- Removed
get_sections - Changed
get_templates1 field changed- changed
Input schema / properties / project_id / descriptionPrevious value: -"The ID of the project. Use get_projects to find available projects"New value: +"The ID of the project. Use query_project to find available projects"
- Changed
mutate_section1 field changed- changed
Input schema / properties / payload / oneOfPrevious value: -[ - { - "properties": { - "action": { - "const": "create", - "description": "The operation to perform: create a new section", - "type": "string" - }, - "description": { - "description": "The description of the section", - "type": "string" - }, - "name": { - "description": "The name of the section", - "type": "string" - }, - "parent_id": { - "description": "The ID of the parent section (to build section hierarchies)", - "type": "number" - }, - "project_id": { - "description": "The ID of the project the section should be added to", - "type": "number" - }, - "suite_id": { - "description": "The ID of the test suite (required for multi-suite projects, i.e. suite_mode=2 or 3). Use get_suites to find available suites", - "type": "number" - } - }, - "required": [ - "name", - "action", - "project_id" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "update", - "description": "The operation to perform: update an existing section", - "type": "string" - }, - "description": { - "description": "The description of the section", - "type": "string" - }, - "name": { - "description": "The name of the section", - "type": "string" - }, - "section_id": { - "description": "The ID of the section to update", - "type": "number" - } - }, - "required": [ - "action", - "section_id" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "action": { + "const": "create", + "description": "The operation to perform: create a new section", + "type": "string" + }, + "description": { + "description": "The description of the section", + "type": "string" + }, + "name": { + "description": "The name of the section", + "type": "string" + }, + "parent_id": { + "description": "The ID of the parent section (to build section hierarchies)", + "type": "number" + }, + "project_id": { + "description": "The ID of the project the section should be added to", + "type": "number" + }, + "suite_id": { + "description": "The ID of the test suite (required for multi-suite projects, i.e. suite_mode=2 or 3). Use query_suite to find available suites", + "type": "number" + } + }, + "required": [ + "name", + "action", + "project_id" + ], + "type": "object" + }, + { + "properties": { + "action": { + "const": "update", + "description": "The operation to perform: update an existing section", + "type": "string" + }, + "description": { + "description": "The description of the section", + "type": "string" + }, + "name": { + "description": "The name of the section", + "type": "string" + }, + "section_id": { + "description": "The ID of the section to update", + "type": "number" + } + }, + "required": [ + "action", + "section_id" + ], + "type": "object" + } +]
1 tool update
v2.10.0- Changed
add_attachment3 fields changed- changed
Input schema / properties / entity_id / descriptionPrevious value: -"The ID of the entity to attach the file to (e.g. 123 or 'C123' for cases, or numeric run ID)"New value: +"The ID of the entity to attach the file to (e.g. 123 or 'C123' for cases, or numeric run / result ID)" - changed
Input schema / properties / entity_type / descriptionPrevious value: -"The type of entity to attach the file to ('case' or 'run')"New value: +"The type of entity to attach the file to ('case', 'run', or 'result')" - changed
Input schema / properties / entity_type / enumPrevious value: -[ - "case", - "run" -]New value: +[ + "case", + "run", + "result" +]
3 tool updates
v2.9.0- Changed
add_attachment2 fields changed- removed
Input schema / properties / entity_id / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / entity_id / typeAdded value: +[ + "number", + "string" +]
- Changed
query_attachment1 field changed- changed
Input schema / properties / payload / oneOfPrevious value: -[ - { - "properties": { - "action": { - "const": "one", - "description": "Download a single attachment by ID and save to local filesystem", - "type": "string" - }, - "attachment_id": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "description": "The ID of the attachment to download (numeric ID or UUID)" - }, - "output_file": { - "description": "Absolute local file path where the downloaded attachment will be saved", - "type": "string" - } - }, - "required": [ - "action", - "attachment_id", - "output_file" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "many", - "description": "Retrieve attachment metadata for a test case or test run", - "type": "string" - }, - "entity_id": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "description": "The ID of the entity (e.g. 123 or 'C123' for cases, or numeric run ID)" - }, - "entity_type": { - "description": "The type of entity to get attachments for ('case' or 'run')", - "enum": [ - "case", - "run" - ], - "type": "string" - }, - "output_file": { - "description": "Optional absolute file path to export large metadata JSON responses", - "type": "string" - } - }, - "required": [ - "action", - "entity_type", - "entity_id" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "action": { + "const": "one", + "description": "Download a single attachment by ID and save to local filesystem", + "type": "string" + }, + "attachment_id": { + "description": "The ID of the attachment to download (numeric ID or UUID)", + "type": [ + "number", + "string" + ] + }, + "output_file": { + "description": "Absolute local file path where the downloaded attachment will be saved", + "type": "string" + } + }, + "required": [ + "action", + "attachment_id", + "output_file" + ], + "type": "object" + }, + { + "properties": { + "action": { + "const": "many", + "description": "Retrieve attachment metadata for a test case or test run", + "type": "string" + }, + "entity_id": { + "description": "The ID of the entity (e.g. 123 or 'C123' for cases, or numeric run ID)", + "type": [ + "number", + "string" + ] + }, + "entity_type": { + "description": "The type of entity to get attachments for ('case' or 'run')", + "enum": [ + "case", + "run" + ], + "type": "string" + }, + "output_file": { + "description": "Optional absolute file path to export large metadata JSON responses", + "type": "string" + } + }, + "required": [ + "action", + "entity_type", + "entity_id" + ], + "type": "object" + } +]
- Added
query_section
1 tool update
v2.5.0- Added
resolve_case_field
2 tool updates
v2.3.0- Added
add_attachment - Added
query_attachment
23 tool updates
v2.2.0- Added
add_attachment_to_run - Added
add_case - Added
add_results - Added
add_results_for_cases - Added
get_case - Added
get_case_fields - Added
get_cases - Added
get_configurations - Added
get_labels - Added
get_priorities - Added
get_results - Added
get_sections - Added
get_statuses - Added
get_templates - Added
get_tests - Added
get_users - Added
mutate_run - Changed
mutate_section1 field changed- changed
Input schema / properties / payload / oneOfPrevious value: -[ - { - "properties": { - "action": { - "const": "create", - "description": "The operation to perform: create a new section", - "type": "string" - }, - "description": { - "description": "The description of the section", - "type": "string" - }, - "name": { - "description": "The name of the section", - "type": "string" - }, - "parent_id": { - "description": "The ID of the parent section (to build section hierarchies)", - "type": "number" - }, - "project_id": { - "description": "The ID of the project the section should be added to", - "type": "number" - } - }, - "required": [ - "name", - "action", - "project_id" - ], - "type": "object" - }, - { - "properties": { - "action": { - "const": "update", - "description": "The operation to perform: update an existing section", - "type": "string" - }, - "description": { - "description": "The description of the section", - "type": "string" - }, - "name": { - "description": "The name of the section", - "type": "string" - }, - "section_id": { - "description": "The ID of the section to update", - "type": "number" - } - }, - "required": [ - "action", - "section_id" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "action": { + "const": "create", + "description": "The operation to perform: create a new section", + "type": "string" + }, + "description": { + "description": "The description of the section", + "type": "string" + }, + "name": { + "description": "The name of the section", + "type": "string" + }, + "parent_id": { + "description": "The ID of the parent section (to build section hierarchies)", + "type": "number" + }, + "project_id": { + "description": "The ID of the project the section should be added to", + "type": "number" + }, + "suite_id": { + "description": "The ID of the test suite (required for multi-suite projects, i.e. suite_mode=2 or 3). Use get_suites to find available suites", + "type": "number" + } + }, + "required": [ + "name", + "action", + "project_id" + ], + "type": "object" + }, + { + "properties": { + "action": { + "const": "update", + "description": "The operation to perform: update an existing section", + "type": "string" + }, + "description": { + "description": "The description of the section", + "type": "string" + }, + "name": { + "description": "The name of the section", + "type": "string" + }, + "section_id": { + "description": "The ID of the section to update", + "type": "number" + } + }, + "required": [ + "action", + "section_id" + ], + "type": "object" + } +]
- Added
mutate_suite - Added
query_project - Added
query_suite - Added
update_case - Added
update_cases
22 tool updates
v2.1.0- Removed
add_attachment_to_run - Removed
add_case - Removed
add_results - Removed
add_results_for_cases - Removed
get_case - Removed
get_case_fields - Removed
get_cases - Removed
get_configurations - Removed
get_labels - Removed
get_priorities - Removed
get_results - Removed
get_sections - Removed
get_statuses - Removed
get_templates - Removed
get_tests - Removed
get_users - Removed
mutate_run - Removed
mutate_suite - Removed
query_project - Removed
query_suite - Removed
update_case - Removed
update_cases
24 tool updates
v2.0.0- Added
add_attachment_to_run - Added
add_case - Added
add_results - Added
add_results_for_cases - Added
get_case - Added
get_case_fields - Added
get_cases - Added
get_configurations - Added
get_labels - Added
get_priorities - Added
get_results - Added
get_sections - Added
get_statuses - Added
get_templates - Added
get_tests - Added
get_users - Added
mutate_run - Added
mutate_section - Added
mutate_suite - Added
query_project - Added
query_run - Added
query_suite - Added
update_case - Added
update_cases
17 tool updates
v1.9.2- Removed
add_attachment_to_run - Removed
add_case - Removed
add_results - Removed
add_results_for_cases - Removed
add_run - Removed
get_case - Removed
get_case_fields - Removed
get_cases - Removed
get_labels - Removed
get_priorities - Removed
get_projects - Removed
get_sections - Removed
get_statuses - Removed
get_templates - Removed
get_tests - Removed
update_case - Removed
update_cases
2 tool updates
- Changed
get_cases1 field changed- added
Input schema / properties / output_fileAdded value: +{ + "description": "Absolute file path to save the JSON response to. Use this for large datasets to avoid blowing up context limits.", + "type": "string" +}
- Changed
get_sections1 field changed- added
Input schema / properties / output_fileAdded value: +{ + "description": "Absolute file path to save the JSON response to. Use this for large datasets to avoid blowing up context limits.", + "type": "string" +}
17 tool updates
v1.9.0- First observed
add_attachment_to_run - First observed
add_case - First observed
add_results - First observed
add_results_for_cases - First observed
add_run - First observed
get_case - First observed
get_case_fields - First observed
get_cases - First observed
get_labels - First observed
get_priorities - First observed
get_projects - First observed
get_sections - First observed
get_statuses - First observed
get_templates - First observed
get_tests - First observed
update_case - First observed
update_cases
TDQS
Scored across 27 tools
Most tools target clearly distinct resources and actions (e.g., get_case vs get_cases, query_suite vs mutate_suite), and descriptions help resolve overlaps. However, the results tools (get_results, add_results, add_results_for_cases) and the deprecated get_tests vs query_test create some ambiguity that could lead to misselection.
All tool names are snake_case with a verb_noun structure, which is largely predictable. Still, retrieval uses both get_ and query_, while writes use add_, update_, and mutate_ across similar resources, making the convention slightly inconsistent rather than uniform.
27 tools is on the heavy side for an MCP server, though TestRail's broad domain (projects, suites, sections, cases, runs, tests, results, attachments, metadata) justifies many of them. Redundant entries like get_tests and two result-add variants keep the count from feeling fully earned.
Core read/create/update workflows for cases, suites, sections, runs, results, and attachments are present, so common test management tasks are covered. However, delete operations are entirely absent, and project, milestone, and plan management are not represented, leaving notable lifecycle gaps.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Run, debug, and triage tests from your IDE using natural language, no dashboard switching, no manual data transfers. The TestMu AI (formerly LambdaTest) MCP Server is a single remote server exposing four tool suites: HyperExecute — analyze your project, generate YAML configs and test runner commands, then monitor jobs and sessions. Automation — pull a TestID's details plus command, network, and console logs into one chat for instant root-cause analysis. Includes mobile app upload. SmartUI — explain pixel, layout, DOM, and perceptual changes in a visual regression run, with context-aware React/HTML/CSS fixes. Accessibility — audit any public URL or a local React app against WCAG and get ready-to-apply remediation steps. Connects over https://mcp.lambdatest.com/mcp using OAuth 2.1 — no API keys in your config. One-click install in Cursor; works with Claude, GitHub Copilot, Cline, and any MCP client. Tests execute on the TestMu AI cloud: 3,000+ browsers and 10,000+ real devices.
Official MCP server for Qase — manage test cases, runs, suites, defects via AI tools.
AI-native mock API server with MCP. Create REST/SOAP mocks from Claude, Cursor, or Windsurf.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that allows interaction with TestRail's core entities (projects, cases, runs, results, datasets) through a standardized protocol compatible with MCP clients like Claude Desktop.2320MIT
- FlicenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that provides integration with TestRail, allowing AI assistants to interact with TestRail projects, test cases, test runs, and results.150 npm1-
- AlicenseNot gradedqualityDmaintenanceMCP server for TestRail that enables AI assistants to interact with TestRail's test management platform. It can query and manage projects, test cases, runs, results, plans, milestones, and more.MIT
- AlicenseCqualityCmaintenanceMCP server for TestRail API, providing AI assistants with 107 tools to manage test cases, runs, results, plans, and more. Supports API key, password, and SSO cookie authentication.5413 npm2MIT