@j0hanz/todokit-mcp 1.0.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 (70) hide show
  1. package/README.md +61 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +30 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/errors.d.ts +19 -0
  7. package/dist/lib/errors.d.ts.map +1 -0
  8. package/dist/lib/errors.js +44 -0
  9. package/dist/lib/errors.js.map +1 -0
  10. package/dist/lib/match.d.ts +47 -0
  11. package/dist/lib/match.d.ts.map +1 -0
  12. package/dist/lib/match.js +8 -0
  13. package/dist/lib/match.js.map +1 -0
  14. package/dist/lib/resolve.js +83 -0
  15. package/dist/lib/resolve.js.map +1 -0
  16. package/dist/lib/storage.d.ts +16 -0
  17. package/dist/lib/storage.d.ts.map +1 -0
  18. package/dist/lib/storage.js +363 -0
  19. package/dist/lib/storage.js.map +1 -0
  20. package/dist/lib/storage_filters.d.ts +12 -0
  21. package/dist/lib/storage_filters.d.ts.map +1 -0
  22. package/dist/lib/storage_filters.js +70 -0
  23. package/dist/lib/storage_filters.js.map +1 -0
  24. package/dist/lib/tool_response.d.ts +5 -0
  25. package/dist/lib/tool_response.d.ts.map +1 -0
  26. package/dist/lib/tool_response.js +7 -0
  27. package/dist/lib/tool_response.js.map +1 -0
  28. package/dist/lib/types.d.ts +72 -0
  29. package/dist/lib/types.d.ts.map +1 -0
  30. package/dist/lib/types.js +16 -0
  31. package/dist/lib/types.js.map +1 -0
  32. package/dist/schemas/inputs.d.ts +170 -0
  33. package/dist/schemas/inputs.d.ts.map +1 -0
  34. package/dist/schemas/inputs.js +163 -0
  35. package/dist/schemas/inputs.js.map +1 -0
  36. package/dist/schemas/iso_date.js +20 -0
  37. package/dist/schemas/iso_date.js.map +1 -0
  38. package/dist/schemas/outputs.d.ts +30 -0
  39. package/dist/schemas/outputs.d.ts.map +1 -0
  40. package/dist/schemas/outputs.js +9 -0
  41. package/dist/schemas/outputs.js.map +1 -0
  42. package/dist/tools/add_todo.d.ts +3 -0
  43. package/dist/tools/add_todo.d.ts.map +1 -0
  44. package/dist/tools/add_todo.js +34 -0
  45. package/dist/tools/add_todo.js.map +1 -0
  46. package/dist/tools/add_todos.d.ts +3 -0
  47. package/dist/tools/add_todos.d.ts.map +1 -0
  48. package/dist/tools/add_todos.js +34 -0
  49. package/dist/tools/add_todos.js.map +1 -0
  50. package/dist/tools/complete_todo.d.ts +3 -0
  51. package/dist/tools/complete_todo.d.ts.map +1 -0
  52. package/dist/tools/complete_todo.js +65 -0
  53. package/dist/tools/complete_todo.js.map +1 -0
  54. package/dist/tools/delete_todo.d.ts +3 -0
  55. package/dist/tools/delete_todo.d.ts.map +1 -0
  56. package/dist/tools/delete_todo.js +95 -0
  57. package/dist/tools/delete_todo.js.map +1 -0
  58. package/dist/tools/index.d.ts +3 -0
  59. package/dist/tools/index.d.ts.map +1 -0
  60. package/dist/tools/index.js +15 -0
  61. package/dist/tools/index.js.map +1 -0
  62. package/dist/tools/list_todos.d.ts +3 -0
  63. package/dist/tools/list_todos.d.ts.map +1 -0
  64. package/dist/tools/list_todos.js +157 -0
  65. package/dist/tools/list_todos.js.map +1 -0
  66. package/dist/tools/update_todo.d.ts +3 -0
  67. package/dist/tools/update_todo.d.ts.map +1 -0
  68. package/dist/tools/update_todo.js +90 -0
  69. package/dist/tools/update_todo.js.map +1 -0
  70. package/package.json +72 -0
