omnifocus_mcp 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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/AGENTS.md +15 -0
  3. data/CHANGELOG.md +7 -0
  4. data/CODE_OF_CONDUCT.md +16 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +147 -0
  7. data/Rakefile +12 -0
  8. data/bin/omnifocus-mcp +7 -0
  9. data/lib/omnifocus_mcp/config.rb +18 -0
  10. data/lib/omnifocus_mcp/infrastructure/.keep +1 -0
  11. data/lib/omnifocus_mcp/infrastructure/apple_script.rb +263 -0
  12. data/lib/omnifocus_mcp/infrastructure/apple_script_date_builder.rb +65 -0
  13. data/lib/omnifocus_mcp/infrastructure/js_embed.rb +39 -0
  14. data/lib/omnifocus_mcp/infrastructure/script_runner.rb +254 -0
  15. data/lib/omnifocus_mcp/infrastructure.rb +6 -0
  16. data/lib/omnifocus_mcp/json_rpc_compat.rb +75 -0
  17. data/lib/omnifocus_mcp/logger.rb +34 -0
  18. data/lib/omnifocus_mcp/mcp.rb +74 -0
  19. data/lib/omnifocus_mcp/parsers/.keep +1 -0
  20. data/lib/omnifocus_mcp/parsers/apple_script_envelope.rb +44 -0
  21. data/lib/omnifocus_mcp/parsers.rb +6 -0
  22. data/lib/omnifocus_mcp/resources/base.rb +87 -0
  23. data/lib/omnifocus_mcp/resources/flagged_resource.rb +31 -0
  24. data/lib/omnifocus_mcp/resources/inbox_resource.rb +31 -0
  25. data/lib/omnifocus_mcp/resources/perspective_resource.rb +28 -0
  26. data/lib/omnifocus_mcp/resources/project_resource.rb +37 -0
  27. data/lib/omnifocus_mcp/resources/stats_resource.rb +22 -0
  28. data/lib/omnifocus_mcp/resources/today_resource.rb +37 -0
  29. data/lib/omnifocus_mcp/result.rb +108 -0
  30. data/lib/omnifocus_mcp/tools/batch_report.rb +9 -0
  31. data/lib/omnifocus_mcp/tools/database_stats.rb +184 -0
  32. data/lib/omnifocus_mcp/tools/definitions/add_omnifocus_task_tool.rb +61 -0
  33. data/lib/omnifocus_mcp/tools/definitions/add_project_tool.rb +54 -0
  34. data/lib/omnifocus_mcp/tools/definitions/batch_add_items_tool.rb +105 -0
  35. data/lib/omnifocus_mcp/tools/definitions/batch_remove_items_tool.rb +68 -0
  36. data/lib/omnifocus_mcp/tools/definitions/date_formatter.rb +45 -0
  37. data/lib/omnifocus_mcp/tools/definitions/edit_item_tool.rb +87 -0
  38. data/lib/omnifocus_mcp/tools/definitions/get_perspective_view_tool.rb +57 -0
  39. data/lib/omnifocus_mcp/tools/definitions/key_normalizer.rb +30 -0
  40. data/lib/omnifocus_mcp/tools/definitions/list_perspectives_tool.rb +47 -0
  41. data/lib/omnifocus_mcp/tools/definitions/list_tags_tool.rb +42 -0
  42. data/lib/omnifocus_mcp/tools/definitions/mcp_envelope.rb +31 -0
  43. data/lib/omnifocus_mcp/tools/definitions/operation_factory.rb +33 -0
  44. data/lib/omnifocus_mcp/tools/definitions/query_omnifocus_tool.rb +187 -0
  45. data/lib/omnifocus_mcp/tools/definitions/remove_item_tool.rb +55 -0
  46. data/lib/omnifocus_mcp/tools/generators/.keep +1 -0
  47. data/lib/omnifocus_mcp/tools/generators/add_omnifocus_task.rb +348 -0
  48. data/lib/omnifocus_mcp/tools/generators/add_project.rb +141 -0
  49. data/lib/omnifocus_mcp/tools/generators/database_stats.rb +16 -0
  50. data/lib/omnifocus_mcp/tools/generators/edit_item.rb +455 -0
  51. data/lib/omnifocus_mcp/tools/generators/list_perspectives.rb +13 -0
  52. data/lib/omnifocus_mcp/tools/generators/list_tags.rb +13 -0
  53. data/lib/omnifocus_mcp/tools/generators/perspective_view.rb +17 -0
  54. data/lib/omnifocus_mcp/tools/generators/query_omnifocus.rb +571 -0
  55. data/lib/omnifocus_mcp/tools/generators/query_omnifocus_debug.rb +169 -0
  56. data/lib/omnifocus_mcp/tools/generators/remove_item.rb +61 -0
  57. data/lib/omnifocus_mcp/tools/generators.rb +8 -0
  58. data/lib/omnifocus_mcp/tools/messages/add_omnifocus_task.rb +53 -0
  59. data/lib/omnifocus_mcp/tools/messages/add_project.rb +28 -0
  60. data/lib/omnifocus_mcp/tools/messages/batch_remove_items.rb +13 -0
  61. data/lib/omnifocus_mcp/tools/messages/edit_item.rb +39 -0
  62. data/lib/omnifocus_mcp/tools/messages/list_tools.rb +15 -0
  63. data/lib/omnifocus_mcp/tools/messages/remove_item.rb +42 -0
  64. data/lib/omnifocus_mcp/tools/messages.rb +8 -0
  65. data/lib/omnifocus_mcp/tools/operations/add_omnifocus_task.rb +74 -0
  66. data/lib/omnifocus_mcp/tools/operations/add_project.rb +75 -0
  67. data/lib/omnifocus_mcp/tools/operations/batch_add_items/batch_item.rb +38 -0
  68. data/lib/omnifocus_mcp/tools/operations/batch_add_items/bulk_executor.rb +94 -0
  69. data/lib/omnifocus_mcp/tools/operations/batch_add_items/cycle_detector.rb +74 -0
  70. data/lib/omnifocus_mcp/tools/operations/batch_add_items/param_builder.rb +47 -0
  71. data/lib/omnifocus_mcp/tools/operations/batch_add_items/planner.rb +111 -0
  72. data/lib/omnifocus_mcp/tools/operations/batch_add_items.rb +149 -0
  73. data/lib/omnifocus_mcp/tools/operations/batch_remove_items.rb +49 -0
  74. data/lib/omnifocus_mcp/tools/operations/database_stats.rb +52 -0
  75. data/lib/omnifocus_mcp/tools/operations/edit_item.rb +79 -0
  76. data/lib/omnifocus_mcp/tools/operations/get_perspective_view.rb +112 -0
  77. data/lib/omnifocus_mcp/tools/operations/list_perspectives.rb +85 -0
  78. data/lib/omnifocus_mcp/tools/operations/list_tags.rb +80 -0
  79. data/lib/omnifocus_mcp/tools/operations/query_omnifocus.rb +74 -0
  80. data/lib/omnifocus_mcp/tools/operations/query_omnifocus_debug.rb +63 -0
  81. data/lib/omnifocus_mcp/tools/operations/remove_item.rb +75 -0
  82. data/lib/omnifocus_mcp/tools/operations.rb +8 -0
  83. data/lib/omnifocus_mcp/tools/params/mcp_boundary.rb +41 -0
  84. data/lib/omnifocus_mcp/tools/params.rb +106 -0
  85. data/lib/omnifocus_mcp/tools/presenters/batch_report.rb +55 -0
  86. data/lib/omnifocus_mcp/tools/presenters/list_perspectives.rb +33 -0
  87. data/lib/omnifocus_mcp/tools/presenters/list_tags.rb +49 -0
  88. data/lib/omnifocus_mcp/tools/presenters/perspective_view.rb +81 -0
  89. data/lib/omnifocus_mcp/tools/presenters/query_reply.rb +52 -0
  90. data/lib/omnifocus_mcp/tools/presenters/query_results.rb +183 -0
  91. data/lib/omnifocus_mcp/tools/presenters.rb +8 -0
  92. data/lib/omnifocus_mcp/tools/query_omnifocus_formatter.rb +9 -0
  93. data/lib/omnifocus_mcp/tools/query_statuses.rb +22 -0
  94. data/lib/omnifocus_mcp/utils/apple_script.rb +9 -0
  95. data/lib/omnifocus_mcp/utils/apple_script_envelope.rb +9 -0
  96. data/lib/omnifocus_mcp/utils/apple_script_helpers.rb +9 -0
  97. data/lib/omnifocus_mcp/utils/blank.rb +26 -0
  98. data/lib/omnifocus_mcp/utils/date_filter.rb +76 -0
  99. data/lib/omnifocus_mcp/utils/date_formatting.rb +9 -0
  100. data/lib/omnifocus_mcp/utils/iso_date.rb +27 -0
  101. data/lib/omnifocus_mcp/utils/omnifocus_scripts/getPerspectiveView.js +472 -0
  102. data/lib/omnifocus_mcp/utils/omnifocus_scripts/listPerspectives.js +59 -0
  103. data/lib/omnifocus_mcp/utils/omnifocus_scripts/listTags.js +58 -0
  104. data/lib/omnifocus_mcp/utils/omnifocus_scripts/omnifocusDump.js +223 -0
  105. data/lib/omnifocus_mcp/utils/script_execution.rb +9 -0
  106. data/lib/omnifocus_mcp/version.rb +5 -0
  107. data/lib/omnifocus_mcp.rb +102 -0
  108. metadata +166 -0
