ticktick-mcp 0.2.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.
Files changed (91) hide show
  1. package/dist/index.js +47 -1582
  2. package/dist/index.js.map +1 -1
  3. package/dist/tools/authExchangeCode.d.ts +9 -0
  4. package/dist/tools/authExchangeCode.d.ts.map +1 -0
  5. package/dist/tools/authExchangeCode.js +49 -0
  6. package/dist/tools/authExchangeCode.js.map +1 -0
  7. package/dist/tools/authGetAuthorizationUrl.d.ts +10 -0
  8. package/dist/tools/authGetAuthorizationUrl.d.ts.map +1 -0
  9. package/dist/tools/authGetAuthorizationUrl.js +53 -0
  10. package/dist/tools/authGetAuthorizationUrl.js.map +1 -0
  11. package/dist/tools/authLogout.d.ts +9 -0
  12. package/dist/tools/authLogout.d.ts.map +1 -0
  13. package/dist/tools/authLogout.js +43 -0
  14. package/dist/tools/authLogout.js.map +1 -0
  15. package/dist/tools/authRefreshToken.d.ts +9 -0
  16. package/dist/tools/authRefreshToken.d.ts.map +1 -0
  17. package/dist/tools/authRefreshToken.js +60 -0
  18. package/dist/tools/authRefreshToken.js.map +1 -0
  19. package/dist/tools/authStatus.d.ts +9 -0
  20. package/dist/tools/authStatus.d.ts.map +1 -0
  21. package/dist/tools/authStatus.js +63 -0
  22. package/dist/tools/authStatus.js.map +1 -0
  23. package/dist/tools/batchCreateTasks.d.ts +9 -0
  24. package/dist/tools/batchCreateTasks.d.ts.map +1 -0
  25. package/dist/tools/batchCreateTasks.js +75 -0
  26. package/dist/tools/batchCreateTasks.js.map +1 -0
  27. package/dist/tools/completeTask.d.ts +9 -0
  28. package/dist/tools/completeTask.d.ts.map +1 -0
  29. package/dist/tools/completeTask.js +47 -0
  30. package/dist/tools/completeTask.js.map +1 -0
  31. package/dist/tools/createProject.d.ts +9 -0
  32. package/dist/tools/createProject.d.ts.map +1 -0
  33. package/dist/tools/createProject.js +64 -0
  34. package/dist/tools/createProject.js.map +1 -0
  35. package/dist/tools/createTask.d.ts +9 -0
  36. package/dist/tools/createTask.d.ts.map +1 -0
  37. package/dist/tools/createTask.js +131 -0
  38. package/dist/tools/createTask.js.map +1 -0
  39. package/dist/tools/deleteProject.d.ts +9 -0
  40. package/dist/tools/deleteProject.d.ts.map +1 -0
  41. package/dist/tools/deleteProject.js +46 -0
  42. package/dist/tools/deleteProject.js.map +1 -0
  43. package/dist/tools/deleteTask.d.ts +9 -0
  44. package/dist/tools/deleteTask.d.ts.map +1 -0
  45. package/dist/tools/deleteTask.js +47 -0
  46. package/dist/tools/deleteTask.js.map +1 -0
  47. package/dist/tools/getHighPriorityTasks.d.ts +9 -0
  48. package/dist/tools/getHighPriorityTasks.d.ts.map +1 -0
  49. package/dist/tools/getHighPriorityTasks.js +114 -0
  50. package/dist/tools/getHighPriorityTasks.js.map +1 -0
  51. package/dist/tools/getProject.d.ts +9 -0
  52. package/dist/tools/getProject.d.ts.map +1 -0
  53. package/dist/tools/getProject.js +62 -0
  54. package/dist/tools/getProject.js.map +1 -0
  55. package/dist/tools/getProjectById.d.ts +9 -0
  56. package/dist/tools/getProjectById.d.ts.map +1 -0
  57. package/dist/tools/getProjectById.js +52 -0
  58. package/dist/tools/getProjectById.js.map +1 -0
  59. package/dist/tools/getTask.d.ts +9 -0
  60. package/dist/tools/getTask.d.ts.map +1 -0
  61. package/dist/tools/getTask.js +65 -0
  62. package/dist/tools/getTask.js.map +1 -0
  63. package/dist/tools/getTasksDueSoon.d.ts +9 -0
  64. package/dist/tools/getTasksDueSoon.d.ts.map +1 -0
  65. package/dist/tools/getTasksDueSoon.js +118 -0
  66. package/dist/tools/getTasksDueSoon.js.map +1 -0
  67. package/dist/tools/getUser.d.ts +9 -0
  68. package/dist/tools/getUser.d.ts.map +1 -0
  69. package/dist/tools/getUser.js +47 -0
  70. package/dist/tools/getUser.js.map +1 -0
  71. package/dist/tools/listProjects.d.ts +9 -0
  72. package/dist/tools/listProjects.d.ts.map +1 -0
  73. package/dist/tools/listProjects.js +78 -0
  74. package/dist/tools/listProjects.js.map +1 -0
  75. package/dist/tools/listTasksInProject.d.ts +10 -0
  76. package/dist/tools/listTasksInProject.d.ts.map +1 -0
  77. package/dist/tools/listTasksInProject.js +177 -0
  78. package/dist/tools/listTasksInProject.js.map +1 -0
  79. package/dist/tools/searchTasks.d.ts +9 -0
  80. package/dist/tools/searchTasks.d.ts.map +1 -0
  81. package/dist/tools/searchTasks.js +134 -0
  82. package/dist/tools/searchTasks.js.map +1 -0
  83. package/dist/tools/updateProject.d.ts +9 -0
  84. package/dist/tools/updateProject.d.ts.map +1 -0
  85. package/dist/tools/updateProject.js +66 -0
  86. package/dist/tools/updateProject.js.map +1 -0
  87. package/dist/tools/updateTask.d.ts +9 -0
  88. package/dist/tools/updateTask.d.ts.map +1 -0
  89. package/dist/tools/updateTask.js +132 -0
  90. package/dist/tools/updateTask.js.map +1 -0
  91. package/package.json +1 -1
