@heznpc/imcp 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +179 -212
  2. package/dist/calendar/scripts.js +11 -8
  3. package/dist/calendar/scripts.js.map +1 -1
  4. package/dist/cli/doctor.d.ts +7 -0
  5. package/dist/cli/doctor.js +135 -0
  6. package/dist/cli/doctor.js.map +1 -0
  7. package/dist/cli/init.d.ts +8 -0
  8. package/dist/cli/init.js +145 -0
  9. package/dist/cli/init.js.map +1 -0
  10. package/dist/cross/tools.d.ts +7 -0
  11. package/dist/cross/tools.js +81 -0
  12. package/dist/cross/tools.js.map +1 -0
  13. package/dist/finder/scripts.js +3 -3
  14. package/dist/finder/tools.js +1 -1
  15. package/dist/finder/tools.js.map +1 -1
  16. package/dist/index.js +105 -22
  17. package/dist/index.js.map +1 -1
  18. package/dist/mail/scripts.d.ts +2 -0
  19. package/dist/mail/scripts.js +42 -0
  20. package/dist/mail/scripts.js.map +1 -1
  21. package/dist/mail/tools.d.ts +1 -1
  22. package/dist/mail/tools.js +45 -2
  23. package/dist/mail/tools.js.map +1 -1
  24. package/dist/messages/scripts.js +56 -19
  25. package/dist/messages/scripts.js.map +1 -1
  26. package/dist/messages/tools.d.ts +1 -1
  27. package/dist/messages/tools.js +6 -1
  28. package/dist/messages/tools.js.map +1 -1
  29. package/dist/shared/config.d.ts +23 -0
  30. package/dist/shared/config.js +112 -1
  31. package/dist/shared/config.js.map +1 -1
  32. package/dist/shared/hitl-guard.d.ts +8 -0
  33. package/dist/shared/hitl-guard.js +39 -0
  34. package/dist/shared/hitl-guard.js.map +1 -0
  35. package/dist/shared/hitl.d.ts +16 -0
  36. package/dist/shared/hitl.js +131 -0
  37. package/dist/shared/hitl.js.map +1 -0
  38. package/dist/shared/resources.d.ts +10 -1
  39. package/dist/shared/resources.js +199 -45
  40. package/dist/shared/resources.js.map +1 -1
  41. package/dist/shared/setup.d.ts +2 -1
  42. package/dist/shared/setup.js +23 -14
  43. package/dist/shared/setup.js.map +1 -1
  44. package/dist/shortcuts/prompts.d.ts +2 -0
  45. package/dist/shortcuts/prompts.js +148 -0
  46. package/dist/shortcuts/prompts.js.map +1 -0
  47. package/dist/system/scripts.js +4 -2
  48. package/dist/system/scripts.js.map +1 -1
  49. package/dist/system/tools.js +2 -2
  50. package/dist/system/tools.js.map +1 -1
  51. package/dist/tv/scripts.d.ts +6 -0
  52. package/dist/tv/scripts.js +121 -0
  53. package/dist/tv/scripts.js.map +1 -0
  54. package/dist/tv/tools.d.ts +3 -0
  55. package/dist/tv/tools.js +95 -0
  56. package/dist/tv/tools.js.map +1 -0
  57. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitl.js","sourceRoot":"","sources":["../../src/shared/hitl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAU,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmBzC,MAAM,OAAO,UAAU;IAOD;IANZ,MAAM,GAAkB,IAAI,CAAC;IAC7B,OAAO,GAAG,IAAI,GAAG,EAAoD,CAAC;IACtE,MAAM,GAAG,EAAE,CAAC;IACZ,UAAU,GAAG,KAAK,CAAC;IACnB,cAAc,GAAyB,IAAI,CAAC;IAEpD,YAAoB,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE1C,KAAK,CAAC,eAAe,CACnB,IAAY,EACZ,IAA6B,EAC7B,WAAoB,EACpB,SAAkB;QAElB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,CAAC,UAAU,eAAe,IAAI,GAAG,CAAC,CAAC;YAC5F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,OAAO,GAAgB;YAC3B,EAAE;YACF,IAAI,EAAE,cAAc;YACpB,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,SAAS;SACV,CAAC;QAEF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,aAAa,CAAC,CAAC;gBAC5E,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YAE/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,CAAC,QAAiB,EAAE,EAAE;oBAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,aAAa,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE;gBACrE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAE5B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;oBACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAa;QAC1B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,8CAA8C;QAC9C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;gBAChD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACvC,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC5B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,8BAA8B,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -1,5 +1,14 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ImcpConfig } from "./config.js";
