update_task
Modify a specific task by ID with new information or context, appending or replacing details as needed. Supports research-backed updates and integrates with project directories for efficient task management in AI-driven development.
Instructions
Updates a single task by ID with new information or context provided in the prompt.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| append | No | Append timestamped information to task details instead of full update | |
| file | No | Absolute path to the tasks file | |
| id | Yes | ID of the task (e.g., '15') to update. Subtasks are supported using the update-subtask tool. | |
| projectRoot | Yes | The directory of the project. Must be an absolute path. | |
| prompt | Yes | New information or context to incorporate into the task | |
| research | No | Use Perplexity AI for research-backed updates | |
| tag | No | Tag context to operate on |
Implementation Reference
- mcp-server/src/tools/update-task.js:20-110 (registration)Registers the 'update_task' MCP tool on the server, including schema, description, and execute handler function.export function registerUpdateTaskTool(server) { server.addTool({ name: 'update_task', description: 'Updates a single task by ID with new information or context provided in the prompt.', parameters: z.object({ id: z .string() // ID can be number or string like "1.2" .describe( "ID of the task (e.g., '15') to update. Subtasks are supported using the update-subtask tool." ), prompt: z .string() .describe('New information or context to incorporate into the task'), research: z .boolean() .optional() .describe('Use Perplexity AI for research-backed updates'), append: z .boolean() .optional() .describe( 'Append timestamped information to task details instead of full update' ), file: z.string().optional().describe('Absolute path to the tasks file'), projectRoot: z .string() .describe('The directory of the project. Must be an absolute path.'), tag: z.string().optional().describe('Tag context to operate on') }), execute: withNormalizedProjectRoot(async (args, { log, session }) => { const toolName = 'update_task'; try { const resolvedTag = resolveTag({ projectRoot: args.projectRoot, tag: args.tag }); log.info( `Executing ${toolName} tool with args: ${JSON.stringify(args)}` ); let tasksJsonPath; try { tasksJsonPath = findTasksPath( { projectRoot: args.projectRoot, file: args.file }, log ); log.info(`${toolName}: Resolved tasks path: ${tasksJsonPath}`); } catch (error) { log.error(`${toolName}: Error finding tasks.json: ${error.message}`); return createErrorResponse( `Failed to find tasks.json: ${error.message}` ); } // 3. Call Direct Function - Include projectRoot const result = await updateTaskByIdDirect( { tasksJsonPath: tasksJsonPath, id: args.id, prompt: args.prompt, research: args.research, append: args.append, projectRoot: args.projectRoot, tag: resolvedTag }, log, { session } ); // 4. Handle Result log.info( `${toolName}: Direct function result: success=${result.success}` ); return handleApiResult({ result, log: log, errorPrefix: 'Error updating task', projectRoot: args.projectRoot }); } catch (error) { log.error( `Critical error in ${toolName} tool execute: ${error.message}` ); return createErrorResponse( `Internal tool error (${toolName}): ${error.message}` ); } }) }); }
- The execute handler for the update_task tool. Resolves project paths, finds tasks.json, calls the direct update function, and handles the API result.execute: withNormalizedProjectRoot(async (args, { log, session }) => { const toolName = 'update_task'; try { const resolvedTag = resolveTag({ projectRoot: args.projectRoot, tag: args.tag }); log.info( `Executing ${toolName} tool with args: ${JSON.stringify(args)}` ); let tasksJsonPath; try { tasksJsonPath = findTasksPath( { projectRoot: args.projectRoot, file: args.file }, log ); log.info(`${toolName}: Resolved tasks path: ${tasksJsonPath}`); } catch (error) { log.error(`${toolName}: Error finding tasks.json: ${error.message}`); return createErrorResponse( `Failed to find tasks.json: ${error.message}` ); } // 3. Call Direct Function - Include projectRoot const result = await updateTaskByIdDirect( { tasksJsonPath: tasksJsonPath, id: args.id, prompt: args.prompt, research: args.research, append: args.append, projectRoot: args.projectRoot, tag: resolvedTag }, log, { session } ); // 4. Handle Result log.info( `${toolName}: Direct function result: success=${result.success}` ); return handleApiResult({ result, log: log, errorPrefix: 'Error updating task', projectRoot: args.projectRoot }); } catch (error) { log.error( `Critical error in ${toolName} tool execute: ${error.message}` ); return createErrorResponse( `Internal tool error (${toolName}): ${error.message}` ); } })
- Input parameter schema (Zod) for the update_task tool defining id, prompt, optional research, append, file, projectRoot, and tag.parameters: z.object({ id: z .string() // ID can be number or string like "1.2" .describe( "ID of the task (e.g., '15') to update. Subtasks are supported using the update-subtask tool." ), prompt: z .string() .describe('New information or context to incorporate into the task'), research: z .boolean() .optional() .describe('Use Perplexity AI for research-backed updates'), append: z .boolean() .optional() .describe( 'Append timestamped information to task details instead of full update' ), file: z.string().optional().describe('Absolute path to the tasks file'), projectRoot: z .string() .describe('The directory of the project. Must be an absolute path.'), tag: z.string().optional().describe('Tag context to operate on') }),
- src/schemas/update-task.js:1-7 (schema)Response schema for update_task tool, defining the structure of the updated task object.import { z } from 'zod'; import { UpdatedTaskSchema } from './update-tasks.js'; export const UpdateTaskResponseSchema = z.object({ task: UpdatedTaskSchema });
- mcp-server/src/tools/tool-registry.js:78-78 (registration)Maps 'update_task' to its registration function in the central tool registry.update_task: registerUpdateTaskTool,