updateTask
Modify task details in Godspeed MCP server, including labels, due dates, status, notes, and metadata, using the task ID for precise updates.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| add_label_ids | No | ||
| add_label_names | No | ||
| due_at | No | ||
| duration_minutes | No | ||
| id | Yes | ||
| is_cleared | No | ||
| is_complete | No | ||
| metadata | No | ||
| notes | No | ||
| remove_label_ids | No | ||
| remove_label_names | No | ||
| snoozed_until | No | ||
| starts_at | No | ||
| timeless_due_at | No | ||
| timeless_snoozed_until | No | ||
| timeless_starts_at | No | ||
| title | No |
Implementation Reference
- src/index.ts:138-149 (handler)MCP tool handler function for 'updateTask' that delegates to GodspeedAPI.updateTask, formats the result as JSON text content, and handles errors.async (params) => { try { const result = await godspeedApi.updateTask(params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}` }] }; } }
- src/index.ts:120-137 (schema)Zod input schema for the 'updateTask' MCP tool parameters.id: z.string(), title: z.string().optional(), notes: z.string().optional(), due_at: z.date().optional(), timeless_due_at: z.string().optional(), snoozed_until: z.date().optional(), timeless_snoozed_until: z.string().optional(), starts_at: z.date().optional(), timeless_starts_at: z.string().optional(), duration_minutes: z.number().int().nonnegative().optional(), is_complete: z.boolean().optional(), is_cleared: z.boolean().optional(), add_label_names: z.array(z.string()).optional(), add_label_ids: z.array(z.string()).optional(), remove_label_names: z.array(z.string()).optional(), remove_label_ids: z.array(z.string()).optional(), metadata: z.record(z.any()).optional() },
- src/index.ts:117-150 (registration)Registration of the 'updateTask' tool using McpServer.tool, including schema and handler.server.tool( "updateTask", { id: z.string(), title: z.string().optional(), notes: z.string().optional(), due_at: z.date().optional(), timeless_due_at: z.string().optional(), snoozed_until: z.date().optional(), timeless_snoozed_until: z.string().optional(), starts_at: z.date().optional(), timeless_starts_at: z.string().optional(), duration_minutes: z.number().int().nonnegative().optional(), is_complete: z.boolean().optional(), is_cleared: z.boolean().optional(), add_label_names: z.array(z.string()).optional(), add_label_ids: z.array(z.string()).optional(), remove_label_names: z.array(z.string()).optional(), remove_label_ids: z.array(z.string()).optional(), metadata: z.record(z.any()).optional() }, async (params) => { try { const result = await godspeedApi.updateTask(params); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}` }] }; } } );
- src/godspeed.ts:86-144 (helper)Core helper function in GodspeedAPI class that validates parameters and performs the PATCH request to update a task via the Godspeed API.async updateTask(params: UpdateTaskParams): Promise<ApiResponse<Task>> { try { const headers = this.getAuthHeaders(); // Validate required parameters if (!params.id) { throw new Error('Task ID is required'); } // Validate conflicting date parameters if (params.due_at && params.timeless_due_at) { throw new Error('Cannot specify both due_at and timeless_due_at'); } if (params.snoozed_until && params.timeless_snoozed_until) { throw new Error('Cannot specify both snoozed_until and timeless_snoozed_until'); } if (params.starts_at && params.timeless_starts_at) { throw new Error('Cannot specify both starts_at and timeless_starts_at'); } // Validate timeless date formats if provided if (params.timeless_due_at && !/^\d{4}-\d{2}-\d{2}$/.test(params.timeless_due_at)) { throw new Error('timeless_due_at must be formatted as YYYY-MM-DD'); } if (params.timeless_snoozed_until && !/^\d{4}-\d{2}-\d{2}$/.test(params.timeless_snoozed_until)) { throw new Error('timeless_snoozed_until must be formatted as YYYY-MM-DD'); } if (params.timeless_starts_at && !/^\d{4}-\d{2}-\d{2}$/.test(params.timeless_starts_at)) { throw new Error('timeless_starts_at must be formatted as YYYY-MM-DD'); } // Validate duration_minutes if provided if (params.duration_minutes !== undefined && (!Number.isInteger(params.duration_minutes) || params.duration_minutes < 0)) { throw new Error('duration_minutes must be a positive integer'); } const { id, ...updateData } = params; const response = await fetch(`${API_BASE_URL}/tasks/${id}`, { method: 'PATCH', headers, body: JSON.stringify(updateData), }); const data = await response.json(); if (!response.ok) { throw new Error(data.error || 'Failed to update task'); } return data; } catch (error) { throw new Error(`Update task error: ${error instanceof Error ? error.message : String(error)}`); } }
- src/types.ts:40-58 (schema)TypeScript type definition for UpdateTaskParams used in the GodspeedAPI.updateTask method.export interface UpdateTaskParams { id: string; title?: string; notes?: string; due_at?: Date; timeless_due_at?: string; snoozed_until?: Date; timeless_snoozed_until?: string; starts_at?: Date; timeless_starts_at?: string; duration_minutes?: number; is_complete?: boolean; is_cleared?: boolean; add_label_names?: string[]; add_label_ids?: string[]; remove_label_names?: string[]; remove_label_ids?: string[]; metadata?: Record<string, any>; }