Skip to main content
Glama

plan_ticket_tasks

Destructive

Turn a ticket into implementation and testing tasks with hour estimates, then create them as child items after approval in Azure DevOps, Jira, or GitHub Issues.

Instructions

request.step is one of: search, read, prepare, request_approval, approve, revise, view_draft, publish. Works with Azure DevOps, Jira and GitHub Issues. Turn a ticket into clear implementation and testing tasks with estimated hours, created under it after approval (Azure child Tasks, Jira sub-tasks, GitHub sub-issues). Use step=search to find tickets: WIQL or a saved query id for Azure, JQL or a filter id for Jira, a search query for GitHub. step=read returns the ticket, its children and discussion. step=prepare saves the plan for approval.

Input Schema

NameRequiredDescriptionDefault
requestYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.4.0
    • changedInput schema / properties / request / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "continuationToken": {
      -        "type": "string"
      -      },
      -      "step": {
      -        "const": "read",
      -        "type": "string"
      -      },
      -      "ticketId": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "step",
      -      "ticketId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "language": {
      -        "enum": [
      -          "fr",
      -          "en"
      -        ],
      -        "type": "string"
      -      },
      -      "step": {
      -        "const": "prepare",
      -        "type": "string"
      -      },
      -      "tasks": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "description": {
      -              "description": "Final task description in Azure HTML: scope, completion criteria, dependencies and estimate assumptions",
      -              "maxLength": 30000,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "estimatedHours": {
      -              "description": "Required effort estimate in hours, not a promised completion date",
      -              "exclusiveMinimum": 0,
      -              "maximum": 100000,
      -              "type": "number"
      -            },
      -            "title": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "title",
      -            "description",
      -            "estimatedHours"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "ticketId": {
      -        "exclusiveMinimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "step",
      -      "ticketId",
      -      "language",
      -      "tasks"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "draftId": {
      -        "format": "uuid",
      -        "type": "string"
      -      },
      -      "step": {
      -        "const": "view_draft",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "step",
      -      "draftId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "draftId": {
      -        "$ref": "#/properties/request/anyOf/2/properties/draftId"
      -      },
      -      "step": {
      -        "const": "publish",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "step",
      -      "draftId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "query": {
      +        "description": "Azure: WIQL (supports @project, @Me). Jira: JQL, e.g. \"assignee = currentUser() AND statusCategory != Done\". GitHub: issue search, e.g. \"is:open assignee:@me label:bug\" (repo:GITHUB_REPO is added when no repo/org is named)",
      +        "maxLength": 4000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "queryId": {
      +        "description": "Azure saved query GUID (from its URL) or Jira filter id",
      +        "pattern": "^[\\w-]{1,64}$",
      +        "type": "string"
      +      },
      +      "step": {
      +        "const": "search",
      +        "type": "string"
      +      },
      +      "tracker": {
      +        "description": "Ticket tracker; inferred from the id, else azure (TICKET_TRACKER)",
      +        "enum": [
      +          "azure",
      +          "jira",
      +          "github"
      +        ],
      +        "type": "string"
      +      },
      +      "wiql": {
      +        "description": "Same as query, for Azure",
      +        "maxLength": 4000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "continuationToken": {
      +        "type": "string"
      +      },
      +      "full": {
      +        "default": false,
      +        "description": "Every raw field instead of the reviewer-relevant ones",
      +        "type": "boolean"
      +      },
      +      "step": {
      +        "const": "read",
      +        "type": "string"
      +      },
      +      "ticketId": {
      +        "anyOf": [
      +          {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          {
      +            "pattern": "^(?:[A-Za-z][A-Za-z0-9_]+-\\d+|(?:[\\w.-]+\\/[\\w.-]+)?#\\d+|\\d+)$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Azure work item id (42), Jira key (PROJ-123) or GitHub issue (owner/repo#45, or #45 with GITHUB_REPO)"
      +      },
      +      "tracker": {
      +        "$ref": "#/properties/request/anyOf/0/properties/tracker"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "ticketId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "approval": {
      +        "default": "default",
      +        "description": "Where the user approves. default = conversation (REVIEW_APPROVAL). conversation: you show the preview and relay the user's reply with step=approve. in-chat: an MCP form. browser: a local page. terminal: co-dev-review approve. auto: form, then browser, then terminal",
      +        "enum": [
      +          "default",
      +          "conversation",
      +          "in-chat",
      +          "browser",
      +          "terminal",
      +          "auto"
      +        ],
      +        "type": "string"
      +      },
      +      "language": {
      +        "enum": [
      +          "fr",
      +          "en"
      +        ],
      +        "type": "string"
      +      },
      +      "step": {
      +        "const": "prepare",
      +        "type": "string"
      +      },
      +      "tasks": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "assignedTo": {
      +              "description": "Azure: email or unique name; Jira Cloud: accountId (Server: user name); GitHub: login. Defaults to AZURE_DEVOPS_ASSIGNEE, JIRA_ASSIGNEE or GITHUB_ASSIGNEE",
      +              "maxLength": 256,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "Final task description in the tracker's format (Azure DevOps HTML, Jira wiki markup, GitHub Markdown): scope, completion criteria, dependencies and estimate assumptions",
      +              "maxLength": 30000,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "estimatedHours": {
      +              "description": "Required effort estimate in hours, not a promised completion date. Azure: Original Estimate and Remaining Work; Jira: Original Estimate; GitHub: written in the body.",
      +              "exclusiveMinimum": 0,
      +              "maximum": 100000,
      +              "type": "number"
      +            },
      +            "title": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "title",
      +            "description",
      +            "estimatedHours"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "ticketId": {
      +        "$ref": "#/properties/request/anyOf/1/properties/ticketId"
      +      },
      +      "tracker": {
      +        "$ref": "#/properties/request/anyOf/0/properties/tracker"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "ticketId",
      +      "language",
      +      "tasks"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "approval": {
      +        "$ref": "#/properties/request/anyOf/2/properties/approval"
      +      },
      +      "draftId": {
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "step": {
      +        "const": "request_approval",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "draftId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "draftId": {
      +        "$ref": "#/properties/request/anyOf/3/properties/draftId"
      +      },
      +      "publish": {
      +        "default": true,
      +        "description": "false only when the user asked to approve without posting now",
      +        "type": "boolean"
      +      },
      +      "selectedIds": {
      +        "description": "Exactly the item ids the user approved in their reply, e.g. [\"R1\",\"R3\"]",
      +        "items": {
      +          "pattern": "^[RT]\\d{1,3}$",
      +          "type": "string"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "step": {
      +        "const": "approve",
      +        "type": "string"
      +      },
      +      "userWords": {
      +        "description": "The user's approving reply, quoted verbatim; it is stored with the approval",
      +        "maxLength": 500,
      +        "minLength": 2,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "draftId",
      +      "selectedIds",
      +      "userWords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "draftId": {
      +        "$ref": "#/properties/request/anyOf/3/properties/draftId"
      +      },
      +      "itemId": {
      +        "pattern": "^[RT]\\d{1,3}$",
      +        "type": "string"
      +      },
      +      "step": {
      +        "const": "revise",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "The reworded comment (Markdown) or task description (Azure HTML) the user asked for",
      +        "maxLength": 30000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "draftId",
      +      "itemId",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "draftId": {
      +        "$ref": "#/properties/request/anyOf/3/properties/draftId"
      +      },
      +      "step": {
      +        "const": "view_draft",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "draftId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "draftId": {
      +        "$ref": "#/properties/request/anyOf/3/properties/draftId"
      +      },
      +      "step": {
      +        "const": "publish",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "step",
      +      "draftId"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observedv1.1.0

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true. The description adds the crucial mitigating context that creation happens only 'after approval' and names the concrete artifacts created in each tracker; it also surfaces the approval/return-value framing. It does not, however, explain what publish/approve/revise actually mutate, so it adds value without closing the gap fully.

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?

Four dense sentences with no filler, each carrying information about purpose, tracker support, or step behavior. The opening sentence is a bare enum dump of internal field values, which is slightly awkward as a lead, but nothing is wasted.

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

Completeness3/5

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

For an 8-branch discriminated union with no output schema and destructive semantics, the description covers the create/approve spine well but leaves half the state machine (approve flow details, revise, view_draft, publish) unexplained. An agent can start a search/read/prepare flow but must open the schema to drive the approval half.

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

Parameters3/5

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

The top-level schema is effectively a single 'request' union with 0% reported description coverage, and the description compensates only partially: it explains step=search, step=read and step=prepare, but the other five steps (request_approval, approve, revise, view_draft, publish) are merely enumerated by name with no semantic guidance. It adds marginal meaning over the schema's const values rather than full coverage.

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

Purpose4/5

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

The description gives a specific verb+resource: 'Turn a ticket into clear implementation and testing tasks with estimated hours, created under it after approval', and names the tracker targets (Azure child Tasks, Jira sub-tasks, GitHub sub-issues). It is clear what the tool does, but it never distinguishes itself from the sibling review_work / review_sonar tools, so an agent has no explicit routing cue between them.

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?

It maps steps to situations ('Use step=search to find tickets', 'step=read returns the ticket...', 'step=prepare saves the plan for approval') and gives per-tracker query selection for search (WIQL/query id, JQL/filter id, GitHub search). There is no explicit when-not guidance or statement of which step to start with vs. the siblings, so it stops short of 5.

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

Deploy Server

Other Tools