@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,138 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
2
+ import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
6
+ objects: "objects";
7
+ arrays: "arrays";
8
+ }>>>;
9
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
10
+ text: "text";
11
+ html: "html";
12
+ }>>>;
13
+ excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
14
+ pageSize: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
15
+ pageToken: z.ZodOptional<z.ZodString>;
16
+ query: z.ZodOptional<z.ZodType<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown>>>;
17
+ fields: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ declare const outputSchema: z.ZodUnion<readonly [z.ZodObject<{
20
+ type: z.ZodLiteral<"success">;
21
+ shape: z.ZodLiteral<"objects">;
22
+ items: z.ZodArray<z.ZodObject<{
23
+ id: z.ZodOptional<z.ZodString>;
24
+ threadId: z.ZodOptional<z.ZodString>;
25
+ subject: z.ZodOptional<z.ZodString>;
26
+ from: z.ZodOptional<z.ZodString>;
27
+ fromName: z.ZodOptional<z.ZodString>;
28
+ to: z.ZodOptional<z.ZodString>;
29
+ cc: z.ZodOptional<z.ZodString>;
30
+ bcc: z.ZodOptional<z.ZodString>;
31
+ date: z.ZodOptional<z.ZodString>;
32
+ receivedDateTime: z.ZodOptional<z.ZodString>;
33
+ snippet: z.ZodOptional<z.ZodString>;
34
+ isRead: z.ZodOptional<z.ZodBoolean>;
35
+ isImportant: z.ZodOptional<z.ZodBoolean>;
36
+ hasAttachments: z.ZodOptional<z.ZodBoolean>;
37
+ attachmentCount: z.ZodOptional<z.ZodNumber>;
38
+ labelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ folderName: z.ZodOptional<z.ZodString>;
40
+ body: z.ZodOptional<z.ZodString>;
41
+ bodyContentType: z.ZodOptional<z.ZodEnum<{
42
+ text: "text";
43
+ html: "html";
44
+ }>>;
45
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
46
+ id: z.ZodString;
47
+ filename: z.ZodString;
48
+ mimeType: z.ZodString;
49
+ size: z.ZodOptional<z.ZodNumber>;
50
+ }, z.core.$strip>>>;
51
+ }, z.core.$strip>>;
52
+ nextPageToken: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<"success">;
55
+ shape: z.ZodLiteral<"arrays">;
56
+ columns: z.ZodArray<z.ZodString>;
57
+ rows: z.ZodArray<z.ZodArray<z.ZodUnknown>>;
58
+ nextPageToken: z.ZodOptional<z.ZodString>;
59
+ }, z.core.$strip>, z.ZodObject<{
60
+ type: z.ZodLiteral<"auth_required">;
61
+ provider: z.ZodString;
62
+ message: z.ZodString;
63
+ url: z.ZodOptional<z.ZodString>;
64
+ }, z.core.$strip>]>;
65
+ export type Input = z.infer<typeof inputSchema>;
66
+ export type Output = z.infer<typeof outputSchema>;
67
+ declare function handler({ query, pageSize, pageToken, fields, shape, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
68
+ export default function createTool(): {
69
+ name: string;
70
+ config: {
71
+ readonly description: "Search Outlook messages using structured query objects with flexible field selection.";
72
+ readonly inputSchema: z.ZodObject<{
73
+ shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
74
+ objects: "objects";
75
+ arrays: "arrays";
76
+ }>>>;
77
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
78
+ text: "text";
79
+ html: "html";
80
+ }>>>;
81
+ excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
82
+ pageSize: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
83
+ pageToken: z.ZodOptional<z.ZodString>;
84
+ query: z.ZodOptional<z.ZodType<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown>>>;
85
+ fields: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strip>;
87
+ readonly outputSchema: z.ZodObject<{
88
+ result: z.ZodUnion<readonly [z.ZodObject<{
89
+ type: z.ZodLiteral<"success">;
90
+ shape: z.ZodLiteral<"objects">;
91
+ items: z.ZodArray<z.ZodObject<{
92
+ id: z.ZodOptional<z.ZodString>;
93
+ threadId: z.ZodOptional<z.ZodString>;
94
+ subject: z.ZodOptional<z.ZodString>;
95
+ from: z.ZodOptional<z.ZodString>;
96
+ fromName: z.ZodOptional<z.ZodString>;
97
+ to: z.ZodOptional<z.ZodString>;
98
+ cc: z.ZodOptional<z.ZodString>;
99
+ bcc: z.ZodOptional<z.ZodString>;
100
+ date: z.ZodOptional<z.ZodString>;
101
+ receivedDateTime: z.ZodOptional<z.ZodString>;
102
+ snippet: z.ZodOptional<z.ZodString>;
103
+ isRead: z.ZodOptional<z.ZodBoolean>;
104
+ isImportant: z.ZodOptional<z.ZodBoolean>;
105
+ hasAttachments: z.ZodOptional<z.ZodBoolean>;
106
+ attachmentCount: z.ZodOptional<z.ZodNumber>;
107
+ labelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
108
+ folderName: z.ZodOptional<z.ZodString>;
109
+ body: z.ZodOptional<z.ZodString>;
110
+ bodyContentType: z.ZodOptional<z.ZodEnum<{
111
+ text: "text";
112
+ html: "html";
113
+ }>>;
114
+ attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
115
+ id: z.ZodString;
116
+ filename: z.ZodString;
117
+ mimeType: z.ZodString;
118
+ size: z.ZodOptional<z.ZodNumber>;
119
+ }, z.core.$strip>>>;
120
+ }, z.core.$strip>>;
121
+ nextPageToken: z.ZodOptional<z.ZodString>;
122
+ }, z.core.$strip>, z.ZodObject<{
123
+ type: z.ZodLiteral<"success">;
124
+ shape: z.ZodLiteral<"arrays">;
125
+ columns: z.ZodArray<z.ZodString>;
126
+ rows: z.ZodArray<z.ZodArray<z.ZodUnknown>>;
127
+ nextPageToken: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strip>, z.ZodObject<{
129
+ type: z.ZodLiteral<"auth_required">;
130
+ provider: z.ZodString;
131
+ message: z.ZodString;
132
+ url: z.ZodOptional<z.ZodString>;
133
+ }, z.core.$strip>]>;
134
+ }, z.core.$strip>;
135
+ };
136
+ handler: typeof handler;
137
+ };
138
+ export {};
@@ -0,0 +1,184 @@
1
+ import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';
2
+ import { schemas } from '@mcp-z/oauth-microsoft';
3
+ const { AuthRequiredBranchSchema } = schemas;
4
+ import { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, toColumnarFormat } from '@mcp-z/server';
5
+ import { Client } from '@microsoft/microsoft-graph-client';
6
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
7
+ import { z } from 'zod';
8
+ import { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.js';
9
+ import { OutlookQuerySchema } from '../../schemas/outlook-query-schema.js';
10
+ const inputSchema = z.object({
11
+ query: OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),
12
+ fields: createFieldsSchema({
13
+ availableFields: EMAIL_FIELDS,
14
+ fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,
15
+ commonPatterns: EMAIL_COMMON_PATTERNS,
16
+ resourceName: 'email message'
17
+ }),
18
+ ...createPaginationSchema({
19
+ defaultPageSize: 50,
20
+ maxPageSize: 500,
21
+ provider: 'outlook'
22
+ }).shape,
23
+ shape: createShapeSchema(),
24
+ contentType: EmailContentTypeSchema,
25
+ excludeThreadHistory: ExcludeThreadHistorySchema
26
+ });
27
+ // Success branch schemas for different shapes
28
+ const successObjectsBranchSchema = z.object({
29
+ type: z.literal('success'),
30
+ shape: z.literal('objects'),
31
+ items: z.array(EmailDetailSchema).describe('Matching email messages'),
32
+ nextPageToken: z.string().optional().describe('Token for fetching next page of results')
33
+ });
34
+ const successArraysBranchSchema = z.object({
35
+ type: z.literal('success'),
36
+ shape: z.literal('arrays'),
37
+ columns: z.array(z.string()).describe('Column names in canonical order'),
38
+ rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),
39
+ nextPageToken: z.string().optional().describe('Token for fetching next page of results')
40
+ });
41
+ // Output schema with auth_required support
42
+ // Using z.union instead of discriminatedUnion since we have two success branches with different shapes
43
+ const outputSchema = z.union([
44
+ successObjectsBranchSchema,
45
+ successArraysBranchSchema,
46
+ AuthRequiredBranchSchema
47
+ ]);
48
+ const config = {
49
+ description: 'Search Outlook messages using structured query objects with flexible field selection.',
50
+ inputSchema: inputSchema,
51
+ outputSchema: z.object({
52
+ result: outputSchema
53
+ })
54
+ };
55
+ async function handler({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }, extra) {
56
+ const logger = extra.logger;
57
+ const requestedFields = parseFields(fields, EMAIL_FIELDS);
58
+ const includeBody = requestedFields === 'all' || requestedFields.has('body');
59
+ logger.info('outlook.search called with', {
60
+ query,
61
+ pageSize,
62
+ pageToken: pageToken ? '[provided]' : undefined,
63
+ fields: fields || 'all',
64
+ includeBody
65
+ });
66
+ try {
67
+ const graph = Client.initWithMiddleware({
68
+ authProvider: extra.authContext.auth
69
+ });
70
+ const started = Date.now();
71
+ const exec = await executeOutlookQuery(graph, query, {
72
+ logger,
73
+ pageSize,
74
+ ...pageToken ? {
75
+ pageToken
76
+ } : {},
77
+ includeBody,
78
+ limit: pageSize
79
+ }, (m)=>{
80
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
81
+ var _message_from_emailAddress, _message_from, _message_from_emailAddress1, _message_from1, _message_body;
82
+ const message = m;
83
+ const to = Array.isArray(message === null || message === void 0 ? void 0 : message.toRecipients) ? message.toRecipients.map((r)=>{
84
+ var _r_emailAddress;
85
+ return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
86
+ }).filter(Boolean).join(', ') : undefined;
87
+ const cc = Array.isArray(message === null || message === void 0 ? void 0 : message.ccRecipients) ? message.ccRecipients.map((r)=>{
88
+ var _r_emailAddress;
89
+ return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
90
+ }).filter(Boolean).join(', ') : undefined;
91
+ const bcc = Array.isArray(message === null || message === void 0 ? void 0 : message.bccRecipients) ? message.bccRecipients.map((r)=>{
92
+ var _r_emailAddress;
93
+ return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
94
+ }).filter(Boolean).join(', ') : undefined;
95
+ const fromAddr = (_ref = 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 && _ref !== void 0 ? _ref : null;
96
+ const fromName = (_ref1 = message === null || message === void 0 ? void 0 : (_message_from1 = message.from) === null || _message_from1 === void 0 ? void 0 : (_message_from_emailAddress1 = _message_from1.emailAddress) === null || _message_from_emailAddress1 === void 0 ? void 0 : _message_from_emailAddress1.name) !== null && _ref1 !== void 0 ? _ref1 : null;
97
+ // Process body based on contentType and excludeThreadHistory options
98
+ let bodyContent;
99
+ if (includeBody && (message === null || message === void 0 ? void 0 : (_message_body = message.body) === null || _message_body === void 0 ? void 0 : _message_body.content)) {
100
+ var _message_body_contentType;
101
+ const isHtml = ((_message_body_contentType = message.body.contentType) === null || _message_body_contentType === void 0 ? void 0 : _message_body_contentType.toLowerCase()) === 'html';
102
+ bodyContent = message.body.content;
103
+ if (isHtml && excludeThreadHistory) {
104
+ bodyContent = extractCurrentMessageFromHtml(bodyContent);
105
+ }
106
+ if (isHtml && contentType === 'text') {
107
+ bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);
108
+ }
109
+ }
110
+ const mapped = {
111
+ id: (_ref2 = message === null || message === void 0 ? void 0 : message.id) !== null && _ref2 !== void 0 ? _ref2 : undefined,
112
+ subject: (_ref3 = message === null || message === void 0 ? void 0 : message.subject) !== null && _ref3 !== void 0 ? _ref3 : undefined,
113
+ from: fromAddr !== null && fromAddr !== void 0 ? fromAddr : undefined,
114
+ fromName: fromName !== null && fromName !== void 0 ? fromName : undefined,
115
+ to,
116
+ cc,
117
+ bcc,
118
+ date: (_ref4 = message === null || message === void 0 ? void 0 : message.receivedDateTime) !== null && _ref4 !== void 0 ? _ref4 : undefined,
119
+ snippet: (_ref5 = message === null || message === void 0 ? void 0 : message.bodyPreview) !== null && _ref5 !== void 0 ? _ref5 : undefined,
120
+ ...bodyContent && {
121
+ body: bodyContent,
122
+ bodyContentType: contentType
123
+ }
124
+ };
125
+ return mapped;
126
+ });
127
+ const durationMs = Date.now() - started;
128
+ const filteredItems = exec.items.map((item)=>filterFields(item, requestedFields));
129
+ logger.info('outlook.message.search returning', {
130
+ query,
131
+ pageSize,
132
+ itemsLength: filteredItems.length,
133
+ fields: fields || 'all'
134
+ });
135
+ logger.info('outlook.message.search metrics', {
136
+ durationMs,
137
+ metadata: exec.metadata
138
+ });
139
+ // Type-safe metadata access
140
+ const metadataObj = exec.metadata;
141
+ // Build result based on shape
142
+ const result = shape === 'arrays' ? {
143
+ type: 'success',
144
+ shape: 'arrays',
145
+ ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),
146
+ ...(metadataObj === null || metadataObj === void 0 ? void 0 : metadataObj.nextPageToken) && {
147
+ nextPageToken: metadataObj.nextPageToken
148
+ }
149
+ } : {
150
+ type: 'success',
151
+ shape: 'objects',
152
+ items: filteredItems,
153
+ ...(metadataObj === null || metadataObj === void 0 ? void 0 : metadataObj.nextPageToken) && {
154
+ nextPageToken: metadataObj.nextPageToken
155
+ }
156
+ };
157
+ return {
158
+ content: [
159
+ {
160
+ type: 'text',
161
+ text: JSON.stringify(result)
162
+ }
163
+ ],
164
+ structuredContent: {
165
+ result
166
+ }
167
+ };
168
+ } catch (error) {
169
+ const message = error instanceof Error ? error.message : String(error);
170
+ logger.error('outlook.message.search error', {
171
+ error: message
172
+ });
173
+ throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {
174
+ stack: error instanceof Error ? error.stack : undefined
175
+ });
176
+ }
177
+ }
178
+ export default function createTool() {
179
+ return {
180
+ name: 'message-search',
181
+ config,
182
+ handler
183
+ };
184
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/message-search.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, 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 { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } 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 { z } from 'zod';\nimport { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.js';\nimport { OutlookQuerySchema } from '../../schemas/outlook-query-schema.js';\n\nconst inputSchema = z.object({\n query: OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 500,\n provider: 'outlook',\n }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Outlook messages using structured query objects with flexible field selection.',\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\nasync function handler({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const includeBody = requestedFields === 'all' || requestedFields.has('body');\n\n logger.info('outlook.search called with', {\n query,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n includeBody,\n });\n\n try {\n const graph = Client.initWithMiddleware({\n authProvider: extra.authContext.auth,\n });\n const started = Date.now();\n const exec = await executeOutlookQuery(\n graph,\n query,\n {\n logger,\n pageSize,\n ...(pageToken ? { pageToken } : {}),\n includeBody,\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)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const cc = Array.isArray(message?.ccRecipients)\n ? message.ccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const bcc = Array.isArray(message?.bccRecipients)\n ? message.bccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const fromAddr = message?.from?.emailAddress?.address ?? null;\n const fromName = message?.from?.emailAddress?.name ?? null;\n // Process body based on contentType and excludeThreadHistory options\n let bodyContent: string | undefined;\n if (includeBody && message?.body?.content) {\n const isHtml = message.body.contentType?.toLowerCase() === 'html';\n bodyContent = message.body.content;\n\n if (isHtml && excludeThreadHistory) {\n bodyContent = extractCurrentMessageFromHtml(bodyContent);\n }\n\n if (isHtml && contentType === 'text') {\n bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);\n }\n }\n\n const mapped: Partial<EmailDetail> = {\n id: message?.id ?? undefined,\n subject: message?.subject ?? undefined,\n from: fromAddr ?? undefined,\n fromName: fromName ?? undefined,\n to,\n cc,\n bcc,\n date: message?.receivedDateTime ?? undefined,\n snippet: message?.bodyPreview ?? undefined,\n ...(bodyContent && { body: bodyContent, bodyContentType: contentType }),\n };\n return mapped;\n }\n );\n const durationMs = Date.now() - started;\n\n const filteredItems = exec.items.map((item) => filterFields(item, requestedFields));\n\n logger.info('outlook.message.search returning', {\n query,\n pageSize,\n itemsLength: filteredItems.length,\n fields: fields || 'all',\n });\n logger.info('outlook.message.search metrics', {\n durationMs,\n metadata: exec.metadata,\n });\n\n // Type-safe metadata access\n const metadataObj = exec.metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\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 const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["EMAIL_COMMON_PATTERNS","EMAIL_FIELD_DESCRIPTIONS","EMAIL_FIELDS","EmailContentTypeSchema","EmailDetailSchema","ExcludeThreadHistorySchema","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","schemas","AuthRequiredBranchSchema","createFieldsSchema","createPaginationSchema","createShapeSchema","filterFields","parseFields","toColumnarFormat","Client","ErrorCode","McpError","z","executeQuery","executeOutlookQuery","OutlookQuerySchema","inputSchema","object","query","optional","describe","fields","availableFields","fieldDescriptions","commonPatterns","resourceName","defaultPageSize","maxPageSize","provider","shape","contentType","excludeThreadHistory","successObjectsBranchSchema","type","literal","items","array","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","pageSize","pageToken","extra","logger","requestedFields","includeBody","has","info","undefined","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","exec","limit","m","message","to","Array","isArray","toRecipients","map","r","emailAddress","address","filter","Boolean","join","cc","ccRecipients","bcc","bccRecipients","fromAddr","from","fromName","name","bodyContent","body","content","isHtml","toLowerCase","mapped","id","subject","date","receivedDateTime","snippet","bodyPreview","bodyContentType","durationMs","filteredItems","item","itemsLength","length","metadata","metadataObj","text","JSON","stringify","structuredContent","error","Error","String","InternalError","stack","createTool"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
2
+ import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ to: z.ZodString | z.ZodOptional<z.ZodString>;
6
+ cc: z.ZodString | z.ZodOptional<z.ZodString>;
7
+ bcc: z.ZodString | z.ZodOptional<z.ZodString>;
8
+ subject: z.ZodDefault<z.ZodString>;
9
+ body: z.ZodString;
10
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
11
+ text: "text";
12
+ html: "html";
13
+ }>>>;
14
+ }, z.core.$strip>;
15
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
16
+ id: z.ZodString;
17
+ threadId: z.ZodOptional<z.ZodString>;
18
+ sentAt: z.ZodString;
19
+ recipientCount: z.ZodNumber;
20
+ webLink: z.ZodOptional<z.ZodString>;
21
+ size: z.ZodOptional<z.ZodNumber>;
22
+ type: z.ZodLiteral<"success">;
23
+ }, z.core.$strip>, z.ZodObject<{
24
+ type: z.ZodLiteral<"auth_required">;
25
+ provider: z.ZodString;
26
+ message: z.ZodString;
27
+ url: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>], "type">;
29
+ export type Input = z.infer<typeof inputSchema>;
30
+ export type Output = z.infer<typeof outputSchema>;
31
+ declare function handler({ to, cc, bcc, subject, body, contentType }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
32
+ export default function createTool(): {
33
+ name: string;
34
+ config: {
35
+ readonly description: "Send an email message through Outlook";
36
+ readonly inputSchema: z.ZodObject<{
37
+ to: z.ZodString | z.ZodOptional<z.ZodString>;
38
+ cc: z.ZodString | z.ZodOptional<z.ZodString>;
39
+ bcc: z.ZodString | z.ZodOptional<z.ZodString>;
40
+ subject: z.ZodDefault<z.ZodString>;
41
+ body: z.ZodString;
42
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
43
+ text: "text";
44
+ html: "html";
45
+ }>>>;
46
+ }, z.core.$strip>;
47
+ readonly outputSchema: z.ZodObject<{
48
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
49
+ id: z.ZodString;
50
+ threadId: z.ZodOptional<z.ZodString>;
51
+ sentAt: z.ZodString;
52
+ recipientCount: z.ZodNumber;
53
+ webLink: z.ZodOptional<z.ZodString>;
54
+ size: z.ZodOptional<z.ZodNumber>;
55
+ type: z.ZodLiteral<"success">;
56
+ }, z.core.$strip>, z.ZodObject<{
57
+ type: z.ZodLiteral<"auth_required">;
58
+ provider: z.ZodString;
59
+ message: z.ZodString;
60
+ url: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip>], "type">;
62
+ }, z.core.$strip>;
63
+ };
64
+ handler: typeof handler;
65
+ };
66
+ export {};
@@ -0,0 +1,111 @@
1
+ import { ComposeContentTypeSchema, createEmailRecipientsSchema, createMessageResultSchema } from '@mcp-z/email';
2
+ import { schemas } from '@mcp-z/oauth-microsoft';
3
+ const { AuthRequiredBranchSchema } = schemas;
4
+ import { Client } from '@microsoft/microsoft-graph-client';
5
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
6
+ import { z } from 'zod';
7
+ import { buildOutlookMessage } from '../../email/composition/outlook-message-builder.js';
8
+ const MessageResultSchema = createMessageResultSchema('outlook');
9
+ const inputSchema = z.object({
10
+ to: createEmailRecipientsSchema('to', true),
11
+ cc: createEmailRecipientsSchema('cc', false),
12
+ bcc: createEmailRecipientsSchema('bcc', false),
13
+ subject: z.string().describe('Email subject line').default(''),
14
+ body: z.string().trim().min(1).describe('Email body content (plain text or HTML)'),
15
+ contentType: ComposeContentTypeSchema
16
+ });
17
+ // Success branch schema
18
+ const successBranchSchema = MessageResultSchema.extend({
19
+ type: z.literal('success')
20
+ });
21
+ // Output schema with auth_required support
22
+ const outputSchema = z.discriminatedUnion('type', [
23
+ successBranchSchema,
24
+ AuthRequiredBranchSchema
25
+ ]);
26
+ const config = {
27
+ description: 'Send an email message through Outlook',
28
+ inputSchema: inputSchema,
29
+ outputSchema: z.object({
30
+ result: outputSchema
31
+ })
32
+ };
33
+ async function handler({ to, cc, bcc, subject, body, contentType }, extra) {
34
+ const logger = extra.logger;
35
+ try {
36
+ var _ref, _ref1, _ref2;
37
+ var _message_toRecipients, _message_ccRecipients, _message_bccRecipients;
38
+ const graph = Client.initWithMiddleware({
39
+ authProvider: extra.authContext.auth
40
+ });
41
+ // Use composition module to build the message
42
+ const toArray = to === null || to === void 0 ? void 0 : to.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
43
+ const ccArray = cc === null || cc === void 0 ? void 0 : cc.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
44
+ const bccArray = bcc === null || bcc === void 0 ? void 0 : bcc.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
45
+ const message = buildOutlookMessage({
46
+ to: toArray,
47
+ cc: ccArray && ccArray.length > 0 ? ccArray : undefined,
48
+ bcc: bccArray && bccArray.length > 0 ? bccArray : undefined,
49
+ subject: subject !== null && subject !== void 0 ? subject : '',
50
+ body,
51
+ contentType: contentType === 'html' ? 'HTML' : 'Text'
52
+ });
53
+ // Use draft-send pattern to get message ID
54
+ // 1. Create draft message
55
+ const draft = await graph.api('/me/messages').post(message);
56
+ const messageId = draft.id;
57
+ if (!messageId) {
58
+ logger.error('outlook.message.send draft creation failed - no ID returned');
59
+ throw new McpError(ErrorCode.InternalError, 'Failed to create draft message');
60
+ }
61
+ // 2. Send the draft
62
+ await graph.api(`/me/messages/${messageId}/send`).post({});
63
+ logger.info('Outlook: sent mail successfully', {
64
+ messageId
65
+ });
66
+ const toCount = (_ref = (_message_toRecipients = message.toRecipients) === null || _message_toRecipients === void 0 ? void 0 : _message_toRecipients.length) !== null && _ref !== void 0 ? _ref : 0;
67
+ const ccCount = (_ref1 = (_message_ccRecipients = message.ccRecipients) === null || _message_ccRecipients === void 0 ? void 0 : _message_ccRecipients.length) !== null && _ref1 !== void 0 ? _ref1 : 0;
68
+ const bccCount = (_ref2 = (_message_bccRecipients = message.bccRecipients) === null || _message_bccRecipients === void 0 ? void 0 : _message_bccRecipients.length) !== null && _ref2 !== void 0 ? _ref2 : 0;
69
+ logger.info('outlook.message.send success', {
70
+ toCount,
71
+ ccCount,
72
+ bccCount,
73
+ subject: subject !== null && subject !== void 0 ? subject : '',
74
+ messageId
75
+ });
76
+ const totalRecipients = toCount + ccCount + bccCount;
77
+ const result = {
78
+ type: 'success',
79
+ id: messageId,
80
+ sentAt: new Date().toISOString(),
81
+ recipientCount: totalRecipients,
82
+ webLink: 'https://outlook.live.com/mail/0/sentitems'
83
+ };
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: JSON.stringify(result)
89
+ }
90
+ ],
91
+ structuredContent: {
92
+ result
93
+ }
94
+ };
95
+ } catch (error) {
96
+ const message = error instanceof Error ? error.message : String(error);
97
+ logger.error('outlook.message.send error', {
98
+ error: message
99
+ });
100
+ throw new McpError(ErrorCode.InternalError, `Error sending message: ${message}`, {
101
+ stack: error instanceof Error ? error.stack : undefined
102
+ });
103
+ }
104
+ }
105
+ export default function createTool() {
106
+ return {
107
+ name: 'message-send',
108
+ config,
109
+ handler
110
+ };
111
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/message-send.ts"],"sourcesContent":["import { ComposeContentTypeSchema, createEmailRecipientsSchema, createMessageResultSchema } 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 type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { buildOutlookMessage } from '../../email/composition/outlook-message-builder.js';\n\nconst MessageResultSchema = createMessageResultSchema('outlook');\n\nconst inputSchema = z.object({\n to: createEmailRecipientsSchema('to', true),\n cc: createEmailRecipientsSchema('cc', false),\n bcc: createEmailRecipientsSchema('bcc', false),\n subject: z.string().describe('Email subject line').default(''),\n body: z.string().trim().min(1).describe('Email body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\n// Success branch schema\nconst successBranchSchema = MessageResultSchema.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: 'Send an email message through Outlook',\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\nasync function handler({ to, cc, bcc, subject, body, contentType }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n\n // Use composition module to build the message\n const toArray = to\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n const ccArray = cc\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n const bccArray = bcc\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n\n const message = buildOutlookMessage({\n to: toArray,\n cc: ccArray && ccArray.length > 0 ? ccArray : undefined,\n bcc: bccArray && bccArray.length > 0 ? bccArray : undefined,\n subject: subject ?? '',\n body,\n contentType: contentType === 'html' ? 'HTML' : 'Text',\n });\n\n // Use draft-send pattern to get message ID\n // 1. Create draft message\n const draft = await graph.api('/me/messages').post(message);\n const messageId = draft.id;\n\n if (!messageId) {\n logger.error('outlook.message.send draft creation failed - no ID returned');\n throw new McpError(ErrorCode.InternalError, 'Failed to create draft message');\n }\n\n // 2. Send the draft\n await graph.api(`/me/messages/${messageId}/send`).post({});\n logger.info('Outlook: sent mail successfully', { messageId });\n\n const toCount = message.toRecipients?.length ?? 0;\n const ccCount = message.ccRecipients?.length ?? 0;\n const bccCount = message.bccRecipients?.length ?? 0;\n\n logger.info('outlook.message.send success', { toCount, ccCount, bccCount, subject: subject ?? '', messageId });\n\n const totalRecipients = toCount + ccCount + bccCount;\n const result: Output = {\n type: 'success' as const,\n id: messageId,\n sentAt: new Date().toISOString(),\n recipientCount: totalRecipients,\n webLink: 'https://outlook.live.com/mail/0/sentitems',\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 const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.message.send error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error sending message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-send',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["ComposeContentTypeSchema","createEmailRecipientsSchema","createMessageResultSchema","schemas","AuthRequiredBranchSchema","Client","ErrorCode","McpError","z","buildOutlookMessage","MessageResultSchema","inputSchema","object","to","cc","bcc","subject","string","describe","default","body","trim","min","contentType","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","message","graph","initWithMiddleware","authProvider","authContext","auth","toArray","split","map","addr","filter","ccArray","bccArray","length","undefined","draft","api","post","messageId","id","error","InternalError","info","toCount","toRecipients","ccCount","ccRecipients","bccCount","bccRecipients","totalRecipients","sentAt","Date","toISOString","recipientCount","webLink","content","text","JSON","stringify","structuredContent","Error","String","stack","createTool","name"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /** Outlook message CSV export tool - streams results to file without loading all data into context */
2
+ import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
3
+ import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
4
+ import { z } from 'zod';
5
+ import type { StorageExtra } from '../../types.js';
6
+ declare const inputSchema: z.ZodObject<{
7
+ query: z.ZodOptional<z.ZodType<import("../../types.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").OutlookQuery, unknown>>>;
8
+ maxItems: z.ZodDefault<z.ZodNumber>;
9
+ filename: z.ZodDefault<z.ZodString>;
10
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
11
+ text: "text";
12
+ html: "html";
13
+ }>>>;
14
+ excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
15
+ }, z.core.$strip>;
16
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
17
+ uri: z.ZodString;
18
+ filename: z.ZodString;
19
+ rowCount: z.ZodNumber;
20
+ truncated: z.ZodBoolean;
21
+ type: z.ZodLiteral<"success">;
22
+ }, z.core.$strip>, z.ZodObject<{
23
+ type: z.ZodLiteral<"auth_required">;
24
+ provider: z.ZodString;
25
+ message: z.ZodString;
26
+ url: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>], "type">;
28
+ export type Input = z.infer<typeof inputSchema>;
29
+ export type Output = z.infer<typeof outputSchema>;
30
+ /**
31
+ * Handler for outlook-messages-export-csv tool
32
+ *
33
+ * CRITICAL: Streaming implementation per user requirements
34
+ * - Generate UUID upfront
35
+ * - Write CSV header immediately
36
+ * - Append rows as batches arrive
37
+ * - Delete partial file on error
38
+ * - NO RETRIES (fail fast on error)
39
+ */
40
+ declare function handler({ query, maxItems, filename, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra & StorageExtra): Promise<CallToolResult>;
41
+ export default function createTool(): {
42
+ name: string;
43
+ config: {
44
+ readonly description: "Export Outlook messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.";
45
+ readonly inputSchema: z.ZodObject<{
46
+ query: z.ZodOptional<z.ZodType<import("../../types.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").OutlookQuery, unknown>>>;
47
+ maxItems: z.ZodDefault<z.ZodNumber>;
48
+ filename: z.ZodDefault<z.ZodString>;
49
+ contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
50
+ text: "text";
51
+ html: "html";
52
+ }>>>;
53
+ excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
54
+ }, z.core.$strip>;
55
+ readonly outputSchema: z.ZodObject<{
56
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
57
+ uri: z.ZodString;
58
+ filename: z.ZodString;
59
+ rowCount: z.ZodNumber;
60
+ truncated: z.ZodBoolean;
61
+ type: z.ZodLiteral<"success">;
62
+ }, z.core.$strip>, z.ZodObject<{
63
+ type: z.ZodLiteral<"auth_required">;
64
+ provider: z.ZodString;
65
+ message: z.ZodString;
66
+ url: z.ZodOptional<z.ZodString>;
67
+ }, z.core.$strip>], "type">;
68
+ }, z.core.$strip>;
69
+ };
70
+ handler: typeof handler;
71
+ };
72
+ export {};