@alanse/clickup-multi-mcp-server 1.0.0

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 (56) hide show
  1. package/Dockerfile +38 -0
  2. package/LICENSE +21 -0
  3. package/README.md +470 -0
  4. package/build/config.js +237 -0
  5. package/build/index.js +87 -0
  6. package/build/logger.js +163 -0
  7. package/build/middleware/security.js +231 -0
  8. package/build/server.js +288 -0
  9. package/build/services/clickup/base.js +432 -0
  10. package/build/services/clickup/bulk.js +180 -0
  11. package/build/services/clickup/document.js +159 -0
  12. package/build/services/clickup/folder.js +136 -0
  13. package/build/services/clickup/index.js +76 -0
  14. package/build/services/clickup/list.js +191 -0
  15. package/build/services/clickup/tag.js +239 -0
  16. package/build/services/clickup/task/index.js +32 -0
  17. package/build/services/clickup/task/task-attachments.js +105 -0
  18. package/build/services/clickup/task/task-comments.js +114 -0
  19. package/build/services/clickup/task/task-core.js +604 -0
  20. package/build/services/clickup/task/task-custom-fields.js +107 -0
  21. package/build/services/clickup/task/task-search.js +986 -0
  22. package/build/services/clickup/task/task-service.js +104 -0
  23. package/build/services/clickup/task/task-tags.js +113 -0
  24. package/build/services/clickup/time.js +244 -0
  25. package/build/services/clickup/types.js +33 -0
  26. package/build/services/clickup/workspace.js +397 -0
  27. package/build/services/shared.js +61 -0
  28. package/build/sse_server.js +277 -0
  29. package/build/tools/documents.js +489 -0
  30. package/build/tools/folder.js +331 -0
  31. package/build/tools/index.js +16 -0
  32. package/build/tools/list.js +428 -0
  33. package/build/tools/member.js +106 -0
  34. package/build/tools/tag.js +833 -0
  35. package/build/tools/task/attachments.js +357 -0
  36. package/build/tools/task/attachments.types.js +9 -0
  37. package/build/tools/task/bulk-operations.js +338 -0
  38. package/build/tools/task/handlers.js +919 -0
  39. package/build/tools/task/index.js +30 -0
  40. package/build/tools/task/main.js +233 -0
  41. package/build/tools/task/single-operations.js +469 -0
  42. package/build/tools/task/time-tracking.js +575 -0
  43. package/build/tools/task/utilities.js +310 -0
  44. package/build/tools/task/workspace-operations.js +258 -0
  45. package/build/tools/tool-enhancer.js +37 -0
  46. package/build/tools/utils.js +12 -0
  47. package/build/tools/workspace-helper.js +44 -0
  48. package/build/tools/workspace.js +73 -0
  49. package/build/utils/color-processor.js +183 -0
  50. package/build/utils/concurrency-utils.js +248 -0
  51. package/build/utils/date-utils.js +542 -0
  52. package/build/utils/resolver-utils.js +135 -0
  53. package/build/utils/sponsor-service.js +93 -0
  54. package/build/utils/token-utils.js +49 -0
  55. package/package.json +77 -0
  56. package/smithery.yaml +23 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * ClickUp MCP Task Tools
