update_issue
Modify and manage existing issues in Backlog by updating key details such as summary, priority, status, due date, assigned users, and comments for better project tracking and collaboration.
Instructions
Updates an existing issue
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| actualHours | No | Actual work hours | |
| assigneeId | No | User ID of the assignee | |
| attachmentId | No | Attachment IDs | |
| categoryId | No | Category IDs | |
| comment | No | Comment to add when updating the issue | |
| description | No | Updates an existing issue | |
| dueDate | No | Scheduled due date (yyyy-MM-dd) | |
| estimatedHours | No | Estimated work hours | |
| issueIdOrKey | Yes | Issue ID or issue key | |
| issueTypeId | No | Issue type ID | |
| milestoneId | No | Milestone IDs | |
| notifiedUserId | No | User IDs to notify | |
| priorityId | No | Priority ID | |
| resolutionId | No | Resolution ID | |
| startDate | No | Scheduled start date (yyyy-MM-dd) | |
| statusId | No | Status ID | |
| summary | No | Summary of the issue | |
| versionId | No | Version IDs |
Implementation Reference
- src/tools/updateIssue.ts:141-170 (handler)The main implementation of the 'update_issue' tool. This factory function returns a ToolDefinition object with the tool's name, description, input/output schemas, and the async handler function that resolves the issue identifier, processes custom fields, and calls backlog.patchIssue to update the issue.export const updateIssueTool = ( backlog: Backlog, { t }: TranslationHelper ): ToolDefinition< ReturnType<typeof updateIssueSchema>, (typeof IssueSchema)['shape'] > => { return { name: 'update_issue', description: t( 'TOOL_UPDATE_ISSUE_DESCRIPTION', 'Updates an existing issue' ), schema: z.object(updateIssueSchema(t)), outputSchema: IssueSchema, handler: async ({ issueId, issueKey, customFields, ...params }) => { const result = resolveIdOrKey('issue', { id: issueId, key: issueKey }, t); if (!result.ok) { throw result.error; } const customFieldPayload = customFieldsToPayload(customFields); const finalPayload = { ...params, ...customFieldPayload, }; return backlog.patchIssue(result.value, finalPayload); }, }; };
- src/tools/updateIssue.ts:9-139 (schema)Detailed Zod schema definition for the input parameters of the update_issue tool, including optional fields for issue identification, properties like summary, dates, assignees, custom fields, etc.const updateIssueSchema = buildToolSchema((t) => ({ issueId: z .number() .optional() .describe( t( 'TOOL_UPDATE_ISSUE_ISSUE_ID', 'The numeric ID of the issue (e.g., 12345)' ) ), issueKey: z .string() .optional() .describe( t( 'TOOL_UPDATE_ISSUE_ISSUE_KEY', "The key of the issue (e.g., 'PROJ-123')" ) ), summary: z .string() .optional() .describe(t('TOOL_UPDATE_ISSUE_SUMMARY', 'Summary of the issue')), issueTypeId: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_ISSUE_TYPE_ID', 'Issue type ID')), priorityId: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_PRIORITY_ID', 'Priority ID')), description: z .string() .optional() .describe( t('TOOL_UPDATE_ISSUE_DESCRIPTION', 'Detailed description of the issue') ), startDate: z .string() .optional() .describe( t('TOOL_UPDATE_ISSUE_START_DATE', 'Scheduled start date (yyyy-MM-dd)') ), dueDate: z .string() .optional() .describe( t('TOOL_UPDATE_ISSUE_DUE_DATE', 'Scheduled due date (yyyy-MM-dd)') ), estimatedHours: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_ESTIMATED_HOURS', 'Estimated work hours')), actualHours: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_ACTUAL_HOURS', 'Actual work hours')), categoryId: z .array(z.number()) .optional() .describe(t('TOOL_UPDATE_ISSUE_CATEGORY_ID', 'Category IDs')), versionId: z .array(z.number()) .optional() .describe(t('TOOL_UPDATE_ISSUE_VERSION_ID', 'Version IDs')), milestoneId: z .array(z.number()) .optional() .describe(t('TOOL_UPDATE_ISSUE_MILESTONE_ID', 'Milestone IDs')), statusId: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_STATUS_ID', 'Status ID')), resolutionId: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_RESOLUTION_ID', 'Resolution ID')), assigneeId: z .number() .optional() .describe(t('TOOL_UPDATE_ISSUE_ASSIGNEE_ID', 'User ID of the assignee')), notifiedUserId: z .array(z.number()) .optional() .describe(t('TOOL_UPDATE_ISSUE_NOTIFIED_USER_ID', 'User IDs to notify')), attachmentId: z .array(z.number()) .optional() .describe(t('TOOL_UPDATE_ISSUE_ATTACHMENT_ID', 'Attachment IDs')), comment: z .string() .optional() .describe( t('TOOL_UPDATE_ISSUE_COMMENT', 'Comment to add when updating the issue') ), customFields: z .array( z.object({ id: z .number() .describe( t( 'TOOL_UPDATE_ISSUE_CUSTOM_FIELD_ID', 'The ID of the custom field (e.g., 12345)' ) ), value: z .union([z.number(), z.array(z.number())]) .optional() .describe( 'The ID(s) of the custom field item. For single-select fields, provide a number. For multi-select fields, provide an array of numbers representing the selected item IDs.' ), otherValue: z .string() .optional() .describe( t( 'TOOL_UPDATE_ISSUE_CUSTOM_FIELD_OTHER_VALUE', 'Other value for list type fields' ) ), }) ) .optional() .describe( t( 'TOOL_UPDATE_ISSUE_CUSTOM_FIELDS', 'List of custom fields to set on the issue' ) ), }));
- src/tools/tools.ts:92-92 (registration)The updateIssueTool is registered (instantiated) within the 'issue' toolset group in the allTools function, which aggregates all MCP tools.updateIssueTool(backlog, helper),