@mcp-z/mcp-outlook 1.0.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 (300) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +10 -0
  5. package/dist/cjs/constants.d.ts +10 -0
  6. package/dist/cjs/constants.js +35 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/email/composition/outlook-message-builder.d.cts +36 -0
  9. package/dist/cjs/email/composition/outlook-message-builder.d.ts +36 -0
  10. package/dist/cjs/email/composition/outlook-message-builder.js +56 -0
  11. package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -0
  12. package/dist/cjs/email/messages/messages.d.cts +7 -0
  13. package/dist/cjs/email/messages/messages.d.ts +7 -0
  14. package/dist/cjs/email/messages/messages.js +61 -0
  15. package/dist/cjs/email/messages/messages.js.map +1 -0
  16. package/dist/cjs/email/parsing/header-parsing.d.cts +18 -0
  17. package/dist/cjs/email/parsing/header-parsing.d.ts +18 -0
  18. package/dist/cjs/email/parsing/header-parsing.js +42 -0
  19. package/dist/cjs/email/parsing/header-parsing.js.map +1 -0
  20. package/dist/cjs/email/parsing/message-extraction.d.cts +4 -0
  21. package/dist/cjs/email/parsing/message-extraction.d.ts +4 -0
  22. package/dist/cjs/email/parsing/message-extraction.js +192 -0
  23. package/dist/cjs/email/parsing/message-extraction.js.map +1 -0
  24. package/dist/cjs/email/parsing/message-mapping.d.cts +21 -0
  25. package/dist/cjs/email/parsing/message-mapping.d.ts +21 -0
  26. package/dist/cjs/email/parsing/message-mapping.js +47 -0
  27. package/dist/cjs/email/parsing/message-mapping.js.map +1 -0
  28. package/dist/cjs/email/querying/execute-query.d.cts +20 -0
  29. package/dist/cjs/email/querying/execute-query.d.ts +20 -0
  30. package/dist/cjs/email/querying/execute-query.js +268 -0
  31. package/dist/cjs/email/querying/execute-query.js.map +1 -0
  32. package/dist/cjs/email/querying/query-builder.d.cts +32 -0
  33. package/dist/cjs/email/querying/query-builder.d.ts +32 -0
  34. package/dist/cjs/email/querying/query-builder.js +528 -0
  35. package/dist/cjs/email/querying/query-builder.js.map +1 -0
  36. package/dist/cjs/email/querying/search-execution.d.cts +24 -0
  37. package/dist/cjs/email/querying/search-execution.d.ts +24 -0
  38. package/dist/cjs/email/querying/search-execution.js +261 -0
  39. package/dist/cjs/email/querying/search-execution.js.map +1 -0
  40. package/dist/cjs/index.d.cts +8 -0
  41. package/dist/cjs/index.d.ts +8 -0
  42. package/dist/cjs/index.js +314 -0
  43. package/dist/cjs/index.js.map +1 -0
  44. package/dist/cjs/lib/create-store.d.cts +2 -0
  45. package/dist/cjs/lib/create-store.d.ts +2 -0
  46. package/dist/cjs/lib/create-store.js +166 -0
  47. package/dist/cjs/lib/create-store.js.map +1 -0
  48. package/dist/cjs/lib/messages-to-row.d.cts +39 -0
  49. package/dist/cjs/lib/messages-to-row.d.ts +39 -0
  50. package/dist/cjs/lib/messages-to-row.js +177 -0
  51. package/dist/cjs/lib/messages-to-row.js.map +1 -0
  52. package/dist/cjs/lib/outlook/index.d.cts +7 -0
  53. package/dist/cjs/lib/outlook/index.d.ts +7 -0
  54. package/dist/cjs/lib/outlook/index.js +56 -0
  55. package/dist/cjs/lib/outlook/index.js.map +1 -0
  56. package/dist/cjs/lib/outlook/types.d.cts +22 -0
  57. package/dist/cjs/lib/outlook/types.d.ts +22 -0
  58. package/dist/cjs/lib/outlook/types.js +6 -0
  59. package/dist/cjs/lib/outlook/types.js.map +1 -0
  60. package/dist/cjs/mcp/index.d.cts +3 -0
  61. package/dist/cjs/mcp/index.d.ts +3 -0
  62. package/dist/cjs/mcp/index.js +66 -0
  63. package/dist/cjs/mcp/index.js.map +1 -0
  64. package/dist/cjs/mcp/prompts/draft-email.d.cts +30 -0
  65. package/dist/cjs/mcp/prompts/draft-email.d.ts +30 -0
  66. package/dist/cjs/mcp/prompts/draft-email.js +184 -0
  67. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -0
  68. package/dist/cjs/mcp/prompts/index.d.cts +2 -0
  69. package/dist/cjs/mcp/prompts/index.d.ts +2 -0
  70. package/dist/cjs/mcp/prompts/index.js +26 -0
  71. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  72. package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
  73. package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
  74. package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
  75. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
  76. package/dist/cjs/mcp/resources/email.d.cts +11 -0
  77. package/dist/cjs/mcp/resources/email.d.ts +11 -0
  78. package/dist/cjs/mcp/resources/email.js +233 -0
  79. package/dist/cjs/mcp/resources/email.js.map +1 -0
  80. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  81. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  82. package/dist/cjs/mcp/resources/index.js +17 -0
  83. package/dist/cjs/mcp/resources/index.js.map +1 -0
  84. package/dist/cjs/mcp/tools/categories-list.d.cts +96 -0
  85. package/dist/cjs/mcp/tools/categories-list.d.ts +96 -0
  86. package/dist/cjs/mcp/tools/categories-list.js +252 -0
  87. package/dist/cjs/mcp/tools/categories-list.js.map +1 -0
  88. package/dist/cjs/mcp/tools/index.d.cts +11 -0
  89. package/dist/cjs/mcp/tools/index.d.ts +11 -0
  90. package/dist/cjs/mcp/tools/index.js +62 -0
  91. package/dist/cjs/mcp/tools/index.js.map +1 -0
  92. package/dist/cjs/mcp/tools/label-add.d.cts +44 -0
  93. package/dist/cjs/mcp/tools/label-add.d.ts +44 -0
  94. package/dist/cjs/mcp/tools/label-add.js +249 -0
  95. package/dist/cjs/mcp/tools/label-add.js.map +1 -0
  96. package/dist/cjs/mcp/tools/label-delete.d.cts +54 -0
  97. package/dist/cjs/mcp/tools/label-delete.d.ts +54 -0
  98. package/dist/cjs/mcp/tools/label-delete.js +497 -0
  99. package/dist/cjs/mcp/tools/label-delete.js.map +1 -0
  100. package/dist/cjs/mcp/tools/labels-list.d.cts +96 -0
  101. package/dist/cjs/mcp/tools/labels-list.d.ts +96 -0
  102. package/dist/cjs/mcp/tools/labels-list.js +252 -0
  103. package/dist/cjs/mcp/tools/labels-list.js.map +1 -0
  104. package/dist/cjs/mcp/tools/message-get.d.cts +110 -0
  105. package/dist/cjs/mcp/tools/message-get.d.ts +110 -0
  106. package/dist/cjs/mcp/tools/message-get.js +289 -0
  107. package/dist/cjs/mcp/tools/message-get.js.map +1 -0
  108. package/dist/cjs/mcp/tools/message-mark-read.d.cts +42 -0
  109. package/dist/cjs/mcp/tools/message-mark-read.d.ts +42 -0
  110. package/dist/cjs/mcp/tools/message-mark-read.js +254 -0
  111. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -0
  112. package/dist/cjs/mcp/tools/message-move-to-trash.d.cts +54 -0
  113. package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +54 -0
  114. package/dist/cjs/mcp/tools/message-move-to-trash.js +460 -0
  115. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -0
  116. package/dist/cjs/mcp/tools/message-respond.d.cts +52 -0
  117. package/dist/cjs/mcp/tools/message-respond.d.ts +52 -0
  118. package/dist/cjs/mcp/tools/message-respond.js +263 -0
  119. package/dist/cjs/mcp/tools/message-respond.js.map +1 -0
  120. package/dist/cjs/mcp/tools/message-search.d.cts +138 -0
  121. package/dist/cjs/mcp/tools/message-search.d.ts +138 -0
  122. package/dist/cjs/mcp/tools/message-search.js +408 -0
  123. package/dist/cjs/mcp/tools/message-search.js.map +1 -0
  124. package/dist/cjs/mcp/tools/message-send.d.cts +66 -0
  125. package/dist/cjs/mcp/tools/message-send.d.ts +66 -0
  126. package/dist/cjs/mcp/tools/message-send.js +298 -0
  127. package/dist/cjs/mcp/tools/message-send.js.map +1 -0
  128. package/dist/cjs/mcp/tools/messages-export-csv.d.cts +72 -0
  129. package/dist/cjs/mcp/tools/messages-export-csv.d.ts +72 -0
  130. package/dist/cjs/mcp/tools/messages-export-csv.js +540 -0
  131. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -0
  132. package/dist/cjs/package.json +1 -0
  133. package/dist/cjs/schemas/index.d.cts +2 -0
  134. package/dist/cjs/schemas/index.d.ts +2 -0
  135. package/dist/cjs/schemas/index.js +20 -0
  136. package/dist/cjs/schemas/index.js.map +1 -0
  137. package/dist/cjs/schemas/outlook-query-schema.d.cts +53 -0
  138. package/dist/cjs/schemas/outlook-query-schema.d.ts +53 -0
  139. package/dist/cjs/schemas/outlook-query-schema.js +115 -0
  140. package/dist/cjs/schemas/outlook-query-schema.js.map +1 -0
  141. package/dist/cjs/schemas/outlook-validation.d.cts +428 -0
  142. package/dist/cjs/schemas/outlook-validation.d.ts +428 -0
  143. package/dist/cjs/schemas/outlook-validation.js +420 -0
  144. package/dist/cjs/schemas/outlook-validation.js.map +1 -0
  145. package/dist/cjs/setup/config.d.cts +50 -0
  146. package/dist/cjs/setup/config.d.ts +50 -0
  147. package/dist/cjs/setup/config.js +217 -0
  148. package/dist/cjs/setup/config.js.map +1 -0
  149. package/dist/cjs/setup/http.d.cts +8 -0
  150. package/dist/cjs/setup/http.d.ts +8 -0
  151. package/dist/cjs/setup/http.js +267 -0
  152. package/dist/cjs/setup/http.js.map +1 -0
  153. package/dist/cjs/setup/index.d.cts +5 -0
  154. package/dist/cjs/setup/index.d.ts +5 -0
  155. package/dist/cjs/setup/index.js +46 -0
  156. package/dist/cjs/setup/index.js.map +1 -0
  157. package/dist/cjs/setup/oauth-microsoft.d.cts +43 -0
  158. package/dist/cjs/setup/oauth-microsoft.d.ts +43 -0
  159. package/dist/cjs/setup/oauth-microsoft.js +366 -0
  160. package/dist/cjs/setup/oauth-microsoft.js.map +1 -0
  161. package/dist/cjs/setup/runtime.d.cts +11 -0
  162. package/dist/cjs/setup/runtime.d.ts +11 -0
  163. package/dist/cjs/setup/runtime.js +489 -0
  164. package/dist/cjs/setup/runtime.js.map +1 -0
  165. package/dist/cjs/setup/stdio.d.cts +7 -0
  166. package/dist/cjs/setup/stdio.d.ts +7 -0
  167. package/dist/cjs/setup/stdio.js +239 -0
  168. package/dist/cjs/setup/stdio.js.map +1 -0
  169. package/dist/cjs/types.d.cts +54 -0
  170. package/dist/cjs/types.d.ts +54 -0
  171. package/dist/cjs/types.js +5 -0
  172. package/dist/cjs/types.js.map +1 -0
  173. package/dist/esm/constants.d.ts +10 -0
  174. package/dist/esm/constants.js +13 -0
  175. package/dist/esm/constants.js.map +1 -0
  176. package/dist/esm/email/composition/outlook-message-builder.d.ts +36 -0
  177. package/dist/esm/email/composition/outlook-message-builder.js +46 -0
  178. package/dist/esm/email/composition/outlook-message-builder.js.map +1 -0
  179. package/dist/esm/email/messages/messages.d.ts +7 -0
  180. package/dist/esm/email/messages/messages.js +42 -0
  181. package/dist/esm/email/messages/messages.js.map +1 -0
  182. package/dist/esm/email/parsing/header-parsing.d.ts +18 -0
  183. package/dist/esm/email/parsing/header-parsing.js +18 -0
  184. package/dist/esm/email/parsing/header-parsing.js.map +1 -0
  185. package/dist/esm/email/parsing/message-extraction.d.ts +4 -0
  186. package/dist/esm/email/parsing/message-extraction.js +26 -0
  187. package/dist/esm/email/parsing/message-extraction.js.map +1 -0
  188. package/dist/esm/email/parsing/message-mapping.d.ts +21 -0
  189. package/dist/esm/email/parsing/message-mapping.js +35 -0
  190. package/dist/esm/email/parsing/message-mapping.js.map +1 -0
  191. package/dist/esm/email/querying/execute-query.d.ts +20 -0
  192. package/dist/esm/email/querying/execute-query.js +48 -0
  193. package/dist/esm/email/querying/execute-query.js.map +1 -0
  194. package/dist/esm/email/querying/query-builder.d.ts +32 -0
  195. package/dist/esm/email/querying/query-builder.js +424 -0
  196. package/dist/esm/email/querying/query-builder.js.map +1 -0
  197. package/dist/esm/email/querying/search-execution.d.ts +24 -0
  198. package/dist/esm/email/querying/search-execution.js +96 -0
  199. package/dist/esm/email/querying/search-execution.js.map +1 -0
  200. package/dist/esm/index.d.ts +8 -0
  201. package/dist/esm/index.js +34 -0
  202. package/dist/esm/index.js.map +1 -0
  203. package/dist/esm/lib/create-store.d.ts +2 -0
  204. package/dist/esm/lib/create-store.js +6 -0
  205. package/dist/esm/lib/create-store.js.map +1 -0
  206. package/dist/esm/lib/messages-to-row.d.ts +39 -0
  207. package/dist/esm/lib/messages-to-row.js +141 -0
  208. package/dist/esm/lib/messages-to-row.js.map +1 -0
  209. package/dist/esm/lib/outlook/index.d.ts +7 -0
  210. package/dist/esm/lib/outlook/index.js +7 -0
  211. package/dist/esm/lib/outlook/index.js.map +1 -0
  212. package/dist/esm/lib/outlook/types.d.ts +22 -0
  213. package/dist/esm/lib/outlook/types.js +2 -0
  214. package/dist/esm/lib/outlook/types.js.map +1 -0
  215. package/dist/esm/mcp/index.d.ts +3 -0
  216. package/dist/esm/mcp/index.js +6 -0
  217. package/dist/esm/mcp/index.js.map +1 -0
  218. package/dist/esm/mcp/prompts/draft-email.d.ts +30 -0
  219. package/dist/esm/mcp/prompts/draft-email.js +37 -0
  220. package/dist/esm/mcp/prompts/draft-email.js.map +1 -0
  221. package/dist/esm/mcp/prompts/index.d.ts +2 -0
  222. package/dist/esm/mcp/prompts/index.js +2 -0
  223. package/dist/esm/mcp/prompts/index.js.map +1 -0
  224. package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
  225. package/dist/esm/mcp/prompts/query-syntax.js +75 -0
  226. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
  227. package/dist/esm/mcp/resources/email.d.ts +11 -0
  228. package/dist/esm/mcp/resources/email.js +69 -0
  229. package/dist/esm/mcp/resources/email.js.map +1 -0
  230. package/dist/esm/mcp/resources/index.d.ts +1 -0
  231. package/dist/esm/mcp/resources/index.js +1 -0
  232. package/dist/esm/mcp/resources/index.js.map +1 -0
  233. package/dist/esm/mcp/tools/categories-list.d.ts +96 -0
  234. package/dist/esm/mcp/tools/categories-list.js +78 -0
  235. package/dist/esm/mcp/tools/categories-list.js.map +1 -0
  236. package/dist/esm/mcp/tools/index.d.ts +11 -0
  237. package/dist/esm/mcp/tools/index.js +11 -0
  238. package/dist/esm/mcp/tools/index.js.map +1 -0
  239. package/dist/esm/mcp/tools/label-add.d.ts +44 -0
  240. package/dist/esm/mcp/tools/label-add.js +75 -0
  241. package/dist/esm/mcp/tools/label-add.js.map +1 -0
  242. package/dist/esm/mcp/tools/label-delete.d.ts +54 -0
  243. package/dist/esm/mcp/tools/label-delete.js +166 -0
  244. package/dist/esm/mcp/tools/label-delete.js.map +1 -0
  245. package/dist/esm/mcp/tools/labels-list.d.ts +96 -0
  246. package/dist/esm/mcp/tools/labels-list.js +78 -0
  247. package/dist/esm/mcp/tools/labels-list.js.map +1 -0
  248. package/dist/esm/mcp/tools/message-get.d.ts +110 -0
  249. package/dist/esm/mcp/tools/message-get.js +117 -0
  250. package/dist/esm/mcp/tools/message-get.js.map +1 -0
  251. package/dist/esm/mcp/tools/message-mark-read.d.ts +42 -0
  252. package/dist/esm/mcp/tools/message-mark-read.js +80 -0
  253. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -0
  254. package/dist/esm/mcp/tools/message-move-to-trash.d.ts +54 -0
  255. package/dist/esm/mcp/tools/message-move-to-trash.js +177 -0
  256. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -0
  257. package/dist/esm/mcp/tools/message-respond.d.ts +52 -0
  258. package/dist/esm/mcp/tools/message-respond.js +89 -0
  259. package/dist/esm/mcp/tools/message-respond.js.map +1 -0
  260. package/dist/esm/mcp/tools/message-search.d.ts +138 -0
  261. package/dist/esm/mcp/tools/message-search.js +184 -0
  262. package/dist/esm/mcp/tools/message-search.js.map +1 -0
  263. package/dist/esm/mcp/tools/message-send.d.ts +66 -0
  264. package/dist/esm/mcp/tools/message-send.js +111 -0
  265. package/dist/esm/mcp/tools/message-send.js.map +1 -0
  266. package/dist/esm/mcp/tools/messages-export-csv.d.ts +72 -0
  267. package/dist/esm/mcp/tools/messages-export-csv.js +273 -0
  268. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -0
  269. package/dist/esm/package.json +1 -0
  270. package/dist/esm/schemas/index.d.ts +2 -0
  271. package/dist/esm/schemas/index.js +2 -0
  272. package/dist/esm/schemas/index.js.map +1 -0
  273. package/dist/esm/schemas/outlook-query-schema.d.ts +53 -0
  274. package/dist/esm/schemas/outlook-query-schema.js +63 -0
  275. package/dist/esm/schemas/outlook-query-schema.js.map +1 -0
  276. package/dist/esm/schemas/outlook-validation.d.ts +428 -0
  277. package/dist/esm/schemas/outlook-validation.js +388 -0
  278. package/dist/esm/schemas/outlook-validation.js.map +1 -0
  279. package/dist/esm/setup/config.d.ts +50 -0
  280. package/dist/esm/setup/config.js +180 -0
  281. package/dist/esm/setup/config.js.map +1 -0
  282. package/dist/esm/setup/http.d.ts +8 -0
  283. package/dist/esm/setup/http.js +61 -0
  284. package/dist/esm/setup/http.js.map +1 -0
  285. package/dist/esm/setup/index.d.ts +5 -0
  286. package/dist/esm/setup/index.js +5 -0
  287. package/dist/esm/setup/index.js.map +1 -0
  288. package/dist/esm/setup/oauth-microsoft.d.ts +43 -0
  289. package/dist/esm/setup/oauth-microsoft.js +169 -0
  290. package/dist/esm/setup/oauth-microsoft.js.map +1 -0
  291. package/dist/esm/setup/runtime.d.ts +11 -0
  292. package/dist/esm/setup/runtime.js +115 -0
  293. package/dist/esm/setup/runtime.js.map +1 -0
  294. package/dist/esm/setup/stdio.d.ts +7 -0
  295. package/dist/esm/setup/stdio.js +38 -0
  296. package/dist/esm/setup/stdio.js.map +1 -0
  297. package/dist/esm/types.d.ts +54 -0
  298. package/dist/esm/types.js +1 -0
  299. package/dist/esm/types.js.map +1 -0
  300. package/package.json +111 -0
