@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.
Files changed (2) hide show
  1. package/build/index.js +158 -138
  2. 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.19",
322
+ version: "0.4.21",
323
323
  transport: new StdioServerTransport(),
324
- capabilities: serverCapabilities,
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
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
340
- try {
341
- logDebug('tool.request', { name: request.params.name });
342
- switch (request.params.name) {
343
- case "workspace_hierarchy": {
344
- return await handleWorkspaceHierarchy(clickup, config.teamId);
345
- }
346
- case "create_task": {
347
- const args = request.params.arguments;
348
- return await handleCreateTask(clickup, config.teamId, args);
349
- }
350
- case "create_bulk_tasks": {
351
- const args = request.params.arguments;
352
- return await handleCreateBulkTasks(clickup, config.teamId, args);
353
- }
354
- case "create_list": {
355
- const args = request.params.arguments;
356
- return await handleCreateList(clickup, config.teamId, args);
357
- }
358
- case "create_folder": {
359
- const args = request.params.arguments;
360
- return await handleCreateFolder(clickup, config.teamId, args);
361
- }
362
- case "create_list_in_folder": {
363
- const args = request.params.arguments;
364
- return await handleCreateListInFolder(clickup, config.teamId, args);
365
- }
366
- case "move_task": {
367
- const args = request.params.arguments;
368
- return await handleMoveTask(clickup, config.teamId, args);
369
- }
370
- case "duplicate_task": {
371
- const args = request.params.arguments;
372
- return await handleDuplicateTask(clickup, config.teamId, args);
373
- }
374
- case "update_task": {
375
- const args = request.params.arguments;
376
- return await handleUpdateTask(clickup, config.teamId, args);
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
- catch (error) {
383
- logError(`tool.${request.params.name}`, error);
384
- throw error;
385
- }
386
- });
387
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
388
- logDebug('resources', { action: 'listing' });
389
- try {
390
- const { tasks, spaces } = await getAllTasks(clickup, config.teamId);
391
- return {
392
- resources: tasks.map(task => ({
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
- text: JSON.stringify(task, null, 2),
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
- catch (error) {
422
- logError('resources.read', error);
423
- throw error;
424
- }
425
- });
426
- server.setRequestHandler(ListToolsRequestSchema, async () => {
427
- logDebug('tools', { action: 'listing' });
428
- const toolCapabilities = server.capabilities?.tools || {};
429
- const tools = Object.entries(toolCapabilities).map(([name, tool]) => ({
430
- name,
431
- description: tool.description,
432
- inputSchema: tool.inputSchema
433
- }));
434
- logDebug('tools', { count: tools.length });
435
- return { tools };
436
- });
437
- server.setRequestHandler(ListPromptsRequestSchema, async () => {
438
- return {
439
- prompts: [
440
- {
441
- name: "summarize_tasks",
442
- description: "Summarize all ClickUp tasks"
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
- catch (error) {
477
- logError('prompt', error);
478
- throw error;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taazkareem/clickup-mcp-server",
3
- "version": "0.4.20",
3
+ "version": "0.4.22",
4
4
  "description": "ClickUp MCP Server - Integrate ClickUp tasks with AI through Model Context Protocol",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",