@griffinwork40/clickup-mcp-server 1.1.3 → 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.
- 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/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +2 -1
- package/dist/utils.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schemas for input validation in ClickUp MCP server.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { ResponseFormat, ResponseMode } from "./constants.js";
|
|
6
|
+
/**
|
|
7
|
+
* Response format schema - markdown or JSON
|
|
8
|
+
*/
|
|
9
|
+
export declare const ResponseFormatSchema: z.ZodDefault<z.ZodNativeEnum<typeof ResponseFormat>>;
|
|
10
|
+
/**
|
|
11
|
+
* Response mode schema - controls detail level
|
|
12
|
+
*/
|
|
13
|
+
export declare const ResponseModeSchema: z.ZodDefault<z.ZodNativeEnum<typeof ResponseMode>>;
|
|
14
|
+
/**
|
|
15
|
+
* Pagination schema for offset-based pagination
|
|
16
|
+
*/
|
|
17
|
+
export declare const PaginationSchema: z.ZodObject<{
|
|
18
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
limit: number;
|
|
22
|
+
offset: number;
|
|
23
|
+
}, {
|
|
24
|
+
limit?: number | undefined;
|
|
25
|
+
offset?: number | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Type exports for use in tool handlers
|
|
29
|
+
*/
|
|
30
|
+
export type ResponseFormatType = z.infer<typeof ResponseFormatSchema>;
|
|
31
|
+
export type ResponseModeType = z.infer<typeof ResponseModeSchema>;
|
|
32
|
+
export type PaginationType = z.infer<typeof PaginationSchema>;
|
|
33
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,YAAY,EAA4B,MAAM,gBAAgB,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,oBAAoB,sDAEyD,CAAC;AAE3F;;GAEG;AACH,eAAO,MAAM,kBAAkB,oDAE8I,CAAC;AAE9K;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;EAY3B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schemas for input validation in ClickUp MCP server.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { ResponseFormat, ResponseMode, DEFAULT_LIMIT, MAX_LIMIT } from "./constants.js";
|
|
6
|
+
/**
|
|
7
|
+
* Response format schema - markdown or JSON
|
|
8
|
+
*/
|
|
9
|
+
export const ResponseFormatSchema = z.nativeEnum(ResponseFormat)
|
|
10
|
+
.default(ResponseFormat.MARKDOWN)
|
|
11
|
+
.describe("Output format: 'markdown' for human-readable or 'json' for machine-readable");
|
|
12
|
+
/**
|
|
13
|
+
* Response mode schema - controls detail level
|
|
14
|
+
*/
|
|
15
|
+
export const ResponseModeSchema = z.nativeEnum(ResponseMode)
|
|
16
|
+
.default(ResponseMode.FULL)
|
|
17
|
+
.describe("Response detail level: 'full' for complete task details, 'compact' for essential fields only (id, name, status, assignees), 'summary' for statistical overview");
|
|
18
|
+
/**
|
|
19
|
+
* Pagination schema for offset-based pagination
|
|
20
|
+
*/
|
|
21
|
+
export const PaginationSchema = z.object({
|
|
22
|
+
limit: z.number()
|
|
23
|
+
.int()
|
|
24
|
+
.min(1)
|
|
25
|
+
.max(MAX_LIMIT)
|
|
26
|
+
.default(DEFAULT_LIMIT)
|
|
27
|
+
.describe(`Maximum results to return (1-${MAX_LIMIT})`),
|
|
28
|
+
offset: z.number()
|
|
29
|
+
.int()
|
|
30
|
+
.min(0)
|
|
31
|
+
.default(0)
|
|
32
|
+
.describe("Number of results to skip for pagination")
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAExF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;KAC7D,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;KAChC,QAAQ,CAAC,6EAA6E,CAAC,CAAC;AAE3F;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;KACzD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;KAC1B,QAAQ,CAAC,gKAAgK,CAAC,CAAC;AAE9K;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SACd,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,SAAS,CAAC;SACd,OAAO,CAAC,aAAa,CAAC;SACtB,QAAQ,CAAC,gCAAgC,SAAS,GAAG,CAAC;IACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACf,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickUp MCP Server entry point.
|
|
3
|
+
* Initializes the MCP server and connects via stdio transport.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create and configure the MCP server with all tools
|
|
8
|
+
*/
|
|
9
|
+
export declare function createServer(): McpServer;
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAepE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAkBxC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickUp MCP Server entry point.
|
|
3
|
+
* Initializes the MCP server and connects via stdio transport.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { getApiToken } from "./utils/index.js";
|
|
8
|
+
import { registerHierarchyTools, registerListTools, registerTaskGetTools, registerTaskSearchTools, registerTaskWriteTools, registerTaskAnalyticsTools, registerCommentTools, registerCustomFieldTools, registerTimeTrackingTools } from "./tools/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Create and configure the MCP server with all tools
|
|
11
|
+
*/
|
|
12
|
+
export function createServer() {
|
|
13
|
+
const server = new McpServer({
|
|
14
|
+
name: "clickup-mcp",
|
|
15
|
+
version: "1.0.0"
|
|
16
|
+
});
|
|
17
|
+
// Register all tool categories
|
|
18
|
+
registerHierarchyTools(server);
|
|
19
|
+
registerListTools(server);
|
|
20
|
+
registerTaskGetTools(server);
|
|
21
|
+
registerTaskSearchTools(server);
|
|
22
|
+
registerTaskWriteTools(server);
|
|
23
|
+
registerTaskAnalyticsTools(server);
|
|
24
|
+
registerCommentTools(server);
|
|
25
|
+
registerCustomFieldTools(server);
|
|
26
|
+
registerTimeTrackingTools(server);
|
|
27
|
+
return server;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Main entry point - starts the MCP server
|
|
31
|
+
*/
|
|
32
|
+
async function main() {
|
|
33
|
+
// Verify API token is set
|
|
34
|
+
try {
|
|
35
|
+
getApiToken();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("ERROR: CLICKUP_API_TOKEN environment variable is required");
|
|
39
|
+
console.error("Get your token at: https://app.clickup.com/settings/apps");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Create server with all tools
|
|
43
|
+
const server = createServer();
|
|
44
|
+
// Create stdio transport
|
|
45
|
+
const transport = new StdioServerTransport();
|
|
46
|
+
// Connect server to transport
|
|
47
|
+
await server.connect(transport);
|
|
48
|
+
// Log to stderr (stdout is used for MCP protocol)
|
|
49
|
+
console.error("ClickUp MCP server running via stdio");
|
|
50
|
+
}
|
|
51
|
+
// Run the server
|
|
52
|
+
main().catch((error) => {
|
|
53
|
+
console.error("Server error:", error);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,+BAA+B;IAC/B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,0BAA0B;IAC1B,IAAI,CAAC;QACH,WAAW,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,yBAAyB;IACzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,8BAA8B;IAC9B,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,kDAAkD;IAClD,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,iBAAiB;AACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing task comments.
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* Register comment tools with the MCP server
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerCommentTools(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiI5D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing task comments.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { ResponseFormat } from "../constants.js";
|
|
7
|
+
import { ResponseFormatSchema } from "../schemas.js";
|
|
8
|
+
import { makeApiRequest, handleApiError, formatCommentMarkdown, truncateResponse, formatTruncationInfo } from "../utils/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Register comment tools with the MCP server
|
|
11
|
+
*/
|
|
12
|
+
export function registerCommentTools(server) {
|
|
13
|
+
// Tool 14: Add Comment
|
|
14
|
+
server.registerTool("clickup_add_comment", {
|
|
15
|
+
title: "Add Comment to Task",
|
|
16
|
+
description: `Add a comment to a task.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
- task_id (string): The task ID
|
|
20
|
+
- comment_text (string): The comment text (supports markdown)
|
|
21
|
+
- notify_all (boolean): Notify all task watchers (default: false)
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
The created comment with metadata.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
- Use when: "Add comment 'Great work!' to task abc123"
|
|
28
|
+
- Use when: "Comment on task xyz with update"
|
|
29
|
+
|
|
30
|
+
Error Handling:
|
|
31
|
+
- Returns "Error: Resource not found" if task_id is invalid (404)`,
|
|
32
|
+
inputSchema: z.object({
|
|
33
|
+
task_id: z.string().min(1).describe("Task ID"),
|
|
34
|
+
comment_text: z.string().min(1).describe("Comment text (markdown supported)"),
|
|
35
|
+
notify_all: z.boolean().default(false).describe("Notify all task watchers")
|
|
36
|
+
}).strict(),
|
|
37
|
+
annotations: {
|
|
38
|
+
readOnlyHint: false,
|
|
39
|
+
destructiveHint: false,
|
|
40
|
+
idempotentHint: false,
|
|
41
|
+
openWorldHint: true
|
|
42
|
+
}
|
|
43
|
+
}, async (params) => {
|
|
44
|
+
try {
|
|
45
|
+
const comment = await makeApiRequest(`task/${params.task_id}/comment`, "POST", {
|
|
46
|
+
comment_text: params.comment_text,
|
|
47
|
+
notify_all: params.notify_all
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
content: [{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: `Comment added successfully to task ${params.task_id}\n\n${formatCommentMarkdown(comment)}`
|
|
53
|
+
}]
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Tool 15: Get Comments
|
|
63
|
+
server.registerTool("clickup_get_comments", {
|
|
64
|
+
title: "Get Task Comments",
|
|
65
|
+
description: `Get all comments on a task.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
- task_id (string): The task ID
|
|
69
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
List of comments with author, date, and text.
|
|
73
|
+
|
|
74
|
+
Examples:
|
|
75
|
+
- Use when: "Show me comments on task abc123"
|
|
76
|
+
- Use when: "Get all comments for this task"
|
|
77
|
+
|
|
78
|
+
Error Handling:
|
|
79
|
+
- Returns "Error: Resource not found" if task_id is invalid (404)`,
|
|
80
|
+
inputSchema: z.object({
|
|
81
|
+
task_id: z.string().min(1).describe("Task ID"),
|
|
82
|
+
response_format: ResponseFormatSchema
|
|
83
|
+
}).strict(),
|
|
84
|
+
annotations: {
|
|
85
|
+
readOnlyHint: true,
|
|
86
|
+
destructiveHint: false,
|
|
87
|
+
idempotentHint: true,
|
|
88
|
+
openWorldHint: true
|
|
89
|
+
}
|
|
90
|
+
}, async (params) => {
|
|
91
|
+
try {
|
|
92
|
+
const data = await makeApiRequest(`task/${params.task_id}/comment`);
|
|
93
|
+
const comments = data.comments || [];
|
|
94
|
+
let result;
|
|
95
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
96
|
+
const lines = [`# Comments on Task ${params.task_id}`, ""];
|
|
97
|
+
lines.push(`Found ${comments.length} comment(s)`, "");
|
|
98
|
+
lines.push("");
|
|
99
|
+
for (const comment of comments) {
|
|
100
|
+
lines.push(formatCommentMarkdown(comment));
|
|
101
|
+
lines.push("");
|
|
102
|
+
lines.push("---");
|
|
103
|
+
lines.push("");
|
|
104
|
+
}
|
|
105
|
+
result = lines.join("\n");
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
result = JSON.stringify({ comments }, null, 2);
|
|
109
|
+
}
|
|
110
|
+
const { content: finalContent, truncation } = truncateResponse(result, comments.length, "comments");
|
|
111
|
+
result = finalContent + formatTruncationInfo(truncation);
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: "text", text: result }]
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom field tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing task custom fields.
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* Register custom field tools with the MCP server
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerCustomFieldTools(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=custom-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fields.d.ts","sourceRoot":"","sources":["../../src/tools/custom-fields.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiEhE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom field tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing task custom fields.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { makeApiRequest, handleApiError } from "../utils/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Register custom field tools with the MCP server
|
|
9
|
+
*/
|
|
10
|
+
export function registerCustomFieldTools(server) {
|
|
11
|
+
// Tool 16: Set Custom Field
|
|
12
|
+
server.registerTool("clickup_set_custom_field", {
|
|
13
|
+
title: "Set Custom Field Value",
|
|
14
|
+
description: `Set a custom field value on a task.
|
|
15
|
+
|
|
16
|
+
Use clickup_get_list_details first to see available custom fields.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
- task_id (string): The task ID
|
|
20
|
+
- field_id (string): The custom field ID
|
|
21
|
+
- value (any): The value to set (format depends on field type)
|
|
22
|
+
|
|
23
|
+
Value format varies by field type:
|
|
24
|
+
- Text/URL/Email: "string value"
|
|
25
|
+
- Number/Currency: 123
|
|
26
|
+
- Date: Unix timestamp in milliseconds
|
|
27
|
+
- Dropdown: "option_uuid"
|
|
28
|
+
- Checkbox: true or false
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Confirmation of the update.
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
- Use when: "Set custom field abc to 'Complete' on task xyz"
|
|
35
|
+
- Use after: Getting list details to know field IDs
|
|
36
|
+
|
|
37
|
+
Error Handling:
|
|
38
|
+
- Returns "Error: Bad request" if value format is wrong (400)
|
|
39
|
+
- Returns "Error: Resource not found" if IDs are invalid (404)`,
|
|
40
|
+
inputSchema: z.object({
|
|
41
|
+
task_id: z.string().min(1).describe("Task ID"),
|
|
42
|
+
field_id: z.string().min(1).describe("Custom field ID"),
|
|
43
|
+
value: z.any().describe("Value to set (format depends on field type)")
|
|
44
|
+
}).strict(),
|
|
45
|
+
annotations: {
|
|
46
|
+
readOnlyHint: false,
|
|
47
|
+
destructiveHint: false,
|
|
48
|
+
idempotentHint: true,
|
|
49
|
+
openWorldHint: true
|
|
50
|
+
}
|
|
51
|
+
}, async (params) => {
|
|
52
|
+
try {
|
|
53
|
+
await makeApiRequest(`task/${params.task_id}/field/${params.field_id}`, "POST", { value: params.value });
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: `Custom field ${params.field_id} updated successfully on task ${params.task_id}`
|
|
58
|
+
}]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=custom-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-fields.js","sourceRoot":"","sources":["../../src/tools/custom-fields.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,cAAc,EACd,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;iEAyB8C;QAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACvD,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;SACvE,CAAC,CAAC,MAAM,EAAE;QACX,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,cAAc,CAClB,QAAQ,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,QAAQ,EAAE,EACjD,MAAM,EACN,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACxB,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,MAAM,CAAC,QAAQ,iCAAiC,MAAM,CAAC,OAAO,EAAE;qBACvF,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;aACzD,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchy tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing teams, spaces, and folders.
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* Register hierarchy tools (teams, spaces, folders) with the MCP server
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerHierarchyTools(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=hierarchy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/tools/hierarchy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkN9D"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchy tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing teams, spaces, and folders.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { ResponseFormat } from "../constants.js";
|
|
7
|
+
import { ResponseFormatSchema } from "../schemas.js";
|
|
8
|
+
import { makeApiRequest, handleApiError, formatSpaceMarkdown, formatFolderMarkdown, truncateResponse, formatTruncationInfo } from "../utils/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Register hierarchy tools (teams, spaces, folders) with the MCP server
|
|
11
|
+
*/
|
|
12
|
+
export function registerHierarchyTools(server) {
|
|
13
|
+
// Tool 1: Get Teams/Workspaces
|
|
14
|
+
server.registerTool("clickup_get_teams", {
|
|
15
|
+
title: "Get ClickUp Teams",
|
|
16
|
+
description: `Get all teams/workspaces accessible to the authenticated user.
|
|
17
|
+
|
|
18
|
+
This tool retrieves the list of teams (also called workspaces) that the user has access to in ClickUp.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of teams with id, name, color, and avatar.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
- Use when: "What teams do I have access to?"
|
|
28
|
+
- Use when: "List all my workspaces"
|
|
29
|
+
|
|
30
|
+
Error Handling:
|
|
31
|
+
- Returns "Error: Invalid or missing API token" if authentication fails (401)`,
|
|
32
|
+
inputSchema: z.object({
|
|
33
|
+
response_format: ResponseFormatSchema
|
|
34
|
+
}).strict(),
|
|
35
|
+
annotations: {
|
|
36
|
+
readOnlyHint: true,
|
|
37
|
+
destructiveHint: false,
|
|
38
|
+
idempotentHint: true,
|
|
39
|
+
openWorldHint: true
|
|
40
|
+
}
|
|
41
|
+
}, async (params) => {
|
|
42
|
+
try {
|
|
43
|
+
const data = await makeApiRequest("team");
|
|
44
|
+
const teams = data.teams || [];
|
|
45
|
+
let result;
|
|
46
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
47
|
+
const lines = ["# ClickUp Teams", ""];
|
|
48
|
+
lines.push(`Found ${teams.length} team(s)`, "");
|
|
49
|
+
for (const team of teams) {
|
|
50
|
+
lines.push(`## ${team.name} (${team.id})`);
|
|
51
|
+
if (team.color) {
|
|
52
|
+
lines.push(`- Color: ${team.color}`);
|
|
53
|
+
}
|
|
54
|
+
lines.push("");
|
|
55
|
+
}
|
|
56
|
+
result = lines.join("\n");
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
result = JSON.stringify({ teams }, null, 2);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: result }]
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Tool 2: Get Spaces
|
|
72
|
+
server.registerTool("clickup_get_spaces", {
|
|
73
|
+
title: "Get ClickUp Spaces",
|
|
74
|
+
description: `Get all spaces in a team/workspace.
|
|
75
|
+
|
|
76
|
+
Spaces are the second level in the ClickUp hierarchy (Team → Space → Folder → List → Task).
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
- team_id (string): The team/workspace ID
|
|
80
|
+
- archived (boolean): Include archived spaces (default: false)
|
|
81
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
82
|
+
|
|
83
|
+
Examples:
|
|
84
|
+
- Use when: "Show me all spaces in team 123456"
|
|
85
|
+
- Use when: "List the spaces in my workspace"
|
|
86
|
+
|
|
87
|
+
Error Handling:
|
|
88
|
+
- Returns "Error: Resource not found" if team_id is invalid (404)`,
|
|
89
|
+
inputSchema: z.object({
|
|
90
|
+
team_id: z.string().min(1).describe("Team/workspace ID"),
|
|
91
|
+
archived: z.boolean().default(false).describe("Include archived spaces"),
|
|
92
|
+
response_format: ResponseFormatSchema
|
|
93
|
+
}).strict(),
|
|
94
|
+
annotations: {
|
|
95
|
+
readOnlyHint: true,
|
|
96
|
+
destructiveHint: false,
|
|
97
|
+
idempotentHint: true,
|
|
98
|
+
openWorldHint: true
|
|
99
|
+
}
|
|
100
|
+
}, async (params) => {
|
|
101
|
+
try {
|
|
102
|
+
const data = await makeApiRequest(`team/${params.team_id}/space`, "GET", undefined, { archived: params.archived });
|
|
103
|
+
const spaces = data.spaces || [];
|
|
104
|
+
let result;
|
|
105
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
106
|
+
const lines = [`# Spaces in Team ${params.team_id}`, ""];
|
|
107
|
+
lines.push(`Found ${spaces.length} space(s)`, "");
|
|
108
|
+
for (const space of spaces) {
|
|
109
|
+
lines.push(formatSpaceMarkdown(space));
|
|
110
|
+
lines.push("");
|
|
111
|
+
}
|
|
112
|
+
result = lines.join("\n");
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
result = JSON.stringify({ spaces }, null, 2);
|
|
116
|
+
}
|
|
117
|
+
const { content: finalContent, truncation } = truncateResponse(result, spaces.length, "spaces");
|
|
118
|
+
result = finalContent + formatTruncationInfo(truncation);
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: "text", text: result }]
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// Tool 3: Get Folders
|
|
130
|
+
server.registerTool("clickup_get_folders", {
|
|
131
|
+
title: "Get ClickUp Folders",
|
|
132
|
+
description: `Get all folders in a space.
|
|
133
|
+
|
|
134
|
+
Folders are optional groupings within spaces (Team → Space → Folder → List → Task).
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
- space_id (string): The space ID
|
|
138
|
+
- archived (boolean): Include archived folders (default: false)
|
|
139
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
140
|
+
|
|
141
|
+
Examples:
|
|
142
|
+
- Use when: "Show me folders in space 123456"
|
|
143
|
+
- Use when: "List all folders in this space"
|
|
144
|
+
|
|
145
|
+
Error Handling:
|
|
146
|
+
- Returns "Error: Resource not found" if space_id is invalid (404)`,
|
|
147
|
+
inputSchema: z.object({
|
|
148
|
+
space_id: z.string().min(1).describe("Space ID"),
|
|
149
|
+
archived: z.boolean().default(false).describe("Include archived folders"),
|
|
150
|
+
response_format: ResponseFormatSchema
|
|
151
|
+
}).strict(),
|
|
152
|
+
annotations: {
|
|
153
|
+
readOnlyHint: true,
|
|
154
|
+
destructiveHint: false,
|
|
155
|
+
idempotentHint: true,
|
|
156
|
+
openWorldHint: true
|
|
157
|
+
}
|
|
158
|
+
}, async (params) => {
|
|
159
|
+
try {
|
|
160
|
+
const data = await makeApiRequest(`space/${params.space_id}/folder`, "GET", undefined, { archived: params.archived });
|
|
161
|
+
const folders = data.folders || [];
|
|
162
|
+
let result;
|
|
163
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
164
|
+
const lines = [`# Folders in Space ${params.space_id}`, ""];
|
|
165
|
+
lines.push(`Found ${folders.length} folder(s)`, "");
|
|
166
|
+
for (const folder of folders) {
|
|
167
|
+
lines.push(formatFolderMarkdown(folder));
|
|
168
|
+
lines.push("");
|
|
169
|
+
}
|
|
170
|
+
result = lines.join("\n");
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
result = JSON.stringify({ folders }, null, 2);
|
|
174
|
+
}
|
|
175
|
+
const { content: finalContent, truncation } = truncateResponse(result, folders.length, "folders");
|
|
176
|
+
result = finalContent + formatTruncationInfo(truncation);
|
|
177
|
+
return {
|
|
178
|
+
content: [{ type: "text", text: result }]
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return {
|
|
183
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/tools/hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel export for all ClickUp MCP tool registration functions.
|
|
3
|
+
*/
|
|
4
|
+
export { registerHierarchyTools } from "./hierarchy.js";
|
|
5
|
+
export { registerListTools } from "./lists.js";
|
|
6
|
+
export { registerTaskGetTools } from "./tasks-get.js";
|
|
7
|
+
export { registerTaskSearchTools } from "./tasks-search.js";
|
|
8
|
+
export { registerTaskWriteTools } from "./tasks-write.js";
|
|
9
|
+
export { registerTaskAnalyticsTools } from "./tasks-analytics.js";
|
|
10
|
+
export { registerCommentTools } from "./comments.js";
|
|
11
|
+
export { registerCustomFieldTools } from "./custom-fields.js";
|
|
12
|
+
export { registerTimeTrackingTools } from "./time-tracking.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel export for all ClickUp MCP tool registration functions.
|
|
3
|
+
*/
|
|
4
|
+
export { registerHierarchyTools } from "./hierarchy.js";
|
|
5
|
+
export { registerListTools } from "./lists.js";
|
|
6
|
+
export { registerTaskGetTools } from "./tasks-get.js";
|
|
7
|
+
export { registerTaskSearchTools } from "./tasks-search.js";
|
|
8
|
+
export { registerTaskWriteTools } from "./tasks-write.js";
|
|
9
|
+
export { registerTaskAnalyticsTools } from "./tasks-analytics.js";
|
|
10
|
+
export { registerCommentTools } from "./comments.js";
|
|
11
|
+
export { registerCustomFieldTools } from "./custom-fields.js";
|
|
12
|
+
export { registerTimeTrackingTools } from "./time-tracking.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List tools for ClickUp MCP server.
|
|
3
|
+
* Tools for managing lists.
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* Register list tools with the MCP server
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerListTools(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=lists.d.ts.map
|