update_cycle
Modify existing project cycles in Plane's project management system by updating fields like start date, end date, progress, and issue statuses using the MCP server's standardized API.
Instructions
Update an existing cycle
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cycle_data | Yes | The fields to update on the cycle | |
| cycle_id | Yes | The uuid identifier of the cycle to update | |
| project_id | Yes | The uuid identifier of the project containing the cycle |
Implementation Reference
- src/tools/cycles.ts:90-104 (handler)The async handler function for the update_cycle tool that performs a PATCH request to the Plane API endpoint to update the cycle and returns the JSON response.async ({ project_id, cycle_id, cycle_data }) => { const response = await makePlaneRequest( "PATCH", `workspaces/${process.env.PLANE_WORKSPACE_SLUG}/projects/${project_id}/cycles/${cycle_id}/`, cycle_data ); return { content: [ { type: "text", text: JSON.stringify(response, null, 2), }, ], }; }
- src/tools/cycles.ts:85-89 (schema)Inline Zod input schema for the update_cycle tool parameters.{ project_id: z.string().describe("The uuid identifier of the project containing the cycle"), cycle_id: z.string().describe("The uuid identifier of the cycle to update"), cycle_data: CycleSchema.partial().describe("The fields to update on the cycle"), },
- src/schemas.ts:3-35 (schema)Zod schema for Cycle object, imported as CycleSchema and used as partial() for the cycle_data parameter in update_cycle.export const Cycle = z.object({ archived_at: z.string().datetime({ offset: true }).optional(), backlog_issues: z.number().int().readonly(), cancelled_issues: z.number().int().readonly(), completed_estimates: z.number().readonly(), completed_issues: z.number().int().readonly(), created_at: z.string().datetime({ offset: true }).readonly(), created_by: z.string().uuid().readonly(), deleted_at: z.string().datetime({ offset: true }).readonly(), description: z.string().optional(), end_date: z.string().date().optional().describe("The end date of the cycle of format YYYY-MM-DD"), external_id: z.string().max(255).optional(), external_source: z.string().max(255).optional(), id: z.string().uuid().readonly(), logo_props: z.any().optional(), name: z.string().max(255), owned_by: z.string().uuid().readonly(), progress_snapshot: z.any().optional(), project_id: z.string().uuid().readonly(), sort_order: z.number().optional(), start_date: z.string().date().optional().describe("The start date of the cycle of format YYYY-MM-DD"), started_estimates: z.number().readonly(), started_issues: z.number().int().readonly(), timezone: z.any().optional(), total_estimates: z.number().readonly(), total_issues: z.number().int().readonly(), unstarted_issues: z.number().int().readonly(), updated_at: z.string().datetime({ offset: true }).readonly(), updated_by: z.string().uuid().readonly(), version: z.number().int().gte(-2147483648).lte(2147483647).optional(), view_props: z.any().optional(), workspace: z.string().uuid().readonly(), });
- src/tools/cycles.ts:82-105 (registration)Registration of the update_cycle tool via server.tool() within the registerCycleTools function.server.tool( "update_cycle", "Update an existing cycle", { project_id: z.string().describe("The uuid identifier of the project containing the cycle"), cycle_id: z.string().describe("The uuid identifier of the cycle to update"), cycle_data: CycleSchema.partial().describe("The fields to update on the cycle"), }, async ({ project_id, cycle_id, cycle_data }) => { const response = await makePlaneRequest( "PATCH", `workspaces/${process.env.PLANE_WORKSPACE_SLUG}/projects/${project_id}/cycles/${cycle_id}/`, cycle_data ); return { content: [ { type: "text", text: JSON.stringify(response, null, 2), }, ], }; } );