omnifocus-mcp-server 1.0.2 → 1.0.3
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/dist/omnifocus/scripts/projects.js +1 -1
- package/dist/omnifocus/serializers.d.ts +1 -1
- package/dist/omnifocus/serializers.d.ts.map +1 -1
- package/dist/omnifocus/serializers.js +11 -3
- package/dist/omnifocus/serializers.js.map +1 -1
- package/dist/tools/perspectives.js +3 -3
- package/dist/tools/perspectives.js.map +1 -1
- package/package.json +2 -1
|
@@ -211,7 +211,7 @@ export function buildMarkReviewedScript(id) {
|
|
|
211
211
|
|
|
212
212
|
var project = byId(flattenedProjects, args.id);
|
|
213
213
|
if (!project) throw new Error("Project not found: " + args.id);
|
|
214
|
-
project.
|
|
214
|
+
project.lastReviewDate = new Date();
|
|
215
215
|
return JSON.stringify(serializeProject(project));
|
|
216
216
|
})()`;
|
|
217
217
|
}
|
|
@@ -12,5 +12,5 @@ export declare const serializeFolderWithChildrenFn = "\nfunction serializeFolder
|
|
|
12
12
|
export declare const serializeTagFn = "\nvar _tagStatusMap = {};\n_tagStatusMap[Tag.Status.Active] = \"active\";\n_tagStatusMap[Tag.Status.OnHold] = \"onHold\";\n_tagStatusMap[Tag.Status.Dropped] = \"dropped\";\n\nfunction serializeTag(tag) {\n return {\n id: tag.id.primaryKey,\n name: tag.name,\n url: \"omnifocus:///tag/\" + tag.id.primaryKey,\n status: _tagStatusMap[tag.status] || \"active\",\n parentTagId: tag.parent && tag.parent.constructor === Tag ? tag.parent.id.primaryKey : null,\n childTagIds: tag.children.map(function(c) { return c.id.primaryKey; }),\n allowsNextAction: tag.allowsNextAction,\n availableTaskCount: tag.availableTasks.length,\n remainingTaskCount: tag.remainingTasks.length\n };\n}";
|
|
13
13
|
export declare const serializeTagWithChildrenFn = "\nfunction serializeTagWithChildren(tag, depth, maxDepth) {\n var result = serializeTag(tag);\n result.childTags = [];\n if (maxDepth === 0 || depth < maxDepth) {\n result.childTags = tag.children.map(function(c) { return serializeTagWithChildren(c, depth + 1, maxDepth); });\n }\n return result;\n}";
|
|
14
14
|
export declare const serializePerspectiveFn = "\nfunction serializePerspective(perspective) {\n return {\n id: perspective.id.primaryKey,\n name: perspective.name\n };\n}";
|
|
15
|
-
export declare const serializeTaskNotificationFn = "\nvar _notifKindMap = {};\n_notifKindMap[Task.Notification.Kind.DueRelative] = \"dueRelative\";\n_notifKindMap[Task.Notification.Kind.Absolute] = \"absolute\";\n\nfunction serializeTaskNotification(notif) {\n
|
|
15
|
+
export declare const serializeTaskNotificationFn = "\nvar _notifKindMap = {};\n_notifKindMap[Task.Notification.Kind.DueRelative] = \"dueRelative\";\n_notifKindMap[Task.Notification.Kind.Absolute] = \"absolute\";\n\nfunction serializeTaskNotification(notif) {\n var kind = _notifKindMap[notif.kind] || \"unknown\";\n var absDate = null;\n var relOffset = null;\n if (kind === \"absolute\") {\n try { absDate = notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null; } catch(e) {}\n } else if (kind === \"dueRelative\") {\n try { relOffset = notif.relativeFireDate !== null ? notif.relativeFireDate : null; } catch(e) {}\n }\n return {\n id: notif.id.primaryKey,\n kind: kind,\n absoluteFireDate: absDate,\n relativeFireOffset: relOffset,\n nextFireDate: notif.nextFireDate ? notif.nextFireDate.toISOString() : null,\n isSnoozed: notif.isSnoozed\n };\n}";
|
|
16
16
|
//# sourceMappingURL=serializers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializers.d.ts","sourceRoot":"","sources":["../../src/omnifocus/serializers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,07DA2C1B,CAAC;AAEH,eAAO,MAAM,2BAA2B,sYAWtC,CAAC;AAEH,eAAO,MAAM,kBAAkB,ukEAyC7B,CAAC;AAEH,eAAO,MAAM,iBAAiB,8pBAe5B,CAAC;AAEH,eAAO,MAAM,6BAA6B,saASxC,CAAC;AAEH,eAAO,MAAM,cAAc,osBAkBzB,CAAC;AAEH,eAAO,MAAM,0BAA0B,wTAQrC,CAAC;AAEH,eAAO,MAAM,sBAAsB,wIAMjC,CAAC;AAEH,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"serializers.d.ts","sourceRoot":"","sources":["../../src/omnifocus/serializers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,07DA2C1B,CAAC;AAEH,eAAO,MAAM,2BAA2B,sYAWtC,CAAC;AAEH,eAAO,MAAM,kBAAkB,ukEAyC7B,CAAC;AAEH,eAAO,MAAM,iBAAiB,8pBAe5B,CAAC;AAEH,eAAO,MAAM,6BAA6B,saASxC,CAAC;AAEH,eAAO,MAAM,cAAc,osBAkBzB,CAAC;AAEH,eAAO,MAAM,0BAA0B,wTAQrC,CAAC;AAEH,eAAO,MAAM,sBAAsB,wIAMjC,CAAC;AAEH,eAAO,MAAM,2BAA2B,k1BAsBtC,CAAC"}
|
|
@@ -169,11 +169,19 @@ _notifKindMap[Task.Notification.Kind.DueRelative] = "dueRelative";
|
|
|
169
169
|
_notifKindMap[Task.Notification.Kind.Absolute] = "absolute";
|
|
170
170
|
|
|
171
171
|
function serializeTaskNotification(notif) {
|
|
172
|
+
var kind = _notifKindMap[notif.kind] || "unknown";
|
|
173
|
+
var absDate = null;
|
|
174
|
+
var relOffset = null;
|
|
175
|
+
if (kind === "absolute") {
|
|
176
|
+
try { absDate = notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null; } catch(e) {}
|
|
177
|
+
} else if (kind === "dueRelative") {
|
|
178
|
+
try { relOffset = notif.relativeFireDate !== null ? notif.relativeFireDate : null; } catch(e) {}
|
|
179
|
+
}
|
|
172
180
|
return {
|
|
173
181
|
id: notif.id.primaryKey,
|
|
174
|
-
kind:
|
|
175
|
-
absoluteFireDate:
|
|
176
|
-
relativeFireOffset:
|
|
182
|
+
kind: kind,
|
|
183
|
+
absoluteFireDate: absDate,
|
|
184
|
+
relativeFireOffset: relOffset,
|
|
177
185
|
nextFireDate: notif.nextFireDate ? notif.nextFireDate.toISOString() : null,
|
|
178
186
|
isSnoozed: notif.isSnoozed
|
|
179
187
|
};
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;;;;;;;EAsBzC,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { formatMcpError } from "../utils/errors.js";
|
|
3
3
|
export function registerPerspectiveTools(server, client) {
|
|
4
|
-
server.tool("list_perspectives", "List perspectives in OmniFocus.
|
|
5
|
-
includeBuiltIn: z.boolean().optional().describe("Include built-in
|
|
4
|
+
server.tool("list_perspectives", "List perspectives in OmniFocus. Only custom perspectives are available; built-in perspectives (Inbox, Projects, Tags, Forecast, Flagged, Review, Nearby) cannot be accessed via the API. Use dedicated tools instead (e.g. get_inbox_tasks, get_flagged_tasks, get_review_queue, list_projects, list_tags, or list_tasks with date filters for Forecast).", {
|
|
5
|
+
includeBuiltIn: z.boolean().optional().describe("Include custom perspectives whose names match built-in perspective names (default true). Note: actual built-in perspectives are not available via the API."),
|
|
6
6
|
includeCustom: z.boolean().optional().describe("Include custom perspectives (default true)"),
|
|
7
7
|
}, async (args) => {
|
|
8
8
|
try {
|
|
@@ -14,7 +14,7 @@ export function registerPerspectiveTools(server, client) {
|
|
|
14
14
|
return { content: [{ type: "text", text: message }], isError: true };
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
|
-
server.tool("get_perspective_tasks", "Get tasks shown in a specific perspective", {
|
|
17
|
+
server.tool("get_perspective_tasks", "Get tasks shown in a specific custom perspective. Built-in perspectives (Inbox, Forecast, etc.) are not supported — use dedicated tools instead.", {
|
|
18
18
|
name: z.string().describe("The perspective name"),
|
|
19
19
|
}, async ({ name }) => {
|
|
20
20
|
try {
|
|
@@ -1 +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,
|
|
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,2VAA2V,EAC3V;QACE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4JAA4J,CAAC;QAC7M,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,kJAAkJ,EAClJ;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnifocus-mcp-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "MCP server for OmniFocus via Omni Automation API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"test": "vitest run",
|
|
19
19
|
"test:watch": "vitest",
|
|
20
20
|
"test:integration": "OMNIFOCUS_LIVE=1 vitest run tests/integration",
|
|
21
|
+
"test:smoke": "node scripts/smoke-test.mjs",
|
|
21
22
|
"lint": "tsc --noEmit"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|