@@ -0,0 +1,95 @@
1
+ import { createErrorResponse, getErrorMessage } from '../lib/errors.js';
2
+ import { resolveTodoTargetFromTodos, toResolveInput, unwrapResolution, } from '../lib/resolve.js';
3
+ import { deleteTodoBySelector, getTodos } from '../lib/storage.js';
4
+ import { createToolResponse } from '../lib/tool_response.js';
5
+ import { DeleteTodoSchema } from '../schemas/inputs.js';
6
+ import { DefaultOutputSchema } from '../schemas/outputs.js';
7
+ function buildDryRunSingle(todo) {
8
+ return createToolResponse({
9
+ ok: true,
10
+ result: {
11
+ deletedIds: [todo.id],
12
+ summary: `Dry run: would delete todo "${todo.title}"`,
13
+ dryRun: true,
14
+ },
15
+ });
16
+ }
17
+ function buildDryRunMultiple(previews, total) {
18
+ return createToolResponse({
19
+ ok: true,
20
+ result: {
21
+ deletedIds: [],
22
+ summary: `Dry run: ${String(total)} todos would be deleted`,
23
+ matches: previews,
24
+ totalMatches: total,
25
+ dryRun: true,
26
+ },
27
+ });
28
+ }
29
+ function buildDeleteSuccess(todo) {
30
+ return createToolResponse({
31
+ ok: true,
32
+ result: {
33
+ deletedIds: [todo.id],
34
+ summary: `Deleted todo "${todo.title}"`,
35
+ nextActions: ['list_todos'],
36
+ },
37
+ });
38
+ }
39
+ function handleAmbiguousDelete(outcome, dryRun) {
40
+ if (dryRun) {
41
+ return buildDryRunMultiple(outcome.previews, outcome.matches.length);
42
+ }
43
+ return outcome.response;
44
+ }
45
+ function handleMatchDelete(todo, dryRun) {
46
+ if (dryRun) {
47
+ return buildDryRunSingle(todo);
48
+ }
49
+ return buildDeleteSuccess(todo);
50
+ }
51
+ async function handleDeleteTodoDryRun(input) {
52
+ const todos = await getTodos();
53
+ const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, toResolveInput({ id: input.id, query: input.query })));
54
+ if (outcome.kind === 'error')
55
+ return outcome.response;
56
+ if (outcome.kind === 'ambiguous') {
57
+ return handleAmbiguousDelete(outcome, true);
58
+ }
59
+ return handleMatchDelete(outcome.todo, true);
60
+ }
61
+ async function handleDeleteTodoLive(input) {
62
+ const outcome = await deleteTodoBySelector(toResolveInput({ id: input.id, query: input.query }));
63
+ if (outcome.kind === 'error' || outcome.kind === 'ambiguous') {
64
+ return outcome.response;
65
+ }
66
+ return handleMatchDelete(outcome.todo, false);
67
+ }
68
+ async function handleDeleteTodo(input) {
69
+ const dryRun = input.dryRun ?? false;
70
+ if (dryRun) {
71
+ return handleDeleteTodoDryRun(input);
72
+ }
73
+ return handleDeleteTodoLive(input);
74
+ }
75
+ export function registerDeleteTodo(server) {
76
+ server.registerTool('delete_todo', {
77
+ title: 'Delete Todo',
78
+ description: 'Delete a todo item (supports dry-run)',
79
+ inputSchema: DeleteTodoSchema,
80
+ outputSchema: DefaultOutputSchema,
81
+ annotations: {
82
+ readOnlyHint: false,
83
+ idempotentHint: true,
84
+ destructiveHint: true,
85
+ },
86
+ }, async (input) => {
87
+ try {
88
+ return await handleDeleteTodo(input);
89
+ }
90
+ catch (err) {
91
+ return createErrorResponse('E_DELETE_TODO', getErrorMessage(err));
92
+ }
93
+ });
94
+ }
95
+ //# sourceMappingURL=delete_todo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_todo.js","sourceRoot":"","sources":["../../src/tools/delete_todo.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAEL,0BAA0B,EAC1B,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D,SAAS,iBAAiB,CAAC,IAAU;IACnC,OAAO,kBAAkB,CAAC;QACxB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,+BAA+B,IAAI,CAAC,KAAK,GAAG;YACrD,MAAM,EAAE,IAAI;SACb;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAmB,EACnB,KAAa;IAEb,OAAO,kBAAkB,CAAC;QACxB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,YAAY,MAAM,CAAC,KAAK,CAAC,yBAAyB;YAC3D,OAAO,EAAE,QAAQ;YACjB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,IAAI;SACb;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAU;IACpC,OAAO,kBAAkB,CAAC;QACxB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,iBAAiB,IAAI,CAAC,KAAK,GAAG;YACvC,WAAW,EAAE,CAAC,YAAY,CAAC;SAC5B;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAU,EAAE,MAAe;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,KAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,gBAAgB,CAC9B,0BAA0B,CACxB,KAAK,EACL,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CACrD,CACF,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;IACtD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CACrD,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7D,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAsB;IAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,uCAAuC;QACpD,WAAW,EAAE,gBAAgB;QAC7B,YAAY,EAAE,mBAAmB;QACjC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,IAAI;SACtB;KACF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,OAAO,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAllTools(server: McpServer): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAOxD"}
@@ -0,0 +1,15 @@
1
+ import { registerAddTodo } from './add_todo.js';
2
+ import { registerAddTodos } from './add_todos.js';
3
+ import { registerCompleteTodo } from './complete_todo.js';
4
+ import { registerDeleteTodo } from './delete_todo.js';
5
+ import { registerListTodos } from './list_todos.js';
6
+ import { registerUpdateTodo } from './update_todo.js';
7
+ export function registerAllTools(server) {
8
+ registerAddTodo(server);
9
+ registerAddTodos(server);
10
+ registerListTodos(server);
11
+ registerUpdateTodo(server);
12
+ registerCompleteTodo(server);
13
+ registerDeleteTodo(server);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerListTodos(server: McpServer): void;
3
+ //# sourceMappingURL=list_todos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_todos.d.ts","sourceRoot":"","sources":["../../src/tools/list_todos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4MzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqBzD"}
@@ -0,0 +1,157 @@
1
+ import { createErrorResponse, getErrorMessage } from '../lib/errors.js';
2
+ import { getTodos } from '../lib/storage.js';
3
+ import { createToolResponse } from '../lib/tool_response.js';
4
+ import { ListTodosFilterSchema } from '../schemas/inputs.js';
5
+ import { DefaultOutputSchema } from '../schemas/outputs.js';
6
+ const DEFAULT_LIMIT = 50;
7
+ const DEFAULT_OFFSET = 0;
8
+ const PRIORITY_WEIGHT = {
9
+ low: 1,
10
+ normal: 2,
11
+ high: 3,
12
+ };
13
+ const MISSING_DUE_DATE = '9999-12-31';
14
+ function getTodayIso() {
15
+ return new Date().toISOString().slice(0, 10);
16
+ }
17
+ function isOverdue(todo, todayIso) {
18
+ if (!todo.dueDate)
19
+ return false;
20
+ if (todo.completed)
21
+ return false;
22
+ return todo.dueDate < todayIso;
23
+ }
24
+ function compareStrings(a, b) {
25
+ return a.localeCompare(b);
26
+ }
27
+ function getDueDateKey(todo) {
28
+ return todo.dueDate ?? MISSING_DUE_DATE;
29
+ }
30
+ function compareDueDate(a, b) {
31
+ return compareStrings(getDueDateKey(a), getDueDateKey(b));
32
+ }
33
+ function comparePriority(a, b) {
34
+ return PRIORITY_WEIGHT[a.priority] - PRIORITY_WEIGHT[b.priority];
35
+ }
36
+ function compareTitle(a, b) {
37
+ return compareStrings(a.title, b.title);
38
+ }
39
+ function compareCreatedAt(a, b) {
40
+ return compareStrings(a.createdAt, b.createdAt);
41
+ }
42
+ const COMPARATORS = {
43
+ dueDate: compareDueDate,
44
+ priority: comparePriority,
45
+ title: compareTitle,
46
+ createdAt: compareCreatedAt,
47
+ };
48
+ function sortTodos(todos, sortBy, order) {
49
+ const direction = order === 'desc' ? -1 : 1;
50
+ const comparator = COMPARATORS[sortBy];
51
+ return [...todos].sort((a, b) => {
52
+ const primary = comparator(a, b) * direction;
53
+ if (primary !== 0)
54
+ return primary;
55
+ return compareCreatedAt(a, b);
56
+ });
57
+ }
58
+ function normalizeQuery(query) {
59
+ const trimmed = query?.trim();
60
+ return trimmed && trimmed.length > 0 ? trimmed : undefined;
61
+ }
62
+ function resolveCompletedFilter(status, completed) {
63
+ if (status === 'pending')
64
+ return false;
65
+ if (status === 'completed')
66
+ return true;
67
+ return completed;
68
+ }
69
+ function normalizeFilters(filters) {
70
+ return {
71
+ completed: resolveCompletedFilter(filters.status, filters.completed),
72
+ priority: filters.priority,
73
+ tag: filters.tag,
74
+ dueBefore: filters.dueBefore,
75
+ dueAfter: filters.dueAfter,
76
+ query: normalizeQuery(filters.query),
77
+ sortBy: filters.sortBy ?? 'createdAt',
78
+ order: filters.order ?? 'asc',
79
+ limit: filters.limit ?? DEFAULT_LIMIT,
80
+ offset: filters.offset ?? DEFAULT_OFFSET,
81
+ };
82
+ }
83
+ function countMatches(todos, predicate) {
84
+ return todos.reduce((total, todo) => total + (predicate(todo) ? 1 : 0), 0);
85
+ }
86
+ function computeCounts(todos, todayIso) {
87
+ const total = todos.length;
88
+ const completed = countMatches(todos, (todo) => todo.completed);
89
+ const overdue = countMatches(todos, (todo) => isOverdue(todo, todayIso));
90
+ return {
91
+ total,
92
+ completed,
93
+ pending: total - completed,
94
+ overdue,
95
+ };
96
+ }
97
+ function buildSummary(counts, pageCount) {
98
+ if (counts.total === 0) {
99
+ return 'No todos found';
100
+ }
101
+ const overdueSuffix = counts.overdue > 0 ? `, ${String(counts.overdue)} overdue` : '';
102
+ return `Showing ${String(pageCount)} of ${String(counts.total)} todos (${String(counts.pending)} pending, ${String(counts.completed)} completed${overdueSuffix}).`;
103
+ }
104
+ function paginateTodos(todos, offset, limit) {
105
+ return todos.slice(offset, offset + limit);
106
+ }
107
+ async function handleListTodos(filters) {
108
+ const normalized = normalizeFilters(filters);
109
+ const allTodos = await getTodos({
110
+ completed: normalized.completed,
111
+ priority: normalized.priority,
112
+ tag: normalized.tag,
113
+ dueBefore: normalized.dueBefore,
114
+ dueAfter: normalized.dueAfter,
115
+ query: normalized.query,
116
+ });
117
+ const todayIso = getTodayIso();
118
+ const counts = computeCounts(allTodos, todayIso);
119
+ const sorted = sortTodos(allTodos, normalized.sortBy, normalized.order);
120
+ const paged = paginateTodos(sorted, normalized.offset, normalized.limit);
121
+ const summary = buildSummary(counts, paged.length);
122
+ return createToolResponse({
123
+ ok: true,
124
+ result: {
125
+ items: paged,
126
+ summary,
127
+ counts: {
128
+ total: counts.total,
129
+ pending: counts.pending,
130
+ completed: counts.completed,
131
+ overdue: counts.overdue,
132
+ },
133
+ limit: normalized.limit,
134
+ offset: normalized.offset,
135
+ },
136
+ });
137
+ }
138
+ export function registerListTodos(server) {
139
+ server.registerTool('list_todos', {
140
+ title: 'List Todos',
141
+ description: 'List todos with filtering, search, sorting, and pagination',
142
+ inputSchema: ListTodosFilterSchema,
143
+ outputSchema: DefaultOutputSchema,
144
+ annotations: {
145
+ readOnlyHint: true,
146
+ idempotentHint: true,
147
+ },
148
+ }, async (filters) => {
149
+ try {
150
+ return await handleListTodos(filters);
151
+ }
152
+ catch (err) {
153
+ return createErrorResponse('E_LIST_TODOS', getErrorMessage(err));
154
+ }
155
+ });
156
+ }
157
+ //# sourceMappingURL=list_todos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_todos.js","sourceRoot":"","sources":["../../src/tools/list_todos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerUpdateTodo(server: McpServer): void;
3
+ //# sourceMappingURL=update_todo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_todo.d.ts","sourceRoot":"","sources":["../../src/tools/update_todo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsIzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqB1D"}
@@ -0,0 +1,90 @@
1
+ import { createErrorResponse, getErrorMessage } from '../lib/errors.js';
2
+ import { toResolveInput } from '../lib/resolve.js';
3
+ import { normalizeTags, updateTodoBySelector } from '../lib/storage.js';
4
+ import { createToolResponse } from '../lib/tool_response.js';
5
+ import { UpdateTodoSchema } from '../schemas/inputs.js';
6
+ import { DefaultOutputSchema } from '../schemas/outputs.js';
7
+ function applyClearFields(updates, fieldsToClear) {
8
+ if (fieldsToClear.has('description')) {
9
+ updates.description = undefined;
10
+ }
11
+ if (fieldsToClear.has('dueDate')) {
12
+ updates.dueDate = undefined;
13
+ }
14
+ }
15
+ function countTags(tags) {
16
+ return tags ? tags.length : 0;
17
+ }
18
+ function hasTagOps(tagOps) {
19
+ return countTags(tagOps?.add) > 0 || countTags(tagOps?.remove) > 0;
20
+ }
21
+ function shouldApplyTagUpdates(updates, fieldsToClear, tagOps) {
22
+ if (updates.tags !== undefined)
23
+ return false;
24
+ return fieldsToClear.has('tags') || hasTagOps(tagOps);
25
+ }
26
+ function resolveBaseTags(baseTodo, fieldsToClear) {
27
+ if (fieldsToClear.has('tags')) {
28
+ return [];
29
+ }
30
+ return baseTodo.tags;
31
+ }
32
+ function safeTagList(tags) {
33
+ return tags ?? [];
34
+ }
35
+ function buildMergedTags(baseTodo, fieldsToClear, tagOps) {
36
+ const baseTags = resolveBaseTags(baseTodo, fieldsToClear);
37
+ const addTags = normalizeTags(safeTagList(tagOps?.add));
38
+ const removeTags = new Set(normalizeTags(safeTagList(tagOps?.remove)));
39
+ return normalizeTags([...baseTags, ...addTags]).filter((tag) => !removeTags.has(tag));
40
+ }
41
+ function applyTagUpdates(updates, baseTodo, fieldsToClear, tagOps) {
42
+ if (!shouldApplyTagUpdates(updates, fieldsToClear, tagOps))
43
+ return;
44
+ updates.tags = buildMergedTags(baseTodo, fieldsToClear, tagOps);
45
+ }
46
+ function buildUpdatePayload(baseTodo, input) {
47
+ const { clearFields, tagOps, ...updates } = input;
48
+ const fieldsToClear = new Set(clearFields ?? []);
49
+ const nextUpdates = { ...updates };
50
+ applyClearFields(nextUpdates, fieldsToClear);
51
+ applyTagUpdates(nextUpdates, baseTodo, fieldsToClear, tagOps);
52
+ return Object.keys(nextUpdates).length > 0 ? nextUpdates : null;
53
+ }
54
+ async function handleUpdateTodo(input) {
55
+ const outcome = await updateTodoBySelector(toResolveInput({ id: input.id, query: input.query }), (todo) => buildUpdatePayload(todo, input));
56
+ if (outcome.kind === 'error' || outcome.kind === 'ambiguous') {
57
+ return outcome.response;
58
+ }
59
+ if (outcome.kind === 'no_updates') {
60
+ return createErrorResponse('E_BAD_REQUEST', 'No fields provided to update');
61
+ }
62
+ return createToolResponse({
63
+ ok: true,
64
+ result: {
65
+ item: outcome.todo,
66
+ summary: `Updated todo "${outcome.todo.title}"`,
67
+ nextActions: ['list_todos', 'complete_todo'],
68
+ },
69
+ });
70
+ }
71
+ export function registerUpdateTodo(server) {
72
+ server.registerTool('update_todo', {
73
+ title: 'Update Todo',
74
+ description: 'Update fields on a todo item (supports search and tag ops)',
75
+ inputSchema: UpdateTodoSchema,
76
+ outputSchema: DefaultOutputSchema,
77
+ annotations: {
78
+ readOnlyHint: false,
79
+ idempotentHint: true,
80
+ },
81
+ }, async (input) => {
82
+ try {
83
+ return await handleUpdateTodo(input);
84
+ }
85
+ catch (err) {
86
+ return createErrorResponse('E_UPDATE_TODO', getErrorMessage(err));
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=update_todo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_todo.js","sourceRoot":"","sources":["../../src/tools/update_todo.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@j0hanz/todokit-mcp",
3
+ "version": "1.0.1",
4
+ "mcpName": "io.github.j0hanz/todokit",
5
+ "description": "A MCP server for Todokit, a task management and productivity tool with JSON storage.",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": "./dist/index.js"
11
+ },
12
+ "sideEffects": false,
13
+ "bin": {
14
+ "todokit-mcp": "dist/index.js"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "clean": "node -e \"require('fs').rmSync('dist', {recursive: true, force: true})\"",
22
+ "build": "tsc",
23
+ "dev": "tsx watch src/index.ts",
24
+ "start": "node dist/index.js",
25
+ "test": "node --import tsx/esm --test tests/*.test.ts",
26
+ "test:coverage": "node --import tsx/esm --test --experimental-test-coverage tests/*.test.ts",
27
+ "lint": "eslint .",
28
+ "format": "prettier --write .",
29
+ "format:check": "prettier --check .",
30
+ "type-check": "tsc --noEmit",
31
+ "bench": "tsx benchmark/bench.ts",
32
+ "dup-check": "jscpd -c .jscpd.json src",
33
+ "inspector": "npx @modelcontextprotocol/inspector",
34
+ "prepublishOnly": "npm run lint && npm run type-check && npm run build"
35
+ },
36
+ "keywords": [
37
+ "mcp",
38
+ "model-context-protocol",
39
+ "todo",
40
+ "task-management",
41
+ "productivity",
42
+ "json-storage",
43
+ "todokit"
44
+ ],
45
+ "author": "j0hanz",
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/j0hanz/todokit-mcp-server.git"
50
+ },
51
+ "homepage": "https://github.com/j0hanz/todokit-mcp-server#readme",
52
+ "dependencies": {
53
+ "@modelcontextprotocol/sdk": "^1.25.1",
54
+ "zod": "^3.24.0"
55
+ },
56
+ "devDependencies": {
57
+ "@eslint/js": "^9.39.2",
58
+ "@trivago/prettier-plugin-sort-imports": "^6.0.0",
59
+ "@types/node": "^22.19.3",
60
+ "eslint": "^9.23.2",
61
+ "eslint-config-prettier": "^10.1.8",
62
+ "eslint-plugin-unused-imports": "^4.3.0",
63
+ "jscpd": "4.0.5",
64
+ "prettier": "^3.7.4",
65
+ "tsx": "^4.21.0",
66
+ "typescript": "^5.9.3",
67
+ "typescript-eslint": "^8.50.0"
68
+ },
69
+ "engines": {
70
+ "node": ">=20.0.0"
71
+ }
72
+ }