@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.
Files changed (2) hide show
  1. package/build/index.js +155 -151
  2. 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.22",
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
- // Set up stdio transport and connect first
346
- const transport = new StdioServerTransport();
347
- // Connect server with better error handling
348
- server.connect(transport)
349
- .then(async () => {
350
- logInfo('server', { status: 'connected' });
351
- // Register handlers AFTER connection
352
- try {
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
- 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}`,
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
- name: task.name,
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
- 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");
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
- 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
- }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taazkareem/clickup-mcp-server",
3
- "version": "0.4.23",
3
+ "version": "0.4.25",
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",