3
+ interface DepthConfig {
4
+ notes: number;
5
+ events: number;
6
+ reminders: number;
7
+ previewLen: number;
8
+ }
2
9
  /**
3
10
  * Register MCP resources that expose live Apple data for direct client reads.
4
11
  */
5
- export declare function registerResources(server: McpServer): void;
12
+ export declare function registerResources(server: McpServer, config?: ImcpConfig): void;
13
+ export declare function buildSnapshot(enabled: (mod: string) => boolean, depth: DepthConfig | string): Promise<string>;
14
+ export {};
@@ -1,61 +1,215 @@
1
1
  import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { runJxa } from "./jxa.js";
3
- import { listEventsScript } from "../calendar/scripts.js";
3
+ import { listEventsScript, getUpcomingEventsScript } from "../calendar/scripts.js";
4
4
  import { listRemindersScript } from "../reminders/scripts.js";
5
+ import { nowPlayingScript } from "../music/scripts.js";
6
+ import { getClipboardScript, getFrontmostAppScript } from "../system/scripts.js";
7
+ import { getUnreadCountScript } from "../mail/scripts.js";
8
+ import { isModuleEnabled } from "./config.js";
9
+ const DEPTH = {
10
+ brief: { notes: 3, events: 5, reminders: 3, previewLen: 80 },
11
+ standard: { notes: 5, events: 10, reminders: 5, previewLen: 200 },
12
+ full: { notes: 15, events: 30, reminders: 15, previewLen: 500 },
13
+ };
5
14
  /**
6
15
  * Register MCP resources that expose live Apple data for direct client reads.
7
16
  */
