omnifocus-mcp-server 1.0.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/config.d.ts +20 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +20 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +24 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/omnifocus/cache.d.ts +26 -0
  12. package/dist/omnifocus/cache.d.ts.map +1 -0
  13. package/dist/omnifocus/cache.js +68 -0
  14. package/dist/omnifocus/cache.js.map +1 -0
  15. package/dist/omnifocus/client.d.ts +84 -0
  16. package/dist/omnifocus/client.d.ts.map +1 -0
  17. package/dist/omnifocus/client.js +340 -0
  18. package/dist/omnifocus/client.js.map +1 -0
  19. package/dist/omnifocus/executor.d.ts +11 -0
  20. package/dist/omnifocus/executor.d.ts.map +1 -0
  21. package/dist/omnifocus/executor.js +62 -0
  22. package/dist/omnifocus/executor.js.map +1 -0
  23. package/dist/omnifocus/scripts/database.d.ts +6 -0
  24. package/dist/omnifocus/scripts/database.d.ts.map +1 -0
  25. package/dist/omnifocus/scripts/database.js +161 -0
  26. package/dist/omnifocus/scripts/database.js.map +1 -0
  27. package/dist/omnifocus/scripts/folders.d.ts +7 -0
  28. package/dist/omnifocus/scripts/folders.d.ts.map +1 -0
  29. package/dist/omnifocus/scripts/folders.js +73 -0
  30. package/dist/omnifocus/scripts/folders.js.map +1 -0
  31. package/dist/omnifocus/scripts/perspectives.d.ts +4 -0
  32. package/dist/omnifocus/scripts/perspectives.d.ts.map +1 -0
  33. package/dist/omnifocus/scripts/perspectives.js +62 -0
  34. package/dist/omnifocus/scripts/perspectives.js.map +1 -0
  35. package/dist/omnifocus/scripts/projects.d.ts +13 -0
  36. package/dist/omnifocus/scripts/projects.d.ts.map +1 -0
  37. package/dist/omnifocus/scripts/projects.js +235 -0
  38. package/dist/omnifocus/scripts/projects.js.map +1 -0
  39. package/dist/omnifocus/scripts/tags.d.ts +7 -0
  40. package/dist/omnifocus/scripts/tags.d.ts.map +1 -0
  41. package/dist/omnifocus/scripts/tags.js +91 -0
  42. package/dist/omnifocus/scripts/tags.js.map +1 -0
  43. package/dist/omnifocus/scripts/tasks.d.ts +23 -0
  44. package/dist/omnifocus/scripts/tasks.d.ts.map +1 -0
  45. package/dist/omnifocus/scripts/tasks.js +560 -0
  46. package/dist/omnifocus/scripts/tasks.js.map +1 -0
  47. package/dist/omnifocus/serializers.d.ts +16 -0
  48. package/dist/omnifocus/serializers.d.ts.map +1 -0
  49. package/dist/omnifocus/serializers.js +181 -0
  50. package/dist/omnifocus/serializers.js.map +1 -0
  51. package/dist/prompts.d.ts +3 -0
  52. package/dist/prompts.d.ts.map +1 -0
  53. package/dist/prompts.js +49 -0
  54. package/dist/prompts.js.map +1 -0
  55. package/dist/resources.d.ts +4 -0
  56. package/dist/resources.d.ts.map +1 -0
  57. package/dist/resources.js +48 -0
  58. package/dist/resources.js.map +1 -0
  59. package/dist/server.d.ts +7 -0
  60. package/dist/server.d.ts.map +1 -0
  61. package/dist/server.js +20 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/tools/database.d.ts +4 -0
  64. package/dist/tools/database.d.ts.map +1 -0
  65. package/dist/tools/database.js +60 -0
  66. package/dist/tools/database.js.map +1 -0
  67. package/dist/tools/folders.d.ts +4 -0
  68. package/dist/tools/folders.d.ts.map +1 -0
  69. package/dist/tools/folders.js +67 -0
  70. package/dist/tools/folders.js.map +1 -0
  71. package/dist/tools/index.d.ts +4 -0
  72. package/dist/tools/index.d.ts.map +1 -0
  73. package/dist/tools/index.js +15 -0
  74. package/dist/tools/index.js.map +1 -0
  75. package/dist/tools/perspectives.d.ts +4 -0
  76. package/dist/tools/perspectives.d.ts.map +1 -0
  77. package/dist/tools/perspectives.js +30 -0
  78. package/dist/tools/perspectives.js.map +1 -0
  79. package/dist/tools/projects.d.ts +4 -0
  80. package/dist/tools/projects.d.ts.map +1 -0
  81. package/dist/tools/projects.js +175 -0
  82. package/dist/tools/projects.js.map +1 -0
  83. package/dist/tools/tags.d.ts +4 -0
  84. package/dist/tools/tags.d.ts.map +1 -0
  85. package/dist/tools/tags.js +70 -0
  86. package/dist/tools/tags.js.map +1 -0
  87. package/dist/tools/tasks.d.ts +4 -0
  88. package/dist/tools/tasks.d.ts.map +1 -0
  89. package/dist/tools/tasks.js +356 -0
  90. package/dist/tools/tasks.js.map +1 -0
  91. package/dist/types/omnifocus.d.ts +313 -0
  92. package/dist/types/omnifocus.d.ts.map +1 -0
  93. package/dist/types/omnifocus.js +3 -0
  94. package/dist/types/omnifocus.js.map +1 -0
  95. package/dist/utils/dates.d.ts +23 -0
  96. package/dist/utils/dates.d.ts.map +1 -0
  97. package/dist/utils/dates.js +44 -0
  98. package/dist/utils/dates.js.map +1 -0
  99. package/dist/utils/errors.d.ts +25 -0
  100. package/dist/utils/errors.d.ts.map +1 -0
  101. package/dist/utils/errors.js +76 -0
  102. package/dist/utils/errors.js.map +1 -0
  103. package/dist/utils/logger.d.ts +7 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +30 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/package.json +53 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Shared OmniJS serialization functions as string templates.
