@taazkareem/clickup-mcp-server 0.4.51 → 0.4.52

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 CHANGED
@@ -30,7 +30,7 @@ npx -y @taazkareem/clickup-mcp-server \
30
30
  - View and modify task details and properties
31
31
 
32
32
  - 📂 **Workspace Organization**
33
- - Navigate complete workspace hierarchy (spaces, folders, lists)
33
+ - Complete workspace hierarchy (spaces, folders, lists)
34
34
  - Tree structure with clear relationships
35
35
  - Create and manage lists and folders
36
36
  - Efficient path-based navigation
@@ -40,42 +40,39 @@ npx -y @taazkareem/clickup-mcp-server \
40
40
  - Case-insensitive name matching
41
41
  - Markdown formatting support
42
42
  - Built-in API rate limiting
43
- - Comprehensive error handling
44
- - Clear parameter validation
45
43
 
46
44
  - 🤖 **AI-Powered Analysis**
47
45
  - Task status summaries and overviews
48
46
  - Priority analysis and recommendations
49
47
  - Structured description generation
50
48
  - Task relationship mapping
51
- - Workspace organization insights
52
49
 
53
50
  ## Available Tools
54
51
 
55
52
  | Tool | Description | Required Parameters |
56
53
  |------|-------------|-------------------|