@@ -0,0 +1,223 @@
1
+ // OmniJS script to export active tasks from OmniFocus database - Optimized
2
+ (() => {
3
+ try {
4
+ const startTime = new Date();
5
+
6
+ // Helper function to format dates consistently or return null
7
+ function formatDate(date) {
8
+ if (!date) return null;
9
+ return date.toISOString();
10
+ }
11
+
12
+ // Helper function to safely get enum values - Simplified with direct mapping
13
+ const taskStatusMap = {
14
+ [Task.Status.Available]: "Available",
15
+ [Task.Status.Blocked]: "Blocked",
16
+ [Task.Status.Completed]: "Completed",
17
+ [Task.Status.Dropped]: "Dropped",
18
+ [Task.Status.DueSoon]: "DueSoon",
19
+ [Task.Status.Next]: "Next",
20
+ [Task.Status.Overdue]: "Overdue"
21
+ };
22
+
23
+ const projectStatusMap = {
24
+ [Project.Status.Active]: "Active",
25
+ [Project.Status.Done]: "Done",
26
+ [Project.Status.Dropped]: "Dropped",
27
+ [Project.Status.OnHold]: "OnHold"
28
+ };
29
+
30
+ const folderStatusMap = {
31
+ [Folder.Status.Active]: "Active",
32
+ [Folder.Status.Dropped]: "Dropped"
33
+ };
34
+
35
+ function getEnumValue(enumObj, mapObj) {
36
+ if (enumObj === null || enumObj === undefined) return null;
37
+ return mapObj[enumObj] || "Unknown";
38
+ }
39
+
40
+ // Create database export object using Maps for faster lookups
41
+ const exportData = {
42
+ exportDate: new Date().toISOString(),
43
+ tasks: [],
44
+ projects: {},
45
+ folders: {},
46
+ tags: {}
47
+ };
48
+
49
+ // Filter active projects first to avoid unnecessary processing
50
+ const activeProjects = flattenedProjects.filter(project =>
51
+ project.status !== Project.Status.Done &&
52
+ project.status !== Project.Status.Dropped
53
+ );
54
+
55
+ // Pre-filter active tasks to avoid repeated filtering
56
+ const activeTasks = flattenedTasks.filter(task =>
57
+ task.taskStatus !== Task.Status.Completed &&
58
+ task.taskStatus !== Task.Status.Dropped
59
+ );
60
+
61
+ // Pre-filter active folders
62
+ const activeFolders = flattenedFolders.filter(folder =>
63
+ folder.status !== Folder.Status.Dropped
64
+ );
65
+
66
+ // Pre-filter active tags
67
+ const activeTags = flattenedTags.filter(tag => tag.active);
68
+
69
+ // Process projects in a single pass and store in Map for O(1) lookups
70
+ const projectsMap = new Map();
71
+ activeProjects.forEach(project => {
72
+ try {
73
+ const projectId = project.id.primaryKey;
74
+ const projectData = {
75
+ id: projectId,
76
+ name: project.name,
77
+ status: getEnumValue(project.status, projectStatusMap),
78
+ folderID: project.parentFolder ? project.parentFolder.id.primaryKey : null,
79
+ sequential: project.task.sequential || false,
80
+ effectiveDueDate: formatDate(project.effectiveDueDate),
81
+ effectiveDeferDate: formatDate(project.effectiveDeferDate),
82
+ dueDate: formatDate(project.dueDate),
83
+ deferDate: formatDate(project.deferDate),
84
+ completedByChildren: project.completedByChildren,
85
+ containsSingletonActions: project.containsSingletonActions,
86
+ note: project.note || "",
87
+ tasks: [] // Will be populated in the task loop
88
+ };
89
+ projectsMap.set(projectId, projectData);
90
+ exportData.projects[projectId] = projectData;
91
+ } catch (projectError) {
92
+ // Silently handle project processing errors
93
+ }
94
+ });
95
+
96
+ // Process folders in a single pass
97
+ const foldersMap = new Map();
98
+ activeFolders.forEach(folder => {
99
+ try {
100
+ const folderId = folder.id.primaryKey;
101
+ const folderData = {
102
+ id: folderId,
103
+ name: folder.name,
104
+ parentFolderID: folder.parent ? folder.parent.id.primaryKey : null,
105
+ status: getEnumValue(folder.status, folderStatusMap),
106
+ projects: [],
107
+ subfolders: []
108
+ };
109
+ foldersMap.set(folderId, folderData);
110
+ exportData.folders[folderId] = folderData;
111
+ } catch (folderError) {
112
+ // Silently handle folder processing errors
113
+ }
114
+ });
115
+
116
+ // Process tags in a single pass
117
+ const tagsMap = new Map();
118
+ activeTags.forEach(tag => {
119
+ try {
120
+ const tagId = tag.id.primaryKey;
121
+ const tagData = {
122
+ id: tagId,
123
+ name: tag.name,
124
+ parentTagID: tag.parent ? tag.parent.id.primaryKey : null,
125
+ active: tag.active,
126
+ allowsNextAction: tag.allowsNextAction,
127
+ tasks: []
128
+ };
129
+ tagsMap.set(tagId, tagData);
130
+ exportData.tags[tagId] = tagData;
131
+ } catch (tagError) {
132
+ // Silently handle tag processing errors
133
+ }
134
+ });
135
+
136
+ console.log("Building relationships and processing tasks simultaneously...");
137
+
138
+ // Build folder relationships and project-folder relationships as we go
139
+ foldersMap.forEach((folder, folderId) => {
140
+ if (folder.parentFolderID && foldersMap.has(folder.parentFolderID)) {
141
+ const parentFolder = foldersMap.get(folder.parentFolderID);
142
+ if (!parentFolder.subfolders.includes(folder.id)) {
143
+ parentFolder.subfolders.push(folder.id);
144
+ }
145
+ }
146
+ });
147
+
148
+ console.log(`Processing ${activeTasks.length} active tasks...`);
149
+
150
+ // Process tasks with an optimized approach
151
+ // Process in batches of 100 to prevent UI freezing
152
+ const BATCH_SIZE = 100;
153
+
154
+ for (let i = 0; i < activeTasks.length; i += BATCH_SIZE) {
155
+ const taskBatch = activeTasks.slice(i, i + BATCH_SIZE);
156
+
157
+ taskBatch.forEach(task => {
158
+ try {
159
+ // Get task data with minimal processing
160
+ const taskTags = task.tags.map(tag => tag.id.primaryKey);
161
+ const projectID = task.containingProject ? task.containingProject.id.primaryKey : null;
162
+
163
+ const taskData = {
164
+ id: task.id.primaryKey,
165
+ name: task.name,
166
+ note: task.note || "",
167
+ taskStatus: getEnumValue(task.taskStatus, taskStatusMap),
168
+ flagged: task.flagged,
169
+ dueDate: formatDate(task.dueDate),
170
+ deferDate: formatDate(task.deferDate),
171
+ effectiveDueDate: formatDate(task.effectiveDueDate),
172
+ effectiveDeferDate: formatDate(task.effectiveDeferDate),
173
+ estimatedMinutes: task.estimatedMinutes,
174
+ completedByChildren: task.completedByChildren,
175
+ sequential: task.sequential || false,
176
+ tags: taskTags,
177
+ projectID: projectID,
178
+ parentTaskID: task.parent ? task.parent.id.primaryKey : null,
179
+ children: task.children.map(child => child.id.primaryKey),
180
+ inInbox: task.inInbox
181
+ };
182
+
183
+ // Add task to export
184
+ exportData.tasks.push(taskData);
185
+
186
+ // Add task ID to associated project (if it exists)
187
+ if (projectID && projectsMap.has(projectID)) {
188
+ projectsMap.get(projectID).tasks.push(taskData.id);
189
+
190
+ // Update folder-project relationship (only once per project)
191
+ const project = projectsMap.get(projectID);
192
+ if (project.folderID && foldersMap.has(project.folderID)) {
193
+ const folder = foldersMap.get(project.folderID);
194
+ if (!folder.projects.includes(project.id)) {
195
+ folder.projects.push(project.id);
196
+ }
197
+ }
198
+ }
199
+
200
+ // Add task ID to associated tags
201
+ taskTags.forEach(tagID => {
202
+ if (tagsMap.has(tagID)) {
203
+ tagsMap.get(tagID).tasks.push(taskData.id);
204
+ }
205
+ });
206
+ } catch (taskError) {
207
+ // Silently handle task processing errors
208
+ }
209
+ });
210
+ }
211
+
212
+ // Return the complete database export
213
+ const jsonData = JSON.stringify(exportData);
214
+ return jsonData;
215
+
216
+ } catch (error) {
217
+ return JSON.stringify({
218
+ success: false,
219
+ error: `Error exporting database: ${error}`
220
+ });
221
+ }
222
+ }
223
+ )();
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../infrastructure/script_runner"
4
+
5
+ module OmnifocusMcp
6
+ module Utils
7
+ ScriptExecution = Infrastructure::ScriptRunner
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmnifocusMcp
4
+ VERSION = "1.0.0"
5
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fast_mcp"
4
+
5
+ require_relative "omnifocus_mcp/json_rpc_compat"
6
+ OmnifocusMcp::JsonRpcCompat.apply!
7
+
8
+ require_relative "omnifocus_mcp/version"
9
+ require_relative "omnifocus_mcp/logger"
10
+ require_relative "omnifocus_mcp/config"
11
+ require_relative "omnifocus_mcp/result"
12
+ require_relative "omnifocus_mcp/infrastructure"
13
+ require_relative "omnifocus_mcp/infrastructure/apple_script"
14
+ require_relative "omnifocus_mcp/infrastructure/apple_script_date_builder"
15
+ require_relative "omnifocus_mcp/infrastructure/js_embed"
16
+ require_relative "omnifocus_mcp/infrastructure/script_runner"
17
+ require_relative "omnifocus_mcp/parsers"
18
+ require_relative "omnifocus_mcp/parsers/apple_script_envelope"
19
+
20
+ # Utils have no internal deps and underpin everything else.
21
+ require_relative "omnifocus_mcp/utils/apple_script_envelope"
22
+ require_relative "omnifocus_mcp/utils/apple_script_helpers"
23
+ require_relative "omnifocus_mcp/utils/blank"
24
+ require_relative "omnifocus_mcp/utils/date_filter"
25
+ require_relative "omnifocus_mcp/utils/date_formatting"
26
+ require_relative "omnifocus_mcp/utils/iso_date"
27
+ require_relative "omnifocus_mcp/utils/script_execution"
28
+
29
+ # Tool param structs (shared by primitives and MCP definitions).
30
+ require_relative "omnifocus_mcp/tools/params"
31
+ require_relative "omnifocus_mcp/tools/generators"
32
+ require_relative "omnifocus_mcp/tools/operations"
33
+ require_relative "omnifocus_mcp/tools/presenters"
34
+ require_relative "omnifocus_mcp/tools/messages"
35
+ require_relative "omnifocus_mcp/tools/generators/list_perspectives"
36
+ require_relative "omnifocus_mcp/tools/generators/list_tags"
37
+ require_relative "omnifocus_mcp/tools/generators/perspective_view"
38
+ require_relative "omnifocus_mcp/tools/generators/query_omnifocus"
39
+ require_relative "omnifocus_mcp/tools/generators/query_omnifocus_debug"
40
+ require_relative "omnifocus_mcp/tools/generators/database_stats"
41
+ require_relative "omnifocus_mcp/tools/generators/add_project"
42
+ require_relative "omnifocus_mcp/tools/generators/add_omnifocus_task"
43
+ require_relative "omnifocus_mcp/tools/generators/edit_item"
44
+ require_relative "omnifocus_mcp/tools/generators/remove_item"
45
+ require_relative "omnifocus_mcp/tools/operations/query_omnifocus"
46
+ require_relative "omnifocus_mcp/tools/operations/query_omnifocus_debug"
47
+ require_relative "omnifocus_mcp/tools/operations/database_stats"
48
+ require_relative "omnifocus_mcp/tools/operations/add_omnifocus_task"
49
+ require_relative "omnifocus_mcp/tools/operations/add_project"
50
+ require_relative "omnifocus_mcp/tools/operations/batch_add_items"
51
+ require_relative "omnifocus_mcp/tools/operations/batch_remove_items"
52
+ require_relative "omnifocus_mcp/tools/operations/edit_item"
53
+ require_relative "omnifocus_mcp/tools/operations/get_perspective_view"
54
+ require_relative "omnifocus_mcp/tools/operations/list_perspectives"
55
+ require_relative "omnifocus_mcp/tools/operations/list_tags"
56
+ require_relative "omnifocus_mcp/tools/operations/remove_item"
57
+
58
+ # Shared tool support (formatter + stats + helpers) used by definitions.
59
+ require_relative "omnifocus_mcp/tools/presenters/batch_report"
60
+ require_relative "omnifocus_mcp/tools/presenters/list_perspectives"
61
+ require_relative "omnifocus_mcp/tools/presenters/list_tags"
62
+ require_relative "omnifocus_mcp/tools/presenters/perspective_view"
63
+ require_relative "omnifocus_mcp/tools/presenters/query_reply"
64
+ require_relative "omnifocus_mcp/tools/batch_report"
65
+ require_relative "omnifocus_mcp/tools/database_stats"
66
+ require_relative "omnifocus_mcp/tools/presenters/query_results"
67
+ require_relative "omnifocus_mcp/tools/query_omnifocus_formatter"
68
+ require_relative "omnifocus_mcp/tools/query_statuses"
69
+ require_relative "omnifocus_mcp/tools/definitions/date_formatter"
70
+ require_relative "omnifocus_mcp/tools/definitions/key_normalizer"
71
+ require_relative "omnifocus_mcp/tools/definitions/mcp_envelope"
72
+ require_relative "omnifocus_mcp/tools/definitions/operation_factory"
73
+ require_relative "omnifocus_mcp/tools/messages/add_omnifocus_task"
74
+ require_relative "omnifocus_mcp/tools/messages/add_project"
75
+ require_relative "omnifocus_mcp/tools/messages/batch_remove_items"
76
+ require_relative "omnifocus_mcp/tools/messages/edit_item"
77
+ require_relative "omnifocus_mcp/tools/messages/list_tools"
78
+ require_relative "omnifocus_mcp/tools/messages/remove_item"
79
+
80
+ # Tool definitions wrap primitives for MCP exposure.
81
+ require_relative "omnifocus_mcp/tools/definitions/add_omnifocus_task_tool"
82
+ require_relative "omnifocus_mcp/tools/definitions/add_project_tool"
83
+ require_relative "omnifocus_mcp/tools/definitions/batch_add_items_tool"
84
+ require_relative "omnifocus_mcp/tools/definitions/batch_remove_items_tool"
85
+ require_relative "omnifocus_mcp/tools/definitions/edit_item_tool"
86
+ require_relative "omnifocus_mcp/tools/definitions/get_perspective_view_tool"
87
+ require_relative "omnifocus_mcp/tools/definitions/list_perspectives_tool"
88
+ require_relative "omnifocus_mcp/tools/definitions/list_tags_tool"
89
+ require_relative "omnifocus_mcp/tools/definitions/query_omnifocus_tool"
90
+ require_relative "omnifocus_mcp/tools/definitions/remove_item_tool"
91
+
92
+ # Resources (base must be loaded before its subclasses).
93
+ require_relative "omnifocus_mcp/resources/base"
94
+ require_relative "omnifocus_mcp/resources/flagged_resource"
95
+ require_relative "omnifocus_mcp/resources/inbox_resource"
96
+ require_relative "omnifocus_mcp/resources/perspective_resource"
97
+ require_relative "omnifocus_mcp/resources/project_resource"
98
+ require_relative "omnifocus_mcp/resources/stats_resource"
99
+ require_relative "omnifocus_mcp/resources/today_resource"
100
+
101
+ # MCP bootstrap depends on everything above.
102
+ require_relative "omnifocus_mcp/mcp"
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omnifocus_mcp
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Henry Maddocks
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: fast-mcp
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.6'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.6'
26
+ description: MCP server for OmniFocus on macOS, built on the fast-mcp gem. Exposes
27
+ OmniFocus tasks, projects, perspectives, and tags to MCP clients over stdio.
28
+ email:
29
+ - hmaddocks@me.com
30
+ executables:
31
+ - omnifocus-mcp
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - AGENTS.md
36
+ - CHANGELOG.md
37
+ - CODE_OF_CONDUCT.md
38
+ - LICENSE.txt
39
+ - README.md
40
+ - Rakefile
41
+ - bin/omnifocus-mcp
42
+ - lib/omnifocus_mcp.rb
43
+ - lib/omnifocus_mcp/config.rb
44
+ - lib/omnifocus_mcp/infrastructure.rb
45
+ - lib/omnifocus_mcp/infrastructure/.keep
46
+ - lib/omnifocus_mcp/infrastructure/apple_script.rb
47
+ - lib/omnifocus_mcp/infrastructure/apple_script_date_builder.rb
48
+ - lib/omnifocus_mcp/infrastructure/js_embed.rb
49
+ - lib/omnifocus_mcp/infrastructure/script_runner.rb
50
+ - lib/omnifocus_mcp/json_rpc_compat.rb
51
+ - lib/omnifocus_mcp/logger.rb
52
+ - lib/omnifocus_mcp/mcp.rb
53
+ - lib/omnifocus_mcp/parsers.rb
54
+ - lib/omnifocus_mcp/parsers/.keep
55
+ - lib/omnifocus_mcp/parsers/apple_script_envelope.rb
56
+ - lib/omnifocus_mcp/resources/base.rb
57
+ - lib/omnifocus_mcp/resources/flagged_resource.rb
58
+ - lib/omnifocus_mcp/resources/inbox_resource.rb
59
+ - lib/omnifocus_mcp/resources/perspective_resource.rb
60
+ - lib/omnifocus_mcp/resources/project_resource.rb
61
+ - lib/omnifocus_mcp/resources/stats_resource.rb
62
+ - lib/omnifocus_mcp/resources/today_resource.rb
63
+ - lib/omnifocus_mcp/result.rb
64
+ - lib/omnifocus_mcp/tools/batch_report.rb
65
+ - lib/omnifocus_mcp/tools/database_stats.rb
66
+ - lib/omnifocus_mcp/tools/definitions/add_omnifocus_task_tool.rb
67
+ - lib/omnifocus_mcp/tools/definitions/add_project_tool.rb
68
+ - lib/omnifocus_mcp/tools/definitions/batch_add_items_tool.rb
69
+ - lib/omnifocus_mcp/tools/definitions/batch_remove_items_tool.rb
70
+ - lib/omnifocus_mcp/tools/definitions/date_formatter.rb
71
+ - lib/omnifocus_mcp/tools/definitions/edit_item_tool.rb
72
+ - lib/omnifocus_mcp/tools/definitions/get_perspective_view_tool.rb
73
+ - lib/omnifocus_mcp/tools/definitions/key_normalizer.rb
74
+ - lib/omnifocus_mcp/tools/definitions/list_perspectives_tool.rb
75
+ - lib/omnifocus_mcp/tools/definitions/list_tags_tool.rb
76
+ - lib/omnifocus_mcp/tools/definitions/mcp_envelope.rb
77
+ - lib/omnifocus_mcp/tools/definitions/operation_factory.rb
78
+ - lib/omnifocus_mcp/tools/definitions/query_omnifocus_tool.rb
79
+ - lib/omnifocus_mcp/tools/definitions/remove_item_tool.rb
80
+ - lib/omnifocus_mcp/tools/generators.rb
81
+ - lib/omnifocus_mcp/tools/generators/.keep
82
+ - lib/omnifocus_mcp/tools/generators/add_omnifocus_task.rb
83
+ - lib/omnifocus_mcp/tools/generators/add_project.rb
84
+ - lib/omnifocus_mcp/tools/generators/database_stats.rb
85
+ - lib/omnifocus_mcp/tools/generators/edit_item.rb
86
+ - lib/omnifocus_mcp/tools/generators/list_perspectives.rb
87
+ - lib/omnifocus_mcp/tools/generators/list_tags.rb
88
+ - lib/omnifocus_mcp/tools/generators/perspective_view.rb
89
+ - lib/omnifocus_mcp/tools/generators/query_omnifocus.rb
90
+ - lib/omnifocus_mcp/tools/generators/query_omnifocus_debug.rb
91
+ - lib/omnifocus_mcp/tools/generators/remove_item.rb
92
+ - lib/omnifocus_mcp/tools/messages.rb
93
+ - lib/omnifocus_mcp/tools/messages/add_omnifocus_task.rb
94
+ - lib/omnifocus_mcp/tools/messages/add_project.rb
95
+ - lib/omnifocus_mcp/tools/messages/batch_remove_items.rb
96
+ - lib/omnifocus_mcp/tools/messages/edit_item.rb
97
+ - lib/omnifocus_mcp/tools/messages/list_tools.rb
98
+ - lib/omnifocus_mcp/tools/messages/remove_item.rb
99
+ - lib/omnifocus_mcp/tools/operations.rb
100
+ - lib/omnifocus_mcp/tools/operations/add_omnifocus_task.rb
101
+ - lib/omnifocus_mcp/tools/operations/add_project.rb
102
+ - lib/omnifocus_mcp/tools/operations/batch_add_items.rb
103
+ - lib/omnifocus_mcp/tools/operations/batch_add_items/batch_item.rb
104
+ - lib/omnifocus_mcp/tools/operations/batch_add_items/bulk_executor.rb
105
+ - lib/omnifocus_mcp/tools/operations/batch_add_items/cycle_detector.rb
106
+ - lib/omnifocus_mcp/tools/operations/batch_add_items/param_builder.rb
107
+ - lib/omnifocus_mcp/tools/operations/batch_add_items/planner.rb
108
+ - lib/omnifocus_mcp/tools/operations/batch_remove_items.rb
109
+ - lib/omnifocus_mcp/tools/operations/database_stats.rb
110
+ - lib/omnifocus_mcp/tools/operations/edit_item.rb
111
+ - lib/omnifocus_mcp/tools/operations/get_perspective_view.rb
112
+ - lib/omnifocus_mcp/tools/operations/list_perspectives.rb
113
+ - lib/omnifocus_mcp/tools/operations/list_tags.rb
114
+ - lib/omnifocus_mcp/tools/operations/query_omnifocus.rb
115
+ - lib/omnifocus_mcp/tools/operations/query_omnifocus_debug.rb
116
+ - lib/omnifocus_mcp/tools/operations/remove_item.rb
117
+ - lib/omnifocus_mcp/tools/params.rb
118
+ - lib/omnifocus_mcp/tools/params/mcp_boundary.rb
119
+ - lib/omnifocus_mcp/tools/presenters.rb
120
+ - lib/omnifocus_mcp/tools/presenters/batch_report.rb
121
+ - lib/omnifocus_mcp/tools/presenters/list_perspectives.rb
122
+ - lib/omnifocus_mcp/tools/presenters/list_tags.rb
123
+ - lib/omnifocus_mcp/tools/presenters/perspective_view.rb
124
+ - lib/omnifocus_mcp/tools/presenters/query_reply.rb
125
+ - lib/omnifocus_mcp/tools/presenters/query_results.rb
126
+ - lib/omnifocus_mcp/tools/query_omnifocus_formatter.rb
127
+ - lib/omnifocus_mcp/tools/query_statuses.rb
128
+ - lib/omnifocus_mcp/utils/apple_script.rb
129
+ - lib/omnifocus_mcp/utils/apple_script_envelope.rb
130
+ - lib/omnifocus_mcp/utils/apple_script_helpers.rb
131
+ - lib/omnifocus_mcp/utils/blank.rb
132
+ - lib/omnifocus_mcp/utils/date_filter.rb
133
+ - lib/omnifocus_mcp/utils/date_formatting.rb
134
+ - lib/omnifocus_mcp/utils/iso_date.rb
135
+ - lib/omnifocus_mcp/utils/omnifocus_scripts/getPerspectiveView.js
136
+ - lib/omnifocus_mcp/utils/omnifocus_scripts/listPerspectives.js
137
+ - lib/omnifocus_mcp/utils/omnifocus_scripts/listTags.js
138
+ - lib/omnifocus_mcp/utils/omnifocus_scripts/omnifocusDump.js
139
+ - lib/omnifocus_mcp/utils/script_execution.rb
140
+ - lib/omnifocus_mcp/version.rb
141
+ homepage: https://github.com/hmaddocks/omnifocus-mcp
142
+ licenses:
143
+ - MIT
144
+ metadata:
145
+ homepage_uri: https://github.com/hmaddocks/omnifocus-mcp
146
+ source_code_uri: https://github.com/hmaddocks/omnifocus-mcp
147
+ changelog_uri: https://github.com/hmaddocks/omnifocus-mcp/CHANGELOG.md
148
+ rubygems_mfa_required: 'true'
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: 3.4.0
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubygems_version: 4.0.12
164
+ specification_version: 4
165
+ summary: MCP server bridging LLM clients to OmniFocus on macOS.
166
+ test_files: []