@griffinwork40/clickup-mcp-server 1.1.4 → 1.1.6
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/README.md +583 -71
- package/dist/schemas.d.ts +33 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +34 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/comments.d.ts +10 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +123 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/custom-fields.d.ts +10 -0
- package/dist/tools/custom-fields.d.ts.map +1 -0
- package/dist/tools/custom-fields.js +68 -0
- package/dist/tools/custom-fields.js.map +1 -0
- package/dist/tools/hierarchy.d.ts +10 -0
- package/dist/tools/hierarchy.d.ts.map +1 -0
- package/dist/tools/hierarchy.js +188 -0
- package/dist/tools/hierarchy.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lists.d.ts +10 -0
- package/dist/tools/lists.d.ts.map +1 -0
- package/dist/tools/lists.js +148 -0
- package/dist/tools/lists.js.map +1 -0
- package/dist/tools/tasks-analytics.d.ts +10 -0
- package/dist/tools/tasks-analytics.d.ts.map +1 -0
- package/dist/tools/tasks-analytics.js +160 -0
- package/dist/tools/tasks-analytics.js.map +1 -0
- package/dist/tools/tasks-get.d.ts +10 -0
- package/dist/tools/tasks-get.d.ts.map +1 -0
- package/dist/tools/tasks-get.js +209 -0
- package/dist/tools/tasks-get.js.map +1 -0
- package/dist/tools/tasks-read.d.ts +10 -0
- package/dist/tools/tasks-read.d.ts.map +1 -0
- package/dist/tools/tasks-read.js +379 -0
- package/dist/tools/tasks-read.js.map +1 -0
- package/dist/tools/tasks-search.d.ts +10 -0
- package/dist/tools/tasks-search.d.ts.map +1 -0
- package/dist/tools/tasks-search.js +176 -0
- package/dist/tools/tasks-search.js.map +1 -0
- package/dist/tools/tasks-write.d.ts +10 -0
- package/dist/tools/tasks-write.d.ts.map +1 -0
- package/dist/tools/tasks-write.js +232 -0
- package/dist/tools/tasks-write.js.map +1 -0
- package/dist/tools/time-tracking.d.ts +10 -0
- package/dist/tools/time-tracking.d.ts.map +1 -0
- package/dist/tools/time-tracking.js +180 -0
- package/dist/tools/time-tracking.js.map +1 -0
- package/dist/utils/api-client.d.ts +17 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +77 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/csv-export.d.ts +29 -0
- package/dist/utils/csv-export.d.ts.map +1 -0
- package/dist/utils/csv-export.js +204 -0
- package/dist/utils/csv-export.js.map +1 -0
- package/dist/utils/custom-fields.d.ts +25 -0
- package/dist/utils/custom-fields.d.ts.map +1 -0
- package/dist/utils/custom-fields.js +132 -0
- package/dist/utils/custom-fields.js.map +1 -0
- package/dist/utils/data-processing.d.ts +10 -0
- package/dist/utils/data-processing.d.ts.map +1 -0
- package/dist/utils/data-processing.js +18 -0
- package/dist/utils/data-processing.js.map +1 -0
- package/dist/utils/formatters/base.d.ts +21 -0
- package/dist/utils/formatters/base.d.ts.map +1 -0
- package/dist/utils/formatters/base.js +30 -0
- package/dist/utils/formatters/base.js.map +1 -0
- package/dist/utils/formatters/entities.d.ts +34 -0
- package/dist/utils/formatters/entities.d.ts.map +1 -0
- package/dist/utils/formatters/entities.js +146 -0
- package/dist/utils/formatters/entities.js.map +1 -0
- package/dist/utils/formatters/index.d.ts +6 -0
- package/dist/utils/formatters/index.d.ts.map +1 -0
- package/dist/utils/formatters/index.js +6 -0
- package/dist/utils/formatters/index.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/task-analytics.d.ts +14 -0
- package/dist/utils/task-analytics.d.ts.map +1 -0
- package/dist/utils/task-analytics.js +67 -0
- package/dist/utils/task-analytics.js.map +1 -0
- package/dist/utils/task-counter.d.ts +24 -0
- package/dist/utils/task-counter.d.ts.map +1 -0
- package/dist/utils/task-counter.js +52 -0
- package/dist/utils/task-counter.js.map +1 -0
- package/dist/utils/truncation.d.ts +14 -0
- package/dist/utils/truncation.d.ts.map +1 -0
- package/dist/utils/truncation.js +124 -0
- package/dist/utils/truncation.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":"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"}
|
|
@@ -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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"}
|