3
+ * These are embedded directly in OmniJS scripts to convert OmniFocus objects to JSON.
4
+ *
5
+ * Maps are hoisted outside serializer functions to avoid re-allocation per call.
6
+ */
7
+ export const serializeTaskFn = `
8
+ var _taskMethodMap = {};
9
+ _taskMethodMap[Task.RepetitionMethod.Fixed] = "fixed";
10
+ _taskMethodMap[Task.RepetitionMethod.StartAfterCompletion] = "startAfterCompletion";
11
+ _taskMethodMap[Task.RepetitionMethod.DueAfterCompletion] = "dueAfterCompletion";
12
+
13
+ function serializeTask(task) {
14
+ var rr = null;
15
+ if (task.repetitionRule) {
16
+ rr = {
17
+ ruleString: task.repetitionRule.ruleString,
18
+ method: _taskMethodMap[task.repetitionRule.method] || "fixed"
19
+ };
20
+ }
21
+ var cp = task.containingProject;
22
+ return {
23
+ id: task.id.primaryKey,
24
+ name: task.name,
25
+ note: task.note,
26
+ url: "omnifocus:///task/" + task.id.primaryKey,
27
+ flagged: task.flagged,
28
+ completed: task.taskStatus === Task.Status.Completed,
29
+ dropped: task.taskStatus === Task.Status.Dropped,
30
+ deferDate: task.deferDate ? task.deferDate.toISOString() : null,
31
+ dueDate: task.dueDate ? task.dueDate.toISOString() : null,
32
+ completionDate: task.completionDate ? task.completionDate.toISOString() : null,
33
+ droppedDate: task.droppedDate ? task.droppedDate.toISOString() : null,
34
+ added: task.added ? task.added.toISOString() : null,
35
+ modified: task.modified ? task.modified.toISOString() : null,
36
+ effectiveDueDate: task.effectiveDueDate ? task.effectiveDueDate.toISOString() : null,
37
+ effectiveDeferDate: task.effectiveDeferDate ? task.effectiveDeferDate.toISOString() : null,
38
+ effectiveFlagged: task.effectiveFlagged,
39
+ estimatedMinutes: task.estimatedMinutes,
40
+ containingProjectId: cp ? cp.id.primaryKey : null,
41
+ containingProjectName: cp ? cp.name : null,
42
+ parentTaskId: task.parent ? (task.parent.id ? task.parent.id.primaryKey : null) : null,
43
+ tags: task.tags.map(function(t) { return { id: t.id.primaryKey, name: t.name }; }),
44
+ hasChildren: task.hasChildren,
45
+ sequential: task.sequential,
46
+ completedByChildren: task.completedByChildren,
47
+ inInbox: task.inInbox,
48
+ repetitionRule: rr
49
+ };
50
+ }`;
51
+ export const serializeTaskWithChildrenFn = `
52
+ function serializeTaskWithChildren(task, depth, maxDepth) {
53
+ var result = serializeTask(task);
54
+ result.children = [];
55
+ if (task.hasChildren && (maxDepth === 0 || depth < maxDepth)) {
56
+ var kids = task.children;
57
+ for (var i = 0; i < kids.length; i++) {
58
+ result.children.push(serializeTaskWithChildren(kids[i], depth + 1, maxDepth));
59
+ }
60
+ }
61
+ return result;
62
+ }`;
63
+ export const serializeProjectFn = `
64
+ var _projectStatusMap = {};
65
+ _projectStatusMap[Project.Status.Active] = "active";
66
+ _projectStatusMap[Project.Status.OnHold] = "onHold";
67
+ _projectStatusMap[Project.Status.Done] = "done";
68
+ _projectStatusMap[Project.Status.Dropped] = "dropped";
69
+
70
+ function serializeProject(project) {
71
+ var ri = null;
72
+ if (project.reviewInterval) {
73
+ ri = { steps: project.reviewInterval.steps, unit: project.reviewInterval.unit + "" };
74
+ }
75
+
76
+ var ft = project.flattenedTasks;
77
+ return {
78
+ id: project.id.primaryKey,
79
+ name: project.name,
80
+ note: project.note,
81
+ url: "omnifocus:///task/" + project.id.primaryKey,
82
+ status: _projectStatusMap[project.status] || "active",
83
+ flagged: project.flagged,
84
+ completed: project.status === Project.Status.Done,
85
+ deferDate: project.deferDate ? project.deferDate.toISOString() : null,
86
+ dueDate: project.dueDate ? project.dueDate.toISOString() : null,
87
+ completionDate: project.completionDate ? project.completionDate.toISOString() : null,
88
+ droppedDate: project.droppedDate ? project.droppedDate.toISOString() : null,
89
+ added: project.task.added ? project.task.added.toISOString() : null,
90
+ modified: project.task.modified ? project.task.modified.toISOString() : null,
91
+ estimatedMinutes: project.estimatedMinutes,
92
+ containingFolderId: project.parentFolder ? project.parentFolder.id.primaryKey : null,
93
+ containingFolderName: project.parentFolder ? project.parentFolder.name : null,
94
+ tags: project.task.tags.map(function(t) { return { id: t.id.primaryKey, name: t.name }; }),
95
+ sequential: project.sequential,
96
+ singleActionList: project.containsSingletonActions,
97
+ completedByChildren: project.completedByChildren,
98
+ taskCount: ft.length,
99
+ remainingTaskCount: ft.filter(function(t) { return t.taskStatus === Task.Status.Available || t.taskStatus === Task.Status.Blocked; }).length,
100
+ lastReviewDate: project.lastReviewDate ? project.lastReviewDate.toISOString() : null,
101
+ nextReviewDate: project.nextReviewDate ? project.nextReviewDate.toISOString() : null,
102
+ reviewInterval: ri
103
+ };
104
+ }`;
105
+ export const serializeFolderFn = `
106
+ function serializeFolder(folder) {
107
+ var statusVal = "active";
108
+ if (folder.status === Folder.Status.Dropped) statusVal = "dropped";
109
+ return {
110
+ id: folder.id.primaryKey,
111
+ name: folder.name,
112
+ url: "omnifocus:///folder/" + folder.id.primaryKey,
113
+ status: statusVal,
114
+ parentFolderId: folder.parent && folder.parent.constructor === Folder ? folder.parent.id.primaryKey : null,
115
+ childFolderIds: folder.folders.map(function(f) { return f.id.primaryKey; }),
116
+ projectIds: folder.projects.map(function(p) { return p.id.primaryKey; }),
117
+ projectCount: folder.flattenedProjects.length,
118
+ folderCount: folder.folders.length
119
+ };
120
+ }`;
121
+ export const serializeFolderWithChildrenFn = `
122
+ function serializeFolderWithChildren(folder, depth, maxDepth) {
123
+ var result = serializeFolder(folder);
124
+ result.childFolders = [];
125
+ result.projects = folder.projects.map(function(p) { return serializeProject(p); });
126
+ if (maxDepth === 0 || depth < maxDepth) {
127
+ result.childFolders = folder.folders.map(function(f) { return serializeFolderWithChildren(f, depth + 1, maxDepth); });
128
+ }
129
+ return result;
130
+ }`;
131
+ export const serializeTagFn = `
132
+ var _tagStatusMap = {};
133
+ _tagStatusMap[Tag.Status.Active] = "active";
134
+ _tagStatusMap[Tag.Status.OnHold] = "onHold";
135
+ _tagStatusMap[Tag.Status.Dropped] = "dropped";
136
+
137
+ function serializeTag(tag) {
138
+ return {
139
+ id: tag.id.primaryKey,
140
+ name: tag.name,
141
+ url: "omnifocus:///tag/" + tag.id.primaryKey,
142
+ status: _tagStatusMap[tag.status] || "active",
143
+ parentTagId: tag.parent && tag.parent.constructor === Tag ? tag.parent.id.primaryKey : null,
144
+ childTagIds: tag.children.map(function(c) { return c.id.primaryKey; }),
145
+ allowsNextAction: tag.allowsNextAction,
146
+ availableTaskCount: tag.availableTasks.length,
147
+ remainingTaskCount: tag.remainingTasks.length
148
+ };
149
+ }`;
150
+ export const serializeTagWithChildrenFn = `
151
+ function serializeTagWithChildren(tag, depth, maxDepth) {
152
+ var result = serializeTag(tag);
153
+ result.childTags = [];
154
+ if (maxDepth === 0 || depth < maxDepth) {
155
+ result.childTags = tag.children.map(function(c) { return serializeTagWithChildren(c, depth + 1, maxDepth); });
156
+ }
157
+ return result;
158
+ }`;
159
+ export const serializePerspectiveFn = `
160
+ function serializePerspective(perspective) {
161
+ return {
162
+ id: perspective.id.primaryKey,
163
+ name: perspective.name
164
+ };
165
+ }`;
166
+ export const serializeTaskNotificationFn = `
167
+ var _notifKindMap = {};
168
+ _notifKindMap[Task.Notification.Kind.DueRelative] = "dueRelative";
169
+ _notifKindMap[Task.Notification.Kind.Absolute] = "absolute";
170
+
171
+ function serializeTaskNotification(notif) {
172
+ return {
173
+ id: notif.id.primaryKey,
174
+ kind: _notifKindMap[notif.kind] || "unknown",
175
+ absoluteFireDate: notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null,
176
+ relativeFireOffset: notif.relativeFireDate !== null ? notif.relativeFireDate : null,
177
+ nextFireDate: notif.nextFireDate ? notif.nextFireDate.toISOString() : null,
178
+ isSnoozed: notif.isSnoozed
179
+ };
180
+ }`;
181
+ //# sourceMappingURL=serializers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializers.js","sourceRoot":"","sources":["../../src/omnifocus/serializers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2C7B,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;EAWzC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyChC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;EAe/B,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;EAS3C,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;EAkB5B,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;EAQxC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;EAMpC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;EAczC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPrompts(server: McpServer): void;
3
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6DvD"}
@@ -0,0 +1,49 @@
1
+ export function registerPrompts(server) {
2
+ server.prompt("weekly-review", "Guided weekly review of OmniFocus projects and tasks", async () => ({
3
+ messages: [{
4
+ role: "user",
5
+ content: {
6
+ type: "text",
7
+ text: `Perform a weekly review of my OmniFocus system:
8
+ 1. First call get_review_queue to see projects due for review
9
+ 2. For each project, call get_project_tasks to check progress
10
+ 3. Call get_inbox_tasks to process any unprocessed items
11
+ 4. Call get_flagged_tasks to review priorities
12
+ 5. Summarize: projects reviewed, inbox items processed, flagged items status
13
+ 6. Mark reviewed projects with mark_reviewed
14
+ Provide a structured summary when done.`,
15
+ },
16
+ }],
17
+ }));
18
+ server.prompt("inbox-processing", "Process OmniFocus inbox using GTD methodology", async () => ({
19
+ messages: [{
20
+ role: "user",
21
+ content: {
22
+ type: "text",
23
+ text: `Process my OmniFocus inbox using GTD:
24
+ 1. Call get_inbox_tasks to see all inbox items
25
+ 2. For each item, help me decide: is it actionable?
26
+ - If not actionable: delete or convert to reference
27
+ - If actionable and <2 min: suggest completing it now
28
+ - If actionable: suggest a project, tags, due/defer dates
29
+ 3. Use move_tasks, update_task, set_task_tags to organize items
30
+ 4. Summarize what was processed`,
31
+ },
32
+ }],
33
+ }));
34
+ server.prompt("daily-planning", "Plan today's tasks using OmniFocus data", async () => ({
35
+ messages: [{
36
+ role: "user",
37
+ content: {
38
+ type: "text",
39
+ text: `Help me plan my day:
40
+ 1. Call get_database_summary for an overview
41
+ 2. Call list_tasks with dueBefore set to end of today to find due tasks
42
+ 3. Call get_flagged_tasks to see priorities
43
+ 4. Call get_today_completed_tasks to see what's already done
44
+ 5. Suggest a prioritized plan for the day based on due dates, flags, and estimated time`,
45
+ },
46
+ }],
47
+ }));
48
+ }
49
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,MAAM,CACX,eAAe,EACf,sDAAsD,EACtD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;wCAOwB;iBAC/B;aACF,CAAC;KACH,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,kBAAkB,EAClB,+CAA+C,EAC/C,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;;;gCAOgB;iBACvB;aACF,CAAC;KACH,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,gBAAgB,EAChB,yCAAyC,EACzC,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;;wFAKwE;iBAC/E;aACF,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "./omnifocus/client.js";
3
+ export declare function registerResources(server: McpServer, client: OmniFocusClient): void;
4
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAsDlF"}
@@ -0,0 +1,48 @@
1
+ import { formatMcpError } from "./utils/errors.js";
2
+ export function registerResources(server, client) {
3
+ server.resource("database-summary", "omnifocus://database/summary", { description: "OmniFocus database summary with counts", mimeType: "application/json" }, async () => {
4
+ try {
5
+ const summary = await client.getDatabaseSummary();
6
+ return {
7
+ contents: [{
8
+ uri: "omnifocus://database/summary",
9
+ mimeType: "application/json",
10
+ text: JSON.stringify(summary, null, 2),
11
+ }],
12
+ };
13
+ }
14
+ catch (error) {
15
+ const { message } = formatMcpError(error);
16
+ return {
17
+ contents: [{
18
+ uri: "omnifocus://database/summary",
19
+ mimeType: "application/json",
20
+ text: JSON.stringify({ error: message }),
21
+ }],
22
+ };
23
+ }
24
+ });
25
+ server.resource("perspectives", "omnifocus://perspectives", { description: "List of all OmniFocus perspectives", mimeType: "application/json" }, async () => {
26
+ try {
27
+ const perspectives = await client.listPerspectives();
28
+ return {
29
+ contents: [{
30
+ uri: "omnifocus://perspectives",
31
+ mimeType: "application/json",
32
+ text: JSON.stringify(perspectives, null, 2),
33
+ }],
34
+ };
35
+ }
36
+ catch (error) {
37
+ const { message } = formatMcpError(error);
38
+ return {
39
+ contents: [{
40
+ uri: "omnifocus://perspectives",
41
+ mimeType: "application/json",
42
+ text: JSON.stringify({ error: message }),
43
+ }],
44
+ };
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAuB;IAC1E,MAAM,CAAC,QAAQ,CACb,kBAAkB,EAClB,8BAA8B,EAC9B,EAAE,WAAW,EAAE,wCAAwC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACvF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAClD,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,8BAA8B;wBACnC,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,8BAA8B;wBACnC,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;qBACzC,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,cAAc,EACd,0BAA0B,EAC1B,EAAE,WAAW,EAAE,oCAAoC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACnF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACrD,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,0BAA0B;wBAC/B,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC5C,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,0BAA0B;wBAC/B,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;qBACzC,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "./omnifocus/client.js";
3
+ export declare function createServer(): {
4
+ server: McpServer;
5
+ client: OmniFocusClient;
6
+ };
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,wBAAgB,YAAY,IAAI;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAY7E"}
package/dist/server.js ADDED
@@ -0,0 +1,20 @@
1
+ import { createRequire } from "node:module";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { OmniFocusClient } from "./omnifocus/client.js";
4
+ import { registerAllTools } from "./tools/index.js";
5
+ import { registerResources } from "./resources.js";
6
+ import { registerPrompts } from "./prompts.js";
7
+ const require = createRequire(import.meta.url);
8
+ const { version } = require("../package.json");
9
+ export function createServer() {
10
+ const server = new McpServer({
11
+ name: "omnifocus-mcp-server",
12
+ version,
13
+ });
14
+ const client = new OmniFocusClient();
15
+ registerAllTools(server, client);
16
+ registerResources(server, client);
17
+ registerPrompts(server);
18
+ return { server, client };
19
+ }
20
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "../omnifocus/client.js";
3
+ export declare function registerDatabaseTools(server: McpServer, client: OmniFocusClient): void;
4
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/tools/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA2EtF"}
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ import { formatMcpError } from "../utils/errors.js";
3
+ export function registerDatabaseTools(server, client) {
4
+ server.tool("get_database_summary", "Get a summary of the OmniFocus database including counts of inbox items, projects, tags, folders, available/due-soon/overdue/flagged tasks", {}, async () => {
5
+ try {
6
+ const summary = await client.getDatabaseSummary();
7
+ return {
8
+ content: [{ type: "text", text: JSON.stringify(summary, null, 2) }],
9
+ };
10
+ }
11
+ catch (error) {
12
+ const { message } = formatMcpError(error);
13
+ return { content: [{ type: "text", text: message }], isError: true };
14
+ }
15
+ });
16
+ server.tool("search", "Search across all OmniFocus items (tasks, projects, folders, tags) by name or note content", {
17
+ query: z.string().min(1).describe("Search query string"),
18
+ limit: z.number().min(1).max(200).optional().describe("Maximum number of results (default 50)"),
19
+ }, async ({ query, limit }) => {
20
+ try {
21
+ const results = await client.search(query, limit);
22
+ return {
23
+ content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
24
+ };
25
+ }
26
+ catch (error) {
27
+ const { message } = formatMcpError(error);
28
+ return { content: [{ type: "text", text: message }], isError: true };
29
+ }
30
+ });
31
+ server.tool("dump_database", "Dump the entire OmniFocus database including inbox, projects, folders, tags, and perspectives in a single call. Essential for getting full context.", {
32
+ includeCompleted: z.boolean().optional().describe("Include completed/dropped items (default false)"),
33
+ maxDepth: z.number().min(0).optional().describe("Max depth for subtask hierarchy (0 = unlimited, default 0)"),
34
+ hideRecurringDuplicates: z.boolean().optional().describe("Hide future instances of recurring tasks (default false)"),
35
+ }, async (args) => {
36
+ try {
37
+ const dump = await client.dumpDatabase(args);
38
+ return {
39
+ content: [{ type: "text", text: JSON.stringify(dump, null, 2) }],
40
+ };
41
+ }
42
+ catch (error) {
43
+ const { message } = formatMcpError(error);
44
+ return { content: [{ type: "text", text: message }], isError: true };
45
+ }
46
+ });
47
+ server.tool("save_database", "Explicitly save the OmniFocus database to disk", {}, async () => {
48
+ try {
49
+ const result = await client.saveDatabase();
50
+ return {
51
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
52
+ };
53
+ }
54
+ catch (error) {
55
+ const { message } = formatMcpError(error);
56
+ return { content: [{ type: "text", text: message }], isError: true };
57
+ }
58
+ });
59
+ }
60
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/tools/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "../omnifocus/client.js";
3
+ export declare function registerFolderTools(server: McpServer, client: OmniFocusClient): void;
4
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/tools/folders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAuFpF"}
@@ -0,0 +1,67 @@
1
+ import { z } from "zod";
2
+ import { formatMcpError } from "../utils/errors.js";
3
+ export function registerFolderTools(server, client) {
4
+ server.tool("list_folders", "List all folders in OmniFocus", {}, async () => {
5
+ try {
6
+ const folders = await client.listFolders();
7
+ return { content: [{ type: "text", text: JSON.stringify(folders, null, 2) }] };
8
+ }
9
+ catch (error) {
10
+ const { message } = formatMcpError(error);
11
+ return { content: [{ type: "text", text: message }], isError: true };
12
+ }
13
+ });
14
+ server.tool("get_folder", "Get detailed information about a folder including its child folders and projects", {
15
+ id: z.string().describe("The folder ID"),
16
+ }, async ({ id }) => {
17
+ try {
18
+ const folder = await client.getFolder(id);
19
+ return { content: [{ type: "text", text: JSON.stringify(folder, null, 2) }] };
20
+ }
21
+ catch (error) {
22
+ const { message } = formatMcpError(error);
23
+ return { content: [{ type: "text", text: message }], isError: true };
24
+ }
25
+ });
26
+ server.tool("create_folder", "Create a new folder in OmniFocus", {
27
+ name: z.string().describe("Folder name"),
28
+ parentFolderId: z.string().optional().describe("Parent folder ID for nesting"),
29
+ parentFolderName: z.string().optional().describe("Parent folder name for nesting"),
30
+ }, async (args) => {
31
+ try {
32
+ const folder = await client.createFolder(args);
33
+ return { content: [{ type: "text", text: JSON.stringify(folder, null, 2) }] };
34
+ }
35
+ catch (error) {
36
+ const { message } = formatMcpError(error);
37
+ return { content: [{ type: "text", text: message }], isError: true };
38
+ }
39
+ });
40
+ server.tool("update_folder", "Update a folder's properties", {
41
+ id: z.string().describe("The folder ID"),
42
+ name: z.string().optional().describe("New folder name"),
43
+ status: z.enum(["active", "dropped"]).optional().describe("New folder status"),
44
+ }, async (args) => {
45
+ try {
46
+ const folder = await client.updateFolder(args);
47
+ return { content: [{ type: "text", text: JSON.stringify(folder, null, 2) }] };
48
+ }
49
+ catch (error) {
50
+ const { message } = formatMcpError(error);
51
+ return { content: [{ type: "text", text: message }], isError: true };
52
+ }
53
+ });
54
+ server.tool("delete_folder", "Permanently delete a folder from OmniFocus", {
55
+ id: z.string().describe("The folder ID to delete"),
56
+ }, async ({ id }) => {
57
+ try {
58
+ const result = await client.deleteFolder(id);
59
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
60
+ }
61
+ catch (error) {
62
+ const { message } = formatMcpError(error);
63
+ return { content: [{ type: "text", text: message }], isError: true };
64
+ }
65
+ });
66
+ }
67
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/tools/folders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "../omnifocus/client.js";
3
+ export declare function registerAllTools(server: McpServer, client: OmniFocusClient): void;
4
+ //# 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,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAOjF"}
@@ -0,0 +1,15 @@
1
+ import { registerDatabaseTools } from "./database.js";
2
+ import { registerTaskTools } from "./tasks.js";
3
+ import { registerProjectTools } from "./projects.js";
4
+ import { registerFolderTools } from "./folders.js";
5
+ import { registerTagTools } from "./tags.js";
6
+ import { registerPerspectiveTools } from "./perspectives.js";
7
+ export function registerAllTools(server, client) {
8
+ registerDatabaseTools(server, client);
9
+ registerTaskTools(server, client);
10
+ registerProjectTools(server, client);
11
+ registerFolderTools(server, client);
12
+ registerTagTools(server, client);
13
+ registerPerspectiveTools(server, client);
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,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAuB;IACzE,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "../omnifocus/client.js";
3
+ export declare function registerPerspectiveTools(server: McpServer, client: OmniFocusClient): void;
4
+ //# sourceMappingURL=perspectives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perspectives.d.ts","sourceRoot":"","sources":["../../src/tools/perspectives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAmCzF"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { formatMcpError } from "../utils/errors.js";
3
+ export function registerPerspectiveTools(server, client) {
4
+ server.tool("list_perspectives", "List perspectives in OmniFocus. By default lists custom perspectives; use filters to include/exclude built-in ones.", {
5
+ includeBuiltIn: z.boolean().optional().describe("Include built-in perspectives (default true)"),
6
+ includeCustom: z.boolean().optional().describe("Include custom perspectives (default true)"),
7
+ }, async (args) => {
8
+ try {
9
+ const perspectives = await client.listPerspectives(args);
10
+ return { content: [{ type: "text", text: JSON.stringify(perspectives, null, 2) }] };
11
+ }
12
+ catch (error) {
13
+ const { message } = formatMcpError(error);
14
+ return { content: [{ type: "text", text: message }], isError: true };
15
+ }
16
+ });
17
+ server.tool("get_perspective_tasks", "Get tasks shown in a specific perspective", {
18
+ name: z.string().describe("The perspective name"),
19
+ }, async ({ name }) => {
20
+ try {
21
+ const tasks = await client.getPerspectiveTasks(name);
22
+ return { content: [{ type: "text", text: JSON.stringify(tasks, null, 2) }] };
23
+ }
24
+ catch (error) {
25
+ const { message } = formatMcpError(error);
26
+ return { content: [{ type: "text", text: message }], isError: true };
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=perspectives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perspectives.js","sourceRoot":"","sources":["../../src/tools/perspectives.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAuB;IACjF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,qHAAqH,EACrH;QACE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAC/F,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KAC7F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,2CAA2C,EAC3C;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAClD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OmniFocusClient } from "../omnifocus/client.js";
3
+ export declare function registerProjectTools(server: McpServer, client: OmniFocusClient): void;
4
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAiOrF"}