@heznpc/imcp 1.0.0 → 1.1.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/dist/calendar/scripts.js +11 -8
- package/dist/calendar/scripts.js.map +1 -1
- package/dist/finder/scripts.js +3 -3
- package/dist/index.js +88 -21
- package/dist/index.js.map +1 -1
- package/dist/mail/tools.js +2 -0
- package/dist/mail/tools.js.map +1 -1
- package/dist/messages/scripts.js +56 -19
- package/dist/messages/scripts.js.map +1 -1
- package/dist/messages/tools.d.ts +1 -1
- package/dist/messages/tools.js +6 -1
- package/dist/messages/tools.js.map +1 -1
- package/dist/shared/config.d.ts +23 -0
- package/dist/shared/config.js +111 -1
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/hitl-guard.d.ts +8 -0
- package/dist/shared/hitl-guard.js +39 -0
- package/dist/shared/hitl-guard.js.map +1 -0
- package/dist/shared/hitl.d.ts +16 -0
- package/dist/shared/hitl.js +131 -0
- package/dist/shared/hitl.js.map +1 -0
- package/dist/shared/setup.d.ts +2 -1
- package/dist/shared/setup.js +22 -14
- package/dist/shared/setup.js.map +1 -1
- package/dist/shortcuts/prompts.d.ts +2 -0
- package/dist/shortcuts/prompts.js +148 -0
- package/dist/shortcuts/prompts.js.map +1 -0
- package/dist/system/scripts.js +4 -2
- package/dist/system/scripts.js.map +1 -1
- package/package.json +5 -4
package/dist/calendar/scripts.js
CHANGED
|
@@ -5,14 +5,17 @@ export function listCalendarsScript() {
|
|
|
5
5
|
return `
|
|
6
6
|
const Calendar = Application('Calendar');
|
|
7
7
|
const cals = Calendar.calendars();
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
const result = [];
|
|
9
|
+
for (let i = 0; i < cals.length; i++) {
|
|
10
|
+
try {
|
|
11
|
+
const cal = cals[i];
|
|
12
|
+
let color = null;
|
|
13
|
+
let writable = false;
|
|
14
|
+
try { color = cal.color(); } catch(e) {}
|
|
15
|
+
try { writable = cal.writable(); } catch(e) {}
|
|
16
|
+
result.push({ id: cal.id(), name: cal.name(), color: color, writable: writable });
|
|
17
|
+
} catch(e) {}
|
|
18
|
+
}
|
|
16
19
|
JSON.stringify(result);
|
|
17
20
|
`;
|
|
18
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/calendar/scripts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,0EAA0E;AAE1E,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,mBAAmB;IACjC,OAAO
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/calendar/scripts.ts"],"names":[],"mappings":"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"}
|
package/dist/finder/scripts.js
CHANGED
|
@@ -5,7 +5,7 @@ export function searchFilesScript(folder, query, limit) {
|
|
|
5
5
|
const app = Application.currentApplication();
|
|
6
6
|
app.includeStandardAdditions = true;
|
|
7
7
|
const results = app.doShellScript('mdfind -onlyin "${escJxaShell(folder)}" "${escJxaShell(query)}" | head -${limit}');
|
|
8
|
-
const paths = results.split(
|
|
8
|
+
const paths = results.split(/[\\r\\n]+/).filter(p => p.length > 0);
|
|
9
9
|
const Finder = Application('Finder');
|
|
10
10
|
const result = paths.map(p => {
|
|
11
11
|
try {
|
|
@@ -68,7 +68,7 @@ export function recentFilesScript(folder, days, limit) {
|
|
|
68
68
|
app.includeStandardAdditions = true;
|
|
69
69
|
const dateStr = new Date(Date.now() - ${days} * 86400000).toISOString().split('T')[0];
|
|
70
70
|
const results = app.doShellScript('mdfind -onlyin "${escJxaShell(folder)}" "kMDItemContentModificationDate >= $time.iso(' + dateStr + ')" | head -${limit}');
|
|
71
|
-
const paths = results.split(
|
|
71
|
+
const paths = results.split(/[\\r\\n]+/).filter(p => p.length > 0);
|
|
72
72
|
const result = paths.map(p => ({path: p, name: p.split('/').pop()}));
|
|
73
73
|
JSON.stringify({total: paths.length, files: result});
|
|
74
74
|
`;
|
|
@@ -78,7 +78,7 @@ export function listDirectoryScript(path, limit) {
|
|
|
78
78
|
const app = Application.currentApplication();
|
|
79
79
|
app.includeStandardAdditions = true;
|
|
80
80
|
const output = app.doShellScript('ls -1 "${escJxaShell(path)}" | head -${limit}');
|
|
81
|
-
const names = output.split(
|
|
81
|
+
const names = output.split(/[\\r\\n]+/).filter(n => n.length > 0);
|
|
82
82
|
const Finder = Application('Finder');
|
|
83
83
|
const result = names.map(name => {
|
|
84
84
|
try {
|
package/dist/index.js
CHANGED
|
@@ -18,42 +18,109 @@ import { registerSafariTools } from "./safari/tools.js";
|
|
|
18
18
|
import { registerSystemTools } from "./system/tools.js";
|
|
19
19
|
import { registerPhotosTools } from "./photos/tools.js";
|
|
20
20
|
import { registerShortcutsTools } from "./shortcuts/tools.js";
|
|
21
|
+
import { registerShortcutPrompts } from "./shortcuts/prompts.js";
|
|
21
22
|
import { registerMessagesTools } from "./messages/tools.js";
|
|
22
23
|
import { registerIntelligenceTools } from "./intelligence/tools.js";
|
|
23
24
|
import { registerCrossPrompts } from "./cross/prompts.js";
|
|
24
25
|
import { registerResources } from "./shared/resources.js";
|
|
25
26
|
import { registerSetupTools } from "./shared/setup.js";
|
|
26
|
-
import { parseConfig } from "./shared/config.js";
|
|
27
|
+
import { parseConfig, isModuleEnabled, MODULE_NAMES } from "./shared/config.js";
|
|
28
|
+
import { HitlClient } from "./shared/hitl.js";
|
|
29
|
+
import { installHitlGuard } from "./shared/hitl-guard.js";
|
|
27
30
|
const config = parseConfig();
|
|
31
|
+
// HITL client — shared across all servers, created once if enabled
|
|
32
|
+
let hitlClient = null;
|
|
33
|
+
if (config.hitl.level !== "off") {
|
|
34
|
+
hitlClient = new HitlClient(config.hitl);
|
|
35
|
+
console.error(`iMcp HITL enabled: level=${config.hitl.level}, timeout=${config.hitl.timeout}s, socket=${config.hitl.socketPath}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error("iMcp HITL disabled");
|
|
39
|
+
}
|
|
40
|
+
// Clean up HITL socket on exit
|
|
41
|
+
function onExit() {
|
|
42
|
+
if (hitlClient) {
|
|
43
|
+
hitlClient.dispose();
|
|
44
|
+
hitlClient = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
process.on("exit", onExit);
|
|
48
|
+
process.on("SIGINT", () => { onExit(); process.exit(0); });
|
|
49
|
+
process.on("SIGTERM", () => { onExit(); process.exit(0); });
|
|
28
50
|
function createServer() {
|
|
29
51
|
const server = new McpServer({
|
|
30
52
|
name: "imcp",
|
|
31
|
-
version: "1.
|
|
53
|
+
version: "1.1.0",
|
|
32
54
|
});
|
|
55
|
+
// Install HITL guard before any tool registrations
|
|
56
|
+
if (hitlClient && config.hitl.level !== "off") {
|
|
57
|
+
installHitlGuard(server, hitlClient, config);
|
|
58
|
+
}
|
|
59
|
+
const enabled = [];
|
|
60
|
+
const disabled = [];
|
|
61
|
+
for (const mod of MODULE_NAMES) {
|
|
62
|
+
if (isModuleEnabled(config, mod)) {
|
|
63
|
+
enabled.push(mod);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
disabled.push(mod);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (disabled.length > 0) {
|
|
70
|
+
console.error(`iMcp modules disabled: ${disabled.join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
console.error(`iMcp modules enabled: ${enabled.join(", ")}`);
|
|
33
73
|
// Apple Apps
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
74
|
+
if (isModuleEnabled(config, "notes")) {
|
|
75
|
+
registerNoteTools(server, config);
|
|
76
|
+
registerNotePrompts(server);
|
|
77
|
+
}
|
|
78
|
+
if (isModuleEnabled(config, "reminders")) {
|
|
79
|
+
registerReminderTools(server, config);
|
|
80
|
+
registerReminderPrompts(server);
|
|
81
|
+
}
|
|
82
|
+
if (isModuleEnabled(config, "calendar")) {
|
|
83
|
+
registerCalendarTools(server, config);
|
|
84
|
+
registerCalendarPrompts(server);
|
|
85
|
+
}
|
|
86
|
+
if (isModuleEnabled(config, "contacts")) {
|
|
87
|
+
registerContactTools(server, config);
|
|
88
|
+
}
|
|
89
|
+
if (isModuleEnabled(config, "mail")) {
|
|
90
|
+
registerMailTools(server, config);
|
|
91
|
+
}
|
|
92
|
+
if (isModuleEnabled(config, "music")) {
|
|
93
|
+
registerMusicTools(server, config);
|
|
94
|
+
}
|
|
95
|
+
if (isModuleEnabled(config, "finder")) {
|
|
96
|
+
registerFinderTools(server, config);
|
|
97
|
+
}
|
|
98
|
+
if (isModuleEnabled(config, "safari")) {
|
|
99
|
+
registerSafariTools(server, config);
|
|
100
|
+
}
|
|
101
|
+
if (isModuleEnabled(config, "system")) {
|
|
102
|
+
registerSystemTools(server, config);
|
|
103
|
+
}
|
|
104
|
+
if (isModuleEnabled(config, "photos")) {
|
|
105
|
+
registerPhotosTools(server, config);
|
|
106
|
+
}
|
|
107
|
+
if (isModuleEnabled(config, "shortcuts")) {
|
|
108
|
+
registerShortcutsTools(server, config);
|
|
109
|
+
registerShortcutPrompts(server);
|
|
110
|
+
}
|
|
111
|
+
if (isModuleEnabled(config, "messages")) {
|
|
112
|
+
registerMessagesTools(server, config);
|
|
113
|
+
}
|
|
49
114
|
// Apple Intelligence
|
|
50
|
-
|
|
115
|
+
if (isModuleEnabled(config, "intelligence")) {
|
|
116
|
+
registerIntelligenceTools(server, config);
|
|
117
|
+
}
|
|
51
118
|
// Cross-module workflows
|
|
52
119
|
registerCrossPrompts(server);
|
|
53
120
|
// MCP Resources
|
|
54
121
|
registerResources(server);
|
|
55
122
|
// Setup & diagnostics
|
|
56
|
-
registerSetupTools(server);
|
|
123
|
+
registerSetupTools(server, config);
|
|
57
124
|
return server;
|
|
58
125
|
}
|
|
59
126
|
const args = process.argv.slice(2);
|
|
@@ -132,14 +199,14 @@ async function main() {
|
|
|
132
199
|
}
|
|
133
200
|
});
|
|
134
201
|
app.listen(port, () => {
|
|
135
|
-
console.error(`iMcp server running on http://localhost:${port}/mcp (shared notes: ${config.includeShared ? "on" : "off"})`);
|
|
202
|
+
console.error(`iMcp server running on http://localhost:${port}/mcp (shared notes: ${config.includeShared ? "on" : "off"}, send messages: ${config.allowSendMessages ? "on" : "off"}, send mail: ${config.allowSendMail ? "on" : "off"})`);
|
|
136
203
|
});
|
|
137
204
|
}
|
|
138
205
|
else {
|
|
139
206
|
const server = createServer();
|
|
140
207
|
const transport = new StdioServerTransport();
|
|
141
208
|
await server.connect(transport);
|
|
142
|
-
console.error(`iMcp server running on stdio (shared notes: ${config.includeShared ? "on" : "off"})`);
|
|
209
|
+
console.error(`iMcp server running on stdio (shared notes: ${config.includeShared ? "on" : "off"}, send messages: ${config.allowSendMessages ? "on" : "off"}, send mail: ${config.allowSendMail ? "on" : "off"})`);
|
|
143
210
|
}
|
|
144
211
|
}
|
|
145
212
|
main().catch((error) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mail/tools.js
CHANGED
|
@@ -3,6 +3,8 @@ import { runJxa } from "../shared/jxa.js";
|
|
|
3
3
|
import { ok, err } from "../shared/result.js";
|
|
4
4
|
import { listMailboxesScript, listMessagesScript, readMessageScript, searchMessagesScript, markReadScript, flagMessageScript, getUnreadCountScript, moveMessageScript, listAccountsScript, } from "./scripts.js";
|
|
5
5
|
export function registerMailTools(server, _config) {
|
|
6
|
+
// _config.allowSendMail is reserved for future send/compose tools.
|
|
7
|
+
// Current mail tools are read-only or organizational (no outbound mail).
|
|
6
8
|
server.registerTool("list_mailboxes", {
|
|
7
9
|
title: "List Mailboxes",
|
|
8
10
|
description: "List all mailboxes across accounts with unread counts.",
|
package/dist/mail/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mail/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mail/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/messages/scripts.js
CHANGED
|
@@ -8,15 +8,23 @@ export function listChatsScript(limit) {
|
|
|
8
8
|
const result = [];
|
|
9
9
|
for (let i = 0; i < count; i++) {
|
|
10
10
|
const c = chats[i];
|
|
11
|
-
|
|
11
|
+
let parts = [];
|
|
12
|
+
try {
|
|
13
|
+
const participants = c.participants();
|
|
14
|
+
parts = participants.map(p => {
|
|
15
|
+
let name = null, handle = null;
|
|
16
|
+
try { name = p.name(); } catch(e) {}
|
|
17
|
+
try { handle = p.handle(); } catch(e) {}
|
|
18
|
+
return {name, handle};
|
|
19
|
+
});
|
|
20
|
+
} catch(e) {}
|
|
21
|
+
let updated = null;
|
|
22
|
+
try { updated = c.updatedDate() ? c.updatedDate().toISOString() : null; } catch(e) {}
|
|
12
23
|
result.push({
|
|
13
24
|
id: c.id(),
|
|
14
25
|
name: c.name() || null,
|
|
15
|
-
participants:
|
|
16
|
-
|
|
17
|
-
handle: p.handle()
|
|
18
|
-
})),
|
|
19
|
-
updated: c.updatedDate() ? c.updatedDate().toISOString() : null
|
|
26
|
+
participants: parts,
|
|
27
|
+
updated: updated
|
|
20
28
|
});
|
|
21
29
|
}
|
|
22
30
|
JSON.stringify({total: chats.length, returned: count, chats: result});
|
|
@@ -28,12 +36,23 @@ export function readChatScript(chatId) {
|
|
|
28
36
|
const chats = Messages.chats.whose({id: '${esc(chatId)}'})();
|
|
29
37
|
if (chats.length === 0) throw new Error('Chat not found: ${esc(chatId)}');
|
|
30
38
|
const chat = chats[0];
|
|
31
|
-
|
|
39
|
+
let parts = [];
|
|
40
|
+
try {
|
|
41
|
+
const participants = chat.participants();
|
|
42
|
+
parts = participants.map(p => {
|
|
43
|
+
let name = null, handle = null;
|
|
44
|
+
try { name = p.name(); } catch(e) {}
|
|
45
|
+
try { handle = p.handle(); } catch(e) {}
|
|
46
|
+
return {name, handle};
|
|
47
|
+
});
|
|
48
|
+
} catch(e) {}
|
|
49
|
+
let updated = null;
|
|
50
|
+
try { updated = chat.updatedDate() ? chat.updatedDate().toISOString() : null; } catch(e) {}
|
|
32
51
|
JSON.stringify({
|
|
33
52
|
id: chat.id(),
|
|
34
53
|
name: chat.name() || null,
|
|
35
|
-
participants:
|
|
36
|
-
updated:
|
|
54
|
+
participants: parts,
|
|
55
|
+
updated: updated
|
|
37
56
|
});
|
|
38
57
|
`;
|
|
39
58
|
}
|
|
@@ -46,17 +65,30 @@ export function searchMessagesScript(query, limit) {
|
|
|
46
65
|
for (const chat of chats) {
|
|
47
66
|
if (result.length >= ${limit}) break;
|
|
48
67
|
const name = chat.name() || '';
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
let parts = [];
|
|
69
|
+
let participantNames = '';
|
|
70
|
+
let participantHandles = '';
|
|
71
|
+
try {
|
|
72
|
+
const participants = chat.participants();
|
|
73
|
+
parts = participants.map(p => {
|
|
74
|
+
let pn = null, ph = null;
|
|
75
|
+
try { pn = p.name(); } catch(e) {}
|
|
76
|
+
try { ph = p.handle(); } catch(e) {}
|
|
77
|
+
return {name: pn, handle: ph};
|
|
78
|
+
});
|
|
79
|
+
participantNames = parts.map(p => p.name || '').join(' ');
|
|
80
|
+
participantHandles = parts.map(p => p.handle || '').join(' ');
|
|
81
|
+
} catch(e) {}
|
|
52
82
|
if (name.toLowerCase().includes(q) ||
|
|
53
83
|
participantNames.toLowerCase().includes(q) ||
|
|
54
84
|
participantHandles.toLowerCase().includes(q)) {
|
|
85
|
+
let updated = null;
|
|
86
|
+
try { updated = chat.updatedDate() ? chat.updatedDate().toISOString() : null; } catch(e) {}
|
|
55
87
|
result.push({
|
|
56
88
|
id: chat.id(),
|
|
57
89
|
name: name || null,
|
|
58
|
-
participants:
|
|
59
|
-
updated:
|
|
90
|
+
participants: parts,
|
|
91
|
+
updated: updated
|
|
60
92
|
});
|
|
61
93
|
}
|
|
62
94
|
}
|
|
@@ -92,11 +124,16 @@ export function listParticipantsScript(chatId) {
|
|
|
92
124
|
const chats = Messages.chats.whose({id: '${esc(chatId)}'})();
|
|
93
125
|
if (chats.length === 0) throw new Error('Chat not found: ${esc(chatId)}');
|
|
94
126
|
const chat = chats[0];
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
127
|
+
let result = [];
|
|
128
|
+
try {
|
|
129
|
+
const participants = chat.participants();
|
|
130
|
+
result = participants.map(p => {
|
|
131
|
+
let name = null, handle = null;
|
|
132
|
+
try { name = p.name(); } catch(e) {}
|
|
133
|
+
try { handle = p.handle(); } catch(e) {}
|
|
134
|
+
return {name, handle};
|
|
135
|
+
});
|
|
136
|
+
} catch(e) {}
|
|
100
137
|
JSON.stringify({chatId: '${esc(chatId)}', chatName: chat.name() || null, participants: result});
|
|
101
138
|
`;
|
|
102
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/messages/scripts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO;;;2CAGkC,KAAK
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/messages/scripts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO;;;2CAGkC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;GAwB7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO;;+CAEsC,GAAG,CAAC,MAAM,CAAC;+DACK,GAAG,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;GAoBvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,KAAa;IAEb,OAAO;;;iBAGQ,GAAG,CAAC,KAAK,CAAC;;;6BAGE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,IAAY;IAEZ,OAAO;;;;oDAI2C,GAAG,CAAC,MAAM,CAAC;2EACY,GAAG,CAAC,MAAM,CAAC;qBACjE,GAAG,CAAC,IAAI,CAAC;uCACS,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC;GACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,QAAgB;IAEhB,OAAO;;;;oDAI2C,GAAG,CAAC,MAAM,CAAC;2EACY,GAAG,CAAC,MAAM,CAAC;yBAC7D,GAAG,CAAC,QAAQ,CAAC;;uCAEC,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC;GACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO;;+CAEsC,GAAG,CAAC,MAAM,CAAC;+DACK,GAAG,CAAC,MAAM,CAAC;;;;;;;;;;;;+BAY3C,GAAG,CAAC,MAAM,CAAC;GACvC,CAAC;AACJ,CAAC"}
|
package/dist/messages/tools.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { ImcpConfig } from "../shared/config.js";
|
|
3
|
-
export declare function registerMessagesTools(server: McpServer,
|
|
3
|
+
export declare function registerMessagesTools(server: McpServer, config: ImcpConfig): void;
|
package/dist/messages/tools.js
CHANGED
|
@@ -2,7 +2,8 @@ import { z } from "zod";
|
|
|
2
2
|
import { runJxa } from "../shared/jxa.js";
|
|
3
3
|
import { ok, err } from "../shared/result.js";
|
|
4
4
|
import { listChatsScript, readChatScript, searchMessagesScript, sendMessageScript, sendFileScript, listParticipantsScript, } from "./scripts.js";
|
|
5
|
-
export function registerMessagesTools(server,
|
|
5
|
+
export function registerMessagesTools(server, config) {
|
|
6
|
+
const { allowSendMessages } = config;
|
|
6
7
|
server.registerTool("list_chats", {
|
|
7
8
|
title: "List Chats",
|
|
8
9
|
description: "List recent chats in Messages with participants and last update time.",
|
|
@@ -58,6 +59,8 @@ export function registerMessagesTools(server, _config) {
|
|
|
58
59
|
},
|
|
59
60
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
60
61
|
}, async ({ target, text }) => {
|
|
62
|
+
if (!allowSendMessages)
|
|
63
|
+
return err("Sending messages is disabled. Set IMCP_ALLOW_SEND_MESSAGES=true to enable.");
|
|
61
64
|
try {
|
|
62
65
|
return ok(await runJxa(sendMessageScript(target, text)));
|
|
63
66
|
}
|
|
@@ -74,6 +77,8 @@ export function registerMessagesTools(server, _config) {
|
|
|
74
77
|
},
|
|
75
78
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
76
79
|
}, async ({ target, filePath }) => {
|
|
80
|
+
if (!allowSendMessages)
|
|
81
|
+
return err("Sending messages is disabled. Set IMCP_ALLOW_SEND_MESSAGES=true to enable.");
|
|
77
82
|
try {
|
|
78
83
|
return ok(await runJxa(sendFileScript(target, filePath)));
|
|
79
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/messages/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/messages/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/config.d.ts
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
|
+
export type HitlLevel = "off" | "destructive-only" | "all-writes" | "all";
|
|
2
|
+
export interface HitlConfig {
|
|
3
|
+
level: HitlLevel;
|
|
4
|
+
whitelist: Set<string>;
|
|
5
|
+
timeout: number;
|
|
6
|
+
socketPath: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const MODULE_NAMES: readonly ["notes", "reminders", "calendar", "contacts", "mail", "messages", "music", "finder", "safari", "system", "photos", "shortcuts", "intelligence"];
|
|
9
|
+
/** Core modules enabled by default when no config.json exists */
|
|
10
|
+
export declare const STARTER_MODULES: ReadonlySet<string>;
|
|
11
|
+
export type ModuleName = (typeof MODULE_NAMES)[number];
|
|
1
12
|
export interface ImcpConfig {
|
|
2
13
|
/** Include shared notes/folders in results. Default: false */
|
|
3
14
|
includeShared: boolean;
|
|
15
|
+
/** Set of disabled module names */
|
|
16
|
+
disabledModules: Set<string>;
|
|
17
|
+
/** Set of module names that require share approval */
|
|
18
|
+
shareApprovalModules: Set<string>;
|
|
19
|
+
/** Allow sending messages via Messages app. Default: true */
|
|
20
|
+
allowSendMessages: boolean;
|
|
21
|
+
/** Allow sending emails via Mail app. Default: true */
|
|
22
|
+
allowSendMail: boolean;
|
|
23
|
+
/** Human-in-the-loop confirmation config */
|
|
24
|
+
hitl: HitlConfig;
|
|
4
25
|
}
|
|
5
26
|
export declare function parseConfig(): ImcpConfig;
|
|
27
|
+
export declare function isModuleEnabled(config: ImcpConfig, moduleName: string): boolean;
|
|
28
|
+
export declare function needsShareApproval(config: ImcpConfig, moduleName: string): boolean;
|
package/dist/shared/config.js
CHANGED
|
@@ -1,6 +1,116 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const HITL_LEVELS = ["off", "destructive-only", "all-writes", "all"];
|
|
4
|
+
export const MODULE_NAMES = [
|
|
5
|
+
"notes",
|
|
6
|
+
"reminders",
|
|
7
|
+
"calendar",
|
|
8
|
+
"contacts",
|
|
9
|
+
"mail",
|
|
10
|
+
"messages",
|
|
11
|
+
"music",
|
|
12
|
+
"finder",
|
|
13
|
+
"safari",
|
|
14
|
+
"system",
|
|
15
|
+
"photos",
|
|
16
|
+
"shortcuts",
|
|
17
|
+
"intelligence",
|
|
18
|
+
];
|
|
19
|
+
/** Core modules enabled by default when no config.json exists */
|
|
20
|
+
export const STARTER_MODULES = new Set([
|
|
21
|
+
"notes",
|
|
22
|
+
"reminders",
|
|
23
|
+
"calendar",
|
|
24
|
+
"shortcuts",
|
|
25
|
+
"system",
|
|
26
|
+
]);
|
|
27
|
+
function loadFileConfig() {
|
|
28
|
+
try {
|
|
29
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
30
|
+
const file = join(home, ".config", "imcp", "config.json");
|
|
31
|
+
const data = readFileSync(file, "utf-8");
|
|
32
|
+
return { config: JSON.parse(data), fileExists: true };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { config: {}, fileExists: false };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
1
38
|
export function parseConfig() {
|
|
39
|
+
const { config: file, fileExists } = loadFileConfig();
|
|
40
|
+
const fullMode = process.env.IMCP_FULL === "true" || process.argv.includes("--full");
|
|
41
|
+
// Disabled modules: env vars override, then JSON fallback, then starter preset
|
|
42
|
+
const disabledModules = new Set();
|
|
43
|
+
const fileDisabled = new Set(file.disabledModules ?? []);
|
|
44
|
+
for (const mod of MODULE_NAMES) {
|
|
45
|
+
const envKey = `IMCP_DISABLE_${mod.toUpperCase()}`;
|
|
46
|
+
const envVal = process.env[envKey];
|
|
47
|
+
if (envVal === "true") {
|
|
48
|
+
disabledModules.add(mod);
|
|
49
|
+
}
|
|
50
|
+
else if (envVal === undefined && fileDisabled.has(mod)) {
|
|
51
|
+
disabledModules.add(mod);
|
|
52
|
+
}
|
|
53
|
+
else if (envVal === undefined && !fileExists && !fullMode && !STARTER_MODULES.has(mod)) {
|
|
54
|
+
// No config.json & not --full: apply starter preset
|
|
55
|
+
disabledModules.add(mod);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Share approval: env var overrides, then JSON fallback
|
|
59
|
+
const shareApprovalModules = new Set();
|
|
60
|
+
const shareApprovalEnv = process.env.IMCP_SHARE_APPROVAL;
|
|
61
|
+
if (shareApprovalEnv) {
|
|
62
|
+
for (const raw of shareApprovalEnv.split(",")) {
|
|
63
|
+
const mod = raw.trim().toLowerCase();
|
|
64
|
+
if (mod && MODULE_NAMES.includes(mod)) {
|
|
65
|
+
shareApprovalModules.add(mod);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (file.shareApproval) {
|
|
70
|
+
for (const mod of file.shareApproval) {
|
|
71
|
+
if (MODULE_NAMES.includes(mod)) {
|
|
72
|
+
shareApprovalModules.add(mod);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Boolean configs: env var > JSON > default
|
|
77
|
+
const includeShared = process.env.IMCP_INCLUDE_SHARED !== undefined
|
|
78
|
+
? process.env.IMCP_INCLUDE_SHARED === "true"
|
|
79
|
+
: (file.includeShared ?? false);
|
|
80
|
+
const allowSendMessages = process.env.IMCP_ALLOW_SEND_MESSAGES !== undefined
|
|
81
|
+
? process.env.IMCP_ALLOW_SEND_MESSAGES !== "false"
|
|
82
|
+
: (file.allowSendMessages ?? true);
|
|
83
|
+
const allowSendMail = process.env.IMCP_ALLOW_SEND_MAIL !== undefined
|
|
84
|
+
? process.env.IMCP_ALLOW_SEND_MAIL !== "false"
|
|
85
|
+
: (file.allowSendMail ?? true);
|
|
86
|
+
// HITL config: env var > JSON > default
|
|
87
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
88
|
+
const hitlLevelRaw = process.env.IMCP_HITL_LEVEL ?? file.hitl?.level ?? "off";
|
|
89
|
+
const hitlLevel = HITL_LEVELS.includes(hitlLevelRaw)
|
|
90
|
+
? hitlLevelRaw
|
|
91
|
+
: "off";
|
|
92
|
+
const hitlWhitelist = new Set(file.hitl?.whitelist ?? []);
|
|
93
|
+
const hitlTimeout = file.hitl?.timeout ?? 30;
|
|
94
|
+
const hitlSocketPath = join(home, ".config", "imcp", "hitl.sock");
|
|
95
|
+
const hitl = {
|
|
96
|
+
level: hitlLevel,
|
|
97
|
+
whitelist: hitlWhitelist,
|
|
98
|
+
timeout: hitlTimeout,
|
|
99
|
+
socketPath: hitlSocketPath,
|
|
100
|
+
};
|
|
2
101
|
return {
|
|
3
|
-
includeShared
|
|
102
|
+
includeShared,
|
|
103
|
+
disabledModules,
|
|
104
|
+
shareApprovalModules,
|
|
105
|
+
allowSendMessages,
|
|
106
|
+
allowSendMail,
|
|
107
|
+
hitl,
|
|
4
108
|
};
|
|
5
109
|
}
|
|
110
|
+
export function isModuleEnabled(config, moduleName) {
|
|
111
|
+
return !config.disabledModules.has(moduleName);
|
|
112
|
+
}
|
|
113
|
+
export function needsShareApproval(config, moduleName) {
|
|
114
|
+
return config.shareApprovalModules.has(moduleName);
|
|
115
|
+
}
|
|
6
116
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ImcpConfig } from "./config.js";
|
|
3
|
+
import type { HitlClient } from "./hitl.js";
|
|
4
|
+
/**
|
|
5
|
+
* Monkey-patches server.registerTool so every subsequent registration
|
|
6
|
+
* goes through HITL approval when the policy requires it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function installHitlGuard(server: McpServer, hitlClient: HitlClient, config: ImcpConfig): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { err } from "./result.js";
|
|
2
|
+
function shouldRequireApproval(level, annotations, whitelist, toolName) {
|
|
3
|
+
if (whitelist.has(toolName))
|
|
4
|
+
return false;
|
|
5
|
+
switch (level) {
|
|
6
|
+
case "off":
|
|
7
|
+
return false;
|
|
8
|
+
case "destructive-only":
|
|
9
|
+
return annotations.destructiveHint === true;
|
|
10
|
+
case "all-writes":
|
|
11
|
+
return annotations.readOnlyHint === false;
|
|
12
|
+
case "all":
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Monkey-patches server.registerTool so every subsequent registration
|
|
18
|
+
* goes through HITL approval when the policy requires it.
|
|
19
|
+
*/
|
|
20
|
+
export function installHitlGuard(server, hitlClient, config) {
|
|
21
|
+
const original = server.registerTool.bind(server);
|
|
22
|
+
const patched = (name, toolConfig, callback) => {
|
|
23
|
+
const annotations = toolConfig.annotations ?? {};
|
|
24
|
+
if (!shouldRequireApproval(config.hitl.level, annotations, config.hitl.whitelist, name)) {
|
|
25
|
+
return original(name, toolConfig, callback);
|
|
26
|
+
}
|
|
27
|
+
const wrapped = async (...args) => {
|
|
28
|
+
const toolArgs = (args[0] ?? {});
|
|
29
|
+
const approved = await hitlClient.requestApproval(name, toolArgs, annotations.destructiveHint ?? false, annotations.openWorldHint ?? false);
|
|
30
|
+
if (!approved) {
|
|
31
|
+
return err(`Action denied: "${name}" requires user approval. The user denied or did not respond in time.`);
|
|
32
|
+
}
|
|
33
|
+
return callback(...args);
|
|
34
|
+
};
|
|
35
|
+
return original(name, toolConfig, wrapped);
|
|
36
|
+
};
|
|
37
|
+
server.registerTool = patched;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hitl-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hitl-guard.js","sourceRoot":"","sources":["../../src/shared/hitl-guard.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AASlC,SAAS,qBAAqB,CAC5B,KAAgB,EAChB,WAA4B,EAC5B,SAAsB,EACtB,QAAgB;IAEhB,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,kBAAkB;YACrB,OAAO,WAAW,CAAC,eAAe,KAAK,IAAI,CAAC;QAC9C,KAAK,YAAY;YACf,OAAO,WAAW,CAAC,YAAY,KAAK,KAAK,CAAC;QAC5C,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,UAAsB,EACtB,MAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,CACd,IAAY,EACZ,UAAqE,EACrE,QAAyC,EACzC,EAAE;QACF,MAAM,WAAW,GAAoB,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;QAElE,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YACxF,OAAO,QAAQ,CAAC,IAAI,EAAE,UAA4C,EAAE,QAA0C,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;YAC3C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,eAAe,CAC/C,IAAI,EACJ,QAAQ,EACR,WAAW,CAAC,eAAe,IAAI,KAAK,EACpC,WAAW,CAAC,aAAa,IAAI,KAAK,CACnC,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,GAAG,CACR,mBAAmB,IAAI,uEAAuE,CAC/F,CAAC;YACJ,CAAC;YACD,OAAQ,QAAyC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,EAAE,UAA4C,EAAE,OAAyC,CAAC,CAAC;IACjH,CAAC,CAAC;IACF,MAAM,CAAC,YAAY,GAAG,OAAqC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { HitlConfig } from "./config.js";
|
|
2
|
+
export declare class HitlClient {
|
|
3
|
+
private config;
|
|
4
|
+
private socket;
|
|
5
|
+
private pending;
|
|
6
|
+
private buffer;
|
|
7
|
+
private connecting;
|
|
8
|
+
private connectPromise;
|
|
9
|
+
constructor(config: HitlConfig);
|
|
10
|
+
requestApproval(tool: string, args: Record<string, unknown>, destructive: boolean, openWorld: boolean): Promise<boolean>;
|
|
11
|
+
private ensureConnected;
|
|
12
|
+
private connect;
|
|
13
|
+
private onData;
|
|
14
|
+
private denyAllPending;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createConnection } from "node:net";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
export class HitlClient {
|
|
4
|
+
config;
|
|
5
|
+
socket = null;
|
|
6
|
+
pending = new Map();
|
|
7
|
+
buffer = "";
|
|
8
|
+
connecting = false;
|
|
9
|
+
connectPromise = null;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async requestApproval(tool, args, destructive, openWorld) {
|
|
14
|
+
try {
|
|
15
|
+
await this.ensureConnected();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.error(`[hitl] socket unreachable at ${this.config.socketPath} — denying "${tool}"`);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const id = randomUUID();
|
|
22
|
+
const request = {
|
|
23
|
+
id,
|
|
24
|
+
type: "hitl_request",
|
|
25
|
+
tool,
|
|
26
|
+
args,
|
|
27
|
+
destructive,
|
|
28
|
+
openWorld,
|
|
29
|
+
};
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
const timer = setTimeout(() => {
|
|
32
|
+
this.pending.delete(id);
|
|
33
|
+
console.error(`[hitl] timeout waiting for approval of "${tool}" — denying`);
|
|
34
|
+
resolve(false);
|
|
35
|
+
}, this.config.timeout * 1000);
|
|
36
|
+
this.pending.set(id, {
|
|
37
|
+
resolve: (approved) => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
resolve(approved);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
try {
|
|
43
|
+
this.socket.write(JSON.stringify(request) + "\n");
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
this.pending.delete(id);
|
|
48
|
+
console.error(`[hitl] failed to send request for "${tool}" — denying`);
|
|
49
|
+
resolve(false);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
ensureConnected() {
|
|
54
|
+
if (this.socket && !this.socket.destroyed) {
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
}
|
|
57
|
+
if (this.connectPromise) {
|
|
58
|
+
return this.connectPromise;
|
|
59
|
+
}
|
|
60
|
+
this.connectPromise = this.connect();
|
|
61
|
+
return this.connectPromise;
|
|
62
|
+
}
|
|
63
|
+
connect() {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
this.connecting = true;
|
|
66
|
+
const socket = createConnection({ path: this.config.socketPath }, () => {
|
|
67
|
+
this.socket = socket;
|
|
68
|
+
this.connecting = false;
|
|
69
|
+
this.connectPromise = null;
|
|
70
|
+
this.buffer = "";
|
|
71
|
+
resolve();
|
|
72
|
+
});
|
|
73
|
+
socket.setEncoding("utf-8");
|
|
74
|
+
socket.on("data", (chunk) => {
|
|
75
|
+
this.onData(chunk);
|
|
76
|
+
});
|
|
77
|
+
socket.on("error", (error) => {
|
|
78
|
+
if (this.connecting) {
|
|
79
|
+
this.connecting = false;
|
|
80
|
+
this.connectPromise = null;
|
|
81
|
+
reject(error);
|
|
82
|
+
}
|
|
83
|
+
this.denyAllPending("socket error");
|
|
84
|
+
});
|
|
85
|
+
socket.on("close", () => {
|
|
86
|
+
this.socket = null;
|
|
87
|
+
this.connectPromise = null;
|
|
88
|
+
this.denyAllPending("socket closed");
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
onData(chunk) {
|
|
93
|
+
this.buffer += chunk;
|
|
94
|
+
const lines = this.buffer.split("\n");
|
|
95
|
+
// Keep the last incomplete line in the buffer
|
|
96
|
+
this.buffer = lines.pop() ?? "";
|
|
97
|
+
for (const line of lines) {
|
|
98
|
+
const trimmed = line.trim();
|
|
99
|
+
if (!trimmed)
|
|
100
|
+
continue;
|
|
101
|
+
try {
|
|
102
|
+
const msg = JSON.parse(trimmed);
|
|
103
|
+
if (msg.type === "hitl_response" && msg.id) {
|
|
104
|
+
const entry = this.pending.get(msg.id);
|
|
105
|
+
if (entry) {
|
|
106
|
+
this.pending.delete(msg.id);
|
|
107
|
+
entry.resolve(msg.approved);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
console.error("[hitl] failed to parse response:", trimmed);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
denyAllPending(reason) {
|
|
117
|
+
for (const [id, entry] of this.pending) {
|
|
118
|
+
console.error(`[hitl] ${reason} — denying pending request ${id}`);
|
|
119
|
+
entry.resolve(false);
|
|
120
|
+
}
|
|
121
|
+
this.pending.clear();
|
|
122
|
+
}
|
|
123
|
+
dispose() {
|
|
124
|
+
if (this.socket) {
|
|
125
|
+
this.socket.destroy();
|
|
126
|
+
this.socket = null;
|
|
127
|
+
}
|
|
128
|
+
this.denyAllPending("dispose");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=hitl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hitl.js","sourceRoot":"","sources":["../../src/shared/hitl.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/setup.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
|
|
2
|
+
import { ImcpConfig } from "./config.js";
|
|
3
|
+
export declare function registerSetupTools(server: McpServer, config?: ImcpConfig): void;
|
package/dist/shared/setup.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { runJxa } from "./jxa.js";
|
|
2
2
|
import { ok } from "./result.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
{ name: "
|
|
7
|
-
{ name: "
|
|
8
|
-
{ name: "
|
|
9
|
-
{ name: "
|
|
10
|
-
{ name: "
|
|
11
|
-
{ name: "
|
|
12
|
-
{
|
|
13
|
-
{ name: "
|
|
3
|
+
import { isModuleEnabled } from "./config.js";
|
|
4
|
+
/** Map: module name → macOS app name + permission-probe script */
|
|
5
|
+
const MODULE_APP_MAP = [
|
|
6
|
+
{ module: "notes", name: "Notes", script: "const Notes = Application('Notes'); JSON.stringify({app: 'Notes', accessible: true});" },
|
|
7
|
+
{ module: "reminders", name: "Reminders", script: "const Reminders = Application('Reminders'); JSON.stringify({app: 'Reminders', accessible: true});" },
|
|
8
|
+
{ module: "calendar", name: "Calendar", script: "const Calendar = Application('Calendar'); JSON.stringify({app: 'Calendar', accessible: true});" },
|
|
9
|
+
{ module: "contacts", name: "Contacts", script: "const Contacts = Application('Contacts'); JSON.stringify({app: 'Contacts', accessible: true});" },
|
|
10
|
+
{ module: "mail", name: "Mail", script: "const Mail = Application('Mail'); JSON.stringify({app: 'Mail', accessible: true});" },
|
|
11
|
+
{ module: "music", name: "Music", script: "const Music = Application('Music'); JSON.stringify({app: 'Music', accessible: true});" },
|
|
12
|
+
{ module: "finder", name: "Finder", script: "const Finder = Application('Finder'); JSON.stringify({app: 'Finder', accessible: true});" },
|
|
13
|
+
{ module: "safari", name: "Safari", script: "const Safari = Application('Safari'); JSON.stringify({app: 'Safari', accessible: true});" },
|
|
14
|
+
{ module: "system", name: "System Events", script: "const SE = Application('System Events'); JSON.stringify({app: 'System Events', accessible: true});" },
|
|
15
|
+
{ module: "photos", name: "Photos", script: "const Photos = Application('Photos'); JSON.stringify({app: 'Photos', accessible: true});" },
|
|
16
|
+
{ module: "messages", name: "Messages", script: "const Messages = Application('Messages'); JSON.stringify({app: 'Messages', accessible: true});" },
|
|
14
17
|
];
|
|
15
|
-
export function registerSetupTools(server) {
|
|
18
|
+
export function registerSetupTools(server, config) {
|
|
16
19
|
server.registerTool("setup_permissions", {
|
|
17
20
|
title: "Setup Permissions",
|
|
18
21
|
description: "Trigger macOS permission prompts for all Apple apps used by iMcp. Run this once after installation to grant all permissions at once. Each app will show a one-time macOS permission dialog.",
|
|
@@ -24,8 +27,12 @@ export function registerSetupTools(server) {
|
|
|
24
27
|
openWorldHint: false,
|
|
25
28
|
},
|
|
26
29
|
}, async () => {
|
|
30
|
+
// Only probe apps for enabled modules
|
|
31
|
+
const apps = config
|
|
32
|
+
? MODULE_APP_MAP.filter((a) => isModuleEnabled(config, a.module))
|
|
33
|
+
: MODULE_APP_MAP;
|
|
27
34
|
const results = [];
|
|
28
|
-
for (const app of
|
|
35
|
+
for (const app of apps) {
|
|
29
36
|
try {
|
|
30
37
|
await runJxa(app.script);
|
|
31
38
|
results.push({ app: app.name, status: "granted" });
|
|
@@ -38,7 +45,8 @@ export function registerSetupTools(server) {
|
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
const granted = results.filter((r) => r.status === "granted").length;
|
|
41
|
-
|
|
48
|
+
const skipped = MODULE_APP_MAP.length - apps.length;
|
|
49
|
+
return ok({ total: apps.length, granted, skipped, results });
|
|
42
50
|
});
|
|
43
51
|
}
|
|
44
52
|
//# sourceMappingURL=setup.js.map
|
package/dist/shared/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/shared/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/shared/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { userPrompt } from "../shared/prompt.js";
|
|
3
|
+
export function registerShortcutPrompts(server) {
|
|
4
|
+
server.prompt("shortcut-automation", {
|
|
5
|
+
goal: z.string().describe("The automation goal or workflow you want to achieve"),
|
|
6
|
+
input: z.string().optional().describe("Optional initial input data for the workflow"),
|
|
7
|
+
}, ({ goal, input }) => {
|
|
8
|
+
const inputCtx = input ? `\nInitial input data: "${input}"` : "";
|
|
9
|
+
return userPrompt("Guide for creating complex automation workflows by chaining multiple shortcuts.", `Build an automation workflow to achieve: "${goal}"${inputCtx}
|
|
10
|
+
|
|
11
|
+
Execute the following steps using iMcp tools:
|
|
12
|
+
|
|
13
|
+
1. **Discover available shortcuts**:
|
|
14
|
+
- list_shortcuts to get all available Siri Shortcuts on this Mac
|
|
15
|
+
- search_shortcuts with keywords related to "${goal}" to find relevant shortcuts
|
|
16
|
+
- For each promising match, use get_shortcut_detail to understand what it does and what actions it contains
|
|
17
|
+
|
|
18
|
+
2. **Analyze and plan the workflow**:
|
|
19
|
+
- Identify which shortcuts can be chained together to accomplish the goal
|
|
20
|
+
- Determine the execution order based on input/output dependencies
|
|
21
|
+
- Note which shortcuts accept text input and which produce output
|
|
22
|
+
- Identify any gaps where no existing shortcut covers a needed step
|
|
23
|
+
- Present the proposed workflow plan to me for confirmation
|
|
24
|
+
|
|
25
|
+
3. **Execute the workflow**:
|
|
26
|
+
- Run each shortcut in sequence using run_shortcut with the appropriate name and input
|
|
27
|
+
- Pass the output of one shortcut as the input to the next when chaining
|
|
28
|
+
- If a shortcut fails, report the error and suggest alternatives
|
|
29
|
+
- Track the output at each step for the final summary
|
|
30
|
+
|
|
31
|
+
4. **Report results**:
|
|
32
|
+
- Show the output from each step in the chain
|
|
33
|
+
- Highlight any steps that produced unexpected results
|
|
34
|
+
- Suggest improvements or additional shortcuts that could enhance the workflow
|
|
35
|
+
- If a step failed, explain what went wrong and possible fixes
|
|
36
|
+
|
|
37
|
+
Important:
|
|
38
|
+
- Always use exact shortcut names from list_shortcuts or search_shortcuts — names must match exactly
|
|
39
|
+
- Some shortcuts may trigger UI prompts or require user interaction — warn me before running those
|
|
40
|
+
- Never assume a shortcut exists; always verify with search_shortcuts first
|
|
41
|
+
- Ask for confirmation before running shortcuts that perform destructive or irreversible actions`);
|
|
42
|
+
});
|
|
43
|
+
server.prompt("shortcut-discovery", {
|
|
44
|
+
category: z.string().optional().describe("Optional category or keyword to focus the discovery (e.g. 'productivity', 'media', 'text')"),
|
|
45
|
+
}, ({ category }) => {
|
|
46
|
+
const filterCtx = category
|
|
47
|
+
? `Focus on shortcuts related to "${category}".`
|
|
48
|
+
: "Cover all available shortcuts.";
|
|
49
|
+
return userPrompt("Help users find, understand, and explore their available Siri Shortcuts.", `Help me discover and understand my available Siri Shortcuts. ${filterCtx}
|
|
50
|
+
|
|
51
|
+
Execute the following steps using iMcp tools:
|
|
52
|
+
|
|
53
|
+
1. **List all shortcuts**:
|
|
54
|
+
- list_shortcuts to get the complete list of Siri Shortcuts on this Mac
|
|
55
|
+
- Report the total count${category ? `\n - search_shortcuts(query: "${category}") to filter for the relevant category` : ""}
|
|
56
|
+
|
|
57
|
+
2. **Categorize shortcuts**:
|
|
58
|
+
- Group shortcuts by inferred purpose based on their names:
|
|
59
|
+
* Productivity (text processing, file operations, data conversion)
|
|
60
|
+
* Communication (messaging, email, sharing)
|
|
61
|
+
* Media (photos, music, video)
|
|
62
|
+
* System (settings, device control, automation)
|
|
63
|
+
* Developer (build, deploy, git, code)
|
|
64
|
+
* Custom/Other
|
|
65
|
+
- Present the categorized list clearly
|
|
66
|
+
|
|
67
|
+
3. **Deep-dive into interesting shortcuts**:
|
|
68
|
+
- For shortcuts with unclear names, use get_shortcut_detail to inspect their actions
|
|
69
|
+
- Identify which shortcuts accept input and what type
|
|
70
|
+
- Identify which shortcuts produce output
|
|
71
|
+
- Flag shortcuts that might interact with external services or perform system changes
|
|
72
|
+
|
|
73
|
+
4. **Provide recommendations**:
|
|
74
|
+
- Suggest useful shortcuts the user might not know they have
|
|
75
|
+
- Identify shortcuts that could be combined for powerful workflows
|
|
76
|
+
- Point out shortcuts that overlap in functionality
|
|
77
|
+
- Suggest common tasks that could be automated with the existing shortcuts
|
|
78
|
+
|
|
79
|
+
5. **Summary report**:
|
|
80
|
+
- Total shortcuts available
|
|
81
|
+
- Breakdown by category
|
|
82
|
+
- Top recommendations for daily use
|
|
83
|
+
- Potential workflow combinations
|
|
84
|
+
|
|
85
|
+
Important:
|
|
86
|
+
- Use get_shortcut_detail on shortcuts with ambiguous names to provide accurate descriptions
|
|
87
|
+
- Do not run any shortcuts during discovery — this is a read-only exploration
|
|
88
|
+
- If the list is very large, focus on the most useful categories first`);
|
|
89
|
+
});
|
|
90
|
+
server.prompt("shortcut-troubleshooting", {
|
|
91
|
+
shortcutName: z.string().describe("Name of the shortcut that is having issues"),
|
|
92
|
+
errorDescription: z.string().optional().describe("Description of the error or unexpected behavior"),
|
|
93
|
+
}, ({ shortcutName, errorDescription }) => {
|
|
94
|
+
const errorCtx = errorDescription
|
|
95
|
+
? `\nReported issue: "${errorDescription}"`
|
|
96
|
+
: "";
|
|
97
|
+
return userPrompt("Diagnose and fix shortcut execution issues.", `Troubleshoot the Siri Shortcut "${shortcutName}".${errorCtx}
|
|
98
|
+
|
|
99
|
+
Execute the following steps using iMcp tools:
|
|
100
|
+
|
|
101
|
+
1. **Verify the shortcut exists**:
|
|
102
|
+
- search_shortcuts(query: "${shortcutName}") to find the shortcut
|
|
103
|
+
- If not found, list_shortcuts to show all available shortcuts and suggest the closest match
|
|
104
|
+
- Confirm the exact name (names are case-sensitive and must match exactly)
|
|
105
|
+
|
|
106
|
+
2. **Inspect the shortcut**:
|
|
107
|
+
- get_shortcut_detail(name: "${shortcutName}") to examine its actions and structure
|
|
108
|
+
- Identify what the shortcut is designed to do
|
|
109
|
+
- Check what input it expects (if any)
|
|
110
|
+
- Identify actions that depend on external services, apps, or permissions
|
|
111
|
+
|
|
112
|
+
3. **Test execution**:
|
|
113
|
+
- run_shortcut(name: "${shortcutName}") with no input to test basic execution
|
|
114
|
+
- If the shortcut expects input, run_shortcut with a simple test input
|
|
115
|
+
- Capture and analyze any error messages from the output
|
|
116
|
+
|
|
117
|
+
4. **Diagnose the issue**:
|
|
118
|
+
Based on the inspection and test results, check for these common problems:
|
|
119
|
+
- **Name mismatch**: The name used doesn't exactly match the shortcut name
|
|
120
|
+
- **Missing input**: The shortcut requires input but none was provided
|
|
121
|
+
- **Wrong input type**: The shortcut expects a specific input format
|
|
122
|
+
- **Permission issues**: The shortcut needs permissions that haven't been granted
|
|
123
|
+
- **App dependency**: The shortcut relies on an app that isn't installed or available
|
|
124
|
+
- **Network dependency**: The shortcut needs internet access for an API or web request
|
|
125
|
+
- **UI interaction required**: The shortcut triggers a dialog that blocks automation
|
|
126
|
+
- **Timeout**: The shortcut takes too long to complete via CLI
|
|
127
|
+
|
|
128
|
+
5. **Provide solutions**:
|
|
129
|
+
- Explain the diagnosed root cause clearly
|
|
130
|
+
- Suggest specific fixes:
|
|
131
|
+
* Correct name to use with run_shortcut
|
|
132
|
+
* Required input format and example
|
|
133
|
+
* Permission steps to resolve access issues
|
|
134
|
+
* Alternative shortcuts that accomplish the same goal
|
|
135
|
+
- If the shortcut cannot be fixed via MCP, explain what manual steps are needed in the Shortcuts app
|
|
136
|
+
|
|
137
|
+
6. **Verification**:
|
|
138
|
+
- After applying fixes, re-run the shortcut to confirm it works
|
|
139
|
+
- Show the successful output
|
|
140
|
+
|
|
141
|
+
Important:
|
|
142
|
+
- Some shortcuts will trigger UI prompts — warn me before running them
|
|
143
|
+
- If a shortcut consistently fails, it may need to be edited in the Shortcuts app directly
|
|
144
|
+
- Report the exact error output for accurate diagnosis
|
|
145
|
+
- Do not modify or delete any shortcuts — only inspect and run them`);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/shortcuts/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,MAAM,CACX,qBAAqB,EACrB;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAChF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACtF,EACD,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,0BAA0B,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,UAAU,CACf,iFAAiF,EACjF,6CAA6C,IAAI,IAAI,QAAQ;;;;;;kDAMnB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;iGA0B2C,CAC1F,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4FAA4F,CAAC;KACvI,EACD,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACf,MAAM,SAAS,GAAG,QAAQ;YACxB,CAAC,CAAC,kCAAkC,QAAQ,IAAI;YAChD,CAAC,CAAC,gCAAgC,CAAC;QACrC,OAAO,UAAU,CACf,0EAA0E,EAC1E,gEAAgE,SAAS;;;;;;6BAMpD,QAAQ,CAAC,CAAC,CAAC,mCAAmC,QAAQ,wCAAwC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAiCzD,CAChE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,0BAA0B,EAC1B;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC/E,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KACpG,EACD,CAAC,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,gBAAgB;YAC/B,CAAC,CAAC,sBAAsB,gBAAgB,GAAG;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,UAAU,CACf,6CAA6C,EAC7C,mCAAmC,YAAY,KAAK,QAAQ;;;;;gCAKpC,YAAY;;;;;kCAKV,YAAY;;;;;;2BAMnB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAgC6B,CAC7D,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/system/scripts.js
CHANGED
|
@@ -4,8 +4,10 @@ export function getClipboardScript() {
|
|
|
4
4
|
return `
|
|
5
5
|
const app = Application.currentApplication();
|
|
6
6
|
app.includeStandardAdditions = true;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
let text;
|
|
8
|
+
try { text = app.theClipboard(); } catch(e) { text = ''; }
|
|
9
|
+
const content = (typeof text === 'object') ? JSON.stringify(text) : String(text);
|
|
10
|
+
JSON.stringify({content: content});
|
|
9
11
|
`;
|
|
10
12
|
}
|
|
11
13
|
export function setClipboardScript(text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/system/scripts.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,kBAAkB;IAChC,OAAO
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/system/scripts.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;GAON,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO;;;oBAGW,GAAG,CAAC,IAAI,CAAC;;;GAG1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;GASN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,KAAe;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxG,IAAI,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO;;;2BAGkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;GAMxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;GAKN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;GAUN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;GAeN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;GAkBN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,MAAe;IACnE,MAAM,UAAU,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;;;yCAGgC,UAAU,KAAK,QAAQ;oDACZ,QAAQ;6CACf,GAAG,CAAC,IAAI,CAAC;GACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,KAAc,EAAE,QAAiB,EAAE,KAAc;IACvG,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO;;;+BAGsB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;4CACrB,GAAG,CAAC,OAAO,CAAC;GACrD,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heznpc/imcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "MCP server for the entire Apple ecosystem — Notes, Reminders, Calendar, Contacts, Mail, Messages, Music, Finder, Safari, Photos, Shortcuts, System, and Apple Intelligence. Connect any AI to your Mac.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"license": "MIT",
|
|
48
48
|
"author": "heznpc",
|
|
49
|
+
"mcpName": "io.github.heznpc/imcp",
|
|
49
50
|
"type": "module",
|
|
50
51
|
"main": "dist/index.js",
|
|
51
52
|
"types": "dist/index.d.ts",
|
|
@@ -67,9 +68,9 @@
|
|
|
67
68
|
"start": "node dist/index.js",
|
|
68
69
|
"test": "node --experimental-vm-modules node_modules/.bin/jest",
|
|
69
70
|
"typecheck": "tsc --noEmit",
|
|
70
|
-
"version:patch": "npm version patch --no-git-tag-version",
|
|
71
|
-
"version:minor": "npm version minor --no-git-tag-version",
|
|
72
|
-
"version:major": "npm version major --no-git-tag-version"
|
|
71
|
+
"version:patch": "npm version patch --no-git-tag-version && node -e \"let s=require('./server.json');s.version=s.packages[0].version=require('./package.json').version;require('fs').writeFileSync('server.json',JSON.stringify(s,null,2)+'\\n')\"",
|
|
72
|
+
"version:minor": "npm version minor --no-git-tag-version && node -e \"let s=require('./server.json');s.version=s.packages[0].version=require('./package.json').version;require('fs').writeFileSync('server.json',JSON.stringify(s,null,2)+'\\n')\"",
|
|
73
|
+
"version:major": "npm version major --no-git-tag-version && node -e \"let s=require('./server.json');s.version=s.packages[0].version=require('./package.json').version;require('fs').writeFileSync('server.json',JSON.stringify(s,null,2)+'\\n')\""
|
|
73
74
|
},
|
|
74
75
|
"dependencies": {
|
|
75
76
|
"@modelcontextprotocol/sdk": "^1.27.1",
|