@taazkareem/clickup-mcp-server 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +14 -23
  2. package/build/config.js +34 -2
  3. package/build/index.js +3 -0
  4. package/build/logger.js +8 -38
  5. package/build/mcp-tools.js +64 -0
  6. package/build/server-state.js +93 -0
  7. package/build/server.js +33 -8
  8. package/build/server.log +0 -0
  9. package/build/services/clickup/base.js +3 -0
  10. package/build/services/clickup/bulk.js +3 -0
  11. package/build/services/clickup/folder.js +3 -0
  12. package/build/services/clickup/index.js +9 -1
  13. package/build/services/clickup/list.js +3 -0
  14. package/build/services/clickup/tag.js +190 -0
  15. package/build/services/clickup/task.js +138 -0
  16. package/build/services/clickup/types.js +3 -0
  17. package/build/services/clickup/workspace.js +3 -0
  18. package/build/services/shared.js +3 -0
  19. package/build/tools/bulk-tasks.js +36 -0
  20. package/build/tools/debug.js +76 -0
  21. package/build/tools/folder.js +3 -0
  22. package/build/tools/index.js +4 -0
  23. package/build/tools/list.js +3 -0
  24. package/build/tools/logs.js +55 -0
  25. package/build/tools/tag.js +824 -0
  26. package/build/tools/task/attachments.js +3 -0
  27. package/build/tools/task/bulk-operations.js +10 -0
  28. package/build/tools/task/handlers.js +61 -2
  29. package/build/tools/task/index.js +8 -1
  30. package/build/tools/task/main.js +18 -2
  31. package/build/tools/task/single-operations.js +10 -0
  32. package/build/tools/task/utilities.js +40 -3
  33. package/build/tools/task/workspace-operations.js +222 -0
  34. package/build/tools/task.js +1554 -0
  35. package/build/tools/utils.js +3 -0
  36. package/build/tools/workspace.js +3 -0
  37. package/build/utils/color-processor.js +183 -0
  38. package/build/utils/concurrency-utils.js +3 -0
  39. package/build/utils/date-utils.js +3 -0
  40. package/build/utils/params-utils.js +39 -0
  41. package/build/utils/resolver-utils.js +3 -0
  42. package/build/utils/sponsor-analytics.js +100 -0
  43. package/build/utils/sponsor-service.js +3 -0
  44. package/build/utils/sponsor-utils.js +57 -0
  45. package/build/utils/token-utils.js +49 -0
  46. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Task Attachment Tool
3
6
  *
4
7
  * This module implements a tool for attaching files to ClickUp tasks
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Bulk Task Operations
3
6
  *
4
7
  * This module defines tools for bulk task operations including creating,
@@ -124,6 +127,13 @@ Notes:
124
127
  dueDate: {
125
128
  type: "string",
126
129
  description: "Due date. Supports Unix timestamps (in milliseconds) and natural language expressions like '1 hour from now', 'tomorrow', 'next week', etc."
130
+ },
131
+ tags: {
132
+ type: "array",
133
+ items: {
134
+ type: "string"
135
+ },
136
+ description: "Optional array of tag names to assign to the task. The tags must already exist in the space."
127
137
  }
128
138
  },
129
139
  required: ["name"]
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Task Operation Handlers
3
6
  *
4
7
  * This module implements the handlers for task operations, both for single task
@@ -83,7 +86,7 @@ async function mapTaskIds(tasks) {
83
86
  * Handler for creating a task
84
87
  */
85
88
  export async function createTaskHandler(params) {
86
- const { name, description, markdown_description, status, dueDate, parent } = params;
89
+ const { name, description, markdown_description, status, dueDate, parent, tags } = params;
87
90
  if (!name)
88
91
  throw new Error("Task name is required");
89
92
  // Use our helper function to validate and convert priority
@@ -96,7 +99,8 @@ export async function createTaskHandler(params) {
96
99
  status,
97
100
  priority,
98
101
  due_date: dueDate ? parseDueDate(dueDate) : undefined,
99
- parent
102
+ parent,
103
+ tags
100
104
  });
101
105
  }
