Skip to content

Commit b383427

Browse files
committed
- Fixed critical bug. Server is operational
- Bump package version to 0.4.59
1 parent a20f9f4 commit b383427

File tree

4 files changed

+39
-35
lines changed

4 files changed

+39
-35
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ npx -y @taazkareem/clickup-mcp-server \
6161
| [update_task](docs/api-reference.md#task-management) | Modify task | `taskId`/`taskName` |
6262
| [get_tasks](docs/api-reference.md#task-retrieval) | Get tasks from list | `listId`/`listName` |
6363
| [get_task](docs/api-reference.md#task-retrieval) | Get task details | `taskId`/`taskName` |
64-
| [delete_task](docs/api-reference.md#task-management) | Remove task | `taskId` |
64+
| [delete_task](docs/api-reference.md#task-management) | Remove task | `taskId`/`taskName` |
6565
| [move_task](docs/api-reference.md#task-management) | Move task | `taskId`/`taskName`, `listId`/`listName` |
6666
| [duplicate_task](docs/api-reference.md#task-management) | Copy task | `taskId`/`taskName`, `listId`/`listName` |
6767
| [create_list](docs/api-reference.md#list-management) | Create list in space | `name`, `spaceId`/`spaceName` |

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@taazkareem/clickup-mcp-server",
3-
"version": "0.4.55",
3+
"version": "0.4.59",
44
"description": "ClickUp MCP Server - Integrate ClickUp tasks with AI through Model Context Protocol",
55
"type": "module",
66
"main": "build/index.js",

src/index.ts

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
131131
description: "Due date of the task (Unix timestamp in milliseconds). Convert dates to this format before submitting."
132132
}
133133
},
134-
required: []
134+
required: ["name"]
135135
}
136136
},
137137
{
@@ -190,7 +190,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
190190
}
191191
}
192192
},
193-
required: []
193+
required: ["tasks"]
194194
}
195195
},
196196
{
@@ -232,7 +232,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
232232
description: "Status of the list"
233233
}
234234
},
235-
required: []
235+
required: ["name"]
236236
}
237237
},
238238
{
@@ -258,7 +258,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
258258
description: "Whether to override space statuses with folder-specific statuses"
259259
}
260260
},
261-
required: []
261+
required: ["name"]
262262
}
263263
},
264264
{
@@ -267,6 +267,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
267267
inputSchema: {
268268
type: "object",
269269
properties: {
270+
name: {
271+
type: "string",
272+
description: "Name of the list"
273+
},
270274
folderId: {
271275
type: "string",
272276
description: "ID of the folder to create the list in (optional if using folderName instead). If you have this ID from a previous response, use it directly rather than looking up by name."
@@ -283,10 +287,6 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
283287
type: "string",
284288
description: "Name of the space containing the folder - will automatically find the space by name (optional if using spaceId instead). Only use this if you don't already have the space ID from previous responses."
285289
},
286-
name: {
287-
type: "string",
288-
description: "Name of the list"
289-
},
290290
content: {
291291
type: "string",
292292
description: "Description or content of the list"
@@ -296,7 +296,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
296296
description: "Status of the list (uses folder default if not specified)"
297297
}
298298
},
299-
required: []
299+
required: ["name"]
300300
}
301301
},
302302
{
@@ -1123,33 +1123,17 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
11231123
}
11241124

11251125
case "delete_task": {
1126-
const args = request.params.arguments as {
1127-
taskId: string; // Make taskId required
1128-
taskName?: string;
1129-
listName?: string;
1130-
};
1131-
1132-
// Validate the required taskId parameter
1133-
if (!args.taskId) {
1134-
throw new Error("taskId is required for deletion operations");
1135-
}
1136-
1137-
// Store the task name before deletion for the response message
1138-
let taskName = args.taskName;
1139-
if (!taskName) {
1140-
try {
1141-
const task = await clickup.getTask(args.taskId);
1142-
taskName = task.name;
1143-
} catch (error) {
1144-
// If we can't get the task details, just use the ID in the response
1145-
}
1126+
const args = request.params.arguments as { taskId?: string; taskName?: string; listName?: string };
1127+
1128+
if (!args.taskId && !args.taskName) {
1129+
throw new Error("Either taskId or taskName is required");
11461130
}
11471131

1148-
await clickup.deleteTask(args.taskId);
1132+
await clickup.deleteTask(args.taskId, args.taskName, args.listName);
11491133
return {
11501134
content: [{
11511135
type: "text",
1152-
text: `Successfully deleted task ${taskName || args.taskId}`
1136+
text: `Successfully deleted task${args.taskName ? ` "${args.taskName}"` : ` with ID ${args.taskId}`}`
11531137
}]
11541138
};
11551139
}

src/services/clickup.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,31 @@ export class ClickUpService {
281281

282282
/**
283283
* Deletes a task from the workspace.
284+
* Can delete by taskId directly or find by taskName first.
284285
* Handles rate limiting automatically.
286+
* @param taskId - ID of the task to delete (optional if taskName provided)
287+
* @param taskName - Name of the task to delete (optional if taskId provided)
288+
* @param listName - Optional list name to narrow down task search
289+
* @throws Error if neither taskId nor taskName is provided, or if task not found
285290
*/
286-
async deleteTask(taskId: string): Promise<void> {
291+
async deleteTask(taskId?: string, taskName?: string, listName?: string): Promise<void> {
287292
return this.makeRequest(async () => {
288-
await this.client.delete(`/task/${taskId}`);
293+
let finalTaskId = taskId;
294+
295+
// If no taskId but taskName provided, find the task first
296+
if (!taskId && taskName) {
297+
const taskInfo = await this.findTaskByName(taskName, undefined, listName);
298+
if (!taskInfo) {
299+
throw new Error(`Task "${taskName}" not found${listName ? ` in list "${listName}"` : ''}`);
300+
}
301+
finalTaskId = taskInfo.id;
302+
}
303+
304+
if (!finalTaskId) {
305+
throw new Error('Either taskId or taskName must be provided');
306+
}
307+
308+
await this.client.delete(`/task/${finalTaskId}`);
289309
});
290310
}
291311

0 commit comments

Comments
 (0)