@taazkareem/clickup-mcp-server 0.2.0 → 0.3.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/README.md +35 -30
- package/build/index.js +65 -0
- package/build/services/clickup.js +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -58,12 +58,26 @@ CLICKUP_API_KEY=your_api_key_here
|
|
|
58
58
|
TEAM_ID=your_team_id_here
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
##
|
|
61
|
+
## Using with Cursor AI Composer
|
|
62
|
+
|
|
63
|
+
To add this server to Cursor AI Composer, follow these steps:
|
|
64
|
+
|
|
65
|
+
1. Go to the Features section in the settings.
|
|
66
|
+
2. Add the following command under MCP Servers:
|
|
62
67
|
|
|
63
|
-
### Starting the Server
|
|
64
68
|
```bash
|
|
65
|
-
clickup-mcp-server
|
|
69
|
+
npx -y @taazkareem/clickup-mcp-server \
|
|
70
|
+
--env CLICKUP_API_KEY=your_api_key_here \
|
|
71
|
+
--env TEAM_ID=your_team_id_here
|
|
66
72
|
```
|
|
73
|
+
3. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp credentials.
|
|
74
|
+
4. Click on 'Save' to add the server.
|
|
75
|
+
|
|
76
|
+
You can get these values from:
|
|
77
|
+
- `CLICKUP_API_KEY`: Get from [ClickUp Settings > Apps](https://app.clickup.com/settings/apps)
|
|
78
|
+
- `TEAM_ID`: Your ClickUp Team ID (found in the URL when viewing your workspace or via API)
|
|
79
|
+
|
|
80
|
+
> **Security Note**: Your API key will be stored securely and will not be exposed to AI models.
|
|
67
81
|
|
|
68
82
|
### Available Tools
|
|
69
83
|
|
|
@@ -84,7 +98,19 @@ clickup-mcp-server
|
|
|
84
98
|
- `dueDate`: Due date (ISO string)
|
|
85
99
|
- `assignees`: Array of user IDs
|
|
86
100
|
|
|
87
|
-
3. **
|
|
101
|
+
3. **create_bulk_tasks**
|
|
102
|
+
- Creates multiple tasks simultaneously in a list
|
|
103
|
+
- Required parameters:
|
|
104
|
+
- `listId`: ID of the list to create the tasks in
|
|
105
|
+
- `tasks`: Array of task objects, each containing:
|
|
106
|
+
- `name`: Name of the task (required)
|
|
107
|
+
- `description`: Task description (optional)
|
|
108
|
+
- `status`: Task status (optional)
|
|
109
|
+
- `priority`: Priority level 1-4 (optional)
|
|
110
|
+
- `dueDate`: Due date ISO string (optional)
|
|
111
|
+
- `assignees`: Array of user IDs (optional)
|
|
112
|
+
|
|
113
|
+
4. **create_list**
|
|
88
114
|
- Creates a new list in a space
|
|
89
115
|
- Required parameters:
|
|
90
116
|
- `name`: Name of the list
|
|
@@ -96,7 +122,7 @@ clickup-mcp-server
|
|
|
96
122
|
- `priority`: Priority level (1-4)
|
|
97
123
|
- `dueDate`: Due date (ISO string)
|
|
98
124
|
|
|
99
|
-
|
|
125
|
+
5. **create_folder**
|
|
100
126
|
- Creates a new folder in a space
|
|
101
127
|
- Required parameters:
|
|
102
128
|
- `name`: Name of the folder
|
|
@@ -105,7 +131,7 @@ clickup-mcp-server
|
|
|
105
131
|
- `spaceName`: Name of the space (optional if spaceId provided)
|
|
106
132
|
- `override_statuses`: Whether to override space statuses
|
|
107
133
|
|
|
108
|
-
|
|
134
|
+
6. **create_list_in_folder**
|
|
109
135
|
- Creates a new list within a folder
|
|
110
136
|
- Required parameters:
|
|
111
137
|
- `name`: Name of the list
|
|
@@ -117,19 +143,19 @@ clickup-mcp-server
|
|
|
117
143
|
- `content`: List description
|
|
118
144
|
- `status`: List status
|
|
119
145
|
|
|
120
|
-
|
|
146
|
+
7. **move_task**
|
|
121
147
|
- Moves a task to a different list
|
|
122
148
|
- Required parameters:
|
|
123
149
|
- `taskId`: ID of the task to move
|
|
124
150
|
- `listId`: ID of the destination list
|
|
125
151
|
|
|
126
|
-
|
|
152
|
+
8. **duplicate_task**
|
|
127
153
|
- Creates a copy of a task in a specified list
|
|
128
154
|
- Required parameters:
|
|
129
155
|
- `taskId`: ID of the task to duplicate
|
|
130
156
|
- `listId`: ID of the destination list
|
|
131
157
|
|
|
132
|
-
|
|
158
|
+
9. **update_task**
|
|
133
159
|
- Updates an existing task
|
|
134
160
|
- Required parameters:
|
|
135
161
|
- `taskId`: ID of the task to update
|
|
@@ -181,27 +207,6 @@ The server provides clear error messages for common scenarios:
|
|
|
181
207
|
- Permission issues
|
|
182
208
|
- API errors
|
|
183
209
|
|
|
184
|
-
## Using with Cursor AI Composer
|
|
185
|
-
|
|
186
|
-
To add this server to Cursor AI Composer, follow these steps:
|
|
187
|
-
|
|
188
|
-
1. Go to the Features section in the settings.
|
|
189
|
-
2. Add the following command under MCP Servers:
|
|
190
|
-
|
|
191
|
-
```bash
|
|
192
|
-
npx -y @taazkareem/clickup-mcp-server \
|
|
193
|
-
--env CLICKUP_API_KEY=your_api_key_here \
|
|
194
|
-
--env TEAM_ID=your_team_id_here
|
|
195
|
-
```
|
|
196
|
-
3. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp credentials.
|
|
197
|
-
4. Click on 'Save' to add the server.
|
|
198
|
-
|
|
199
|
-
You can get these values from:
|
|
200
|
-
- `CLICKUP_API_KEY`: Get from [ClickUp Settings > Apps](https://app.clickup.com/settings/apps)
|
|
201
|
-
- `TEAM_ID`: Your ClickUp Team ID (found in the URL when viewing your workspace or via API)
|
|
202
|
-
|
|
203
|
-
> **Security Note**: Your API key will be stored securely and will not be exposed to AI models.
|
|
204
|
-
|
|
205
210
|
## Development
|
|
206
211
|
|
|
207
212
|
1. Clone the repository:
|
package/build/index.js
CHANGED
|
@@ -143,6 +143,57 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
143
143
|
required: ["listId", "name"]
|
|
144
144
|
}
|
|
145
145
|
},
|
|
146
|
+
{
|
|
147
|
+
name: "create_bulk_tasks",
|
|
148
|
+
description: "Create multiple tasks in a ClickUp list",
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: "object",
|
|
151
|
+
properties: {
|
|
152
|
+
listId: {
|
|
153
|
+
type: "string",
|
|
154
|
+
description: "ID of the list to create the tasks in"
|
|
155
|
+
},
|
|
156
|
+
tasks: {
|
|
157
|
+
type: "array",
|
|
158
|
+
description: "Array of tasks to create",
|
|
159
|
+
items: {
|
|
160
|
+
type: "object",
|
|
161
|
+
properties: {
|
|
162
|
+
name: {
|
|
163
|
+
type: "string",
|
|
164
|
+
description: "Name of the task"
|
|
165
|
+
},
|
|
166
|
+
description: {
|
|
167
|
+
type: "string",
|
|
168
|
+
description: "Description of the task"
|
|
169
|
+
},
|
|
170
|
+
status: {
|
|
171
|
+
type: "string",
|
|
172
|
+
description: "Status of the task"
|
|
173
|
+
},
|
|
174
|
+
priority: {
|
|
175
|
+
type: "number",
|
|
176
|
+
description: "Priority level (1-4)"
|
|
177
|
+
},
|
|
178
|
+
dueDate: {
|
|
179
|
+
type: "string",
|
|
180
|
+
description: "Due date of the task (ISO string)"
|
|
181
|
+
},
|
|
182
|
+
assignees: {
|
|
183
|
+
type: "array",
|
|
184
|
+
items: {
|
|
185
|
+
type: "number"
|
|
186
|
+
},
|
|
187
|
+
description: "Array of user IDs to assign to the task"
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
required: ["name"]
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
required: ["listId", "tasks"]
|
|
195
|
+
}
|
|
196
|
+
},
|
|
146
197
|
{
|
|
147
198
|
name: "create_list",
|
|
148
199
|
description: "Create a new list in a ClickUp space",
|
|
@@ -374,6 +425,20 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
374
425
|
}]
|
|
375
426
|
};
|
|
376
427
|
}
|
|
428
|
+
case "create_bulk_tasks": {
|
|
429
|
+
const args = request.params.arguments;
|
|
430
|
+
if (!args.listId || !args.tasks || !args.tasks.length) {
|
|
431
|
+
throw new Error("listId and at least one task are required");
|
|
432
|
+
}
|
|
433
|
+
const { listId, tasks } = args;
|
|
434
|
+
const createdTasks = await clickup.createBulkTasks(listId, { tasks });
|
|
435
|
+
return {
|
|
436
|
+
content: [{
|
|
437
|
+
type: "text",
|
|
438
|
+
text: `Created ${createdTasks.length} tasks:\n${createdTasks.map(task => `- ${task.id}: ${task.name}`).join('\n')}`
|
|
439
|
+
}]
|
|
440
|
+
};
|
|
441
|
+
}
|
|
377
442
|
case "create_list": {
|
|
378
443
|
const args = request.params.arguments;
|
|
379
444
|
if (!args.name) {
|
|
@@ -38,6 +38,10 @@ export class ClickUpService {
|
|
|
38
38
|
const response = await this.client.post(`/list/${listId}/task`, data);
|
|
39
39
|
return response.data;
|
|
40
40
|
}
|
|
41
|
+
async createBulkTasks(listId, data) {
|
|
42
|
+
const tasks = await Promise.all(data.tasks.map(taskData => this.createTask(listId, taskData)));
|
|
43
|
+
return tasks;
|
|
44
|
+
}
|
|
41
45
|
async updateTask(taskId, data) {
|
|
42
46
|
const response = await this.client.put(`/task/${taskId}`, data);
|
|
43
47
|
return response.data;
|
package/package.json
CHANGED