@diskd-ai/email-mcp 0.3.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 (295) hide show
  1. package/LICENSE +155 -0
  2. package/README.md +820 -0
  3. package/dist/cli/account-commands.d.ts +10 -0
  4. package/dist/cli/account-commands.d.ts.map +1 -0
  5. package/dist/cli/account-commands.js +703 -0
  6. package/dist/cli/account-commands.js.map +1 -0
  7. package/dist/cli/config-commands.d.ts +9 -0
  8. package/dist/cli/config-commands.d.ts.map +1 -0
  9. package/dist/cli/config-commands.js +156 -0
  10. package/dist/cli/config-commands.js.map +1 -0
  11. package/dist/cli/guard.d.ts +11 -0
  12. package/dist/cli/guard.d.ts.map +1 -0
  13. package/dist/cli/guard.js +18 -0
  14. package/dist/cli/guard.js.map +1 -0
  15. package/dist/cli/install-commands.d.ts +12 -0
  16. package/dist/cli/install-commands.d.ts.map +1 -0
  17. package/dist/cli/install-commands.js +320 -0
  18. package/dist/cli/install-commands.js.map +1 -0
  19. package/dist/cli/notify.d.ts +8 -0
  20. package/dist/cli/notify.d.ts.map +1 -0
  21. package/dist/cli/notify.js +143 -0
  22. package/dist/cli/notify.js.map +1 -0
  23. package/dist/cli/providers.d.ts +13 -0
  24. package/dist/cli/providers.d.ts.map +1 -0
  25. package/dist/cli/providers.js +180 -0
  26. package/dist/cli/providers.js.map +1 -0
  27. package/dist/cli/scheduler.d.ts +8 -0
  28. package/dist/cli/scheduler.d.ts.map +1 -0
  29. package/dist/cli/scheduler.js +268 -0
  30. package/dist/cli/scheduler.js.map +1 -0
  31. package/dist/cli/setup.d.ts +12 -0
  32. package/dist/cli/setup.d.ts.map +1 -0
  33. package/dist/cli/setup.js +15 -0
  34. package/dist/cli/setup.js.map +1 -0
  35. package/dist/cli/test.d.ts +7 -0
  36. package/dist/cli/test.d.ts.map +1 -0
  37. package/dist/cli/test.js +67 -0
  38. package/dist/cli/test.js.map +1 -0
  39. package/dist/config/loader.d.ts +34 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +339 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/schema.d.ts +351 -0
  44. package/dist/config/schema.d.ts.map +1 -0
  45. package/dist/config/schema.js +165 -0
  46. package/dist/config/schema.js.map +1 -0
  47. package/dist/config/xdg.d.ts +27 -0
  48. package/dist/config/xdg.d.ts.map +1 -0
  49. package/dist/config/xdg.js +30 -0
  50. package/dist/config/xdg.js.map +1 -0
  51. package/dist/connections/manager.d.ts +42 -0
  52. package/dist/connections/manager.d.ts.map +1 -0
  53. package/dist/connections/manager.js +266 -0
  54. package/dist/connections/manager.js.map +1 -0
  55. package/dist/connections/types.d.ts +13 -0
  56. package/dist/connections/types.d.ts.map +1 -0
  57. package/dist/connections/types.js +2 -0
  58. package/dist/connections/types.js.map +1 -0
  59. package/dist/logging.d.ts +46 -0
  60. package/dist/logging.d.ts.map +1 -0
  61. package/dist/logging.js +63 -0
  62. package/dist/logging.js.map +1 -0
  63. package/dist/main.d.ts +13 -0
  64. package/dist/main.d.ts.map +1 -0
  65. package/dist/main.js +206 -0
  66. package/dist/main.js.map +1 -0
  67. package/dist/prompts/actions.prompt.d.ts +9 -0
  68. package/dist/prompts/actions.prompt.d.ts.map +1 -0
  69. package/dist/prompts/actions.prompt.js +64 -0
  70. package/dist/prompts/actions.prompt.js.map +1 -0
  71. package/dist/prompts/calendar.prompt.d.ts +9 -0
  72. package/dist/prompts/calendar.prompt.d.ts.map +1 -0
  73. package/dist/prompts/calendar.prompt.js +55 -0
  74. package/dist/prompts/calendar.prompt.js.map +1 -0
  75. package/dist/prompts/cleanup.prompt.d.ts +9 -0
  76. package/dist/prompts/cleanup.prompt.d.ts.map +1 -0
  77. package/dist/prompts/cleanup.prompt.js +78 -0
  78. package/dist/prompts/cleanup.prompt.js.map +1 -0
  79. package/dist/prompts/compose.prompt.d.ts +8 -0
  80. package/dist/prompts/compose.prompt.d.ts.map +1 -0
  81. package/dist/prompts/compose.prompt.js +116 -0
  82. package/dist/prompts/compose.prompt.js.map +1 -0
  83. package/dist/prompts/register.d.ts +8 -0
  84. package/dist/prompts/register.d.ts.map +1 -0
  85. package/dist/prompts/register.js +20 -0
  86. package/dist/prompts/register.js.map +1 -0
  87. package/dist/prompts/thread.prompt.d.ts +9 -0
  88. package/dist/prompts/thread.prompt.d.ts.map +1 -0
  89. package/dist/prompts/thread.prompt.js +58 -0
  90. package/dist/prompts/thread.prompt.js.map +1 -0
  91. package/dist/prompts/triage.prompt.d.ts +9 -0
  92. package/dist/prompts/triage.prompt.d.ts.map +1 -0
  93. package/dist/prompts/triage.prompt.js +64 -0
  94. package/dist/prompts/triage.prompt.js.map +1 -0
  95. package/dist/resources/accounts.resource.d.ts +9 -0
  96. package/dist/resources/accounts.resource.d.ts.map +1 -0
  97. package/dist/resources/accounts.resource.js +26 -0
  98. package/dist/resources/accounts.resource.js.map +1 -0
  99. package/dist/resources/mailboxes.resource.d.ts +10 -0
  100. package/dist/resources/mailboxes.resource.d.ts.map +1 -0
  101. package/dist/resources/mailboxes.resource.js +33 -0
  102. package/dist/resources/mailboxes.resource.js.map +1 -0
  103. package/dist/resources/register.d.ts +12 -0
  104. package/dist/resources/register.d.ts.map +1 -0
  105. package/dist/resources/register.js +20 -0
  106. package/dist/resources/register.js.map +1 -0
  107. package/dist/resources/scheduled.resource.d.ts +9 -0
  108. package/dist/resources/scheduled.resource.d.ts.map +1 -0
  109. package/dist/resources/scheduled.resource.js +31 -0
  110. package/dist/resources/scheduled.resource.js.map +1 -0
  111. package/dist/resources/stats.resource.d.ts +10 -0
  112. package/dist/resources/stats.resource.d.ts.map +1 -0
  113. package/dist/resources/stats.resource.js +45 -0
  114. package/dist/resources/stats.resource.js.map +1 -0
  115. package/dist/resources/templates.resource.d.ts +9 -0
  116. package/dist/resources/templates.resource.d.ts.map +1 -0
  117. package/dist/resources/templates.resource.js +34 -0
  118. package/dist/resources/templates.resource.js.map +1 -0
  119. package/dist/resources/unread.resource.d.ts +11 -0
  120. package/dist/resources/unread.resource.d.ts.map +1 -0
  121. package/dist/resources/unread.resource.js +46 -0
  122. package/dist/resources/unread.resource.js.map +1 -0
  123. package/dist/safety/audit.d.ts +17 -0
  124. package/dist/safety/audit.d.ts.map +1 -0
  125. package/dist/safety/audit.js +50 -0
  126. package/dist/safety/audit.js.map +1 -0
  127. package/dist/safety/rate-limiter.d.ts +22 -0
  128. package/dist/safety/rate-limiter.d.ts.map +1 -0
  129. package/dist/safety/rate-limiter.js +52 -0
  130. package/dist/safety/rate-limiter.js.map +1 -0
  131. package/dist/safety/validation.d.ts +44 -0
  132. package/dist/safety/validation.d.ts.map +1 -0
  133. package/dist/safety/validation.js +113 -0
  134. package/dist/safety/validation.js.map +1 -0
  135. package/dist/server.d.ts +10 -0
  136. package/dist/server.d.ts.map +1 -0
  137. package/dist/server.js +25 -0
  138. package/dist/server.js.map +1 -0
  139. package/dist/services/calendar.service.d.ts +22 -0
  140. package/dist/services/calendar.service.d.ts.map +1 -0
  141. package/dist/services/calendar.service.js +115 -0
  142. package/dist/services/calendar.service.js.map +1 -0
  143. package/dist/services/event-bus.d.ts +28 -0
  144. package/dist/services/event-bus.d.ts.map +1 -0
  145. package/dist/services/event-bus.js +16 -0
  146. package/dist/services/event-bus.js.map +1 -0
  147. package/dist/services/hooks.service.d.ts +77 -0
  148. package/dist/services/hooks.service.d.ts.map +1 -0
  149. package/dist/services/hooks.service.js +498 -0
  150. package/dist/services/hooks.service.js.map +1 -0
  151. package/dist/services/imap.service.d.ts +133 -0
  152. package/dist/services/imap.service.d.ts.map +1 -0
  153. package/dist/services/imap.service.js +1393 -0
  154. package/dist/services/imap.service.js.map +1 -0
  155. package/dist/services/label-strategy.d.ts +20 -0
  156. package/dist/services/label-strategy.d.ts.map +1 -0
  157. package/dist/services/label-strategy.js +237 -0
  158. package/dist/services/label-strategy.js.map +1 -0
  159. package/dist/services/local-calendar.service.d.ts +126 -0
  160. package/dist/services/local-calendar.service.d.ts.map +1 -0
  161. package/dist/services/local-calendar.service.js +428 -0
  162. package/dist/services/local-calendar.service.js.map +1 -0
  163. package/dist/services/notifier.service.d.ts +69 -0
  164. package/dist/services/notifier.service.d.ts.map +1 -0
  165. package/dist/services/notifier.service.js +319 -0
  166. package/dist/services/notifier.service.js.map +1 -0
  167. package/dist/services/oauth.service.d.ts +47 -0
  168. package/dist/services/oauth.service.d.ts.map +1 -0
  169. package/dist/services/oauth.service.js +140 -0
  170. package/dist/services/oauth.service.js.map +1 -0
  171. package/dist/services/presets.d.ts +36 -0
  172. package/dist/services/presets.d.ts.map +1 -0
  173. package/dist/services/presets.js +173 -0
  174. package/dist/services/presets.js.map +1 -0
  175. package/dist/services/reminders.service.d.ts +63 -0
  176. package/dist/services/reminders.service.d.ts.map +1 -0
  177. package/dist/services/reminders.service.js +281 -0
  178. package/dist/services/reminders.service.js.map +1 -0
  179. package/dist/services/scheduler.service.d.ts +42 -0
  180. package/dist/services/scheduler.service.d.ts.map +1 -0
  181. package/dist/services/scheduler.service.js +260 -0
  182. package/dist/services/scheduler.service.js.map +1 -0
  183. package/dist/services/smtp.service.d.ts +40 -0
  184. package/dist/services/smtp.service.d.ts.map +1 -0
  185. package/dist/services/smtp.service.js +151 -0
  186. package/dist/services/smtp.service.js.map +1 -0
  187. package/dist/services/template.service.d.ts +33 -0
  188. package/dist/services/template.service.d.ts.map +1 -0
  189. package/dist/services/template.service.js +123 -0
  190. package/dist/services/template.service.js.map +1 -0
  191. package/dist/services/watcher.service.d.ts +36 -0
  192. package/dist/services/watcher.service.d.ts.map +1 -0
  193. package/dist/services/watcher.service.js +241 -0
  194. package/dist/services/watcher.service.js.map +1 -0
  195. package/dist/tools/accounts.tool.d.ts +7 -0
  196. package/dist/tools/accounts.tool.d.ts.map +1 -0
  197. package/dist/tools/accounts.tool.js +29 -0
  198. package/dist/tools/accounts.tool.js.map +1 -0
  199. package/dist/tools/analytics.tool.d.ts +9 -0
  200. package/dist/tools/analytics.tool.d.ts.map +1 -0
  201. package/dist/tools/analytics.tool.js +27 -0
  202. package/dist/tools/analytics.tool.js.map +1 -0
  203. package/dist/tools/attachments.tool.d.ts +7 -0
  204. package/dist/tools/attachments.tool.d.ts.map +1 -0
  205. package/dist/tools/attachments.tool.js +45 -0
  206. package/dist/tools/attachments.tool.js.map +1 -0
  207. package/dist/tools/bulk.tool.d.ts +7 -0
  208. package/dist/tools/bulk.tool.d.ts.map +1 -0
  209. package/dist/tools/bulk.tool.js +75 -0
  210. package/dist/tools/bulk.tool.js.map +1 -0
  211. package/dist/tools/calendar.tool.d.ts +19 -0
  212. package/dist/tools/calendar.tool.d.ts.map +1 -0
  213. package/dist/tools/calendar.tool.js +538 -0
  214. package/dist/tools/calendar.tool.js.map +1 -0
  215. package/dist/tools/contacts.tool.d.ts +7 -0
  216. package/dist/tools/contacts.tool.d.ts.map +1 -0
  217. package/dist/tools/contacts.tool.js +44 -0
  218. package/dist/tools/contacts.tool.js.map +1 -0
  219. package/dist/tools/drafts.tool.d.ts +8 -0
  220. package/dist/tools/drafts.tool.d.ts.map +1 -0
  221. package/dist/tools/drafts.tool.js +92 -0
  222. package/dist/tools/drafts.tool.js.map +1 -0
  223. package/dist/tools/emails.tool.d.ts +7 -0
  224. package/dist/tools/emails.tool.d.ts.map +1 -0
  225. package/dist/tools/emails.tool.js +400 -0
  226. package/dist/tools/emails.tool.js.map +1 -0
  227. package/dist/tools/folders.tool.d.ts +7 -0
  228. package/dist/tools/folders.tool.d.ts.map +1 -0
  229. package/dist/tools/folders.tool.js +111 -0
  230. package/dist/tools/folders.tool.js.map +1 -0
  231. package/dist/tools/health.tool.d.ts +10 -0
  232. package/dist/tools/health.tool.d.ts.map +1 -0
  233. package/dist/tools/health.tool.js +78 -0
  234. package/dist/tools/health.tool.js.map +1 -0
  235. package/dist/tools/label.tool.d.ts +11 -0
  236. package/dist/tools/label.tool.d.ts.map +1 -0
  237. package/dist/tools/label.tool.js +165 -0
  238. package/dist/tools/label.tool.js.map +1 -0
  239. package/dist/tools/locate.tool.d.ts +11 -0
  240. package/dist/tools/locate.tool.d.ts.map +1 -0
  241. package/dist/tools/locate.tool.js +59 -0
  242. package/dist/tools/locate.tool.js.map +1 -0
  243. package/dist/tools/mailboxes.tool.d.ts +7 -0
  244. package/dist/tools/mailboxes.tool.d.ts.map +1 -0
  245. package/dist/tools/mailboxes.tool.js +38 -0
  246. package/dist/tools/mailboxes.tool.js.map +1 -0
  247. package/dist/tools/manage.tool.d.ts +7 -0
  248. package/dist/tools/manage.tool.d.ts.map +1 -0
  249. package/dist/tools/manage.tool.js +125 -0
  250. package/dist/tools/manage.tool.js.map +1 -0
  251. package/dist/tools/register.d.ts +20 -0
  252. package/dist/tools/register.d.ts.map +1 -0
  253. package/dist/tools/register.js +53 -0
  254. package/dist/tools/register.js.map +1 -0
  255. package/dist/tools/scheduler.tool.d.ts +9 -0
  256. package/dist/tools/scheduler.tool.d.ts.map +1 -0
  257. package/dist/tools/scheduler.tool.js +104 -0
  258. package/dist/tools/scheduler.tool.js.map +1 -0
  259. package/dist/tools/send.tool.d.ts +7 -0
  260. package/dist/tools/send.tool.d.ts.map +1 -0
  261. package/dist/tools/send.tool.js +123 -0
  262. package/dist/tools/send.tool.js.map +1 -0
  263. package/dist/tools/templates.tool.d.ts +12 -0
  264. package/dist/tools/templates.tool.d.ts.map +1 -0
  265. package/dist/tools/templates.tool.js +140 -0
  266. package/dist/tools/templates.tool.js.map +1 -0
  267. package/dist/tools/thread.tool.d.ts +10 -0
  268. package/dist/tools/thread.tool.d.ts.map +1 -0
  269. package/dist/tools/thread.tool.js +146 -0
  270. package/dist/tools/thread.tool.js.map +1 -0
  271. package/dist/tools/watcher.tool.d.ts +9 -0
  272. package/dist/tools/watcher.tool.d.ts.map +1 -0
  273. package/dist/tools/watcher.tool.js +282 -0
  274. package/dist/tools/watcher.tool.js.map +1 -0
  275. package/dist/types/index.d.ts +271 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +5 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/calendar-notes.d.ts +31 -0
  280. package/dist/utils/calendar-notes.d.ts.map +1 -0
  281. package/dist/utils/calendar-notes.js +99 -0
  282. package/dist/utils/calendar-notes.js.map +1 -0
  283. package/dist/utils/calendar-state.d.ts +27 -0
  284. package/dist/utils/calendar-state.d.ts.map +1 -0
  285. package/dist/utils/calendar-state.js +85 -0
  286. package/dist/utils/calendar-state.js.map +1 -0
  287. package/dist/utils/conference-details.d.ts +12 -0
  288. package/dist/utils/conference-details.d.ts.map +1 -0
  289. package/dist/utils/conference-details.js +71 -0
  290. package/dist/utils/conference-details.js.map +1 -0
  291. package/dist/utils/meeting-url.d.ts +10 -0
  292. package/dist/utils/meeting-url.d.ts.map +1 -0
  293. package/dist/utils/meeting-url.js +30 -0
  294. package/dist/utils/meeting-url.js.map +1 -0
  295. package/package.json +108 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * IMAP IDLE Watcher — real-time email monitoring.
