Edit a user story

userstory.updateChanges dataCreates, updates or deletes something in your workspace.

What it does

Changes a user story of the connected workspace: title (unique across features and stories in the workspace), description, the "as a / I want / so that" statement, story points, assignee, priority, parent feature, status, and its breakdown (edgeCases, nonFunctional, dependencies, assumptions, outOfScope, risks, sourceRequirement). Send only what changes; a breakdown field given replaces that field only, and null removes it. Its acceptance-criteria test cases are edited with case.update; the Definition of Ready / Done checklist is ticked by a person (userstory.gates); lifecycle and release have their own tools. Editing a story does not reset its review. Get the id from feature.list. Returns {success, data: the updated story, uri}.

Ask your agent

You don’t call userstory.update yourself. Say something like this to Claude Code, Cursor or another MCP-connected agent:

  • “The saved-card story is 5 points, not 3”
  • “Assign the order tracking story to me”
  • “Add "card expired" as an edge case of the saved-card story”

Inputs

NameTypeDescription
suiteId
required
stringId of the user story (the id from feature.list).
title
optional
stringNew title, unique across features and stories in the workspace.
description
optional
string | nullNew description; null clears it.
asA
optional
stringWho the user is (the "As a ..." part).
iWant
optional
stringWhat they want to do (the "I want ..." part).
soThat
optional
stringWhy it matters to them (the "so that ..." part).
storyPoints
optional
integer | nullEstimate in story points; null clears it.
assigneeId
optional
string | nullUser id of the person building it (a member of this workspace); null clears it.
priority
optional
enumP0 = critical; P1 = high; P2 = normal; P3 = nice to have.
Allowed: P0P1P2P3
parentFeatureId
optional
stringMove it under another feature (the id from feature.list); a story always has a parent.
status
optional
enumACTIVE, or INACTIVE to hide it.
Allowed: ACTIVEINACTIVE
edgeCases
optional
any | string[] | nullError states, boundaries, empty states and permission cases to cover (each becomes a negative or boundary acceptance case).
nonFunctional
optional
any | string[] | nullPerformance, security, accessibility or scalability requirements, where they apply.
dependencies
optional
any | string[] | nullOther stories or external systems this one needs first.
assumptions
optional
any | string[] | nullThings assumed true that would change the scope if wrong.
outOfScope
optional
any | string | nullWhat this story deliberately leaves out.
risks
optional
any | object[] | nullRisks, each with an optional mitigation.
sourceRequirement
optional
any | string | nullThe original requirement text this story came from, kept for traceability. Copy it, do not rewrite it.

The MCP call

What the agent’s MCP client sends (placeholders in angle brackets):

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "userstory.update",
    "arguments": {
      "suiteId": "<suiteId>"
    }
  }
}

Connect your agent

npx -y @testmaze/mcp init tmt_xxx
claude mcp add tm --scope project -- npx -y @testmaze/mcp

Create the token in your Test Maze workspace under Settings → MCP. Setup for Cursor, Cline, Gemini CLI and Codex CLI is shown there too.