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.
- package/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/omnifocus/cache.d.ts +26 -0
- package/dist/omnifocus/cache.d.ts.map +1 -0
- package/dist/omnifocus/cache.js +68 -0
- package/dist/omnifocus/cache.js.map +1 -0
- package/dist/omnifocus/client.d.ts +84 -0
- package/dist/omnifocus/client.d.ts.map +1 -0
- package/dist/omnifocus/client.js +340 -0
- package/dist/omnifocus/client.js.map +1 -0
- package/dist/omnifocus/executor.d.ts +11 -0
- package/dist/omnifocus/executor.d.ts.map +1 -0
- package/dist/omnifocus/executor.js +62 -0
- package/dist/omnifocus/executor.js.map +1 -0
- package/dist/omnifocus/scripts/database.d.ts +6 -0
- package/dist/omnifocus/scripts/database.d.ts.map +1 -0
- package/dist/omnifocus/scripts/database.js +161 -0
- package/dist/omnifocus/scripts/database.js.map +1 -0
- package/dist/omnifocus/scripts/folders.d.ts +7 -0
- package/dist/omnifocus/scripts/folders.d.ts.map +1 -0
- package/dist/omnifocus/scripts/folders.js +73 -0
- package/dist/omnifocus/scripts/folders.js.map +1 -0
- package/dist/omnifocus/scripts/perspectives.d.ts +4 -0
- package/dist/omnifocus/scripts/perspectives.d.ts.map +1 -0
- package/dist/omnifocus/scripts/perspectives.js +62 -0
- package/dist/omnifocus/scripts/perspectives.js.map +1 -0
- package/dist/omnifocus/scripts/projects.d.ts +13 -0
- package/dist/omnifocus/scripts/projects.d.ts.map +1 -0
- package/dist/omnifocus/scripts/projects.js +235 -0
- package/dist/omnifocus/scripts/projects.js.map +1 -0
- package/dist/omnifocus/scripts/tags.d.ts +7 -0
- package/dist/omnifocus/scripts/tags.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tags.js +91 -0
- package/dist/omnifocus/scripts/tags.js.map +1 -0
- package/dist/omnifocus/scripts/tasks.d.ts +23 -0
- package/dist/omnifocus/scripts/tasks.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tasks.js +560 -0
- package/dist/omnifocus/scripts/tasks.js.map +1 -0
- package/dist/omnifocus/serializers.d.ts +16 -0
- package/dist/omnifocus/serializers.d.ts.map +1 -0
- package/dist/omnifocus/serializers.js +181 -0
- package/dist/omnifocus/serializers.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +49 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +4 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +48 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/database.d.ts +4 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +60 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/folders.d.ts +4 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +67 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/perspectives.d.ts +4 -0
- package/dist/tools/perspectives.d.ts.map +1 -0
- package/dist/tools/perspectives.js +30 -0
- package/dist/tools/perspectives.js.map +1 -0
- package/dist/tools/projects.d.ts +4 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +175 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/tags.d.ts +4 -0
- package/dist/tools/tags.d.ts.map +1 -0
- package/dist/tools/tags.js +70 -0
- package/dist/tools/tags.js.map +1 -0
- package/dist/tools/tasks.d.ts +4 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +356 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types/omnifocus.d.ts +313 -0
- package/dist/types/omnifocus.d.ts.map +1 -0
- package/dist/types/omnifocus.js +3 -0
- package/dist/types/omnifocus.js.map +1 -0
- package/dist/utils/dates.d.ts +23 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +44 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +76 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +30 -0
- package/dist/utils/logger.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/prompts.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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 @@
|
|
|
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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAuB;IAC9E,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,4IAA4I,EAC5I,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAClD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,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,QAAQ,EACR,4FAA4F,EAC5F;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KAChG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7E,CAAC;QACJ,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,eAAe,EACf,qJAAqJ,EACrJ;QACE,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QACpG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QAC7G,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;KACrH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC1E,CAAC;QACJ,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,eAAe,EACf,gDAAgD,EAChD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;QACJ,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|