@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,92 @@
1
+ /**
2
+ * MCP tools: save_draft, send_draft
3
+ */
4
+ import { z } from 'zod';
5
+ import audit from '../safety/audit.js';
6
+ export default function registerDraftTools(server, imapService, smtpService) {
7
+ // ---------------------------------------------------------------------------
8
+ // save_draft
9
+ // ---------------------------------------------------------------------------
10
+ server.tool('save_draft', 'Save an email draft to the Drafts folder. Compose over time, then use send_draft to send it. Use list_emails with the Drafts mailbox to see saved drafts.', {
11
+ account: z.string().describe('Account name from list_accounts'),
12
+ to: z
13
+ .array(z.string().email())
14
+ .default([])
15
+ .describe('Recipient email addresses (can be empty for drafts)'),
16
+ subject: z.string().describe('Email subject'),
17
+ body: z.string().describe('Email body content'),
18
+ cc: z.array(z.string().email()).optional().describe('CC recipients'),
19
+ bcc: z.array(z.string().email()).optional().describe('BCC recipients'),
20
+ html: z.boolean().default(false).describe('Send as HTML (default: plain text)'),
21
+ in_reply_to: z.string().optional().describe('Message-ID for threading (from get_email)'),
22
+ }, { readOnlyHint: false, destructiveHint: false }, async ({ account, to, subject, body, cc, bcc, html, in_reply_to: inReplyTo }) => {
23
+ try {
24
+ const result = await imapService.saveDraft(account, {
25
+ to,
26
+ subject,
27
+ body,
28
+ cc,
29
+ bcc,
30
+ html,
31
+ inReplyTo,
32
+ });
33
+ await audit.log('save_draft', account, { to, subject }, 'ok');
34
+ return {
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: `📝 Draft saved (ID: ${result.id}, folder: ${result.mailbox}).`,
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (err) {
44
+ const errMsg = err instanceof Error ? err.message : String(err);
45
+ await audit.log('save_draft', account, { to, subject }, 'error', errMsg);
46
+ return {
47
+ isError: true,
48
+ content: [
49
+ {
50
+ type: 'text',
51
+ text: `Failed to save draft: ${errMsg}`,
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ });
57
+ // ---------------------------------------------------------------------------
58
+ // send_draft
59
+ // ---------------------------------------------------------------------------
60
+ server.tool('send_draft', 'Send an existing draft email and remove it from Drafts. The draft is fetched, sent via SMTP, then deleted. Use list_emails with the Drafts mailbox to find draft IDs.', {
61
+ account: z.string().describe('Account name from list_accounts'),
62
+ id: z.number().int().describe('Draft email UID (from list_emails on Drafts mailbox)'),
63
+ mailbox: z.string().optional().describe('Drafts folder path (auto-detected if omitted)'),
64
+ }, { readOnlyHint: false, destructiveHint: true }, async ({ account, id, mailbox }) => {
65
+ try {
66
+ const result = await smtpService.sendDraft(account, id, mailbox);
67
+ await audit.log('send_draft', account, { id, mailbox }, 'ok');
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: `✅ Draft sent (Message-ID: ${result.messageId}). Draft removed from folder.`,
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ catch (err) {
78
+ const errMsg = err instanceof Error ? err.message : String(err);
79
+ await audit.log('send_draft', account, { id, mailbox }, 'error', errMsg);
80
+ return {
81
+ isError: true,
82
+ content: [
83
+ {
84
+ type: 'text',
85
+ text: `Failed to send draft: ${errMsg}`,
86
+ },
87
+ ],
88
+ };
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=drafts.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafts.tool.js","sourceRoot":"","sources":["../../src/tools/drafts.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools: list_emails, get_email, get_emails, get_email_status, search_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 registerEmailsTools(server: McpServer, imapService: ImapService): void;
7
+ //# sourceMappingURL=emails.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.tool.d.ts","sourceRoot":"","sources":["../../src/tools/emails.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAwG3D,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CA8X7F"}
@@ -0,0 +1,400 @@
1
+ /**
2
+ * MCP tools: list_emails, get_email, get_emails, get_email_status, search_emails
3
+ */
4
+ import { z } from 'zod';
5
+ // ---------------------------------------------------------------------------
6
+ // Formatting helpers
7
+ // ---------------------------------------------------------------------------
8
+ function formatSize(bytes) {
9
+ if (bytes < 1024)
10
+ return `${bytes}B`;
11
+ if (bytes < 1024 * 1024)
12
+ return `${(bytes / 1024).toFixed(1)}KB`;
13
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
14
+ }
15
+ function formatEmailMeta(email) {
16
+ const flags = [
17
+ email.seen ? '' : '🔵',
18
+ email.flagged ? '⭐' : '',
19
+ email.answered ? '↩️' : '',
20
+ email.hasAttachments ? '📎' : '',
21
+ ]
22
+ .filter(Boolean)
23
+ .join(' ');
24
+ const from = email.from.name ? `${email.from.name} <${email.from.address}>` : email.from.address;
25
+ const labelStr = email.labels.length > 0 ? `\n 🏷️ ${email.labels.join(', ')}` : '';
26
+ return `[${email.id}] ${flags} ${email.subject}\n From: ${from} | ${email.date}${labelStr}${email.preview ? `\n ${email.preview}` : ''}`;
27
+ }
28
+ /** Strips HTML markup and decodes common entities to produce readable plain text. */
29
+ function stripHtml(html) {
30
+ return html
31
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
32
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
33
+ .replace(/<br\s*\/?>/gi, '\n')
34
+ .replace(/<\/p>/gi, '\n\n')
35
+ .replace(/<\/div>/gi, '\n')
36
+ .replace(/<li\b[^>]*>/gi, '\n• ')
37
+ .replace(/<[^>]+>/g, '')
38
+ .replace(/&nbsp;/g, ' ')
39
+ .replace(/&lt;/g, '<')
40
+ .replace(/&gt;/g, '>')
41
+ .replace(/&amp;/g, '&')
42
+ .replace(/&quot;/g, '"')
43
+ .replace(/&#39;/g, "'")
44
+ .replace(/\n{3,}/g, '\n\n')
45
+ .trim();
46
+ }
47
+ /** Removes quoted reply chains and signatures from plain text. */
48
+ function stripReplyChain(text) {
49
+ const lines = text.split('\n');
50
+ const stopIdx = lines.findIndex((l) => /^--\s*$/.test(l) || /^_{3,}\s*$/.test(l));
51
+ const relevant = stopIdx === -1 ? lines : lines.slice(0, stopIdx);
52
+ return relevant
53
+ .filter((l) => !l.startsWith('>'))
54
+ .join('\n')
55
+ .replace(/\n{3,}/g, '\n\n')
56
+ .trim();
57
+ }
58
+ /**
59
+ * Applies the requested body format and optional character cap.
60
+ *
61
+ * - full: raw bodyText ?? bodyHtml (preserves original, default)
62
+ * - text: prefers bodyText; converts bodyHtml to plain text if needed
63
+ * - stripped: like text, but also removes quoted reply chains and signatures
64
+ */
65
+ function applyBodyFormat(bodyText, bodyHtml, format, maxLength) {
66
+ let body;
67
+ if (format === 'full') {
68
+ body = bodyText ?? bodyHtml ?? '(no content)';
69
+ }
70
+ else {
71
+ const base = bodyText ?? (bodyHtml ? stripHtml(bodyHtml) : undefined) ?? '(no content)';
72
+ body = format === 'stripped' ? stripReplyChain(base) : base;
73
+ }
74
+ if (maxLength !== undefined && maxLength > 0 && body.length > maxLength) {
75
+ const remaining = body.length - maxLength;
76
+ body = `${body.slice(0, maxLength)}\n\n… (${remaining} more characters — increase maxLength to read the full body)`;
77
+ }
78
+ return body;
79
+ }
80
+ /** Renders the current read/flag/label state as a concise status line. */
81
+ function formatEmailStatus(email) {
82
+ const parts = [email.seen ? '✓ Read' : '🔵 Unread'];
83
+ if (email.flagged)
84
+ parts.push('⭐ Flagged');
85
+ if (email.answered)
86
+ parts.push('↩️ Replied');
87
+ const labelStr = email.labels.length > 0 ? ` · 🏷️ ${email.labels.join(', ')}` : '';
88
+ return `${parts.join(' · ')}${labelStr}`;
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ export default function registerEmailsTools(server, imapService) {
92
+ // ---------------------------------------------------------------------------
93
+ // list_emails
94
+ // ---------------------------------------------------------------------------
95
+ server.tool('list_emails', 'List emails in a mailbox with optional filters. Returns paginated results with metadata ' +
96
+ '(read/unread 🔵, flagged ⭐, replied ↩️, attachments 📎, labels 🏷️). ' +
97
+ 'Use get_email to fetch full body content. ' +
98
+ 'ProtonMail note: labels are represented as IMAP folders — use list_labels to discover them, ' +
99
+ 'then list_emails with mailbox="Labels/X" to find labeled emails.', {
100
+ account: z.string().describe('Account name from list_accounts'),
101
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
102
+ page: z.number().int().min(1).default(1).describe('Page number'),
103
+ pageSize: z.number().int().min(1).max(100).default(20).describe('Results per page'),
104
+ since: z.string().optional().describe('Show emails after this date (ISO 8601)'),
105
+ before: z.string().optional().describe('Show emails before this date (ISO 8601)'),
106
+ from: z.string().optional().describe('Filter by sender address or name'),
107
+ subject: z.string().optional().describe('Filter by subject keyword'),
108
+ seen: z.boolean().optional().describe('Filter: true=read only, false=unread only'),
109
+ flagged: z.boolean().optional().describe('Filter: true=flagged only, false=unflagged only'),
110
+ has_attachment: z
111
+ .boolean()
112
+ .optional()
113
+ .describe('Filter: true=has attachments, false=no attachments'),
114
+ answered: z.boolean().optional().describe('Filter: true=replied, false=not yet replied'),
115
+ }, { readOnlyHint: true, destructiveHint: false }, async (params) => {
116
+ try {
117
+ const result = await imapService.listEmails(params.account, {
118
+ mailbox: params.mailbox,
119
+ page: params.page,
120
+ pageSize: params.pageSize,
121
+ since: params.since,
122
+ before: params.before,
123
+ from: params.from,
124
+ subject: params.subject,
125
+ seen: params.seen,
126
+ flagged: params.flagged,
127
+ hasAttachment: params.has_attachment,
128
+ answered: params.answered,
129
+ });
130
+ if (result.items.length === 0) {
131
+ return {
132
+ content: [{ type: 'text', text: 'No emails found matching the criteria.' }],
133
+ };
134
+ }
135
+ const header = `📬 [${params.mailbox}] ${result.total} emails ` +
136
+ `(page ${result.page}/${Math.ceil(result.total / result.pageSize)})` +
137
+ `${result.hasMore ? ' — more pages available' : ''}\n`;
138
+ const emails = result.items.map(formatEmailMeta).join('\n\n');
139
+ return {
140
+ content: [{ type: 'text', text: `${header}\n${emails}` }],
141
+ };
142
+ }
143
+ catch (err) {
144
+ return {
145
+ isError: true,
146
+ content: [
147
+ {
148
+ type: 'text',
149
+ text: `Failed to list emails: ${err instanceof Error ? err.message : String(err)}`,
150
+ },
151
+ ],
152
+ };
153
+ }
154
+ });
155
+ // ---------------------------------------------------------------------------
156
+ // get_email
157
+ // ---------------------------------------------------------------------------
158
+ server.tool('get_email', 'Get the full content of a specific email by ID. ' +
159
+ 'Does NOT mark the email as seen (uses IMAP BODY.PEEK — non-destructive). ' +
160
+ 'Use format="text" to strip HTML, or format="stripped" to also remove quoted replies and signatures. ' +
161
+ 'Use maxLength to cap the body size for large emails. ' +
162
+ 'Set markRead=true only when you want to explicitly mark the email as read.', {
163
+ account: z.string().describe('Account name from list_accounts'),
164
+ emailId: z.string().describe('Email ID from list_emails or search_emails'),
165
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
166
+ format: z
167
+ .enum(['full', 'text', 'stripped'])
168
+ .default('full')
169
+ .describe('Body format: full=raw (default), text=plain text (strips HTML), stripped=plain text without quoted replies or signatures'),
170
+ maxLength: z
171
+ .number()
172
+ .int()
173
+ .min(100)
174
+ .optional()
175
+ .describe('Truncate body at this many characters. A hint shows how many characters remain.'),
176
+ markRead: z
177
+ .boolean()
178
+ .default(false)
179
+ .describe('Explicitly mark the email as read after fetching (default: false — reading is non-destructive by default)'),
180
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, emailId, mailbox, format, maxLength, markRead }) => {
181
+ try {
182
+ const email = await imapService.getEmail(account, emailId, mailbox);
183
+ const parts = [
184
+ `📧 ${email.subject}`,
185
+ `Status: ${formatEmailStatus(email)}`,
186
+ `From: ${email.from.name ? `${email.from.name} <${email.from.address}>` : email.from.address}`,
187
+ `To: ${email.to.map((a) => (a.name ? `${a.name} <${a.address}>` : a.address)).join(', ')}`,
188
+ ];
189
+ if (email.cc?.length) {
190
+ parts.push(`CC: ${email.cc.map((a) => a.address).join(', ')}`);
191
+ }
192
+ parts.push(`Date: ${email.date}`);
193
+ parts.push(`ID: ${email.messageId}`);
194
+ if (email.inReplyTo) {
195
+ parts.push(`Reply: ${email.inReplyTo}`);
196
+ }
197
+ if (email.attachments.length > 0) {
198
+ parts.push(`📎 Attachments: ${email.attachments.map((a) => `${a.filename} (${a.mimeType}, ${formatSize(a.size)})`).join(', ')}`);
199
+ }
200
+ parts.push('', '--- Body ---', '');
201
+ parts.push(applyBodyFormat(email.bodyText, email.bodyHtml, format, maxLength));
202
+ if (markRead) {
203
+ await imapService.setFlags(account, emailId, mailbox, 'read');
204
+ }
205
+ return {
206
+ content: [{ type: 'text', text: parts.join('\n') }],
207
+ };
208
+ }
209
+ catch (err) {
210
+ return {
211
+ isError: true,
212
+ content: [
213
+ {
214
+ type: 'text',
215
+ text: `Failed to get email: ${err instanceof Error ? err.message : String(err)}`,
216
+ },
217
+ ],
218
+ };
219
+ }
220
+ });
221
+ // ---------------------------------------------------------------------------
222
+ // get_emails (batch content fetch)
223
+ // ---------------------------------------------------------------------------
224
+ server.tool('get_emails', 'Fetch the full content of multiple emails in a single call (max 20). ' +
225
+ 'More efficient than calling get_email repeatedly when triaging or summarising several emails. ' +
226
+ 'Does NOT mark emails as seen. ' +
227
+ 'Defaults to format="text" (HTML stripped) for compact, AI-friendly output.', {
228
+ account: z.string().describe('Account name from list_accounts'),
229
+ ids: z
230
+ .array(z.string())
231
+ .min(1)
232
+ .max(20)
233
+ .describe('Email IDs to fetch (max 20). Obtain IDs from list_emails or search_emails.'),
234
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
235
+ format: z
236
+ .enum(['full', 'text', 'stripped'])
237
+ .default('text')
238
+ .describe('Body format (default: text — strips HTML for efficient AI reading). Use stripped to also remove quoted replies.'),
239
+ maxLength: z
240
+ .number()
241
+ .int()
242
+ .min(100)
243
+ .optional()
244
+ .describe('Truncate each email body at this many characters.'),
245
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, ids, mailbox, format, maxLength }) => {
246
+ const results = [];
247
+ const errors = [];
248
+ const settled = await Promise.allSettled(ids.map(async (emailId) => imapService.getEmail(account, emailId, mailbox)));
249
+ settled.forEach((outcome, i) => {
250
+ const emailId = ids[i];
251
+ if (outcome.status === 'fulfilled') {
252
+ const email = outcome.value;
253
+ const from = email.from.name
254
+ ? `${email.from.name} <${email.from.address}>`
255
+ : email.from.address;
256
+ const body = applyBodyFormat(email.bodyText, email.bodyHtml, format, maxLength);
257
+ const attachLine = email.attachments.length > 0
258
+ ? `📎 ${email.attachments.map((a) => a.filename).join(', ')}`
259
+ : '';
260
+ results.push([
261
+ `━━━ [${emailId}] ${email.subject}`,
262
+ `Status: ${formatEmailStatus(email)}`,
263
+ `From: ${from}`,
264
+ `Date: ${email.date}`,
265
+ attachLine,
266
+ '',
267
+ body,
268
+ ]
269
+ .filter((l) => l !== '')
270
+ .join('\n'));
271
+ }
272
+ else {
273
+ const err = outcome.reason;
274
+ errors.push(`[${emailId}] Error: ${err instanceof Error ? err.message : String(err)}`);
275
+ }
276
+ });
277
+ const errSuffix = errors.length > 0 ? `, ${errors.length} error(s)` : '';
278
+ const summary = `📬 [${mailbox}] ${results.length} email(s) fetched${errSuffix}`;
279
+ const parts = [summary, '', ...results];
280
+ if (errors.length > 0) {
281
+ parts.push('', '--- Errors ---', ...errors);
282
+ }
283
+ return {
284
+ content: [{ type: 'text', text: parts.join('\n') }],
285
+ };
286
+ });
287
+ // ---------------------------------------------------------------------------
288
+ // get_email_status (lightweight flag/label check — no body fetch)
289
+ // ---------------------------------------------------------------------------
290
+ server.tool('get_email_status', 'Get the current read/flag/label state of an email without fetching its body. ' +
291
+ 'Much cheaper than get_email when you only need to check whether an email is unread, ' +
292
+ 'flagged, or which labels it has. ' +
293
+ 'Also useful to confirm the result of a mark_email call. ' +
294
+ 'Does NOT mark the email as seen.', {
295
+ account: z.string().describe('Account name from list_accounts'),
296
+ emailId: z.string().describe('Email ID from list_emails or search_emails'),
297
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
298
+ }, { readOnlyHint: true, destructiveHint: false }, async ({ account, emailId, mailbox }) => {
299
+ try {
300
+ const flags = await imapService.getEmailFlags(account, emailId, mailbox);
301
+ const statusParts = [flags.seen ? '✓ Read' : '🔵 Unread'];
302
+ if (flags.flagged)
303
+ statusParts.push('⭐ Flagged');
304
+ if (flags.answered)
305
+ statusParts.push('↩️ Replied');
306
+ const lines = [
307
+ `📊 Email Status`,
308
+ `ID: ${emailId} | Mailbox: ${mailbox}`,
309
+ `Subject: ${flags.subject}`,
310
+ `From: ${flags.from}`,
311
+ `Date: ${flags.date}`,
312
+ `Status: ${statusParts.join(' · ')}`,
313
+ `Labels: ${flags.labels.length > 0 ? flags.labels.join(', ') : '(none)'}`,
314
+ ];
315
+ return {
316
+ content: [{ type: 'text', text: lines.join('\n') }],
317
+ };
318
+ }
319
+ catch (err) {
320
+ return {
321
+ isError: true,
322
+ content: [
323
+ {
324
+ type: 'text',
325
+ text: `Failed to get email status: ${err instanceof Error ? err.message : String(err)}`,
326
+ },
327
+ ],
328
+ };
329
+ }
330
+ });
331
+ // ---------------------------------------------------------------------------
332
+ // search_emails
333
+ // ---------------------------------------------------------------------------
334
+ server.tool('search_emails', 'Search emails by keyword across subject, sender, and body. ' +
335
+ 'Omit query (or pass an empty string) to use it as a pure filter — e.g. find all emails ' +
336
+ 'with attachments from a specific recipient without a keyword. ' +
337
+ 'Supports additional filters for recipient, attachments, size, and reply status.', {
338
+ account: z.string().describe('Account name from list_accounts'),
339
+ query: z
340
+ .string()
341
+ .optional()
342
+ .default('')
343
+ .describe('Search keyword (omit or leave empty to use filters only)'),
344
+ mailbox: z.string().default('INBOX').describe('Mailbox path (default: INBOX)'),
345
+ page: z.number().int().min(1).default(1).describe('Page number'),
346
+ pageSize: z.number().int().min(1).max(100).default(20).describe('Results per page'),
347
+ to: z.string().optional().describe('Filter by recipient address'),
348
+ has_attachment: z
349
+ .boolean()
350
+ .optional()
351
+ .describe('Filter: true=has attachments, false=no attachments'),
352
+ larger_than: z.number().optional().describe('Minimum email size in KB'),
353
+ smaller_than: z.number().optional().describe('Maximum email size in KB'),
354
+ answered: z.boolean().optional().describe('Filter: true=replied, false=not replied'),
355
+ }, { readOnlyHint: true, destructiveHint: false }, async (params) => {
356
+ try {
357
+ const result = await imapService.searchEmails(params.account, params.query ?? '', {
358
+ mailbox: params.mailbox,
359
+ page: params.page,
360
+ pageSize: params.pageSize,
361
+ to: params.to,
362
+ hasAttachment: params.has_attachment,
363
+ largerThan: params.larger_than,
364
+ smallerThan: params.smaller_than,
365
+ answered: params.answered,
366
+ });
367
+ if (result.items.length === 0) {
368
+ return {
369
+ content: [
370
+ {
371
+ type: 'text',
372
+ text: params.query
373
+ ? `No emails found matching "${params.query}".`
374
+ : 'No emails found matching the specified filters.',
375
+ },
376
+ ],
377
+ };
378
+ }
379
+ const queryLabel = params.query ? `"${params.query}"` : 'filters';
380
+ const header = `🔍 [${params.mailbox}] ${result.total} result(s) for ${queryLabel} ` +
381
+ `(page ${result.page}/${Math.ceil(result.total / result.pageSize)})\n`;
382
+ const emails = result.items.map(formatEmailMeta).join('\n\n');
383
+ return {
384
+ content: [{ type: 'text', text: `${header}\n${emails}` }],
385
+ };
386
+ }
387
+ catch (err) {
388
+ return {
389
+ isError: true,
390
+ content: [
391
+ {
392
+ type: 'text',
393
+ text: `Failed to search emails: ${err instanceof Error ? err.message : String(err)}`,
394
+ },
395
+ ],
396
+ };
397
+ }
398
+ });
399
+ }
400
+ //# sourceMappingURL=emails.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emails.tool.js","sourceRoot":"","sources":["../../src/tools/emails.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools: create_mailbox, rename_mailbox, delete_mailbox
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type ImapService from '../services/imap.service.js';
6
+ export default function registerFolderTools(server: McpServer, imapService: ImapService): void;
7
+ //# sourceMappingURL=folders.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.tool.d.ts","sourceRoot":"","sources":["../../src/tools/folders.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CA+H7F"}