@taazkareem/clickup-mcp-server 0.4.40 → 0.4.42

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 taazkareem
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,14 +2,6 @@
2
2
 
3
3
  A Model Context Protocol (MCP) server for integrating ClickUp tasks with AI applications. This server allows AI agents to interact with ClickUp tasks, spaces, lists, and folders through a standardized protocol.
4
4
 
5
- ## Quick Start
6
- ```bash
7
- npx clickup-mcp-server --stdio --env CLICKUP_API_KEY=your_api_key_here --env TEAM_ID=your_team_id_here
8
- ```
9
- That's it! No installation needed. Just replace the credentials with your own:
10
- - Get your API key from [ClickUp Settings](https://app.clickup.com/settings/apps)
11
- - Find your Team ID in your ClickUp workspace URL or settings
12
-
13
5
  ## Features
14
6
 
15
7
  - 🔄 **Resource Management**
@@ -51,42 +43,36 @@ That's it! No installation needed. Just replace the credentials with your own:
51
43
  - Secure API key management
52
44
  - Environment-based configuration
53
45
 
46
+ ## Installation
47
+
48
+ ### Using npx
49
+ ```bash
50
+ npx @taazkareem/clickup-mcp-server
51
+ ```
52
+
53
+ ## Configuration
54
+
55
+ 1. Get your ClickUp API key from [ClickUp Settings](https://app.clickup.com/settings/apps)
56
+ 2. Create a `.env` file:
57
+ ```env
58
+ CLICKUP_API_KEY=your_api_key_here
59
+ TEAM_ID=your_team_id_here
60
+ ```
61
+
54
62
  ## Using with Cursor AI Composer Agent
55
63
 
56
- To add this server to Cursor AI Composer:
57
-
58
- 1. Go to Features MCP Servers in settings
59
- 2. Paste this command:
60
- ```bash
61
- npx clickup-mcp-server --stdio --env CLICKUP_API_KEY=your_api_key_here --env TEAM_ID=your_team_id_here
62
- ```
63
- 3. Replace the credentials with your own
64
- 4. Click 'Save'
65
-
66
- ## Using with Roo Code (formerly Cline)
67
-
68
- To add this server to Roo Code:
69
-
70
- 1. Open Roo Code (formerly Cline).
71
- 2. Ask Roo Code to add the ClickUp MCP Server to your project. It should add this to your `cline_mcp_settings.json` file:
72
- ```json
73
- "clickup-mcp-server": {
74
- "command": "npx",
75
- "args": [
76
- "clickup-mcp-server",
77
- "--stdio"
78
- ],
79
- "env": {
80
- "CLICKUP_API_KEY": "your_api_key_here",
81
- "TEAM_ID": "your_team_id_here"
82
- },
83
- "disabled": false,
84
- "alwaysAllow": []
85
- }
86
- ```
87
- 4. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp API key and Team ID.
88
- **Note:** Do not use the example settings and credentials provided here; use your own.
89
- 5. Save the `cline_mcp_settings.json` file.
64
+ To add this server to Cursor AI Composer, follow these steps:
65
+
66
+ 1. Go to the Features section in the settings.
67
+ 2. Add the following command under MCP Servers:
68
+
69
+ ```bash
70
+ npx -y @taazkareem/clickup-mcp-server --stdio \
71
+ --env CLICKUP_API_KEY=your_api_key_here \
72
+ --env TEAM_ID=your_team_id_here
73
+ ```
74
+ 3. Replace `your_api_key_here` and `your_team_id_here` with your actual ClickUp credentials.
75
+ 4. Click on 'Save' to add the server.
90
76
 
91
77
  > **Security Note**: Your API key will be stored securely and will not be exposed to AI models.
92
78
 
@@ -252,6 +238,3 @@ Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md)
252
238
  ## License
253
239
 
254
240
  This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
255
-
256
- ## Support My Work! 👍
257
- Solana Wallet: GjtRksihd7SWQw7hJSCDMcTxPHbgpNs7xPW3nFubNjVM
package/build/index.js CHANGED
@@ -29,9 +29,307 @@ const server = new Server({
29
29
  version: "0.1.0",
30
30
  }, {
31
31
  capabilities: {
32
- resources: {},
33
- tools: {},
34
- prompts: {},
32
+ resources: {
33
+ list: true,
34
+ read: true,
35
+ },
36
+ tools: {
37
+ workspace_hierarchy: {
38
+ description: "List complete hierarchy of the ClickUp workspace",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {},
42
+ required: []
43
+ }
44
+ },
45
+ create_task: {
46
+ description: "Create a new task in ClickUp",
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {
50
+ listId: {
51
+ type: "string",
52
+ description: "ID of the list to create the task in (optional if listName is provided)"
53
+ },
54
+ listName: {
55
+ type: "string",
56
+ description: "Name of the list to create the task in (optional if listId is provided)"
57
+ },
58
+ name: {
59
+ type: "string",
60
+ description: "Name of the task"
61
+ },
62
+ description: {
63
+ type: "string",
64
+ description: "Description of the task"
65
+ },
66
+ status: {
67
+ type: "string",
68
+ description: "Status of the task"
69
+ },
70
+ priority: {
71
+ type: "number",
72
+ description: "Priority of the task (1-4)"
73
+ },
74
+ dueDate: {
75
+ type: "string",
76
+ description: "Due date of the task (ISO string)"
77
+ }
78
+ },
79
+ required: ["name"]
80
+ }
81
+ },
82
+ create_bulk_tasks: {
83
+ description: "Create multiple tasks in a ClickUp list",
84
+ inputSchema: {
85
+ type: "object",
86
+ properties: {
87
+ listId: {
88
+ type: "string",
89
+ description: "ID of the list to create the tasks in (optional if listName is provided)"
90
+ },
91
+ listName: {
92
+ type: "string",
93
+ description: "Name of the list to create the tasks in (optional if listId is provided)"
94
+ },
95
+ tasks: {
96
+ type: "array",
97
+ description: "Array of tasks to create",
98
+ items: {
99
+ type: "object",
100
+ properties: {
101
+ name: {
102
+ type: "string",
103
+ description: "Name of the task"
104
+ },
105
+ description: {
106
+ type: "string",
107
+ description: "Description of the task"
108
+ },
109
+ status: {
110
+ type: "string",
111
+ description: "Status of the task"
112
+ },
113
+ priority: {
114
+ type: "number",
115
+ description: "Priority level (1-4)"
116
+ },
117
+ dueDate: {
118
+ type: "string",
119
+ description: "Due date (ISO string)"
120
+ },
121
+ assignees: {
122
+ type: "array",
123
+ items: {
124
+ type: "number"
125
+ },
126
+ description: "Array of user IDs to assign to the task"
127
+ }
128
+ },
129
+ required: ["name"]
130
+ }
131
+ }
132
+ },
133
+ required: ["tasks"]
134
+ }
135
+ },
136
+ create_list: {
137
+ description: "Create a new list in a ClickUp space",
138
+ inputSchema: {
139
+ type: "object",
140
+ properties: {
141
+ spaceId: {
142
+ type: "string",
143
+ description: "ID of the space to create the list in (optional if spaceName is provided)"
144
+ },
145
+ spaceName: {
146
+ type: "string",
147
+ description: "Name of the space to create the list in (optional if spaceId is provided)"
148
+ },
149
+ name: {
150
+ type: "string",
151
+ description: "Name of the list"
152
+ },
153
+ content: {
154
+ type: "string",
155
+ description: "Description or content of the list"
156
+ },
157
+ dueDate: {
158
+ type: "string",
159
+ description: "Due date for the list (ISO string)"
160
+ },
161
+ priority: {
162
+ type: "number",
163
+ description: "Priority of the list (1-4)"
164
+ },
165
+ assignee: {
166
+ type: "number",
167
+ description: "User ID to assign the list to"
168
+ },
169
+ status: {
170
+ type: "string",
171
+ description: "Status of the list"
172
+ }
173
+ },
174
+ required: ["name"]
175
+ }
176
+ },
177
+ create_folder: {
178
+ description: "Create a new folder in a ClickUp space",
179
+ inputSchema: {
180
+ type: "object",
181
+ properties: {
182
+ spaceId: {
183
+ type: "string",
184
+ description: "ID of the space to create the folder in (optional if spaceName is provided)"
185
+ },
186
+ spaceName: {
187
+ type: "string",
188
+ description: "Name of the space to create the folder in (optional if spaceId is provided)"
189
+ },
190
+ name: {
191
+ type: "string",
192
+ description: "Name of the folder"
193
+ },
194
+ override_statuses: {
195
+ type: "boolean",
196
+ description: "Whether to override space statuses"
197
+ }
198
+ },
199
+ required: ["name"]
200
+ }
201
+ },
202
+ create_list_in_folder: {
203
+ description: "Create a new list in a ClickUp folder",
204
+ inputSchema: {
205
+ type: "object",
206
+ properties: {
207
+ folderId: {
208
+ type: "string",
209
+ description: "ID of the folder to create the list in (optional if folderName and spaceId/spaceName are provided)"
210
+ },
211
+ folderName: {
212
+ type: "string",
213
+ description: "Name of the folder to create the list in"
214
+ },
215
+ spaceId: {
216
+ type: "string",
217
+ description: "ID of the space containing the folder (required if using folderName)"
218
+ },
219
+ spaceName: {
220
+ type: "string",
221
+ description: "Name of the space containing the folder (alternative to spaceId)"
222
+ },
223
+ name: {
224
+ type: "string",
225
+ description: "Name of the list"
226
+ },
227
+ content: {
228
+ type: "string",
229
+ description: "Description or content of the list"
230
+ },
231
+ status: {
232
+ type: "string",
233
+ description: "Status of the list"
234
+ }
235
+ },
236
+ required: ["name"]
237
+ }
238
+ },
239
+ move_task: {
240
+ description: "Move a task to a different list",
241
+ inputSchema: {
242
+ type: "object",
243
+ properties: {
244
+ taskId: {
245
+ type: "string",
246
+ description: "ID of the task to move"
247
+ },
248
+ listId: {
249
+ type: "string",
250
+ description: "ID of the destination list (optional if listName is provided)"
251
+ },
252
+ listName: {
253
+ type: "string",
254
+ description: "Name of the destination list (optional if listId is provided)"
255
+ }
256
+ },
257
+ required: ["taskId"]
258
+ }
259
+ },
260
+ duplicate_task: {
261
+ description: "Duplicate a task to a list",
262
+ inputSchema: {
263
+ type: "object",
264
+ properties: {
265
+ taskId: {
266
+ type: "string",
267
+ description: "ID of the task to duplicate"
268
+ },
269
+ listId: {
270
+ type: "string",
271
+ description: "ID of the destination list (optional if listName is provided)"
272
+ },
273
+ listName: {
274
+ type: "string",
275
+ description: "Name of the destination list (optional if listId is provided)"
276
+ }
277
+ },
278
+ required: ["taskId"]
279
+ }
280
+ },
281
+ update_task: {
282
+ description: "Update an existing task in ClickUp",
283
+ inputSchema: {
284
+ type: "object",
285
+ properties: {
286
+ taskId: {
287
+ type: "string",
288
+ description: "ID of the task to update"
289
+ },
290
+ name: {
291
+ type: "string",
292
+ description: "New name of the task"
293
+ },
294
+ description: {
295
+ type: "string",
296
+ description: "New description of the task"
297
+ },
298
+ status: {
299
+ type: "string",
300
+ description: "New status of the task"
301
+ },
302
+ priority: {
303
+ type: "number",
304
+ description: "New priority of the task (1-4)"
305
+ },
306
+ dueDate: {
307
+ type: "string",
308
+ description: "New due date of the task (ISO string)"
309
+ }
310
+ },
311
+ required: ["taskId"]
312
+ }
313
+ }
314
+ },
315
+ prompts: {
316
+ summarize_tasks: {
317
+ description: "Summarize tasks in the workspace",
318
+ inputSchema: {
319
+ type: "object",
320
+ properties: {},
321
+ required: []
322
+ }
323
+ },
324
+ analyze_priorities: {
325
+ description: "Analyze task priorities",
326
+ inputSchema: {
327
+ type: "object",
328
+ properties: {},
329
+ required: []
330
+ }
331
+ }
332
+ },
35
333
  },
36
334
  });