8
- export function registerResources(server) {
9
- // ── notes://recent fixed resource: 10 most recently modified notes ──
10
- server.registerResource("recent-notes", "notes://recent", {
11
- description: "List of the 10 most recently modified Apple Notes",
17
+ export function registerResources(server, config) {
18
+ const enabled = (mod) => !config || isModuleEnabled(config, mod);
19
+ // ── Notes ──
20
+ if (enabled("notes")) {
21
+ server.registerResource("recent-notes", "notes://recent", { description: "10 most recently modified Apple Notes", mimeType: "application/json" }, async (uri) => ({
22
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(await fetchRecentNotes(10), null, 2) }],
23
+ }));
24
+ server.registerResource("recent-notes-count", new ResourceTemplate("notes://recent/{count}", { list: undefined }), { description: "Recently modified Apple Notes (max 50)", mimeType: "application/json" }, async (uri, variables) => {
25
+ const raw = Array.isArray(variables.count) ? variables.count[0] : variables.count;
26
+ const count = Math.max(1, Math.min(Number(raw) || 10, 50));
27
+ return {
28
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(await fetchRecentNotes(count), null, 2) }],
29
+ };
30
+ });
31
+ }
32
+ // ── Calendar ──
33
+ if (enabled("calendar")) {
34
+ server.registerResource("today-events", "calendar://today", { description: "Today's Apple Calendar events, sorted by start time", mimeType: "application/json" }, async (uri) => {
35
+ const today = new Date();
36
+ const start = new Date(today.getFullYear(), today.getMonth(), today.getDate()).toISOString();
37
+ const end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1).toISOString();
38
+ const result = await runJxa(listEventsScript(start, end, 999, 0));
39
+ return {
40
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result.events, null, 2) }],
41
+ };
42
+ });
43
+ server.registerResource("upcoming-events", "calendar://upcoming", { description: "Upcoming Apple Calendar events for the next 7 days", mimeType: "application/json" }, async (uri) => {
44
+ const result = await runJxa(getUpcomingEventsScript(50));
45
+ return {
46
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result.events, null, 2) }],
47
+ };
48
+ });
49
+ }
50
+ // ── Reminders ──
51
+ if (enabled("reminders")) {
52
+ server.registerResource("due-reminders", "reminders://due", { description: "Apple Reminders that are currently due or overdue", mimeType: "application/json" }, async (uri) => {
53
+ const all = await runJxa(listRemindersScript(undefined, false));
54
+ const now = new Date();
55
+ const due = all
56
+ .filter((r) => r.dueDate && new Date(r.dueDate) <= now)
57
+ .sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
58
+ return {
59
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(due, null, 2) }],
60
+ };
61
+ });
62
+ server.registerResource("today-reminders", "reminders://today", { description: "Apple Reminders due today (incomplete only)", mimeType: "application/json" }, async (uri) => {
63
+ const all = await runJxa(listRemindersScript(undefined, false));
64
+ const today = new Date();
65
+ const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();
66
+ const endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1).getTime();
67
+ const todayItems = all.filter((r) => {
68
+ if (!r.dueDate)
69
+ return false;
70
+ const t = new Date(r.dueDate).getTime();
71
+ return t >= startOfDay && t < endOfDay;
72
+ });
73
+ return {
74
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(todayItems, null, 2) }],
75
+ };
76
+ });
77
+ }
78
+ // ── Music ──
79
+ if (enabled("music")) {
80
+ server.registerResource("now-playing", "music://now-playing", { description: "Currently playing track in Apple Music", mimeType: "application/json" }, async (uri) => {
81
+ const result = await runJxa(nowPlayingScript());
82
+ return {
83
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result, null, 2) }],
84
+ };
85
+ });
86
+ }
87
+ // ── System ──
88
+ if (enabled("system")) {
89
+ server.registerResource("clipboard", "system://clipboard", { description: "Current macOS clipboard contents", mimeType: "application/json" }, async (uri) => {
90
+ const result = await runJxa(getClipboardScript());
91
+ return {
92
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result, null, 2) }],
93
+ };
94
+ });
95
+ }
96
+ // ── Mail ──
97
+ if (enabled("mail")) {
98
+ server.registerResource("unread-mail", "mail://unread", { description: "Unread email count across all mailboxes", mimeType: "application/json" }, async (uri) => {
99
+ const result = await runJxa(getUnreadCountScript());
100
+ return {
101
+ contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result, null, 2) }],
102
+ };
103
+ });
104
+ }
105
+ // ── Context Snapshot ──
106
+ server.registerResource("context-snapshot", "context://snapshot", {
107
+ description: "Unified context from all enabled Apple apps — calendar, reminders, notes, mail, music, system — in a single read. Default depth: standard.",
12
108
  mimeType: "application/json",
13
- }, async (uri) => {
14
- const notes = await fetchRecentNotes(10);
15
- return {
16
- contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(notes, null, 2) }],
17
- };
18
- });
19
- // ── notes://recent/{count} — template: configurable count ──
20
- server.registerResource("recent-notes-count", new ResourceTemplate("notes://recent/{count}", { list: undefined }), {
21
- description: "List of recently modified Apple Notes. Use {count} to control how many are returned (max 50).",
109
+ }, async (uri) => ({
110
+ contents: [{ uri: uri.href, mimeType: "application/json", text: await buildSnapshot(enabled, DEPTH.standard) }],
111
+ }));
112
+ server.registerResource("context-snapshot-depth", new ResourceTemplate("context://snapshot/{depth}", { list: undefined }), {
113
+ description: "Unified context snapshot with configurable depth: brief (~500 tokens), standard (~2-4k), full (~5k+).",
22
114
  mimeType: "application/json",
23
115
  }, async (uri, variables) => {
24
- const raw = Array.isArray(variables.count) ? variables.count[0] : variables.count;
25
- const count = Math.max(1, Math.min(Number(raw) || 10, 50));
26
- const notes = await fetchRecentNotes(count);
27
- return {
28
- contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(notes, null, 2) }],
29
- };
30
- });
31
- // ── calendar://today — today's calendar events (reuses listEventsScript) ──
32
- server.registerResource("today-events", "calendar://today", {
33
- description: "Today's Apple Calendar events, sorted by start time",
34
- mimeType: "application/json",
35
- }, async (uri) => {
36
- const today = new Date();
37
- const start = new Date(today.getFullYear(), today.getMonth(), today.getDate()).toISOString();
38
- const end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1).toISOString();
39
- const result = await runJxa(listEventsScript(start, end, 999, 0));
40
- return {
41
- contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(result.events, null, 2) }],
42
- };
43
- });
44
- // ── reminders://due — currently due or overdue reminders (reuses listRemindersScript) ──
45
- server.registerResource("due-reminders", "reminders://due", {
46
- description: "Apple Reminders that are currently due or overdue",
47
- mimeType: "application/json",
48
- }, async (uri) => {
49
- const all = await runJxa(listRemindersScript(undefined, false));
50
- const now = new Date();
51
- const due = all
52
- .filter((r) => r.dueDate && new Date(r.dueDate) <= now)
53
- .sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
116
+ const raw = (Array.isArray(variables.depth) ? variables.depth[0] : variables.depth);
117
+ const dc = DEPTH[raw] ?? DEPTH.standard;
54
118
  return {
55
- contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(due, null, 2) }],
119
+ contents: [{ uri: uri.href, mimeType: "application/json", text: await buildSnapshot(enabled, dc) }],
56
120
  };
