@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.
- package/Dockerfile +38 -0
- package/LICENSE +21 -0
- package/README.md +470 -0
- package/build/config.js +237 -0
- package/build/index.js +87 -0
- package/build/logger.js +163 -0
- package/build/middleware/security.js +231 -0
- package/build/server.js +288 -0
- package/build/services/clickup/base.js +432 -0
- package/build/services/clickup/bulk.js +180 -0
- package/build/services/clickup/document.js +159 -0
- package/build/services/clickup/folder.js +136 -0
- package/build/services/clickup/index.js +76 -0
- package/build/services/clickup/list.js +191 -0
- package/build/services/clickup/tag.js +239 -0
- package/build/services/clickup/task/index.js +32 -0
- package/build/services/clickup/task/task-attachments.js +105 -0
- package/build/services/clickup/task/task-comments.js +114 -0
- package/build/services/clickup/task/task-core.js +604 -0
- package/build/services/clickup/task/task-custom-fields.js +107 -0
- package/build/services/clickup/task/task-search.js +986 -0
- package/build/services/clickup/task/task-service.js +104 -0
- package/build/services/clickup/task/task-tags.js +113 -0
- package/build/services/clickup/time.js +244 -0
- package/build/services/clickup/types.js +33 -0
- package/build/services/clickup/workspace.js +397 -0
- package/build/services/shared.js +61 -0
- package/build/sse_server.js +277 -0
- package/build/tools/documents.js +489 -0
- package/build/tools/folder.js +331 -0
- package/build/tools/index.js +16 -0
- package/build/tools/list.js +428 -0
- package/build/tools/member.js +106 -0
- package/build/tools/tag.js +833 -0
- package/build/tools/task/attachments.js +357 -0
- package/build/tools/task/attachments.types.js +9 -0
- package/build/tools/task/bulk-operations.js +338 -0
- package/build/tools/task/handlers.js +919 -0
- package/build/tools/task/index.js +30 -0
- package/build/tools/task/main.js +233 -0
- package/build/tools/task/single-operations.js +469 -0
- package/build/tools/task/time-tracking.js +575 -0
- package/build/tools/task/utilities.js +310 -0
- package/build/tools/task/workspace-operations.js +258 -0
- package/build/tools/tool-enhancer.js +37 -0
- package/build/tools/utils.js +12 -0
- package/build/tools/workspace-helper.js +44 -0
- package/build/tools/workspace.js +73 -0
- package/build/utils/color-processor.js +183 -0
- package/build/utils/concurrency-utils.js +248 -0
- package/build/utils/date-utils.js +542 -0
- package/build/utils/resolver-utils.js +135 -0
- package/build/utils/sponsor-service.js +93 -0
- package/build/utils/token-utils.js +49 -0
- package/package.json +77 -0
- 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
|
+
];
|