ticktick-mcp 0.1.0 → 0.2.1
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/index.js +47 -1096
- package/dist/index.js.map +1 -1
- package/dist/sdk/__tests__/client.test.d.ts +2 -0
- package/dist/sdk/__tests__/client.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/client.test.js +251 -0
- package/dist/sdk/__tests__/client.test.js.map +1 -0
- package/dist/sdk/__tests__/errors.test.d.ts +2 -0
- package/dist/sdk/__tests__/errors.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/errors.test.js +164 -0
- package/dist/sdk/__tests__/errors.test.js.map +1 -0
- package/dist/sdk/__tests__/types.test.d.ts +2 -0
- package/dist/sdk/__tests__/types.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/types.test.js +134 -0
- package/dist/sdk/__tests__/types.test.js.map +1 -0
- package/dist/sdk/client.d.ts +10 -2
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +14 -3
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/index.d.ts +5 -3
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +10 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/types.d.ts +215 -23
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js +169 -6
- package/dist/sdk/types.js.map +1 -1
- package/dist/tools/authExchangeCode.d.ts +9 -0
- package/dist/tools/authExchangeCode.d.ts.map +1 -0
- package/dist/tools/authExchangeCode.js +49 -0
- package/dist/tools/authExchangeCode.js.map +1 -0
- package/dist/tools/authGetAuthorizationUrl.d.ts +10 -0
- package/dist/tools/authGetAuthorizationUrl.d.ts.map +1 -0
- package/dist/tools/authGetAuthorizationUrl.js +53 -0
- package/dist/tools/authGetAuthorizationUrl.js.map +1 -0
- package/dist/tools/authLogout.d.ts +9 -0
- package/dist/tools/authLogout.d.ts.map +1 -0
- package/dist/tools/authLogout.js +43 -0
- package/dist/tools/authLogout.js.map +1 -0
- package/dist/tools/authRefreshToken.d.ts +9 -0
- package/dist/tools/authRefreshToken.d.ts.map +1 -0
- package/dist/tools/authRefreshToken.js +60 -0
- package/dist/tools/authRefreshToken.js.map +1 -0
- package/dist/tools/authStatus.d.ts +9 -0
- package/dist/tools/authStatus.d.ts.map +1 -0
- package/dist/tools/authStatus.js +63 -0
- package/dist/tools/authStatus.js.map +1 -0
- package/dist/tools/batchCreateTasks.d.ts +9 -0
- package/dist/tools/batchCreateTasks.d.ts.map +1 -0
- package/dist/tools/batchCreateTasks.js +75 -0
- package/dist/tools/batchCreateTasks.js.map +1 -0
- package/dist/tools/completeTask.d.ts +9 -0
- package/dist/tools/completeTask.d.ts.map +1 -0
- package/dist/tools/completeTask.js +47 -0
- package/dist/tools/completeTask.js.map +1 -0
- package/dist/tools/createProject.d.ts +9 -0
- package/dist/tools/createProject.d.ts.map +1 -0
- package/dist/tools/createProject.js +64 -0
- package/dist/tools/createProject.js.map +1 -0
- package/dist/tools/createTask.d.ts +9 -0
- package/dist/tools/createTask.d.ts.map +1 -0
- package/dist/tools/createTask.js +131 -0
- package/dist/tools/createTask.js.map +1 -0
- package/dist/tools/deleteProject.d.ts +9 -0
- package/dist/tools/deleteProject.d.ts.map +1 -0
- package/dist/tools/deleteProject.js +46 -0
- package/dist/tools/deleteProject.js.map +1 -0
- package/dist/tools/deleteTask.d.ts +9 -0
- package/dist/tools/deleteTask.d.ts.map +1 -0
- package/dist/tools/deleteTask.js +47 -0
- package/dist/tools/deleteTask.js.map +1 -0
- package/dist/tools/getHighPriorityTasks.d.ts +9 -0
- package/dist/tools/getHighPriorityTasks.d.ts.map +1 -0
- package/dist/tools/getHighPriorityTasks.js +114 -0
- package/dist/tools/getHighPriorityTasks.js.map +1 -0
- package/dist/tools/getProject.d.ts +9 -0
- package/dist/tools/getProject.d.ts.map +1 -0
- package/dist/tools/getProject.js +62 -0
- package/dist/tools/getProject.js.map +1 -0
- package/dist/tools/getProjectById.d.ts +9 -0
- package/dist/tools/getProjectById.d.ts.map +1 -0
- package/dist/tools/getProjectById.js +52 -0
- package/dist/tools/getProjectById.js.map +1 -0
- package/dist/tools/getTask.d.ts +9 -0
- package/dist/tools/getTask.d.ts.map +1 -0
- package/dist/tools/getTask.js +65 -0
- package/dist/tools/getTask.js.map +1 -0
- package/dist/tools/getTasksDueSoon.d.ts +9 -0
- package/dist/tools/getTasksDueSoon.d.ts.map +1 -0
- package/dist/tools/getTasksDueSoon.js +118 -0
- package/dist/tools/getTasksDueSoon.js.map +1 -0
- package/dist/tools/getUser.d.ts +9 -0
- package/dist/tools/getUser.d.ts.map +1 -0
- package/dist/tools/getUser.js +47 -0
- package/dist/tools/getUser.js.map +1 -0
- package/dist/tools/listProjects.d.ts +9 -0
- package/dist/tools/listProjects.d.ts.map +1 -0
- package/dist/tools/listProjects.js +78 -0
- package/dist/tools/listProjects.js.map +1 -0
- package/dist/tools/listTasksInProject.d.ts +10 -0
- package/dist/tools/listTasksInProject.d.ts.map +1 -0
- package/dist/tools/listTasksInProject.js +177 -0
- package/dist/tools/listTasksInProject.js.map +1 -0
- package/dist/tools/searchTasks.d.ts +9 -0
- package/dist/tools/searchTasks.d.ts.map +1 -0
- package/dist/tools/searchTasks.js +134 -0
- package/dist/tools/searchTasks.js.map +1 -0
- package/dist/tools/updateProject.d.ts +9 -0
- package/dist/tools/updateProject.d.ts.map +1 -0
- package/dist/tools/updateProject.js +66 -0
- package/dist/tools/updateProject.js.map +1 -0
- package/dist/tools/updateTask.d.ts +9 -0
- package/dist/tools/updateTask.d.ts.map +1 -0
- package/dist/tools/updateTask.js +132 -0
- package/dist/tools/updateTask.js.map +1 -0
- package/package.json +14 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TickTickClient } from "../sdk/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tool: Get tasks due soon
|
|
5
|
+
*
|
|
6
|
+
* Returns tasks due within a specified number of days across all projects.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerGetTasksDueSoonTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
|
|
9
|
+
//# sourceMappingURL=getTasksDueSoon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTasksDueSoon.d.ts","sourceRoot":"","sources":["../../src/tools/getTasksDueSoon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAgIzC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Tool: Get tasks due soon
|
|
4
|
+
*
|
|
5
|
+
* Returns tasks due within a specified number of days across all projects.
|
|
6
|
+
*/
|
|
7
|
+
export function registerGetTasksDueSoonTool(server, getClient) {
|
|
8
|
+
server.registerTool("get_tasks_due_soon", {
|
|
9
|
+
description: "Get tasks that are due soon (within the next N days). Useful for finding urgent work across all projects.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
days: z.number().optional().describe("Number of days to look ahead (default: 7)"),
|
|
12
|
+
includeOverdue: z.boolean().optional().describe("Include past-due tasks (default: true)"),
|
|
13
|
+
projectId: z.string().optional().describe("Optional: limit to a specific project"),
|
|
14
|
+
status: z.enum(['active', 'all']).optional().describe("Task status filter (default: 'active')"),
|
|
15
|
+
},
|
|
16
|
+
}, async ({ days = 7, includeOverdue = true, projectId, status = 'active' }) => {
|
|
17
|
+
try {
|
|
18
|
+
const client = await getClient();
|
|
19
|
+
// Calculate date range
|
|
20
|
+
const now = new Date();
|
|
21
|
+
const futureDate = new Date();
|
|
22
|
+
futureDate.setDate(now.getDate() + days);
|
|
23
|
+
let allTasks = [];
|
|
24
|
+
if (projectId) {
|
|
25
|
+
// Fetch tasks from specific project
|
|
26
|
+
const data = await client.getProjectWithTasks(projectId);
|
|
27
|
+
allTasks = data.tasks.map(t => ({
|
|
28
|
+
...t,
|
|
29
|
+
projectName: data.project.name,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Fetch all projects and their tasks
|
|
34
|
+
const projects = await client.listProjects();
|
|
35
|
+
for (const project of projects) {
|
|
36
|
+
if (!project.closed) { // Skip archived projects
|
|
37
|
+
try {
|
|
38
|
+
const data = await client.getProjectWithTasks(project.id);
|
|
39
|
+
const tasksWithProject = data.tasks.map(t => ({
|
|
40
|
+
...t,
|
|
41
|
+
projectName: project.name,
|
|
42
|
+
}));
|
|
43
|
+
allTasks = allTasks.concat(tasksWithProject);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Skip projects that can't be fetched
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Filter tasks
|
|
53
|
+
let filteredTasks = allTasks;
|
|
54
|
+
// Filter by status
|
|
55
|
+
if (status === 'active') {
|
|
56
|
+
filteredTasks = filteredTasks.filter(t => t.status === 0);
|
|
57
|
+
}
|
|
58
|
+
// Filter by due date
|
|
59
|
+
filteredTasks = filteredTasks.filter(t => {
|
|
60
|
+
if (!t.dueDate)
|
|
61
|
+
return false;
|
|
62
|
+
const dueDate = new Date(t.dueDate);
|
|
63
|
+
const isOverdue = dueDate < now;
|
|
64
|
+
const isDueSoon = dueDate >= now && dueDate <= futureDate;
|
|
65
|
+
if (includeOverdue && isOverdue)
|
|
66
|
+
return true;
|
|
67
|
+
if (isDueSoon)
|
|
68
|
+
return true;
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
// Sort by due date ascending (earliest first)
|
|
72
|
+
filteredTasks.sort((a, b) => {
|
|
73
|
+
const aDate = new Date(a.dueDate).getTime();
|
|
74
|
+
const bDate = new Date(b.dueDate).getTime();
|
|
75
|
+
return aDate - bDate;
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: JSON.stringify({
|
|
82
|
+
success: true,
|
|
83
|
+
count: filteredTasks.length,
|
|
84
|
+
daysAhead: days,
|
|
85
|
+
tasks: filteredTasks.map(t => ({
|
|
86
|
+
id: t.id,
|
|
87
|
+
title: t.title,
|
|
88
|
+
projectId: t.projectId,
|
|
89
|
+
projectName: t.projectName,
|
|
90
|
+
dueDate: t.dueDate,
|
|
91
|
+
priority: t.priority,
|
|
92
|
+
status: t.status,
|
|
93
|
+
content: t.content,
|
|
94
|
+
tags: t.tags,
|
|
95
|
+
})),
|
|
96
|
+
}, null, 2),
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: JSON.stringify({
|
|
108
|
+
success: false,
|
|
109
|
+
error: errorMessage,
|
|
110
|
+
}, null, 2),
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
isError: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=getTasksDueSoon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTasksDueSoon.js","sourceRoot":"","sources":["../../src/tools/getTasksDueSoon.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACjF,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YAClF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;SAChG;KACF,EACD,KAAK,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,EAAE,EAAE;QAC1E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YAEjC,uBAAuB;YACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YAEzC,IAAI,QAAQ,GAAU,EAAE,CAAC;YAEzB,IAAI,SAAS,EAAE,CAAC;gBACd,oCAAoC;gBACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBACzD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC9B,GAAG,CAAC;oBACJ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;iBAC/B,CAAC,CAAC,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,qCAAqC;gBACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,yBAAyB;wBAC9C,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCAC5C,GAAG,CAAC;gCACJ,WAAW,EAAE,OAAO,CAAC,IAAI;6BAC1B,CAAC,CAAC,CAAC;4BACJ,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;wBAC/C,CAAC;wBAAC,MAAM,CAAC;4BACP,sCAAsC;4BACtC,SAAS;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,eAAe;YACf,IAAI,aAAa,GAAG,QAAQ,CAAC;YAE7B,mBAAmB;YACnB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,qBAAqB;YACrB,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBACvC,IAAI,CAAC,CAAC,CAAC,OAAO;oBAAE,OAAO,KAAK,CAAC;gBAE7B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACpC,MAAM,SAAS,GAAG,OAAO,GAAG,GAAG,CAAC;gBAChC,MAAM,SAAS,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,UAAU,CAAC;gBAE1D,IAAI,cAAc,IAAI,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAC7C,IAAI,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAC3B,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,8CAA8C;YAC9C,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5C,OAAO,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,IAAI;4BACb,KAAK,EAAE,aAAa,CAAC,MAAM;4BAC3B,SAAS,EAAE,IAAI;4BACf,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;gCACR,KAAK,EAAE,CAAC,CAAC,KAAK;gCACd,SAAS,EAAE,CAAC,CAAC,SAAS;gCACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gCAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;gCAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gCACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gCAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gCAClB,IAAI,EAAE,CAAC,CAAC,IAAI;6BACb,CAAC,CAAC;yBACJ,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,YAAY;yBACpB,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TickTickClient } from "../sdk/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tool: Get current user
|
|
5
|
+
*
|
|
6
|
+
* Returns information about the authenticated TickTick user.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerGetUserTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
|
|
9
|
+
//# sourceMappingURL=getUser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUser.d.ts","sourceRoot":"","sources":["../../src/tools/getUser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAsDzC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: Get current user
|
|
3
|
+
*
|
|
4
|
+
* Returns information about the authenticated TickTick user.
|
|
5
|
+
*/
|
|
6
|
+
export function registerGetUserTool(server, getClient) {
|
|
7
|
+
server.registerTool("get_user", {
|
|
8
|
+
description: "Get the current authenticated user's information from TickTick.",
|
|
9
|
+
inputSchema: {},
|
|
10
|
+
}, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const client = await getClient();
|
|
13
|
+
const user = await client.getUser();
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: "text",
|
|
18
|
+
text: JSON.stringify({
|
|
19
|
+
success: true,
|
|
20
|
+
user: {
|
|
21
|
+
id: user.id,
|
|
22
|
+
username: user.username,
|
|
23
|
+
name: user.name,
|
|
24
|
+
},
|
|
25
|
+
}, null, 2),
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: "text",
|
|
36
|
+
text: JSON.stringify({
|
|
37
|
+
success: false,
|
|
38
|
+
error: errorMessage,
|
|
39
|
+
}, null, 2),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
isError: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=getUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUser.js","sourceRoot":"","sources":["../../src/tools/getUser.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,IAAI;4BACb,IAAI,EAAE;gCACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gCACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gCACvB,IAAI,EAAE,IAAI,CAAC,IAAI;6BAChB;yBACF,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,YAAY;yBACpB,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TickTickClient } from "../sdk/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tool: List all projects
|
|
5
|
+
*
|
|
6
|
+
* Returns all projects for the authenticated user.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerListProjectsTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
|
|
9
|
+
//# sourceMappingURL=listProjects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProjects.d.ts","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAyFzC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Tool: List all projects
|
|
4
|
+
*
|
|
5
|
+
* Returns all projects for the authenticated user.
|
|
6
|
+
*/
|
|
7
|
+
export function registerListProjectsTool(server, getClient) {
|
|
8
|
+
server.registerTool("list_projects", {
|
|
9
|
+
description: "List all projects in the user's TickTick account with optional filtering. By default, only returns active (non-archived) projects.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
includeArchived: z.boolean().optional().describe("Include archived/closed projects (default: false)"),
|
|
12
|
+
kind: z.enum(['TASK', 'NOTE']).optional().describe("Filter by project type"),
|
|
13
|
+
viewMode: z.enum(['list', 'kanban', 'timeline']).optional().describe("Filter by view mode"),
|
|
14
|
+
search: z.string().optional().describe("Text search in project name (case-insensitive)"),
|
|
15
|
+
limit: z.number().optional().describe("Maximum number of projects to return"),
|
|
16
|
+
},
|
|
17
|
+
}, async ({ includeArchived, kind, viewMode, search, limit }) => {
|
|
18
|
+
try {
|
|
19
|
+
const client = await getClient();
|
|
20
|
+
let projects = await client.listProjects();
|
|
21
|
+
// Filter out archived projects by default
|
|
22
|
+
if (!includeArchived) {
|
|
23
|
+
projects = projects.filter(p => !p.closed);
|
|
24
|
+
}
|
|
25
|
+
// Filter by kind
|
|
26
|
+
if (kind) {
|
|
27
|
+
projects = projects.filter(p => p.kind === kind);
|
|
28
|
+
}
|
|
29
|
+
// Filter by viewMode
|
|
30
|
+
if (viewMode) {
|
|
31
|
+
projects = projects.filter(p => p.viewMode === viewMode);
|
|
32
|
+
}
|
|
33
|
+
// Filter by search text
|
|
34
|
+
if (search) {
|
|
35
|
+
const searchLower = search.toLowerCase();
|
|
36
|
+
projects = projects.filter(p => p.name.toLowerCase().includes(searchLower));
|
|
37
|
+
}
|
|
38
|
+
// Apply limit
|
|
39
|
+
if (limit && limit > 0) {
|
|
40
|
+
projects = projects.slice(0, limit);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{
|
|
45
|
+
type: "text",
|
|
46
|
+
text: JSON.stringify({
|
|
47
|
+
success: true,
|
|
48
|
+
count: projects.length,
|
|
49
|
+
projects: projects.map((p) => ({
|
|
50
|
+
id: p.id,
|
|
51
|
+
name: p.name,
|
|
52
|
+
color: p.color,
|
|
53
|
+
viewMode: p.viewMode,
|
|
54
|
+
closed: p.closed,
|
|
55
|
+
})),
|
|
56
|
+
}, null, 2),
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: JSON.stringify({
|
|
68
|
+
success: false,
|
|
69
|
+
error: errorMessage,
|
|
70
|
+
}, null, 2),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=listProjects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProjects.js","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TickTickClient } from "../sdk/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tool: List tasks in project
|
|
5
|
+
*
|
|
6
|
+
* Returns all tasks in a specific project (without project metadata).
|
|
7
|
+
* This is a convenience tool that wraps getProjectWithTasks but only returns tasks.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerListTasksInProjectTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
|
|
10
|
+
//# sourceMappingURL=listTasksInProject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTasksInProject.d.ts","sourceRoot":"","sources":["../../src/tools/listTasksInProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QA8LzC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Tool: List tasks in project
|
|
4
|
+
*
|
|
5
|
+
* Returns all tasks in a specific project (without project metadata).
|
|
6
|
+
* This is a convenience tool that wraps getProjectWithTasks but only returns tasks.
|
|
7
|
+
*/
|
|
8
|
+
export function registerListTasksInProjectTool(server, getClient) {
|
|
9
|
+
server.registerTool("list_tasks_in_project", {
|
|
10
|
+
description: "List all tasks in a specific project with optional client-side filtering and sorting. Returns only the tasks array without project metadata.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
projectId: z.string().describe("The ID of the project to list tasks from"),
|
|
13
|
+
status: z.enum(['active', 'completed', 'all']).optional().describe("Filter by task status (default: 'all')"),
|
|
14
|
+
priority: z.union([z.number(), z.array(z.number())]).optional().describe("Filter by priority: single value (0,1,3,5) or array [0,1,3,5]"),
|
|
15
|
+
dueBefore: z.string().optional().describe("ISO date - include only tasks due before this date"),
|
|
16
|
+
dueAfter: z.string().optional().describe("ISO date - include only tasks due after this date"),
|
|
17
|
+
startBefore: z.string().optional().describe("ISO date - include only tasks starting before this date"),
|
|
18
|
+
startAfter: z.string().optional().describe("ISO date - include only tasks starting after this date"),
|
|
19
|
+
hasSubtasks: z.boolean().optional().describe("Filter by presence of subtasks: true=with subtasks, false=without"),
|
|
20
|
+
tags: z.array(z.string()).optional().describe("Filter by tags - include tasks with any of these tags"),
|
|
21
|
+
search: z.string().optional().describe("Text search - filter tasks whose title or content contains this text (case-insensitive)"),
|
|
22
|
+
sortBy: z.enum(['dueDate', 'priority', 'title', 'createdTime', 'modifiedTime', 'sortOrder']).optional().describe("Field to sort by"),
|
|
23
|
+
sortDirection: z.enum(['asc', 'desc']).optional().describe("Sort direction (default: 'asc')"),
|
|
24
|
+
limit: z.number().optional().describe("Maximum number of tasks to return"),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ projectId, status, priority, dueBefore, dueAfter, startBefore, startAfter, hasSubtasks, tags, search, sortBy, sortDirection, limit }) => {
|
|
27
|
+
try {
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const data = await client.getProjectWithTasks(projectId);
|
|
30
|
+
// Apply filters
|
|
31
|
+
let filteredTasks = data.tasks;
|
|
32
|
+
// Filter by status
|
|
33
|
+
if (status && status !== 'all') {
|
|
34
|
+
filteredTasks = filteredTasks.filter(t => {
|
|
35
|
+
if (status === 'active')
|
|
36
|
+
return t.status === 0;
|
|
37
|
+
if (status === 'completed')
|
|
38
|
+
return t.status === 2;
|
|
39
|
+
return true;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Filter by priority
|
|
43
|
+
if (priority !== undefined) {
|
|
44
|
+
const priorities = Array.isArray(priority) ? priority : [priority];
|
|
45
|
+
filteredTasks = filteredTasks.filter(t => priorities.includes(t.priority));
|
|
46
|
+
}
|
|
47
|
+
// Filter by due date
|
|
48
|
+
if (dueBefore) {
|
|
49
|
+
const beforeDate = new Date(dueBefore);
|
|
50
|
+
filteredTasks = filteredTasks.filter(t => t.dueDate && new Date(t.dueDate) < beforeDate);
|
|
51
|
+
}
|
|
52
|
+
if (dueAfter) {
|
|
53
|
+
const afterDate = new Date(dueAfter);
|
|
54
|
+
filteredTasks = filteredTasks.filter(t => t.dueDate && new Date(t.dueDate) > afterDate);
|
|
55
|
+
}
|
|
56
|
+
// Filter by start date
|
|
57
|
+
if (startBefore) {
|
|
58
|
+
const beforeDate = new Date(startBefore);
|
|
59
|
+
filteredTasks = filteredTasks.filter(t => t.startDate && new Date(t.startDate) < beforeDate);
|
|
60
|
+
}
|
|
61
|
+
if (startAfter) {
|
|
62
|
+
const afterDate = new Date(startAfter);
|
|
63
|
+
filteredTasks = filteredTasks.filter(t => t.startDate && new Date(t.startDate) > afterDate);
|
|
64
|
+
}
|
|
65
|
+
// Filter by subtasks
|
|
66
|
+
if (hasSubtasks !== undefined) {
|
|
67
|
+
filteredTasks = filteredTasks.filter(t => {
|
|
68
|
+
const hasItems = t.items && t.items.length > 0;
|
|
69
|
+
return hasSubtasks ? hasItems : !hasItems;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Filter by tags
|
|
73
|
+
if (tags && tags.length > 0) {
|
|
74
|
+
filteredTasks = filteredTasks.filter(t => {
|
|
75
|
+
return t.tags && t.tags.some(tag => tags.includes(tag));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Filter by search text
|
|
79
|
+
if (search) {
|
|
80
|
+
const searchLower = search.toLowerCase();
|
|
81
|
+
filteredTasks = filteredTasks.filter(t => {
|
|
82
|
+
return t.title.toLowerCase().includes(searchLower) ||
|
|
83
|
+
(t.content && t.content.toLowerCase().includes(searchLower));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Apply sorting
|
|
87
|
+
if (sortBy) {
|
|
88
|
+
const direction = sortDirection === 'desc' ? -1 : 1;
|
|
89
|
+
filteredTasks.sort((a, b) => {
|
|
90
|
+
let aVal;
|
|
91
|
+
let bVal;
|
|
92
|
+
switch (sortBy) {
|
|
93
|
+
case 'dueDate':
|
|
94
|
+
aVal = a.dueDate ? new Date(a.dueDate).getTime() : Infinity;
|
|
95
|
+
bVal = b.dueDate ? new Date(b.dueDate).getTime() : Infinity;
|
|
96
|
+
break;
|
|
97
|
+
case 'priority':
|
|
98
|
+
aVal = a.priority;
|
|
99
|
+
bVal = b.priority;
|
|
100
|
+
break;
|
|
101
|
+
case 'title':
|
|
102
|
+
aVal = a.title.toLowerCase();
|
|
103
|
+
bVal = b.title.toLowerCase();
|
|
104
|
+
break;
|
|
105
|
+
case 'createdTime':
|
|
106
|
+
aVal = new Date(a.createdTime).getTime();
|
|
107
|
+
bVal = new Date(b.createdTime).getTime();
|
|
108
|
+
break;
|
|
109
|
+
case 'modifiedTime':
|
|
110
|
+
aVal = new Date(a.modifiedTime).getTime();
|
|
111
|
+
bVal = new Date(b.modifiedTime).getTime();
|
|
112
|
+
break;
|
|
113
|
+
case 'sortOrder':
|
|
114
|
+
aVal = a.sortOrder;
|
|
115
|
+
bVal = b.sortOrder;
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
if (aVal < bVal)
|
|
121
|
+
return -1 * direction;
|
|
122
|
+
if (aVal > bVal)
|
|
123
|
+
return 1 * direction;
|
|
124
|
+
return 0;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Apply limit
|
|
128
|
+
if (limit && limit > 0) {
|
|
129
|
+
filteredTasks = filteredTasks.slice(0, limit);
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
content: [
|
|
133
|
+
{
|
|
134
|
+
type: "text",
|
|
135
|
+
text: JSON.stringify({
|
|
136
|
+
success: true,
|
|
137
|
+
total: data.tasks.length,
|
|
138
|
+
count: filteredTasks.length,
|
|
139
|
+
tasks: filteredTasks.map((t) => ({
|
|
140
|
+
id: t.id,
|
|
141
|
+
title: t.title,
|
|
142
|
+
content: t.content,
|
|
143
|
+
priority: t.priority,
|
|
144
|
+
status: t.status,
|
|
145
|
+
dueDate: t.dueDate,
|
|
146
|
+
startDate: t.startDate,
|
|
147
|
+
isAllDay: t.isAllDay,
|
|
148
|
+
tags: t.tags,
|
|
149
|
+
items: t.items?.map((item) => ({
|
|
150
|
+
id: item.id,
|
|
151
|
+
title: item.title,
|
|
152
|
+
status: item.status,
|
|
153
|
+
})),
|
|
154
|
+
})),
|
|
155
|
+
}, null, 2),
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
162
|
+
return {
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: JSON.stringify({
|
|
167
|
+
success: false,
|
|
168
|
+
error: errorMessage,
|
|
169
|
+
}, null, 2),
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=listTasksInProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTasksInProject.js","sourceRoot":"","sources":["../../src/tools/listTasksInProject.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE,8IAA8I;QAC3J,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAC1E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YAC5G,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YACzI,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;YAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YAC7F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YACtG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YACpG,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YACjH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACtG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yFAAyF,CAAC;YACjI,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACpI,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC7F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SAC3E;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/I,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAEzD,gBAAgB;YAChB,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;YAE/B,mBAAmB;YACnB,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC/B,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACvC,IAAI,MAAM,KAAK,QAAQ;wBAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;oBAC/C,IAAI,MAAM,KAAK,WAAW;wBAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;oBAClD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;YACL,CAAC;YAED,qBAAqB;YACrB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACnE,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7E,CAAC;YAED,qBAAqB;YACrB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;YAC1F,CAAC;YAED,uBAAuB;YACvB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;YAC9F,CAAC;YAED,qBAAqB;YACrB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACvC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/C,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACvC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBACzC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACvC,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAC3C,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;YACL,CAAC;YAED,gBAAgB;YAChB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,IAAI,IAAS,CAAC;oBACd,IAAI,IAAS,CAAC;oBAEd,QAAQ,MAAM,EAAE,CAAC;wBACf,KAAK,SAAS;4BACZ,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;4BAC5D,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;4BAC5D,MAAM;wBACR,KAAK,UAAU;4BACb,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;4BAClB,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;4BAClB,MAAM;wBACR,KAAK,OAAO;4BACV,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;4BAC7B,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;4BAC7B,MAAM;wBACR,KAAK,aAAa;4BAChB,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;4BACzC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;4BACzC,MAAM;wBACR,KAAK,cAAc;4BACjB,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;4BAC1C,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;4BAC1C,MAAM;wBACR,KAAK,WAAW;4BACd,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC;4BACnB,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC;4BACnB,MAAM;wBACR;4BACE,OAAO,CAAC,CAAC;oBACb,CAAC;oBAED,IAAI,IAAI,GAAG,IAAI;wBAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;oBACvC,IAAI,IAAI,GAAG,IAAI;wBAAE,OAAO,CAAC,GAAG,SAAS,CAAC;oBACtC,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC;YAED,cAAc;YACd,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACvB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,IAAI;4BACb,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;4BACxB,KAAK,EAAE,aAAa,CAAC,MAAM;4BAC3B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC/B,EAAE,EAAE,CAAC,CAAC,EAAE;gCACR,KAAK,EAAE,CAAC,CAAC,KAAK;gCACd,OAAO,EAAE,CAAC,CAAC,OAAO;gCAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gCACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gCAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gCAClB,SAAS,EAAE,CAAC,CAAC,SAAS;gCACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gCACpB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oCAC7B,EAAE,EAAE,IAAI,CAAC,EAAE;oCACX,KAAK,EAAE,IAAI,CAAC,KAAK;oCACjB,MAAM,EAAE,IAAI,CAAC,MAAM;iCACpB,CAAC,CAAC;6BACJ,CAAC,CAAC;yBACJ,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,YAAY;yBACpB,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TickTickClient } from "../sdk/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tool: Search tasks
|
|
5
|
+
*
|
|
6
|
+
* Search for tasks by keyword across all projects.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerSearchTasksTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
|
|
9
|
+
//# sourceMappingURL=searchTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchTasks.d.ts","sourceRoot":"","sources":["../../src/tools/searchTasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QA4IzC"}
|