6
+ *
7
+ * This module re-exports all task-related tools and handlers.
8
+ */
9
+ // Re-export from main module
10
+ export * from './main.js';
11
+ // Re-export single task operation tools
12
+ export { createTaskTool, getTaskTool, getTasksTool, updateTaskTool, moveTaskTool, duplicateTaskTool, deleteTaskTool, getTaskCommentsTool, createTaskCommentTool } from './single-operations.js';
13
+ // Re-export bulk task operation tools
14
+ export { createBulkTasksTool, updateBulkTasksTool, moveBulkTasksTool, deleteBulkTasksTool } from './bulk-operations.js';
15
+ // Re-export workspace task operation tools
16
+ export { getWorkspaceTasksTool } from './workspace-operations.js';
17
+ // Re-export time tracking tools and handlers
18
+ export { getTaskTimeEntriesTool, startTimeTrackingTool, stopTimeTrackingTool, addTimeEntryTool, deleteTimeEntryTool, getCurrentTimeEntryTool, handleGetTaskTimeEntries, handleStartTimeTracking, handleStopTimeTracking, handleAddTimeEntry, handleDeleteTimeEntry, handleGetCurrentTimeEntry, timeTrackingTools, timeTrackingHandlers } from './time-tracking.js';
19
+ // Re-export attachment tool
20
+ export { attachTaskFileTool, handleAttachTaskFile } from './attachments.js';
21
+ // Re-export handlers
22
+ export {
23
+ // Single task operation handlers
24
+ createTaskHandler, getTaskHandler, getTasksHandler, updateTaskHandler, moveTaskHandler, duplicateTaskHandler, deleteTaskHandler, getTaskCommentsHandler, createTaskCommentHandler,
25
+ // Bulk task operation handlers
26
+ createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler,
27
+ // Team task operation handlers
28
+ getWorkspaceTasksHandler } from './handlers.js';
29
+ // Re-export utilities
30
+ export { formatTaskData, validateTaskIdentification, validateListIdentification, validateTaskUpdateData, validateBulkTasks, parseBulkOptions, resolveListIdWithValidation } from './utilities.js';
@@ -0,0 +1,233 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: © 2025 Talib Kareem <taazkareem@icloud.com>
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * ClickUp MCP Task Tools
6
+ *
7
+ * This is the main task module that connects tool definitions to their handlers.
8
+ * The actual implementations are organized in sub-modules for better maintainability.
9
+ */
10
+ import { sponsorService } from '../../utils/sponsor-service.js';
11
+ // Import tool definitions
12
+ import { createTaskTool, getTaskTool, getTasksTool, updateTaskTool, moveTaskTool, duplicateTaskTool, deleteTaskTool, getTaskCommentsTool, createTaskCommentTool } from './single-operations.js';
13
+ import { createBulkTasksTool, updateBulkTasksTool, moveBulkTasksTool, deleteBulkTasksTool } from './bulk-operations.js';
14
+ import { getWorkspaceTasksTool } from './workspace-operations.js';
15
+ // Add this to your import statements at the top of the file
16
+ import { getWorkspaceMembersTool, findMemberByNameTool, resolveAssigneesTool, handleGetWorkspaceMembers, handleFindMemberByName, handleResolveAssignees } from '../member.js'; // Adjust the path as needed - it should point to where member.ts is located
17
+ // Import handlers
18
+ import { createTaskHandler, getTaskHandler, getTasksHandler, updateTaskHandler, moveTaskHandler, duplicateTaskHandler, deleteTaskHandler, getTaskCommentsHandler, createTaskCommentHandler, createBulkTasksHandler, updateBulkTasksHandler, moveBulkTasksHandler, deleteBulkTasksHandler, getWorkspaceTasksHandler, formatTaskData } from './index.js';
19
+ // Import shared services
20
+ import { clickUpServices } from '../../services/shared.js';
21
+ const { task: taskService } = clickUpServices;
22
+ //=============================================================================
23
+ // HANDLER WRAPPER UTILITY
24
+ //=============================================================================
25
+ /**
26
+ * Creates a wrapped handler function with standard error handling and response formatting
27
+ */
28
+ function createHandlerWrapper(handler, formatResponse = (result) => result) {
29
+ return async (parameters) => {
30
+ try {
31
+ const result = await handler(parameters);
32
+ return sponsorService.createResponse(formatResponse(result), true);
33
+ }
34
+ catch (error) {
35
+ return sponsorService.createErrorResponse(error, parameters);
36
+ }
37
+ };
38
+ }
39
+ //=============================================================================
40
+ // SINGLE TASK OPERATIONS - HANDLER IMPLEMENTATIONS
41
+ //=============================================================================
42
+ export const handleCreateTask = createHandlerWrapper(createTaskHandler);
43
+ export const handleGetTask = createHandlerWrapper(getTaskHandler);
44
+ export const handleGetTasks = createHandlerWrapper(getTasksHandler, (tasks) => ({
45
+ tasks,
46
+ count: tasks.length
47
+ }));
48
+ /**
49
+ * Handle task update operation
50
+ */
51
+ export async function handleUpdateTask(parameters) {
52
+ try {
53
+ const result = await updateTaskHandler(taskService, parameters);
54
+ return sponsorService.createResponse(formatTaskData(result), true);
55
+ }
56
+ catch (error) {
57
+ return sponsorService.createErrorResponse(error instanceof Error ? error.message : String(error));
58
+ }
59
+ }
60
+ export const handleMoveTask = createHandlerWrapper(moveTaskHandler);
61
+ export const handleDuplicateTask = createHandlerWrapper(duplicateTaskHandler);
62
+ export const handleDeleteTask = createHandlerWrapper(deleteTaskHandler, () => ({
63
+ success: true,
64
+ message: "Task deleted successfully"
65
+ }));
66
+ export const handleGetTaskComments = createHandlerWrapper(getTaskCommentsHandler, (comments) => ({
67
+ comments,
68
+ count: comments.length
69
+ }));
70
+ export const handleCreateTaskComment = createHandlerWrapper(createTaskCommentHandler, (comment) => ({
71
+ success: true,
72
+ message: "Comment added successfully",
73
+ comment: comment && typeof comment === 'object' ? comment : {
74
+ id: `generated-${Date.now()}`,
75
+ comment_text: typeof comment === 'string' ? comment : "Comment text unavailable"
76
+ }
77
+ }));
78
+ //=============================================================================
79
+ // BULK TASK OPERATIONS - HANDLER IMPLEMENTATIONS
80
+ //=============================================================================
81
+ export const handleCreateBulkTasks = createHandlerWrapper(createBulkTasksHandler, (result) => ({
82
+ successful: result.successful,
83
+ failed: result.failed,
84
+ count: result.totals.total,
85
+ success_count: result.totals.success,
86
+ failure_count: result.totals.failure,
87
+ errors: result.failed.map(f => f.error)
88
+ }));
89
+ export const handleUpdateBulkTasks = createHandlerWrapper(updateBulkTasksHandler, (result) => ({
90
+ successful: result.successful,
91
+ failed: result.failed,
92
+ count: result.totals.total,
93
+ success_count: result.totals.success,
94
+ failure_count: result.totals.failure,
95
+ errors: result.failed.map(f => f.error)
96
+ }));
97
+ export const handleMoveBulkTasks = createHandlerWrapper(moveBulkTasksHandler, (result) => ({
98
+ successful: result.successful,
99
+ failed: result.failed,
100
+ count: result.totals.total,
101
+ success_count: result.totals.success,
102
+ failure_count: result.totals.failure,
103
+ errors: result.failed.map(f => f.error)
104
+ }));
105
+ export const handleDeleteBulkTasks = createHandlerWrapper(deleteBulkTasksHandler, (result) => ({
106
+ successful: result.successful,
107
+ failed: result.failed,
108
+ count: result.totals.total,
109
+ success_count: result.totals.success,
110
+ failure_count: result.totals.failure,
111
+ errors: result.failed.map(f => f.error)
112
+ }));
113
+ //=============================================================================
114
+ // WORKSPACE TASK OPERATIONS - HANDLER IMPLEMENTATIONS
115
+ //=============================================================================
116
+ export const handleGetWorkspaceTasks = createHandlerWrapper(
117
+ // This adapts the new handler signature to match what createHandlerWrapper expects
118
+ (params) => getWorkspaceTasksHandler(taskService, params), (response) => response // Pass through the response as is
119
+ );
120
+ //=============================================================================
121
+ // TOOL DEFINITIONS AND HANDLERS EXPORT
122
+ //=============================================================================
123
+ // Tool definitions with their handler mappings
124
+ export const tools = [
125
+ {
126
+ definition: createTaskTool,
127
+ handler: createTaskHandler
128
+ },
129
+ {
130
+ definition: updateTaskTool,
131
+ handler: updateTaskHandler
132
+ },
133
+ {
134
+ definition: moveTaskTool,
135
+ handler: moveTaskHandler
136
+ },
137
+ {
138
+ definition: duplicateTaskTool,
139
+ handler: duplicateTaskHandler
140
+ },
141
+ {
142
+ definition: getTaskTool,
143
+ handler: getTaskHandler
144
+ },
145
+ {
146
+ definition: getTasksTool,
147
+ handler: getTasksHandler
148
+ },
149
+ {
150
+ definition: getTaskCommentsTool,
151
+ handler: getTaskCommentsHandler
152
+ },
153
+ {
154
+ definition: createTaskCommentTool,
155
+ handler: createTaskCommentHandler
156
+ },
157
+ {
158
+ definition: deleteTaskTool,
159
+ handler: deleteTaskHandler
160
+ },
161
+ {
162
+ definition: getWorkspaceTasksTool,
163
+ handler: getWorkspaceTasksHandler
164
+ },
165
+ {
166
+ definition: createBulkTasksTool,
167
+ handler: async (params) => {
168
+ const result = await createBulkTasksHandler(params);
169
+ return {
170
+ successful: result.successful,
171
+ failed: result.failed,
172
+ count: result.totals.total,
173
+ success_count: result.totals.success,
174
+ failure_count: result.totals.failure,
175
+ errors: result.failed.map(f => f.error)
176
+ };
177
+ }
178
+ },
179
+ {
180
+ definition: updateBulkTasksTool,
181
+ handler: async (params) => {
182
+ const result = await updateBulkTasksHandler(params);
183
+ return {
184
+ successful: result.successful,
185
+ failed: result.failed,
186
+ count: result.totals.total,
187
+ success_count: result.totals.success,
188
+ failure_count: result.totals.failure,
189
+ errors: result.failed.map(f => f.error)
190
+ };
191
+ }
192
+ },
193
+ {
194
+ definition: moveBulkTasksTool,
195
+ handler: async (params) => {
196
+ const result = await moveBulkTasksHandler(params);
197
+ return {
198
+ successful: result.successful,
199
+ failed: result.failed,
200
+ count: result.totals.total,
201
+ success_count: result.totals.success,
202
+ failure_count: result.totals.failure,
203
+ errors: result.failed.map(f => f.error)
204
+ };
205
+ }
206
+ },
207
+ {
208
+ definition: deleteBulkTasksTool,
209
+ handler: async (params) => {
210
+ const result = await deleteBulkTasksHandler(params);
211
+ return {
212
+ successful: result.successful,
213
+ failed: result.failed,
214
+ count: result.totals.total,
215
+ success_count: result.totals.success,
216
+ failure_count: result.totals.failure,
217
+ errors: result.failed.map(f => f.error)
218
+ };
219
+ }
220
+ },
221
+ {
222
+ definition: getWorkspaceMembersTool,
223
+ handler: handleGetWorkspaceMembers
224
+ },
225
+ {
226
+ definition: findMemberByNameTool,
227
+ handler: handleFindMemberByName
228
+ },
229
+ {
230
+ definition: resolveAssigneesTool,
231
+ handler: handleResolveAssignees
232
+ }
233
+ ];