@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,37 @@
1
+ import { z } from 'zod';
2
+ export default function createPrompt() {
3
+ const argsSchema = z.object({
4
+ context: z.string().min(1).describe('Email context to draft response for'),
5
+ tone: z.string().optional().describe('Email tone (default: professional)')
6
+ });
7
+ const config = {
8
+ description: 'Draft an email response',
9
+ argsSchema: argsSchema.shape
10
+ };
11
+ const handler = async (args, _extra)=>{
12
+ const { context, tone } = argsSchema.parse(args);
13
+ return {
14
+ messages: [
15
+ {
16
+ role: 'system',
17
+ content: {
18
+ type: 'text',
19
+ text: 'You are an expert email assistant.'
20
+ }
21
+ },
22
+ {
23
+ role: 'user',
24
+ content: {
25
+ type: 'text',
26
+ text: `Draft a ${tone || 'professional'} email:\n\n${context}`
27
+ }
28
+ }
29
+ ]
30
+ };
31
+ };
32
+ return {
33
+ name: 'draft-email',
34
+ config,
35
+ handler
36
+ };
37
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["z","createPrompt","argsSchema","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":"AAGA,SAASA,CAAC,QAAQ,MAAM;AAExB,eAAe,SAASC;IACtB,MAAMC,aAAaF,EAAEG,MAAM,CAAC;QAC1BC,SAASJ,EAAEK,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMR,EAAEK,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,MAAMG,SAAS;QACbC,aAAa;QACbT,YAAYA,WAAWU,KAAK;IAC9B;IAEA,MAAMC,UAAU,OAAOC,MAAgCC;QACrD,MAAM,EAAEX,OAAO,EAAEI,IAAI,EAAE,GAAGN,WAAWc,KAAK,CAACF;QAC3C,OAAO;YACLG,UAAU;gBACR;oBAAEC,MAAM;oBAAmBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM;oBAAqC;gBAAE;gBAC1G;oBAAEH,MAAM;oBAAiBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM,CAAC,QAAQ,EAAEb,QAAQ,eAAe,WAAW,EAAEJ,SAAS;oBAAC;gBAAE;aAC7H;QACH;IACF;IAEA,OAAO;QACLkB,MAAM;QACNZ;QACAG;IACF;AACF"}
@@ -0,0 +1,2 @@
1
+ export { default as draftEmail } from './draft-email.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1,2 @@
1
+ export { default as draftEmail } from './draft-email.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["default","draftEmail","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,UAAU,QAAQ,mBAAmB;AACzD,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
@@ -0,0 +1,19 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ export default function createPrompt(): {
4
+ name: string;
5
+ config: {
6
+ description: string;
7
+ };
8
+ handler: (_args: {
9
+ [x: string]: unknown;
10
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
11
+ messages: {
12
+ role: "user";
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ };
17
+ }[];
18
+ }>;
19
+ };
@@ -0,0 +1,75 @@
1
+ export default function createPrompt() {
2
+ const config = {
3
+ description: 'Reference guide for Outlook query syntax'
4
+ };
5
+ const handler = async (_args, _extra)=>{
6
+ return {
7
+ messages: [
8
+ {
9
+ role: 'user',
10
+ content: {
11
+ type: 'text',
12
+ text: `# Outlook Query Syntax Reference
13
+
14
+ ## Logical Operators
15
+ - \`$and\`: Array of conditions that ALL must match
16
+ - \`$or\`: Array of conditions where ANY must match
17
+ - \`$not\`: Condition that must NOT match
18
+
19
+ ## Email Address Fields
20
+ - \`from\`, \`to\`, \`cc\`, \`bcc\`: String or field operators
21
+
22
+ ## Content Fields
23
+ - \`subject\`: Search subject line
24
+ - \`body\`: Search message body
25
+ - \`text\`: Search all text content
26
+ - \`exactPhrase\`: Strict exact phrase matching (KQL)
27
+
28
+ ## Boolean Flags
29
+ - \`hasAttachment\`: true/false
30
+ - \`isRead\`: true/false
31
+
32
+ ## Date Range
33
+ \`\`\`json
34
+ { "date": { "$gte": "2024-01-01", "$lt": "2024-12-31" } }
35
+ \`\`\`
36
+
37
+ ## Outlook-Specific
38
+ - \`categories\`: work, personal, family, travel, important, urgent
39
+ - \`label\`: User categories (case-sensitive, use outlook-categories-list to discover)
40
+ - \`importance\`: high, normal, low
41
+ - \`kqlQuery\`: Escape hatch for advanced KQL syntax
42
+
43
+ ## Field Operators (for multi-value fields)
44
+ - \`$any\`: OR - matches if ANY value matches
45
+ - \`$all\`: AND - matches if ALL values match
46
+ - \`$none\`: NOT - matches if NONE match
47
+
48
+ ## Example Queries
49
+ \`\`\`json
50
+ // Unread from specific sender
51
+ { "from": "boss@company.com", "isRead": false }
52
+
53
+ // High importance with attachment
54
+ { "importance": "high", "hasAttachment": true }
55
+
56
+ // Multiple senders
57
+ { "from": { "$any": ["alice@example.com", "bob@example.com"] } }
58
+
59
+ // Complex: work OR important category, unread
60
+ { "$and": [
61
+ { "categories": { "$any": ["work", "important"] } },
62
+ { "isRead": false }
63
+ ]}
64
+ \`\`\``
65
+ }
66
+ }
67
+ ]
68
+ };
69
+ };
70
+ return {
71
+ name: 'query-syntax',
72
+ config,
73
+ handler
74
+ };
75
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Outlook query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Outlook Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`exactPhrase\\`: Strict exact phrase matching (KQL)\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Outlook-Specific\n- \\`categories\\`: work, personal, family, travel, important, urgent\n- \\`label\\`: User categories (case-sensitive, use outlook-categories-list to discover)\n- \\`importance\\`: high, normal, low\n- \\`kqlQuery\\`: Escape hatch for advanced KQL syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// High importance with attachment\n{ \"importance\": \"high\", \"hasAttachment\": true }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: work OR important category, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"work\", \"important\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAIA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAoDb,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
@@ -0,0 +1,11 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
3
+ import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ export default function createResource(): {
5
+ name: string;
6
+ template: ResourceTemplate;
7
+ config: import("@modelcontextprotocol/sdk/server/mcp.js").ResourceMetadata;
8
+ handler: (uri: URL, variables: {
9
+ id: string;
10
+ }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ReadResourceResult>;
11
+ };
@@ -0,0 +1,69 @@
1
+ import { normalizeDateToISO as toIsoUtc } from '@mcp-z/email';
2
+ import { Client } from '@microsoft/microsoft-graph-client';
3
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ export default function createResource() {
5
+ const template = new ResourceTemplate('outlook://messages/{id}', {
6
+ list: undefined
7
+ });
8
+ const config = {
9
+ description: 'Outlook message metadata (lightweight: id, subject, from, to, date)',
10
+ mimeType: 'application/json'
11
+ };
12
+ const handler = async (uri, variables, extra)=>{
13
+ try {
14
+ var _message_id, _message_subject, _ref;
15
+ var _message_toRecipients, _message_from_emailAddress, _message_from;
16
+ const { logger, authContext } = extra;
17
+ logger.info(variables, 'outlook-email resource fetch');
18
+ const graph = Client.initWithMiddleware({
19
+ authProvider: authContext.auth
20
+ });
21
+ const message = await graph.api(`/me/messages/${encodeURIComponent(variables.id)}`).get();
22
+ // Build message data
23
+ const toAddresses = (_message_toRecipients = message.toRecipients) === null || _message_toRecipients === void 0 ? void 0 : _message_toRecipients.map((r)=>{
24
+ var _r_emailAddress;
25
+ return (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
26
+ }).filter(Boolean);
27
+ const toStr = toAddresses && toAddresses.length > 0 ? toAddresses.join(', ') : '';
28
+ // Return lightweight metadata only (no body/snippet)
29
+ const metadata = {
30
+ id: (_message_id = message.id) !== null && _message_id !== void 0 ? _message_id : variables.id,
31
+ subject: (_message_subject = message.subject) !== null && _message_subject !== void 0 ? _message_subject : '',
32
+ from: (_ref = (_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 : '',
33
+ to: toStr,
34
+ date: toIsoUtc(message.receivedDateTime) || message.receivedDateTime || ''
35
+ };
36
+ return {
37
+ contents: [
38
+ {
39
+ uri: uri.href,
40
+ mimeType: 'application/json',
41
+ text: JSON.stringify(metadata)
42
+ }
43
+ ]
44
+ };
45
+ } catch (e) {
46
+ var _ref1;
47
+ const { logger } = extra;
48
+ logger.error(e, 'outlook-email resource fetch failed');
49
+ const error = e;
50
+ return {
51
+ contents: [
52
+ {
53
+ uri: uri.href,
54
+ mimeType: 'application/json',
55
+ text: JSON.stringify({
56
+ error: String((_ref1 = error === null || error === void 0 ? void 0 : error.message) !== null && _ref1 !== void 0 ? _ref1 : e)
57
+ })
58
+ }
59
+ ]
60
+ };
61
+ }
62
+ };
63
+ return {
64
+ name: 'email',
65
+ template,
66
+ config,
67
+ handler
68
+ };
69
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/resources/email.ts"],"sourcesContent":["import { normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createResource() {\n const template = new ResourceTemplate('outlook://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Outlook message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'outlook-email resource fetch');\n\n const graph = Client.initWithMiddleware({ authProvider: authContext.auth });\n const message = (await graph.api(`/me/messages/${encodeURIComponent(variables.id)}`).get()) as MicrosoftGraph.Message;\n\n // Build message data\n const toAddresses = message.toRecipients?.map((r) => r.emailAddress?.address).filter(Boolean);\n const toStr = toAddresses && toAddresses.length > 0 ? toAddresses.join(', ') : '';\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: message.id ?? variables.id,\n subject: message.subject ?? '',\n from: message.from?.emailAddress?.address ?? '',\n to: toStr,\n date: toIsoUtc(message.receivedDateTime) || message.receivedDateTime || '',\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'outlook-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["normalizeDateToISO","toIsoUtc","Client","ResourceTemplate","createResource","template","list","undefined","config","description","mimeType","handler","uri","variables","extra","message","logger","authContext","info","graph","initWithMiddleware","authProvider","auth","api","encodeURIComponent","id","get","toAddresses","toRecipients","map","r","emailAddress","address","filter","Boolean","toStr","length","join","metadata","subject","from","to","date","receivedDateTime","contents","href","text","JSON","stringify","e","error","String","name"],"mappings":"AAAA,SAASA,sBAAsBC,QAAQ,QAAQ,eAAe;AAG9D,SAASC,MAAM,QAAQ,oCAAoC;AAE3D,SAASC,gBAAgB,QAAQ,0CAA0C;AAI3E,eAAe,SAASC;IACtB,MAAMC,WAAW,IAAIF,iBAAiB,2BAA2B;QAC/DG,MAAMC;IACR;IACA,MAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,MAAMC,UAAU,OAAOC,KAAUC,WAA2BC;QAC1D,IAAI;gBAcIC,aACKA;gBANSA,uBAOZA,4BAAAA;YAfR,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAE,GAAGH;YAEhCE,OAAOE,IAAI,CAACL,WAAW;YAEvB,MAAMM,QAAQjB,OAAOkB,kBAAkB,CAAC;gBAAEC,cAAcJ,YAAYK,IAAI;YAAC;YACzE,MAAMP,UAAW,MAAMI,MAAMI,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmBX,UAAUY,EAAE,GAAG,EAAEC,GAAG;YAExF,qBAAqB;YACrB,MAAMC,eAAcZ,wBAAAA,QAAQa,YAAY,cAApBb,4CAAAA,sBAAsBc,GAAG,CAAC,CAACC;oBAAMA;wBAAAA,kBAAAA,EAAEC,YAAY,cAAdD,sCAAAA,gBAAgBE,OAAO;eAAEC,MAAM,CAACC;YACrF,MAAMC,QAAQR,eAAeA,YAAYS,MAAM,GAAG,IAAIT,YAAYU,IAAI,CAAC,QAAQ;YAE/E,qDAAqD;YACrD,MAAMC,WAAW;gBACfb,EAAE,GAAEV,cAAAA,QAAQU,EAAE,cAAVV,yBAAAA,cAAcF,UAAUY,EAAE;gBAC9Bc,OAAO,GAAExB,mBAAAA,QAAQwB,OAAO,cAAfxB,8BAAAA,mBAAmB;gBAC5ByB,IAAI,WAAEzB,gBAAAA,QAAQyB,IAAI,cAAZzB,qCAAAA,6BAAAA,cAAcgB,YAAY,cAA1BhB,iDAAAA,2BAA4BiB,OAAO,uCAAI;gBAC7CS,IAAIN;gBACJO,MAAMzC,SAASc,QAAQ4B,gBAAgB,KAAK5B,QAAQ4B,gBAAgB,IAAI;YAC1E;YAEA,OAAO;gBACLC,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAACV;oBACvB;iBACD;YACH;QACF,EAAE,OAAOW,GAAG;;YACV,MAAM,EAAEjC,MAAM,EAAE,GAAGF;YACnBE,OAAOkC,KAAK,CAACD,GAA8B;YAC3C,MAAMC,QAAQD;YACd,OAAO;gBACLL,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAAC;4BAAEE,OAAOC,gBAAOD,kBAAAA,4BAAAA,MAAOnC,OAAO,yCAAIkC;wBAAG;oBAC5D;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLG,MAAM;QACN/C;QACAG;QACAG;IACF;AACF"}
@@ -0,0 +1 @@
1
+ export { default as email } from './email.js';
@@ -0,0 +1 @@
1
+ export { default as email } from './email.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/resources/index.ts"],"sourcesContent":["export { default as email } from './email.js';\n"],"names":["default","email"],"mappings":"AAAA,SAASA,WAAWC,KAAK,QAAQ,aAAa"}
@@ -0,0 +1,96 @@
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<{}, z.core.$strip>;
5
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6
+ type: z.ZodLiteral<"success">;
7
+ items: z.ZodArray<z.ZodObject<{
8
+ id: z.ZodString;
9
+ displayName: z.ZodString;
10
+ color: z.ZodEnum<{
11
+ preset0: "preset0";
12
+ preset1: "preset1";
13
+ preset2: "preset2";
14
+ preset3: "preset3";
15
+ preset4: "preset4";
16
+ preset5: "preset5";
17
+ preset6: "preset6";
18
+ preset7: "preset7";
19
+ preset8: "preset8";
20
+ preset9: "preset9";
21
+ preset10: "preset10";
22
+ preset11: "preset11";
23
+ preset12: "preset12";
24
+ preset13: "preset13";
25
+ preset14: "preset14";
26
+ preset15: "preset15";
27
+ preset16: "preset16";
28
+ preset17: "preset17";
29
+ preset18: "preset18";
30
+ preset19: "preset19";
31
+ preset20: "preset20";
32
+ preset21: "preset21";
33
+ preset22: "preset22";
34
+ preset23: "preset23";
35
+ preset24: "preset24";
36
+ }>;
37
+ }, z.core.$strip>>;
38
+ }, z.core.$strip>, z.ZodObject<{
39
+ type: z.ZodLiteral<"auth_required">;
40
+ provider: z.ZodString;
41
+ message: z.ZodString;
42
+ url: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strip>], "type">;
44
+ export type Input = z.infer<typeof inputSchema>;
45
+ export type Output = z.infer<typeof outputSchema>;
46
+ declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
47
+ export default function createTool(): {
48
+ name: string;
49
+ config: {
50
+ readonly description: "List Outlook categories with colors and names.";
51
+ readonly inputSchema: z.ZodObject<{}, z.core.$strip>;
52
+ readonly outputSchema: z.ZodObject<{
53
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
54
+ type: z.ZodLiteral<"success">;
55
+ items: z.ZodArray<z.ZodObject<{
56
+ id: z.ZodString;
57
+ displayName: z.ZodString;
58
+ color: z.ZodEnum<{
59
+ preset0: "preset0";
60
+ preset1: "preset1";
61
+ preset2: "preset2";
62
+ preset3: "preset3";
63
+ preset4: "preset4";
64
+ preset5: "preset5";
65
+ preset6: "preset6";
66
+ preset7: "preset7";
67
+ preset8: "preset8";
68
+ preset9: "preset9";
69
+ preset10: "preset10";
70
+ preset11: "preset11";
71
+ preset12: "preset12";
72
+ preset13: "preset13";
73
+ preset14: "preset14";
74
+ preset15: "preset15";
75
+ preset16: "preset16";
76
+ preset17: "preset17";
77
+ preset18: "preset18";
78
+ preset19: "preset19";
79
+ preset20: "preset20";
80
+ preset21: "preset21";
81
+ preset22: "preset22";
82
+ preset23: "preset23";
83
+ preset24: "preset24";
84
+ }>;
85
+ }, z.core.$strip>>;
86
+ }, z.core.$strip>, z.ZodObject<{
87
+ type: z.ZodLiteral<"auth_required">;
88
+ provider: z.ZodString;
89
+ message: z.ZodString;
90
+ url: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strip>], "type">;
92
+ }, z.core.$strip>;
93
+ };
94
+ handler: typeof handler;
95
+ };
96
+ export {};
@@ -0,0 +1,78 @@
1
+ import { schemas } from '@mcp-z/oauth-microsoft';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { Client } from '@microsoft/microsoft-graph-client';
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { z } from 'zod';
6
+ import { OutlookCategorySchema } from '../../schemas/index.js';
7
+ const inputSchema = z.object({});
8
+ // Success branch schema
9
+ const successBranchSchema = z.object({
10
+ type: z.literal('success'),
11
+ items: z.array(OutlookCategorySchema)
12
+ });
13
+ // Output schema with auth_required support
14
+ const outputSchema = z.discriminatedUnion('type', [
15
+ successBranchSchema,
16
+ AuthRequiredBranchSchema
17
+ ]);
18
+ const config = {
19
+ description: 'List Outlook categories with colors and names.',
20
+ inputSchema: inputSchema,
21
+ outputSchema: z.object({
22
+ result: outputSchema
23
+ })
24
+ };
25
+ async function handler(_, extra) {
26
+ const logger = extra.logger;
27
+ logger.info('outlook.categories.list called');
28
+ try {
29
+ const graph = Client.initWithMiddleware({
30
+ authProvider: extra.authContext.auth
31
+ });
32
+ const started = Date.now();
33
+ // Call Microsoft Graph API to get master categories
34
+ const response = await graph.api('/me/outlook/masterCategories').get();
35
+ const categories = Array.isArray(response.value) ? response.value : [];
36
+ const durationMs = Date.now() - started;
37
+ logger.info('outlook.categories.list returning', {
38
+ categoriesCount: categories.length
39
+ });
40
+ logger.info('outlook.categories.list metrics', {
41
+ durationMs
42
+ });
43
+ const result = {
44
+ type: 'success',
45
+ items: categories.map((category)=>({
46
+ id: category.id || undefined,
47
+ displayName: category.displayName || undefined,
48
+ color: category.color || undefined
49
+ }))
50
+ };
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: JSON.stringify(result)
56
+ }
57
+ ],
58
+ structuredContent: {
59
+ result
60
+ }
61
+ };
62
+ } catch (error) {
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ logger.error('outlook.categories.list error', {
65
+ error: message
66
+ });
67
+ throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {
68
+ stack: error instanceof Error ? error.stack : undefined
69
+ });
70
+ }
71
+ }
72
+ export default function createTool() {
73
+ return {
74
+ name: 'categories-list',
75
+ config,
76
+ handler
77
+ };
78
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import 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 * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.js';\n\nconst inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories with colors and names.',\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(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.categories.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.categories.list returning', { categoriesCount: categories.length });\n logger.info('outlook.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\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.categories.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","Client","ErrorCode","McpError","z","OutlookCategorySchema","inputSchema","object","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","response","api","get","categories","Array","isArray","value","durationMs","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAASE,MAAM,QAAQ,oCAAoC;AAE3D,SAA8BC,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AAC9F,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D,MAAMC,cAAcF,EAAEG,MAAM,CAAC,CAAC;AAE9B,wBAAwB;AACxB,MAAMC,sBAAsBJ,EAAEG,MAAM,CAAC;IACnCE,MAAML,EAAEM,OAAO,CAAC;IAChBC,OAAOP,EAAEQ,KAAK,CAACP;AACjB;AAEA,2CAA2C;AAC3C,MAAMQ,eAAeT,EAAEU,kBAAkB,CAAC,QAAQ;IAACN;IAAqBR;CAAyB;AAEjG,MAAMe,SAAS;IACbC,aAAa;IACbV,aAAaA;IACbO,cAAcT,EAAEG,MAAM,CAAC;QACrBU,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQC,CAAQ,EAAEC,KAAoB;IACnD,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,QAAQtB,OAAOuB,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMC,UAAUC,KAAKC,GAAG;QAExB,oDAAoD;QACpD,MAAMC,WAAW,MAAMR,MAAMS,GAAG,CAAC,gCAAgCC,GAAG;QACpE,MAAMC,aAAaC,MAAMC,OAAO,CAACL,SAASM,KAAK,IAAIN,SAASM,KAAK,GAAG,EAAE;QAEtE,MAAMC,aAAaT,KAAKC,GAAG,KAAKF;QAChCP,OAAOC,IAAI,CAAC,qCAAqC;YAAEiB,iBAAiBL,WAAWM,MAAM;QAAC;QACtFnB,OAAOC,IAAI,CAAC,mCAAmC;YAAEgB;QAAW;QAE5D,MAAMrB,SAAiB;YACrBR,MAAM;YACNE,OAAOuB,WAAWO,GAAG,CAAC,CAACC,WAA8C,CAAA;oBACnEC,IAAID,SAASC,EAAE,IAAIC;oBACnBC,aAAaH,SAASG,WAAW,IAAID;oBACrCE,OAAOJ,SAASI,KAAK,IAAIF;gBAC3B,CAAA;QACF;QAEA,OAAO;YACLG,SAAS;gBACP;oBACEtC,MAAM;oBACNuC,MAAMC,KAAKC,SAAS,CAACjC;gBACvB;aACD;YACDkC,mBAAmB;gBAAElC;YAAO;QAC9B;IACF,EAAE,OAAOmC,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChE/B,OAAO+B,KAAK,CAAC,iCAAiC;YAAEA,OAAOC;QAAQ;QAE/D,MAAM,IAAIlD,SAASD,UAAUsD,aAAa,EAAE,CAAC,0BAA0B,EAAEH,SAAS,EAAE;YAClFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGb;QAChD;IACF;AACF;AAEA,eAAe,SAASc;IACtB,OAAO;QACLC,MAAM;QACN5C;QACAG;IACF;AACF"}
@@ -0,0 +1,11 @@
1
+ export { default as categoriesList } from './categories-list.js';
2
+ export { default as labelAdd } from './label-add.js';
3
+ export { default as labelDelete } from './label-delete.js';
4
+ export { default as labelsList } from './labels-list.js';
5
+ export { default as messageGet } from './message-get.js';
6
+ export { default as messageMarkRead } from './message-mark-read.js';
7
+ export { default as messageMoveToTrash } from './message-move-to-trash.js';
8
+ export { default as messageRespond } from './message-respond.js';
9
+ export { default as messageSearch } from './message-search.js';
10
+ export { default as messageSend } from './message-send.js';
11
+ export { default as messagesExportCsv } from './messages-export-csv.js';
@@ -0,0 +1,11 @@
1
+ export { default as categoriesList } from './categories-list.js';
2
+ export { default as labelAdd } from './label-add.js';
3
+ export { default as labelDelete } from './label-delete.js';
4
+ export { default as labelsList } from './labels-list.js';
5
+ export { default as messageGet } from './message-get.js';
6
+ export { default as messageMarkRead } from './message-mark-read.js';
7
+ export { default as messageMoveToTrash } from './message-move-to-trash.js';
8
+ export { default as messageRespond } from './message-respond.js';
9
+ export { default as messageSearch } from './message-search.js';
10
+ export { default as messageSend } from './message-send.js';
11
+ export { default as messagesExportCsv } from './messages-export-csv.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/index.ts"],"sourcesContent":["export { default as categoriesList } from './categories-list.js';\nexport { default as labelAdd } from './label-add.js';\nexport { default as labelDelete } from './label-delete.js';\nexport { default as labelsList } from './labels-list.js';\nexport { default as messageGet } from './message-get.js';\nexport { default as messageMarkRead } from './message-mark-read.js';\nexport { default as messageMoveToTrash } from './message-move-to-trash.js';\nexport { default as messageRespond } from './message-respond.js';\nexport { default as messageSearch } from './message-search.js';\nexport { default as messageSend } from './message-send.js';\nexport { default as messagesExportCsv } from './messages-export-csv.js';\n"],"names":["default","categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":"AAAA,SAASA,WAAWC,cAAc,QAAQ,uBAAuB;AACjE,SAASD,WAAWE,QAAQ,QAAQ,iBAAiB;AACrD,SAASF,WAAWG,WAAW,QAAQ,oBAAoB;AAC3D,SAASH,WAAWI,UAAU,QAAQ,mBAAmB;AACzD,SAASJ,WAAWK,UAAU,QAAQ,mBAAmB;AACzD,SAASL,WAAWM,eAAe,QAAQ,yBAAyB;AACpE,SAASN,WAAWO,kBAAkB,QAAQ,6BAA6B;AAC3E,SAASP,WAAWQ,cAAc,QAAQ,uBAAuB;AACjE,SAASR,WAAWS,aAAa,QAAQ,sBAAsB;AAC/D,SAAST,WAAWU,WAAW,QAAQ,oBAAoB;AAC3D,SAASV,WAAWW,iBAAiB,QAAQ,2BAA2B"}
@@ -0,0 +1,44 @@
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
+ id: z.ZodCoercedString<unknown>;
6
+ labels: z.ZodArray<z.ZodCoercedString<unknown>>;
7
+ }, z.core.$strip>;
8
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
9
+ id: z.ZodString;
10
+ labels: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ type: z.ZodLiteral<"success">;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ type: z.ZodLiteral<"auth_required">;
14
+ provider: z.ZodString;
15
+ message: z.ZodString;
16
+ url: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>], "type">;
18
+ export type Input = z.infer<typeof inputSchema>;
19
+ export type Output = z.infer<typeof outputSchema>;
20
+ declare function handler({ id, labels }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
21
+ export default function createTool(): {
22
+ name: string;
23
+ config: {
24
+ readonly description: "Add a label/category or move message to a folder in Outlook";
25
+ readonly inputSchema: z.ZodObject<{
26
+ id: z.ZodCoercedString<unknown>;
27
+ labels: z.ZodArray<z.ZodCoercedString<unknown>>;
28
+ }, z.core.$strip>;
29
+ readonly outputSchema: z.ZodObject<{
30
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
31
+ id: z.ZodString;
32
+ labels: z.ZodOptional<z.ZodArray<z.ZodString>>;
33
+ type: z.ZodLiteral<"success">;
34
+ }, z.core.$strip>, z.ZodObject<{
35
+ type: z.ZodLiteral<"auth_required">;
36
+ provider: z.ZodString;
37
+ message: z.ZodString;
38
+ url: z.ZodOptional<z.ZodString>;
39
+ }, z.core.$strip>], "type">;
40
+ }, z.core.$strip>;
41
+ };
42
+ handler: typeof handler;
43
+ };
44
+ export {};
@@ -0,0 +1,75 @@
1
+ import { schemas } from '@mcp-z/oauth-microsoft';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { Client } from '@microsoft/microsoft-graph-client';
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { z } from 'zod';
6
+ const LabelResultSchema = z.object({
7
+ id: z.string().describe('Message ID the categories were added to'),
8
+ labels: z.array(z.string()).optional().describe('Categories that were applied')
9
+ });
10
+ const inputSchema = z.object({
11
+ id: z.coerce.string().trim().min(1).describe('Outlook message ID to add categories to'),
12
+ labels: z.array(z.coerce.string().trim()).min(1).describe('Category names to add (use outlook-categories-list to discover available categories)')
13
+ });
14
+ // Success branch schema
15
+ const successBranchSchema = LabelResultSchema.extend({
16
+ type: z.literal('success')
17
+ });
18
+ // Output schema with auth_required support
19
+ const outputSchema = z.discriminatedUnion('type', [
20
+ successBranchSchema,
21
+ AuthRequiredBranchSchema
22
+ ]);
23
+ const config = {
24
+ description: 'Add a label/category or move message to a folder in Outlook',
25
+ inputSchema: inputSchema,
26
+ outputSchema: z.object({
27
+ result: outputSchema
28
+ })
29
+ };
30
+ async function handler({ id, labels }, extra) {
31
+ const logger = extra.logger;
32
+ logger.info('outlook.label.add called', {
33
+ id,
34
+ labels
35
+ });
36
+ try {
37
+ const graph = Client.initWithMiddleware({
38
+ authProvider: extra.authContext.auth
39
+ });
40
+ await graph.api(`/me/messages/${encodeURIComponent(id)}`).header('Content-Type', 'application/json').patch({
41
+ categories: labels
42
+ });
43
+ const result = {
44
+ type: 'success',
45
+ id,
46
+ labels
47
+ };
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: JSON.stringify(result)
53
+ }
54
+ ],
55
+ structuredContent: {
56
+ result
57
+ }
58
+ };
59
+ } catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error);
61
+ logger.error('outlook.label.add error', {
62
+ error: message
63
+ });
64
+ throw new McpError(ErrorCode.InternalError, `Error adding label: ${message}`, {
65
+ stack: error instanceof Error ? error.stack : undefined
66
+ });
67
+ }
68
+ }
69
+ export default function createTool() {
70
+ return {
71
+ name: 'label-add',
72
+ config,
73
+ handler
74
+ };
75
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/label-add.ts"],"sourcesContent":["import 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';\n\nconst LabelResultSchema = z.object({\n id: z.string().describe('Message ID the categories were added to'),\n labels: z.array(z.string()).optional().describe('Categories that were applied'),\n});\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to add categories to'),\n labels: z.array(z.coerce.string().trim()).min(1).describe('Category names to add (use outlook-categories-list to discover available categories)'),\n});\n\n// Success branch schema\nconst successBranchSchema = LabelResultSchema.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: 'Add a label/category or move message to a folder in 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({ id, labels }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.label.add called', { id, labels });\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n await graph\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .header('Content-Type', 'application/json')\n .patch({ categories: labels });\n\n const result: Output = {\n type: 'success' as const,\n id,\n labels,\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.label.add error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error adding label: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-add',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","Client","ErrorCode","McpError","z","LabelResultSchema","object","id","string","describe","labels","array","optional","inputSchema","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","header","patch","categories","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAASE,MAAM,QAAQ,oCAAoC;AAC3D,SAA8BC,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AAC9F,SAASC,CAAC,QAAQ,MAAM;AAExB,MAAMC,oBAAoBD,EAAEE,MAAM,CAAC;IACjCC,IAAIH,EAAEI,MAAM,GAAGC,QAAQ,CAAC;IACxBC,QAAQN,EAAEO,KAAK,CAACP,EAAEI,MAAM,IAAII,QAAQ,GAAGH,QAAQ,CAAC;AAClD;AAEA,MAAMI,cAAcT,EAAEE,MAAM,CAAC;IAC3BC,IAAIH,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,GAAGC,GAAG,CAAC,GAAGP,QAAQ,CAAC;IAC7CC,QAAQN,EAAEO,KAAK,CAACP,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,IAAIC,GAAG,CAAC,GAAGP,QAAQ,CAAC;AAC5D;AAEA,wBAAwB;AACxB,MAAMQ,sBAAsBZ,kBAAkBa,MAAM,CAAC;IACnDC,MAAMf,EAAEgB,OAAO,CAAC;AAClB;AAEA,2CAA2C;AAC3C,MAAMC,eAAejB,EAAEkB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBjB;CAAyB;AAEjG,MAAMuB,SAAS;IACbC,aAAa;IACbX,aAAaA;IACbQ,cAAcjB,EAAEE,MAAM,CAAC;QACrBmB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEnB,EAAE,EAAEG,MAAM,EAAS,EAAEiB,KAAoB;IAChE,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC,4BAA4B;QAAEtB;QAAIG;IAAO;IAErD,IAAI;QACF,MAAMoB,QAAQ7B,OAAO8B,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMJ,MACHK,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmB7B,KAAK,EAC5C8B,MAAM,CAAC,gBAAgB,oBACvBC,KAAK,CAAC;YAAEC,YAAY7B;QAAO;QAE9B,MAAMe,SAAiB;YACrBN,MAAM;YACNZ;YACAG;QACF;QAEA,OAAO;YACL8B,SAAS;gBACP;oBACErB,MAAM;oBACNsB,MAAMC,KAAKC,SAAS,CAAClB;gBACvB;aACD;YACDmB,mBAAmB;gBAAEnB;YAAO;QAC9B;IACF,EAAE,OAAOoB,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChEjB,OAAOiB,KAAK,CAAC,2BAA2B;YAAEA,OAAOC;QAAQ;QAEzD,MAAM,IAAI3C,SAASD,UAAU+C,aAAa,EAAE,CAAC,oBAAoB,EAAEH,SAAS,EAAE;YAC5EI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACN9B;QACAG;IACF;AACF"}