@taazkareem/clickup-mcp-server 0.4.73 → 0.4.75
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/README.md +4 -0
- package/build/server.js +1 -1
- package/build/server.log +101 -31
- package/build/services/clickup/task.js +26 -0
- package/build/tools/folder.js +87 -58
- package/build/tools/list.js +123 -86
- package/build/tools/task/bulk-operations.js +69 -5
- package/build/tools/task/handlers.js +7 -6
- package/build/tools/task/single-operations.js +112 -14
- package/build/tools/task/utilities.js +72 -11
- package/build/tools/workspace.js +46 -32
- package/build/utils/sponsor-service.js +24 -5
- package/package.json +1 -1
package/build/tools/list.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { clickUpServices } from '../services/shared.js';
|
|
9
9
|
import config from '../config.js';
|
|
10
|
+
import { sponsorService } from '../utils/sponsor-service.js';
|
|
10
11
|
// Use shared services instance
|
|
11
12
|
const { list: listService, workspace: workspaceService } = clickUpServices;
|
|
12
13
|
/**
|
|
@@ -14,7 +15,19 @@ const { list: listService, workspace: workspaceService } = clickUpServices;
|
|
|
14
15
|
*/
|
|
15
16
|
export const createListTool = {
|
|
16
17
|
name: "create_list",
|
|
17
|
-
description:
|
|
18
|
+
description: `Purpose: Create a new list directly in a ClickUp space (not in a folder).
|
|
19
|
+
|
|
20
|
+
Valid Usage:
|
|
21
|
+
1. Provide spaceId + list name (preferred)
|
|
22
|
+
2. Provide spaceName + list name
|
|
23
|
+
|
|
24
|
+
Requirements:
|
|
25
|
+
- name: REQUIRED
|
|
26
|
+
- EITHER spaceId OR spaceName: REQUIRED
|
|
27
|
+
|
|
28
|
+
Notes:
|
|
29
|
+
- For creating lists inside folders, use create_list_in_folder instead
|
|
30
|
+
- Optional fields include content, dueDate, priority, assignee, and status`,
|
|
18
31
|
inputSchema: {
|
|
19
32
|
type: "object",
|
|
20
33
|
properties: {
|
|
@@ -59,7 +72,21 @@ export const createListTool = {
|
|
|
59
72
|
*/
|
|
60
73
|
export const createListInFolderTool = {
|
|
61
74
|
name: "create_list_in_folder",
|
|
62
|
-
description:
|
|
75
|
+
description: `Purpose: Create a new list within a ClickUp folder.
|
|
76
|
+
|
|
77
|
+
Valid Usage:
|
|
78
|
+
1. Provide folderId + list name (preferred)
|
|
79
|
+
2. Provide folderName + (spaceId OR spaceName) + list name
|
|
80
|
+
|
|
81
|
+
Requirements:
|
|
82
|
+
- name: REQUIRED
|
|
83
|
+
- EITHER folderId OR (folderName + space information): REQUIRED
|
|
84
|
+
- When using folderName, EITHER spaceId OR spaceName is REQUIRED
|
|
85
|
+
|
|
86
|
+
Notes:
|
|
87
|
+
- Folder names may not be unique across spaces, which is why space information
|
|
88
|
+
is required when using folderName
|
|
89
|
+
- Optional fields include content and status`,
|
|
63
90
|
inputSchema: {
|
|
64
91
|
type: "object",
|
|
65
92
|
properties: {
|
|
@@ -100,7 +127,18 @@ export const createListInFolderTool = {
|
|
|
100
127
|
*/
|
|
101
128
|
export const getListTool = {
|
|
102
129
|
name: "get_list",
|
|
103
|
-
description:
|
|
130
|
+
description: `Purpose: Retrieve details about a specific ClickUp list.
|
|
131
|
+
|
|
132
|
+
Valid Usage:
|
|
133
|
+
1. Provide listId (preferred)
|
|
134
|
+
2. Provide listName
|
|
135
|
+
|
|
136
|
+
Requirements:
|
|
137
|
+
- EITHER listId OR listName: REQUIRED
|
|
138
|
+
|
|
139
|
+
Notes:
|
|
140
|
+
- Using listId is more reliable as list names might not be unique
|
|
141
|
+
- Returns list details including name, content, and space information`,
|
|
104
142
|
inputSchema: {
|
|
105
143
|
type: "object",
|
|
106
144
|
properties: {
|
|
@@ -121,7 +159,19 @@ export const getListTool = {
|
|
|
121
159
|
*/
|
|
122
160
|
export const updateListTool = {
|
|
123
161
|
name: "update_list",
|
|
124
|
-
description:
|
|
162
|
+
description: `Purpose: Update an existing ClickUp list's properties.
|
|
163
|
+
|
|
164
|
+
Valid Usage:
|
|
165
|
+
1. Provide listId + update fields (preferred)
|
|
166
|
+
2. Provide listName + update fields
|
|
167
|
+
|
|
168
|
+
Requirements:
|
|
169
|
+
- EITHER listId OR listName: REQUIRED
|
|
170
|
+
- At least one field to update (name, content, or status): REQUIRED
|
|
171
|
+
|
|
172
|
+
Notes:
|
|
173
|
+
- Using listId is more reliable as list names might not be unique
|
|
174
|
+
- Only specified fields will be updated`,
|
|
125
175
|
inputSchema: {
|
|
126
176
|
type: "object",
|
|
127
177
|
properties: {
|
|
@@ -154,7 +204,19 @@ export const updateListTool = {
|
|
|
154
204
|
*/
|
|
155
205
|
export const deleteListTool = {
|
|
156
206
|
name: "delete_list",
|
|
157
|
-
description:
|
|
207
|
+
description: `Purpose: Permanently delete a ClickUp list and all its tasks.
|
|
208
|
+
|
|
209
|
+
Valid Usage:
|
|
210
|
+
1. Provide listId (preferred and safest)
|
|
211
|
+
2. Provide listName
|
|
212
|
+
|
|
213
|
+
Requirements:
|
|
214
|
+
- EITHER listId OR listName: REQUIRED
|
|
215
|
+
|
|
216
|
+
⚠️ CRITICAL WARNING:
|
|
217
|
+
- This action CANNOT be undone
|
|
218
|
+
- All tasks within the list will also be permanently deleted
|
|
219
|
+
- Using listName is risky as names may not be unique`,
|
|
158
220
|
inputSchema: {
|
|
159
221
|
type: "object",
|
|
160
222
|
properties: {
|
|
@@ -222,25 +284,20 @@ export async function handleCreateList(parameters) {
|
|
|
222
284
|
try {
|
|
223
285
|
// Create the list
|
|
224
286
|
const newList = await listService.createList(targetSpaceId, listData);
|
|
225
|
-
return {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${newList.id}`,
|
|
237
|
-
message: `List "${name}" created successfully`
|
|
238
|
-
}, null, 2)
|
|
239
|
-
}]
|
|
240
|
-
};
|
|
287
|
+
return sponsorService.createResponse({
|
|
288
|
+
id: newList.id,
|
|
289
|
+
name: newList.name,
|
|
290
|
+
content: newList.content,
|
|
291
|
+
space: {
|
|
292
|
+
id: newList.space.id,
|
|
293
|
+
name: newList.space.name
|
|
294
|
+
},
|
|
295
|
+
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${newList.id}`,
|
|
296
|
+
message: `List "${name}" created successfully`
|
|
297
|
+
}, true);
|
|
241
298
|
}
|
|
242
299
|
catch (error) {
|
|
243
|
-
|
|
300
|
+
return sponsorService.createErrorResponse(`Failed to create list: ${error.message}`);
|
|
244
301
|
}
|
|
245
302
|
}
|
|
246
303
|
/**
|
|
@@ -291,29 +348,24 @@ export async function handleCreateListInFolder(parameters) {
|
|
|
291
348
|
try {
|
|
292
349
|
// Create the list in the folder
|
|
293
350
|
const newList = await listService.createListInFolder(targetFolderId, listData);
|
|
294
|
-
return {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${newList.id}`,
|
|
310
|
-
message: `List "${name}" created successfully in folder "${newList.folder.name}"`
|
|
311
|
-
}, null, 2)
|
|
312
|
-
}]
|
|
313
|
-
};
|
|
351
|
+
return sponsorService.createResponse({
|
|
352
|
+
id: newList.id,
|
|
353
|
+
name: newList.name,
|
|
354
|
+
content: newList.content,
|
|
355
|
+
folder: {
|
|
356
|
+
id: newList.folder.id,
|
|
357
|
+
name: newList.folder.name
|
|
358
|
+
},
|
|
359
|
+
space: {
|
|
360
|
+
id: newList.space.id,
|
|
361
|
+
name: newList.space.name
|
|
362
|
+
},
|
|
363
|
+
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${newList.id}`,
|
|
364
|
+
message: `List "${name}" created successfully in folder "${newList.folder.name}"`
|
|
365
|
+
}, true);
|
|
314
366
|
}
|
|
315
367
|
catch (error) {
|
|
316
|
-
|
|
368
|
+
return sponsorService.createErrorResponse(`Failed to create list in folder: ${error.message}`);
|
|
317
369
|
}
|
|
318
370
|
}
|
|
319
371
|
/**
|
|
@@ -337,24 +389,19 @@ export async function handleGetList(parameters) {
|
|
|
337
389
|
try {
|
|
338
390
|
// Get the list
|
|
339
391
|
const list = await listService.getList(targetListId);
|
|
340
|
-
return {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
},
|
|
351
|
-
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${list.id}`
|
|
352
|
-
}, null, 2)
|
|
353
|
-
}]
|
|
354
|
-
};
|
|
392
|
+
return sponsorService.createResponse({
|
|
393
|
+
id: list.id,
|
|
394
|
+
name: list.name,
|
|
395
|
+
content: list.content,
|
|
396
|
+
space: {
|
|
397
|
+
id: list.space.id,
|
|
398
|
+
name: list.space.name
|
|
399
|
+
},
|
|
400
|
+
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${list.id}`
|
|
401
|
+
}, true);
|
|
355
402
|
}
|
|
356
403
|
catch (error) {
|
|
357
|
-
|
|
404
|
+
return sponsorService.createErrorResponse(`Failed to retrieve list: ${error.message}`);
|
|
358
405
|
}
|
|
359
406
|
}
|
|
360
407
|
/**
|
|
@@ -390,25 +437,20 @@ export async function handleUpdateList(parameters) {
|
|
|
390
437
|
try {
|
|
391
438
|
// Update the list
|
|
392
439
|
const updatedList = await listService.updateList(targetListId, updateData);
|
|
393
|
-
return {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${updatedList.id}`,
|
|
405
|
-
message: `List "${updatedList.name}" updated successfully`
|
|
406
|
-
}, null, 2)
|
|
407
|
-
}]
|
|
408
|
-
};
|
|
440
|
+
return sponsorService.createResponse({
|
|
441
|
+
id: updatedList.id,
|
|
442
|
+
name: updatedList.name,
|
|
443
|
+
content: updatedList.content,
|
|
444
|
+
space: {
|
|
445
|
+
id: updatedList.space.id,
|
|
446
|
+
name: updatedList.space.name
|
|
447
|
+
},
|
|
448
|
+
url: `https://app.clickup.com/${config.clickupTeamId}/v/l/${updatedList.id}`,
|
|
449
|
+
message: `List "${updatedList.name}" updated successfully`
|
|
450
|
+
}, true);
|
|
409
451
|
}
|
|
410
452
|
catch (error) {
|
|
411
|
-
|
|
453
|
+
return sponsorService.createErrorResponse(`Failed to update list: ${error.message}`);
|
|
412
454
|
}
|
|
413
455
|
}
|
|
414
456
|
/**
|
|
@@ -435,17 +477,12 @@ export async function handleDeleteList(parameters) {
|
|
|
435
477
|
const listName = list.name;
|
|
436
478
|
// Delete the list
|
|
437
479
|
await listService.deleteList(targetListId);
|
|
438
|
-
return {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
success: true,
|
|
443
|
-
message: `List "${listName || targetListId}" deleted successfully`
|
|
444
|
-
}, null, 2)
|
|
445
|
-
}]
|
|
446
|
-
};
|
|
480
|
+
return sponsorService.createResponse({
|
|
481
|
+
success: true,
|
|
482
|
+
message: `List "${listName || targetListId}" deleted successfully`
|
|
483
|
+
}, true);
|
|
447
484
|
}
|
|
448
485
|
catch (error) {
|
|
449
|
-
|
|
486
|
+
return sponsorService.createErrorResponse(`Failed to delete list: ${error.message}`);
|
|
450
487
|
}
|
|
451
488
|
}
|
|
@@ -47,7 +47,7 @@ const bulkOptionsSchema = {
|
|
|
47
47
|
const taskIdentifierSchema = {
|
|
48
48
|
taskId: {
|
|
49
49
|
type: "string",
|
|
50
|
-
description: "Task ID (preferred).
|
|
50
|
+
description: "Task ID (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
51
51
|
},
|
|
52
52
|
taskName: {
|
|
53
53
|
type: "string",
|
|
@@ -56,6 +56,10 @@ const taskIdentifierSchema = {
|
|
|
56
56
|
listName: {
|
|
57
57
|
type: "string",
|
|
58
58
|
description: "REQUIRED with taskName: List containing the task."
|
|
59
|
+
},
|
|
60
|
+
customTaskId: {
|
|
61
|
+
type: "string",
|
|
62
|
+
description: "Custom task ID (e.g., 'DEV-1234'). Only use if you want to explicitly force custom ID lookup. In most cases, use taskId which auto-detects ID format."
|
|
59
63
|
}
|
|
60
64
|
};
|
|
61
65
|
//=============================================================================
|
|
@@ -66,7 +70,20 @@ const taskIdentifierSchema = {
|
|
|
66
70
|
*/
|
|
67
71
|
export const createBulkTasksTool = {
|
|
68
72
|
name: "create_bulk_tasks",
|
|
69
|
-
description:
|
|
73
|
+
description: `Purpose: Create multiple tasks in a list efficiently.
|
|
74
|
+
|
|
75
|
+
Valid Usage:
|
|
76
|
+
1. An array of tasks with required properties + listId (preferred)
|
|
77
|
+
2. An array of tasks with required properties + listName
|
|
78
|
+
|
|
79
|
+
Requirements:
|
|
80
|
+
- tasks: REQUIRED (array of tasks, each with at least a name)
|
|
81
|
+
- EITHER listId OR listName: REQUIRED
|
|
82
|
+
|
|
83
|
+
Notes:
|
|
84
|
+
- Configure batch size and concurrency via options for performance
|
|
85
|
+
- Each task should have a name with emoji prefix
|
|
86
|
+
- All tasks will be created in the same list`,
|
|
70
87
|
inputSchema: {
|
|
71
88
|
type: "object",
|
|
72
89
|
properties: {
|
|
@@ -122,7 +139,21 @@ export const createBulkTasksTool = {
|
|
|
122
139
|
*/
|
|
123
140
|
export const updateBulkTasksTool = {
|
|
124
141
|
name: "update_bulk_tasks",
|
|
125
|
-
description:
|
|
142
|
+
description: `Purpose: Update multiple tasks efficiently in a single operation.
|
|
143
|
+
|
|
144
|
+
Valid Usage:
|
|
145
|
+
1. For each task, provide taskId (preferred)
|
|
146
|
+
2. For each task, provide taskName + listName
|
|
147
|
+
|
|
148
|
+
Requirements:
|
|
149
|
+
- tasks: REQUIRED (array of tasks to update)
|
|
150
|
+
- For each task entry, EITHER taskId OR (taskName + listName) is REQUIRED
|
|
151
|
+
- At least one update field per task (name, description, status, priority, dueDate)
|
|
152
|
+
|
|
153
|
+
Notes:
|
|
154
|
+
- Only specified fields will be updated for each task
|
|
155
|
+
- Configure batch size and concurrency via options for performance
|
|
156
|
+
- Each task can have different fields to update`,
|
|
126
157
|
inputSchema: {
|
|
127
158
|
type: "object",
|
|
128
159
|
properties: {
|
|
@@ -171,7 +202,24 @@ export const updateBulkTasksTool = {
|
|
|
171
202
|
*/
|
|
172
203
|
export const moveBulkTasksTool = {
|
|
173
204
|
name: "move_bulk_tasks",
|
|
174
|
-
description:
|
|
205
|
+
description: `Purpose: Move multiple tasks to a different list efficiently.
|
|
206
|
+
|
|
207
|
+
Valid Usage:
|
|
208
|
+
1. For each task, provide taskId + target list (preferred)
|
|
209
|
+
2. For each task, provide taskName + listName + target list
|
|
210
|
+
|
|
211
|
+
Requirements:
|
|
212
|
+
- tasks: REQUIRED (array of tasks to move)
|
|
213
|
+
- EITHER targetListId OR targetListName: REQUIRED
|
|
214
|
+
- For each task entry, EITHER taskId OR (taskName + listName) is REQUIRED
|
|
215
|
+
|
|
216
|
+
Notes:
|
|
217
|
+
- Configure batch size and concurrency via options for performance
|
|
218
|
+
- All tasks will be moved to the same destination list
|
|
219
|
+
|
|
220
|
+
⚠️ Warning:
|
|
221
|
+
- Task statuses may reset if destination list has different status options
|
|
222
|
+
- Using taskName without listName will fail as tasks may have identical names across lists`,
|
|
175
223
|
inputSchema: {
|
|
176
224
|
type: "object",
|
|
177
225
|
properties: {
|
|
@@ -203,7 +251,23 @@ export const moveBulkTasksTool = {
|
|
|
203
251
|
*/
|
|
204
252
|
export const deleteBulkTasksTool = {
|
|
205
253
|
name: "delete_bulk_tasks",
|
|
206
|
-
description:
|
|
254
|
+
description: `Purpose: PERMANENTLY DELETE multiple tasks at once.
|
|
255
|
+
|
|
256
|
+
Valid Usage:
|
|
257
|
+
1. For each task, provide taskId (preferred and safest)
|
|
258
|
+
2. For each task, provide taskName + listName
|
|
259
|
+
|
|
260
|
+
Requirements:
|
|
261
|
+
- tasks: REQUIRED (array of tasks to delete)
|
|
262
|
+
- For each task entry, EITHER taskId OR (taskName + listName) is REQUIRED
|
|
263
|
+
|
|
264
|
+
Notes:
|
|
265
|
+
- Configure batch size and concurrency via options for performance
|
|
266
|
+
|
|
267
|
+
⚠️ CRITICAL WARNING:
|
|
268
|
+
- This action CANNOT be undone for any of the tasks
|
|
269
|
+
- Using taskName without listName is dangerous as names may not be unique
|
|
270
|
+
- Always provide listName when using taskName for safer targeting`,
|
|
207
271
|
inputSchema: {
|
|
208
272
|
type: "object",
|
|
209
273
|
properties: {
|
|
@@ -38,9 +38,9 @@ function buildUpdateData(params) {
|
|
|
38
38
|
/**
|
|
39
39
|
* Process a task identification validation, returning the task ID
|
|
40
40
|
*/
|
|
41
|
-
async function getTaskId(taskId, taskName, listName) {
|
|
42
|
-
validateTaskIdentification(taskId, taskName, listName);
|
|
43
|
-
return await resolveTaskIdWithValidation(taskId, taskName, listName);
|
|
41
|
+
async function getTaskId(taskId, taskName, listName, customTaskId) {
|
|
42
|
+
validateTaskIdentification(taskId, taskName, listName, customTaskId);
|
|
43
|
+
return await resolveTaskIdWithValidation(taskId, taskName, listName, customTaskId);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Process a list identification validation, returning the list ID
|
|
@@ -72,8 +72,8 @@ function buildTaskFilters(params) {
|
|
|
72
72
|
*/
|
|
73
73
|
async function mapTaskIds(tasks) {
|
|
74
74
|
return Promise.all(tasks.map(async (task) => {
|
|
75
|
-
validateTaskIdentification(task.taskId, task.taskName, task.listName);
|
|
76
|
-
return await resolveTaskIdWithValidation(task.taskId, task.taskName, task.listName);
|
|
75
|
+
validateTaskIdentification(task.taskId, task.taskName, task.listName, task.customTaskId);
|
|
76
|
+
return await resolveTaskIdWithValidation(task.taskId, task.taskName, task.listName, task.customTaskId);
|
|
77
77
|
}));
|
|
78
78
|
}
|
|
79
79
|
//=============================================================================
|
|
@@ -129,7 +129,8 @@ export async function duplicateTaskHandler(params) {
|
|
|
129
129
|
* Handler for getting a task
|
|
130
130
|
*/
|
|
131
131
|
export async function getTaskHandler(params) {
|
|
132
|
-
|
|
132
|
+
// resolveTaskIdWithValidation now auto-detects whether taskId is a regular ID or custom ID
|
|
133
|
+
const taskId = await getTaskId(params.taskId, params.taskName, params.listName, params.customTaskId);
|
|
133
134
|
return await taskService.getTask(taskId);
|
|
134
135
|
}
|
|
135
136
|
/**
|
|
@@ -45,7 +45,19 @@ const handleOperationError = (operation, error) => {
|
|
|
45
45
|
*/
|
|
46
46
|
export const createTaskTool = {
|
|
47
47
|
name: "create_task",
|
|
48
|
-
description:
|
|
48
|
+
description: `Purpose: Create a single task in a ClickUp list.
|
|
49
|
+
|
|
50
|
+
Valid Usage:
|
|
51
|
+
1. Provide listId (preferred if available)
|
|
52
|
+
2. Provide listName (system will look up the list ID)
|
|
53
|
+
|
|
54
|
+
Requirements:
|
|
55
|
+
- name: REQUIRED
|
|
56
|
+
- EITHER listId OR listName: REQUIRED
|
|
57
|
+
|
|
58
|
+
Notes:
|
|
59
|
+
- For multiple tasks, use create_bulk_tasks instead
|
|
60
|
+
- Reuse list IDs from previous responses when possible to avoid redundant lookups`,
|
|
49
61
|
inputSchema: {
|
|
50
62
|
type: "object",
|
|
51
63
|
properties: {
|
|
@@ -89,13 +101,25 @@ export const createTaskTool = {
|
|
|
89
101
|
*/
|
|
90
102
|
export const updateTaskTool = {
|
|
91
103
|
name: "update_task",
|
|
92
|
-
description:
|
|
104
|
+
description: `Purpose: Modify properties of an existing task.
|
|
105
|
+
|
|
106
|
+
Valid Usage:
|
|
107
|
+
1. Use taskId alone (preferred if available)
|
|
108
|
+
2. Use taskName + listName
|
|
109
|
+
|
|
110
|
+
Requirements:
|
|
111
|
+
- At least one update field (name, description, status, priority, dueDate) must be provided
|
|
112
|
+
- When using taskName, listName is REQUIRED
|
|
113
|
+
|
|
114
|
+
Notes:
|
|
115
|
+
- Only specified fields will be updated
|
|
116
|
+
- Using taskId is more reliable than taskName`,
|
|
93
117
|
inputSchema: {
|
|
94
118
|
type: "object",
|
|
95
119
|
properties: {
|
|
96
120
|
taskId: {
|
|
97
121
|
type: "string",
|
|
98
|
-
description: "ID of the task to update (preferred).
|
|
122
|
+
description: "ID of the task to update (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
99
123
|
},
|
|
100
124
|
taskName: {
|
|
101
125
|
type: "string",
|
|
@@ -139,13 +163,25 @@ export const updateTaskTool = {
|
|
|
139
163
|
*/
|
|
140
164
|
export const moveTaskTool = {
|
|
141
165
|
name: "move_task",
|
|
142
|
-
description:
|
|
166
|
+
description: `Purpose: Move a task to a different list.
|
|
167
|
+
|
|
168
|
+
Valid Usage:
|
|
169
|
+
1. Use taskId + (listId OR listName) - preferred
|
|
170
|
+
2. Use taskName + sourceListName + (listId OR listName)
|
|
171
|
+
|
|
172
|
+
Requirements:
|
|
173
|
+
- Destination list: EITHER listId OR listName REQUIRED
|
|
174
|
+
- When using taskName, sourceListName is REQUIRED
|
|
175
|
+
|
|
176
|
+
Warning:
|
|
177
|
+
- Task statuses may reset if destination list has different status options
|
|
178
|
+
- System cannot find a task by name without knowing which list to search in`,
|
|
143
179
|
inputSchema: {
|
|
144
180
|
type: "object",
|
|
145
181
|
properties: {
|
|
146
182
|
taskId: {
|
|
147
183
|
type: "string",
|
|
148
|
-
description: "ID of the task to move (preferred).
|
|
184
|
+
description: "ID of the task to move (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
149
185
|
},
|
|
150
186
|
taskName: {
|
|
151
187
|
type: "string",
|
|
@@ -172,13 +208,27 @@ export const moveTaskTool = {
|
|
|
172
208
|
*/
|
|
173
209
|
export const duplicateTaskTool = {
|
|
174
210
|
name: "duplicate_task",
|
|
175
|
-
description:
|
|
211
|
+
description: `Purpose: Create a copy of a task in the same or different list.
|
|
212
|
+
|
|
213
|
+
Valid Usage:
|
|
214
|
+
1. Use taskId + optional (listId OR listName) - preferred
|
|
215
|
+
2. Use taskName + sourceListName + optional (listId OR listName)
|
|
216
|
+
|
|
217
|
+
Requirements:
|
|
218
|
+
- When using taskName, sourceListName is REQUIRED
|
|
219
|
+
|
|
220
|
+
Notes:
|
|
221
|
+
- The duplicate preserves the original task's properties
|
|
222
|
+
- If no destination list specified, uses same list as original task
|
|
223
|
+
|
|
224
|
+
Warning:
|
|
225
|
+
- System cannot find a task by name without knowing which list to search in`,
|
|
176
226
|
inputSchema: {
|
|
177
227
|
type: "object",
|
|
178
228
|
properties: {
|
|
179
229
|
taskId: {
|
|
180
230
|
type: "string",
|
|
181
|
-
description: "ID of task to duplicate (preferred).
|
|
231
|
+
description: "ID of task to duplicate (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
182
232
|
},
|
|
183
233
|
taskName: {
|
|
184
234
|
type: "string",
|
|
@@ -205,13 +255,27 @@ export const duplicateTaskTool = {
|
|
|
205
255
|
*/
|
|
206
256
|
export const getTaskTool = {
|
|
207
257
|
name: "get_task",
|
|
208
|
-
description:
|
|
258
|
+
description: `Purpose: Retrieve detailed information about a specific task.
|
|
259
|
+
|
|
260
|
+
Valid Usage:
|
|
261
|
+
1. Use taskId alone (preferred) - works with both regular and custom IDs (like "DEV-1234")
|
|
262
|
+
2. Use taskName + listName
|
|
263
|
+
3. Use customTaskId for explicit custom ID lookup
|
|
264
|
+
|
|
265
|
+
Requirements:
|
|
266
|
+
- When using taskName, listName is REQUIRED
|
|
267
|
+
- When using customTaskId, listName is recommended for faster lookup
|
|
268
|
+
|
|
269
|
+
Note:
|
|
270
|
+
- Task names are only unique within a list, so the system needs to know which list to search in
|
|
271
|
+
- Regular task IDs are always 9 characters long (e.g., "86b394eqa")
|
|
272
|
+
- Custom IDs have an uppercase prefix followed by a hyphen and number (e.g., "DEV-1234")`,
|
|
209
273
|
inputSchema: {
|
|
210
274
|
type: "object",
|
|
211
275
|
properties: {
|
|
212
276
|
taskId: {
|
|
213
277
|
type: "string",
|
|
214
|
-
description: "ID of task to retrieve (preferred).
|
|
278
|
+
description: "ID of task to retrieve (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234'). The system automatically detects the ID format."
|
|
215
279
|
},
|
|
216
280
|
taskName: {
|
|
217
281
|
type: "string",
|
|
@@ -220,6 +284,10 @@ export const getTaskTool = {
|
|
|
220
284
|
listName: {
|
|
221
285
|
type: "string",
|
|
222
286
|
description: "Name of list containing the task. REQUIRED when using taskName."
|
|
287
|
+
},
|
|
288
|
+
customTaskId: {
|
|
289
|
+
type: "string",
|
|
290
|
+
description: "Custom task ID (e.g., 'DEV-1234'). Only use this if you want to explicitly force custom ID lookup. In most cases, you can just use taskId which auto-detects ID format."
|
|
223
291
|
}
|
|
224
292
|
},
|
|
225
293
|
required: []
|
|
@@ -230,7 +298,19 @@ export const getTaskTool = {
|
|
|
230
298
|
*/
|
|
231
299
|
export const getTasksTool = {
|
|
232
300
|
name: "get_tasks",
|
|
233
|
-
description:
|
|
301
|
+
description: `Purpose: Retrieve tasks from a list with optional filtering.
|
|
302
|
+
|
|
303
|
+
Valid Usage:
|
|
304
|
+
1. Use listId (preferred)
|
|
305
|
+
2. Use listName
|
|
306
|
+
|
|
307
|
+
Requirements:
|
|
308
|
+
- EITHER listId OR listName is REQUIRED
|
|
309
|
+
|
|
310
|
+
Notes:
|
|
311
|
+
- Use filters (archived, statuses, etc.) to narrow down results
|
|
312
|
+
- Pagination available through page parameter
|
|
313
|
+
- Sorting available through order_by and reverse parameters`,
|
|
234
314
|
inputSchema: {
|
|
235
315
|
type: "object",
|
|
236
316
|
properties: {
|
|
@@ -278,13 +358,22 @@ export const getTasksTool = {
|
|
|
278
358
|
*/
|
|
279
359
|
export const deleteTaskTool = {
|
|
280
360
|
name: "delete_task",
|
|
281
|
-
description:
|
|
361
|
+
description: `Purpose: PERMANENTLY DELETE a task.
|
|
362
|
+
|
|
363
|
+
Valid Usage:
|
|
364
|
+
1. Use taskId alone (preferred and safest)
|
|
365
|
+
2. Use taskName + optional listName
|
|
366
|
+
|
|
367
|
+
Warning:
|
|
368
|
+
- This action CANNOT be undone
|
|
369
|
+
- Using taskName is risky as names may not be unique
|
|
370
|
+
- Provide listName when using taskName for more precise targeting`,
|
|
282
371
|
inputSchema: {
|
|
283
372
|
type: "object",
|
|
284
373
|
properties: {
|
|
285
374
|
taskId: {
|
|
286
375
|
type: "string",
|
|
287
|
-
description: "ID of task to delete (preferred).
|
|
376
|
+
description: "ID of task to delete (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
288
377
|
},
|
|
289
378
|
taskName: {
|
|
290
379
|
type: "string",
|
|
@@ -302,13 +391,22 @@ export const deleteTaskTool = {
|
|
|
302
391
|
*/
|
|
303
392
|
export const getTaskCommentsTool = {
|
|
304
393
|
name: "get_task_comments",
|
|
305
|
-
description:
|
|
394
|
+
description: `Purpose: Retrieve comments for a ClickUp task.
|
|
395
|
+
|
|
396
|
+
Valid Usage:
|
|
397
|
+
1. Use taskId (preferred)
|
|
398
|
+
2. Use taskName + optional listName
|
|
399
|
+
|
|
400
|
+
Notes:
|
|
401
|
+
- If using taskName, providing listName helps locate the correct task
|
|
402
|
+
- Task names may not be unique across different lists
|
|
403
|
+
- Use start and startId parameters for pagination through comments`,
|
|
306
404
|
inputSchema: {
|
|
307
405
|
type: "object",
|
|
308
406
|
properties: {
|
|
309
407
|
taskId: {
|
|
310
408
|
type: "string",
|
|
311
|
-
description: "ID of task to retrieve comments for (preferred).
|
|
409
|
+
description: "ID of task to retrieve comments for (preferred). Works with both regular task IDs (9 characters) and custom IDs with uppercase prefixes (like 'DEV-1234')."
|
|
312
410
|
},
|
|
313
411
|
taskName: {
|
|
314
412
|
type: "string",
|