Skip to main content
Glama

Testiny Test Management

Edit an existing test case

editTestCase
Destructive

Partially updates an existing test case. Only the fields provided are changed; omitted fields are left as-is. STEPS content: 'steps' can be individually replaced or deleted by 0-based index, and new steps appended. TEXT content: set 'text.stepsText' / 'text.expectedResultText' (empty string clears, omit keeps). BDD content: set 'bddScenarios' to gherkin source (empty string clears, omit keeps). The 'template' field switches which content is displayed; every template's content is preserved. Content must belong to the displayed template: writing 'steps' to a TEXT/BDD case (or vice versa) is rejected with status "content_does_not_match_template" and nothing is written - pass 'template' in the same call to switch first. Pass the '_etag' from the last read to have the edit rejected instead of overwriting a change somebody else made in the meantime.

Input Schema

NameRequiredDescriptionDefault
textNoUpdates for the TEXT-template content. A test case normally uses EITHER the STEPS 'steps' array OR this TEXT content; 'template' selects which is shown. Omitted fields are kept.
_etagNoOptional conflict tag from the last read or edit of this entity, for a safe read-modify-write: the edit is only applied while nobody else has changed the entity since. Pass it back verbatim, including an empty string. On a mismatch nothing is written and the call answers with status "update_conflict" and the current '_etag' to re-read from. Omit it to overwrite whatever is stored.
stepsNoPartial updates for the STEPS-template steps, at most 48000 characters in all cells together. Every index refers to the original step list and is unaffected by deletions in the same call. Steps with delete=true are removed; others replace or append at that index. Only apply necessary updates.
titleNoNew title for the test case. Omit to keep the existing title.
formatNoFormat for rich-text fields (descriptions, preconditions, comments, step & result cells, stepsText & expectedResultText) on both input and output: 'markdown' (default) or 'xml'. Read the matching rich-text format reference resource before producing either. Use 'xml' for BOTH the read and the write whenever you are changing a field that already has content: markdown cannot carry an underline or a text color, so an edit written as markdown writes those away. 'markdown' is for writing new content and for reading you will not edit.
projectYesProject ID (number or string), project key or part of the project name
templateNoSwitch which content template is displayed: "STEPS", "TEXT" or "BDD". Omit to keep the current one. Switching deletes no content - the other templates keep theirs, and switching back shows it again. A case switched back to STEPS gets its old steps back, and 'steps' indices refer to those although no read showed them while another template was displayed: switch first, re-read, then edit the steps. Content fields in this call are checked against the template set here (or the current one when omitted), so set it in the same call to write another template's content.
testCaseIdYesThe id of the test case to edit
bddScenariosNoNew BDD-template content. Omit to keep it, pass an empty string to clear it. Gherkin source for the BDD template - feature/scenario lines as plain text, exactly as a .feature file would carry them. Always plain gherkin regardless of 'format', and it is not parsed or validated, so malformed gherkin is stored as sent. A top-level `Feature:` line is optional - scenarios on their own are fine. A `# language:` directive is honored; otherwise the dialect is detected from the keywords.
customFieldsNoCustom field values to update, keyed by the 'propName' that listProjects reports - custom fields carry a 'cf__' prefix, built-in ones do not (a bare name or a single-underscore 'cf_' prefix is accepted too, but a key that is itself a propName always means that field). Only provided fields are changed.
preconditionNoNew precondition text - rich text in the chosen 'format'. Pass an empty string to clear it. Omit to keep the existing precondition.

Output Schema

