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.
- checksums.yaml +7 -0
- data/AGENTS.md +15 -0
- data/CHANGELOG.md +7 -0
- data/CODE_OF_CONDUCT.md +16 -0
- data/LICENSE.txt +21 -0
- data/README.md +147 -0
- data/Rakefile +12 -0
- data/bin/omnifocus-mcp +7 -0
- data/lib/omnifocus_mcp/config.rb +18 -0
- data/lib/omnifocus_mcp/infrastructure/.keep +1 -0
- data/lib/omnifocus_mcp/infrastructure/apple_script.rb +263 -0
- data/lib/omnifocus_mcp/infrastructure/apple_script_date_builder.rb +65 -0
- data/lib/omnifocus_mcp/infrastructure/js_embed.rb +39 -0
- data/lib/omnifocus_mcp/infrastructure/script_runner.rb +254 -0
- data/lib/omnifocus_mcp/infrastructure.rb +6 -0
- data/lib/omnifocus_mcp/json_rpc_compat.rb +75 -0
- data/lib/omnifocus_mcp/logger.rb +34 -0
- data/lib/omnifocus_mcp/mcp.rb +74 -0
- data/lib/omnifocus_mcp/parsers/.keep +1 -0
- data/lib/omnifocus_mcp/parsers/apple_script_envelope.rb +44 -0
- data/lib/omnifocus_mcp/parsers.rb +6 -0
- data/lib/omnifocus_mcp/resources/base.rb +87 -0
- data/lib/omnifocus_mcp/resources/flagged_resource.rb +31 -0
- data/lib/omnifocus_mcp/resources/inbox_resource.rb +31 -0
- data/lib/omnifocus_mcp/resources/perspective_resource.rb +28 -0
- data/lib/omnifocus_mcp/resources/project_resource.rb +37 -0
- data/lib/omnifocus_mcp/resources/stats_resource.rb +22 -0
- data/lib/omnifocus_mcp/resources/today_resource.rb +37 -0
- data/lib/omnifocus_mcp/result.rb +108 -0
- data/lib/omnifocus_mcp/tools/batch_report.rb +9 -0
- data/lib/omnifocus_mcp/tools/database_stats.rb +184 -0
- data/lib/omnifocus_mcp/tools/definitions/add_omnifocus_task_tool.rb +61 -0
- data/lib/omnifocus_mcp/tools/definitions/add_project_tool.rb +54 -0
- data/lib/omnifocus_mcp/tools/definitions/batch_add_items_tool.rb +105 -0
- data/lib/omnifocus_mcp/tools/definitions/batch_remove_items_tool.rb +68 -0
- data/lib/omnifocus_mcp/tools/definitions/date_formatter.rb +45 -0
- data/lib/omnifocus_mcp/tools/definitions/edit_item_tool.rb +87 -0
- data/lib/omnifocus_mcp/tools/definitions/get_perspective_view_tool.rb +57 -0
- data/lib/omnifocus_mcp/tools/definitions/key_normalizer.rb +30 -0
- data/lib/omnifocus_mcp/tools/definitions/list_perspectives_tool.rb +47 -0
- data/lib/omnifocus_mcp/tools/definitions/list_tags_tool.rb +42 -0
- data/lib/omnifocus_mcp/tools/definitions/mcp_envelope.rb +31 -0
- data/lib/omnifocus_mcp/tools/definitions/operation_factory.rb +33 -0
- data/lib/omnifocus_mcp/tools/definitions/query_omnifocus_tool.rb +187 -0
- data/lib/omnifocus_mcp/tools/definitions/remove_item_tool.rb +55 -0
- data/lib/omnifocus_mcp/tools/generators/.keep +1 -0
- data/lib/omnifocus_mcp/tools/generators/add_omnifocus_task.rb +348 -0
- data/lib/omnifocus_mcp/tools/generators/add_project.rb +141 -0
- data/lib/omnifocus_mcp/tools/generators/database_stats.rb +16 -0
- data/lib/omnifocus_mcp/tools/generators/edit_item.rb +455 -0
- data/lib/omnifocus_mcp/tools/generators/list_perspectives.rb +13 -0
- data/lib/omnifocus_mcp/tools/generators/list_tags.rb +13 -0
- data/lib/omnifocus_mcp/tools/generators/perspective_view.rb +17 -0
- data/lib/omnifocus_mcp/tools/generators/query_omnifocus.rb +571 -0
- data/lib/omnifocus_mcp/tools/generators/query_omnifocus_debug.rb +169 -0
- data/lib/omnifocus_mcp/tools/generators/remove_item.rb +61 -0
- data/lib/omnifocus_mcp/tools/generators.rb +8 -0
- data/lib/omnifocus_mcp/tools/messages/add_omnifocus_task.rb +53 -0
- data/lib/omnifocus_mcp/tools/messages/add_project.rb +28 -0
- data/lib/omnifocus_mcp/tools/messages/batch_remove_items.rb +13 -0
- data/lib/omnifocus_mcp/tools/messages/edit_item.rb +39 -0
- data/lib/omnifocus_mcp/tools/messages/list_tools.rb +15 -0
- data/lib/omnifocus_mcp/tools/messages/remove_item.rb +42 -0
- data/lib/omnifocus_mcp/tools/messages.rb +8 -0
- data/lib/omnifocus_mcp/tools/operations/add_omnifocus_task.rb +74 -0
- data/lib/omnifocus_mcp/tools/operations/add_project.rb +75 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items/batch_item.rb +38 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items/bulk_executor.rb +94 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items/cycle_detector.rb +74 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items/param_builder.rb +47 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items/planner.rb +111 -0
- data/lib/omnifocus_mcp/tools/operations/batch_add_items.rb +149 -0
- data/lib/omnifocus_mcp/tools/operations/batch_remove_items.rb +49 -0
- data/lib/omnifocus_mcp/tools/operations/database_stats.rb +52 -0
- data/lib/omnifocus_mcp/tools/operations/edit_item.rb +79 -0
- data/lib/omnifocus_mcp/tools/operations/get_perspective_view.rb +112 -0
- data/lib/omnifocus_mcp/tools/operations/list_perspectives.rb +85 -0
- data/lib/omnifocus_mcp/tools/operations/list_tags.rb +80 -0
- data/lib/omnifocus_mcp/tools/operations/query_omnifocus.rb +74 -0
- data/lib/omnifocus_mcp/tools/operations/query_omnifocus_debug.rb +63 -0
- data/lib/omnifocus_mcp/tools/operations/remove_item.rb +75 -0
- data/lib/omnifocus_mcp/tools/operations.rb +8 -0
- data/lib/omnifocus_mcp/tools/params/mcp_boundary.rb +41 -0
- data/lib/omnifocus_mcp/tools/params.rb +106 -0
- data/lib/omnifocus_mcp/tools/presenters/batch_report.rb +55 -0
- data/lib/omnifocus_mcp/tools/presenters/list_perspectives.rb +33 -0
- data/lib/omnifocus_mcp/tools/presenters/list_tags.rb +49 -0
- data/lib/omnifocus_mcp/tools/presenters/perspective_view.rb +81 -0
- data/lib/omnifocus_mcp/tools/presenters/query_reply.rb +52 -0
- data/lib/omnifocus_mcp/tools/presenters/query_results.rb +183 -0
- data/lib/omnifocus_mcp/tools/presenters.rb +8 -0
- data/lib/omnifocus_mcp/tools/query_omnifocus_formatter.rb +9 -0
- data/lib/omnifocus_mcp/tools/query_statuses.rb +22 -0
- data/lib/omnifocus_mcp/utils/apple_script.rb +9 -0
- data/lib/omnifocus_mcp/utils/apple_script_envelope.rb +9 -0
- data/lib/omnifocus_mcp/utils/apple_script_helpers.rb +9 -0
- data/lib/omnifocus_mcp/utils/blank.rb +26 -0
- data/lib/omnifocus_mcp/utils/date_filter.rb +76 -0
- data/lib/omnifocus_mcp/utils/date_formatting.rb +9 -0
- data/lib/omnifocus_mcp/utils/iso_date.rb +27 -0
- data/lib/omnifocus_mcp/utils/omnifocus_scripts/getPerspectiveView.js +472 -0
- data/lib/omnifocus_mcp/utils/omnifocus_scripts/listPerspectives.js +59 -0
- data/lib/omnifocus_mcp/utils/omnifocus_scripts/listTags.js +58 -0
- data/lib/omnifocus_mcp/utils/omnifocus_scripts/omnifocusDump.js +223 -0
- data/lib/omnifocus_mcp/utils/script_execution.rb +9 -0
- data/lib/omnifocus_mcp/version.rb +5 -0
- data/lib/omnifocus_mcp.rb +102 -0
- 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,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: []
|