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.
@@ -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.markReviewed();
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 return {\n id: notif.id.primaryKey,\n kind: _notifKindMap[notif.kind] || \"unknown\",\n absoluteFireDate: notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null,\n relativeFireOffset: notif.relativeFireDate !== null ? notif.relativeFireDate : null,\n nextFireDate: notif.nextFireDate ? notif.nextFireDate.toISOString() : null,\n isSnoozed: notif.isSnoozed\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 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,mmBActC,CAAC"}
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: _notifKindMap[notif.kind] || "unknown",
175
- absoluteFireDate: notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null,
176
- relativeFireOffset: notif.relativeFireDate !== null ? notif.relativeFireDate : null,
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;;;;;;;;;;;;;;EAczC,CAAC"}
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. 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)"),
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,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"}
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.2",
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": {