NameRequiredDescriptionDefault
_etagNoConflict tag of the entity - pass it to an edit tool's '_etag' to have that edit rejected if somebody changed the entity in the meantime. Empty for an entity that carries no tag yet.
statusYes
testCaseIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / steps / description
      Previous value: -"Partial updates for the STEPS-template steps. Every index refers to the original step list and is unaffected by deletions in the same call. Steps with delete=true are removed; others replace or append at that index. Only apply necessary updates."New value: +"Partial updates for the STEPS-template steps, at most 48000 characters in all cells together. Every index refers to the original step list and is unaffected by deletions in the same call. Steps with delete=true are removed; others replace or append at that index. Only apply necessary updates."
  2. Changed15 schema fields changed
    • addedInput schema / properties / _etag
      Added value: +{
      +  "description": "Optional conflict tag from the last read or edit of this entity, for a safe read-modify-write: the edit is only applied while nobody else has changed the entity since. Pass it back verbatim, including an empty string. On a mismatch nothing is written and the call answers with status \"update_conflict\" and the current '_etag' to re-read from. Omit it to overwrite whatever is stored.",
      +  "maxLength": 32,
      +  "type": "string"
      +}
    • addedInput schema / properties / bddScenarios
      Added value: +{
      +  "description": "New BDD-template content. Omit to keep it, pass an empty string to clear it. Gherkin source for the BDD template - feature/scenario lines as plain text, exactly as a .feature file would carry them. Always plain gherkin regardless of 'format', and it is not parsed or validated, so malformed gherkin is stored as sent. A top-level `Feature:` line is optional - scenarios on their own are fine. A `# language:` directive is honored; otherwise the dialect is detected from the keywords.",
      +  "maxLength": 32000,
      +  "type": "string"
      +}
    • addedInput schema / properties / customFields / description
      Added value: +"Custom field values to update, keyed by the 'propName' that listProjects reports - custom fields carry a 'cf__' prefix, built-in ones do not (a bare name or a single-underscore 'cf_' prefix is accepted too, but a key that is itself a propName always means that field). Only provided fields are changed."
    • addedInput schema / properties / format
      Added value: +{
      +  "description": "Format for rich-text fields (descriptions, preconditions, comments, step & result cells, stepsText & expectedResultText) on both input and output: 'markdown' (default) or 'xml'. Read the matching rich-text format reference resource before producing either. Use 'xml' for BOTH the read and the write whenever you are changing a field that already has content: markdown cannot carry an underline or a text color, so an edit written as markdown writes those away. 'markdown' is for writing new content and for reading you will not edit.",
      +  "enum": [
      +    "markdown",
      +    "xml"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / precondition / description
      Previous value: -"New precondition text - can include simple markdown. Pass an empty string to clear it. Omit to keep the existing precondition."New value: +"New precondition text - rich text in the chosen 'format'. Pass an empty string to clear it. Omit to keep the existing precondition."
    • changedInput schema / properties / precondition / maxLength
      Previous value: -8000New value: +16000
    • changedInput schema / properties / steps / description
      Previous value: -"Custom field values to update. Only provided fields are changed; omit a field to leave it unchanged."New value: +"Partial updates for the STEPS-template steps. Every index refers to the original step list and is unaffected by deletions in the same call. Steps with delete=true are removed; others replace or append at that index. Only apply necessary updates."
    • changedInput schema / properties / steps / items / properties / expectedResult / description
      Previous value: -"New expected result for the step. Omit to keep the existing expected result."New value: +"New expected result for the step. Omit to keep the existing expected result. Empty string *deletes* current content."
    • changedInput schema / properties / steps / items / properties / expectedResult / maxLength
      Previous value: -8000New value: +16000
    • changedInput schema / properties / steps / items / properties / index / description
      Previous value: -"0-based index of the step in the original step list. Use a value >= current step count to append a new step."New value: +"0-based index into the step list as it stood before this call. Use a value >= the original step count to append a new step; an appended cell that is omitted is stored empty."
    • changedInput schema / properties / steps / items / properties / step / description
      Previous value: -"New content for the step action. Omit to keep the existing step content."New value: +"New content for the step action. Omit to keep the existing step content. Empty string *deletes* current content."
    • changedInput schema / properties / steps / items / properties / step / maxLength
      Previous value: -8000New value: +16000
    • addedInput schema / properties / template
      Added value: +{
      +  "description": "Switch which content template is displayed: \"STEPS\", \"TEXT\" or \"BDD\". Omit to keep the current one. Switching deletes no content - the other templates keep theirs, and switching back shows it again. A case switched back to STEPS gets its old steps back, and 'steps' indices refer to those although no read showed them while another template was displayed: switch first, re-read, then edit the steps. Content fields in this call are checked against the template set here (or the current one when omitted), so set it in the same call to write another template's content.",
      +  "enum": [
      +    "TEXT",
      +    "STEPS",
      +    "BDD"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / text
      Added value: +{
      +  "description": "Updates for the TEXT-template content. A test case normally uses EITHER the STEPS 'steps' array OR this TEXT content; 'template' selects which is shown. Omitted fields are kept.",
      +  "properties": {
      +    "expectedResultText": {
      +      "description": "New TEXT-template expected-result document - one free-form rich-text document. Omit to keep it, pass an empty string to clear it.",
      +      "maxLength": 32000,
      +      "type": "string"
      +    },
      +    "stepsText": {
      +      "description": "New TEXT-template steps/actions document - one free-form rich-text document, unrelated to the top-level 'steps' array. Omit to keep it, pass an empty string to clear it.",
      +      "maxLength": 32000,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / _etag
      Added value: +{
      +  "description": "Conflict tag of the entity - pass it to an edit tool's '_etag' to have that edit rejected if somebody changed the entity in the meantime. Empty for an entity that carries no tag yet.",
      +  "type": "string"
      +}
  3. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the exact rejection status 'content_does_not_match_template' with the guarantee that nothing is written, the 'update_conflict' etag outcome, and that template switching preserves all templates' content. That is real failure-mode and side-effect disclosure the destructiveHint/idempotentHint flags cannot convey.

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

Conciseness4/5

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

Front-loads the partial-update contract, then organizes the rest by content type (STEPS / TEXT / BDD) before the template and etag rules - a sensible order for a complex tool. It is dense but has some duplication of schema-level facts ('empty string clears, omit keeps' appears three times), costing a little tightness.

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

Completeness5/5

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

For an 11-parameter mutation tool with nested objects, the description covers the parts that actually trip agents up: template/content mismatch rejection, etag conflict flow, and the STEPS-index-after-switch pitfall. An output schema exists, so return values need not be explained, and the remaining field details live in the fully-described schema.

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

Parameters4/5

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

Schema coverage is 100%, so the per-field meanings are already covered, but the description adds cross-parameter semantics the schema cannot express: empty-string-clears vs omit-keeps as a global rule, the enforced coupling between 'template' and the content fields, and 0-based step indices referring to the pre-call list unaffected by same-call deletions.

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

Purpose4/5

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

Opens with a precise verb+resource+scope: 'Partially updates an existing test case', and immediately clarifies the partial-update contract ('omitted fields are left as-is'), which implicitly separates it from createTestCase. It never names a sibling tool explicitly, so there is no direct routing statement, but the operation and its semantics are unambiguous.

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

Usage Guidelines4/5

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

Gives concrete use conditions rather than just a purpose: pass '_etag' when you want conflict detection, pass 'template' in the same call to write another template's content, and 'switch first, re-read, then edit the steps' for STEPS reversion. It does not compare against alternatives such as createTestCase or moveTestCases, so it stops short of full when-not guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources