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