102
106
  /**
@@ -185,6 +189,61 @@ export async function createTaskCommentHandler(params) {
185
189
  throw error;
186
190
  }
187
191
  }
192
+ /**
193
+ * Handler for getting workspace tasks with filtering
194
+ */
195
+ export async function getWorkspaceTasksHandler(taskService, params) {
196
+ try {
197
+ // Require at least one filter parameter
198
+ const hasFilter = [
199
+ 'tags',
200
+ 'list_ids',
201
+ 'folder_ids',
202
+ 'space_ids',
203
+ 'statuses',
204
+ 'assignees',
205
+ 'date_created_gt',
206
+ 'date_created_lt',
207
+ 'date_updated_gt',
208
+ 'date_updated_lt',
209
+ 'due_date_gt',
210
+ 'due_date_lt'
211
+ ].some(key => params[key] !== undefined);
212
+ if (!hasFilter) {
213
+ throw new Error('At least one filter parameter is required (tags, list_ids, folder_ids, space_ids, statuses, assignees, or date filters)');
214
+ }
215
+ // Create filter object from parameters
216
+ const filters = {
217
+ tags: params.tags,
218
+ list_ids: params.list_ids,
219
+ folder_ids: params.folder_ids,
220
+ space_ids: params.space_ids,
221
+ statuses: params.statuses,
222
+ include_closed: params.include_closed,
223
+ include_archived_lists: params.include_archived_lists,
224
+ include_closed_lists: params.include_closed_lists,
225
+ archived: params.archived,
226
+ order_by: params.order_by,
227
+ reverse: params.reverse,
228
+ due_date_gt: params.due_date_gt,
229
+ due_date_lt: params.due_date_lt,
230
+ date_created_gt: params.date_created_gt,
231
+ date_created_lt: params.date_created_lt,
232
+ date_updated_gt: params.date_updated_gt,
233
+ date_updated_lt: params.date_updated_lt,
234
+ assignees: params.assignees,
235
+ page: params.page,
236
+ detail_level: params.detail_level || 'detailed'
237
+ };
238
+ // Get tasks with adaptive response format support
239
+ const response = await taskService.getWorkspaceTasks(filters);
240
+ // Return the response without adding the redundant _note field
241
+ return response;
242
+ }
243
+ catch (error) {
244
+ throw new Error(`Failed to get workspace tasks: ${error.message}`);
245
+ }
246
+ }
188
247
  //=============================================================================
189
248
  // BULK TASK OPERATIONS
190
249
  //=============================================================================
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Task Tools
3
6
  *
4
7
  * This module re-exports all task-related tools and handlers.
@@ -9,6 +12,8 @@ export * from './main.js';
9
12
  export { createTaskTool, getTaskTool, getTasksTool, updateTaskTool, moveTaskTool, duplicateTaskTool, deleteTaskTool, getTaskCommentsTool, createTaskCommentTool } from './single-operations.js';
10
13
  // Re-export bulk task operation tools
11
14
  export { createBulkTasksTool, updateBulkTasksTool, moveBulkTasksTool, deleteBulkTasksTool } from './bulk-operations.js';
15
+ // Re-export workspace task operation tools
16
+ export { getWorkspaceTasksTool } from './workspace-operations.js';
12
17
  // Re-export attachment tool
13
18
  export { attachTaskFileTool, handleAttachTaskFile } from './attachments.js';
14
19
  // Re-export handlers
@@ -16,6 +21,8 @@ export {
16
21
  // Single task operation handlers
17
22
  createTaskHandler, getTaskHandler, getTasksHandler, updateTaskHandler, moveTaskHandler, duplicateTaskHandler, deleteTaskHandler, getTaskCommentsHandler, createTaskCommentHandler,
18
23
  // Bulk task operation handlers
19
- createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler } from './handlers.js';
24
+ createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler,
25
+ // Team task operation handlers
26
+ getWorkspaceTasksHandler } from './handlers.js';
20
27
  // Re-export utilities
21
28
  export { formatTaskData, validateTaskIdentification, validateListIdentification, validateTaskUpdateData, validateBulkTasks, parseBulkOptions, resolveTaskIdWithValidation, resolveListIdWithValidation } from './utilities.js';
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Task Tools
3
6
  *
4
7
  * This is the main task module that connects tool definitions to their handlers.
@@ -8,8 +11,12 @@ import { sponsorService } from '../../utils/sponsor-service.js';
8
11
  // Import tool definitions
9
12
  import { createTaskTool, getTaskTool, getTasksTool, updateTaskTool, moveTaskTool, duplicateTaskTool, deleteTaskTool, getTaskCommentsTool, createTaskCommentTool } from './single-operations.js';
10
13
  import { createBulkTasksTool, updateBulkTasksTool, moveBulkTasksTool, deleteBulkTasksTool } from './bulk-operations.js';