3
+ *
4
+ * Maintains dedicated IMAP connections per account using IDLE to detect
5
+ * new emails in real-time. Emits events on the shared event bus.
6
+ *
7
+ * Key design decisions:
8
+ * - Separate ImapFlow connections from ConnectionManager (IDLE holds lock)
9
+ * - Auto-reconnect with exponential backoff on connection failures
10
+ * - Tracks last-seen UID per folder to detect genuinely new messages
11
+ */
12
+ import type { AccountConfig, WatcherConfig } from '../types/index.js';
13
+ export interface WatcherStatus {
14
+ account: string;
15
+ folder: string;
16
+ connected: boolean;
17
+ lastSeenUid: number;
18
+ }
19
+ export default class WatcherService {
20
+ private idleStates;
21
+ private config;
22
+ private accounts;
23
+ constructor(config: WatcherConfig, accounts: AccountConfig[]);
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ getStatus(): WatcherStatus[];
27
+ private static stateKey;
28
+ private updateState;
29
+ private startIdle;
30
+ private connectIdle;
31
+ private scheduleReconnect;
32
+ private handleNewEmails;
33
+ private static buildEmailMeta;
34
+ private static hasAttachments;
35
+ }
36
+ //# sourceMappingURL=watcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.service.d.ts","sourceRoot":"","sources":["../../src/services/watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAa,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAkBjF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAuBD,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,UAAU,CAAgC;IAElD,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE;IAKtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,aAAa,EAAE;IAa5B,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,WAAW;YASL,SAAS;YAeT,WAAW;IAuEzB,OAAO,CAAC,iBAAiB;YAuBX,eAAe;IAiD7B,OAAO,CAAC,MAAM,CAAC,cAAc;IA+B7B,OAAO,CAAC,MAAM,CAAC,cAAc;CAM9B"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * IMAP IDLE Watcher — real-time email monitoring.
3
+ *
4
+ * Maintains dedicated IMAP connections per account using IDLE to detect
5
+ * new emails in real-time. Emits events on the shared event bus.
6
+ *
7
+ * Key design decisions:
8
+ * - Separate ImapFlow connections from ConnectionManager (IDLE holds lock)
9
+ * - Auto-reconnect with exponential backoff on connection failures
10
+ * - Tracks last-seen UID per folder to detect genuinely new messages
11
+ */
12
+ import { ImapFlow } from 'imapflow';
13
+ import { mcpLog } from '../logging.js';
14
+ import eventBus from './event-bus.js';
15
+ // ---------------------------------------------------------------------------
16
+ // System flags excluded from label extraction
17
+ // ---------------------------------------------------------------------------
18
+ const SYSTEM_FLAGS = new Set([
19
+ '\\Seen',
20
+ '\\Answered',
21
+ '\\Flagged',
22
+ '\\Deleted',
23
+ '\\Draft',
24
+ '\\Recent',
25
+ '\\*',
26
+ ]);
27
+ // ---------------------------------------------------------------------------
28
+ // WatcherService
29
+ // ---------------------------------------------------------------------------
30
+ const MAX_BACKOFF_MS = 60_000;
31
+ const INITIAL_BACKOFF_MS = 1_000;
32
+ export default class WatcherService {
33
+ idleStates = new Map();
34
+ config;
35
+ accounts;
36
+ constructor(config, accounts) {
37
+ this.config = config;
38
+ this.accounts = accounts;
39
+ }
40
+ async start() {
41
+ if (!this.config.enabled)
42
+ return;
43
+ const { folders } = this.config;
44
+ const startOps = [];
45
+ this.accounts.forEach((account) => {
46
+ folders.forEach((folder) => {
47
+ startOps.push(this.startIdle(account, folder));
48
+ });
49
+ });
50
+ await Promise.allSettled(startOps);
51
+ }
52
+ async stop() {
53
+ const stopOps = [...this.idleStates.values()].map(async (state) => {
54
+ this.updateState(WatcherService.stateKey(state), { stopped: true });
55
+ if (state.reconnectTimer)
56
+ clearTimeout(state.reconnectTimer);
57
+ try {
58
+ state.lock?.release();
59
+ if (state.client)
60
+ await state.client.logout();
61
+ }
62
+ catch {
63
+ /* ignore */
64
+ }
65
+ });
66
+ await Promise.allSettled(stopOps);
67
+ this.idleStates.clear();
68
+ }
69
+ getStatus() {
70
+ return [...this.idleStates.values()].map((state) => ({
71
+ account: state.account.name,
72
+ folder: state.folder,
73
+ connected: state.client?.usable === true,
74
+ lastSeenUid: state.lastSeenUid,
75
+ }));
76
+ }
77
+ // -------------------------------------------------------------------------
78
+ // State helpers (avoid param reassignment)
79
+ // -------------------------------------------------------------------------
80
+ static stateKey(state) {
81
+ return `${state.account.name}:${state.folder}`;
82
+ }
83
+ updateState(key, updates) {
84
+ const state = this.idleStates.get(key);
85
+ if (state)
86
+ Object.assign(state, updates);
87
+ }
88
+ // -------------------------------------------------------------------------
89
+ // IDLE connection lifecycle
90
+ // -------------------------------------------------------------------------
91
+ async startIdle(account, folder) {
92
+ const key = `${account.name}:${folder}`;
93
+ this.idleStates.set(key, {
94
+ client: null,
95
+ account,
96
+ folder,
97
+ lastSeenUid: 0,
98
+ lock: null,
99
+ reconnectTimer: null,
100
+ backoffMs: INITIAL_BACKOFF_MS,
101
+ stopped: false,
102
+ });
103
+ await this.connectIdle(key);
104
+ }
105
+ async connectIdle(key) {
106
+ const state = this.idleStates.get(key);
107
+ if (!state || state.stopped)
108
+ return;
109
+ try {
110
+ const auth = state.account.oauth2
111
+ ? { user: state.account.username, accessToken: state.account.password }
112
+ : { user: state.account.username, pass: state.account.password };
113
+ const client = new ImapFlow({
114
+ host: state.account.imap.host,
115
+ port: state.account.imap.port,
116
+ secure: state.account.imap.tls,
117
+ tls: { rejectUnauthorized: state.account.imap.verifySsl },
118
+ auth,
119
+ logger: false,
120
+ maxIdleTime: this.config.idleTimeout * 1000,
121
+ });
122
+ await client.connect();
123
+ const lock = await client.getMailboxLock(state.folder);
124
+ const { mailbox } = client;
125
+ const uidNext = mailbox && typeof mailbox === 'object'
126
+ ? (mailbox.uidNext ?? 1)
127
+ : 1;
128
+ this.updateState(key, {
129
+ client,
130
+ lock,
131
+ lastSeenUid: uidNext - 1,
132
+ backoffMs: INITIAL_BACKOFF_MS,
133
+ });
134
+ // Listen for new messages
135
+ client.on('exists', (data) => {
136
+ if (data.count > data.prevCount) {
137
+ this.handleNewEmails(key).catch(() => { });
138
+ }
139
+ });
140
+ // Auto-reconnect on close
141
+ client.on('close', () => {
142
+ this.updateState(key, { lock: null, client: null });
143
+ const current = this.idleStates.get(key);
144
+ if (current && !current.stopped) {
145
+ this.scheduleReconnect(key);
146
+ }
147
+ });
148
+ client.on('error', () => {
149
+ // Error will be followed by 'close' event
150
+ });
151
+ await mcpLog('info', 'watcher', `IDLE started: ${state.account.name}/${state.folder} (uid > ${uidNext - 1})`);
152
+ }
153
+ catch (err) {
154
+ const errMsg = err instanceof Error ? err.message : String(err);
155
+ await mcpLog('warning', 'watcher', `IDLE connect failed for ${state.account.name}/${state.folder}: ${errMsg}`);
156
+ this.scheduleReconnect(key);
157
+ }
158
+ }
159
+ scheduleReconnect(key) {
160
+ const state = this.idleStates.get(key);
161
+ if (!state || state.stopped)
162
+ return;
163
+ const { backoffMs } = state;
164
+ mcpLog('info', 'watcher', `Reconnecting ${state.account.name}/${state.folder} in ${backoffMs}ms`).catch(() => { });
165
+ const timer = setTimeout(() => {
166
+ this.updateState(key, { backoffMs: Math.min(backoffMs * 2, MAX_BACKOFF_MS) });
167
+ this.connectIdle(key).catch(() => { });
168
+ }, backoffMs);
169
+ this.updateState(key, { reconnectTimer: timer });
170
+ }
171
+ // -------------------------------------------------------------------------
172
+ // New email detection
173
+ // -------------------------------------------------------------------------
174
+ async handleNewEmails(key) {
175
+ const state = this.idleStates.get(key);
176
+ if (!state?.client)
177
+ return;
178
+ try {
179
+ const searchRange = `${state.lastSeenUid + 1}:*`;
180
+ const emails = [];
181
+ let maxUid = state.lastSeenUid;
182
+ // eslint-disable-next-line no-restricted-syntax -- need sequential async iteration
183
+ for await (const msg of state.client.fetch(searchRange, {
184
+ uid: true,
185
+ envelope: true,
186
+ flags: true,
187
+ bodyStructure: true,
188
+ })) {
189
+ if (msg.uid > state.lastSeenUid) {
190
+ emails.push(WatcherService.buildEmailMeta(msg));
191
+ maxUid = Math.max(maxUid, msg.uid);
192
+ }
193
+ }
194
+ if (maxUid > state.lastSeenUid) {
195
+ this.updateState(key, { lastSeenUid: maxUid });
196
+ }
197
+ if (emails.length > 0) {
198
+ eventBus.emit('email:new', {
199
+ account: state.account.name,
200
+ mailbox: state.folder,
201
+ emails,
202
+ });
203
+ await mcpLog('info', 'watcher', `📬 ${emails.length} new email(s) in ${state.account.name}/${state.folder}`);
204
+ }
205
+ }
206
+ catch (err) {
207
+ const errMsg = err instanceof Error ? err.message : String(err);
208
+ await mcpLog('warning', 'watcher', `Failed to fetch new emails: ${errMsg}`);
209
+ }
210
+ }
211
+ // -------------------------------------------------------------------------
212
+ // Helpers
213
+ // -------------------------------------------------------------------------
214
+ static buildEmailMeta(msg) {
215
+ const flags = msg.flags ?? new Set();
216
+ const labels = [...flags].filter((f) => !SYSTEM_FLAGS.has(f));
217
+ const from = msg.envelope?.from?.[0];
218
+ const to = msg.envelope?.to ?? [];
219
+ return {
220
+ id: String(msg.uid),
221
+ subject: msg.envelope?.subject ?? '(no subject)',
222
+ from: { name: from?.name, address: from?.address ?? '' },
223
+ to: to.map((a) => ({ name: a.name, address: a.address ?? '' })),
224
+ date: msg.envelope?.date?.toISOString() ?? new Date().toISOString(),
225
+ seen: flags.has('\\Seen'),
226
+ flagged: flags.has('\\Flagged'),
227
+ answered: flags.has('\\Answered'),
228
+ hasAttachments: WatcherService.hasAttachments(msg.bodyStructure),
229
+ labels,
230
+ };
231
+ }
232
+ static hasAttachments(bodyStructure) {
233
+ if (!bodyStructure || typeof bodyStructure !== 'object')
234
+ return false;
235
+ const bs = bodyStructure;
236
+ if (bs.disposition === 'attachment')
237
+ return true;
238
+ return bs.childNodes?.some((child) => WatcherService.hasAttachments(child)) ?? false;
239
+ }
240
+ }
241
+ //# sourceMappingURL=watcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.service.js","sourceRoot":"","sources":["../../src/services/watcher.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tool: list_accounts
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type ConnectionManager from '../connections/manager.js';
6
+ export default function registerAccountsTools(server: McpServer, connections: ConnectionManager): void;
7
+ //# sourceMappingURL=accounts.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.tool.d.ts","sourceRoot":"","sources":["../../src/tools/accounts.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,iBAAiB,MAAM,2BAA2B,CAAC;AAE/D,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAC3C,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,iBAAiB,GAC7B,IAAI,CAgCN"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MCP tool: list_accounts
3
+ */
4
+ export default function registerAccountsTools(server, connections) {
5
+ server.tool('list_accounts', 'List all configured email accounts. Call this first to discover available account names for use with other tools.', {}, { readOnlyHint: true, destructiveHint: false }, async () => {
6
+ const names = connections.getAccountNames();
7
+ const accounts = names.map((name) => {
8
+ const cfg = connections.getAccount(name);
9
+ return {
10
+ name: cfg.name,
11
+ email: cfg.email,
12
+ fullName: cfg.fullName ?? null,
13
+ };
14
+ });
15
+ return {
16
+ content: [
17
+ {
18
+ type: 'text',
19
+ text: accounts.length > 0
20
+ ? accounts
21
+ .map((a) => `• ${a.name}: ${a.email}${a.fullName ? ` (${a.fullName})` : ''}`)
22
+ .join('\n')
23
+ : 'No accounts configured.',
24
+ },
25
+ ],
26
+ };
27
+ });
28
+ }
29
+ //# sourceMappingURL=accounts.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.tool.js","sourceRoot":"","sources":["../../src/tools/accounts.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAC3C,MAAiB,EACjB,WAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mHAAmH,EACnH,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAC9C,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;aAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,QAAQ,CAAC,MAAM,GAAG,CAAC;wBACjB,CAAC,CAAC,QAAQ;6BACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;6BAC5E,IAAI,CAAC,IAAI,CAAC;wBACf,CAAC,CAAC,yBAAyB;iBAChC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool: get_email_stats
3
+ *
4
+ * Provides email analytics and statistics for a mailbox.
5
+ */
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import type ImapService from '../services/imap.service.js';
8
+ export default function registerAnalyticsTools(server: McpServer, imapService: ImapService): void;
9
+ //# sourceMappingURL=analytics.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.tool.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CA0BhG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MCP Tool: get_email_stats
3
+ *
4
+ * Provides email analytics and statistics for a mailbox.
5
+ */
6
+ import { z } from 'zod';
7
+ export default function registerAnalyticsTools(server, imapService) {
8
+ server.tool('get_email_stats', 'Get email statistics and analytics for a mailbox. Shows volume, top senders, daily trends, and read/flagged counts.', {
9
+ account: z.string().describe('Account name'),
10
+ period: z
11
+ .enum(['day', 'week', 'month'])
12
+ .default('week')
13
+ .describe('Time period: day, week, or month'),
14
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
15
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, period, mailbox }) => {
16
+ const stats = await imapService.getEmailStats(account, mailbox, period);
17
+ return {
18
+ content: [
19
+ {
20
+ type: 'text',
21
+ text: JSON.stringify(stats, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ });
26
+ }
27
+ //# sourceMappingURL=analytics.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.tool.js","sourceRoot":"","sources":["../../src/tools/analytics.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,MAAiB,EAAE,WAAwB;IACxF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,qHAAqH,EACrH;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5C,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;aAC9B,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC/E,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAC9C,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;iBACrC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tool: download_attachment
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type ImapService from '../services/imap.service.js';
6
+ export default function registerAttachmentTools(server: McpServer, imapService: ImapService): void;
7
+ //# sourceMappingURL=attachments.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.tool.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAiDjG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * MCP tool: download_attachment
3
+ */
4
+ import { z } from 'zod';
5
+ export default function registerAttachmentTools(server, imapService) {
6
+ server.tool('download_attachment', 'Download an email attachment by filename. First use get_email to see available attachments and their filenames. Returns base64-encoded content for files ≤5MB.', {
7
+ account: z.string().describe('Account name from list_accounts'),
8
+ id: z.string().describe('Email ID (UID) from list_emails or get_email'),
9
+ mailbox: z.string().default('INBOX').describe('Mailbox containing the email'),
10
+ filename: z.string().describe('Exact attachment filename (from get_email metadata)'),
11
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, id, mailbox, filename }) => {
12
+ try {
13
+ const result = await imapService.downloadAttachment(account, id, mailbox, filename);
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: JSON.stringify({
19
+ filename: result.filename,
20
+ mimeType: result.mimeType,
21
+ size: result.size,
22
+ sizeHuman: `${Math.round(result.size / 1024)}KB`,
23
+ }, null, 2),
24
+ },
25
+ {
26
+ type: 'text',
27
+ text: `\n--- Base64 Content ---\n${result.contentBase64}`,
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ catch (err) {
33
+ return {
34
+ isError: true,
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: `Failed to download attachment: ${err instanceof Error ? err.message : String(err)}`,
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=attachments.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.tool.js","sourceRoot":"","sources":["../../src/tools/attachments.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAiB,EAAE,WAAwB;IACzF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gKAAgK,EAChK;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC/D,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACrF,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAC9C,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;yBACjD,EACD,IAAI,EACJ,CAAC,CACF;qBACF;oBACD;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6BAA6B,MAAM,CAAC,aAAa,EAAE;qBAC1D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBAC3F;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tool: bulk_action — batch operations on multiple emails.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type ImapService from '../services/imap.service.js';
6
+ export default function registerBulkTools(server: McpServer, imapService: ImapService): void;
7
+ //# sourceMappingURL=bulk.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.tool.d.ts","sourceRoot":"","sources":["../../src/tools/bulk.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAG3D,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAqF3F"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * MCP tool: bulk_action — batch operations on multiple emails.
3
+ */
4
+ import { z } from 'zod';
5
+ import audit from '../safety/audit.js';
6
+ export default function registerBulkTools(server, imapService) {
7
+ server.tool('bulk_action', 'Batch operation on multiple emails by UID list. Supports mark_read, mark_unread, flag, unflag, move, and delete. Max 100 IDs per call. Returns success/failure counts.', {
8
+ account: z.string().describe('Account name from list_accounts'),
9
+ mailbox: z.string().default('INBOX').describe('Source mailbox containing the emails'),
10
+ action: z
11
+ .enum(['mark_read', 'mark_unread', 'flag', 'unflag', 'move', 'delete'])
12
+ .describe('Bulk action to perform'),
13
+ ids: z
14
+ .array(z.number().int())
15
+ .min(1)
16
+ .max(100)
17
+ .describe('Array of email UIDs (max 100). Get UIDs from list_emails or search_emails.'),
18
+ destination: z
19
+ .string()
20
+ .optional()
21
+ .describe("Destination mailbox — required when action is 'move'"),
22
+ }, { readOnlyHint: false, destructiveHint: true }, async ({ account, mailbox, action, ids, destination }) => {
23
+ try {
24
+ if (action === 'move' && !destination) {
25
+ return {
26
+ isError: true,
27
+ content: [
28
+ {
29
+ type: 'text',
30
+ text: `Destination mailbox is required for "move" action.`,
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ let result;
36
+ if (action === 'move') {
37
+ result = await imapService.bulkMove(account, ids, mailbox, destination);
38
+ }
39
+ else if (action === 'delete') {
40
+ result = await imapService.bulkDelete(account, ids, mailbox);
41
+ }
42
+ else {
43
+ result = await imapService.bulkSetFlags(account, ids, mailbox, action);
44
+ }
45
+ await audit.log('bulk_action', account, {
46
+ mailbox,
47
+ action,
48
+ ids: ids.length,
49
+ destination,
50
+ }, 'ok');
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: JSON.stringify(result, null, 2),
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ catch (err) {
61
+ const errMsg = err instanceof Error ? err.message : String(err);
62
+ await audit.log('bulk_action', account, { mailbox, action, ids: ids.length }, 'error', errMsg);
63
+ return {
64
+ isError: true,
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: `Bulk action failed: ${errMsg}`,
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ });
74
+ }
75
+ //# sourceMappingURL=bulk.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.tool.js","sourceRoot":"","sources":["../../src/tools/bulk.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MCP Tools: calendar operations
3
+ *
4
+ * - extract_calendar — parse ICS/iCalendar from email
5
+ * - add_to_calendar — add email event to local calendar (with confirmation dialog + dedup)
6
+ * - check_calendar_permissions — check OS calendar/reminders access
7
+ * - list_calendars — list available local calendars
8
+ * - list_events — search/list local calendar events
9
+ * - list_reminders — search/list reminders from Reminders.app
10
+ * - create_reminder — create a reminder in macOS Reminders.app from email
11
+ * - analyze_email_for_scheduling — detect events + reminders in email; AI decides what to create
12
+ */
13
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
14
+ import type CalendarService from '../services/calendar.service.js';
15
+ import type ImapService from '../services/imap.service.js';
16
+ import type LocalCalendarService from '../services/local-calendar.service.js';
17
+ import type RemindersService from '../services/reminders.service.js';
18
+ export default function registerCalendarTools(server: McpServer, imapService: ImapService, calendarService: CalendarService, localCalendarService: LocalCalendarService, remindersService: RemindersService): void;
19
+ //# sourceMappingURL=calendar.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.tool.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,eAAe,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAC;AAC9E,OAAO,KAAK,gBAAgB,MAAM,kCAAkC,CAAC;AASrE,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAC3C,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,EACxB,eAAe,EAAE,eAAe,EAChC,oBAAoB,EAAE,oBAAoB,EAC1C,gBAAgB,EAAE,gBAAgB,GACjC,IAAI,CA6pBN"}