37
335
  console.log('MCP server created');
@@ -585,13 +883,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
585
883
  if (!args.taskId) {
586
884
  throw new Error("taskId is required");
587
885
  }
588
- const dueDate = args.due_date ? new Date(args.due_date).getTime() : undefined;
589
886
  const task = await clickup.updateTask(args.taskId, {
590
887
  name: args.name,
591
888
  description: args.description,
592
889
  status: args.status,
593
890
  priority: args.priority,
594
- due_date: dueDate
891
+ due_date: args.due_date
595
892
  });
596
893
  return {
597
894
  content: [{
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@taazkareem/clickup-mcp-server",
3
- "version": "0.4.40",
3
+ "version": "0.4.42",
4
4
  "description": "ClickUp MCP Server - Integrate ClickUp tasks with AI through Model Context Protocol",
5
5
  "type": "module",
6
- "main": "build/index.js",
6
+ "main": "./build/index.js",
7
7
  "bin": {
8
- "clickup-mcp-server": "build/index.js"
8
+ "clickup-mcp-server": "build/index.js",
9
+ "@taazkareem/clickup-mcp-server": "build/index.js"
9
10
  },
10
11
  "files": [
11
12
  "build",
@@ -35,7 +36,7 @@
35
36
  "license": "MIT",
36
37
  "repository": {
37
38
  "type": "git",
38
- "url": "https://github.com/taazkareem/clickup-mcp-server.git"
39
+ "url": "git+https://github.com/taazkareem/clickup-mcp-server.git"
39
40
  },
40
41
  "bugs": {
41
42
  "url": "https://github.com/taazkareem/clickup-mcp-server/issues"
@@ -43,8 +44,10 @@
43
44
  "homepage": "https://github.com/taazkareem/clickup-mcp-server#readme",
44
45
  "dependencies": {
45
46
  "@modelcontextprotocol/sdk": "^1.4.1",
47
+ "@modelcontextprotocol/server-github": "^2025.1.23",
46
48
  "axios": "^1.6.7",
47
- "dotenv": "^16.4.1"
49
+ "dotenv": "^16.4.1",
50
+ "zod": "^3.24.2"
48
51
  },
49
52
  "devDependencies": {
50
53
  "@types/node": "^20.11.16",
@@ -1,41 +0,0 @@
1
- class Logger {
2
- logLevel = 'info';
3
- setLogLevel(level) {
4
- this.logLevel = level;
5
- }
6
- shouldLog(level) {
7
- const levels = {
8
- debug: 0,
9
- info: 1,
10
- warn: 2,
11
- error: 3
12
- };
13
- return levels[level] >= levels[this.logLevel];
14
- }
15
- formatMessage(level, message, ...args) {
16
- const timestamp = new Date().toISOString();
17
- const formattedArgs = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg).join(' ');
18
- return `[${timestamp}] ${level.toUpperCase()}: ${message} ${formattedArgs}`.trim();
19
- }
20
- debug(message, ...args) {
21
- if (this.shouldLog('debug')) {
22
- console.debug(this.formatMessage('debug', message, ...args));
23
- }
24
- }
25
- info(message, ...args) {
26
- if (this.shouldLog('info')) {
27
- console.info(this.formatMessage('info', message, ...args));
28
- }
29
- }
30
- warn(message, ...args) {
31
- if (this.shouldLog('warn')) {
32
- console.warn(this.formatMessage('warn', message, ...args));
33
- }
34
- }
35
- error(message, ...args) {
36
- if (this.shouldLog('error')) {
37
- console.error(this.formatMessage('error', message, ...args));
38
- }
39
- }
40
- }
41
- export const logger = new Logger();