@l22-io/orchard-mcp 0.3.2 → 0.6.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/README.md +11 -8
- package/build/bridge.js +18 -0
- package/build/bridge.js.map +1 -1
- package/build/index.js +11 -1
- package/build/index.js.map +1 -1
- package/build/tools/contacts.d.ts +2 -0
- package/build/tools/contacts.js +37 -0
- package/build/tools/contacts.js.map +1 -0
- package/build/tools/files.js +4 -1
- package/build/tools/files.js.map +1 -1
- package/build/tools/keynote.d.ts +2 -0
- package/build/tools/keynote.js +198 -0
- package/build/tools/keynote.js.map +1 -0
- package/build/tools/mail.js +57 -10
- package/build/tools/mail.js.map +1 -1
- package/build/tools/notes.d.ts +2 -0
- package/build/tools/notes.js +83 -0
- package/build/tools/notes.js.map +1 -0
- package/build/tools/numbers.d.ts +2 -0
- package/build/tools/numbers.js +167 -0
- package/build/tools/numbers.js.map +1 -0
- package/build/tools/pages.d.ts +2 -0
- package/build/tools/pages.js +143 -0
- package/build/tools/pages.js.map +1 -0
- package/package.json +11 -8
- package/scripts/postinstall.sh +77 -8
- package/swift/.build/AppleBridge.app/Contents/MacOS/apple-bridge +0 -0
- package/swift/.build/AppleBridge.app.sha256 +1 -0
- package/swift/Package.resolved +14 -0
- package/swift/Package.swift +28 -0
- package/swift/Sources/AppleBridge/AppleBridge.swift +846 -0
- package/swift/Sources/AppleBridge/Calendar.swift +221 -0
- package/swift/Sources/AppleBridge/Contacts.swift +225 -0
- package/swift/Sources/AppleBridge/Doctor.swift +252 -0
- package/swift/Sources/AppleBridge/Files.swift +474 -0
- package/swift/Sources/AppleBridge/JSON.swift +57 -0
- package/swift/Sources/AppleBridge/Keynote.swift +599 -0
- package/swift/Sources/AppleBridge/Mail.swift +794 -0
- package/swift/Sources/AppleBridge/Notes.swift +263 -0
- package/swift/Sources/AppleBridge/Numbers.swift +601 -0
- package/swift/Sources/AppleBridge/Pages.swift +467 -0
- package/swift/Sources/AppleBridge/Reminders.swift +347 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { bridgeData } from "../bridge.js";
|
|
3
|
+
export function registerNotesTools(server) {
|
|
4
|
+
server.tool("notes.list_folders", "List all Notes folders grouped by account with note counts. Requires Notes.app to be running and Automation permission.", {}, async () => {
|
|
5
|
+
const data = await bridgeData(["notes-folders"]);
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
8
|
+
};
|
|
9
|
+
});
|
|
10
|
+
server.tool("notes.list_notes", "List notes, optionally filtered by folder/account. Returns headers only (id, title, modified, folder). Requires Notes.app to be running.", {
|
|
11
|
+
folder: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Folder name to filter by"),
|
|
15
|
+
account: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Account name (use with folder when the folder name is ambiguous)"),
|
|
19
|
+
limit: z
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(200)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Max results to return (default: 50, max: 200)"),
|
|
26
|
+
}, async ({ folder, account, limit }) => {
|
|
27
|
+
const args = ["notes-list"];
|
|
28
|
+
if (folder)
|
|
29
|
+
args.push("--folder", folder);
|
|
30
|
+
if (account)
|
|
31
|
+
args.push("--account", account);
|
|
32
|
+
if (limit)
|
|
33
|
+
args.push("--limit", String(limit));
|
|
34
|
+
const data = await bridgeData(args);
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
server.tool("notes.search", "Search notes by title, body, or both. Returns headers only. Requires Notes.app to be running.", {
|
|
40
|
+
query: z.string().describe("Search query"),
|
|
41
|
+
searchIn: z
|
|
42
|
+
.enum(["title", "body", "all"])
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("Fields to search (default: all)"),
|
|
45
|
+
limit: z
|
|
46
|
+
.number()
|
|
47
|
+
.int()
|
|
48
|
+
.min(1)
|
|
49
|
+
.max(200)
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Max results (default: 20, max: 200)"),
|
|
52
|
+
}, async ({ query, searchIn, limit }) => {
|
|
53
|
+
const args = ["notes-search", "--query", query];
|
|
54
|
+
if (searchIn)
|
|
55
|
+
args.push("--search-in", searchIn);
|
|
56
|
+
if (limit)
|
|
57
|
+
args.push("--limit", String(limit));
|
|
58
|
+
const data = await bridgeData(args);
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
server.tool("notes.read_note", "Read a note's full plain-text body by ID (from notes.list_notes or notes.search). Returns title, body, timestamps, and folder.", {
|
|
64
|
+
id: z.string().describe("Note ID"),
|
|
65
|
+
maxBodyLength: z
|
|
66
|
+
.number()
|
|
67
|
+
.int()
|
|
68
|
+
.min(0)
|
|
69
|
+
.max(1_000_000)
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("Max body characters (default: 8000, 0 = unlimited)"),
|
|
72
|
+
}, async ({ id, maxBodyLength }) => {
|
|
73
|
+
const args = ["notes-read", "--id", id];
|
|
74
|
+
if (maxBodyLength !== undefined) {
|
|
75
|
+
args.push("--max-body-length", String(maxBodyLength));
|
|
76
|
+
}
|
|
77
|
+
const data = await bridgeData(args);
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/tools/notes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { bridgeData } from "../bridge.js";
|
|
3
|
+
export function registerNumbersTools(server) {
|
|
4
|
+
server.tool("numbers.search", "Search for Numbers spreadsheet files by name or content.", {
|
|
5
|
+
query: z.string().max(500).describe("Search term to match against file names or content"),
|
|
6
|
+
limit: z
|
|
7
|
+
.number()
|
|
8
|
+
.int()
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(100)
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Maximum number of results to return"),
|
|
13
|
+
}, async ({ query, limit }) => {
|
|
14
|
+
const args = ["numbers-search", "--query", query];
|
|
15
|
+
if (limit !== undefined) {
|
|
16
|
+
args.push("--limit", String(limit));
|
|
17
|
+
}
|
|
18
|
+
const data = await bridgeData(args);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
server.tool("numbers.read", "Read data from a Numbers spreadsheet. Optionally specify sheet, table, and cell range.", {
|
|
24
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
25
|
+
sheet: z.string().max(256).optional().describe("Sheet name to read from"),
|
|
26
|
+
table: z.string().max(256).optional().describe("Table name to read from"),
|
|
27
|
+
range: z.string().max(20).optional().describe("Cell range to read (e.g. A1:C10)"),
|
|
28
|
+
}, async ({ file, sheet, table, range }) => {
|
|
29
|
+
const args = ["numbers-read", "--file", file];
|
|
30
|
+
if (sheet)
|
|
31
|
+
args.push("--sheet", sheet);
|
|
32
|
+
if (table)
|
|
33
|
+
args.push("--table", table);
|
|
34
|
+
if (range)
|
|
35
|
+
args.push("--range", range);
|
|
36
|
+
const data = await bridgeData(args);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
server.tool("numbers.write", "Write data to a Numbers spreadsheet. Optionally specify sheet, table, and cell range.", {
|
|
42
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
43
|
+
data: z.string().max(1_000_000).describe("Data to write (JSON-encoded rows/columns)"),
|
|
44
|
+
sheet: z.string().max(256).optional().describe("Sheet name to write to"),
|
|
45
|
+
table: z.string().max(256).optional().describe("Table name to write to"),
|
|
46
|
+
range: z.string().max(20).optional().describe("Cell range to write to (e.g. A1)"),
|
|
47
|
+
}, async ({ file, data: writeData, sheet, table, range }) => {
|
|
48
|
+
const args = ["numbers-write", "--file", file, "--data", writeData];
|
|
49
|
+
if (sheet)
|
|
50
|
+
args.push("--sheet", sheet);
|
|
51
|
+
if (table)
|
|
52
|
+
args.push("--table", table);
|
|
53
|
+
if (range)
|
|
54
|
+
args.push("--range", range);
|
|
55
|
+
const result = await bridgeData(args);
|
|
56
|
+
return {
|
|
57
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
server.tool("numbers.create", "Create a new Numbers spreadsheet. Optionally provide initial data or a template.", {
|
|
61
|
+
file: z.string().max(1024).describe("Path for the new Numbers file"),
|
|
62
|
+
data: z
|
|
63
|
+
.string()
|
|
64
|
+
.max(1_000_000)
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Initial data to populate (JSON-encoded rows/columns)"),
|
|
67
|
+
template: z
|
|
68
|
+
.string()
|
|
69
|
+
.max(10_000)
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("Template name or path to use"),
|
|
72
|
+
}, async ({ file, data: initialData, template }) => {
|
|
73
|
+
const args = ["numbers-create", "--file", file];
|
|
74
|
+
if (initialData)
|
|
75
|
+
args.push("--data", initialData);
|
|
76
|
+
if (template)
|
|
77
|
+
args.push("--template", template);
|
|
78
|
+
const result = await bridgeData(args);
|
|
79
|
+
return {
|
|
80
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
server.tool("numbers.list_sheets", "List all sheets in a Numbers spreadsheet.", {
|
|
84
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
85
|
+
}, async ({ file }) => {
|
|
86
|
+
const data = await bridgeData(["numbers-list-sheets", "--file", file]);
|
|
87
|
+
return {
|
|
88
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
server.tool("numbers.add_sheet", "Add a new sheet to a Numbers spreadsheet.", {
|
|
92
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
93
|
+
name: z.string().max(10_000).describe("Name for the new sheet"),
|
|
94
|
+
}, async ({ file, name }) => {
|
|
95
|
+
const data = await bridgeData([
|
|
96
|
+
"numbers-add-sheet",
|
|
97
|
+
"--file",
|
|
98
|
+
file,
|
|
99
|
+
"--name",
|
|
100
|
+
name,
|
|
101
|
+
]);
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
server.tool("numbers.remove_sheet", "Remove a sheet from a Numbers spreadsheet.", {
|
|
107
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
108
|
+
name: z.string().max(10_000).describe("Name of the sheet to remove"),
|
|
109
|
+
}, async ({ file, name }) => {
|
|
110
|
+
const data = await bridgeData([
|
|
111
|
+
"numbers-remove-sheet",
|
|
112
|
+
"--file",
|
|
113
|
+
file,
|
|
114
|
+
"--name",
|
|
115
|
+
name,
|
|
116
|
+
]);
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
server.tool("numbers.get_formulas", "Get formulas from cells in a Numbers spreadsheet. Optionally specify sheet, table, and range.", {
|
|
122
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
123
|
+
sheet: z.string().max(256).optional().describe("Sheet name"),
|
|
124
|
+
table: z.string().max(256).optional().describe("Table name"),
|
|
125
|
+
range: z.string().max(20).optional().describe("Cell range (e.g. A1:C10)"),
|
|
126
|
+
}, async ({ file, sheet, table, range }) => {
|
|
127
|
+
const args = ["numbers-get-formulas", "--file", file];
|
|
128
|
+
if (sheet)
|
|
129
|
+
args.push("--sheet", sheet);
|
|
130
|
+
if (table)
|
|
131
|
+
args.push("--table", table);
|
|
132
|
+
if (range)
|
|
133
|
+
args.push("--range", range);
|
|
134
|
+
const data = await bridgeData(args);
|
|
135
|
+
return {
|
|
136
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
server.tool("numbers.export", "Export a Numbers spreadsheet to another format (CSV, PDF, or XLSX).", {
|
|
140
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
141
|
+
format: z
|
|
142
|
+
.enum(["csv", "pdf", "xlsx"])
|
|
143
|
+
.describe("Export format: csv, pdf, or xlsx"),
|
|
144
|
+
dest: z
|
|
145
|
+
.string()
|
|
146
|
+
.max(1024)
|
|
147
|
+
.optional()
|
|
148
|
+
.describe("Output file path (defaults to same directory as input)"),
|
|
149
|
+
}, async ({ file, format, dest }) => {
|
|
150
|
+
const args = ["numbers-export", "--file", file, "--format", format];
|
|
151
|
+
if (dest)
|
|
152
|
+
args.push("--dest", dest);
|
|
153
|
+
const data = await bridgeData(args);
|
|
154
|
+
return {
|
|
155
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
server.tool("numbers.info", "Get metadata and summary information about a Numbers spreadsheet.", {
|
|
159
|
+
file: z.string().max(1024).describe("Path to the Numbers file"),
|
|
160
|
+
}, async ({ file }) => {
|
|
161
|
+
const data = await bridgeData(["numbers-info", "--file", file]);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=numbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbers.js","sourceRoot":"","sources":["../../src/tools/numbers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { bridgeData } from "../bridge.js";
|
|
3
|
+
export function registerPagesTools(server) {
|
|
4
|
+
server.tool("pages.search", "Search for Pages document files by name or content.", {
|
|
5
|
+
query: z.string().max(500).describe("Search term to match against file names or content"),
|
|
6
|
+
limit: z
|
|
7
|
+
.number()
|
|
8
|
+
.int()
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(100)
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Maximum number of results to return"),
|
|
13
|
+
}, async ({ query, limit }) => {
|
|
14
|
+
const args = ["pages-search", "--query", query];
|
|
15
|
+
if (limit !== undefined) {
|
|
16
|
+
args.push("--limit", String(limit));
|
|
17
|
+
}
|
|
18
|
+
const data = await bridgeData(args);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
server.tool("pages.read", "Read the body text from a Pages document.", {
|
|
24
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
25
|
+
}, async ({ file }) => {
|
|
26
|
+
const data = await bridgeData(["pages-read", "--file", file]);
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
server.tool("pages.write", "Set the body text of a Pages document.", {
|
|
32
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
33
|
+
text: z.string().max(5_000_000).describe("Text to write as the document body"),
|
|
34
|
+
}, async ({ file, text }) => {
|
|
35
|
+
const data = await bridgeData([
|
|
36
|
+
"pages-write",
|
|
37
|
+
"--file",
|
|
38
|
+
file,
|
|
39
|
+
"--text",
|
|
40
|
+
text,
|
|
41
|
+
]);
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
server.tool("pages.create", "Create a new Pages document. Optionally provide initial text or a template.", {
|
|
47
|
+
file: z.string().max(1024).describe("Path for the new Pages file"),
|
|
48
|
+
text: z
|
|
49
|
+
.string()
|
|
50
|
+
.max(5_000_000)
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Initial body text for the document"),
|
|
53
|
+
template: z
|
|
54
|
+
.string()
|
|
55
|
+
.max(10_000)
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Template name or path to use"),
|
|
58
|
+
}, async ({ file, text, template }) => {
|
|
59
|
+
const args = ["pages-create", "--file", file];
|
|
60
|
+
if (text)
|
|
61
|
+
args.push("--text", text);
|
|
62
|
+
if (template)
|
|
63
|
+
args.push("--template", template);
|
|
64
|
+
const result = await bridgeData(args);
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
server.tool("pages.find_replace", "Find and replace text in a Pages document.", {
|
|
70
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
71
|
+
find: z.string().max(10_000).describe("Text to search for"),
|
|
72
|
+
replace: z.string().max(10_000).describe("Replacement text"),
|
|
73
|
+
all: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Replace all occurrences (default: false, replaces first only)"),
|
|
77
|
+
}, async ({ file, find, replace, all }) => {
|
|
78
|
+
const args = [
|
|
79
|
+
"pages-find-replace",
|
|
80
|
+
"--file",
|
|
81
|
+
file,
|
|
82
|
+
"--find",
|
|
83
|
+
find,
|
|
84
|
+
"--replace",
|
|
85
|
+
replace,
|
|
86
|
+
];
|
|
87
|
+
if (all)
|
|
88
|
+
args.push("--all");
|
|
89
|
+
const data = await bridgeData(args);
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
server.tool("pages.insert_table", "Insert a table into a Pages document from JSON data.", {
|
|
95
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
96
|
+
data: z
|
|
97
|
+
.string()
|
|
98
|
+
.max(1_000_000)
|
|
99
|
+
.describe("Table data as JSON array of arrays (e.g. [[\"Name\",\"Age\"],[\"Alice\",30]])"),
|
|
100
|
+
}, async ({ file, data: tableData }) => {
|
|
101
|
+
const args = ["pages-insert-table", "--file", file, "--data", tableData];
|
|
102
|
+
const result = await bridgeData(args);
|
|
103
|
+
return {
|
|
104
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
server.tool("pages.list_sections", "List sections in a Pages document with preview text and word counts.", {
|
|
108
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
109
|
+
}, async ({ file }) => {
|
|
110
|
+
const data = await bridgeData(["pages-list-sections", "--file", file]);
|
|
111
|
+
return {
|
|
112
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
server.tool("pages.export", "Export a Pages document to another format (PDF, Word, TXT, or EPUB).", {
|
|
116
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
117
|
+
format: z
|
|
118
|
+
.enum(["pdf", "docx", "txt", "epub"])
|
|
119
|
+
.describe("Export format: pdf, docx, txt, or epub"),
|
|
120
|
+
dest: z
|
|
121
|
+
.string()
|
|
122
|
+
.max(1024)
|
|
123
|
+
.optional()
|
|
124
|
+
.describe("Output file path (defaults to same directory as input)"),
|
|
125
|
+
}, async ({ file, format, dest }) => {
|
|
126
|
+
const args = ["pages-export", "--file", file, "--format", format];
|
|
127
|
+
if (dest)
|
|
128
|
+
args.push("--dest", dest);
|
|
129
|
+
const data = await bridgeData(args);
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
server.tool("pages.info", "Get metadata about a Pages document (name, word count, page count).", {
|
|
135
|
+
file: z.string().max(1024).describe("Path to the Pages file"),
|
|
136
|
+
}, async ({ file }) => {
|
|
137
|
+
const data = await bridgeData(["pages-info", "--file", file]);
|
|
138
|
+
return {
|
|
139
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/tools/pages.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@l22-io/orchard-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server for Apple Calendar, Mail, Reminders, and Files on macOS using native EventKit",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -33,7 +33,10 @@
|
|
|
33
33
|
"build",
|
|
34
34
|
"scripts/postinstall.sh",
|
|
35
35
|
"swift/.build/AppleBridge.app",
|
|
36
|
-
"swift/
|
|
36
|
+
"swift/.build/AppleBridge.app.sha256",
|
|
37
|
+
"swift/Package.swift",
|
|
38
|
+
"swift/Package.resolved",
|
|
39
|
+
"swift/Sources"
|
|
37
40
|
],
|
|
38
41
|
"os": [
|
|
39
42
|
"darwin"
|
|
@@ -51,15 +54,15 @@
|
|
|
51
54
|
"author": "l22.io GmbH",
|
|
52
55
|
"license": "MIT",
|
|
53
56
|
"engines": {
|
|
54
|
-
"node": ">=
|
|
57
|
+
"node": ">=22.0.0"
|
|
55
58
|
},
|
|
56
59
|
"dependencies": {
|
|
57
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
58
|
-
"zod": "^
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
61
|
+
"zod": "^4.4.0"
|
|
59
62
|
},
|
|
60
63
|
"devDependencies": {
|
|
61
|
-
"@types/node": "^
|
|
62
|
-
"tsx": "^4.
|
|
63
|
-
"typescript": "^
|
|
64
|
+
"@types/node": "^25.0.0",
|
|
65
|
+
"tsx": "^4.21.0",
|
|
66
|
+
"typescript": "^6.0.0"
|
|
64
67
|
}
|
|
65
68
|
}
|
package/scripts/postinstall.sh
CHANGED
|
@@ -3,19 +3,88 @@ set -e
|
|
|
3
3
|
|
|
4
4
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
5
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
6
|
-
|
|
6
|
+
SWIFT_DIR="$PROJECT_ROOT/swift"
|
|
7
|
+
APP_BUNDLE="$SWIFT_DIR/.build/AppleBridge.app"
|
|
8
|
+
BRIDGE_BIN="$SWIFT_DIR/.build/release/apple-bridge"
|
|
9
|
+
INFO_PLIST="$SWIFT_DIR/Sources/AppleBridge/Info.plist"
|
|
10
|
+
SHASUM_FILE="$SWIFT_DIR/.build/AppleBridge.app.sha256"
|
|
11
|
+
INNER_BIN="$APP_BUNDLE/Contents/MacOS/apple-bridge"
|
|
7
12
|
|
|
8
|
-
# Skip on non-macOS (shouldn't happen due to os field, but be safe)
|
|
9
13
|
if [ "$(uname)" != "Darwin" ]; then
|
|
10
14
|
echo "[orchard-mcp] macOS required. Skipping postinstall."
|
|
11
15
|
exit 0
|
|
12
16
|
fi
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
build_from_source() {
|
|
19
|
+
echo "[orchard-mcp] Swift detected -- building apple-bridge from source."
|
|
20
|
+
(
|
|
21
|
+
cd "$SWIFT_DIR"
|
|
22
|
+
swift build -c release \
|
|
23
|
+
-Xlinker -sectcreate \
|
|
24
|
+
-Xlinker __TEXT \
|
|
25
|
+
-Xlinker __info_plist \
|
|
26
|
+
-Xlinker "$INFO_PLIST"
|
|
27
|
+
)
|
|
28
|
+
mkdir -p "$APP_BUNDLE/Contents/MacOS"
|
|
29
|
+
cp "$BRIDGE_BIN" "$INNER_BIN"
|
|
30
|
+
cp "$INFO_PLIST" "$APP_BUNDLE/Contents/Info.plist"
|
|
17
31
|
codesign --force --sign - "$APP_BUNDLE" 2>/dev/null || true
|
|
18
|
-
echo "[orchard-mcp]
|
|
19
|
-
|
|
20
|
-
|
|
32
|
+
echo "[orchard-mcp] Built from source. Run 'orchard-mcp setup' to configure permissions."
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
verify_prebuilt() {
|
|
36
|
+
# Defence-in-depth for the prebuilt fallback: compare the binary's hash
|
|
37
|
+
# against the shipped manifest. This catches truncated/corrupted tarball
|
|
38
|
+
# extraction but does NOT defend against a coordinated tarball tamper
|
|
39
|
+
# (attacker would update both files). For a real chain of trust, install
|
|
40
|
+
# with `npm install --ignore-scripts` and build from source, or wait for
|
|
41
|
+
# a Developer ID signed release.
|
|
42
|
+
if [ ! -f "$SHASUM_FILE" ]; then
|
|
43
|
+
echo "[orchard-mcp] Warning: no checksum manifest shipped; skipping integrity check."
|
|
44
|
+
return 0
|
|
45
|
+
fi
|
|
46
|
+
if [ ! -f "$INNER_BIN" ]; then
|
|
47
|
+
return 1
|
|
48
|
+
fi
|
|
49
|
+
local expected actual
|
|
50
|
+
expected=$(awk '{print $1}' "$SHASUM_FILE")
|
|
51
|
+
actual=$(shasum -a 256 "$INNER_BIN" | awk '{print $1}')
|
|
52
|
+
if [ "$expected" != "$actual" ]; then
|
|
53
|
+
echo "[orchard-mcp] ERROR: Binary checksum mismatch."
|
|
54
|
+
echo " expected: $expected"
|
|
55
|
+
echo " actual: $actual"
|
|
56
|
+
echo " The prebuilt binary may be corrupted or tampered with."
|
|
57
|
+
echo " Install Xcode Command Line Tools (xcode-select --install)"
|
|
58
|
+
echo " and reinstall to build from source instead."
|
|
59
|
+
return 2
|
|
60
|
+
fi
|
|
61
|
+
echo "[orchard-mcp] Prebuilt binary checksum ok: $actual"
|
|
62
|
+
return 0
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if command -v swift >/dev/null 2>&1; then
|
|
66
|
+
build_from_source
|
|
67
|
+
exit 0
|
|
21
68
|
fi
|
|
69
|
+
|
|
70
|
+
echo "[orchard-mcp] Swift not available -- using prebuilt binary."
|
|
71
|
+
echo " Install Xcode Command Line Tools for a higher-assurance"
|
|
72
|
+
echo " install that builds apple-bridge locally."
|
|
73
|
+
|
|
74
|
+
if [ ! -d "$APP_BUNDLE" ]; then
|
|
75
|
+
echo "[orchard-mcp] Warning: AppleBridge.app not found and Swift is unavailable."
|
|
76
|
+
echo " Install Xcode Command Line Tools and run 'orchard-mcp setup'."
|
|
77
|
+
exit 0
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
set +e
|
|
81
|
+
verify_prebuilt
|
|
82
|
+
status=$?
|
|
83
|
+
set -e
|
|
84
|
+
if [ $status -eq 2 ]; then
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
echo "[orchard-mcp] Codesigning prebuilt AppleBridge.app..."
|
|
89
|
+
codesign --force --sign - "$APP_BUNDLE" 2>/dev/null || true
|
|
90
|
+
echo "[orchard-mcp] Ready. Run 'orchard-mcp setup' to configure permissions."
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
20ea806633df5f1242e3c40daee70a03b1389ef6a03a6356a1751b1680b04433 apple-bridge
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pins" : [
|
|
3
|
+
{
|
|
4
|
+
"identity" : "swift-argument-parser",
|
|
5
|
+
"kind" : "remoteSourceControl",
|
|
6
|
+
"location" : "https://github.com/apple/swift-argument-parser.git",
|
|
7
|
+
"state" : {
|
|
8
|
+
"revision" : "626b5b7b2f45e1b0b1c6f4a309296d1d21d7311b",
|
|
9
|
+
"version" : "1.7.1"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"version" : 2
|
|
14
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// swift-tools-version: 5.9
|
|
2
|
+
import PackageDescription
|
|
3
|
+
|
|
4
|
+
let package = Package(
|
|
5
|
+
name: "apple-bridge",
|
|
6
|
+
platforms: [
|
|
7
|
+
.macOS(.v14)
|
|
8
|
+
],
|
|
9
|
+
dependencies: [
|
|
10
|
+
.package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.7.1")
|
|
11
|
+
],
|
|
12
|
+
targets: [
|
|
13
|
+
.executableTarget(
|
|
14
|
+
name: "apple-bridge",
|
|
15
|
+
dependencies: [
|
|
16
|
+
.product(name: "ArgumentParser", package: "swift-argument-parser")
|
|
17
|
+
],
|
|
18
|
+
path: "Sources/AppleBridge",
|
|
19
|
+
exclude: ["Info.plist"],
|
|
20
|
+
linkerSettings: [
|
|
21
|
+
.linkedFramework("EventKit"),
|
|
22
|
+
.linkedFramework("Foundation"),
|
|
23
|
+
.linkedFramework("PDFKit"),
|
|
24
|
+
.linkedFramework("Vision")
|
|
25
|
+
]
|
|
26
|
+
)
|
|
27
|
+
]
|
|
28
|
+
)
|