dotodo-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # dotodo-mcp
2
+
3
+ MCP (Model Context Protocol) server for [dotodo](https://dotodo.co) - manage your todos from AI assistants like Claude.
4
+
5
+ ## Setup
6
+
7
+ ### 1. Get an API Key
8
+
9
+ Sign in to [dotodo](https://dotodo.co) and go to **Settings > API Keys** to generate a key.
10
+
11
+ ### 2. Configure Claude Desktop
12
+
13
+ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "dotodo": {
19
+ "command": "npx",
20
+ "args": ["dotodo-mcp"],
21
+ "env": {
22
+ "DOTODO_API_URL": "https://api.dotodo.co",
23
+ "DOTODO_API_KEY": "sk_dotodo_your_key_here"
24
+ }
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ ### Claude Code (CLI)
31
+
32
+ ```bash
33
+ claude mcp add dotodo -- npx dotodo-mcp \
34
+ --env DOTODO_API_URL=https://api.dotodo.co \
35
+ --env DOTODO_API_KEY=sk_dotodo_your_key_here
36
+ ```
37
+
38
+ ### 3. Restart Claude
39
+
40
+ Restart Claude Desktop to apply the changes.
41
+
42
+ ## Available Tools
43
+
44
+ | Tool | Description |
45
+ |------|-------------|
46
+ | `add_todo` | Create a new todo with optional deadline, priority, project, and tags |
47
+ | `list_todos` | List and filter todos by status, date, priority, project, and more |
48
+ | `complete_todo` | Toggle todo completion status |
49
+ | `update_todo` | Update todo title, description, status, priority, or deadline |
50
+ | `delete_todo` | Soft-delete a todo |
51
+ | `get_project_todos` | Get all todos for a specific project |
52
+ | `list_projects` | List all projects |
53
+ | `create_project` | Create a new project |
54
+ | `add_tag` | Create a new tag |
55
+ | `list_tags` | List all available tags |
56
+ | `add_todos` | Create multiple todos at once (max 50) |
57
+ | `complete_todos` | Toggle completion for multiple todos (max 100) |
58
+ | `delete_todos` | Delete multiple todos at once (max 100) |
59
+
60
+ ## Environment Variables
61
+
62
+ | Variable | Required | Description |
63
+ |----------|----------|-------------|
64
+ | `DOTODO_API_URL` | Yes | API server URL (e.g., `https://api.dotodo.co`) |
65
+ | `DOTODO_API_KEY` | Yes | Your API key (`sk_dotodo_...`) |
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1,13 @@
1
+ /**
2
+ * dotodo REST API Client
3
+ * MCP Server에서 API Key로 REST API를 호출하기 위한 클라이언트
4
+ */
5
+ export interface ApiClient {
6
+ get<T = unknown>(path: string, params?: Record<string, string>): Promise<T>;
7
+ post<T = unknown>(path: string, body?: unknown): Promise<T>;
8
+ put<T = unknown>(path: string, body?: unknown): Promise<T>;
9
+ patch<T = unknown>(path: string, body?: unknown): Promise<T>;
10
+ delete<T = unknown>(path: string, body?: unknown): Promise<T>;
11
+ }
12
+ export declare function createApiClient(baseUrl: string, apiKey: string): ApiClient;
13
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3E,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3D,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC1D,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5D,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC9D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAqC1E"}
package/dist/client.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * dotodo REST API Client
3
+ * MCP Server에서 API Key로 REST API를 호출하기 위한 클라이언트
4
+ */
5
+ export function createApiClient(baseUrl, apiKey) {
6
+ const headers = {
7
+ 'Authorization': `ApiKey ${apiKey}`,
8
+ 'Content-Type': 'application/json',
9
+ };
10
+ async function request(method, path, body, params) {
11
+ const url = new URL(path, baseUrl);
12
+ if (params) {
13
+ for (const [k, v] of Object.entries(params)) {
14
+ url.searchParams.set(k, v);
15
+ }
16
+ }
17
+ const res = await fetch(url, {
18
+ method,
19
+ headers,
20
+ body: body ? JSON.stringify(body) : undefined,
21
+ });
22
+ const json = await res.json();
23
+ if (!res.ok || !json.success) {
24
+ const errMsg = json.error?.message || `API error: ${res.status}`;
25
+ throw new Error(errMsg);
26
+ }
27
+ return json.data;
28
+ }
29
+ return {
30
+ get: (path, params) => request('GET', path, undefined, params),
31
+ post: (path, body) => request('POST', path, body),
32
+ put: (path, body) => request('PUT', path, body),
33
+ patch: (path, body) => request('PATCH', path, body),
34
+ delete: (path, body) => request('DELETE', path, body),
35
+ };
36
+ }
37
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc;IAC7D,MAAM,OAAO,GAA2B;QACtC,eAAe,EAAE,UAAU,MAAM,EAAE;QACnC,cAAc,EAAE,kBAAkB;KACnC,CAAA;IAED,KAAK,UAAU,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc,EAAE,MAA+B;QACrG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA+E,CAAA;QAE1G,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,cAAc,GAAG,CAAC,MAAM,EAAE,CAAA;YAChE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QAED,OAAO,IAAI,CAAC,IAAS,CAAA;IACvB,CAAC;IAED,OAAO;QACL,GAAG,EAAE,CAAI,IAAY,EAAE,MAA+B,EAAE,EAAE,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC;QACrG,IAAI,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;QACzE,GAAG,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;QACvE,KAAK,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QAC3E,MAAM,EAAE,CAAI,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;KAC9E,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * dotodo MCP Server
4
+ *
5
+ * Claude Desktop/Code에서 dotodo API를 직접 사용할 수 있도록
6
+ * Model Context Protocol 서버를 구현합니다.
7
+ *
8
+ * 환경변수:
9
+ * DOTODO_API_URL - API 서버 URL (기본: http://localhost:5050)
10
+ * DOTODO_API_KEY - API Key (필수, sk_dotodo_... 형식)
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
package/dist/index.js ADDED
@@ -0,0 +1,478 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * dotodo MCP Server
4
+ *
5
+ * Claude Desktop/Code에서 dotodo API를 직접 사용할 수 있도록
6
+ * Model Context Protocol 서버를 구현합니다.
7
+ *
8
+ * 환경변수:
9
+ * DOTODO_API_URL - API 서버 URL (기본: http://localhost:5050)
10
+ * DOTODO_API_KEY - API Key (필수, sk_dotodo_... 형식)
11
+ */
12
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { z } from 'zod';
15
+ import { createApiClient } from './client.js';
16
+ const API_URL = process.env.DOTODO_API_URL || 'http://localhost:5050';
17
+ const API_KEY = process.env.DOTODO_API_KEY;
18
+ if (!API_KEY) {
19
+ console.error('Error: DOTODO_API_KEY environment variable is required');
20
+ console.error('Get your API key from dotodo web app: Settings > API Keys');
21
+ process.exit(1);
22
+ }
23
+ const client = createApiClient(API_URL, API_KEY);
24
+ const server = new McpServer({
25
+ name: 'dotodo',
26
+ version: '1.0.0',
27
+ });
28
+ // ============================================
29
+ // add_todo
30
+ // ============================================
31
+ server.registerTool('add_todo', {
32
+ description: 'Create a new todo item with optional deadline, priority, and project context',
33
+ inputSchema: {
34
+ title: z.string().describe('Todo title (max 200 chars)'),
35
+ description: z.string().optional().describe('Detailed description (max 2000 chars)'),
36
+ hasDue: z.boolean().optional().describe('Whether this todo has a deadline. Default: false'),
37
+ dueType: z.enum(['date', 'week', 'month', 'quarter', 'year']).optional().describe('Type of deadline'),
38
+ dueDate: z.string().optional().describe('Due date in YYYY-MM-DD format (for date type)'),
39
+ dueYear: z.number().optional().describe('Due year (2000-2100)'),
40
+ dueMonth: z.number().optional().describe('Due month (1-12)'),
41
+ dueWeek: z.number().optional().describe('Due week (1-53)'),
42
+ dueQuarter: z.number().optional().describe('Due quarter (1-4)'),
43
+ priority: z.enum(['high', 'medium', 'low']).optional().describe('Priority level. Default: medium'),
44
+ projectId: z.string().optional().describe('UUID of the project to assign this todo to'),
45
+ projectName: z.string().optional().describe('Project name for organizing todos by project'),
46
+ projectPath: z.string().optional().describe('Absolute path to project directory'),
47
+ tagIds: z.array(z.string()).optional().describe('Array of tag UUIDs'),
48
+ },
49
+ }, async (args) => {
50
+ try {
51
+ const body = {
52
+ title: args.title,
53
+ hasDue: args.hasDue ?? false,
54
+ };
55
+ if (args.description)
56
+ body.description = args.description;
57
+ if (args.dueType)
58
+ body.dueType = args.dueType;
59
+ if (args.dueDate)
60
+ body.dueDate = args.dueDate;
61
+ if (args.dueYear)
62
+ body.dueYear = args.dueYear;
63
+ if (args.dueMonth)
64
+ body.dueMonth = args.dueMonth;
65
+ if (args.dueWeek)
66
+ body.dueWeek = args.dueWeek;
67
+ if (args.dueQuarter)
68
+ body.dueQuarter = args.dueQuarter;
69
+ if (args.priority)
70
+ body.priority = args.priority;
71
+ if (args.projectId)
72
+ body.projectId = args.projectId;
73
+ if (args.projectName)
74
+ body.projectName = args.projectName;
75
+ if (args.projectPath)
76
+ body.projectPath = args.projectPath;
77
+ if (args.tagIds)
78
+ body.tagIds = args.tagIds;
79
+ const todo = await client.post('/todos', body);
80
+ return { content: [{ type: 'text', text: `Created todo: "${todo.title}" (ID: ${todo.id})` }] };
81
+ }
82
+ catch (e) {
83
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
84
+ }
85
+ });
86
+ // ============================================
87
+ // list_todos
88
+ // ============================================
89
+ server.registerTool('list_todos', {
90
+ description: `List todos with filters. Common patterns:
91
+ - Today's todos: dueType="date", date="2026-02-14"
92
+ - This week: dueType="week", year=2026, week=7
93
+ - This month: dueType="month", year=2026, month=2
94
+ - This quarter: dueType="quarter", year=2026, quarter=1
95
+ - This year: dueType="year", year=2026
96
+ - Bucket list (no deadline): hasDue=false
97
+ - Date range: dueDateFrom="2026-02-14", dueDateTo="2026-02-15"
98
+ - Overdue: dueType="date", dueDateTo="2026-02-13", isDone=false
99
+ - Active only: isDone=false`,
100
+ inputSchema: {
101
+ status: z.enum(['pending', 'in_progress', 'completed', 'skipped']).optional().describe('Filter by status'),
102
+ isDone: z.boolean().optional().describe('Filter by completion. true=completed, false=active. Simpler alternative to status.'),
103
+ priority: z.enum(['high', 'medium', 'low']).optional().describe('Filter by priority'),
104
+ hasDue: z.boolean().optional().describe('Filter by whether todo has a deadline. false=bucket list items.'),
105
+ dueType: z.enum(['date', 'week', 'month', 'quarter', 'year']).optional().describe('Filter by due type'),
106
+ date: z.string().optional().describe('Exact due date filter (YYYY-MM-DD). Use with dueType="date".'),
107
+ dueDateFrom: z.string().optional().describe('Due date range start (YYYY-MM-DD, inclusive). Filters due_date >= this value.'),
108
+ dueDateTo: z.string().optional().describe('Due date range end (YYYY-MM-DD, inclusive). Filters due_date <= this value.'),
109
+ year: z.number().optional().describe('Filter by due year (e.g. 2026)'),
110
+ month: z.number().optional().describe('Filter by due month (1-12). Use with year.'),
111
+ week: z.number().optional().describe('Filter by due week (1-53). Use with year.'),
112
+ quarter: z.number().optional().describe('Filter by due quarter (1-4). Use with year.'),
113
+ projectId: z.string().optional().describe('Filter by project UUID'),
114
+ projectName: z.string().optional().describe('Filter by project name'),
115
+ projectPath: z.string().optional().describe('Filter by project path'),
116
+ sortBy: z.enum(['deadlineAt', 'priority', 'createdAt', 'updatedAt']).optional().describe('Sort field'),
117
+ sortOrder: z.enum(['asc', 'desc']).optional().describe('Sort direction'),
118
+ limit: z.number().optional().describe('Max items (default: 50, max: 500)'),
119
+ },
120
+ }, async (args) => {
121
+ try {
122
+ const params = {};
123
+ if (args.status)
124
+ params.status = args.status;
125
+ if (args.isDone !== undefined)
126
+ params.isDone = String(args.isDone);
127
+ if (args.priority)
128
+ params.priority = args.priority;
129
+ if (args.hasDue !== undefined)
130
+ params.hasDue = String(args.hasDue);
131
+ if (args.dueType)
132
+ params.dueType = args.dueType;
133
+ if (args.date)
134
+ params.date = args.date;
135
+ if (args.dueDateFrom)
136
+ params.dueDateFrom = args.dueDateFrom;
137
+ if (args.dueDateTo)
138
+ params.dueDateTo = args.dueDateTo;
139
+ if (args.year)
140
+ params.year = String(args.year);
141
+ if (args.month)
142
+ params.month = String(args.month);
143
+ if (args.week)
144
+ params.week = String(args.week);
145
+ if (args.quarter)
146
+ params.quarter = String(args.quarter);
147
+ if (args.projectId)
148
+ params.projectId = args.projectId;
149
+ if (args.projectName)
150
+ params.projectName = args.projectName;
151
+ if (args.projectPath)
152
+ params.projectPath = args.projectPath;
153
+ if (args.sortBy)
154
+ params.sortBy = args.sortBy;
155
+ if (args.sortOrder)
156
+ params.sortOrder = args.sortOrder;
157
+ if (args.limit)
158
+ params.limit = String(args.limit);
159
+ const result = await client.get('/todos', params);
160
+ if (result.items.length === 0) {
161
+ return { content: [{ type: 'text', text: 'No todos found matching the filters.' }] };
162
+ }
163
+ const lines = result.items.map((t) => {
164
+ const check = t.status === 'completed' ? '[x]' : '[ ]';
165
+ const pri = t.priority === 'high' ? ' [HIGH]' : t.priority === 'low' ? ' [LOW]' : '';
166
+ const proj = t.projectName ? ` 📁${t.projectName}` : '';
167
+ const tags = t.tags && t.tags.length > 0 ? ` #${t.tags.map((tg) => tg.name).join(' #')}` : '';
168
+ let due = '';
169
+ if (t.hasDue && t.dueType) {
170
+ if (t.dueType === 'date' && t.dueDate)
171
+ due = ` 📅${String(t.dueDate).slice(0, 10)}`;
172
+ else if (t.dueType === 'week')
173
+ due = ` 📅W${t.dueWeek}`;
174
+ else if (t.dueType === 'month')
175
+ due = ` 📅${t.dueYear}-${String(t.dueMonth).padStart(2, '0')}`;
176
+ else if (t.dueType === 'quarter')
177
+ due = ` 📅${t.dueYear}Q${t.dueQuarter}`;
178
+ else if (t.dueType === 'year')
179
+ due = ` 📅${t.dueYear}`;
180
+ }
181
+ return `${check}${pri} ${t.title}${due}${proj}${tags} (${t.id})`;
182
+ });
183
+ return { content: [{ type: 'text', text: `${result.total} todos${result.hasMore ? ' (more available)' : ''}:\n${lines.join('\n')}` }] };
184
+ }
185
+ catch (e) {
186
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
187
+ }
188
+ });
189
+ // ============================================
190
+ // complete_todo
191
+ // ============================================
192
+ server.registerTool('complete_todo', {
193
+ description: 'Toggle todo completion. If pending -> completed. If completed -> pending.',
194
+ inputSchema: {
195
+ todoId: z.string().describe('UUID of the todo'),
196
+ },
197
+ }, async (args) => {
198
+ try {
199
+ const todo = await client.patch(`/todos/${args.todoId}/done`);
200
+ const action = todo.status === 'completed' ? 'Completed' : 'Reopened';
201
+ return { content: [{ type: 'text', text: `${action}: "${todo.title}"` }] };
202
+ }
203
+ catch (e) {
204
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
205
+ }
206
+ });
207
+ // ============================================
208
+ // update_todo
209
+ // ============================================
210
+ server.registerTool('update_todo', {
211
+ description: 'Update an existing todo. Only provide fields you want to change.',
212
+ inputSchema: {
213
+ todoId: z.string().describe('UUID of the todo to update'),
214
+ title: z.string().optional().describe('New title'),
215
+ description: z.string().optional().describe('New description'),
216
+ status: z.enum(['pending', 'in_progress', 'completed', 'skipped']).optional().describe('New status'),
217
+ priority: z.enum(['high', 'medium', 'low']).optional().describe('New priority'),
218
+ hasDue: z.boolean().optional().describe('Whether this todo has a deadline'),
219
+ dueType: z.enum(['date', 'week', 'month', 'quarter', 'year']).optional().describe('Deadline type'),
220
+ dueDate: z.string().optional().describe('Due date YYYY-MM-DD'),
221
+ projectId: z.string().optional().describe('UUID of the project to assign this todo to (null to unassign)'),
222
+ projectName: z.string().optional().describe('Project name'),
223
+ projectPath: z.string().optional().describe('Project path'),
224
+ },
225
+ }, async (args) => {
226
+ try {
227
+ const { todoId, ...updates } = args;
228
+ const body = {};
229
+ for (const [key, value] of Object.entries(updates)) {
230
+ if (value !== undefined)
231
+ body[key] = value;
232
+ }
233
+ const todo = await client.put(`/todos/${todoId}`, body);
234
+ return { content: [{ type: 'text', text: `Updated: "${todo.title}" (status: ${todo.status})` }] };
235
+ }
236
+ catch (e) {
237
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
238
+ }
239
+ });
240
+ // ============================================
241
+ // delete_todo
242
+ // ============================================
243
+ server.registerTool('delete_todo', {
244
+ description: 'Delete a todo (soft delete, can be recovered)',
245
+ inputSchema: {
246
+ todoId: z.string().describe('UUID of the todo to delete'),
247
+ },
248
+ }, async (args) => {
249
+ try {
250
+ await client.delete(`/todos/${args.todoId}`);
251
+ return { content: [{ type: 'text', text: `Deleted todo: ${args.todoId}` }] };
252
+ }
253
+ catch (e) {
254
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
255
+ }
256
+ });
257
+ // ============================================
258
+ // get_project_todos
259
+ // ============================================
260
+ server.registerTool('get_project_todos', {
261
+ description: 'Get all todos for a specific project. Useful for Claude Code to track tasks per project directory.',
262
+ inputSchema: {
263
+ projectName: z.string().optional().describe('Project name to filter by'),
264
+ projectPath: z.string().optional().describe('Project directory path to filter by'),
265
+ status: z.enum(['pending', 'in_progress', 'completed', 'skipped']).optional().describe('Filter by status'),
266
+ },
267
+ }, async (args) => {
268
+ try {
269
+ if (!args.projectName && !args.projectPath) {
270
+ return { content: [{ type: 'text', text: 'Error: provide either projectName or projectPath' }], isError: true };
271
+ }
272
+ const params = { limit: '500' };
273
+ if (args.projectName)
274
+ params.projectName = args.projectName;
275
+ if (args.projectPath)
276
+ params.projectPath = args.projectPath;
277
+ if (args.status)
278
+ params.status = args.status;
279
+ const result = await client.get('/todos', params);
280
+ if (result.items.length === 0) {
281
+ return { content: [{ type: 'text', text: 'No todos found for this project.' }] };
282
+ }
283
+ const pending = result.items.filter((t) => t.status !== 'completed');
284
+ const completed = result.items.filter((t) => t.status === 'completed');
285
+ let text = `Project todos (${result.total} total, ${pending.length} active, ${completed.length} done):\n\n`;
286
+ if (pending.length > 0) {
287
+ text += 'Active:\n';
288
+ for (const t of pending) {
289
+ const pri = t.priority === 'high' ? ' [HIGH]' : '';
290
+ text += ` [ ] ${t.title}${pri} (${t.id})\n`;
291
+ }
292
+ }
293
+ if (completed.length > 0) {
294
+ text += '\nCompleted:\n';
295
+ for (const t of completed) {
296
+ text += ` [x] ${t.title} (${t.id})\n`;
297
+ }
298
+ }
299
+ return { content: [{ type: 'text', text }] };
300
+ }
301
+ catch (e) {
302
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
303
+ }
304
+ });
305
+ // ============================================
306
+ // list_projects
307
+ // ============================================
308
+ server.registerTool('list_projects', {
309
+ description: 'List all projects. Use project IDs when creating or updating todos.',
310
+ }, async () => {
311
+ try {
312
+ const projects = await client.get('/projects');
313
+ if (projects.length === 0) {
314
+ return { content: [{ type: 'text', text: 'No projects found.' }] };
315
+ }
316
+ const lines = projects.map((p) => {
317
+ const desc = p.description ? ` - ${p.description}` : '';
318
+ return ` ${p.color} ${p.name}${desc} (${p.id})`;
319
+ });
320
+ return { content: [{ type: 'text', text: `Projects (${projects.length}):\n${lines.join('\n')}` }] };
321
+ }
322
+ catch (e) {
323
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
324
+ }
325
+ });
326
+ // ============================================
327
+ // create_project
328
+ // ============================================
329
+ server.registerTool('create_project', {
330
+ description: 'Create a new project for organizing todos',
331
+ inputSchema: {
332
+ name: z.string().describe('Project name (max 100 chars)'),
333
+ description: z.string().optional().describe('Project description (max 500 chars)'),
334
+ color: z.string().optional().describe('Hex color code e.g. "#22C55E". Default: #6B7280'),
335
+ },
336
+ }, async (args) => {
337
+ try {
338
+ const body = { name: args.name };
339
+ if (args.description)
340
+ body.description = args.description;
341
+ if (args.color)
342
+ body.color = args.color;
343
+ const project = await client.post('/projects', body);
344
+ return { content: [{ type: 'text', text: `Created project: "${project.name}" (${project.id})` }] };
345
+ }
346
+ catch (e) {
347
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
348
+ }
349
+ });
350
+ // ============================================
351
+ // add_tag
352
+ // ============================================
353
+ server.registerTool('add_tag', {
354
+ description: 'Create a new tag for categorizing todos',
355
+ inputSchema: {
356
+ name: z.string().describe('Tag name (max 50 chars)'),
357
+ color: z.string().optional().describe('Hex color code e.g. "#FF5733". Default: #6B7280'),
358
+ },
359
+ }, async (args) => {
360
+ try {
361
+ const body = { name: args.name };
362
+ if (args.color)
363
+ body.color = args.color;
364
+ const tag = await client.post('/tags', body);
365
+ return { content: [{ type: 'text', text: `Created tag: "${tag.name}" (${tag.id})` }] };
366
+ }
367
+ catch (e) {
368
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
369
+ }
370
+ });
371
+ // ============================================
372
+ // list_tags
373
+ // ============================================
374
+ server.registerTool('list_tags', {
375
+ description: 'List all available tags. Use tag IDs when creating or updating todos.',
376
+ }, async () => {
377
+ try {
378
+ const tags = await client.get('/tags');
379
+ if (tags.length === 0) {
380
+ return { content: [{ type: 'text', text: 'No tags found.' }] };
381
+ }
382
+ const lines = tags.map((t) => ` ${t.color} ${t.name} (${t.id})`);
383
+ return { content: [{ type: 'text', text: `Tags (${tags.length}):\n${lines.join('\n')}` }] };
384
+ }
385
+ catch (e) {
386
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
387
+ }
388
+ });
389
+ // ============================================
390
+ // add_todos (batch)
391
+ // ============================================
392
+ server.registerTool('add_todos', {
393
+ description: 'Create multiple todos at once (max 50). More efficient than calling add_todo multiple times.',
394
+ inputSchema: {
395
+ items: z.array(z.object({
396
+ title: z.string().describe('Todo title'),
397
+ description: z.string().optional().describe('Description'),
398
+ hasDue: z.boolean().optional().describe('Has deadline? Default: false'),
399
+ dueType: z.enum(['date', 'week', 'month', 'quarter', 'year']).optional().describe('Deadline type'),
400
+ dueDate: z.string().optional().describe('Due date YYYY-MM-DD'),
401
+ dueYear: z.number().optional().describe('Due year'),
402
+ dueMonth: z.number().optional().describe('Due month (1-12)'),
403
+ dueWeek: z.number().optional().describe('Due week (1-53)'),
404
+ dueQuarter: z.number().optional().describe('Due quarter (1-4)'),
405
+ priority: z.enum(['high', 'medium', 'low']).optional().describe('Priority. Default: medium'),
406
+ projectId: z.string().optional().describe('Project UUID'),
407
+ projectName: z.string().optional().describe('Project name'),
408
+ projectPath: z.string().optional().describe('Project path'),
409
+ tagIds: z.array(z.string()).optional().describe('Tag UUIDs'),
410
+ })).describe('Array of todos to create (max 50)'),
411
+ },
412
+ }, async (args) => {
413
+ try {
414
+ const result = await client.post('/todos/batch', { items: args.items });
415
+ const { created, errors } = result;
416
+ let text = `Created ${created.length} todos:\n`;
417
+ for (const t of created)
418
+ text += ` - "${t.title}" (${t.id})\n`;
419
+ if (errors.length > 0)
420
+ text += `\nErrors:\n${errors.map((e) => ` - ${e}`).join('\n')}`;
421
+ return { content: [{ type: 'text', text }] };
422
+ }
423
+ catch (e) {
424
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
425
+ }
426
+ });
427
+ // ============================================
428
+ // complete_todos (batch)
429
+ // ============================================
430
+ server.registerTool('complete_todos', {
431
+ description: 'Toggle completion for multiple todos at once (max 100). Pending->completed, completed->pending.',
432
+ inputSchema: {
433
+ todoIds: z.array(z.string()).describe('Array of todo UUIDs to toggle (max 100)'),
434
+ },
435
+ }, async (args) => {
436
+ try {
437
+ const result = await client.patch('/todos/batch/done', { todoIds: args.todoIds });
438
+ const { toggled, errors } = result;
439
+ const completed = toggled.filter((t) => t.status === 'completed');
440
+ const reopened = toggled.filter((t) => t.status === 'pending');
441
+ let text = '';
442
+ if (completed.length > 0)
443
+ text += `Completed ${completed.length}: ${completed.map((t) => `"${t.title}"`).join(', ')}\n`;
444
+ if (reopened.length > 0)
445
+ text += `Reopened ${reopened.length}: ${reopened.map((t) => `"${t.title}"`).join(', ')}\n`;
446
+ if (errors.length > 0)
447
+ text += `Errors: ${errors.join(', ')}`;
448
+ return { content: [{ type: 'text', text: text.trim() || 'No changes made.' }] };
449
+ }
450
+ catch (e) {
451
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
452
+ }
453
+ });
454
+ // ============================================
455
+ // delete_todos (batch)
456
+ // ============================================
457
+ server.registerTool('delete_todos', {
458
+ description: 'Delete multiple todos at once (max 100, soft delete).',
459
+ inputSchema: {
460
+ todoIds: z.array(z.string()).describe('Array of todo UUIDs to delete (max 100)'),
461
+ },
462
+ }, async (args) => {
463
+ try {
464
+ const result = await client.delete('/todos/batch', { todoIds: args.todoIds });
465
+ const { deleted, errors } = result;
466
+ let text = `Deleted ${deleted.length} todos.`;
467
+ if (errors.length > 0)
468
+ text += `\nErrors: ${errors.join(', ')}`;
469
+ return { content: [{ type: 'text', text }] };
470
+ }
471
+ catch (e) {
472
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
473
+ }
474
+ });
475
+ // stdio transport로 서버 시작
476
+ const transport = new StdioServerTransport();
477
+ await server.connect(transport);
478
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "dotodo-mcp",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "MCP (Model Context Protocol) server for dotodo - manage your todos from AI assistants like Claude",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/jepilyun/dotodo_v3",
10
+ "directory": "packages/mcp"
11
+ },
12
+ "homepage": "https://dotodo.co/mcp",
13
+ "keywords": [
14
+ "mcp",
15
+ "model-context-protocol",
16
+ "todo",
17
+ "dotodo",
18
+ "claude",
19
+ "ai-assistant",
20
+ "productivity"
21
+ ],
22
+ "main": "./dist/index.js",
23
+ "bin": {
24
+ "dotodo-mcp": "./dist/index.js"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "scripts": {
31
+ "dev": "tsx watch src/index.ts",
32
+ "build": "tsc",
33
+ "prepublishOnly": "npm run build",
34
+ "start": "node dist/index.js",
35
+ "clean": "rm -rf dist"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.12.1",
39
+ "zod": "^3.22.4"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.11.0",
43
+ "tsx": "^4.7.0",
44
+ "typescript": "^5.3.3"
45
+ },
46
+ "engines": {
47
+ "node": ">=20.0.0"
48
+ }
49
+ }