@griffinwork40/clickup-mcp-server 1.1.4 → 1.1.5

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 (97) hide show
  1. package/dist/schemas.d.ts +33 -0
  2. package/dist/schemas.d.ts.map +1 -0
  3. package/dist/schemas.js +34 -0
  4. package/dist/schemas.js.map +1 -0
  5. package/dist/server.d.ts +10 -0
  6. package/dist/server.d.ts.map +1 -0
  7. package/dist/server.js +56 -0
  8. package/dist/server.js.map +1 -0
  9. package/dist/tools/comments.d.ts +10 -0
  10. package/dist/tools/comments.d.ts.map +1 -0
  11. package/dist/tools/comments.js +123 -0
  12. package/dist/tools/comments.js.map +1 -0
  13. package/dist/tools/custom-fields.d.ts +10 -0
  14. package/dist/tools/custom-fields.d.ts.map +1 -0
  15. package/dist/tools/custom-fields.js +68 -0
  16. package/dist/tools/custom-fields.js.map +1 -0
  17. package/dist/tools/hierarchy.d.ts +10 -0
  18. package/dist/tools/hierarchy.d.ts.map +1 -0
  19. package/dist/tools/hierarchy.js +188 -0
  20. package/dist/tools/hierarchy.js.map +1 -0
  21. package/dist/tools/index.d.ts +13 -0
  22. package/dist/tools/index.d.ts.map +1 -0
  23. package/dist/tools/index.js +13 -0
  24. package/dist/tools/index.js.map +1 -0
  25. package/dist/tools/lists.d.ts +10 -0
  26. package/dist/tools/lists.d.ts.map +1 -0
  27. package/dist/tools/lists.js +148 -0
  28. package/dist/tools/lists.js.map +1 -0
  29. package/dist/tools/tasks-analytics.d.ts +10 -0
  30. package/dist/tools/tasks-analytics.d.ts.map +1 -0
  31. package/dist/tools/tasks-analytics.js +160 -0
  32. package/dist/tools/tasks-analytics.js.map +1 -0
  33. package/dist/tools/tasks-get.d.ts +10 -0
  34. package/dist/tools/tasks-get.d.ts.map +1 -0
  35. package/dist/tools/tasks-get.js +209 -0
  36. package/dist/tools/tasks-get.js.map +1 -0
  37. package/dist/tools/tasks-read.d.ts +10 -0
  38. package/dist/tools/tasks-read.d.ts.map +1 -0
  39. package/dist/tools/tasks-read.js +379 -0
  40. package/dist/tools/tasks-read.js.map +1 -0
  41. package/dist/tools/tasks-search.d.ts +10 -0
  42. package/dist/tools/tasks-search.d.ts.map +1 -0
  43. package/dist/tools/tasks-search.js +176 -0
  44. package/dist/tools/tasks-search.js.map +1 -0
  45. package/dist/tools/tasks-write.d.ts +10 -0
  46. package/dist/tools/tasks-write.d.ts.map +1 -0
  47. package/dist/tools/tasks-write.js +232 -0
  48. package/dist/tools/tasks-write.js.map +1 -0
  49. package/dist/tools/time-tracking.d.ts +10 -0
  50. package/dist/tools/time-tracking.d.ts.map +1 -0
  51. package/dist/tools/time-tracking.js +180 -0
  52. package/dist/tools/time-tracking.js.map +1 -0
  53. package/dist/utils/api-client.d.ts +17 -0
  54. package/dist/utils/api-client.d.ts.map +1 -0
  55. package/dist/utils/api-client.js +77 -0
  56. package/dist/utils/api-client.js.map +1 -0
  57. package/dist/utils/csv-export.d.ts +29 -0
  58. package/dist/utils/csv-export.d.ts.map +1 -0
  59. package/dist/utils/csv-export.js +204 -0
  60. package/dist/utils/csv-export.js.map +1 -0
  61. package/dist/utils/custom-fields.d.ts +25 -0
  62. package/dist/utils/custom-fields.d.ts.map +1 -0
  63. package/dist/utils/custom-fields.js +132 -0
  64. package/dist/utils/custom-fields.js.map +1 -0
  65. package/dist/utils/data-processing.d.ts +10 -0
  66. package/dist/utils/data-processing.d.ts.map +1 -0
  67. package/dist/utils/data-processing.js +18 -0
  68. package/dist/utils/data-processing.js.map +1 -0
  69. package/dist/utils/formatters/base.d.ts +21 -0
  70. package/dist/utils/formatters/base.d.ts.map +1 -0
  71. package/dist/utils/formatters/base.js +30 -0
  72. package/dist/utils/formatters/base.js.map +1 -0
  73. package/dist/utils/formatters/entities.d.ts +34 -0
  74. package/dist/utils/formatters/entities.d.ts.map +1 -0
  75. package/dist/utils/formatters/entities.js +146 -0
  76. package/dist/utils/formatters/entities.js.map +1 -0
  77. package/dist/utils/formatters/index.d.ts +6 -0
  78. package/dist/utils/formatters/index.d.ts.map +1 -0
  79. package/dist/utils/formatters/index.js +6 -0
  80. package/dist/utils/formatters/index.js.map +1 -0
  81. package/dist/utils/index.d.ts +13 -0
  82. package/dist/utils/index.d.ts.map +1 -0
  83. package/dist/utils/index.js +21 -0
  84. package/dist/utils/index.js.map +1 -0
  85. package/dist/utils/task-analytics.d.ts +14 -0
  86. package/dist/utils/task-analytics.d.ts.map +1 -0
  87. package/dist/utils/task-analytics.js +67 -0
  88. package/dist/utils/task-analytics.js.map +1 -0
  89. package/dist/utils/task-counter.d.ts +24 -0
  90. package/dist/utils/task-counter.d.ts.map +1 -0
  91. package/dist/utils/task-counter.js +52 -0
  92. package/dist/utils/task-counter.js.map +1 -0
  93. package/dist/utils/truncation.d.ts +14 -0
  94. package/dist/utils/truncation.d.ts.map +1 -0
  95. package/dist/utils/truncation.js +124 -0
  96. package/dist/utils/truncation.js.map +1 -0
  97. package/package.json +5 -5
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Entity formatters for ClickUp MCP server.
3
+ * Format ClickUp entities (tasks, lists, spaces, etc.) as markdown.
4
+ */
5
+ import { formatDate, formatPriority } from "./base.js";
6
+ /**
7
+ * Format a task as markdown (full detail)
8
+ */
9
+ export function formatTaskMarkdown(task) {
10
+ const lines = [];
11
+ lines.push(`# ${task.name} (${task.id})`);
12
+ lines.push("");
13
+ lines.push(`**Status**: ${task.status.status}`);
14
+ lines.push(`**Priority**: ${formatPriority(task.priority)}`);
15
+ lines.push(`**Created**: ${formatDate(task.date_created)}`);
16
+ lines.push(`**Updated**: ${formatDate(task.date_updated)}`);
17
+ if (task.due_date) {
18
+ lines.push(`**Due Date**: ${formatDate(task.due_date)}`);
19
+ }
20
+ if (task.assignees && task.assignees.length > 0) {
21
+ const assigneeNames = task.assignees.map(a => `@${a.username} (${a.id})`).join(", ");
22
+ lines.push(`**Assignees**: ${assigneeNames}`);
23
+ }
24
+ if (task.tags && task.tags.length > 0) {
25
+ const tagNames = task.tags.map(t => t.name).join(", ");
26
+ lines.push(`**Tags**: ${tagNames}`);
27
+ }
28
+ if (task.description) {
29
+ lines.push("");
30
+ lines.push("## Description");
31
+ lines.push(task.description);
32
+ }
33
+ lines.push("");
34
+ lines.push(`**URL**: ${task.url}`);
35
+ return lines.join("\n");
36
+ }
37
+ /**
38
+ * Format a task as compact markdown (essential fields only)
39
+ */
40
+ export function formatTaskCompact(task) {
41
+ const assignees = task.assignees && task.assignees.length > 0
42
+ ? task.assignees.map(a => a.username).join(", ")
43
+ : "Unassigned";
44
+ return `- **${task.name}** (${task.id}) | Status: ${task.status.status} | Assignees: ${assignees} | URL: ${task.url}`;
45
+ }
46
+ /**
47
+ * Format a list as markdown
48
+ */
49
+ export function formatListMarkdown(list) {
50
+ const lines = [];
51
+ lines.push(`# ${list.name} (${list.id})`);
52
+ lines.push("");
53
+ lines.push(`**Tasks**: ${list.task_count}`);
54
+ if (list.folder) {
55
+ lines.push(`**Folder**: ${list.folder.name}`);
56
+ }
57
+ if (list.space) {
58
+ lines.push(`**Space**: ${list.space.name}`);
59
+ }
60
+ if (list.statuses && list.statuses.length > 0) {
61
+ lines.push("");
62
+ lines.push("## Statuses");
63
+ for (const status of list.statuses) {
64
+ lines.push(`- ${status.status} (${status.type})`);
65
+ }
66
+ }
67
+ return lines.join("\n");
68
+ }
69
+ /**
70
+ * Format a space as markdown
71
+ */
72
+ export function formatSpaceMarkdown(space) {
73
+ const lines = [];
74
+ lines.push(`# ${space.name} (${space.id})`);
75
+ lines.push("");
76
+ lines.push(`**Private**: ${space.private ? "Yes" : "No"}`);
77
+ lines.push(`**Multiple Assignees**: ${space.multiple_assignees ? "Yes" : "No"}`);
78
+ if (space.features) {
79
+ lines.push("");
80
+ lines.push("## Features");
81
+ lines.push(`- Due Dates: ${space.features.due_dates?.enabled ? "Enabled" : "Disabled"}`);
82
+ lines.push(`- Time Tracking: ${space.features.time_tracking?.enabled ? "Enabled" : "Disabled"}`);
83
+ lines.push(`- Tags: ${space.features.tags?.enabled ? "Enabled" : "Disabled"}`);
84
+ lines.push(`- Custom Fields: ${space.features.custom_fields?.enabled ? "Enabled" : "Disabled"}`);
85
+ }
86
+ return lines.join("\n");
87
+ }
88
+ /**
89
+ * Format a folder as markdown
90
+ */
91
+ export function formatFolderMarkdown(folder) {
92
+ const lines = [];
93
+ lines.push(`# ${folder.name} (${folder.id})`);
94
+ lines.push("");
95
+ lines.push(`**Tasks**: ${folder.task_count}`);
96
+ lines.push(`**Hidden**: ${folder.hidden ? "Yes" : "No"}`);
97
+ if (folder.space) {
98
+ lines.push(`**Space**: ${folder.space.name}`);
99
+ }
100
+ if (folder.lists && folder.lists.length > 0) {
101
+ lines.push("");
102
+ lines.push("## Lists");
103
+ for (const list of folder.lists) {
104
+ lines.push(`- ${list.name} (${list.id}) - ${list.task_count} tasks`);
105
+ }
106
+ }
107
+ return lines.join("\n");
108
+ }
109
+ /**
110
+ * Format a comment as markdown
111
+ */
112
+ export function formatCommentMarkdown(comment) {
113
+ const lines = [];
114
+ lines.push(`**@${comment.user.username}** (${formatDate(comment.date)})`);
115
+ lines.push(comment.comment_text);
116
+ if (comment.resolved) {
117
+ lines.push("*(Resolved)*");
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ /**
122
+ * Format a time entry as markdown
123
+ */
124
+ export function formatTimeEntryMarkdown(entry) {
125
+ const lines = [];
126
+ const hours = Math.floor(parseInt(entry.duration) / 3600000);
127
+ const minutes = Math.floor((parseInt(entry.duration) % 3600000) / 60000);
128
+ const durationStr = `${hours}h ${minutes}m`;
129
+ lines.push(`**@${entry.user.username}** - ${durationStr}`);
130
+ lines.push(`- Start: ${formatDate(entry.start)}`);
131
+ if (entry.end) {
132
+ lines.push(`- End: ${formatDate(entry.end)}`);
133
+ }
134
+ else {
135
+ lines.push("- End: *(Still running)*");
136
+ }
137
+ if (entry.task) {
138
+ lines.push(`- Task: ${entry.task.name} (${entry.task.id})`);
139
+ }
140
+ if (entry.description) {
141
+ lines.push(`- Description: ${entry.description}`);
142
+ }
143
+ lines.push(`- Billable: ${entry.billable ? "Yes" : "No"}`);
144
+ return lines.join("\n");
145
+ }
146
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/utils/formatters/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Barrel export for formatter utilities.
3
+ */
4
+ export { formatDate, formatPriority, formatTruncationInfo } from "./base.js";
5
+ export { formatTaskMarkdown, formatTaskCompact, formatListMarkdown, formatSpaceMarkdown, formatFolderMarkdown, formatCommentMarkdown, formatTimeEntryMarkdown } from "./entities.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Barrel export for formatter utilities.
3
+ */
4
+ export { formatDate, formatPriority, formatTruncationInfo } from "./base.js";
5
+ export { formatTaskMarkdown, formatTaskCompact, formatListMarkdown, formatSpaceMarkdown, formatFolderMarkdown, formatCommentMarkdown, formatTimeEntryMarkdown } from "./entities.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Barrel export for all utility modules.
3
+ * Re-exports all utilities from their respective modules.
4
+ */
5
+ export { getApiToken, makeApiRequest, handleApiError } from "./api-client.js";
6
+ export { formatDate, formatPriority, formatTruncationInfo, formatTaskMarkdown, formatTaskCompact, formatListMarkdown, formatSpaceMarkdown, formatFolderMarkdown, formatCommentMarkdown, formatTimeEntryMarkdown } from "./formatters/index.js";
7
+ export { truncateResponse } from "./truncation.js";
8
+ export { generateTaskSummary, filterTasksByStatus } from "./task-analytics.js";
9
+ export { countTasksByStatus, type CountTasksOptions, type CountTasksResult } from "./task-counter.js";
10
+ export { normalizePhoneToE164, extractCustomFieldValue, getCustomField } from "./custom-fields.js";
11
+ export { escapeCSV, taskToCSVRow, exportTasksToCSV, type ExportCSVOptions } from "./csv-export.js";
12
+ export { getPagination } from "./data-processing.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Barrel export for all utility modules.
3
+ * Re-exports all utilities from their respective modules.
4
+ */
5
+ // API client
6
+ export { getApiToken, makeApiRequest, handleApiError } from "./api-client.js";
7
+ // Formatters
8
+ export { formatDate, formatPriority, formatTruncationInfo, formatTaskMarkdown, formatTaskCompact, formatListMarkdown, formatSpaceMarkdown, formatFolderMarkdown, formatCommentMarkdown, formatTimeEntryMarkdown } from "./formatters/index.js";
9
+ // Truncation
10
+ export { truncateResponse } from "./truncation.js";
11
+ // Task analytics
12
+ export { generateTaskSummary, filterTasksByStatus } from "./task-analytics.js";
13
+ // Task counting
14
+ export { countTasksByStatus } from "./task-counter.js";
15
+ // Custom fields
16
+ export { normalizePhoneToE164, extractCustomFieldValue, getCustomField } from "./custom-fields.js";
17
+ // CSV export
18
+ export { escapeCSV, taskToCSVRow, exportTasksToCSV } from "./csv-export.js";
19
+ // Data processing
20
+ export { getPagination } from "./data-processing.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,aAAa;AACb,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,iBAAiB;AACjB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,gBAAgB;AAChB,OAAO,EACL,kBAAkB,EAGnB,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,aAAa;AACb,OAAO,EACL,SAAS,EACT,YAAY,EACZ,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Task analytics utilities for ClickUp MCP server.
3
+ * Generate statistics and filter tasks.
4
+ */
5
+ import type { ClickUpTask } from "../types.js";
6
+ /**
7
+ * Generate summary statistics for a list of tasks
8
+ */
9
+ export declare function generateTaskSummary(tasks: ClickUpTask[]): string;
10
+ /**
11
+ * Filter tasks by status names (client-side filtering)
12
+ */
13
+ export declare function filterTasksByStatus(tasks: ClickUpTask[], statuses: string[]): ClickUpTask[];
14
+ //# sourceMappingURL=task-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-analytics.d.ts","sourceRoot":"","sources":["../../src/utils/task-analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAqDhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAS3F"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Task analytics utilities for ClickUp MCP server.
3
+ * Generate statistics and filter tasks.
4
+ */
5
+ import { formatPriority } from "./formatters/base.js";
6
+ /**
7
+ * Generate summary statistics for a list of tasks
8
+ */
9
+ export function generateTaskSummary(tasks) {
10
+ const lines = [];
11
+ lines.push("# Task Summary");
12
+ lines.push("");
13
+ lines.push(`**Total Tasks**: ${tasks.length}`);
14
+ lines.push("");
15
+ // Group by status
16
+ const statusCounts = {};
17
+ const assigneeCounts = {};
18
+ const priorityCounts = {};
19
+ for (const task of tasks) {
20
+ // Count statuses
21
+ const status = task.status.status;
22
+ statusCounts[status] = (statusCounts[status] || 0) + 1;
23
+ // Count assignees
24
+ if (task.assignees && task.assignees.length > 0) {
25
+ for (const assignee of task.assignees) {
26
+ assigneeCounts[assignee.username] = (assigneeCounts[assignee.username] || 0) + 1;
27
+ }
28
+ }
29
+ else {
30
+ assigneeCounts["Unassigned"] = (assigneeCounts["Unassigned"] || 0) + 1;
31
+ }
32
+ // Count priorities
33
+ const priority = formatPriority(task.priority);
34
+ priorityCounts[priority] = (priorityCounts[priority] || 0) + 1;
35
+ }
36
+ // Format status breakdown
37
+ lines.push("## By Status");
38
+ for (const [status, count] of Object.entries(statusCounts).sort((a, b) => b[1] - a[1])) {
39
+ lines.push(`- ${status}: ${count}`);
40
+ }
41
+ // Format assignee breakdown
42
+ lines.push("");
43
+ lines.push("## By Assignee");
44
+ for (const [assignee, count] of Object.entries(assigneeCounts).sort((a, b) => b[1] - a[1])) {
45
+ lines.push(`- ${assignee}: ${count}`);
46
+ }
47
+ // Format priority breakdown
48
+ lines.push("");
49
+ lines.push("## By Priority");
50
+ for (const [priority, count] of Object.entries(priorityCounts).sort((a, b) => b[1] - a[1])) {
51
+ lines.push(`- ${priority}: ${count}`);
52
+ }
53
+ return lines.join("\n");
54
+ }
55
+ /**
56
+ * Filter tasks by status names (client-side filtering)
57
+ */
58
+ export function filterTasksByStatus(tasks, statuses) {
59
+ if (!statuses || statuses.length === 0) {
60
+ return tasks;
61
+ }
62
+ return tasks.filter(task => {
63
+ const taskStatus = task.status?.status;
64
+ return taskStatus && statuses.includes(taskStatus);
65
+ });
66
+ }
67
+ //# sourceMappingURL=task-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-analytics.js","sourceRoot":"","sources":["../../src/utils/task-analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kBAAkB;IAClB,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,MAAM,cAAc,GAA2B,EAAE,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvD,kBAAkB;QAClB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB,EAAE,QAAkB;IAC1E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,OAAO,UAAU,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Task counting utilities for ClickUp MCP server.
3
+ * Count tasks by status with pagination handling.
4
+ */
5
+ /**
6
+ * Options for counting tasks by status
7
+ */
8
+ export interface CountTasksOptions {
9
+ archived?: boolean;
10
+ include_closed?: boolean;
11
+ statuses?: string[];
12
+ }
13
+ /**
14
+ * Result of counting tasks by status
15
+ */
16
+ export interface CountTasksResult {
17
+ total: number;
18
+ by_status: Record<string, number>;
19
+ }
20
+ /**
21
+ * Count tasks in a list by status, handling pagination internally
22
+ */
23
+ export declare function countTasksByStatus(listId: string, options?: CountTasksOptions): Promise<CountTasksResult>;
24
+ //# sourceMappingURL=task-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-counter.d.ts","sourceRoot":"","sources":["../../src/utils/task-counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAmD3B"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Task counting utilities for ClickUp MCP server.
3
+ * Count tasks by status with pagination handling.
4
+ */
5
+ import { MAX_LIMIT } from "../constants.js";
6
+ import { makeApiRequest } from "./api-client.js";
7
+ import { filterTasksByStatus } from "./task-analytics.js";
8
+ /**
9
+ * Count tasks in a list by status, handling pagination internally
10
+ */
11
+ export async function countTasksByStatus(listId, options = {}) {
12
+ const { archived = false, include_closed = false, statuses } = options;
13
+ const limit = MAX_LIMIT; // Use max limit for efficiency
14
+ let offset = 0;
15
+ let allTasks = [];
16
+ let hasMore = true;
17
+ // Fetch all tasks with pagination
18
+ while (hasMore) {
19
+ const queryParams = {
20
+ archived,
21
+ include_closed,
22
+ page: Math.floor(offset / limit),
23
+ limit: limit // FIX: Actually send limit to API
24
+ };
25
+ try {
26
+ const data = await makeApiRequest(`list/${listId}/task`, "GET", undefined, queryParams);
27
+ const tasks = data.tasks || [];
28
+ allTasks.push(...tasks);
29
+ hasMore = tasks.length === limit;
30
+ offset += limit;
31
+ }
32
+ catch (error) {
33
+ throw error;
34
+ }
35
+ }
36
+ // Filter by status if specified
37
+ let filteredTasks = allTasks;
38
+ if (statuses && statuses.length > 0) {
39
+ filteredTasks = filterTasksByStatus(allTasks, statuses);
40
+ }
41
+ // Count by status
42
+ const byStatus = {};
43
+ for (const task of filteredTasks) {
44
+ const status = task.status?.status || "Unknown";
45
+ byStatus[status] = (byStatus[status] || 0) + 1;
46
+ }
47
+ return {
48
+ total: filteredTasks.length,
49
+ by_status: byStatus
50
+ };
51
+ }
52
+ //# sourceMappingURL=task-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-counter.js","sourceRoot":"","sources":["../../src/utils/task-counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmB1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,cAAc,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvE,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,+BAA+B;IACxD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAkB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,kCAAkC;IAClC,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,WAAW,GAAQ;YACvB,QAAQ;YACR,cAAc;YACd,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAChC,KAAK,EAAE,KAAK,CAAE,kCAAkC;SACjD,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,QAAQ,MAAM,OAAO,EACrB,KAAK,EACL,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAExB,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,aAAa,GAAG,QAAQ,CAAC;IAC7B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,aAAa,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC;QAChD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,MAAM;QAC3B,SAAS,EAAE,QAAQ;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Response truncation utilities for ClickUp MCP server.
3
+ * Smart response size management with format detection.
4
+ */
5
+ import type { TruncationInfo } from "../types.js";
6
+ /**
7
+ * Truncate response if it exceeds character limit with smart boundary detection
8
+ * Detects format and uses appropriate truncation strategy
9
+ */
10
+ export declare function truncateResponse(content: string, itemCount: number, itemType?: string): {
11
+ content: string;
12
+ truncation: TruncationInfo | null;
13
+ };
14
+ //# sourceMappingURL=truncation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.d.ts","sourceRoot":"","sources":["../../src/utils/truncation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA+HlD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAgB,GACzB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAYxD"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Response truncation utilities for ClickUp MCP server.
3
+ * Smart response size management with format detection.
4
+ */
5
+ import { CHARACTER_LIMIT } from "../constants.js";
6
+ /**
7
+ * Truncate JSON response by removing items from arrays
8
+ */
9
+ function truncateJsonResponse(content, itemCount, itemType = "items") {
10
+ try {
11
+ const data = JSON.parse(content);
12
+ // Find the main array (tasks, conversations, etc.)
13
+ const arrayKey = Object.keys(data).find(key => Array.isArray(data[key]));
14
+ if (!arrayKey || !Array.isArray(data[arrayKey])) {
15
+ // If no array found, fall back to string truncation
16
+ throw new Error('No array found in JSON');
17
+ }
18
+ const items = data[arrayKey];
19
+ let keptItems = items.length;
20
+ // Remove items one by one until we're under the limit
21
+ // IMPORTANT: Check size of PRETTY-PRINTED JSON since that's what we return
22
+ while (JSON.stringify(data, null, 2).length > CHARACTER_LIMIT && data[arrayKey].length > 1) {
23
+ data[arrayKey].pop();
24
+ keptItems = data[arrayKey].length;
25
+ }
26
+ const finalContent = JSON.stringify(data, null, 2);
27
+ // Check if even a single item exceeds the limit
28
+ if (finalContent.length > CHARACTER_LIMIT) {
29
+ // Single item is too large - truncate the item's description/content fields
30
+ if (data[arrayKey].length === 1 && typeof data[arrayKey][0] === 'object') {
31
+ const item = data[arrayKey][0];
32
+ // Truncate large text fields
33
+ for (const key of Object.keys(item)) {
34
+ if (typeof item[key] === 'string' && item[key].length > 10000) {
35
+ item[key] = item[key].substring(0, 10000) + '... [truncated]';
36
+ }
37
+ }
38
+ // Retry serialization
39
+ const compactContent = JSON.stringify(data, null, 2);
40
+ if (compactContent.length <= CHARACTER_LIMIT) {
41
+ const truncation = {
42
+ truncated: true,
43
+ original_count: itemCount,
44
+ returned_count: 1,
45
+ truncation_message: `Large ${itemType} fields were truncated to fit size limits (${CHARACTER_LIMIT.toLocaleString()} chars).`
46
+ };
47
+ return { content: compactContent, truncation };
48
+ }
49
+ }
50
+ // Still too large - fall back to markdown truncation
51
+ return truncateMarkdownResponse(content, itemCount, itemType);
52
+ }
53
+ if (keptItems < items.length) {
54
+ const truncation = {
55
+ truncated: true,
56
+ original_count: items.length,
57
+ returned_count: keptItems,
58
+ truncation_message: `Response truncated from ${items.length} to ${keptItems} ${itemType} due to size limits (${CHARACTER_LIMIT.toLocaleString()} chars). Use pagination (offset/limit), add filters, or use response_mode='compact' to see more results.`
59
+ };
60
+ return { content: finalContent, truncation };
61
+ }
62
+ return { content: finalContent, truncation: null };
63
+ }
64
+ catch {
65
+ // If JSON parsing fails, fall back to string truncation
66
+ return truncateMarkdownResponse(content, itemCount, itemType);
67
+ }
68
+ }
69
+ /**
70
+ * Truncate markdown response if it exceeds character limit with smart boundary detection
71
+ */
72
+ function truncateMarkdownResponse(content, itemCount, itemType = "items") {
73
+ if (content.length <= CHARACTER_LIMIT) {
74
+ return { content, truncation: null };
75
+ }
76
+ // Find a good boundary to truncate at (look for task separators or major section breaks)
77
+ let truncateAt = CHARACTER_LIMIT;
78
+ const searchStart = Math.max(0, CHARACTER_LIMIT - 1000); // Look back up to 1000 chars
79
+ // Look for markdown headers or horizontal rules as good break points
80
+ const potentialBreaks = [
81
+ content.lastIndexOf("\n# ", truncateAt),
82
+ content.lastIndexOf("\n## ", truncateAt),
83
+ content.lastIndexOf("\n---\n", truncateAt),
84
+ content.lastIndexOf("\n\n", truncateAt)
85
+ ].filter(pos => pos >= searchStart);
86
+ if (potentialBreaks.length > 0) {
87
+ truncateAt = Math.max(...potentialBreaks);
88
+ }
89
+ else {
90
+ // Fallback to last newline
91
+ const lastNewline = content.lastIndexOf("\n", CHARACTER_LIMIT);
92
+ if (lastNewline > searchStart) {
93
+ truncateAt = lastNewline;
94
+ }
95
+ }
96
+ const finalContent = content.substring(0, truncateAt);
97
+ // Count how many complete items we kept by counting separators/headers
98
+ const headerPattern = /^# .+ \(/gm;
99
+ const keptItems = (finalContent.match(headerPattern) || []).length ||
100
+ Math.max(1, Math.floor(itemCount * (truncateAt / content.length)));
101
+ const truncation = {
102
+ truncated: true,
103
+ original_count: itemCount,
104
+ returned_count: keptItems,
105
+ truncation_message: `Response truncated from ${itemCount} to ${keptItems} ${itemType} due to size limits (${CHARACTER_LIMIT.toLocaleString()} chars). Use pagination (offset/limit), add filters, or use response_mode='compact' to see more results.`
106
+ };
107
+ return { content: finalContent, truncation };
108
+ }
109
+ /**
110
+ * Truncate response if it exceeds character limit with smart boundary detection
111
+ * Detects format and uses appropriate truncation strategy
112
+ */
113
+ export function truncateResponse(content, itemCount, itemType = "items") {
114
+ if (content.length <= CHARACTER_LIMIT) {
115
+ return { content, truncation: null };
116
+ }
117
+ // Detect if content is JSON by checking first non-whitespace character
118
+ const trimmed = content.trimStart();
119
+ if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
120
+ return truncateJsonResponse(content, itemCount, itemType);
121
+ }
122
+ return truncateMarkdownResponse(content, itemCount, itemType);
123
+ }
124
+ //# sourceMappingURL=truncation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.js","sourceRoot":"","sources":["../../src/utils/truncation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@griffinwork40/clickup-mcp-server",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "description": "MCP server for ClickUp API integration - manage tasks, projects, and workflows",
5
5
  "type": "module",
6
- "main": "dist/index.js",
6
+ "main": "dist/server.js",
7
7
  "bin": {
8
- "clickup-mcp": "dist/index.js"
8
+ "clickup-mcp": "dist/server.js"
9
9
  },
10
10
  "files": [
11
11
  "dist",
@@ -19,8 +19,8 @@
19
19
  "url": "git+https://github.com/griffinwork40/clickup-mcp.git"
20
20
  },
21
21
  "scripts": {
22
- "start": "node dist/index.js",
23
- "dev": "tsx watch src/index.ts",
22
+ "start": "node dist/server.js",
23
+ "dev": "tsx watch src/server.ts",
24
24
  "build": "tsc",
25
25
  "clean": "rm -rf dist",
26
26
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",