@jbctechsolutions/mcp-office365 2.5.1

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 (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +667 -0
  3. package/dist/applescript/account-repository.d.ts +30 -0
  4. package/dist/applescript/account-repository.d.ts.map +1 -0
  5. package/dist/applescript/account-repository.js +38 -0
  6. package/dist/applescript/account-repository.js.map +1 -0
  7. package/dist/applescript/account-scripts.d.ts +21 -0
  8. package/dist/applescript/account-scripts.d.ts.map +1 -0
  9. package/dist/applescript/account-scripts.js +180 -0
  10. package/dist/applescript/account-scripts.js.map +1 -0
  11. package/dist/applescript/calendar-manager.d.ts +44 -0
  12. package/dist/applescript/calendar-manager.d.ts.map +1 -0
  13. package/dist/applescript/calendar-manager.js +92 -0
  14. package/dist/applescript/calendar-manager.js.map +1 -0
  15. package/dist/applescript/calendar-writer.d.ts +36 -0
  16. package/dist/applescript/calendar-writer.d.ts.map +1 -0
  17. package/dist/applescript/calendar-writer.js +94 -0
  18. package/dist/applescript/calendar-writer.js.map +1 -0
  19. package/dist/applescript/content-readers.d.ts +114 -0
  20. package/dist/applescript/content-readers.d.ts.map +1 -0
  21. package/dist/applescript/content-readers.js +328 -0
  22. package/dist/applescript/content-readers.js.map +1 -0
  23. package/dist/applescript/executor.d.ts +60 -0
  24. package/dist/applescript/executor.d.ts.map +1 -0
  25. package/dist/applescript/executor.js +173 -0
  26. package/dist/applescript/executor.js.map +1 -0
  27. package/dist/applescript/index.d.ts +20 -0
  28. package/dist/applescript/index.d.ts.map +1 -0
  29. package/dist/applescript/index.js +29 -0
  30. package/dist/applescript/index.js.map +1 -0
  31. package/dist/applescript/mail-sender.d.ts +38 -0
  32. package/dist/applescript/mail-sender.d.ts.map +1 -0
  33. package/dist/applescript/mail-sender.js +67 -0
  34. package/dist/applescript/mail-sender.js.map +1 -0
  35. package/dist/applescript/parser.d.ts +235 -0
  36. package/dist/applescript/parser.d.ts.map +1 -0
  37. package/dist/applescript/parser.js +496 -0
  38. package/dist/applescript/parser.js.map +1 -0
  39. package/dist/applescript/repository.d.ts +64 -0
  40. package/dist/applescript/repository.d.ts.map +1 -0
  41. package/dist/applescript/repository.js +444 -0
  42. package/dist/applescript/repository.js.map +1 -0
  43. package/dist/applescript/scripts.d.ts +265 -0
  44. package/dist/applescript/scripts.d.ts.map +1 -0
  45. package/dist/applescript/scripts.js +1483 -0
  46. package/dist/applescript/scripts.js.map +1 -0
  47. package/dist/approval/hash.d.ts +87 -0
  48. package/dist/approval/hash.d.ts.map +1 -0
  49. package/dist/approval/hash.js +102 -0
  50. package/dist/approval/hash.js.map +1 -0
  51. package/dist/approval/index.d.ts +13 -0
  52. package/dist/approval/index.d.ts.map +1 -0
  53. package/dist/approval/index.js +7 -0
  54. package/dist/approval/index.js.map +1 -0
  55. package/dist/approval/token-manager.d.ts +51 -0
  56. package/dist/approval/token-manager.d.ts.map +1 -0
  57. package/dist/approval/token-manager.js +111 -0
  58. package/dist/approval/token-manager.js.map +1 -0
  59. package/dist/approval/types.d.ts +44 -0
  60. package/dist/approval/types.d.ts.map +1 -0
  61. package/dist/approval/types.js +6 -0
  62. package/dist/approval/types.js.map +1 -0
  63. package/dist/cli.d.ts +30 -0
  64. package/dist/cli.d.ts.map +1 -0
  65. package/dist/cli.js +143 -0
  66. package/dist/cli.js.map +1 -0
  67. package/dist/config.d.ts +27 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +42 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/database/connection.d.ts +77 -0
  72. package/dist/database/connection.d.ts.map +1 -0
  73. package/dist/database/connection.js +130 -0
  74. package/dist/database/connection.js.map +1 -0
  75. package/dist/database/index.d.ts +11 -0
  76. package/dist/database/index.d.ts.map +1 -0
  77. package/dist/database/index.js +11 -0
  78. package/dist/database/index.js.map +1 -0
  79. package/dist/database/queries.d.ts +93 -0
  80. package/dist/database/queries.d.ts.map +1 -0
  81. package/dist/database/queries.js +430 -0
  82. package/dist/database/queries.js.map +1 -0
  83. package/dist/database/repository.d.ts +198 -0
  84. package/dist/database/repository.d.ts.map +1 -0
  85. package/dist/database/repository.js +199 -0
  86. package/dist/database/repository.js.map +1 -0
  87. package/dist/graph/attachments.d.ts +72 -0
  88. package/dist/graph/attachments.d.ts.map +1 -0
  89. package/dist/graph/attachments.js +207 -0
  90. package/dist/graph/attachments.js.map +1 -0
  91. package/dist/graph/auth/config.d.ts +34 -0
  92. package/dist/graph/auth/config.d.ts.map +1 -0
  93. package/dist/graph/auth/config.js +78 -0
  94. package/dist/graph/auth/config.js.map +1 -0
  95. package/dist/graph/auth/device-code-flow.d.ts +55 -0
  96. package/dist/graph/auth/device-code-flow.d.ts.map +1 -0
  97. package/dist/graph/auth/device-code-flow.js +180 -0
  98. package/dist/graph/auth/device-code-flow.js.map +1 -0
  99. package/dist/graph/auth/index.d.ts +13 -0
  100. package/dist/graph/auth/index.d.ts.map +1 -0
  101. package/dist/graph/auth/index.js +13 -0
  102. package/dist/graph/auth/index.js.map +1 -0
  103. package/dist/graph/auth/token-cache.d.ts +41 -0
  104. package/dist/graph/auth/token-cache.d.ts.map +1 -0
  105. package/dist/graph/auth/token-cache.js +105 -0
  106. package/dist/graph/auth/token-cache.js.map +1 -0
  107. package/dist/graph/client/batch.d.ts +38 -0
  108. package/dist/graph/client/batch.d.ts.map +1 -0
  109. package/dist/graph/client/batch.js +33 -0
  110. package/dist/graph/client/batch.js.map +1 -0
  111. package/dist/graph/client/cache.d.ts +64 -0
  112. package/dist/graph/client/cache.d.ts.map +1 -0
  113. package/dist/graph/client/cache.js +108 -0
  114. package/dist/graph/client/cache.js.map +1 -0
  115. package/dist/graph/client/graph-client.d.ts +630 -0
  116. package/dist/graph/client/graph-client.d.ts.map +1 -0
  117. package/dist/graph/client/graph-client.js +1771 -0
  118. package/dist/graph/client/graph-client.js.map +1 -0
  119. package/dist/graph/client/index.d.ts +12 -0
  120. package/dist/graph/client/index.d.ts.map +1 -0
  121. package/dist/graph/client/index.js +12 -0
  122. package/dist/graph/client/index.js.map +1 -0
  123. package/dist/graph/content-readers.d.ts +106 -0
  124. package/dist/graph/content-readers.d.ts.map +1 -0
  125. package/dist/graph/content-readers.js +321 -0
  126. package/dist/graph/content-readers.js.map +1 -0
  127. package/dist/graph/index.d.ts +18 -0
  128. package/dist/graph/index.d.ts.map +1 -0
  129. package/dist/graph/index.js +23 -0
  130. package/dist/graph/index.js.map +1 -0
  131. package/dist/graph/mailbox-adapter.d.ts +30 -0
  132. package/dist/graph/mailbox-adapter.d.ts.map +1 -0
  133. package/dist/graph/mailbox-adapter.js +59 -0
  134. package/dist/graph/mailbox-adapter.js.map +1 -0
  135. package/dist/graph/mappers/contact-mapper.d.ts +14 -0
  136. package/dist/graph/mappers/contact-mapper.d.ts.map +1 -0
  137. package/dist/graph/mappers/contact-mapper.js +20 -0
  138. package/dist/graph/mappers/contact-mapper.js.map +1 -0
  139. package/dist/graph/mappers/email-mapper.d.ts +14 -0
  140. package/dist/graph/mappers/email-mapper.d.ts.map +1 -0
  141. package/dist/graph/mappers/email-mapper.js +44 -0
  142. package/dist/graph/mappers/email-mapper.js.map +1 -0
  143. package/dist/graph/mappers/event-mapper.d.ts +14 -0
  144. package/dist/graph/mappers/event-mapper.d.ts.map +1 -0
  145. package/dist/graph/mappers/event-mapper.js +31 -0
  146. package/dist/graph/mappers/event-mapper.js.map +1 -0
  147. package/dist/graph/mappers/folder-mapper.d.ts +22 -0
  148. package/dist/graph/mappers/folder-mapper.d.ts.map +1 -0
  149. package/dist/graph/mappers/folder-mapper.js +51 -0
  150. package/dist/graph/mappers/folder-mapper.js.map +1 -0
  151. package/dist/graph/mappers/index.d.ts +16 -0
  152. package/dist/graph/mappers/index.d.ts.map +1 -0
  153. package/dist/graph/mappers/index.js +16 -0
  154. package/dist/graph/mappers/index.js.map +1 -0
  155. package/dist/graph/mappers/task-mapper.d.ts +20 -0
  156. package/dist/graph/mappers/task-mapper.d.ts.map +1 -0
  157. package/dist/graph/mappers/task-mapper.js +27 -0
  158. package/dist/graph/mappers/task-mapper.js.map +1 -0
  159. package/dist/graph/mappers/utils.d.ts +97 -0
  160. package/dist/graph/mappers/utils.d.ts.map +1 -0
  161. package/dist/graph/mappers/utils.js +186 -0
  162. package/dist/graph/mappers/utils.js.map +1 -0
  163. package/dist/graph/repository.d.ts +1104 -0
  164. package/dist/graph/repository.d.ts.map +1 -0
  165. package/dist/graph/repository.js +2999 -0
  166. package/dist/graph/repository.js.map +1 -0
  167. package/dist/index.d.ts +21 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +6052 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/parsers/html-stripper.d.ts +41 -0
  172. package/dist/parsers/html-stripper.d.ts.map +1 -0
  173. package/dist/parsers/html-stripper.js +179 -0
  174. package/dist/parsers/html-stripper.js.map +1 -0
  175. package/dist/parsers/index.d.ts +12 -0
  176. package/dist/parsers/index.d.ts.map +1 -0
  177. package/dist/parsers/index.js +12 -0
  178. package/dist/parsers/index.js.map +1 -0
  179. package/dist/parsers/olk15.d.ts +87 -0
  180. package/dist/parsers/olk15.d.ts.map +1 -0
  181. package/dist/parsers/olk15.js +368 -0
  182. package/dist/parsers/olk15.js.map +1 -0
  183. package/dist/signature.d.ts +22 -0
  184. package/dist/signature.d.ts.map +1 -0
  185. package/dist/signature.js +89 -0
  186. package/dist/signature.js.map +1 -0
  187. package/dist/tools/calendar-permissions.d.ts +79 -0
  188. package/dist/tools/calendar-permissions.d.ts.map +1 -0
  189. package/dist/tools/calendar-permissions.js +121 -0
  190. package/dist/tools/calendar-permissions.js.map +1 -0
  191. package/dist/tools/calendar.d.ts +208 -0
  192. package/dist/tools/calendar.d.ts.map +1 -0
  193. package/dist/tools/calendar.js +247 -0
  194. package/dist/tools/calendar.js.map +1 -0
  195. package/dist/tools/categories.d.ts +94 -0
  196. package/dist/tools/categories.d.ts.map +1 -0
  197. package/dist/tools/categories.js +117 -0
  198. package/dist/tools/categories.js.map +1 -0
  199. package/dist/tools/checklist-items.d.ts +89 -0
  200. package/dist/tools/checklist-items.d.ts.map +1 -0
  201. package/dist/tools/checklist-items.js +140 -0
  202. package/dist/tools/checklist-items.js.map +1 -0
  203. package/dist/tools/contacts.d.ts +94 -0
  204. package/dist/tools/contacts.d.ts.map +1 -0
  205. package/dist/tools/contacts.js +134 -0
  206. package/dist/tools/contacts.js.map +1 -0
  207. package/dist/tools/excel.d.ts +96 -0
  208. package/dist/tools/excel.d.ts.map +1 -0
  209. package/dist/tools/excel.js +165 -0
  210. package/dist/tools/excel.js.map +1 -0
  211. package/dist/tools/focused-overrides.d.ts +70 -0
  212. package/dist/tools/focused-overrides.d.ts.map +1 -0
  213. package/dist/tools/focused-overrides.js +117 -0
  214. package/dist/tools/focused-overrides.js.map +1 -0
  215. package/dist/tools/index.d.ts +22 -0
  216. package/dist/tools/index.d.ts.map +1 -0
  217. package/dist/tools/index.js +34 -0
  218. package/dist/tools/index.js.map +1 -0
  219. package/dist/tools/linked-resources.d.ts +74 -0
  220. package/dist/tools/linked-resources.d.ts.map +1 -0
  221. package/dist/tools/linked-resources.js +122 -0
  222. package/dist/tools/linked-resources.js.map +1 -0
  223. package/dist/tools/mail-rules.d.ts +98 -0
  224. package/dist/tools/mail-rules.d.ts.map +1 -0
  225. package/dist/tools/mail-rules.js +169 -0
  226. package/dist/tools/mail-rules.js.map +1 -0
  227. package/dist/tools/mail-send.d.ts +314 -0
  228. package/dist/tools/mail-send.d.ts.map +1 -0
  229. package/dist/tools/mail-send.js +555 -0
  230. package/dist/tools/mail-send.js.map +1 -0
  231. package/dist/tools/mail.d.ts +127 -0
  232. package/dist/tools/mail.d.ts.map +1 -0
  233. package/dist/tools/mail.js +311 -0
  234. package/dist/tools/mail.js.map +1 -0
  235. package/dist/tools/mailbox-organization.d.ts +301 -0
  236. package/dist/tools/mailbox-organization.d.ts.map +1 -0
  237. package/dist/tools/mailbox-organization.js +541 -0
  238. package/dist/tools/mailbox-organization.js.map +1 -0
  239. package/dist/tools/meetings.d.ts +114 -0
  240. package/dist/tools/meetings.d.ts.map +1 -0
  241. package/dist/tools/meetings.js +110 -0
  242. package/dist/tools/meetings.js.map +1 -0
  243. package/dist/tools/notes.d.ts +74 -0
  244. package/dist/tools/notes.d.ts.map +1 -0
  245. package/dist/tools/notes.js +136 -0
  246. package/dist/tools/notes.js.map +1 -0
  247. package/dist/tools/onedrive.d.ts +194 -0
  248. package/dist/tools/onedrive.d.ts.map +1 -0
  249. package/dist/tools/onedrive.js +257 -0
  250. package/dist/tools/onedrive.js.map +1 -0
  251. package/dist/tools/people.d.ts +129 -0
  252. package/dist/tools/people.d.ts.map +1 -0
  253. package/dist/tools/people.js +195 -0
  254. package/dist/tools/people.js.map +1 -0
  255. package/dist/tools/planner-visualization.d.ts +91 -0
  256. package/dist/tools/planner-visualization.d.ts.map +1 -0
  257. package/dist/tools/planner-visualization.js +192 -0
  258. package/dist/tools/planner-visualization.js.map +1 -0
  259. package/dist/tools/planner.d.ts +288 -0
  260. package/dist/tools/planner.d.ts.map +1 -0
  261. package/dist/tools/planner.js +368 -0
  262. package/dist/tools/planner.js.map +1 -0
  263. package/dist/tools/scheduling.d.ts +49 -0
  264. package/dist/tools/scheduling.d.ts.map +1 -0
  265. package/dist/tools/scheduling.js +115 -0
  266. package/dist/tools/scheduling.js.map +1 -0
  267. package/dist/tools/sharepoint.d.ts +115 -0
  268. package/dist/tools/sharepoint.d.ts.map +1 -0
  269. package/dist/tools/sharepoint.js +99 -0
  270. package/dist/tools/sharepoint.js.map +1 -0
  271. package/dist/tools/task-attachments.d.ts +74 -0
  272. package/dist/tools/task-attachments.d.ts.map +1 -0
  273. package/dist/tools/task-attachments.js +122 -0
  274. package/dist/tools/task-attachments.js.map +1 -0
  275. package/dist/tools/tasks.d.ts +74 -0
  276. package/dist/tools/tasks.d.ts.map +1 -0
  277. package/dist/tools/tasks.js +126 -0
  278. package/dist/tools/tasks.js.map +1 -0
  279. package/dist/tools/teams.d.ts +389 -0
  280. package/dist/tools/teams.d.ts.map +1 -0
  281. package/dist/tools/teams.js +546 -0
  282. package/dist/tools/teams.js.map +1 -0
  283. package/dist/types/calendar.d.ts +60 -0
  284. package/dist/types/calendar.d.ts.map +1 -0
  285. package/dist/types/calendar.js +15 -0
  286. package/dist/types/calendar.js.map +1 -0
  287. package/dist/types/contacts.d.ts +96 -0
  288. package/dist/types/contacts.d.ts.map +1 -0
  289. package/dist/types/contacts.js +41 -0
  290. package/dist/types/contacts.js.map +1 -0
  291. package/dist/types/index.d.ts +15 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +16 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/mail.d.ts +108 -0
  296. package/dist/types/mail.d.ts.map +1 -0
  297. package/dist/types/mail.js +40 -0
  298. package/dist/types/mail.js.map +1 -0
  299. package/dist/types/notes.d.ts +26 -0
  300. package/dist/types/notes.d.ts.map +1 -0
  301. package/dist/types/notes.js +6 -0
  302. package/dist/types/notes.js.map +1 -0
  303. package/dist/types/tasks.d.ts +31 -0
  304. package/dist/types/tasks.d.ts.map +1 -0
  305. package/dist/types/tasks.js +6 -0
  306. package/dist/types/tasks.js.map +1 -0
  307. package/dist/utils/dates.d.ts +66 -0
  308. package/dist/utils/dates.d.ts.map +1 -0
  309. package/dist/utils/dates.js +94 -0
  310. package/dist/utils/dates.js.map +1 -0
  311. package/dist/utils/errors.d.ts +218 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +306 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/index.d.ts +10 -0
  316. package/dist/utils/index.d.ts.map +1 -0
  317. package/dist/utils/index.js +10 -0
  318. package/dist/utils/index.js.map +1 -0
  319. package/dist/visualization/html.d.ts +26 -0
  320. package/dist/visualization/html.d.ts.map +1 -0
  321. package/dist/visualization/html.js +306 -0
  322. package/dist/visualization/html.js.map +1 -0
  323. package/dist/visualization/markdown.d.ts +25 -0
  324. package/dist/visualization/markdown.d.ts.map +1 -0
  325. package/dist/visualization/markdown.js +186 -0
  326. package/dist/visualization/markdown.js.map +1 -0
  327. package/dist/visualization/mermaid.d.ts +25 -0
  328. package/dist/visualization/mermaid.d.ts.map +1 -0
  329. package/dist/visualization/mermaid.js +158 -0
  330. package/dist/visualization/mermaid.js.map +1 -0
  331. package/dist/visualization/svg.d.ts +25 -0
  332. package/dist/visualization/svg.d.ts.map +1 -0
  333. package/dist/visualization/svg.js +282 -0
  334. package/dist/visualization/svg.js.map +1 -0
  335. package/dist/visualization/types.d.ts +43 -0
  336. package/dist/visualization/types.d.ts.map +1 -0
  337. package/dist/visualization/types.js +34 -0
  338. package/dist/visualization/types.js.map +1 -0
  339. package/package.json +88 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ /**
6
+ * Mail rules MCP tools.
7
+ *
8
+ * Provides tools for managing inbox mail rules with a two-phase
9
+ * approval pattern for destructive delete operations.
10
+ */
11
+ import { z } from 'zod';
12
+ // =============================================================================
13
+ // Input Schemas
14
+ // =============================================================================
15
+ export const CreateMailRuleInput = z.strictObject({
16
+ display_name: z.string().describe('Rule name'),
17
+ sequence: z.number().int().min(1).optional().describe('Rule priority order'),
18
+ is_enabled: z.boolean().default(true).describe('Whether rule is active'),
19
+ conditions: z.strictObject({
20
+ from_addresses: z.array(z.string().email()).optional().describe('Match sender addresses'),
21
+ subject_contains: z.array(z.string()).optional().describe('Subject contains any of these strings'),
22
+ body_contains: z.array(z.string()).optional().describe('Body contains any of these strings'),
23
+ sender_contains: z.array(z.string()).optional().describe('Sender field contains these strings'),
24
+ has_attachments: z.boolean().optional().describe('Has attachments'),
25
+ importance: z.enum(['low', 'normal', 'high']).optional().describe('Match importance level'),
26
+ }).describe('Conditions that trigger the rule'),
27
+ actions: z.strictObject({
28
+ move_to_folder: z.number().int().positive().optional().describe('Folder ID to move to'),
29
+ mark_as_read: z.boolean().optional().describe('Mark as read'),
30
+ mark_importance: z.enum(['low', 'normal', 'high']).optional().describe('Set importance'),
31
+ forward_to: z.array(z.string().email()).optional().describe('Forward to these addresses'),
32
+ delete: z.boolean().optional().describe('Delete the message'),
33
+ stop_processing_rules: z.boolean().optional().describe('Stop processing more rules'),
34
+ }).describe('Actions to perform'),
35
+ });
36
+ export const PrepareDeleteMailRuleInput = z.strictObject({
37
+ rule_id: z.number().int().positive().describe('The rule ID to delete'),
38
+ });
39
+ export const ConfirmDeleteMailRuleInput = z.strictObject({
40
+ token_id: z.string().uuid().describe('Approval token from prepare_delete_mail_rule'),
41
+ rule_id: z.number().int().positive().describe('The rule ID to delete'),
42
+ });
43
+ // =============================================================================
44
+ // Mail Rules Tools
45
+ // =============================================================================
46
+ /**
47
+ * Mail rules tools with two-phase approval for delete operations.
48
+ */
49
+ export class MailRulesTools {
50
+ repo;
51
+ tokenManager;
52
+ constructor(repo, tokenManager) {
53
+ this.repo = repo;
54
+ this.tokenManager = tokenManager;
55
+ }
56
+ async listMailRules() {
57
+ const rules = await this.repo.listMailRulesAsync();
58
+ return {
59
+ content: [{
60
+ type: 'text',
61
+ text: JSON.stringify({ rules }, null, 2),
62
+ }],
63
+ };
64
+ }
65
+ async createMailRule(params) {
66
+ // Build Graph API rule object
67
+ const graphRule = {
68
+ displayName: params.display_name,
69
+ isEnabled: params.is_enabled,
70
+ };
71
+ if (params.sequence != null)
72
+ graphRule['sequence'] = params.sequence;
73
+ // Build conditions
74
+ const conditions = {};
75
+ if (params.conditions.from_addresses != null) {
76
+ conditions['fromAddresses'] = params.conditions.from_addresses.map((addr) => ({
77
+ emailAddress: { address: addr },
78
+ }));
79
+ }
80
+ if (params.conditions.subject_contains != null)
81
+ conditions['subjectContains'] = params.conditions.subject_contains;
82
+ if (params.conditions.body_contains != null)
83
+ conditions['bodyContains'] = params.conditions.body_contains;
84
+ if (params.conditions.sender_contains != null)
85
+ conditions['senderContains'] = params.conditions.sender_contains;
86
+ if (params.conditions.has_attachments != null)
87
+ conditions['hasAttachments'] = params.conditions.has_attachments;
88
+ if (params.conditions.importance != null)
89
+ conditions['importance'] = params.conditions.importance;
90
+ graphRule['conditions'] = conditions;
91
+ // Build actions
92
+ const actions = {};
93
+ if (params.actions.move_to_folder != null) {
94
+ const folderId = this.repo.getFolderGraphId(params.actions.move_to_folder);
95
+ if (folderId == null)
96
+ throw new Error(`Folder ID ${params.actions.move_to_folder} not found in cache. Try listing folders first.`);
97
+ actions['moveToFolder'] = folderId;
98
+ }
99
+ if (params.actions.mark_as_read != null)
100
+ actions['markAsRead'] = params.actions.mark_as_read;
101
+ if (params.actions.mark_importance != null)
102
+ actions['markImportance'] = params.actions.mark_importance;
103
+ if (params.actions.forward_to != null) {
104
+ actions['forwardTo'] = params.actions.forward_to.map((addr) => ({
105
+ emailAddress: { address: addr },
106
+ }));
107
+ }
108
+ if (params.actions.delete != null)
109
+ actions['delete'] = params.actions.delete;
110
+ if (params.actions.stop_processing_rules != null)
111
+ actions['stopProcessingRules'] = params.actions.stop_processing_rules;
112
+ graphRule['actions'] = actions;
113
+ const ruleId = await this.repo.createMailRuleAsync(graphRule);
114
+ return {
115
+ content: [{
116
+ type: 'text',
117
+ text: JSON.stringify({ success: true, rule_id: ruleId, message: 'Mail rule created' }, null, 2),
118
+ }],
119
+ };
120
+ }
121
+ prepareDeleteMailRule(params) {
122
+ const token = this.tokenManager.generateToken({
123
+ operation: 'delete_mail_rule',
124
+ targetType: 'rule',
125
+ targetId: params.rule_id,
126
+ targetHash: String(params.rule_id),
127
+ });
128
+ return {
129
+ content: [{
130
+ type: 'text',
131
+ text: JSON.stringify({
132
+ token_id: token.tokenId,
133
+ expires_at: new Date(token.expiresAt).toISOString(),
134
+ rule_id: params.rule_id,
135
+ action: `To confirm deleting mail rule ${params.rule_id}, call confirm_delete_mail_rule with the token_id and rule_id.`,
136
+ }, null, 2),
137
+ }],
138
+ };
139
+ }
140
+ async confirmDeleteMailRule(params) {
141
+ const result = this.tokenManager.consumeToken(params.token_id, 'delete_mail_rule', params.rule_id);
142
+ if (!result.valid) {
143
+ const errorMessages = {
144
+ NOT_FOUND: 'Token not found or already used',
145
+ EXPIRED: 'Token has expired. Please call prepare_delete_mail_rule again.',
146
+ OPERATION_MISMATCH: 'Token was not generated for delete_mail_rule',
147
+ TARGET_MISMATCH: 'Token was generated for a different rule',
148
+ ALREADY_CONSUMED: 'Token has already been used',
149
+ };
150
+ return {
151
+ content: [{
152
+ type: 'text',
153
+ text: JSON.stringify({
154
+ success: false,
155
+ error: errorMessages[result.error ?? ''] ?? 'Invalid token',
156
+ }, null, 2),
157
+ }],
158
+ };
159
+ }
160
+ await this.repo.deleteMailRuleAsync(params.rule_id);
161
+ return {
162
+ content: [{
163
+ type: 'text',
164
+ text: JSON.stringify({ success: true, message: 'Mail rule deleted' }, null, 2),
165
+ }],
166
+ };
167
+ }
168
+ }
169
+ //# sourceMappingURL=mail-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-rules.js","sourceRoot":"","sources":["../../src/tools/mail-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ import { z } from 'zod';
6
+ import type { EmailRow } from '../database/repository.js';
7
+ import { ApprovalTokenManager } from '../approval/index.js';
8
+ import type { GraphClient } from '../graph/client/index.js';
9
+ /**
10
+ * Async-compatible repository interface for mail send tools.
11
+ *
12
+ * Matches the async methods on GraphRepository.
13
+ */
14
+ /**
15
+ * Result of creating a draft, containing both the numeric and Graph IDs.
16
+ */
17
+ export interface CreateDraftResult {
18
+ numericId: number;
19
+ graphId: string;
20
+ }
21
+ export interface IMailSendRepository {
22
+ getEmailAsync(id: number): Promise<EmailRow | undefined>;
23
+ createDraftAsync(params: {
24
+ subject: string;
25
+ body: string;
26
+ bodyType: string;
27
+ to?: string[];
28
+ cc?: string[];
29
+ bcc?: string[];
30
+ }): Promise<CreateDraftResult>;
31
+ updateDraftAsync(draftId: number, updates: Record<string, unknown>): Promise<void>;
32
+ listDraftsAsync(limit: number, offset: number): Promise<EmailRow[]>;
33
+ sendDraftAsync(draftId: number): Promise<void>;
34
+ sendMailAsync(params: {
35
+ subject: string;
36
+ body: string;
37
+ bodyType: string;
38
+ to: string[];
39
+ cc?: string[];
40
+ bcc?: string[];
41
+ }): Promise<void>;
42
+ replyMessageAsync(messageId: number, comment: string, replyAll: boolean): Promise<void>;
43
+ forwardMessageAsync(messageId: number, toRecipients: string[], comment?: string): Promise<void>;
44
+ replyAsDraftAsync(messageId: number, replyAll?: boolean, comment?: string, bodyType?: string): Promise<CreateDraftResult>;
45
+ forwardAsDraftAsync(messageId: number, toRecipients?: string[], comment?: string, bodyType?: string): Promise<CreateDraftResult>;
46
+ /** Returns the Graph client for direct API operations (e.g., attachment uploads). */
47
+ getGraphClient(): GraphClient;
48
+ /** Returns the Graph string ID for a cached draft numeric ID. */
49
+ getGraphIdForDraft(draftId: number): string | undefined;
50
+ }
51
+ export declare const CreateDraftInput: z.ZodObject<{
52
+ to: z.ZodOptional<z.ZodArray<z.ZodString>>;
53
+ cc: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
+ bcc: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
+ subject: z.ZodString;
56
+ body: z.ZodOptional<z.ZodString>;
57
+ body_file: z.ZodOptional<z.ZodString>;
58
+ body_type: z.ZodDefault<z.ZodEnum<{
59
+ html: "html";
60
+ text: "text";
61
+ }>>;
62
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
63
+ file_path: z.ZodString;
64
+ name: z.ZodOptional<z.ZodString>;
65
+ content_type: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strict>>>;
67
+ inline_images: z.ZodOptional<z.ZodArray<z.ZodObject<{
68
+ file_path: z.ZodString;
69
+ content_id: z.ZodString;
70
+ }, z.core.$strict>>>;
71
+ include_signature: z.ZodDefault<z.ZodBoolean>;
72
+ }, z.core.$strict>;
73
+ export declare const UpdateDraftInput: z.ZodObject<{
74
+ draft_id: z.ZodNumber;
75
+ to: z.ZodOptional<z.ZodArray<z.ZodString>>;
76
+ cc: z.ZodOptional<z.ZodArray<z.ZodString>>;
77
+ bcc: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
+ subject: z.ZodOptional<z.ZodString>;
79
+ body: z.ZodOptional<z.ZodString>;
80
+ body_file: z.ZodOptional<z.ZodString>;
81
+ body_type: z.ZodOptional<z.ZodEnum<{
82
+ html: "html";
83
+ text: "text";
84
+ }>>;
85
+ }, z.core.$strict>;
86
+ export declare const AddDraftAttachmentInput: z.ZodObject<{
87
+ draft_id: z.ZodNumber;
88
+ file_path: z.ZodString;
89
+ name: z.ZodOptional<z.ZodString>;
90
+ content_type: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strict>;
92
+ export declare const AddDraftInlineImageInput: z.ZodObject<{
93
+ draft_id: z.ZodNumber;
94
+ file_path: z.ZodString;
95
+ content_id: z.ZodString;
96
+ }, z.core.$strict>;
97
+ export declare const ListDraftsInput: z.ZodObject<{
98
+ limit: z.ZodDefault<z.ZodNumber>;
99
+ offset: z.ZodDefault<z.ZodNumber>;
100
+ }, z.core.$strict>;
101
+ export declare const PrepareSendDraftInput: z.ZodObject<{
102
+ draft_id: z.ZodNumber;
103
+ }, z.core.$strict>;
104
+ export declare const ConfirmSendDraftInput: z.ZodObject<{
105
+ token_id: z.ZodUUID;
106
+ draft_id: z.ZodNumber;
107
+ }, z.core.$strict>;
108
+ export declare const PrepareSendEmailInput: z.ZodObject<{
109
+ to: z.ZodArray<z.ZodString>;
110
+ cc: z.ZodOptional<z.ZodArray<z.ZodString>>;
111
+ bcc: z.ZodOptional<z.ZodArray<z.ZodString>>;
112
+ subject: z.ZodString;
113
+ body: z.ZodOptional<z.ZodString>;
114
+ body_file: z.ZodOptional<z.ZodString>;
115
+ body_type: z.ZodDefault<z.ZodEnum<{
116
+ html: "html";
117
+ text: "text";
118
+ }>>;
119
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
120
+ file_path: z.ZodString;
121
+ name: z.ZodOptional<z.ZodString>;
122
+ content_type: z.ZodOptional<z.ZodString>;
123
+ }, z.core.$strict>>>;
124
+ include_signature: z.ZodDefault<z.ZodBoolean>;
125
+ }, z.core.$strict>;
126
+ export declare const ConfirmSendEmailInput: z.ZodObject<{
127
+ token_id: z.ZodUUID;
128
+ }, z.core.$strict>;
129
+ export declare const PrepareReplyEmailInput: z.ZodObject<{
130
+ message_id: z.ZodNumber;
131
+ comment: z.ZodString;
132
+ reply_all: z.ZodDefault<z.ZodBoolean>;
133
+ }, z.core.$strict>;
134
+ export declare const ConfirmReplyEmailInput: z.ZodObject<{
135
+ token_id: z.ZodUUID;
136
+ message_id: z.ZodNumber;
137
+ }, z.core.$strict>;
138
+ export declare const PrepareForwardEmailInput: z.ZodObject<{
139
+ message_id: z.ZodNumber;
140
+ to_recipients: z.ZodArray<z.ZodString>;
141
+ comment: z.ZodOptional<z.ZodString>;
142
+ }, z.core.$strict>;
143
+ export declare const ConfirmForwardEmailInput: z.ZodObject<{
144
+ token_id: z.ZodUUID;
145
+ message_id: z.ZodNumber;
146
+ }, z.core.$strict>;
147
+ export declare const ReplyAsDraftInput: z.ZodObject<{
148
+ message_id: z.ZodNumber;
149
+ comment: z.ZodOptional<z.ZodString>;
150
+ reply_all: z.ZodDefault<z.ZodBoolean>;
151
+ body_type: z.ZodDefault<z.ZodEnum<{
152
+ html: "html";
153
+ text: "text";
154
+ }>>;
155
+ include_signature: z.ZodDefault<z.ZodBoolean>;
156
+ }, z.core.$strict>;
157
+ export declare const ForwardAsDraftInput: z.ZodObject<{
158
+ message_id: z.ZodNumber;
159
+ to_recipients: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ comment: z.ZodOptional<z.ZodString>;
161
+ body_type: z.ZodDefault<z.ZodEnum<{
162
+ html: "html";
163
+ text: "text";
164
+ }>>;
165
+ include_signature: z.ZodDefault<z.ZodBoolean>;
166
+ }, z.core.$strict>;
167
+ export declare const SetSignatureInput: z.ZodObject<{
168
+ content: z.ZodString;
169
+ content_type: z.ZodDefault<z.ZodEnum<{
170
+ html: "html";
171
+ text: "text";
172
+ }>>;
173
+ }, z.core.$strict>;
174
+ export declare const GetSignatureInput: z.ZodObject<{}, z.core.$strict>;
175
+ export type CreateDraftParams = z.infer<typeof CreateDraftInput>;
176
+ export type UpdateDraftParams = z.infer<typeof UpdateDraftInput>;
177
+ export type ListDraftsParams = z.infer<typeof ListDraftsInput>;
178
+ export type PrepareSendDraftParams = z.infer<typeof PrepareSendDraftInput>;
179
+ export type ConfirmSendDraftParams = z.infer<typeof ConfirmSendDraftInput>;
180
+ export type PrepareSendEmailParams = z.infer<typeof PrepareSendEmailInput>;
181
+ export type ConfirmSendEmailParams = z.infer<typeof ConfirmSendEmailInput>;
182
+ export type PrepareReplyEmailParams = z.infer<typeof PrepareReplyEmailInput>;
183
+ export type ConfirmReplyEmailParams = z.infer<typeof ConfirmReplyEmailInput>;
184
+ export type PrepareForwardEmailParams = z.infer<typeof PrepareForwardEmailInput>;
185
+ export type ConfirmForwardEmailParams = z.infer<typeof ConfirmForwardEmailInput>;
186
+ export type ReplyAsDraftParams = z.infer<typeof ReplyAsDraftInput>;
187
+ export type ForwardAsDraftParams = z.infer<typeof ForwardAsDraftInput>;
188
+ declare function draftPreview(row: EmailRow): {
189
+ id: number;
190
+ subject: string | null;
191
+ to: string | null;
192
+ cc: string | null;
193
+ };
194
+ declare function messagePreview(row: EmailRow): {
195
+ id: number;
196
+ subject: string | null;
197
+ sender: string | null;
198
+ senderAddress: string | null;
199
+ };
200
+ /**
201
+ * Mail send tools with two-phase approval for send operations.
202
+ *
203
+ * Provides draft management (create, update, list) as non-destructive ops,
204
+ * and send/reply/forward as two-phase approval operations.
205
+ */
206
+ export declare class MailSendTools {
207
+ private readonly repository;
208
+ private readonly tokenManager;
209
+ constructor(repository: IMailSendRepository, tokenManager: ApprovalTokenManager);
210
+ createDraft(params: CreateDraftParams): Promise<{
211
+ success: boolean;
212
+ draft_id: number;
213
+ }>;
214
+ updateDraft(params: UpdateDraftParams): Promise<{
215
+ success: boolean;
216
+ message: string;
217
+ }>;
218
+ addDraftAttachment(params: z.infer<typeof AddDraftAttachmentInput>): Promise<{
219
+ success: boolean;
220
+ message: string;
221
+ }>;
222
+ addDraftInlineImage(params: z.infer<typeof AddDraftInlineImageInput>): Promise<{
223
+ success: boolean;
224
+ message: string;
225
+ }>;
226
+ listDrafts(params: ListDraftsParams): Promise<EmailRow[]>;
227
+ prepareSendDraft(params: PrepareSendDraftParams): Promise<{
228
+ token_id: string;
229
+ expires_at: string;
230
+ draft: ReturnType<typeof draftPreview>;
231
+ action: string;
232
+ }>;
233
+ prepareSendEmail(params: PrepareSendEmailParams): {
234
+ token_id: string;
235
+ expires_at: string;
236
+ preview: {
237
+ subject: string;
238
+ to: string[];
239
+ cc?: string[];
240
+ bcc?: string[];
241
+ };
242
+ action: string;
243
+ };
244
+ prepareReplyEmail(params: PrepareReplyEmailParams): Promise<{
245
+ token_id: string;
246
+ expires_at: string;
247
+ original_message: ReturnType<typeof messagePreview>;
248
+ action: string;
249
+ }>;
250
+ prepareForwardEmail(params: PrepareForwardEmailParams): Promise<{
251
+ token_id: string;
252
+ expires_at: string;
253
+ original_message: ReturnType<typeof messagePreview>;
254
+ action: string;
255
+ }>;
256
+ confirmSendDraft(params: ConfirmSendDraftParams): Promise<{
257
+ success: boolean;
258
+ message: string;
259
+ }>;
260
+ confirmSendEmail(params: ConfirmSendEmailParams): Promise<{
261
+ success: boolean;
262
+ message: string;
263
+ }>;
264
+ confirmReplyEmail(params: ConfirmReplyEmailParams): Promise<{
265
+ success: boolean;
266
+ message: string;
267
+ }>;
268
+ confirmForwardEmail(params: ConfirmForwardEmailParams): Promise<{
269
+ success: boolean;
270
+ message: string;
271
+ }>;
272
+ replyAsDraft(params: z.infer<typeof ReplyAsDraftInput>): Promise<{
273
+ success: boolean;
274
+ draft_id: number;
275
+ message: string;
276
+ }>;
277
+ forwardAsDraft(params: z.infer<typeof ForwardAsDraftInput>): Promise<{
278
+ success: boolean;
279
+ draft_id: number;
280
+ message: string;
281
+ }>;
282
+ setSignature(params: z.infer<typeof SetSignatureInput>): {
283
+ success: boolean;
284
+ message: string;
285
+ };
286
+ getSignature(): {
287
+ has_signature: boolean;
288
+ content?: string;
289
+ message?: string;
290
+ };
291
+ private requireEmail;
292
+ /**
293
+ * Consumes a token and verifies the draft hasn't changed.
294
+ * Returns the consumed token for metadata access.
295
+ */
296
+ private consumeAndVerifyDraft;
297
+ /**
298
+ * Consumes a token for send_email (no pre-existing entity to verify).
299
+ * The targetId is 0, so we use that for validation.
300
+ */
301
+ private consumeTokenForSendEmail;
302
+ /**
303
+ * Consumes a token for reply/forward operations.
304
+ * Validates token but does not re-hash the original message
305
+ * (the original message content is not expected to change).
306
+ */
307
+ private consumeTokenForMessage;
308
+ }
309
+ /**
310
+ * Creates mail send tools with the given repository and token manager.
311
+ */
312
+ export declare function createMailSendTools(repository: IMailSendRepository, tokenManager: ApprovalTokenManager): MailSendTools;
313
+ export {};
314
+ //# sourceMappingURL=mail-send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-send.d.ts","sourceRoot":"","sources":["../../src/tools/mail-send.ts"],"names":[],"mappings":"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"}