57
- | [get_workspace_hierarchy](docs/tools.md#workspace-organization) | Get complete workspace structure | None |
58
- | [get_tasks](docs/tools.md#task-management) | Retrieve tasks from a list | `listId` or `listName` |
59
- | [get_task](docs/tools.md#task-management) | Get single task details | `taskId` or `taskName` |
60
- | [create_task](docs/tools.md#task-management) | Create a new task | `listId`, `taskName` |
61
- | [create_bulk_tasks](docs/tools.md#task-management) | Create multiple tasks | `listId`, `tasks[]` |
62
- | [update_task](docs/tools.md#task-management) | Modify task properties | `taskId` or `taskName` |
63
- | [delete_task](docs/tools.md#task-management) | Remove a task | `taskId` or `taskName` |
64
- | [move_task](docs/tools.md#task-management) | Move task to another list | `taskId`, `destinationListId` |
65
- | [duplicate_task](docs/tools.md#task-management) | Copy task to another list | `taskId`, `destinationListId` |
66
- | [create_list](docs/tools.md#list-management) | Create a new list | `spaceId`, `listName` |
67
- | [create_folder](docs/tools.md#folder-management) | Create a new folder | `spaceId`, `folderName` |
68
- | [create_list_in_folder](docs/tools.md#list-management) | Create list in folder | `folderId`, `listName` |
69
-
70
- See [full documentation](docs/tools.md) for optional parameters and advanced usage.
54
+ | [get_workspace_hierarchy](docs/api-reference.md#workspace-navigation) | Get workspace structure | None |
55
+ | [create_task](docs/api-reference.md#task-management) | Create a task | `name`, (`listId`/`listName`) |
56
+ | [create_bulk_tasks](docs/api-reference.md#task-management) | Create multiple tasks | `tasks[]` |
57
+ | [update_task](docs/api-reference.md#task-management) | Modify task | `taskId`/`taskName` |
58
+ | [get_tasks](docs/api-reference.md#task-retrieval) | Get tasks from list | `listId`/`listName` |
59
+ | [get_task](docs/api-reference.md#task-retrieval) | Get task details | `taskId`/`taskName` |
60
+ | [delete_task](docs/api-reference.md#task-management) | Remove task | `taskId` |
61
+ | [move_task](docs/api-reference.md#task-management) | Move task | `taskId`/`taskName`, `listId`/`listName` |
62
+ | [duplicate_task](docs/api-reference.md#task-management) | Copy task | `taskId`/`taskName`, `listId`/`listName` |
63
+ | [create_list](docs/api-reference.md#list-management) | Create list in space | `name`, `spaceId`/`spaceName` |
64
+ | [create_folder](docs/api-reference.md#folder-management) | Create folder | `name`, `spaceId`/`spaceName` |
65
+ | [create_list_in_folder](docs/api-reference.md#list-management) | Create list in folder | `name`, `folderId`/`folderName` |
66
+
67
+ See [full documentation](docs/api-reference.md) for optional parameters and advanced usage.
71
68
 
72
69
  ## Available Prompts
73
70
 
74
71
  | Prompt | Purpose | Features |
75
72
  |--------|---------|----------|
76
- | [summarize_tasks](docs/tools.md#prompts) | Generate task overview | Status summary, relationships, current states |
77
- | [analyze_priorities](docs/tools.md#prompts) | Review task priorities | Priority review, adjustments, sequencing |
78
- | [generate_description](docs/tools.md#prompts) | Create task descriptions | Structure, objectives, dependencies |
73
+ | [summarize_tasks](docs/api-reference.md#prompts) | Task overview | Status summary, priorities, relationships |
74
+ | [analyze_priorities](docs/api-reference.md#prompts) | Priority optimization | Distribution analysis, sequencing |
75
+ | [generate_description](docs/api-reference.md#prompts) | Task description creation | Objectives, criteria, dependencies |
79
76
 
80
77
  ## Error Handling
81
78
 
package/build/index.js CHANGED
@@ -2,22 +2,37 @@
2
2
  /**
3
3
  * ClickUp MCP Server - A Model Context Protocol server for ClickUp integration
4
4
  *
5
- * This server enables AI applications to interact with ClickUp through a standardized protocol.
5
+ * This server enables AI applications to interact with ClickUp through a standardized protocol,
6
+ * allowing AI assistants to manage tasks, lists, and folders in ClickUp workspaces.
7
+ *
6
8
  * Key capabilities include:
7
9
  *
8
- * Tools:
9
- * - Task Management: Create, update, move and duplicate tasks
10
- * - Bulk task creation and management
11
- * - Workspace Organization: Create lists, folders and manage hierarchy
12
- * - Smart lookups by name or ID with case-insensitive matching
10
+ * Task Management:
11
+ * - Create, update, move and duplicate tasks with rich description support
12
+ * - Find tasks by name with smart disambiguation
13
+ * - Bulk task creation for efficient workflow setup
14
+ * - Comprehensive filtering and sorting options
15
+ *
16
+ * Workspace Organization:
17
+ * - Navigate and discover workspace structure with hierarchical views
18
+ * - Create and manage lists and folders with proper nesting
19
+ * - Smart name-based lookups that eliminate the need for IDs
20
+ * - Support for priorities, statuses, and due dates
21
+ *
22
+ * AI-Enhanced Capabilities:
23
+ * - Task summarization and status grouping for project overviews
24
+ * - Priority analysis and optimization for workload balancing
25
+ * - Detailed task description generation with structured content
26
+ * - Task relationship identification for dependency management
13
27
  *
14
- * Prompts:
15
- * - Task summarization and status grouping
16
- * - Priority analysis and optimization
17
- * - Detailed task description generation
18
- * - Task relationship insights
28
+ * Technical Features:
29
+ * - Full markdown support for rich text content
30
+ * - Secure credential handling through configuration
31
+ * - Comprehensive error reporting and validation
32
+ * - Name-based entity resolution with fuzzy matching
19
33
  *
20
- * Features markdown support, secure credential handling, and comprehensive error reporting.
34
+ * This implementation follows the Model Context Protocol specification and
35
+ * is designed to be used with AI assistants that support MCP.
21
36
  */
22
37
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
23
38
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -32,7 +47,7 @@ const clickup = ClickUpService.initialize(config.clickupApiKey, config.clickupTe
32
47
  */
33
48
  const server = new Server({
34
49
  name: "clickup-mcp-server",
35
- version: "0.1.0",
50
+ version: "0.4.50",
36
51
  }, {
37
52
  capabilities: {
38
53
  tools: {},
@@ -48,7 +63,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
48
63
  tools: [
49
64
  {
50
65
  name: "get_workspace_hierarchy",
51
- description: "Get the complete hierarchy of spaces, folders, and lists in the workspace. Important: If looking up information, first check chat history for space, folder, and list names or ID matches. If not found, use this tool to get necessary information.",
66
+ description: "Retrieve the complete ClickUp workspace hierarchy, including all spaces, folders, and lists with their IDs, names, and hierarchical paths. Call this tool only when you need to discover the workspace structure and don't already have this information from recent context. Avoid using for repeated lookups of the same information.",
52
67
  inputSchema: {
53
68
  type: "object",
54
69
  properties: {},
@@ -57,7 +72,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
57
72
  },
58
73
  {
59
74
  name: "create_task",
60
- description: "Create a new task in ClickUp. Supports direct name-based lookup for lists - no need to know the list ID. Status will use ClickUp defaults if not specified. If the specified list doesn't exist, you can create it using create_list or create_list_in_folder.",
75
+ description: "Create a single task in a ClickUp list. Use this tool for individual task creation only. For multiple tasks, use create_bulk_tasks instead. The tool finds lists by name (case-insensitive) so explicit list IDs aren't required. When creating a task, you must provide either a listId or listName.",
61
76
  inputSchema: {
62
77
  type: "object",
63
78
  properties: {
@@ -87,11 +102,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
87
102
  },
88
103
  priority: {
89
104
  type: "number",
90
- description: "Priority of the task (1-4), 1 is urgent/highest priority, 4 is lowest priority. Only set this if priority is explicitly mentioned in the user's request."
105
+ description: "Priority of the task (1-4), where 1 is urgent/highest priority and 4 is lowest priority. Only set this when the user explicitly requests a priority level."
91
106
  },
92
107
  dueDate: {
93
108
  type: "string",
94
- description: "Due date of the task (Unix timestamp in milliseconds)"
109
+ description: "Due date of the task (Unix timestamp in milliseconds). Convert dates to this format before submitting."
95
110
  }
96
111
  },
97
112
  required: ["name"]
@@ -99,7 +114,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
99
114
  },
100
115
  {
101
116
  name: "create_bulk_tasks",
102
- description: "Create multiple tasks in a ClickUp list. Supports direct name-based lookup for lists - no need to know the list ID. Tasks will use ClickUp default status if not specified. If the specified list doesn't exist, you can create it using create_list or create_list_in_folder.",
117
+ description: "Create multiple tasks in a ClickUp list simultaneously. Use this tool when you need to add several related tasks in one operation. The tool finds lists by name (case-insensitive), so explicit list IDs aren't required. More efficient than creating tasks one by one for batch operations.",
103
118
  inputSchema: {
104
119
  type: "object",
105
120
  properties: {
@@ -113,13 +128,13 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
113
128
  },
114
129
  tasks: {
115
130
  type: "array",
116
- description: "Array of tasks to create",
131
+ description: "Array of tasks to create (at least one task required)",
117
132
  items: {
118
133
  type: "object",
119
134
  properties: {
120
135
  name: {
121
136
  type: "string",
122
- description: "Name of the task"
137
+ description: "Name of the task. Consider adding a relevant emoji before the name."
123
138
  },
124
139
  description: {
125
140
  type: "string",
@@ -135,11 +150,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
135
150
  },
136
151
  priority: {
137
152
  type: "number",
138
- description: "Priority level (1-4), 1 is urgent/highest priority, 4 is lowest priority. Only set this if priority is explicitly mentioned in the user's request."
153
+ description: "Priority level (1-4), where 1 is urgent/highest priority and 4 is lowest priority. Only set when explicitly requested."
139
154
  },
140
155
  dueDate: {
141
156
  type: "string",
142
- description: "Due date (Unix timestamp in milliseconds)"
157
+ description: "Due date (Unix timestamp in milliseconds). Convert dates to this format before submitting."
143
158
  },
144
159
  assignees: {
145
160
  type: "array",
@@ -153,12 +168,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
153
168
  }
154
169
  }
155
170
  },
156
- required: ["listId", "tasks"]
171
+ required: ["tasks"]
157
172
  }
158
173
  },
159
174
  {
160
175
  name: "create_list",
161
- description: "Create a new list in a ClickUp space. Supports direct name-based lookup for spaces - no need to know the space ID. If the specified space doesn't exist, you can create it through the ClickUp web interface (space creation via API not supported).",
176
+ description: "Create a new list directly in a ClickUp space. Use this tool when you need a top-level list not nested inside a folder. The tool can find spaces by name, so explicit space IDs aren't required. For creating lists inside folders, use create_list_in_folder instead.",
162
177
  inputSchema: {
163
178
  type: "object",
164
179
  properties: {
@@ -180,11 +195,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
180
195
  },
181
196
  dueDate: {
182
197
  type: "string",
183
- description: "Due date for the list (ISO string)"
198
+ description: "Due date for the list (Unix timestamp in milliseconds). Convert dates to this format before submitting."
184
199
  },
185
200
  priority: {
186
201
  type: "number",
187
- description: "Priority of the list (1-4). Only set this if priority is explicitly mentioned in the user's request."
202
+ description: "Priority of the list (1-4), where 1 is urgent/highest priority and 4 is lowest priority. Only set when explicitly requested."
188
203
  },
189
204
  assignee: {
190
205
  type: "number",
@@ -200,7 +215,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
200
215
  },
201
216
  {
202
217
  name: "create_folder",
203
- description: "Create a new folder in a ClickUp space. Supports direct name-based lookup for spaces - no need to know the space ID. If the specified space doesn't exist, you can create it through the ClickUp web interface (space creation via API not supported).",
218
+ description: "Create a new folder in a ClickUp space for organizing related lists. Use this tool when you need to group multiple lists together. The tool can find spaces by name, so explicit space IDs aren't required. After creating a folder, you can add lists to it using create_list_in_folder.",
204
219
  inputSchema: {
205
220
  type: "object",
206
221
  properties: {
@@ -218,7 +233,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
218
233
  },
219
234
  override_statuses: {
220
235
  type: "boolean",
221
- description: "Whether to override space statuses"
236
+ description: "Whether to override space statuses with folder-specific statuses"
222
237
  }
223
238
  },
224
239
  required: ["name"]
@@ -226,7 +241,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
226
241
  },
227
242
  {
228
243
  name: "create_list_in_folder",
229
- description: "Create a new list in a ClickUp folder. Supports direct name-based lookup for folders and spaces - no need to know IDs. If the specified folder doesn't exist, you can create it using create_folder. If the space doesn't exist, it must be created through the ClickUp web interface.",
244
+ description: "Create a new list within a ClickUp folder. Use this tool when you need to add a list to an existing folder structure. The tool can find folders and spaces by name, so explicit IDs aren't required. For top-level lists not in folders, use create_list instead.",
230
245
  inputSchema: {
231
246
  type: "object",
232
247
  properties: {
@@ -256,7 +271,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
256
271
  },
257
272
  status: {
258
273
  type: "string",
259
- description: "Status of the list"
274
+ description: "Status of the list (uses folder default if not specified)"
260
275
  }
261
276
  },
262
277
  required: ["name"]
@@ -264,7 +279,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
264
279
  },
265
280
  {
266
281
  name: "move_task",
267
- description: "Move a task to a different list. Supports direct name-based lookup for lists and tasks - no need to know IDs.",
282
+ description: "Move an existing task from its current list to a different list. Use this tool when you need to relocate a task within your workspace hierarchy. The tool can find tasks and lists by name, so explicit IDs aren't required. Task statuses may be reset if the destination list uses different status options.",
268
283
  inputSchema: {
269
284
  type: "object",
270
285
  properties: {
@@ -278,7 +293,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
278
293
  },
279
294
  sourceListName: {
280
295
  type: "string",
281
- description: "Optional: Name of the list to narrow down task search"
296
+ description: "Optional: Name of the source list to narrow down task search when multiple tasks have the same name"
282
297
  },
283
298
  listId: {
284
299
  type: "string",
@@ -294,7 +309,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
294
309
  },
295
310
  {
296
311
  name: "duplicate_task",
297
- description: "Duplicate a task to a list. Supports direct name-based lookup for lists - no need to know the list ID. If the destination list doesn't exist, you can create it using create_list or create_list_in_folder.",
312
+ description: "Create a copy of an existing task in the same or different list. Use this tool when you need to replicate a task's content and properties. The tool can find tasks and lists by name, so explicit IDs aren't required. The duplicate will preserve name, description, priority, and other attributes from the original task.",
298
313
  inputSchema: {
299
314
  type: "object",
300
315
  properties: {
@@ -308,7 +323,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
308
323
  },
309
324
  sourceListName: {
310
325
  type: "string",
311
- description: "Optional: Name of the list to narrow down task search"
326
+ description: "Optional: Name of the source list to narrow down task search when multiple tasks have the same name"
312
327
  },
313
328
  listId: {
314
329
  type: "string",
@@ -324,7 +339,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
324
339
  },
325
340
  {
326
341
  name: "update_task",
327
- description: "Update an existing task in ClickUp. Supports direct name-based lookup for tasks - no need to know the task ID.",
342
+ description: "Modify the properties of an existing task. Use this tool when you need to change a task's name, description, status, priority, or due date. The tool can find tasks by name, so explicit task IDs aren't required. Only the fields you specify will be updated; other fields will remain unchanged.",
328
343
  inputSchema: {
329
344
  type: "object",
330
345
  properties: {
@@ -338,27 +353,27 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
338
353
  },
339
354
  listName: {
340
355
  type: "string",
341
- description: "Optional: Name of the list to narrow down task search"
356
+ description: "Optional: Name of the list to narrow down task search when multiple tasks have the same name"
342
357
  },
343
358
  name: {
344
359
  type: "string",
345
- description: "New name of the task"
360
+ description: "New name for the task"
346
361
  },
347
362
  description: {
348
363
  type: "string",
349
- description: "New description of the task"
364
+ description: "New plain text description for the task"
350
365
  },
351
366
  status: {
352
367
  type: "string",
353
- description: "New status of the task"
368
+ description: "New status for the task (must be a valid status in the task's list)"
354
369
  },
355
370
  priority: {
356
371
  type: "number",
357
- description: "New priority of the task (1-4). Only set this if priority is explicitly mentioned in the user's request."
372
+ description: "New priority for the task (1-4), where 1 is urgent/highest priority and 4 is lowest priority"
358
373
  },
359
374
  dueDate: {
360
375
  type: "string",
361
- description: "New due date of the task (ISO string)"
376
+ description: "New due date for the task (Unix timestamp in milliseconds). Convert dates to this format before submitting."
362
377
  }
363
378
  },
364
379
  required: []
@@ -366,7 +381,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
366
381
  },
367
382
  {
368
383
  name: "get_tasks",
369
- description: "Get tasks from a ClickUp list with optional filters. Supports direct name-based lookup for lists - no need to know the list ID. If the list doesn't exist, you can create it using create_list or create_list_in_folder. ",
384
+ description: "Retrieve tasks from a ClickUp list with optional filtering capabilities. Use this tool when you need to see existing tasks or analyze your current workload. The tool can find lists by name, eliminating the need for explicit list IDs. Results can be filtered by status, assignees, dates, and more.",
370
385
  inputSchema: {
371
386
  type: "object",
372
387
  properties: {
@@ -380,65 +395,65 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
380
395
  },
381
396
  archived: {
382
397
  type: "boolean",
383
- description: "Include archived tasks"
398
+ description: "Set to true to include archived tasks in the results"
384
399
  },
385
400
  page: {
386
401
  type: "number",
387
- description: "Page number for pagination"
402
+ description: "Page number for pagination when dealing with many tasks (starts at 0)"
388
403
  },
389
404
  order_by: {
390
405
  type: "string",
391
- description: "Field to order tasks by"
406
+ description: "Field to order tasks by (e.g., 'due_date', 'created', 'updated')"
392
407
  },
393
408
  reverse: {
394
409
  type: "boolean",
395
- description: "Reverse the order of tasks"
410
+ description: "Set to true to reverse the sort order (descending instead of ascending)"
396
411
  },
397
412
  subtasks: {
398
413
  type: "boolean",
399
- description: "Include subtasks"
414
+ description: "Set to true to include subtasks in the results"
400
415
  },
401
416
  statuses: {
402
417
  type: "array",
403
418
  items: { type: "string" },
404
- description: "Filter tasks by status"
419
+ description: "Array of status names to filter tasks by (e.g., ['To Do', 'In Progress'])"
405
420
  },
406
421
  include_closed: {
407
422
  type: "boolean",
408
- description: "Include closed tasks"
423
+ description: "Set to true to include tasks with 'Closed' status"
409
424
  },
410
425
  assignees: {
411
426
  type: "array",
412
427
  items: { type: "string" },
413
- description: "Filter tasks by assignee IDs"
428
+ description: "Array of user IDs to filter tasks by assignee"
414
429
  },
415
430
  due_date_gt: {
416
431
  type: "number",
417
- description: "Filter tasks due after this timestamp"
432
+ description: "Filter tasks due after this timestamp (Unix milliseconds)"
418
433
  },
419
434
  due_date_lt: {
420
435
  type: "number",
421
- description: "Filter tasks due before this timestamp"
436
+ description: "Filter tasks due before this timestamp (Unix milliseconds)"
422
437
  },
423
438
  date_created_gt: {
424
439
  type: "number",
425
- description: "Filter tasks created after this timestamp"
440
+ description: "Filter tasks created after this timestamp (Unix milliseconds)"
426
441
  },
427
442
  date_created_lt: {
428
443
  type: "number",
429
- description: "Filter tasks created before this timestamp"
444
+ description: "Filter tasks created before this timestamp (Unix milliseconds)"
430
445
  },
431
446
  date_updated_gt: {
432
447
  type: "number",
433
- description: "Filter tasks updated after this timestamp"
448
+ description: "Filter tasks updated after this timestamp (Unix milliseconds)"
434
449
  },
435
450
  date_updated_lt: {
436
451
  type: "number",
437
- description: "Filter tasks updated before this timestamp"
452
+ description: "Filter tasks updated before this timestamp (Unix milliseconds)"
438
453
  },
439
454
  custom_fields: {
440
455
  type: "object",
441
- description: "Filter tasks by custom field values"
456
+ description: "Object with custom field IDs as keys and desired values for filtering"
442
457
  }
443
458
  },
444
459
  required: []
@@ -446,7 +461,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
446
461
  },
447
462
  {
448
463
  name: "get_task",
449
- description: "Get detailed information about a specific ClickUp task, including attachments. Supports direct name-based lookup for tasks.",
464
+ description: "Retrieve comprehensive details about a specific ClickUp task. Use this tool when you need in-depth information about a particular task, including its description, custom fields, attachments, and other metadata. The tool can find tasks by name, eliminating the need for explicit task IDs.",
450
465
  inputSchema: {
451
466
  type: "object",
452
467
  properties: {
@@ -460,7 +475,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
460
475
  },
461
476
  listName: {
462
477
  type: "string",
463
- description: "Optional: Name of the list to narrow down task search"
478
+ description: "Optional: Name of the list to narrow down task search when multiple tasks have the same name"
464
479
  }
465
480
  },
466
481
  required: []
@@ -468,13 +483,21 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
468
483
  },
469
484
  {
470
485
  name: "delete_task",
471
- description: "Delete a task from your workspace. This action cannot be undone.",
486
+ description: "Permanently remove a task from your ClickUp workspace. Use this tool with caution as deletion cannot be undone. The tool requires an explicit task ID for safety reasons, which you can obtain by first using get_task or get_tasks to find the appropriate task ID.",
472
487
  inputSchema: {
473
488
  type: "object",
474
489
  properties: {
475
490
  taskId: {
476
491
  type: "string",
477
- description: "ID of the task to delete"
492
+ description: "ID of the task to delete - this is required for safety to prevent accidental deletions"
493
+ },
494
+ taskName: {
495
+ type: "string",
496
+ description: "Name of the task to delete - will automatically find the task by name (optional if using taskId instead)"
497
+ },
498
+ listName: {
499
+ type: "string",
500
+ description: "Optional: Name of the list to narrow down task search when multiple tasks have the same name"
478
501
  }
479
502
  },
480
503
  required: ["taskId"]
@@ -749,6 +772,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
749
772
  }
750
773
  case "get_tasks": {
751
774
  const args = request.params.arguments;
775
+ // Enforce required listName field as specified in the schema
752
776
  if (!args.listId && !args.listName) {
753
777
  throw new Error("Either listId or listName is required");
754
778
  }
@@ -772,6 +796,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
772
796
  }
773
797
  case "get_task": {
774
798
  const args = request.params.arguments;
799
+ // Enforce required taskName field as specified in the schema
775
800
  if (!args.taskId && !args.taskName) {
776
801
  throw new Error("Either taskId or taskName is required");
777
802
  }
@@ -793,22 +818,26 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
793
818
  }
794
819
  case "delete_task": {
795
820
  const args = request.params.arguments;
796
- if (!args.taskId && !args.taskName) {
797
- throw new Error("Either taskId or taskName is required");
798
- }
799
- let taskId = args.taskId;
800
- if (!taskId && args.taskName) {
801
- const result = await clickup.findTaskByName(args.taskName, undefined, args.listName);
802
- if (!result) {
803
- throw new Error(`Task with name "${args.taskName}" not found${args.listName ? ` in list "${args.listName}"` : ''}`);
821
+ // Validate the required taskId parameter
822
+ if (!args.taskId) {
823
+ throw new Error("taskId is required for deletion operations");
824
+ }
825
+ // Store the task name before deletion for the response message
826
+ let taskName = args.taskName;
827
+ if (!taskName) {
828
+ try {
829
+ const task = await clickup.getTask(args.taskId);
830
+ taskName = task.name;
831
+ }
832
+ catch (error) {
833
+ // If we can't get the task details, just use the ID in the response
804
834
  }
805
- taskId = result.id;
806
835
  }
807
- await clickup.deleteTask(taskId);
836
+ await clickup.deleteTask(args.taskId);
808
837
  return {
809
838
  content: [{
810
839
  type: "text",
811
- text: `Successfully deleted task ${args.taskName || taskId}`
840
+ text: `Successfully deleted task ${taskName || args.taskId}`
812
841
  }]
813
842
  };
814
843
  }
@@ -835,15 +864,15 @@ server.setRequestHandler(ListPromptsRequestSchema, async () => {
835
864
  prompts: [
836
865
  {
837
866
  name: "summarize_tasks",
838
- description: "Summarize all tasks in a list",
867
+ description: "Generate a comprehensive summary of tasks in a ClickUp list or workspace. The summary includes a high-level overview, groups tasks by status, highlights priority items, and identifies potential task relationships or dependencies. Useful for project status reports and team updates.",
839
868
  },
840
869
  {
841
870
  name: "analyze_priorities",
842
- description: "Analyze task priorities and suggest optimizations",
871
+ description: "Evaluate task priority distribution across your workspace and identify optimization opportunities. The analysis examines current priority assignments, identifies misaligned priorities, suggests adjustments, and recommends task sequencing based on priorities. Helpful for workload management and project planning.",
843
872
  },
844
873
  {
845
874
  name: "generate_description",
846
- description: "Generate a detailed description for a task",
875
+ description: "Create a detailed, well-structured task description with clearly defined objectives, success criteria, required resources, dependencies, and risk assessments. This prompt helps ensure tasks are comprehensively documented with all necessary information for successful execution.",
847
876
  }
848
877
  ]
849
878
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taazkareem/clickup-mcp-server",
3
- "version": "0.4.51",
3
+ "version": "0.4.52",
4
4
  "description": "ClickUp MCP Server - Integrate ClickUp tasks with AI through Model Context Protocol",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
@@ -1,36 +0,0 @@
1
- # Use a Node.js base image
2
- FROM node:18-alpine AS builder
3
-
4
- # Set the working directory
5
- WORKDIR /app
6
-
7
- # Copy package files and TypeScript config
8
- COPY package.json package-lock.json tsconfig.json ./
9
-
10
- # Copy the source files
11
- COPY src/ ./src/
12
-
13
- # Install dependencies and build
14
- RUN npm install
15
- RUN npm run build
16
-
17
- # Use a smaller image for the runtime
18
- FROM node:18-alpine AS runtime
19
-
20
- # Set the working directory
21
- WORKDIR /app
22
-
23
- # Copy the build output and node_modules from the builder stage
24
- COPY --from=builder /app/build ./build
25
- COPY --from=builder /app/node_modules ./node_modules
26
- COPY --from=builder /app/package.json ./
27
-
28
- # Set environment variables (these will be overridden by Smithery)
29
- ENV CLICKUP_API_KEY=placeholder
30
- ENV CLICKUP_TEAM_ID=placeholder
31
-
32
- # Expose the port if needed
33
- EXPOSE 8080
34
-
35
- # Define the command to run the application
36
- CMD ["node", "build/index.js"]