add_omnifocus_task
Create and manage tasks in OmniFocus by specifying details like name, due date, notes, tags, and project. Assign tasks to projects, set deadlines, and organize with subtasks for efficient productivity.
Instructions
Add a new task to OmniFocus
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| deferDate | No | The defer date of the task in ISO format (YYYY-MM-DD or full ISO date) | |
| dueDate | No | The due date of the task in ISO format (YYYY-MM-DD or full ISO date) | |
| estimatedMinutes | No | Estimated time to complete the task, in minutes | |
| flagged | No | Whether the task is flagged or not | |
| name | Yes | The name of the task | |
| note | No | Additional notes for the task | |
| parentTaskId | No | The ID of the parent task to create this task as a subtask | |
| parentTaskName | No | The name of the parent task to create this task as a subtask (alternative to parentTaskId) | |
| projectName | No | The name of the project to add the task to (will add to inbox if not specified) | |
| tags | No | Tags to assign to the task |
Implementation Reference
- MCP tool handler for 'add_omnifocus_task' that validates input, calls primitive implementation, and returns formatted success/error response.export async function handler(args: z.infer<typeof schema>, extra: RequestHandlerExtra) { try { // Call the addOmniFocusTask function const result = await addOmniFocusTask(args as AddOmniFocusTaskParams); if (result.success) { // Task was added successfully let locationText; if (args.parentTaskId || args.parentTaskName) { const parentRef = args.parentTaskId || args.parentTaskName; locationText = `as a subtask of "${parentRef}"`; } else if (args.projectName) { locationText = `in project "${args.projectName}"`; } else { locationText = "in your inbox"; } let tagText = args.tags && args.tags.length > 0 ? ` with tags: ${args.tags.join(', ')}` : ""; let dueDateText = args.dueDate ? ` due on ${new Date(args.dueDate).toLocaleDateString()}` : ""; return { content: [{ type: "text" as const, text: `✅ Task "${args.name}" created successfully ${locationText}${dueDateText}${tagText}.` }] }; } else { // Task creation failed return { content: [{ type: "text" as const, text: `Failed to create task: ${result.error}` }], isError: true }; } } catch (err: unknown) { const error = err as Error; console.error(`Tool execution error: ${error.message}`); return { content: [{ type: "text" as const, text: `Error creating task: ${error.message}` }], isError: true }; } }
- Zod schema defining the input parameters for the add_omnifocus_task tool.export const schema = z.object({ name: z.string().describe("The name of the task"), note: z.string().optional().describe("Additional notes for the task"), dueDate: z.string().optional().describe("The due date of the task in ISO format (YYYY-MM-DD or full ISO date)"), deferDate: z.string().optional().describe("The defer date of the task in ISO format (YYYY-MM-DD or full ISO date)"), flagged: z.boolean().optional().describe("Whether the task is flagged or not"), estimatedMinutes: z.number().optional().describe("Estimated time to complete the task, in minutes"), tags: z.array(z.string()).optional().describe("Tags to assign to the task"), projectName: z.string().optional().describe("The name of the project to add the task to (will add to inbox if not specified)"), parentTaskId: z.string().optional().describe("The ID of the parent task to create this task as a subtask"), parentTaskName: z.string().optional().describe("The name of the parent task to create this task as a subtask (alternative to parentTaskId)") });
- src/server.ts:41-46 (registration)Registration of the 'add_omnifocus_task' tool in the MCP server using schema and handler from definitions.server.tool( "add_omnifocus_task", "Add a new task to OmniFocus", addOmniFocusTaskTool.schema.shape, addOmniFocusTaskTool.handler );
- Core helper function implementing OmniFocus task creation via AppleScript execution, including validation and error handling.export async function addOmniFocusTask(params: AddOmniFocusTaskParams): Promise<{success: boolean, taskId?: string, error?: string}> { try { // Validate parent task parameters const validation = await validateParentTaskParams(params); if (!validation.valid) { return { success: false, error: validation.error }; } // Generate AppleScript const script = generateAppleScript(params); console.error("Executing AppleScript directly..."); // Execute AppleScript directly const { stdout, stderr } = await execAsync(`osascript -e '${script}'`); if (stderr) { console.error("AppleScript stderr:", stderr); } console.error("AppleScript stdout:", stdout); // Parse the result try { const result = JSON.parse(stdout); // Return the result return { success: result.success, taskId: result.taskId, error: result.error }; } catch (parseError) { console.error("Error parsing AppleScript result:", parseError); return { success: false, error: `Failed to parse result: ${stdout}` }; } } catch (error: any) { console.error("Error in addOmniFocusTask:", error); return { success: false, error: error?.message || "Unknown error in addOmniFocusTask" }; } }