MCP Personal Assistant Agent

/** * Tasks Module Functions * Provides MCP functions for managing tasks and to-dos */ import config from '../../config/index.js'; import logger from '../../utils/logger.js'; import { getLocalTaskProvider } from './providers/local.js'; // Get the default task provider from config const defaultProvider = config.modules.tasks.defaultProvider; /** * Get all tasks, optionally filtered */ const getTasks = { description: "Get all tasks, optionally filtered by status, priority, or date", parameters: { properties: { status: { type: "string", description: "Filter by status (open, in_progress, completed)" }, priority: { type: "string", description: "Filter by priority (high, medium, low)" }, dueDate: { type: "string", description: "Filter by due date (YYYY-MM-DD) or relative (today, tomorrow, this_week)" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: [] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Getting tasks using ${provider} provider with filters: ${JSON.stringify(params)}`); // Get tasks based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.getTasks({ status: params.status, priority: params.priority, dueDate: params.dueDate }); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to get tasks: ${error.message}`); throw new Error(`Failed to get tasks: ${error.message}`); } } }; /** * Get a specific task by ID */ const getTaskById = { description: "Get a specific task by ID", parameters: { properties: { taskId: { type: "string", description: "ID of the task to retrieve" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: ["taskId"] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Getting task ${params.taskId} using ${provider} provider`); // Get task based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.getTaskById(params.taskId); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to get task: ${error.message}`); throw new Error(`Failed to get task: ${error.message}`); } } }; /** * Create a new task */ const createTask = { description: "Create a new task", parameters: { properties: { title: { type: "string", description: "Title of the task" }, description: { type: "string", description: "Description of the task" }, dueDate: { type: "string", description: "Due date (YYYY-MM-DD) or relative (today, tomorrow)" }, priority: { type: "string", description: "Priority level (high, medium, low)" }, tags: { type: "array", items: { type: "string" }, description: "Tags associated with the task" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: ["title"] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Creating task "${params.title}" using ${provider} provider`); // Create task based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.createTask({ title: params.title, description: params.description, dueDate: params.dueDate, priority: params.priority || 'medium', tags: params.tags || [] }); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to create task: ${error.message}`); throw new Error(`Failed to create task: ${error.message}`); } } }; /** * Update an existing task */ const updateTask = { description: "Update an existing task", parameters: { properties: { taskId: { type: "string", description: "ID of the task to update" }, title: { type: "string", description: "New title for the task" }, description: { type: "string", description: "New description for the task" }, dueDate: { type: "string", description: "New due date (YYYY-MM-DD) or relative (today, tomorrow)" }, priority: { type: "string", description: "New priority level (high, medium, low)" }, status: { type: "string", description: "New status (open, in_progress, completed)" }, tags: { type: "array", items: { type: "string" }, description: "New tags associated with the task" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: ["taskId"] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Updating task ${params.taskId} using ${provider} provider`); // Update task based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.updateTask({ id: params.taskId, title: params.title, description: params.description, dueDate: params.dueDate, priority: params.priority, status: params.status, tags: params.tags }); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to update task: ${error.message}`); throw new Error(`Failed to update task: ${error.message}`); } } }; /** * Delete a task */ const deleteTask = { description: "Delete a task", parameters: { properties: { taskId: { type: "string", description: "ID of the task to delete" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: ["taskId"] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Deleting task ${params.taskId} using ${provider} provider`); // Delete task based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.deleteTask(params.taskId); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to delete task: ${error.message}`); throw new Error(`Failed to delete task: ${error.message}`); } } }; /** * Complete a task */ const completeTask = { description: "Mark a task as completed", parameters: { properties: { taskId: { type: "string", description: "ID of the task to complete" }, provider: { type: "string", description: "Task provider to use (local, todoist)" } }, required: ["taskId"] }, async handler(params) { try { const provider = params.provider || defaultProvider; logger.info(`Completing task ${params.taskId} using ${provider} provider`); // Complete task based on the provider if (provider === 'local') { const taskProvider = await getLocalTaskProvider(); return await taskProvider.updateTask({ id: params.taskId, status: 'completed' }); } else { throw new Error(`Task provider '${provider}' is not supported or enabled`); } } catch (error) { logger.error(`Failed to complete task: ${error.message}`); throw new Error(`Failed to complete task: ${error.message}`); } } }; export default [ getTasks, getTaskById, createTask, updateTask, deleteTask, completeTask ];