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