@@ -0,0 +1,540 @@
1
+ /** Outlook message CSV export tool - streams results to file without loading all data into context */ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createTool;
9
+ }
10
+ });
11
+ var _email = require("@mcp-z/email");
12
+ var _oauthmicrosoft = require("@mcp-z/oauth-microsoft");
13
+ var _server = require("@mcp-z/server");
14
+ var _microsoftgraphclient = require("@microsoft/microsoft-graph-client");
15
+ var _types = require("@modelcontextprotocol/sdk/types.js");
16
+ var _sync = require("csv-stringify/sync");
17
+ var _fs = require("fs");
18
+ var _promises = require("fs/promises");
19
+ var _zod = require("zod");
20
+ var _executequery = require("../../email/querying/execute-query.js");
21
+ var _outlookqueryschema = require("../../schemas/outlook-query-schema.js");
22
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
23
+ try {
24
+ var info = gen[key](arg);
25
+ var value = info.value;
26
+ } catch (error) {
27
+ reject(error);
28
+ return;
29
+ }
30
+ if (info.done) {
31
+ resolve(value);
32
+ } else {
33
+ Promise.resolve(value).then(_next, _throw);
34
+ }
35
+ }
36
+ function _async_to_generator(fn) {
37
+ return function() {
38
+ var self = this, args = arguments;
39
+ return new Promise(function(resolve, reject) {
40
+ var gen = fn.apply(self, args);
41
+ function _next(value) {
42
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
43
+ }
44
+ function _throw(err) {
45
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
46
+ }
47
+ _next(undefined);
48
+ });
49
+ };
50
+ }
51
+ function _define_property(obj, key, value) {
52
+ if (key in obj) {
53
+ Object.defineProperty(obj, key, {
54
+ value: value,
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true
58
+ });
59
+ } else {
60
+ obj[key] = value;
61
+ }
62
+ return obj;
63
+ }
64
+ function _instanceof(left, right) {
65
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
66
+ return !!right[Symbol.hasInstance](left);
67
+ } else {
68
+ return left instanceof right;
69
+ }
70
+ }
71
+ function _object_spread(target) {
72
+ for(var i = 1; i < arguments.length; i++){
73
+ var source = arguments[i] != null ? arguments[i] : {};
74
+ var ownKeys = Object.keys(source);
75
+ if (typeof Object.getOwnPropertySymbols === "function") {
76
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
77
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
78
+ }));
79
+ }
80
+ ownKeys.forEach(function(key) {
81
+ _define_property(target, key, source[key]);
82
+ });
83
+ }
84
+ return target;
85
+ }
86
+ function ownKeys(object, enumerableOnly) {
87
+ var keys = Object.keys(object);
88
+ if (Object.getOwnPropertySymbols) {
89
+ var symbols = Object.getOwnPropertySymbols(object);
90
+ if (enumerableOnly) {
91
+ symbols = symbols.filter(function(sym) {
92
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
93
+ });
94
+ }
95
+ keys.push.apply(keys, symbols);
96
+ }
97
+ return keys;
98
+ }
99
+ function _object_spread_props(target, source) {
100
+ source = source != null ? source : {};
101
+ if (Object.getOwnPropertyDescriptors) {
102
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
103
+ } else {
104
+ ownKeys(Object(source)).forEach(function(key) {
105
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
106
+ });
107
+ }
108
+ return target;
109
+ }
110
+ function _ts_generator(thisArg, body) {
111
+ var f, y, t, _ = {
112
+ label: 0,
113
+ sent: function() {
114
+ if (t[0] & 1) throw t[1];
115
+ return t[1];
116
+ },
117
+ trys: [],
118
+ ops: []
119
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
120
+ return d(g, "next", {
121
+ value: verb(0)
122
+ }), d(g, "throw", {
123
+ value: verb(1)
124
+ }), d(g, "return", {
125
+ value: verb(2)
126
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
127
+ value: function() {
128
+ return this;
129
+ }
130
+ }), g;
131
+ function verb(n) {
132
+ return function(v) {
133
+ return step([
134
+ n,
135
+ v
136
+ ]);
137
+ };
138
+ }
139
+ function step(op) {
140
+ if (f) throw new TypeError("Generator is already executing.");
141
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
142
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
143
+ if (y = 0, t) op = [
144
+ op[0] & 2,
145
+ t.value
146
+ ];
147
+ switch(op[0]){
148
+ case 0:
149
+ case 1:
150
+ t = op;
151
+ break;
152
+ case 4:
153
+ _.label++;
154
+ return {
155
+ value: op[1],
156
+ done: false
157
+ };
158
+ case 5:
159
+ _.label++;
160
+ y = op[1];
161
+ op = [
162
+ 0
163
+ ];
164
+ continue;
165
+ case 7:
166
+ op = _.ops.pop();
167
+ _.trys.pop();
168
+ continue;
169
+ default:
170
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
171
+ _ = 0;
172
+ continue;
173
+ }
174
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
175
+ _.label = op[1];
176
+ break;
177
+ }
178
+ if (op[0] === 6 && _.label < t[1]) {
179
+ _.label = t[1];
180
+ t = op;
181
+ break;
182
+ }
183
+ if (t && _.label < t[2]) {
184
+ _.label = t[2];
185
+ _.ops.push(op);
186
+ break;
187
+ }
188
+ if (t[2]) _.ops.pop();
189
+ _.trys.pop();
190
+ continue;
191
+ }
192
+ op = body.call(thisArg, _);
193
+ } catch (e) {
194
+ op = [
195
+ 6,
196
+ e
197
+ ];
198
+ y = 0;
199
+ } finally{
200
+ f = t = 0;
201
+ }
202
+ if (op[0] & 5) throw op[1];
203
+ return {
204
+ value: op[0] ? op[1] : void 0,
205
+ done: true
206
+ };
207
+ }
208
+ }
209
+ var AuthRequiredBranchSchema = _oauthmicrosoft.schemas.AuthRequiredBranchSchema;
210
+ var DEFAULT_PAGE_SIZE = 50;
211
+ var DEFAULT_MAX_ITEMS = 10000;
212
+ var MAX_EXPORT_ITEMS = 50000;
213
+ var ExportResultSchema = _zod.z.object({
214
+ uri: _zod.z.string().describe('File URI (file:// or http://)'),
215
+ filename: _zod.z.string().describe('Stored filename'),
216
+ rowCount: _zod.z.number().describe('Number of messages exported'),
217
+ truncated: _zod.z.boolean().describe('Whether export was truncated at maxItems')
218
+ });
219
+ var inputSchema = _zod.z.object({
220
+ query: _outlookqueryschema.OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),
221
+ maxItems: _zod.z.number().int().positive().max(MAX_EXPORT_ITEMS).default(DEFAULT_MAX_ITEMS).describe("Maximum messages to export (default: ".concat(DEFAULT_MAX_ITEMS, ", max: ").concat(MAX_EXPORT_ITEMS, ")")),
222
+ filename: _zod.z.string().trim().min(1).default('outlook-messages.csv').describe('Output filename (default: outlook-messages.csv)'),
223
+ contentType: _email.EmailContentTypeSchema,
224
+ excludeThreadHistory: _email.ExcludeThreadHistorySchema
225
+ });
226
+ // Success branch schema
227
+ var successBranchSchema = ExportResultSchema.extend({
228
+ type: _zod.z.literal('success')
229
+ });
230
+ // Output schema with auth_required support
231
+ var outputSchema = _zod.z.discriminatedUnion('type', [
232
+ successBranchSchema,
233
+ AuthRequiredBranchSchema
234
+ ]);
235
+ var config = {
236
+ description: 'Export Outlook messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.',
237
+ inputSchema: inputSchema,
238
+ outputSchema: _zod.z.object({
239
+ result: outputSchema
240
+ })
241
+ };
242
+ /**
243
+ * Handler for outlook-messages-export-csv tool
244
+ *
245
+ * CRITICAL: Streaming implementation per user requirements
246
+ * - Generate UUID upfront
247
+ * - Write CSV header immediately
248
+ * - Append rows as batches arrive
249
+ * - Delete partial file on error
250
+ * - NO RETRIES (fail fast on error)
251
+ */ function handler(_0, _1) {
252
+ return _async_to_generator(function(param, extra) {
253
+ var query, maxItems, filename, contentType, excludeThreadHistory, logger, storageContext, transport, storageDir, baseUrl, reservation, storedName, fullPath, graph, csvHeaders, writeStream, headerLine, totalRows, nextPageToken, started, _exec_metadata, remainingItems, pageSize, exec, csvRows, rowsContent, durationMs, truncated, uri, result, error, _cleanupError, message;
254
+ return _ts_generator(this, function(_state) {
255
+ switch(_state.label){
256
+ case 0:
257
+ query = param.query, maxItems = param.maxItems, filename = param.filename, contentType = param.contentType, excludeThreadHistory = param.excludeThreadHistory;
258
+ logger = extra.logger;
259
+ storageContext = extra.storageContext;
260
+ transport = storageContext.transport, storageDir = storageContext.storageDir, baseUrl = storageContext.baseUrl;
261
+ logger.info('outlook.messages.export-csv called', {
262
+ query: query,
263
+ maxItems: maxItems,
264
+ filename: filename,
265
+ accountId: extra.authContext.accountId
266
+ });
267
+ return [
268
+ 4,
269
+ (0, _server.reserveFile)(filename, {
270
+ storageDir: storageDir
271
+ })
272
+ ];
273
+ case 1:
274
+ reservation = _state.sent();
275
+ storedName = reservation.storedName, fullPath = reservation.fullPath;
276
+ logger.info('outlook.messages.export-csv starting streaming export', {
277
+ path: fullPath,
278
+ maxItems: maxItems
279
+ });
280
+ _state.label = 2;
281
+ case 2:
282
+ _state.trys.push([
283
+ 2,
284
+ 7,
285
+ ,
286
+ 12
287
+ ]);
288
+ graph = _microsoftgraphclient.Client.initWithMiddleware({
289
+ authProvider: extra.authContext.auth
290
+ });
291
+ // Create CSV headers (all email fields)
292
+ csvHeaders = [
293
+ 'id',
294
+ 'threadId',
295
+ 'from',
296
+ 'to',
297
+ 'cc',
298
+ 'bcc',
299
+ 'subject',
300
+ 'date',
301
+ 'snippet',
302
+ 'body',
303
+ 'provider',
304
+ 'labels'
305
+ ];
306
+ // Create write stream and write headers immediately
307
+ writeStream = (0, _fs.createWriteStream)(fullPath, {
308
+ encoding: 'utf-8'
309
+ });
310
+ headerLine = (0, _sync.stringify)([
311
+ csvHeaders
312
+ ], {
313
+ header: false,
314
+ quoted: true,
315
+ quote: '"',
316
+ escape: '"'
317
+ });
318
+ writeStream.write(headerLine);
319
+ // Internal pagination loop - append to CSV with each batch
320
+ // NO RETRIES: If any error occurs, fail the whole operation and clean up
321
+ totalRows = 0;
322
+ started = Date.now();
323
+ _state.label = 3;
324
+ case 3:
325
+ if (!(totalRows < maxItems)) return [
326
+ 3,
327
+ 5
328
+ ];
329
+ remainingItems = maxItems - totalRows;
330
+ pageSize = Math.min(remainingItems, DEFAULT_PAGE_SIZE);
331
+ return [
332
+ 4,
333
+ (0, _executequery.executeQuery)(graph, query, _object_spread_props(_object_spread({
334
+ logger: logger,
335
+ pageSize: pageSize
336
+ }, nextPageToken !== undefined && {
337
+ pageToken: nextPageToken
338
+ }), {
339
+ includeBody: true,
340
+ limit: pageSize
341
+ }), function(m) {
342
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
343
+ var _message_from_emailAddress, _message_from, _message_from1, _message_body, _message_body_contentType, _message_body1;
344
+ var message = m;
345
+ var to = Array.isArray(message === null || message === void 0 ? void 0 : message.toRecipients) ? message.toRecipients.map(function(r) {
346
+ var _ref;
347
+ var _r_emailAddress;
348
+ return (_ref = r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address) !== null && _ref !== void 0 ? _ref : r === null || r === void 0 ? void 0 : r.address;
349
+ }).filter(Boolean).join(', ') : '';
350
+ var cc = Array.isArray(message === null || message === void 0 ? void 0 : message.ccRecipients) ? message.ccRecipients.map(function(r) {
351
+ var _ref;
352
+ var _r_emailAddress;
353
+ return (_ref = r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address) !== null && _ref !== void 0 ? _ref : r === null || r === void 0 ? void 0 : r.address;
354
+ }).filter(Boolean).join(', ') : '';
355
+ var bcc = Array.isArray(message === null || message === void 0 ? void 0 : message.bccRecipients) ? message.bccRecipients.map(function(r) {
356
+ var _ref;
357
+ var _r_emailAddress;
358
+ return (_ref = r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address) !== null && _ref !== void 0 ? _ref : r === null || r === void 0 ? void 0 : r.address;
359
+ }).filter(Boolean).join(', ') : '';
360
+ var fromAddr = (_ref = (_ref1 = message === null || message === void 0 ? void 0 : (_message_from = message.from) === null || _message_from === void 0 ? void 0 : (_message_from_emailAddress = _message_from.emailAddress) === null || _message_from_emailAddress === void 0 ? void 0 : _message_from_emailAddress.address) !== null && _ref1 !== void 0 ? _ref1 : message === null || message === void 0 ? void 0 : (_message_from1 = message.from) === null || _message_from1 === void 0 ? void 0 : _message_from1.address) !== null && _ref !== void 0 ? _ref : '';
361
+ var categories = Array.isArray(message === null || message === void 0 ? void 0 : message.categories) ? message.categories.join(';') : '';
362
+ // Process body based on contentType and excludeThreadHistory options
363
+ var body = (_ref2 = message === null || message === void 0 ? void 0 : (_message_body = message.body) === null || _message_body === void 0 ? void 0 : _message_body.content) !== null && _ref2 !== void 0 ? _ref2 : '';
364
+ var isHtml = (message === null || message === void 0 ? void 0 : (_message_body1 = message.body) === null || _message_body1 === void 0 ? void 0 : (_message_body_contentType = _message_body1.contentType) === null || _message_body_contentType === void 0 ? void 0 : _message_body_contentType.toLowerCase()) === 'html';
365
+ if (isHtml && excludeThreadHistory) {
366
+ body = (0, _email.extractCurrentMessageFromHtml)(body);
367
+ }
368
+ if (isHtml && contentType === 'text') {
369
+ var _ref7;
370
+ var _message_body2;
371
+ body = excludeThreadHistory ? (0, _email.extractCurrentMessageFromHtmlToText)(body) : (0, _email.extractCurrentMessageFromHtmlToText)((_ref7 = message === null || message === void 0 ? void 0 : (_message_body2 = message.body) === null || _message_body2 === void 0 ? void 0 : _message_body2.content) !== null && _ref7 !== void 0 ? _ref7 : '');
372
+ }
373
+ return {
374
+ id: String((_ref3 = message === null || message === void 0 ? void 0 : message.id) !== null && _ref3 !== void 0 ? _ref3 : ''),
375
+ threadId: (message === null || message === void 0 ? void 0 : message.conversationId) ? String(message.conversationId) : '',
376
+ from: fromAddr,
377
+ to: to,
378
+ cc: cc,
379
+ bcc: bcc,
380
+ subject: (_ref4 = message === null || message === void 0 ? void 0 : message.subject) !== null && _ref4 !== void 0 ? _ref4 : '',
381
+ date: (_ref5 = message === null || message === void 0 ? void 0 : message.receivedDateTime) !== null && _ref5 !== void 0 ? _ref5 : '',
382
+ snippet: (_ref6 = message === null || message === void 0 ? void 0 : message.bodyPreview) !== null && _ref6 !== void 0 ? _ref6 : '',
383
+ body: body,
384
+ provider: 'outlook',
385
+ labels: categories
386
+ };
387
+ })
388
+ ];
389
+ case 4:
390
+ exec = _state.sent();
391
+ csvRows = exec.items.map(function(item) {
392
+ return [
393
+ item.id,
394
+ item.threadId,
395
+ item.from,
396
+ item.to,
397
+ item.cc,
398
+ item.bcc,
399
+ item.subject,
400
+ item.date,
401
+ item.snippet,
402
+ item.body,
403
+ item.provider,
404
+ item.labels
405
+ ];
406
+ });
407
+ // Append rows to CSV file immediately
408
+ if (csvRows.length > 0) {
409
+ rowsContent = (0, _sync.stringify)(csvRows, {
410
+ header: false,
411
+ quoted: true,
412
+ quote: '"',
413
+ escape: '"'
414
+ });
415
+ writeStream.write(rowsContent);
416
+ }
417
+ totalRows += exec.items.length;
418
+ nextPageToken = (_exec_metadata = exec.metadata) === null || _exec_metadata === void 0 ? void 0 : _exec_metadata.nextPageToken;
419
+ logger.info('outlook.messages.export-csv batch written', {
420
+ batchSize: exec.items.length,
421
+ totalRows: totalRows,
422
+ hasMore: Boolean(nextPageToken)
423
+ });
424
+ // Exit if no more results or reached maxItems
425
+ if (!nextPageToken || exec.items.length === 0) {
426
+ return [
427
+ 3,
428
+ 5
429
+ ];
430
+ }
431
+ return [
432
+ 3,
433
+ 3
434
+ ];
435
+ case 5:
436
+ // Close write stream
437
+ return [
438
+ 4,
439
+ new Promise(function(resolve, reject) {
440
+ writeStream.end(function() {
441
+ return resolve();
442
+ });
443
+ writeStream.on('error', reject);
444
+ })
445
+ ];
446
+ case 6:
447
+ _state.sent();
448
+ durationMs = Date.now() - started;
449
+ truncated = totalRows >= maxItems && Boolean(nextPageToken);
450
+ logger.info('outlook.messages.export-csv completed', {
451
+ rowCount: totalRows,
452
+ truncated: truncated,
453
+ durationMs: durationMs,
454
+ filename: storedName
455
+ });
456
+ // Generate URI based on transport type (stdio: file://, HTTP: http://)
457
+ uri = (0, _server.getFileUri)(storedName, transport, _object_spread_props(_object_spread({
458
+ storageDir: storageDir
459
+ }, baseUrl && {
460
+ baseUrl: baseUrl
461
+ }), {
462
+ endpoint: '/files'
463
+ }));
464
+ result = {
465
+ type: 'success',
466
+ uri: uri,
467
+ filename: storedName,
468
+ rowCount: totalRows,
469
+ truncated: truncated
470
+ };
471
+ return [
472
+ 2,
473
+ {
474
+ content: [
475
+ {
476
+ type: 'text',
477
+ text: JSON.stringify(result)
478
+ }
479
+ ],
480
+ structuredContent: {
481
+ result: result
482
+ }
483
+ }
484
+ ];
485
+ case 7:
486
+ error = _state.sent();
487
+ _state.label = 8;
488
+ case 8:
489
+ _state.trys.push([
490
+ 8,
491
+ 10,
492
+ ,
493
+ 11
494
+ ]);
495
+ return [
496
+ 4,
497
+ (0, _promises.unlink)(fullPath)
498
+ ];
499
+ case 9:
500
+ _state.sent();
501
+ logger.debug('Cleaned up partial CSV file after error', {
502
+ path: fullPath
503
+ });
504
+ return [
505
+ 3,
506
+ 11
507
+ ];
508
+ case 10:
509
+ _cleanupError = _state.sent();
510
+ logger.debug('Could not clean up CSV file (may not exist)', {
511
+ path: fullPath
512
+ });
513
+ return [
514
+ 3,
515
+ 11
516
+ ];
517
+ case 11:
518
+ message = _instanceof(error, Error) ? error.message : String(error);
519
+ logger.error('outlook.messages.export-csv error', {
520
+ error: message
521
+ });
522
+ throw new _types.McpError(_types.ErrorCode.InternalError, "Error exporting messages to CSV: ".concat(message), {
523
+ stack: _instanceof(error, Error) ? error.stack : undefined
524
+ });
525
+ case 12:
526
+ return [
527
+ 2
528
+ ];
529
+ }
530
+ });
531
+ }).apply(this, arguments);
532
+ }
533
+ function createTool() {
534
+ return {
535
+ name: 'messages-export-csv',
536
+ config: config,
537
+ handler: handler
538
+ };
539
+ }
540
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/messages-export-csv.ts"],"sourcesContent":["/** Outlook message CSV export tool - streams results to file without loading all data into context */\n\nimport { EmailContentTypeSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { getFileUri, reserveFile, type ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { stringify } from 'csv-stringify/sync';\nimport { createWriteStream } from 'fs';\nimport { unlink } from 'fs/promises';\nimport { z } from 'zod';\nimport { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.js';\nimport { OutlookQuerySchema } from '../../schemas/outlook-query-schema.js';\nimport type { StorageExtra } from '../../types.js';\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst DEFAULT_MAX_ITEMS = 10000;\nconst MAX_EXPORT_ITEMS = 50000;\n\nconst ExportResultSchema = z.object({\n uri: z.string().describe('File URI (file:// or http://)'),\n filename: z.string().describe('Stored filename'),\n rowCount: z.number().describe('Number of messages exported'),\n truncated: z.boolean().describe('Whether export was truncated at maxItems'),\n});\n\nconst inputSchema = z.object({\n query: OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),\n maxItems: z.number().int().positive().max(MAX_EXPORT_ITEMS).default(DEFAULT_MAX_ITEMS).describe(`Maximum messages to export (default: ${DEFAULT_MAX_ITEMS}, max: ${MAX_EXPORT_ITEMS})`),\n filename: z.string().trim().min(1).default('outlook-messages.csv').describe('Output filename (default: outlook-messages.csv)'),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema\nconst successBranchSchema = ExportResultSchema.extend({\n type: z.literal('success'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Export Outlook messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n/**\n * Handler for outlook-messages-export-csv tool\n *\n * CRITICAL: Streaming implementation per user requirements\n * - Generate UUID upfront\n * - Write CSV header immediately\n * - Append rows as batches arrive\n * - Delete partial file on error\n * - NO RETRIES (fail fast on error)\n */\nasync function handler({ query, maxItems, filename, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra & StorageExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n const { storageContext } = extra;\n const { transport, storageDir, baseUrl } = storageContext;\n\n logger.info('outlook.messages.export-csv called', {\n query,\n maxItems,\n filename,\n accountId: extra.authContext.accountId,\n });\n\n // Reserve file location for streaming write (creates directory, generates ID, formats filename)\n const reservation = await reserveFile(filename, {\n storageDir,\n });\n const { storedName, fullPath } = reservation;\n\n logger.info('outlook.messages.export-csv starting streaming export', { path: fullPath, maxItems });\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n\n // Create CSV headers (all email fields)\n const csvHeaders = ['id', 'threadId', 'from', 'to', 'cc', 'bcc', 'subject', 'date', 'snippet', 'body', 'provider', 'labels'];\n\n // Create write stream and write headers immediately\n const writeStream = createWriteStream(fullPath, { encoding: 'utf-8' });\n const headerLine = stringify([csvHeaders], { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(headerLine);\n\n // Internal pagination loop - append to CSV with each batch\n // NO RETRIES: If any error occurs, fail the whole operation and clean up\n let totalRows = 0;\n let nextPageToken: string | undefined;\n const started = Date.now();\n\n while (totalRows < maxItems) {\n const remainingItems = maxItems - totalRows;\n const pageSize = Math.min(remainingItems, DEFAULT_PAGE_SIZE);\n\n const exec: {\n items: Array<{\n id: string;\n threadId?: string;\n from: string;\n to: string;\n cc: string;\n bcc: string;\n subject: string;\n date: string;\n snippet: string;\n body: string;\n provider: string;\n labels: string;\n }>;\n metadata?: { nextPageToken?: string };\n } = await executeOutlookQuery(\n graph,\n query,\n {\n logger,\n pageSize,\n ...(nextPageToken !== undefined && { pageToken: nextPageToken }),\n includeBody: true, // Always include body for CSV export\n limit: pageSize,\n },\n (m: unknown) => {\n const message = m as MicrosoftGraph.Message;\n const to = Array.isArray(message?.toRecipients)\n ? message.toRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address ?? (r as { address?: string })?.address)\n .filter(Boolean)\n .join(', ')\n : '';\n const cc = Array.isArray(message?.ccRecipients)\n ? message.ccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address ?? (r as { address?: string })?.address)\n .filter(Boolean)\n .join(', ')\n : '';\n const bcc = Array.isArray(message?.bccRecipients)\n ? message.bccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address ?? (r as { address?: string })?.address)\n .filter(Boolean)\n .join(', ')\n : '';\n const fromAddr = message?.from?.emailAddress?.address ?? (message?.from as { address?: string })?.address ?? '';\n const categories = Array.isArray(message?.categories) ? message.categories.join(';') : '';\n\n // Process body based on contentType and excludeThreadHistory options\n let body = message?.body?.content ?? '';\n const isHtml = message?.body?.contentType?.toLowerCase() === 'html';\n\n if (isHtml && excludeThreadHistory) {\n body = extractCurrentMessageFromHtml(body);\n }\n\n if (isHtml && contentType === 'text') {\n body = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(body) : extractCurrentMessageFromHtmlToText(message?.body?.content ?? '');\n }\n\n return {\n id: String(message?.id ?? ''),\n threadId: message?.conversationId ? String(message.conversationId) : '',\n from: fromAddr,\n to,\n cc,\n bcc,\n subject: message?.subject ?? '',\n date: message?.receivedDateTime ?? '',\n snippet: message?.bodyPreview ?? '',\n body,\n provider: 'outlook' as const,\n labels: categories,\n };\n }\n );\n\n const csvRows = exec.items.map((item) => {\n return [item.id, item.threadId, item.from, item.to, item.cc, item.bcc, item.subject, item.date, item.snippet, item.body, item.provider, item.labels];\n });\n\n // Append rows to CSV file immediately\n if (csvRows.length > 0) {\n const rowsContent = stringify(csvRows, { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(rowsContent);\n }\n\n totalRows += exec.items.length;\n nextPageToken = exec.metadata?.nextPageToken;\n\n logger.info('outlook.messages.export-csv batch written', {\n batchSize: exec.items.length,\n totalRows,\n hasMore: Boolean(nextPageToken),\n });\n\n // Exit if no more results or reached maxItems\n if (!nextPageToken || exec.items.length === 0) {\n break;\n }\n }\n\n // Close write stream\n await new Promise<void>((resolve, reject) => {\n writeStream.end(() => resolve());\n writeStream.on('error', reject);\n });\n\n const durationMs = Date.now() - started;\n const truncated = totalRows >= maxItems && Boolean(nextPageToken);\n\n logger.info('outlook.messages.export-csv completed', {\n rowCount: totalRows,\n truncated,\n durationMs,\n filename: storedName,\n });\n\n // Generate URI based on transport type (stdio: file://, HTTP: http://)\n const uri = getFileUri(storedName, transport, {\n storageDir,\n ...(baseUrl && { baseUrl }),\n endpoint: '/files',\n });\n\n const result: Output = {\n type: 'success' as const,\n uri,\n filename: storedName,\n rowCount: totalRows,\n truncated,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n // CRITICAL: Clean up partial CSV file on error\n try {\n await unlink(fullPath);\n logger.debug('Cleaned up partial CSV file after error', { path: fullPath });\n } catch (_cleanupError) {\n logger.debug('Could not clean up CSV file (may not exist)', { path: fullPath });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.messages.export-csv error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error exporting messages to CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'messages-export-csv',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","DEFAULT_PAGE_SIZE","DEFAULT_MAX_ITEMS","MAX_EXPORT_ITEMS","ExportResultSchema","z","object","uri","string","describe","filename","rowCount","number","truncated","boolean","inputSchema","query","OutlookQuerySchema","optional","maxItems","int","positive","max","default","trim","min","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","storageContext","transport","storageDir","baseUrl","reservation","storedName","fullPath","graph","csvHeaders","writeStream","headerLine","totalRows","nextPageToken","started","exec","remainingItems","pageSize","csvRows","rowsContent","durationMs","error","_cleanupError","message","info","accountId","authContext","reserveFile","path","Client","initWithMiddleware","authProvider","auth","createWriteStream","encoding","stringify","header","quoted","quote","escape","write","Date","now","Math","executeOutlookQuery","undefined","pageToken","includeBody","limit","m","to","Array","isArray","toRecipients","map","r","emailAddress","address","filter","Boolean","join","cc","ccRecipients","bcc","bccRecipients","fromAddr","from","categories","body","content","isHtml","toLowerCase","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","id","String","threadId","conversationId","subject","date","receivedDateTime","snippet","bodyPreview","provider","labels","items","item","length","metadata","batchSize","hasMore","Promise","resolve","reject","end","on","getFileUri","endpoint","text","JSON","structuredContent","unlink","debug","Error","McpError","ErrorCode","InternalError","stack","name"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ { "type": "commonjs" }
@@ -0,0 +1,2 @@
1
+ export * from './outlook-query-schema.js';
2
+ export * from './outlook-validation.js';
@@ -0,0 +1,2 @@
1
+ export * from './outlook-query-schema.js';
2
+ export * from './outlook-validation.js';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./outlook-query-schema.js"), exports);
6
+ _export_star(require("./outlook-validation.js"), exports);
7
+ function _export_star(from, to) {
8
+ Object.keys(from).forEach(function(k) {
9
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
10
+ Object.defineProperty(to, k, {
11
+ enumerable: true,
12
+ get: function() {
13
+ return from[k];
14
+ }
15
+ });
16
+ }
17
+ });
18
+ return from;
19
+ }
20
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/schemas/index.ts"],"sourcesContent":["export * from './outlook-query-schema.js';\nexport * from './outlook-validation.js';\n"],"names":[],"mappings":";;;;qBAAc;qBACA"}