14
+ import { getWorkspaceTasksTool } from './workspace-operations.js';
11
15
  // Import handlers
12
- import { createTaskHandler, getTaskHandler, getTasksHandler, updateTaskHandler, moveTaskHandler, duplicateTaskHandler, deleteTaskHandler, getTaskCommentsHandler, createTaskCommentHandler, createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler } from './handlers.js';
16
+ import { createTaskHandler, getTaskHandler, getTasksHandler, updateTaskHandler, moveTaskHandler, duplicateTaskHandler, deleteTaskHandler, getTaskCommentsHandler, createTaskCommentHandler, createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler, getWorkspaceTasksHandler } from './handlers.js';
17
+ // Import shared services
18
+ import { clickUpServices } from '../../services/shared.js';
19
+ const { task: taskService } = clickUpServices;
13
20
  //=============================================================================
14
21
  // HANDLER WRAPPER UTILITY
15
22
  //=============================================================================
@@ -76,6 +83,13 @@ export const handleDeleteBulkTasks = createHandlerWrapper(deleteBulkTasksHandler
76
83
  results
77
84
  }));
78
85
  //=============================================================================
86
+ // WORKSPACE TASK OPERATIONS - HANDLER IMPLEMENTATIONS
87
+ //=============================================================================
88
+ export const handleGetWorkspaceTasks = createHandlerWrapper(
89
+ // This adapts the new handler signature to match what createHandlerWrapper expects
90
+ (params) => getWorkspaceTasksHandler(taskService, params), (response) => response // Pass through the response as is
91
+ );
92
+ //=============================================================================
79
93
  // TOOL DEFINITIONS AND HANDLERS EXPORT
80
94
  //=============================================================================
81
95
  // Tool definitions with their handler mappings
@@ -94,5 +108,7 @@ export const taskTools = [
94
108
  { definition: createBulkTasksTool, handler: handleCreateBulkTasks },
95
109
  { definition: updateBulkTasksTool, handler: handleUpdateBulkTasks },
96
110
  { definition: moveBulkTasksTool, handler: handleMoveBulkTasks },
97
- { definition: deleteBulkTasksTool, handler: handleDeleteBulkTasks }
111
+ { definition: deleteBulkTasksTool, handler: handleDeleteBulkTasks },
112
+ // Team task operations
113
+ { definition: getWorkspaceTasksTool, handler: handleGetWorkspaceTasks }
98
114
  ];
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Single Task Operations
3
6
  *
4
7
  * This module defines tools for single task operations including creating,
@@ -97,6 +100,13 @@ Notes:
97
100
  parent: {
98
101
  type: "string",
99
102
  description: "Optional ID of the parent task. When specified, this task will be created as a subtask of the specified parent task."
103
+ },
104
+ tags: {
105
+ type: "array",
106
+ items: {
107
+ type: "string"
108
+ },
109
+ description: "Optional array of tag names to assign to the task. The tags must already exist in the space."
100
110
  }
101
111
  }
102
112
  }
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
2
5
  * ClickUp MCP Task Utilities
3
6
  *
4
7
  * This module provides utility functions for task-related operations including
@@ -17,13 +20,47 @@ const { workspace: workspaceService } = clickUpServices;
17
20
  export function formatTaskData(task, additional = {}) {
18
21
  return {
19
22
  id: task.id,
23
+ custom_id: task.custom_id,
20
24
  name: task.name,
25
+ text_content: task.text_content,
26
+ description: task.description,
21
27
  url: task.url,
22
28
  status: task.status?.status || "Unknown",
29
+ status_color: task.status?.color,
30
+ orderindex: task.orderindex,
31
+ date_created: task.date_created,
32
+ date_updated: task.date_updated,
33
+ date_closed: task.date_closed,
34
+ creator: task.creator,
35
+ assignees: task.assignees,
36
+ watchers: task.watchers,
37
+ checklists: task.checklists,
38
+ tags: task.tags,
39
+ parent: task.parent,
40
+ priority: task.priority,
23
41
  due_date: task.due_date ? formatDueDate(Number(task.due_date)) : undefined,
24
- list: task.list.name,
25
- space: task.space.name,
26
- folder: task.folder?.name,
42
+ start_date: task.start_date,
43
+ time_estimate: task.time_estimate,
44
+ time_spent: task.time_spent,
45
+ custom_fields: task.custom_fields,
46
+ dependencies: task.dependencies,
47
+ linked_tasks: task.linked_tasks,
48
+ team_id: task.team_id,
49
+ list: {
50
+ id: task.list.id,
51
+ name: task.list.name,
52
+ access: task.list.access
53
+ },
54
+ folder: task.folder ? {
55
+ id: task.folder.id,
56
+ name: task.folder.name,
57
+ hidden: task.folder.hidden,
58
+ access: task.folder.access
59
+ } : null,
60
+ space: {
61
+ id: task.space.id,
62
+ name: task.space.name
63
+ },
27
64
  ...additional
28
65
  };
29
66
  }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * ClickUp MCP Workspace Task Operations
