@taazkareem/clickup-mcp-server 0.4.20 → 0.4.22
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/build/index.js +158 -138
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -319,9 +319,16 @@ const serverCapabilities = {
|
|
|
319
319
|
// Create server instance with capabilities
|
|
320
320
|
const server = new Server({
|
|
321
321
|
name: "clickup-mcp-server",
|
|
322
|
-
version: "0.4.
|
|
322
|
+
version: "0.4.21",
|
|
323
323
|
transport: new StdioServerTransport(),
|
|
324
|
-
capabilities:
|
|
324
|
+
capabilities: {
|
|
325
|
+
tools: true,
|
|
326
|
+
prompts: true,
|
|
327
|
+
resources: {
|
|
328
|
+
list: true,
|
|
329
|
+
read: true
|
|
330
|
+
}
|
|
331
|
+
},
|
|
325
332
|
errorHandler: (error) => {
|
|
326
333
|
logError('mcp', error);
|
|
327
334
|
}
|
|
@@ -333,151 +340,164 @@ if (process.argv.includes('--stdio')) {
|
|
|
333
340
|
const transport = new StdioServerTransport();
|
|
334
341
|
// Connect server with better error handling
|
|
335
342
|
server.connect(transport)
|
|
336
|
-
.then(() => {
|
|
343
|
+
.then(async () => {
|
|
337
344
|
logInfo('server', { status: 'connected' });
|
|
338
345
|
// Register handlers AFTER connection
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
346
|
+
try {
|
|
347
|
+
// Register tool capabilities first
|
|
348
|
+
await server.registerCapabilities({
|
|
349
|
+
tools: serverCapabilities.tools,
|
|
350
|
+
prompts: serverCapabilities.prompts,
|
|
351
|
+
resources: serverCapabilities.resources
|
|
352
|
+
});
|
|
353
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
354
|
+
try {
|
|
355
|
+
logDebug('tool.request', { name: request.params.name });
|
|
356
|
+
switch (request.params.name) {
|
|
357
|
+
case "workspace_hierarchy": {
|
|
358
|
+
return await handleWorkspaceHierarchy(clickup, config.teamId);
|
|
359
|
+
}
|
|
360
|
+
case "create_task": {
|
|
361
|
+
const args = request.params.arguments;
|
|
362
|
+
return await handleCreateTask(clickup, config.teamId, args);
|
|
363
|
+
}
|
|
364
|
+
case "create_bulk_tasks": {
|
|
365
|
+
const args = request.params.arguments;
|
|
366
|
+
return await handleCreateBulkTasks(clickup, config.teamId, args);
|
|
367
|
+
}
|
|
368
|
+
case "create_list": {
|
|
369
|
+
const args = request.params.arguments;
|
|
370
|
+
return await handleCreateList(clickup, config.teamId, args);
|
|
371
|
+
}
|
|
372
|
+
case "create_folder": {
|
|
373
|
+
const args = request.params.arguments;
|
|
374
|
+
return await handleCreateFolder(clickup, config.teamId, args);
|
|
375
|
+
}
|
|
376
|
+
case "create_list_in_folder": {
|
|
377
|
+
const args = request.params.arguments;
|
|
378
|
+
return await handleCreateListInFolder(clickup, config.teamId, args);
|
|
379
|
+
}
|
|
380
|
+
case "move_task": {
|
|
381
|
+
const args = request.params.arguments;
|
|
382
|
+
return await handleMoveTask(clickup, config.teamId, args);
|
|
383
|
+
}
|
|
384
|
+
case "duplicate_task": {
|
|
385
|
+
const args = request.params.arguments;
|
|
386
|
+
return await handleDuplicateTask(clickup, config.teamId, args);
|
|
387
|
+
}
|
|
388
|
+
case "update_task": {
|
|
389
|
+
const args = request.params.arguments;
|
|
390
|
+
return await handleUpdateTask(clickup, config.teamId, args);
|
|
391
|
+
}
|
|
392
|
+
default:
|
|
393
|
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
377
394
|
}
|
|
378
|
-
default:
|
|
379
|
-
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
380
395
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
uri: `clickup://task/${task.id}`,
|
|
394
|
-
mimeType: "application/json",
|
|
395
|
-
name: task.name,
|
|
396
|
-
description: task.description || `Task in ${task.list.name} (${task.space.name})`,
|
|
397
|
-
tags: []
|
|
398
|
-
}))
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
logError('resources.list', error);
|
|
403
|
-
throw error;
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
407
|
-
try {
|
|
408
|
-
const url = new URL(request.params.uri);
|
|
409
|
-
const taskId = url.pathname.replace(/^\/task\//, '');
|
|
410
|
-
logDebug('resources.read', { taskId });
|
|
411
|
-
const task = await clickup.getTask(taskId);
|
|
412
|
-
return {
|
|
413
|
-
contents: [{
|
|
414
|
-
uri: request.params.uri,
|
|
396
|
+
catch (error) {
|
|
397
|
+
logError(`tool.${request.params.name}`, error);
|
|
398
|
+
throw error;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
402
|
+
logDebug('resources', { action: 'listing' });
|
|
403
|
+
try {
|
|
404
|
+
const { tasks, spaces } = await getAllTasks(clickup, config.teamId);
|
|
405
|
+
return {
|
|
406
|
+
resources: tasks.map(task => ({
|
|
407
|
+
uri: `clickup://task/${task.id}`,
|
|
415
408
|
mimeType: "application/json",
|
|
416
|
-
|
|
409
|
+
name: task.name,
|
|
410
|
+
description: task.description || `Task in ${task.list.name} (${task.space.name})`,
|
|
417
411
|
tags: []
|
|
418
|
-
}
|
|
412
|
+
}))
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
logError('resources.list', error);
|
|
417
|
+
throw error;
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
421
|
+
try {
|
|
422
|
+
const url = new URL(request.params.uri);
|
|
423
|
+
const taskId = url.pathname.replace(/^\/task\//, '');
|
|
424
|
+
logDebug('resources.read', { taskId });
|
|
425
|
+
const task = await clickup.getTask(taskId);
|
|
426
|
+
return {
|
|
427
|
+
contents: [{
|
|
428
|
+
uri: request.params.uri,
|
|
429
|
+
mimeType: "application/json",
|
|
430
|
+
text: JSON.stringify(task, null, 2),
|
|
431
|
+
tags: []
|
|
432
|
+
}]
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
logError('resources.read', error);
|
|
437
|
+
throw error;
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
441
|
+
logDebug('tools', { action: 'listing' });
|
|
442
|
+
const toolCapabilities = server.capabilities?.tools || {};
|
|
443
|
+
const tools = Object.entries(toolCapabilities).map(([name, tool]) => ({
|
|
444
|
+
name,
|
|
445
|
+
description: tool.description,
|
|
446
|
+
inputSchema: tool.inputSchema
|
|
447
|
+
}));
|
|
448
|
+
logDebug('tools', { count: tools.length });
|
|
449
|
+
return { tools };
|
|
450
|
+
});
|
|
451
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
452
|
+
return {
|
|
453
|
+
prompts: [
|
|
454
|
+
{
|
|
455
|
+
name: "summarize_tasks",
|
|
456
|
+
description: "Summarize all ClickUp tasks"
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
name: "analyze_task_priorities",
|
|
460
|
+
description: "Analyze task priorities"
|
|
461
|
+
}
|
|
462
|
+
]
|
|
419
463
|
};
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
{
|
|
445
|
-
name: "analyze_task_priorities",
|
|
446
|
-
description: "Analyze task priorities"
|
|
447
|
-
}
|
|
448
|
-
]
|
|
449
|
-
};
|
|
450
|
-
});
|
|
451
|
-
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
452
|
-
try {
|
|
453
|
-
switch (request.params.name) {
|
|
454
|
-
case "summarize_tasks": {
|
|
455
|
-
const output = await handleSummarizeTasks(clickup, config.teamId);
|
|
456
|
-
return {
|
|
457
|
-
content: [{
|
|
458
|
-
type: "text",
|
|
459
|
-
text: output
|
|
460
|
-
}]
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
case "analyze_task_priorities": {
|
|
464
|
-
const output = await handleAnalyzeTaskPriorities(clickup, config.teamId);
|
|
465
|
-
return {
|
|
466
|
-
content: [{
|
|
467
|
-
type: "text",
|
|
468
|
-
text: output
|
|
469
|
-
}]
|
|
470
|
-
};
|
|
464
|
+
});
|
|
465
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
466
|
+
try {
|
|
467
|
+
switch (request.params.name) {
|
|
468
|
+
case "summarize_tasks": {
|
|
469
|
+
const output = await handleSummarizeTasks(clickup, config.teamId);
|
|
470
|
+
return {
|
|
471
|
+
content: [{
|
|
472
|
+
type: "text",
|
|
473
|
+
text: output
|
|
474
|
+
}]
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
case "analyze_task_priorities": {
|
|
478
|
+
const output = await handleAnalyzeTaskPriorities(clickup, config.teamId);
|
|
479
|
+
return {
|
|
480
|
+
content: [{
|
|
481
|
+
type: "text",
|
|
482
|
+
text: output
|
|
483
|
+
}]
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
default:
|
|
487
|
+
throw new Error("Prompt not found");
|
|
471
488
|
}
|
|
472
|
-
default:
|
|
473
|
-
throw new Error("Prompt not found");
|
|
474
489
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
480
|
-
|
|
490
|
+
catch (error) {
|
|
491
|
+
logError('prompt', error);
|
|
492
|
+
throw error;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
logInfo('server', { status: 'handlers.registered' });
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
logError('server.handlers', error);
|
|
499
|
+
process.exit(1);
|
|
500
|
+
}
|
|
481
501
|
// Send initial handshake message with more details
|
|
482
502
|
const capabilities = {
|
|
483
503
|
tools: server.capabilities?.tools || {},
|
package/package.json
CHANGED