@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,180 @@
1
+ import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-microsoft';
2
+ import { parseConfig as parseTransportConfig } from '@mcp-z/server';
3
+ import * as fs from 'fs';
4
+ import moduleRoot from 'module-root-sync';
5
+ import { homedir } from 'os';
6
+ import * as path from 'path';
7
+ import * as url from 'url';
8
+ import { parseArgs } from 'util';
9
+ import { MS_SCOPE } from '../constants.js';
10
+ const pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));
11
+ const HELP_TEXT = `
12
+ Usage: mcp-outlook [options]
13
+
14
+ MCP server for Outlook/Microsoft email management with OAuth authentication.
15
+
16
+ Options:
17
+ --version Show version number
18
+ --help Show this help message
19
+ --auth=<mode> Authentication mode (default: loopback-oauth)
20
+ Modes: loopback-oauth, device-code, dcr
21
+ --headless Disable browser auto-open, return auth URL instead
22
+ --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)
23
+ --tenant-id=<id> Microsoft tenant ID (overrides MS_TENANT_ID env var)
24
+ --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)
25
+ --dcr-verify-url=<url> External verification endpoint (required for external mode)
26
+ --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)
27
+ --port=<port> Enable HTTP transport on specified port
28
+ --stdio Enable stdio transport (default if no port)
29
+ --log-level=<level> Logging level (default: info)
30
+ --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)
31
+ --base-url=<url> Base URL for HTTP file serving (default: http://localhost for HTTP transports)
32
+
33
+ Environment Variables:
34
+ MS_CLIENT_ID OAuth client ID (REQUIRED)
35
+ MS_TENANT_ID Microsoft tenant ID (REQUIRED)
36
+ MS_CLIENT_SECRET OAuth client secret (optional)
37
+ AUTH_MODE Default authentication mode (optional)
38
+ HEADLESS Disable browser auto-open (optional)
39
+ DCR_MODE DCR mode (optional, same format as --dcr-mode)
40
+ DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)
41
+ DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)
42
+ PORT Default HTTP port (optional)
43
+ LOG_LEVEL Default logging level (optional)
44
+ STORAGE_DIR Directory for CSV file storage (optional)
45
+ BASE_URL Base URL for HTTP file serving (optional)
46
+
47
+ OAuth Scopes:
48
+ openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite
49
+
50
+ Examples:
51
+ mcp-outlook # Use default settings
52
+ mcp-outlook --auth=device-code # Use device code auth
53
+ mcp-outlook --port=3000 # HTTP transport on port 3000
54
+ mcp-outlook --tenant-id=xxx # Set tenant ID
55
+ mcp-outlook --storage-dir=./emails # Custom storage directory
56
+ MS_CLIENT_ID=xxx mcp-outlook # Set client ID via env var
57
+ `.trim();
58
+ /**
59
+ * Handle --version and --help flags before config parsing.
60
+ * These should work without requiring any configuration.
61
+ */ export function handleVersionHelp(args) {
62
+ const { values } = parseArgs({
63
+ args,
64
+ options: {
65
+ version: {
66
+ type: 'boolean'
67
+ },
68
+ help: {
69
+ type: 'boolean'
70
+ }
71
+ },
72
+ strict: false
73
+ });
74
+ if (values.version) return {
75
+ handled: true,
76
+ output: pkg.version
77
+ };
78
+ if (values.help) return {
79
+ handled: true,
80
+ output: HELP_TEXT
81
+ };
82
+ return {
83
+ handled: false
84
+ };
85
+ }
86
+ /**
87
+ * Parse Outlook server configuration from CLI arguments and environment.
88
+ *
89
+ * CLI Arguments (all optional):
90
+ * - --auth=<mode> Authentication mode (default: loopback-oauth)
91
+ * Modes: loopback-oauth, device-code, dcr
92
+ * - --headless Disable browser auto-open, return auth URL instead
93
+ * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)
94
+ * - --tenant-id=<id> Microsoft tenant ID (overrides MS_TENANT_ID env var)
95
+ * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)
96
+ * - --dcr-verify-url=<url> External verification endpoint (required for external mode)
97
+ * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)
98
+ * - --port=<port> Enable HTTP transport on specified port
99
+ * - --stdio Enable stdio transport (default if no port)
100
+ * - --log-level=<level> Logging level (default: info)
101
+ * - --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)
102
+ * - --base-url=<url> Base URL for HTTP file serving (default: http://localhost for HTTP transports)
103
+ *
104
+ * Environment Variables:
105
+ * - MS_CLIENT_ID OAuth client ID (REQUIRED)
106
+ * - MS_TENANT_ID Microsoft tenant ID (REQUIRED)
107
+ * - MS_CLIENT_SECRET OAuth client secret (optional)
108
+ * - AUTH_MODE Default authentication mode (optional)
109
+ * - HEADLESS Disable browser auto-open (optional)
110
+ * - DCR_MODE DCR mode (optional, same format as --dcr-mode)
111
+ * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)
112
+ * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)
113
+ * - PORT Default HTTP port (optional)
114
+ * - LOG_LEVEL Default logging level (optional)
115
+ * - STORAGE_DIR Directory for CSV file storage (optional)
116
+ * - BASE_URL Base URL for HTTP file serving (optional)
117
+ *
118
+ * OAuth Scopes (from constants.ts):
119
+ * openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite
120
+ */ export function parseConfig(args, env) {
121
+ var _ref, _ref1, _ref2;
122
+ const transportConfig = parseTransportConfig(args, env);
123
+ const oauthConfig = parseOAuthConfig(args, env);
124
+ // Parse DCR configuration if DCR mode is enabled
125
+ const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, MS_SCOPE) : undefined;
126
+ // Parse application-level config (LOG_LEVEL, storage options)
127
+ const { values } = parseArgs({
128
+ args,
129
+ options: {
130
+ 'log-level': {
131
+ type: 'string'
132
+ },
133
+ 'storage-dir': {
134
+ type: 'string'
135
+ },
136
+ 'base-url': {
137
+ type: 'string'
138
+ }
139
+ },
140
+ strict: false,
141
+ allowPositionals: true
142
+ });
143
+ const name = pkg.name.replace(/^@[^/]+\//, '');
144
+ // Parse repository URL from package.json, stripping git+ prefix and .git suffix
145
+ const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;
146
+ const repositoryUrl = (_ref = rawRepoUrl === null || rawRepoUrl === void 0 ? void 0 : rawRepoUrl.replace(/^git\+/, '').replace(/\.git$/, '')) !== null && _ref !== void 0 ? _ref : `https://github.com/mcp-z/${name}`;
147
+ const rootDir = process.cwd() === '/' ? homedir() : process.cwd();
148
+ const baseDir = path.join(rootDir, '.mcp-z');
149
+ const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;
150
+ const envLogLevel = env.LOG_LEVEL;
151
+ const logLevel = (_ref1 = cliLogLevel !== null && cliLogLevel !== void 0 ? cliLogLevel : envLogLevel) !== null && _ref1 !== void 0 ? _ref1 : 'info';
152
+ // Parse file storage configuration
153
+ const cliStorageDir = typeof values['storage-dir'] === 'string' ? values['storage-dir'] : undefined;
154
+ const envStorageDir = env.STORAGE_DIR;
155
+ let storageDir = (_ref2 = cliStorageDir !== null && cliStorageDir !== void 0 ? cliStorageDir : envStorageDir) !== null && _ref2 !== void 0 ? _ref2 : path.join(baseDir, name, 'files');
156
+ if (storageDir.startsWith('~')) storageDir = storageDir.replace(/^~/, homedir());
157
+ const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;
158
+ const envBaseUrl = env.BASE_URL;
159
+ const baseUrl = cliBaseUrl !== null && cliBaseUrl !== void 0 ? cliBaseUrl : envBaseUrl;
160
+ // Combine configs
161
+ const result = {
162
+ ...oauthConfig,
163
+ transport: transportConfig.transport,
164
+ logLevel,
165
+ baseDir,
166
+ name,
167
+ version: pkg.version,
168
+ repositoryUrl,
169
+ storageDir: path.resolve(storageDir)
170
+ };
171
+ if (baseUrl !== undefined) result.baseUrl = baseUrl;
172
+ if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;
173
+ return result;
174
+ }
175
+ /**
176
+ * Build production configuration from process globals.
177
+ * Entry point for production server.
178
+ */ export function createConfig() {
179
+ return parseConfig(process.argv, process.env);
180
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-microsoft';\nimport { parseConfig as parseTransportConfig } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport { homedir } from 'os';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-outlook [options]\n\nMCP server for Outlook/Microsoft email management with OAuth authentication.\n\nOptions:\n --version Show version number\n --help Show this help message\n --auth=<mode> Authentication mode (default: loopback-oauth)\n Modes: loopback-oauth, device-code, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --tenant-id=<id> Microsoft tenant ID (overrides MS_TENANT_ID env var)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n --base-url=<url> Base URL for HTTP file serving (default: http://localhost for HTTP transports)\n\nEnvironment Variables:\n MS_CLIENT_ID OAuth client ID (REQUIRED)\n MS_TENANT_ID Microsoft tenant ID (REQUIRED)\n MS_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n STORAGE_DIR Directory for CSV file storage (optional)\n BASE_URL Base URL for HTTP file serving (optional)\n\nOAuth Scopes:\n openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite\n\nExamples:\n mcp-outlook # Use default settings\n mcp-outlook --auth=device-code # Use device code auth\n mcp-outlook --port=3000 # HTTP transport on port 3000\n mcp-outlook --tenant-id=xxx # Set tenant ID\n mcp-outlook --storage-dir=./emails # Custom storage directory\n MS_CLIENT_ID=xxx mcp-outlook # Set client ID via env var\n`.trim();\n\n/**\n * Handle --version and --help flags before config parsing.\n * These should work without requiring any configuration.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean' },\n help: { type: 'boolean' },\n },\n strict: false,\n });\n\n if (values.version) return { handled: true, output: pkg.version };\n if (values.help) return { handled: true, output: HELP_TEXT };\n return { handled: false };\n}\n\n/**\n * Parse Outlook server configuration from CLI arguments and environment.\n *\n * CLI Arguments (all optional):\n * - --auth=<mode> Authentication mode (default: loopback-oauth)\n * Modes: loopback-oauth, device-code, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n * - --tenant-id=<id> Microsoft tenant ID (overrides MS_TENANT_ID env var)\n * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n * - --dcr-verify-url=<url> External verification endpoint (required for external mode)\n * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n * - --port=<port> Enable HTTP transport on specified port\n * - --stdio Enable stdio transport (default if no port)\n * - --log-level=<level> Logging level (default: info)\n * - --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n * - --base-url=<url> Base URL for HTTP file serving (default: http://localhost for HTTP transports)\n *\n * Environment Variables:\n * - MS_CLIENT_ID OAuth client ID (REQUIRED)\n * - MS_TENANT_ID Microsoft tenant ID (REQUIRED)\n * - MS_CLIENT_SECRET OAuth client secret (optional)\n * - AUTH_MODE Default authentication mode (optional)\n * - HEADLESS Disable browser auto-open (optional)\n * - DCR_MODE DCR mode (optional, same format as --dcr-mode)\n * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n * - PORT Default HTTP port (optional)\n * - LOG_LEVEL Default logging level (optional)\n * - STORAGE_DIR Directory for CSV file storage (optional)\n * - BASE_URL Base URL for HTTP file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite\n */\nexport function parseConfig(args: string[], env: Record<string, string | undefined>): ServerConfig {\n const transportConfig = parseTransportConfig(args, env);\n const oauthConfig = parseOAuthConfig(args, env);\n\n // Parse DCR configuration if DCR mode is enabled\n const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, MS_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, storage options)\n const { values } = parseArgs({\n args,\n options: {\n 'log-level': { type: 'string' },\n 'storage-dir': { type: 'string' },\n 'base-url': { type: 'string' },\n },\n strict: false, // Allow other arguments\n allowPositionals: true,\n });\n\n const name = pkg.name.replace(/^@[^/]+\\//, '');\n // Parse repository URL from package.json, stripping git+ prefix and .git suffix\n const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;\n const repositoryUrl = rawRepoUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '') ?? `https://github.com/mcp-z/${name}`;\n const rootDir = process.cwd() === '/' ? homedir() : process.cwd();\n const baseDir = path.join(rootDir, '.mcp-z');\n const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;\n const envLogLevel = env.LOG_LEVEL;\n const logLevel = cliLogLevel ?? envLogLevel ?? 'info';\n\n // Parse file storage configuration\n const cliStorageDir = typeof values['storage-dir'] === 'string' ? values['storage-dir'] : undefined;\n const envStorageDir = env.STORAGE_DIR;\n let storageDir = cliStorageDir ?? envStorageDir ?? path.join(baseDir, name, 'files');\n if (storageDir.startsWith('~')) storageDir = storageDir.replace(/^~/, homedir());\n\n const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;\n const envBaseUrl = env.BASE_URL;\n const baseUrl = cliBaseUrl ?? envBaseUrl;\n\n // Combine configs\n const result: ServerConfig = {\n ...oauthConfig, // Includes clientId, auth, headless, redirectUri\n transport: transportConfig.transport,\n logLevel,\n baseDir,\n name,\n version: pkg.version,\n repositoryUrl,\n storageDir: path.resolve(storageDir),\n };\n if (baseUrl !== undefined) result.baseUrl = baseUrl;\n if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;\n return result;\n}\n\n/**\n * Build production configuration from process globals.\n * Entry point for production server.\n */\nexport function createConfig(): ServerConfig {\n return parseConfig(process.argv, process.env);\n}\n"],"names":["parseDcrConfig","parseConfig","parseOAuthConfig","parseTransportConfig","fs","moduleRoot","homedir","path","url","parseArgs","MS_SCOPE","pkg","JSON","parse","readFileSync","join","fileURLToPath","HELP_TEXT","trim","handleVersionHelp","args","values","options","version","type","help","strict","handled","output","env","cliLogLevel","cliStorageDir","transportConfig","oauthConfig","dcrConfig","auth","undefined","allowPositionals","name","replace","rawRepoUrl","repository","repositoryUrl","rootDir","process","cwd","baseDir","envLogLevel","LOG_LEVEL","logLevel","envStorageDir","STORAGE_DIR","storageDir","startsWith","cliBaseUrl","envBaseUrl","BASE_URL","baseUrl","result","transport","resolve","createConfig","argv"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { RuntimeOverrides, ServerConfig } from '../types.js';
3
+ export declare function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
4
+ httpServer: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
5
+ mcpServer: McpServer;
6
+ logger: import("@mcp-z/server").Logger;
7
+ close: () => Promise<void>;
8
+ }>;
@@ -0,0 +1,61 @@
1
+ import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import cors from 'cors';
4
+ import express from 'express';
5
+ import { createDefaultRuntime } from './runtime.js';
6
+ export async function createHTTPServer(config, overrides) {
7
+ const runtime = await createDefaultRuntime(config, overrides);
8
+ const modules = runtime.createDomainModules();
9
+ const layers = runtime.middlewareFactories.map((factory)=>factory(runtime.deps));
10
+ const composed = composeMiddleware(modules, layers);
11
+ const logger = runtime.deps.logger;
12
+ const port = config.transport.port;
13
+ if (!port) throw new Error('Port is required for HTTP transport');
14
+ const tools = [
15
+ ...composed.tools,
16
+ ...runtime.deps.oauthAdapters.accountTools
17
+ ];
18
+ const prompts = [
19
+ ...composed.prompts,
20
+ ...runtime.deps.oauthAdapters.accountPrompts
21
+ ];
22
+ const mcpServer = new McpServer({
23
+ name: config.name,
24
+ version: config.version
25
+ });
26
+ registerTools(mcpServer, tools);
27
+ registerResources(mcpServer, composed.resources);
28
+ registerPrompts(mcpServer, prompts);
29
+ const app = express();
30
+ app.use(cors());
31
+ app.use(express.json({
32
+ limit: '10mb'
33
+ }));
34
+ const fileRouter = createFileServingRouter({
35
+ storageDir: config.storageDir
36
+ }, {
37
+ contentType: 'text/csv',
38
+ contentDisposition: 'attachment'
39
+ });
40
+ app.use('/files', fileRouter);
41
+ if (runtime.deps.oauthAdapters.dcrRouter) {
42
+ app.use('/', runtime.deps.oauthAdapters.dcrRouter);
43
+ logger.info('Mounted DCR router with OAuth endpoints');
44
+ }
45
+ logger.info(`Starting ${config.name} MCP server (http)`);
46
+ const { close, httpServer } = await connectHttp(mcpServer, {
47
+ logger,
48
+ app,
49
+ port
50
+ });
51
+ logger.info('http transport ready');
52
+ return {
53
+ httpServer,
54
+ mcpServer,
55
+ logger,
56
+ close: async ()=>{
57
+ await close();
58
+ await runtime.close();
59
+ }
60
+ };
61
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createDefaultRuntime } from './runtime.js';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(cors());\n app.use(express.json({ limit: '10mb' }));\n\n const fileRouter = createFileServingRouter({ storageDir: config.storageDir }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', fileRouter);\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, { logger, app, port });\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectHttp","createFileServingRouter","registerPrompts","registerResources","registerTools","McpServer","cors","express","createDefaultRuntime","createHTTPServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","port","transport","Error","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","app","use","json","limit","fileRouter","storageDir","contentType","contentDisposition","dcrRouter","info","close","httpServer"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,WAAW,EAAEC,uBAAuB,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AAC3I,SAASC,SAAS,QAAQ,0CAA0C;AACpE,OAAOC,UAAU,OAAO;AACxB,OAAOC,aAAa,UAAU;AAE9B,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,iBAAiBC,MAAoB,EAAEC,SAA4B;IACvF,MAAMC,UAAU,MAAMJ,qBAAqBE,QAAQC;IACnD,MAAME,UAAUD,QAAQE,mBAAmB;IAC3C,MAAMC,SAASH,QAAQI,mBAAmB,CAACC,GAAG,CAAC,CAACC,UAAYA,QAAQN,QAAQO,IAAI;IAChF,MAAMC,WAAWrB,kBAAkBc,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAClC,MAAMC,OAAOZ,OAAOa,SAAS,CAACD,IAAI;IAClC,IAAI,CAACA,MAAM,MAAM,IAAIE,MAAM;IAE3B,MAAMC,QAAQ;WAAIL,SAASK,KAAK;WAAKb,QAAQO,IAAI,CAACO,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIR,SAASQ,OAAO;WAAKhB,QAAQO,IAAI,CAACO,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIzB,UAAU;QAAE0B,MAAMrB,OAAOqB,IAAI;QAAEC,SAAStB,OAAOsB,OAAO;IAAC;IAC7E5B,cAAc0B,WAAWL;IACzBtB,kBAAkB2B,WAAWV,SAASa,SAAS;IAC/C/B,gBAAgB4B,WAAWF;IAE3B,MAAMM,MAAM3B;IACZ2B,IAAIC,GAAG,CAAC7B;IACR4B,IAAIC,GAAG,CAAC5B,QAAQ6B,IAAI,CAAC;QAAEC,OAAO;IAAO;IAErC,MAAMC,aAAarC,wBAAwB;QAAEsC,YAAY7B,OAAO6B,UAAU;IAAC,GAAG;QAAEC,aAAa;QAAYC,oBAAoB;IAAa;IAC1IP,IAAIC,GAAG,CAAC,UAAUG;IAElB,IAAI1B,QAAQO,IAAI,CAACO,aAAa,CAACgB,SAAS,EAAE;QACxCR,IAAIC,GAAG,CAAC,KAAKvB,QAAQO,IAAI,CAACO,aAAa,CAACgB,SAAS;QACjDrB,OAAOsB,IAAI,CAAC;IACd;IAEAtB,OAAOsB,IAAI,CAAC,CAAC,SAAS,EAAEjC,OAAOqB,IAAI,CAAC,kBAAkB,CAAC;IACvD,MAAM,EAAEa,KAAK,EAAEC,UAAU,EAAE,GAAG,MAAM7C,YAAY8B,WAAW;QAAET;QAAQa;QAAKZ;IAAK;IAC/ED,OAAOsB,IAAI,CAAC;IAEZ,OAAO;QACLE;QACAf;QACAT;QACAuB,OAAO;YACL,MAAMA;YACN,MAAMhC,QAAQgC,KAAK;QACrB;IACF;AACF"}
@@ -0,0 +1,5 @@
1
+ export { createConfig, parseConfig } from './config.js';
2
+ export { createHTTPServer } from './http.js';
3
+ export { createOAuthAdapters } from './oauth-microsoft.js';
4
+ export * from './runtime.js';
5
+ export { createStdioServer } from './stdio.js';
@@ -0,0 +1,5 @@
1
+ export { createConfig, parseConfig } from './config.js';
2
+ export { createHTTPServer } from './http.js';
3
+ export { createOAuthAdapters } from './oauth-microsoft.js';
4
+ export * from './runtime.js';
5
+ export { createStdioServer } from './stdio.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.js';\nexport { createHTTPServer } from './http.js';\nexport { createOAuthAdapters } from './oauth-microsoft.js';\nexport * from './runtime.js';\nexport { createStdioServer } from './stdio.js';\n"],"names":["createConfig","parseConfig","createHTTPServer","createOAuthAdapters","createStdioServer"],"mappings":"AAAA,SAASA,YAAY,EAAEC,WAAW,QAAQ,cAAc;AACxD,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,cAAc,eAAe;AAC7B,SAASC,iBAAiB,QAAQ,aAAa"}
@@ -0,0 +1,43 @@
1
+ import { type AuthEmailProvider } from '@mcp-z/oauth';
2
+ import { DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';
3
+ import type { Logger, PromptModule, ToolModule } from '@mcp-z/server';
4
+ import type { Router } from 'express';
5
+ import type { Keyv } from 'keyv';
6
+ import type { ServerConfig } from '../types.js';
7
+ /**
8
+ * Outlook OAuth runtime dependencies
9
+ */
10
+ export interface OAuthRuntimeDeps {
11
+ logger: Logger;
12
+ tokenStore: Keyv<unknown>;
13
+ dcrStore?: Keyv<unknown>;
14
+ }
15
+ /**
16
+ * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods
17
+ */
18
+ export interface AuthMiddleware {
19
+ withToolAuth<T extends ToolModule>(module: T): T;
20
+ withResourceAuth<T>(module: T): T;
21
+ withPromptAuth<T>(module: T): T;
22
+ }
23
+ /**
24
+ * Result of OAuth adapter creation
25
+ */
26
+ export interface OAuthAdapters {
27
+ primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;
28
+ middleware: AuthMiddleware;
29
+ authAdapter: AuthEmailProvider;
30
+ accountTools: ToolModule[];
31
+ accountPrompts: PromptModule[];
32
+ dcrRouter?: Router;
33
+ }
34
+ /**
35
+ * Create Outlook OAuth adapters based on transport configuration
36
+ *
37
+ * Returns primary adapter, pre-configured middleware, auth email provider,
38
+ * and pre-selected account tools based on auth mode.
39
+ * @param config - Outlook server configuration
40
+ * @param deps - Runtime dependencies (logger, tokenStore, etc.)
41
+ * @returns OAuth adapters with pre-configured middleware and account tools
42
+ */
43
+ export declare function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters>;
@@ -0,0 +1,169 @@
1
+ import { AccountServer } from '@mcp-z/oauth';
2
+ import { createDcrRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';
3
+ import { MS_SCOPE } from '../constants.js';
4
+ /**
5
+ * Create Outlook OAuth adapters based on transport configuration
6
+ *
7
+ * Returns primary adapter, pre-configured middleware, auth email provider,
8
+ * and pre-selected account tools based on auth mode.
9
+ * @param config - Outlook server configuration
10
+ * @param deps - Runtime dependencies (logger, tokenStore, etc.)
11
+ * @returns OAuth adapters with pre-configured middleware and account tools
12
+ */ export async function createOAuthAdapters(config, deps, baseUrl) {
13
+ const { logger, tokenStore, dcrStore } = deps;
14
+ const oauthStaticConfig = {
15
+ service: config.name,
16
+ clientId: config.clientId,
17
+ clientSecret: config.clientSecret,
18
+ scope: MS_SCOPE,
19
+ tenantId: config.tenantId,
20
+ auth: config.auth,
21
+ headless: config.headless,
22
+ redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,
23
+ ...baseUrl && {
24
+ baseUrl
25
+ }
26
+ };
27
+ let primary;
28
+ // DCR mode - Dynamic Client Registration with HTTP-only support
29
+ if (oauthStaticConfig.auth === 'dcr') {
30
+ logger.debug('Creating DCR provider', {
31
+ service: oauthStaticConfig.service
32
+ });
33
+ // DCR requires dcrStore and baseUrl
34
+ if (!dcrStore) {
35
+ throw new Error('DCR mode requires dcrStore to be configured');
36
+ }
37
+ if (!oauthStaticConfig.baseUrl) {
38
+ throw new Error('DCR mode requires baseUrl to be configured');
39
+ }
40
+ // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)
41
+ primary = new DcrOAuthProvider({
42
+ clientId: oauthStaticConfig.clientId,
43
+ ...oauthStaticConfig.clientSecret && {
44
+ clientSecret: oauthStaticConfig.clientSecret
45
+ },
46
+ tenantId: oauthStaticConfig.tenantId,
47
+ scope: oauthStaticConfig.scope,
48
+ verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,
49
+ logger
50
+ });
51
+ // Create DCR OAuth router with authorization server endpoints
52
+ const dcrRouter = createDcrRouter({
53
+ store: dcrStore,
54
+ issuerUrl: oauthStaticConfig.baseUrl,
55
+ baseUrl: oauthStaticConfig.baseUrl,
56
+ scopesSupported: oauthStaticConfig.scope.split(' '),
57
+ clientConfig: {
58
+ clientId: oauthStaticConfig.clientId,
59
+ ...oauthStaticConfig.clientSecret && {
60
+ clientSecret: oauthStaticConfig.clientSecret
61
+ },
62
+ tenantId: oauthStaticConfig.tenantId
63
+ }
64
+ });
65
+ // DCR uses bearer token authentication with middleware validation
66
+ const middleware = primary.authMiddleware();
67
+ // Create auth email provider (stateless, no token storage)
68
+ const authAdapter = {
69
+ getUserEmail: ()=>{
70
+ throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');
71
+ }
72
+ };
73
+ // No account management tools for DCR (multi-user management at client registration level)
74
+ const accountTools = [];
75
+ const accountPrompts = [];
76
+ logger.info('DCR provider created for Outlook', {
77
+ service: oauthStaticConfig.service,
78
+ baseUrl: oauthStaticConfig.baseUrl
79
+ });
80
+ return {
81
+ primary,
82
+ middleware: middleware,
83
+ authAdapter,
84
+ accountTools,
85
+ accountPrompts,
86
+ dcrRouter
87
+ };
88
+ }
89
+ // Device code mode - similar to service accounts (single static identity)
90
+ if (oauthStaticConfig.auth === 'device-code') {
91
+ logger.debug('Creating device code provider', {
92
+ service: oauthStaticConfig.service
93
+ });
94
+ const deviceCodeProvider = new DeviceCodeProvider({
95
+ service: oauthStaticConfig.service,
96
+ clientId: oauthStaticConfig.clientId,
97
+ tenantId: oauthStaticConfig.tenantId,
98
+ scope: oauthStaticConfig.scope,
99
+ logger,
100
+ tokenStore,
101
+ headless: oauthStaticConfig.headless
102
+ });
103
+ primary = deviceCodeProvider;
104
+ // Device code uses single-user middleware (no account management needed)
105
+ const middleware = deviceCodeProvider.authMiddleware();
106
+ // Create auth email provider
107
+ const authAdapter = {
108
+ getUserEmail: (accountId)=>deviceCodeProvider.getUserEmail(accountId)
109
+ };
110
+ // No account management tools for device code (like service accounts)
111
+ const accountTools = [];
112
+ const accountPrompts = [];
113
+ logger.info('Device code provider created for Outlook', {
114
+ service: oauthStaticConfig.service
115
+ });
116
+ return {
117
+ primary,
118
+ middleware: middleware,
119
+ authAdapter,
120
+ accountTools,
121
+ accountPrompts
122
+ };
123
+ }
124
+ // Always create primary adapter for file-based OAuth (loopback mode)
125
+ primary = new LoopbackOAuthProvider({
126
+ service: oauthStaticConfig.service,
127
+ clientId: oauthStaticConfig.clientId,
128
+ clientSecret: oauthStaticConfig.clientSecret,
129
+ scope: oauthStaticConfig.scope,
130
+ tenantId: oauthStaticConfig.tenantId,
131
+ headless: oauthStaticConfig.headless,
132
+ logger,
133
+ tokenStore,
134
+ ...oauthStaticConfig.redirectUri !== undefined && {
135
+ redirectUri: oauthStaticConfig.redirectUri
136
+ }
137
+ });
138
+ // Create auth email provider (used by account management tools)
139
+ const authAdapter = {
140
+ getUserEmail: (accountId)=>primary.getUserEmail(accountId),
141
+ ...primary.authenticateNewAccount && {
142
+ authenticateNewAccount: ()=>{
143
+ var _primary_authenticateNewAccount;
144
+ return (_primary_authenticateNewAccount = primary.authenticateNewAccount) === null || _primary_authenticateNewAccount === void 0 ? void 0 : _primary_authenticateNewAccount.call(primary);
145
+ }
146
+ }
147
+ };
148
+ // Select middleware AND account tools based on auth mode
149
+ const middleware = primary.authMiddleware();
150
+ // Loopback OAuth - multi-account mode
151
+ const result = AccountServer.createLoopback({
152
+ service: oauthStaticConfig.service,
153
+ store: tokenStore,
154
+ logger,
155
+ auth: authAdapter
156
+ });
157
+ const accountTools = result.tools;
158
+ const accountPrompts = result.prompts;
159
+ logger.debug('Loopback OAuth (multi-account mode)', {
160
+ service: oauthStaticConfig.service
161
+ });
162
+ return {
163
+ primary,
164
+ middleware: middleware,
165
+ authAdapter,
166
+ accountTools,
167
+ accountPrompts
168
+ };
169
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { AccountServer, type AuthEmailProvider } from '@mcp-z/oauth';\nimport { createDcrRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\n/**\n * Outlook OAuth runtime dependencies\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AuthEmailProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\n const authAdapter: AuthEmailProvider = {\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n // No authenticateNewAccount for device code (single account)\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => primary.getUserEmail(accountId),\n ...(primary.authenticateNewAccount && {\n authenticateNewAccount: () => primary.authenticateNewAccount?.(),\n }),\n };\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n}\n"],"names":["AccountServer","createDcrRouter","DcrOAuthProvider","DeviceCodeProvider","LoopbackOAuthProvider","MS_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","service","name","clientId","clientSecret","scope","tenantId","auth","headless","redirectUri","transport","type","undefined","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getUserEmail","accountTools","accountPrompts","info","deviceCodeProvider","accountId","authenticateNewAccount","result","createLoopback","tools","prompts"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Logger, MiddlewareLayer } from '@mcp-z/server';
2
+ import type { CommonRuntime, RuntimeOverrides, ServerConfig, StorageContext } from '../types.js';
3
+ import { type OAuthAdapters } from './oauth-microsoft.js';
4
+ export declare function createLogger(config: ServerConfig): Logger;
5
+ export declare function createTokenStore(baseDir: string): Promise<import("keyv").Keyv<unknown>>;
6
+ export declare function createDcrStore(baseDir: string, required: boolean): Promise<import("keyv").Keyv<unknown>>;
7
+ export declare function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer;
8
+ export declare function createLoggingLayer(logger: Logger): MiddlewareLayer;
9
+ export declare function createStorageLayer(storageContext: StorageContext): MiddlewareLayer;
10
+ export declare function assertStorageConfig(config: ServerConfig): void;
11
+ export declare function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime>;