@@ -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 project by ID (metadata only)
5
+ *
6
+ * Returns a specific project's metadata without its tasks.
7
+ */
8
+ export declare function registerGetProjectByIdTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
9
+ //# sourceMappingURL=getProjectById.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProjectById.d.ts","sourceRoot":"","sources":["../../src/tools/getProjectById.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,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QA0DzC"}
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Tool: Get project by ID (metadata only)
4
+ *
5
+ * Returns a specific project's metadata without its tasks.
6
+ */
7
+ export function registerGetProjectByIdTool(server, getClient) {
8
+ server.registerTool("get_project_by_id", {
9
+ description: "Get a specific project's metadata by ID (without tasks). Use this when you only need project info, not its tasks.",
10
+ inputSchema: {
11
+ projectId: z.string().describe("The ID of the project to retrieve"),
12
+ },
13
+ }, async ({ projectId }) => {
14
+ try {
15
+ const client = await getClient();
16
+ const project = await client.getProject(projectId);
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: JSON.stringify({
22
+ success: true,
23
+ project: {
24
+ id: project.id,
25
+ name: project.name,
26
+ color: project.color,
27
+ viewMode: project.viewMode,
28
+ closed: project.closed,
29
+ },
30
+ }, null, 2),
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ catch (error) {
36
+ const errorMessage = error instanceof Error ? error.message : String(error);
37
+ return {
38
+ content: [
39
+ {
40
+ type: "text",
41
+ text: JSON.stringify({
42
+ success: false,
43
+ error: errorMessage,
44
+ }, null, 2),
45
+ },
46
+ ],
47
+ isError: true,
48
+ };
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=getProjectById.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProjectById.js","sourceRoot":"","sources":["../../src/tools/getProjectById.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EAAE,mHAAmH;QAChI,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SACpE;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAEnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE;gCACP,EAAE,EAAE,OAAO,CAAC,EAAE;gCACd,IAAI,EAAE,OAAO,CAAC,IAAI;gCAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gCACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;6BACvB;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: Get task
5
+ *
6
+ * Gets a specific task by ID.
7
+ */
8
+ export declare function registerGetTaskTool(server: McpServer, getClient: () => Promise<TickTickClient>): void;
9
+ //# sourceMappingURL=getTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTask.d.ts","sourceRoot":"","sources":["../../src/tools/getTask.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,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,QAuEzC"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Tool: Get task
4
+ *
5
+ * Gets a specific task by ID.
6
+ */
7
+ export function registerGetTaskTool(server, getClient) {
8
+ server.registerTool("get_task", {
9
+ description: "Get a specific task from TickTick.",
10
+ inputSchema: {
11
+ projectId: z.string().describe("The project ID containing the task"),
12
+ taskId: z.string().describe("The ID of the task to retrieve"),
13
+ },
14
+ }, async ({ projectId, taskId }) => {
15
+ try {
16
+ const client = await getClient();
17
+ const task = await client.getTask(projectId, taskId);
18
+ return {
19
+ content: [
20
+ {
21
+ type: "text",
22
+ text: JSON.stringify({
23
+ success: true,
24
+ task: {
25
+ id: task.id,
26
+ title: task.title,
27
+ projectId: task.projectId,
28
+ content: task.content,
29
+ priority: task.priority,
30
+ status: task.status,
31
+ dueDate: task.dueDate,
32
+ startDate: task.startDate,
33
+ isAllDay: task.isAllDay,
34
+ tags: task.tags,
35
+ items: task.items.map((item) => ({
36
+ id: item.id,
37
+ title: item.title,
38
+ status: item.status,
39
+ })),
40
+ createdTime: task.createdTime,
41
+ modifiedTime: task.modifiedTime,
42
+ },
43
+ }, null, 2),
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ catch (error) {
49
+ const errorMessage = error instanceof Error ? error.message : String(error);
50
+ return {
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: JSON.stringify({
55
+ success: false,
56
+ error: errorMessage,
57
+ }, null, 2),
58
+ },
59
+ ],
60
+ isError: true,
61
+ };
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=getTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTask.js","sourceRoot":"","sources":["../../src/tools/getTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SAC9D;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAErD,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,KAAK,EAAE,IAAI,CAAC,KAAK;gCACjB,SAAS,EAAE,IAAI,CAAC,SAAS;gCACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gCACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,SAAS,EAAE,IAAI,CAAC,SAAS;gCACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gCACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gCACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oCAC/B,EAAE,EAAE,IAAI,CAAC,EAAE;oCACX,KAAK,EAAE,IAAI,CAAC,KAAK;oCACjB,MAAM,EAAE,IAAI,CAAC,MAAM;iCACpB,CAAC,CAAC;gCACH,WAAW,EAAE,IAAI,CAAC,WAAW;gCAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;6BAChC;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: 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":"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"}
@@ -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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,SAAwC;IAExC,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE,oIAAoI;QACjJ,WAAW,EAAE;YACX,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YACrG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC5E,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC3F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;SAC9E;KACF,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAE3C,0CAA0C;YAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,qBAAqB;YACrB,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAC3D,CAAC;YAED,wBAAwB;YACxB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBACzC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,CAAC;YAED,cAAc;YACd,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtC,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,QAAQ,CAAC,MAAM;4BACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;gCACR,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gCACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;gCACpB,MAAM,EAAE,CAAC,CAAC,MAAM;6BACjB,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,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"}