57
121
  });
58
122
  }
123
+ export async function buildSnapshot(enabled, depth) {
124
+ const dc = typeof depth === "string" ? (DEPTH[depth] ?? DEPTH.standard) : depth;
125
+ const depthName = dc === DEPTH.brief ? "brief" : dc === DEPTH.full ? "full" : "standard";
126
+ // Build parallel fetchers for each enabled module
127
+ const tasks = [];
128
+ if (enabled("calendar")) {
129
+ tasks.push({
130
+ key: "calendar",
131
+ promise: (async () => {
132
+ const today = new Date();
133
+ const start = new Date(today.getFullYear(), today.getMonth(), today.getDate()).toISOString();
134
+ const end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1).toISOString();
135
+ const result = await runJxa(listEventsScript(start, end, dc.events, 0));
136
+ return { todayCount: result.events.length, events: result.events.slice(0, dc.events) };
137
+ })(),
138
+ });
139
+ }
140
+ if (enabled("reminders")) {
141
+ tasks.push({
142
+ key: "reminders",
143
+ promise: (async () => {
144
+ const all = await runJxa(listRemindersScript(undefined, false));
145
+ const now = new Date();
146
+ const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
147
+ const tomorrow = new Date(today.getTime() + 86400000);
148
+ const overdue = all.filter((r) => r.dueDate && new Date(r.dueDate) < today);
149
+ const dueToday = all.filter((r) => {
150
+ if (!r.dueDate)
151
+ return false;
152
+ const t = new Date(r.dueDate).getTime();
153
+ return t >= today.getTime() && t < tomorrow.getTime();
154
+ });
155
+ return {
156
+ overdueCount: overdue.length,
157
+ dueTodayCount: dueToday.length,
158
+ totalIncomplete: all.length,
159
+ overdue: overdue.slice(0, dc.reminders),
160
+ dueToday: dueToday.slice(0, dc.reminders),
161
+ };
162
+ })(),
163
+ });
164
+ }
165
+ if (enabled("notes")) {
166
+ tasks.push({
167
+ key: "notes",
168
+ promise: (async () => {
169
+ const notes = await fetchRecentNotes(dc.notes);
170
+ return {
171
+ recentCount: notes.length,
172
+ notes: notes.map((n) => ({ ...n, preview: n.preview.substring(0, dc.previewLen) })),
173
+ };
174
+ })(),
175
+ });
176
+ }
177
+ if (enabled("mail")) {
178
+ tasks.push({
179
+ key: "mail",
180
+ promise: runJxa(getUnreadCountScript()),
181
+ });
182
+ }
183
+ if (enabled("music")) {
184
+ tasks.push({
185
+ key: "music",
186
+ promise: runJxa(nowPlayingScript()).catch(() => ({ playerState: "unavailable" })),
187
+ });
188
+ }
189
+ if (enabled("system")) {
190
+ tasks.push({
191
+ key: "system",
192
+ promise: (async () => {
193
+ const [clipboard, frontApp] = await Promise.all([
194
+ runJxa(getClipboardScript()).catch(() => null),
195
+ runJxa(getFrontmostAppScript()).catch(() => null),
196
+ ]);
197
+ return { clipboard, frontmostApp: frontApp };
198
+ })(),
199
+ });
200
+ }
201
+ // Execute all in parallel
202
+ const results = await Promise.allSettled(tasks.map((t) => t.promise));
203
+ const snapshot = {
204
+ timestamp: new Date().toISOString(),
205
+ depth: depthName,
206
+ };
207
+ for (let i = 0; i < tasks.length; i++) {
208
+ const r = results[i];
209
+ snapshot[tasks[i].key] = r.status === "fulfilled" ? r.value : { error: "unavailable" };
210
+ }
211
+ return JSON.stringify(snapshot, null, 2);
212
+ }
59
213
  async function fetchRecentNotes(count) {
60
214
  return runJxa(`
61
215
  const Notes = Application('Notes');
@@ -1 +1 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/shared/resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/shared/resources.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerSetupTools(server: McpServer): void;
2
+ import { ImcpConfig } from "./config.js";
3
+ export declare function registerSetupTools(server: McpServer, config?: ImcpConfig): void;
@@ -1,18 +1,22 @@
1
1
  import { runJxa } from "./jxa.js";
2
2
  import { ok } from "./result.js";
3
- const APPS = [
4
- { name: "Notes", script: "const Notes = Application('Notes'); JSON.stringify({app: 'Notes', accessible: true});" },
5
- { name: "Reminders", script: "const Reminders = Application('Reminders'); JSON.stringify({app: 'Reminders', accessible: true});" },
6
- { name: "Calendar", script: "const Calendar = Application('Calendar'); JSON.stringify({app: 'Calendar', accessible: true});" },
7
- { name: "Contacts", script: "const Contacts = Application('Contacts'); JSON.stringify({app: 'Contacts', accessible: true});" },
8
- { name: "Mail", script: "const Mail = Application('Mail'); JSON.stringify({app: 'Mail', accessible: true});" },
9
- { name: "Music", script: "const Music = Application('Music'); JSON.stringify({app: 'Music', accessible: true});" },
10
- { name: "Finder", script: "const Finder = Application('Finder'); JSON.stringify({app: 'Finder', accessible: true});" },
11
- { name: "Safari", script: "const Safari = Application('Safari'); JSON.stringify({app: 'Safari', accessible: true});" },
12
- { name: "System Events", script: "const SE = Application('System Events'); JSON.stringify({app: 'System Events', accessible: true});" },
13
- { name: "Photos", script: "const Photos = Application('Photos'); JSON.stringify({app: 'Photos', accessible: true});" },
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});" },
17
+ { module: "tv", name: "TV", script: "const TV = Application('TV'); JSON.stringify({app: 'TV', accessible: true});" },
14
18
  ];
15
- export function registerSetupTools(server) {
19
+ export function registerSetupTools(server, config) {
16
20
  server.registerTool("setup_permissions", {
17
21
  title: "Setup Permissions",
18
22
  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 +28,12 @@ export function registerSetupTools(server) {
24
28
  openWorldHint: false,
25
29
  },
26
30
  }, async () => {
31
+ // Only probe apps for enabled modules
32
+ const apps = config
33
+ ? MODULE_APP_MAP.filter((a) => isModuleEnabled(config, a.module))
34
+ : MODULE_APP_MAP;
27
35
  const results = [];
28
- for (const app of APPS) {
36
+ for (const app of apps) {
29
37
  try {
30
38
  await runJxa(app.script);
31
39
  results.push({ app: app.name, status: "granted" });
@@ -38,7 +46,8 @@ export function registerSetupTools(server) {
38
46
  }
39
47
  }
40
48
  const granted = results.filter((r) => r.status === "granted").length;
41
- return ok({ total: APPS.length, granted, results });
49
+ const skipped = MODULE_APP_MAP.length - apps.length;
50
+ return ok({ total: apps.length, granted, skipped, results });
42
51
  });
43
52
  }
44
53
  //# sourceMappingURL=setup.js.map
@@ -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;AAEjC,MAAM,IAAI,GAAG;IACX,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,uFAAuF,EAAE;IAClH,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,mGAAmG,EAAE;IAClI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gGAAgG,EAAE;IAC9H,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gGAAgG,EAAE;IAC9H,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,oFAAoF,EAAE;IAC9G,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,uFAAuF,EAAE;IAClH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,0FAA0F,EAAE;IACtH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,0FAA0F,EAAE;IACtH,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,oGAAoG,EAAE;IACvI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,0FAA0F,EAAE;CACvH,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,6LAA6L;QAC/L,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAA2C,EAAE,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,MAAM,EAAE,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACrE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/shared/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerShortcutPrompts(server: McpServer): void;
@@ -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"}
@@ -4,8 +4,10 @@ export function getClipboardScript() {
4
4
  return `
5
5
  const app = Application.currentApplication();
6
6
  app.includeStandardAdditions = true;
7
- const text = app.theClipboard();
8
- JSON.stringify({content: String(text)});
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;;;;;GAKN,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"}
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"}
@@ -87,7 +87,7 @@ export function registerSystemTools(server, _config) {
87
87
  annotations: {
88
88
  readOnlyHint: false,
89
89
  destructiveHint: false,
90
- idempotentHint: false,
90
+ idempotentHint: true,
91
91
  openWorldHint: false,
92
92
  },
93
93
  }, async () => {
@@ -183,7 +183,7 @@ export function registerSystemTools(server, _config) {
183
183
  region: z.enum(["fullscreen", "window", "selection"]).optional().default("fullscreen").describe("Capture region: fullscreen (default), window, or selection"),
184
184
  },
185
185
  annotations: {
186
- readOnlyHint: false,
186
+ readOnlyHint: true,
187
187
  destructiveHint: false,
188
188
  idempotentHint: false,
189
189
  openWorldHint: false,