Skip to main content
Glama

get_tasks

Retrieve tasks from a ClickUp list using list ID or name, with options to filter by status, dates, or sort order for focused task management.

Instructions

Retrieve tasks from a list with optional filtering. You MUST provide either:

  1. listId (preferred)

  2. listName

Use filters to narrow down results by status, dates, etc.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
listIdNoID of list to get tasks from (preferred). Use this instead of listName if you have it.
listNameNoName of list to get tasks from. Only use if you don't have listId.
archivedNoInclude archived tasks
pageNoPage number for pagination (starts at 0)
order_byNoSort field: due_date, created, updated
reverseNoReverse sort order (descending)
subtasksNoInclude subtasks
statusesNoFilter by status names (e.g. ['To Do', 'In Progress'])

Implementation Reference

  • Main execution handler for get_tasks tool: resolves list by ID or name using workspace hierarchy, prepares TaskFilters, calls taskService.getTasks, formats tasks with readable dates and assignees, returns JSON response.
    export async function handleGetTasks(parameters: any) { const { listId, listName, archived, page, order_by, reverse, subtasks, statuses, include_closed, assignees, due_date_gt, due_date_lt, date_created_gt, date_created_lt, date_updated_gt, date_updated_lt, custom_fields } = parameters; let targetListId = listId; // If no listId but listName is provided, look up the list ID if (!targetListId && listName) { const hierarchy = await workspaceService.getWorkspaceHierarchy(); const listInfo = workspaceService.findIDByNameInHierarchy(hierarchy, listName, 'list'); if (!listInfo) { throw new Error(`List "${listName}" not found`); } targetListId = listInfo.id; } if (!targetListId) { throw new Error("Either listId or listName must be provided"); } // Prepare filter options - remove archived as it's not in TaskFilters const filters: TaskFilters = { page, order_by, reverse, subtasks, statuses }; // Get tasks with filters const tasks = await taskService.getTasks(targetListId, filters); // Format the tasks data to be more API friendly const formattedTasks = tasks.map(task => ({ id: task.id, name: task.name, status: task.status?.status || 'Unknown', url: task.url, due_date: task.due_date ? formatDueDate(Number(task.due_date)) : undefined, due_date_raw: task.due_date, priority: task.priority?.priority, assignees: task.assignees?.map(a => a.username) || [] })); // Format response return { content: [{ type: "text", text: JSON.stringify({ total: tasks.length, tasks: formattedTasks }, null, 2) }] }; }
  • Tool schema definition for 'get_tasks' including name, description, and detailed inputSchema for parameters like listId/listName, pagination, sorting, subtasks, and status filters.
    export const getTasksTool = { name: "get_tasks", description: "Retrieve tasks from a list with optional filtering. You MUST provide either:\n1. listId (preferred)\n2. listName\n\nUse filters to narrow down results by status, dates, etc.", inputSchema: { type: "object", properties: { listId: { type: "string", description: "ID of list to get tasks from (preferred). Use this instead of listName if you have it." }, listName: { type: "string", description: "Name of list to get tasks from. Only use if you don't have listId." }, archived: { type: "boolean", description: "Include archived tasks" }, page: { type: "number", description: "Page number for pagination (starts at 0)" }, order_by: { type: "string", description: "Sort field: due_date, created, updated" }, reverse: { type: "boolean", description: "Reverse sort order (descending)" }, subtasks: { type: "boolean", description: "Include subtasks" }, statuses: { type: "array", items: { type: "string" }, description: "Filter by status names (e.g. ['To Do', 'In Progress'])" } }, required: [] }, async handler({ listId, listName, archived, page, order_by, reverse, subtasks, statuses }: { listId?: string; listName?: string; archived?: boolean; page?: number; order_by?: 'id' | 'created' | 'updated' | 'due_date'; reverse?: boolean; subtasks?: boolean; statuses?: string[]; }) { let targetListId = listId; // If no listId but listName is provided, look up the list ID if (!targetListId && listName) { const hierarchy = await workspaceService.getWorkspaceHierarchy(); const listInfo = workspaceService.findIDByNameInHierarchy(hierarchy, listName, 'list'); if (!listInfo) { throw new Error(`List "${listName}" not found`); } targetListId = listInfo.id; } if (!targetListId) { throw new Error("Either listId or listName must be provided"); } // Prepare filter options - remove archived as it's not in TaskFilters const filters: TaskFilters = { page, order_by, reverse, subtasks, statuses }; // Get tasks with filters const tasks = await taskService.getTasks(targetListId, filters); // Format the tasks data to be more API friendly const formattedTasks = tasks.map(task => ({ id: task.id, name: task.name, status: task.status?.status || 'Unknown', url: task.url, due_date: task.due_date ? formatDueDate(Number(task.due_date)) : undefined, due_date_raw: task.due_date, priority: task.priority?.priority, assignees: task.assignees?.map(a => a.username) || [] })); // Format response return { content: [{ type: "text", text: JSON.stringify({ total: tasks.length, tasks: formattedTasks }, null, 2) }] }; } };
  • src/server.ts:95-156 (registration)
    Server registration: dispatches 'get_tasks' tool calls to handleGetTasks in the CallToolRequestSchema handler switch statement.
    server.setRequestHandler(CallToolRequestSchema, async (req) => { const { name, arguments: params } = req.params; // Handle tool calls by routing to the appropriate handler switch (name) { case "get_workspace_hierarchy": return handleGetWorkspaceHierarchy(); case "create_task": return handleCreateTask(params); case "update_task": return handleUpdateTask(params); case "move_task": return handleMoveTask(params); case "duplicate_task": return handleDuplicateTask(params); case "get_task": return handleGetTask(params); case "get_tasks": return handleGetTasks(params); case "delete_task": return handleDeleteTask(params); case "create_bulk_tasks": return handleCreateBulkTasks(params); case "update_bulk_tasks": return handleUpdateBulkTasks(params as { tasks: any[] }); case "move_bulk_tasks": return handleMoveBulkTasks(params as { tasks: any[], targetListId?: string, targetListName?: string }); case "delete_bulk_tasks": return handleDeleteBulkTasks(params as { tasks: any[] }); case "create_list": return handleCreateList(params); case "create_list_in_folder": return handleCreateListInFolder(params); case "get_list": return handleGetList(params); case "update_list": return handleUpdateList(params); case "delete_list": return handleDeleteList(params); case "create_folder": return handleCreateFolder(params); case "get_folder": return handleGetFolder(params); case "update_folder": return handleUpdateFolder(params); case "delete_folder": return handleDeleteFolder(params); default: throw new Error(`Unknown tool: ${name}`); } }); server.setRequestHandler(ListPromptsRequestSchema, async () => { return { prompts: [] }; }); server.setRequestHandler(GetPromptRequestSchema, async () => { throw new Error("Prompt not found"); }); return server; }
  • src/server.ts:67-91 (registration)
    Server registration: includes getTasksTool in the list returned by ListToolsRequestSchema for tool discovery.
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ workspaceHierarchyTool, createTaskTool, getTaskTool, getTasksTool, updateTaskTool, moveTaskTool, duplicateTaskTool, deleteTaskTool, createBulkTasksTool, updateBulkTasksTool, moveBulkTasksTool, deleteBulkTasksTool, createListTool, createListInFolderTool, getListTool, updateListTool, deleteListTool, createFolderTool, getFolderTool, updateFolderTool, deleteFolderTool ]
  • Underlying service method implementing ClickUp API call to fetch tasks from a list with query parameters for all supported filters, returns raw ClickUpTask[]
    async getTasks(listId: string, filters: TaskFilters = {}): Promise<ClickUpTask[]> { this.logOperation('getTasks', { listId, filters }); try { return await this.makeRequest(async () => { const params = new URLSearchParams(); // Add all filters to the query parameters if (filters.include_closed) params.append('include_closed', String(filters.include_closed)); if (filters.subtasks) params.append('subtasks', String(filters.subtasks)); if (filters.page) params.append('page', String(filters.page)); if (filters.order_by) params.append('order_by', filters.order_by); if (filters.reverse) params.append('reverse', String(filters.reverse)); if (filters.statuses && filters.statuses.length > 0) { filters.statuses.forEach(status => params.append('statuses[]', status)); } if (filters.assignees && filters.assignees.length > 0) { filters.assignees.forEach(assignee => params.append('assignees[]', assignee)); } if (filters.due_date_gt) params.append('due_date_gt', String(filters.due_date_gt)); if (filters.due_date_lt) params.append('due_date_lt', String(filters.due_date_lt)); if (filters.date_created_gt) params.append('date_created_gt', String(filters.date_created_gt)); if (filters.date_created_lt) params.append('date_created_lt', String(filters.date_created_lt)); if (filters.date_updated_gt) params.append('date_updated_gt', String(filters.date_updated_gt)); if (filters.date_updated_lt) params.append('date_updated_lt', String(filters.date_updated_lt)); // Handle custom fields if present if (filters.custom_fields) { Object.entries(filters.custom_fields).forEach(([key, value]) => { params.append(`custom_fields[${key}]`, String(value)); }); } const response = await this.client.get<TasksResponse>( `/list/${listId}/task?${params.toString()}` ); return response.data.tasks; }); } catch (error) { throw this.handleError(error, `Failed to get tasks from list ${listId}`); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/windalfin/clickup-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server