6
+ *
7
+ * This module defines tools for workspace-wide task operations, including
8
+ * filtering tasks across the entire workspace with tag-based filtering.
9
+ */
10
+ /**
11
+ * Tool definition for getting workspace tasks
12
+ */
13
+ export const getWorkspaceTasksTool = {
14
+ name: "get_workspace_tasks",
15
+ description: `Purpose: Retrieve tasks from across the entire workspace with powerful filtering options, including tag-based filtering.
16
+
17
+ Valid Usage:
18
+ 1. Apply any combination of filters (tags, lists, folders, spaces, statuses, etc.)
19
+ 2. Use pagination to manage large result sets
20
+
21
+ Requirements:
22
+ - At least one filter parameter is REQUIRED (tags, list_ids, folder_ids, space_ids, statuses, assignees, or date filters)
23
+ - Pagination parameters (page, order_by, reverse) alone are not considered filters
24
+
25
+ Notes:
26
+ - Provides workspace-wide task access (unlike get_tasks which only searches in one list)
27
+ - Returns complete task details including descriptions, assignees, custom fields, and all metadata
28
+ - Tag filtering is especially useful for cross-list organization (e.g., "project-x", "blocker", "needs-review")
29
+ - Combine multiple filters to narrow down your search scope
30
+ - Use pagination for large result sets
31
+ - Use the detail_level parameter to control the amount of data returned:
32
+ - "summary": Returns lightweight task data (name, status, list, tags)
33
+ - "detailed": Returns complete task data with all fields (DEFAULT if not specified)
34
+ - Responses exceeding 50,000 tokens automatically switch to summary format to avoid hitting LLM token limits
35
+ `,
36
+ parameters: {
37
+ type: 'object',
38
+ properties: {
39
+ tags: {
40
+ type: 'array',
41
+ items: { type: 'string' },
42
+ description: 'Filter tasks by tag names. Only tasks with ALL specified tags will be returned.'
43
+ },
44
+ list_ids: {
45
+ type: 'array',
46
+ items: { type: 'string' },
47
+ description: 'Filter tasks by list IDs. Narrows the search to specific lists.'
48
+ },
49
+ folder_ids: {
50
+ type: 'array',
51
+ items: { type: 'string' },
52
+ description: 'Filter tasks by folder IDs. Narrows the search to specific folders.'
53
+ },
54
+ space_ids: {
55
+ type: 'array',
56
+ items: { type: 'string' },
57
+ description: 'Filter tasks by space IDs. Narrows the search to specific spaces.'
58
+ },
59
+ statuses: {
60
+ type: 'array',
61
+ items: { type: 'string' },
62
+ description: 'Filter tasks by status names (e.g., [\'To Do\', \'In Progress\']).'
63
+ },
64
+ assignees: {
65
+ type: 'array',
66
+ items: { type: 'string' },
67
+ description: 'Filter tasks by assignee IDs.'
68
+ },
69
+ date_created_gt: {
70
+ type: 'number',
71
+ description: 'Filter for tasks created after this timestamp.'
72
+ },
73
+ date_created_lt: {
74
+ type: 'number',
75
+ description: 'Filter for tasks created before this timestamp.'
76
+ },
77
+ date_updated_gt: {
78
+ type: 'number',
79
+ description: 'Filter for tasks updated after this timestamp.'
80
+ },
81
+ date_updated_lt: {
82
+ type: 'number',
83
+ description: 'Filter for tasks updated before this timestamp.'
84
+ },
85
+ due_date_gt: {
86
+ type: 'number',
87
+ description: 'Filter for tasks with due date greater than this timestamp.'
88
+ },
89
+ due_date_lt: {
90
+ type: 'number',
91
+ description: 'Filter for tasks with due date less than this timestamp.'
92
+ },
93
+ include_closed: {
94
+ type: 'boolean',
95
+ description: 'Include closed tasks in the results.'
96
+ },
97
+ include_archived_lists: {
98
+ type: 'boolean',
99
+ description: 'Include tasks from archived lists.'
100
+ },
101
+ include_closed_lists: {
102
+ type: 'boolean',
103
+ description: 'Include tasks from closed lists.'
104
+ },
105
+ archived: {
106
+ type: 'boolean',
107
+ description: 'Include archived tasks in the results.'
108
+ },
109
+ order_by: {
110
+ type: 'string',
111
+ enum: ['id', 'created', 'updated', 'due_date'],
112
+ description: 'Sort field for ordering results.'
113
+ },
114
+ reverse: {
115
+ type: 'boolean',
116
+ description: 'Reverse sort order (descending).'
117
+ },
118
+ page: {
119
+ type: 'number',
120
+ description: 'Page number for pagination (0-based).'
121
+ },
122
+ detail_level: {
123
+ type: 'string',
124
+ enum: ['summary', 'detailed'],
125
+ description: 'Level of detail to return. Use summary for lightweight responses or detailed for full task data. If not specified, defaults to "detailed".'
126
+ }
127
+ }
128
+ },
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ tags: {
133
+ type: 'array',
134
+ items: { type: 'string' },
135
+ description: 'Filter tasks by tag names. Only tasks with ALL specified tags will be returned.'
136
+ },
137
+ list_ids: {
138
+ type: 'array',
139
+ items: { type: 'string' },
140
+ description: 'Filter tasks by list IDs. Narrows the search to specific lists.'
141
+ },
142
+ folder_ids: {
143
+ type: 'array',
144
+ items: { type: 'string' },
145
+ description: 'Filter tasks by folder IDs. Narrows the search to specific folders.'
146
+ },
147
+ space_ids: {
148
+ type: 'array',
149
+ items: { type: 'string' },
150
+ description: 'Filter tasks by space IDs. Narrows the search to specific spaces.'
151
+ },
152
+ statuses: {
153
+ type: 'array',
154
+ items: { type: 'string' },
155
+ description: 'Filter tasks by status names (e.g., [\'To Do\', \'In Progress\']).'
156
+ },
157
+ assignees: {
158
+ type: 'array',
159
+ items: { type: 'string' },
160
+ description: 'Filter tasks by assignee IDs.'
161
+ },
162
+ date_created_gt: {
163
+ type: 'number',
164
+ description: 'Filter for tasks created after this timestamp.'
165
+ },
166
+ date_created_lt: {
167
+ type: 'number',
168
+ description: 'Filter for tasks created before this timestamp.'
169
+ },
170
+ date_updated_gt: {
171
+ type: 'number',
172
+ description: 'Filter for tasks updated after this timestamp.'
173
+ },
174
+ date_updated_lt: {
175
+ type: 'number',
176
+ description: 'Filter for tasks updated before this timestamp.'
177
+ },
178
+ due_date_gt: {
179
+ type: 'number',
180
+ description: 'Filter for tasks with due date greater than this timestamp.'
181
+ },
182
+ due_date_lt: {
183
+ type: 'number',
184
+ description: 'Filter for tasks with due date less than this timestamp.'
185
+ },
186
+ include_closed: {
187
+ type: 'boolean',
188
+ description: 'Include closed tasks in the results.'
189
+ },
190
+ include_archived_lists: {
191
+ type: 'boolean',
192
+ description: 'Include tasks from archived lists.'
193
+ },
194
+ include_closed_lists: {
195
+ type: 'boolean',
196
+ description: 'Include tasks from closed lists.'
197
+ },
198
+ archived: {
199
+ type: 'boolean',
200
+ description: 'Include archived tasks in the results.'
201
+ },
202
+ order_by: {
203
+ type: 'string',
204
+ enum: ['id', 'created', 'updated', 'due_date'],
205
+ description: 'Sort field for ordering results.'
206
+ },
207
+ reverse: {
208
+ type: 'boolean',
209
+ description: 'Reverse sort order (descending).'
210
+ },
211
+ page: {
212
+ type: 'number',
213
+ description: 'Page number for pagination (0-based).'
214
+ },
215
+ detail_level: {
216
+ type: 'string',
217
+ enum: ['summary', 'detailed'],
218
+ description: 'Level of detail to return. Use summary for lightweight responses or detailed for full task data. If not specified, defaults to "detailed".'
219
+ }
220
+ }
221
+ }
222
+ };