@taazkareem/clickup-mcp-server 0.4.23 → 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.
Files changed (2) hide show
  1. package/build/index.js +152 -159
  2. package/package.json +1 -1
package/build/index.js CHANGED
@@ -319,17 +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.22",
323
- transport: new StdioServerTransport(),
322
+ version: "0.4.23",
324
323
  capabilities: {
325
- tools: {
326
- enabled: true,
327
- schemas: serverCapabilities.tools
328
- },
329
- prompts: {
330
- enabled: true,
331
- schemas: serverCapabilities.prompts
332
- },
324
+ tools: serverCapabilities.tools,
325
+ prompts: serverCapabilities.prompts,
333
326
  resources: {
334
327
  list: true,
335
328
  read: true
@@ -342,162 +335,162 @@ const server = new Server({
342
335
  // Server startup logic
343
336
  if (process.argv.includes('--stdio')) {
344
337
  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}`);
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
- 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}`,
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
- name: task.name,
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
- 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");
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
- 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
- }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taazkareem/clickup-mcp-server",
3
- "version": "0.4.23",
3
+ "version": "0.4.24",
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",