@mcp-z/mcp-gmail 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 (321) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +11 -0
  5. package/dist/cjs/constants.d.ts +11 -0
  6. package/dist/cjs/constants.js +39 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/email/composition/rfc822-builder.d.cts +11 -0
  9. package/dist/cjs/email/composition/rfc822-builder.d.ts +11 -0
  10. package/dist/cjs/email/composition/rfc822-builder.js +24 -0
  11. package/dist/cjs/email/composition/rfc822-builder.js.map +1 -0
  12. package/dist/cjs/email/messages/fetch-message.d.cts +24 -0
  13. package/dist/cjs/email/messages/fetch-message.d.ts +24 -0
  14. package/dist/cjs/email/messages/fetch-message.js +367 -0
  15. package/dist/cjs/email/messages/fetch-message.js.map +1 -0
  16. package/dist/cjs/email/messages/messages.d.cts +7 -0
  17. package/dist/cjs/email/messages/messages.d.ts +7 -0
  18. package/dist/cjs/email/messages/messages.js +146 -0
  19. package/dist/cjs/email/messages/messages.js.map +1 -0
  20. package/dist/cjs/email/parsing/header-parsing.d.cts +1 -0
  21. package/dist/cjs/email/parsing/header-parsing.d.ts +1 -0
  22. package/dist/cjs/email/parsing/header-parsing.js +20 -0
  23. package/dist/cjs/email/parsing/header-parsing.js.map +1 -0
  24. package/dist/cjs/email/parsing/headers-utils.d.cts +5 -0
  25. package/dist/cjs/email/parsing/headers-utils.d.ts +5 -0
  26. package/dist/cjs/email/parsing/headers-utils.js +46 -0
  27. package/dist/cjs/email/parsing/headers-utils.js.map +1 -0
  28. package/dist/cjs/email/parsing/html-processing.d.cts +8 -0
  29. package/dist/cjs/email/parsing/html-processing.d.ts +8 -0
  30. package/dist/cjs/email/parsing/html-processing.js +72 -0
  31. package/dist/cjs/email/parsing/html-processing.js.map +1 -0
  32. package/dist/cjs/email/parsing/message-extraction.d.cts +2 -0
  33. package/dist/cjs/email/parsing/message-extraction.d.ts +2 -0
  34. package/dist/cjs/email/parsing/message-extraction.js +25 -0
  35. package/dist/cjs/email/parsing/message-extraction.js.map +1 -0
  36. package/dist/cjs/email/querying/execute-query.d.cts +17 -0
  37. package/dist/cjs/email/querying/execute-query.d.ts +17 -0
  38. package/dist/cjs/email/querying/execute-query.js +265 -0
  39. package/dist/cjs/email/querying/execute-query.js.map +1 -0
  40. package/dist/cjs/email/querying/pagination.d.cts +27 -0
  41. package/dist/cjs/email/querying/pagination.d.ts +27 -0
  42. package/dist/cjs/email/querying/pagination.js +533 -0
  43. package/dist/cjs/email/querying/pagination.js.map +1 -0
  44. package/dist/cjs/email/querying/query-builder.d.cts +47 -0
  45. package/dist/cjs/email/querying/query-builder.d.ts +47 -0
  46. package/dist/cjs/email/querying/query-builder.js +387 -0
  47. package/dist/cjs/email/querying/query-builder.js.map +1 -0
  48. package/dist/cjs/email/querying/search-execution.d.cts +29 -0
  49. package/dist/cjs/email/querying/search-execution.d.ts +29 -0
  50. package/dist/cjs/email/querying/search-execution.js +190 -0
  51. package/dist/cjs/email/querying/search-execution.js.map +1 -0
  52. package/dist/cjs/index.d.cts +8 -0
  53. package/dist/cjs/index.d.ts +8 -0
  54. package/dist/cjs/index.js +314 -0
  55. package/dist/cjs/index.js.map +1 -0
  56. package/dist/cjs/labels/gmail-labels.d.cts +2 -0
  57. package/dist/cjs/labels/gmail-labels.d.ts +2 -0
  58. package/dist/cjs/labels/gmail-labels.js +206 -0
  59. package/dist/cjs/labels/gmail-labels.js.map +1 -0
  60. package/dist/cjs/lib/base64-encoding.d.cts +2 -0
  61. package/dist/cjs/lib/base64-encoding.d.ts +2 -0
  62. package/dist/cjs/lib/base64-encoding.js +32 -0
  63. package/dist/cjs/lib/base64-encoding.js.map +1 -0
  64. package/dist/cjs/lib/create-store.d.cts +2 -0
  65. package/dist/cjs/lib/create-store.d.ts +2 -0
  66. package/dist/cjs/lib/create-store.js +166 -0
  67. package/dist/cjs/lib/create-store.js.map +1 -0
  68. package/dist/cjs/lib/date-conversion.d.cts +1 -0
  69. package/dist/cjs/lib/date-conversion.d.ts +1 -0
  70. package/dist/cjs/lib/date-conversion.js +16 -0
  71. package/dist/cjs/lib/date-conversion.js.map +1 -0
  72. package/dist/cjs/lib/messages-to-row.d.cts +61 -0
  73. package/dist/cjs/lib/messages-to-row.d.ts +61 -0
  74. package/dist/cjs/lib/messages-to-row.js +243 -0
  75. package/dist/cjs/lib/messages-to-row.js.map +1 -0
  76. package/dist/cjs/mcp/index.d.cts +3 -0
  77. package/dist/cjs/mcp/index.d.ts +3 -0
  78. package/dist/cjs/mcp/index.js +66 -0
  79. package/dist/cjs/mcp/index.js.map +1 -0
  80. package/dist/cjs/mcp/prompts/draft-email.d.cts +30 -0
  81. package/dist/cjs/mcp/prompts/draft-email.d.ts +30 -0
  82. package/dist/cjs/mcp/prompts/draft-email.js +184 -0
  83. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -0
  84. package/dist/cjs/mcp/prompts/index.d.cts +2 -0
  85. package/dist/cjs/mcp/prompts/index.d.ts +2 -0
  86. package/dist/cjs/mcp/prompts/index.js +26 -0
  87. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  88. package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
  89. package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
  90. package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
  91. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
  92. package/dist/cjs/mcp/resources/email.d.cts +11 -0
  93. package/dist/cjs/mcp/resources/email.d.ts +11 -0
  94. package/dist/cjs/mcp/resources/email.js +256 -0
  95. package/dist/cjs/mcp/resources/email.js.map +1 -0
  96. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  97. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  98. package/dist/cjs/mcp/resources/index.js +17 -0
  99. package/dist/cjs/mcp/resources/index.js.map +1 -0
  100. package/dist/cjs/mcp/tools/categories-list.d.cts +58 -0
  101. package/dist/cjs/mcp/tools/categories-list.d.ts +58 -0
  102. package/dist/cjs/mcp/tools/categories-list.js +298 -0
  103. package/dist/cjs/mcp/tools/categories-list.js.map +1 -0
  104. package/dist/cjs/mcp/tools/index.d.cts +11 -0
  105. package/dist/cjs/mcp/tools/index.d.ts +11 -0
  106. package/dist/cjs/mcp/tools/index.js +62 -0
  107. package/dist/cjs/mcp/tools/index.js.map +1 -0
  108. package/dist/cjs/mcp/tools/label-add.d.cts +61 -0
  109. package/dist/cjs/mcp/tools/label-add.d.ts +61 -0
  110. package/dist/cjs/mcp/tools/label-add.js +280 -0
  111. package/dist/cjs/mcp/tools/label-add.js.map +1 -0
  112. package/dist/cjs/mcp/tools/label-delete.d.cts +71 -0
  113. package/dist/cjs/mcp/tools/label-delete.d.ts +71 -0
  114. package/dist/cjs/mcp/tools/label-delete.js +476 -0
  115. package/dist/cjs/mcp/tools/label-delete.js.map +1 -0
  116. package/dist/cjs/mcp/tools/labels-list.d.cts +75 -0
  117. package/dist/cjs/mcp/tools/labels-list.d.ts +75 -0
  118. package/dist/cjs/mcp/tools/labels-list.js +298 -0
  119. package/dist/cjs/mcp/tools/labels-list.js.map +1 -0
  120. package/dist/cjs/mcp/tools/message-get.d.cts +146 -0
  121. package/dist/cjs/mcp/tools/message-get.d.ts +146 -0
  122. package/dist/cjs/mcp/tools/message-get.js +317 -0
  123. package/dist/cjs/mcp/tools/message-get.js.map +1 -0
  124. package/dist/cjs/mcp/tools/message-mark-read.d.cts +50 -0
  125. package/dist/cjs/mcp/tools/message-mark-read.d.ts +50 -0
  126. package/dist/cjs/mcp/tools/message-mark-read.js +254 -0
  127. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -0
  128. package/dist/cjs/mcp/tools/message-move-to-trash.d.cts +71 -0
  129. package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +71 -0
  130. package/dist/cjs/mcp/tools/message-move-to-trash.js +450 -0
  131. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -0
  132. package/dist/cjs/mcp/tools/message-respond.d.cts +60 -0
  133. package/dist/cjs/mcp/tools/message-respond.d.ts +60 -0
  134. package/dist/cjs/mcp/tools/message-respond.js +367 -0
  135. package/dist/cjs/mcp/tools/message-respond.js.map +1 -0
  136. package/dist/cjs/mcp/tools/message-search.d.cts +182 -0
  137. package/dist/cjs/mcp/tools/message-search.d.ts +182 -0
  138. package/dist/cjs/mcp/tools/message-search.js +405 -0
  139. package/dist/cjs/mcp/tools/message-search.js.map +1 -0
  140. package/dist/cjs/mcp/tools/message-send.d.cts +87 -0
  141. package/dist/cjs/mcp/tools/message-send.d.ts +87 -0
  142. package/dist/cjs/mcp/tools/message-send.js +288 -0
  143. package/dist/cjs/mcp/tools/message-send.js.map +1 -0
  144. package/dist/cjs/mcp/tools/messages-export-csv.d.cts +84 -0
  145. package/dist/cjs/mcp/tools/messages-export-csv.d.ts +84 -0
  146. package/dist/cjs/mcp/tools/messages-export-csv.js +530 -0
  147. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -0
  148. package/dist/cjs/package.json +1 -0
  149. package/dist/cjs/schemas/gmail-query-schema.d.cts +36 -0
  150. package/dist/cjs/schemas/gmail-query-schema.d.ts +36 -0
  151. package/dist/cjs/schemas/gmail-query-schema.js +117 -0
  152. package/dist/cjs/schemas/gmail-query-schema.js.map +1 -0
  153. package/dist/cjs/schemas/index.d.cts +1 -0
  154. package/dist/cjs/schemas/index.d.ts +1 -0
  155. package/dist/cjs/schemas/index.js +19 -0
  156. package/dist/cjs/schemas/index.js.map +1 -0
  157. package/dist/cjs/setup/config.d.cts +48 -0
  158. package/dist/cjs/setup/config.d.ts +48 -0
  159. package/dist/cjs/setup/config.js +217 -0
  160. package/dist/cjs/setup/config.js.map +1 -0
  161. package/dist/cjs/setup/http.d.cts +8 -0
  162. package/dist/cjs/setup/http.d.ts +8 -0
  163. package/dist/cjs/setup/http.js +267 -0
  164. package/dist/cjs/setup/http.js.map +1 -0
  165. package/dist/cjs/setup/index.d.cts +5 -0
  166. package/dist/cjs/setup/index.d.ts +5 -0
  167. package/dist/cjs/setup/index.js +46 -0
  168. package/dist/cjs/setup/index.js.map +1 -0
  169. package/dist/cjs/setup/oauth-google.d.cts +54 -0
  170. package/dist/cjs/setup/oauth-google.d.ts +54 -0
  171. package/dist/cjs/setup/oauth-google.js +332 -0
  172. package/dist/cjs/setup/oauth-google.js.map +1 -0
  173. package/dist/cjs/setup/runtime.d.cts +12 -0
  174. package/dist/cjs/setup/runtime.d.ts +12 -0
  175. package/dist/cjs/setup/runtime.js +489 -0
  176. package/dist/cjs/setup/runtime.js.map +1 -0
  177. package/dist/cjs/setup/stdio.d.cts +7 -0
  178. package/dist/cjs/setup/stdio.d.ts +7 -0
  179. package/dist/cjs/setup/stdio.js +239 -0
  180. package/dist/cjs/setup/stdio.js.map +1 -0
  181. package/dist/cjs/types.d.cts +54 -0
  182. package/dist/cjs/types.d.ts +54 -0
  183. package/dist/cjs/types.js +5 -0
  184. package/dist/cjs/types.js.map +1 -0
  185. package/dist/esm/constants.d.ts +11 -0
  186. package/dist/esm/constants.js +14 -0
  187. package/dist/esm/constants.js.map +1 -0
  188. package/dist/esm/email/composition/rfc822-builder.d.ts +11 -0
  189. package/dist/esm/email/composition/rfc822-builder.js +13 -0
  190. package/dist/esm/email/composition/rfc822-builder.js.map +1 -0
  191. package/dist/esm/email/messages/fetch-message.d.ts +24 -0
  192. package/dist/esm/email/messages/fetch-message.js +123 -0
  193. package/dist/esm/email/messages/fetch-message.js.map +1 -0
  194. package/dist/esm/email/messages/messages.d.ts +7 -0
  195. package/dist/esm/email/messages/messages.js +91 -0
  196. package/dist/esm/email/messages/messages.js.map +1 -0
  197. package/dist/esm/email/parsing/header-parsing.d.ts +1 -0
  198. package/dist/esm/email/parsing/header-parsing.js +1 -0
  199. package/dist/esm/email/parsing/header-parsing.js.map +1 -0
  200. package/dist/esm/email/parsing/headers-utils.d.ts +5 -0
  201. package/dist/esm/email/parsing/headers-utils.js +25 -0
  202. package/dist/esm/email/parsing/headers-utils.js.map +1 -0
  203. package/dist/esm/email/parsing/html-processing.d.ts +8 -0
  204. package/dist/esm/email/parsing/html-processing.js +39 -0
  205. package/dist/esm/email/parsing/html-processing.js.map +1 -0
  206. package/dist/esm/email/parsing/message-extraction.d.ts +2 -0
  207. package/dist/esm/email/parsing/message-extraction.js +3 -0
  208. package/dist/esm/email/parsing/message-extraction.js.map +1 -0
  209. package/dist/esm/email/querying/execute-query.d.ts +17 -0
  210. package/dist/esm/email/querying/execute-query.js +45 -0
  211. package/dist/esm/email/querying/execute-query.js.map +1 -0
  212. package/dist/esm/email/querying/pagination.d.ts +27 -0
  213. package/dist/esm/email/querying/pagination.js +152 -0
  214. package/dist/esm/email/querying/pagination.js.map +1 -0
  215. package/dist/esm/email/querying/query-builder.d.ts +47 -0
  216. package/dist/esm/email/querying/query-builder.js +306 -0
  217. package/dist/esm/email/querying/query-builder.js.map +1 -0
  218. package/dist/esm/email/querying/search-execution.d.ts +29 -0
  219. package/dist/esm/email/querying/search-execution.js +35 -0
  220. package/dist/esm/email/querying/search-execution.js.map +1 -0
  221. package/dist/esm/index.d.ts +8 -0
  222. package/dist/esm/index.js +34 -0
  223. package/dist/esm/index.js.map +1 -0
  224. package/dist/esm/labels/gmail-labels.d.ts +2 -0
  225. package/dist/esm/labels/gmail-labels.js +43 -0
  226. package/dist/esm/labels/gmail-labels.js.map +1 -0
  227. package/dist/esm/lib/base64-encoding.d.ts +2 -0
  228. package/dist/esm/lib/base64-encoding.js +13 -0
  229. package/dist/esm/lib/base64-encoding.js.map +1 -0
  230. package/dist/esm/lib/create-store.d.ts +2 -0
  231. package/dist/esm/lib/create-store.js +6 -0
  232. package/dist/esm/lib/create-store.js.map +1 -0
  233. package/dist/esm/lib/date-conversion.d.ts +1 -0
  234. package/dist/esm/lib/date-conversion.js +5 -0
  235. package/dist/esm/lib/date-conversion.js.map +1 -0
  236. package/dist/esm/lib/messages-to-row.d.ts +61 -0
  237. package/dist/esm/lib/messages-to-row.js +188 -0
  238. package/dist/esm/lib/messages-to-row.js.map +1 -0
  239. package/dist/esm/mcp/index.d.ts +3 -0
  240. package/dist/esm/mcp/index.js +6 -0
  241. package/dist/esm/mcp/index.js.map +1 -0
  242. package/dist/esm/mcp/prompts/draft-email.d.ts +30 -0
  243. package/dist/esm/mcp/prompts/draft-email.js +37 -0
  244. package/dist/esm/mcp/prompts/draft-email.js.map +1 -0
  245. package/dist/esm/mcp/prompts/index.d.ts +2 -0
  246. package/dist/esm/mcp/prompts/index.js +2 -0
  247. package/dist/esm/mcp/prompts/index.js.map +1 -0
  248. package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
  249. package/dist/esm/mcp/prompts/query-syntax.js +74 -0
  250. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
  251. package/dist/esm/mcp/resources/email.d.ts +11 -0
  252. package/dist/esm/mcp/resources/email.js +92 -0
  253. package/dist/esm/mcp/resources/email.js.map +1 -0
  254. package/dist/esm/mcp/resources/index.d.ts +1 -0
  255. package/dist/esm/mcp/resources/index.js +1 -0
  256. package/dist/esm/mcp/resources/index.js.map +1 -0
  257. package/dist/esm/mcp/tools/categories-list.d.ts +58 -0
  258. package/dist/esm/mcp/tools/categories-list.js +124 -0
  259. package/dist/esm/mcp/tools/categories-list.js.map +1 -0
  260. package/dist/esm/mcp/tools/index.d.ts +11 -0
  261. package/dist/esm/mcp/tools/index.js +11 -0
  262. package/dist/esm/mcp/tools/index.js.map +1 -0
  263. package/dist/esm/mcp/tools/label-add.d.ts +61 -0
  264. package/dist/esm/mcp/tools/label-add.js +101 -0
  265. package/dist/esm/mcp/tools/label-add.js.map +1 -0
  266. package/dist/esm/mcp/tools/label-delete.d.ts +71 -0
  267. package/dist/esm/mcp/tools/label-delete.js +186 -0
  268. package/dist/esm/mcp/tools/label-delete.js.map +1 -0
  269. package/dist/esm/mcp/tools/labels-list.d.ts +75 -0
  270. package/dist/esm/mcp/tools/labels-list.js +122 -0
  271. package/dist/esm/mcp/tools/labels-list.js.map +1 -0
  272. package/dist/esm/mcp/tools/message-get.d.ts +146 -0
  273. package/dist/esm/mcp/tools/message-get.js +145 -0
  274. package/dist/esm/mcp/tools/message-get.js.map +1 -0
  275. package/dist/esm/mcp/tools/message-mark-read.d.ts +50 -0
  276. package/dist/esm/mcp/tools/message-mark-read.js +80 -0
  277. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -0
  278. package/dist/esm/mcp/tools/message-move-to-trash.d.ts +71 -0
  279. package/dist/esm/mcp/tools/message-move-to-trash.js +167 -0
  280. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -0
  281. package/dist/esm/mcp/tools/message-respond.d.ts +60 -0
  282. package/dist/esm/mcp/tools/message-respond.js +152 -0
  283. package/dist/esm/mcp/tools/message-respond.js.map +1 -0
  284. package/dist/esm/mcp/tools/message-search.d.ts +182 -0
  285. package/dist/esm/mcp/tools/message-search.js +180 -0
  286. package/dist/esm/mcp/tools/message-search.js.map +1 -0
  287. package/dist/esm/mcp/tools/message-send.d.ts +87 -0
  288. package/dist/esm/mcp/tools/message-send.js +115 -0
  289. package/dist/esm/mcp/tools/message-send.js.map +1 -0
  290. package/dist/esm/mcp/tools/messages-export-csv.d.ts +84 -0
  291. package/dist/esm/mcp/tools/messages-export-csv.js +261 -0
  292. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -0
  293. package/dist/esm/package.json +1 -0
  294. package/dist/esm/schemas/gmail-query-schema.d.ts +36 -0
  295. package/dist/esm/schemas/gmail-query-schema.js +72 -0
  296. package/dist/esm/schemas/gmail-query-schema.js.map +1 -0
  297. package/dist/esm/schemas/index.d.ts +1 -0
  298. package/dist/esm/schemas/index.js +1 -0
  299. package/dist/esm/schemas/index.js.map +1 -0
  300. package/dist/esm/setup/config.d.ts +48 -0
  301. package/dist/esm/setup/config.js +175 -0
  302. package/dist/esm/setup/config.js.map +1 -0
  303. package/dist/esm/setup/http.d.ts +8 -0
  304. package/dist/esm/setup/http.js +61 -0
  305. package/dist/esm/setup/http.js.map +1 -0
  306. package/dist/esm/setup/index.d.ts +5 -0
  307. package/dist/esm/setup/index.js +5 -0
  308. package/dist/esm/setup/index.js.map +1 -0
  309. package/dist/esm/setup/oauth-google.d.ts +54 -0
  310. package/dist/esm/setup/oauth-google.js +142 -0
  311. package/dist/esm/setup/oauth-google.js.map +1 -0
  312. package/dist/esm/setup/runtime.d.ts +12 -0
  313. package/dist/esm/setup/runtime.js +115 -0
  314. package/dist/esm/setup/runtime.js.map +1 -0
  315. package/dist/esm/setup/stdio.d.ts +7 -0
  316. package/dist/esm/setup/stdio.js +38 -0
  317. package/dist/esm/setup/stdio.js.map +1 -0
  318. package/dist/esm/types.d.ts +54 -0
  319. package/dist/esm/types.js +1 -0
  320. package/dist/esm/types.js.map +1 -0
  321. package/package.json +110 -0
@@ -0,0 +1,175 @@
1
+ import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';
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 { GOOGLE_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-gmail [options]
13
+
14
+ MCP server for Gmail 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, service-account, dcr
21
+ --headless Disable browser auto-open, return auth URL instead
22
+ --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)
23
+ --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)
24
+ --dcr-verify-url=<url> External verification endpoint (required for external mode)
25
+ --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)
26
+ --port=<port> Enable HTTP transport on specified port
27
+ --stdio Enable stdio transport (default if no port)
28
+ --log-level=<level> Logging level (default: info)
29
+ --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)
30
+ --base-url=<url> Base URL for HTTP file serving (optional)
31
+
32
+ Environment Variables:
33
+ GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)
34
+ GOOGLE_CLIENT_SECRET OAuth client secret (optional)
35
+ AUTH_MODE Default authentication mode (optional)
36
+ HEADLESS Disable browser auto-open (optional)
37
+ DCR_MODE DCR mode (optional, same format as --dcr-mode)
38
+ DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)
39
+ DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)
40
+ PORT Default HTTP port (optional)
41
+ LOG_LEVEL Default logging level (optional)
42
+ STORAGE_DIR Default storage directory (optional)
43
+ BASE_URL Default base URL for file serving (optional)
44
+
45
+ OAuth Scopes:
46
+ openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/
47
+
48
+ Examples:
49
+ mcp-gmail # Use default settings
50
+ mcp-gmail --auth=service-account # Use service account auth
51
+ mcp-gmail --port=3000 # HTTP transport on port 3000
52
+ mcp-gmail --storage-dir=./emails # Custom storage directory
53
+ GOOGLE_CLIENT_ID=xxx mcp-gmail # Set client ID via env var
54
+ `.trim();
55
+ /**
56
+ * Handle --version and --help flags before config parsing.
57
+ * These should work without requiring any configuration.
58
+ */ export function handleVersionHelp(args) {
59
+ const { values } = parseArgs({
60
+ args,
61
+ options: {
62
+ version: {
63
+ type: 'boolean'
64
+ },
65
+ help: {
66
+ type: 'boolean'
67
+ }
68
+ },
69
+ strict: false
70
+ });
71
+ if (values.version) return {
72
+ handled: true,
73
+ output: pkg.version
74
+ };
75
+ if (values.help) return {
76
+ handled: true,
77
+ output: HELP_TEXT
78
+ };
79
+ return {
80
+ handled: false
81
+ };
82
+ }
83
+ /**
84
+ * Parse Gmail server configuration from CLI arguments and environment.
85
+ *
86
+ * CLI Arguments (all optional):
87
+ * - --auth=<mode> Authentication mode (default: loopback-oauth)
88
+ * Modes: loopback-oauth, service-account, dcr
89
+ * - --headless Disable browser auto-open, return auth URL instead
90
+ * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)
91
+ * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)
92
+ * - --dcr-verify-url=<url> External verification endpoint (required for external mode)
93
+ * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)
94
+ * - --port=<port> Enable HTTP transport on specified port
95
+ * - --stdio Enable stdio transport (default if no port)
96
+ * - --log-level=<level> Logging level (default: info)
97
+ * - --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)
98
+ * - --base-url=<url> Base URL for HTTP file serving (optional)
99
+ *
100
+ * Environment Variables:
101
+ * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)
102
+ * - GOOGLE_CLIENT_SECRET OAuth client secret (optional)
103
+ * - AUTH_MODE Default authentication mode (optional)
104
+ * - HEADLESS Disable browser auto-open (optional)
105
+ * - DCR_MODE DCR mode (optional, same format as --dcr-mode)
106
+ * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)
107
+ * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)
108
+ * - PORT Default HTTP port (optional)
109
+ * - LOG_LEVEL Default logging level (optional)
110
+ * - STORAGE_DIR Default storage directory (optional)
111
+ * - BASE_URL Default base URL for file serving (optional)
112
+ *
113
+ * OAuth Scopes (from constants.ts):
114
+ * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/
115
+ */ export function parseConfig(args, env) {
116
+ var _ref, _ref1, _ref2;
117
+ const transportConfig = parseTransportConfig(args, env);
118
+ const oauthConfig = parseOAuthConfig(args, env);
119
+ // Parse DCR configuration if DCR mode is enabled
120
+ const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, GOOGLE_SCOPE) : undefined;
121
+ // Parse application-level config (LOG_LEVEL, STORAGE_DIR, BASE_URL)
122
+ const { values } = parseArgs({
123
+ args,
124
+ options: {
125
+ 'log-level': {
126
+ type: 'string'
127
+ },
128
+ 'storage-dir': {
129
+ type: 'string'
130
+ },
131
+ 'base-url': {
132
+ type: 'string'
133
+ }
134
+ },
135
+ strict: false,
136
+ allowPositionals: true
137
+ });
138
+ const name = pkg.name.replace(/^@[^/]+\//, '');
139
+ // Parse repository URL from package.json, stripping git+ prefix and .git suffix
140
+ const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;
141
+ 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}`;
142
+ const rootDir = process.cwd() === '/' ? homedir() : process.cwd();
143
+ const baseDir = path.join(rootDir, '.mcp-z');
144
+ const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;
145
+ const envLogLevel = env.LOG_LEVEL;
146
+ const logLevel = (_ref1 = cliLogLevel !== null && cliLogLevel !== void 0 ? cliLogLevel : envLogLevel) !== null && _ref1 !== void 0 ? _ref1 : 'info';
147
+ // Parse storage configuration
148
+ const cliStorageDir = typeof values['storage-dir'] === 'string' ? values['storage-dir'] : undefined;
149
+ const envStorageDir = env.STORAGE_DIR;
150
+ let storageDir = (_ref2 = cliStorageDir !== null && cliStorageDir !== void 0 ? cliStorageDir : envStorageDir) !== null && _ref2 !== void 0 ? _ref2 : path.join(baseDir, name, 'files');
151
+ if (storageDir.startsWith('~')) storageDir = storageDir.replace(/^~/, homedir());
152
+ const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;
153
+ const envBaseUrl = env.BASE_URL;
154
+ const baseUrl = cliBaseUrl !== null && cliBaseUrl !== void 0 ? cliBaseUrl : envBaseUrl;
155
+ // Combine configs
156
+ const result = {
157
+ ...oauthConfig,
158
+ transport: transportConfig.transport,
159
+ logLevel,
160
+ baseDir,
161
+ name,
162
+ version: pkg.version,
163
+ repositoryUrl,
164
+ storageDir: path.resolve(storageDir)
165
+ };
166
+ if (baseUrl) result.baseUrl = baseUrl;
167
+ if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;
168
+ return result;
169
+ }
170
+ /**
171
+ * Build production configuration from process globals.
172
+ * Entry point for production server.
173
+ */ export function createConfig() {
174
+ return parseConfig(process.argv, process.env);
175
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';\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 { GOOGLE_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-gmail [options]\n\nMCP server for Gmail 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, service-account, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\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 (optional)\n\nEnvironment Variables:\n GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n GOOGLE_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 Default storage directory (optional)\n BASE_URL Default base URL for file serving (optional)\n\nOAuth Scopes:\n openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n\nExamples:\n mcp-gmail # Use default settings\n mcp-gmail --auth=service-account # Use service account auth\n mcp-gmail --port=3000 # HTTP transport on port 3000\n mcp-gmail --storage-dir=./emails # Custom storage directory\n GOOGLE_CLIENT_ID=xxx mcp-gmail # 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 Gmail 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, service-account, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\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 (optional)\n *\n * Environment Variables:\n * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n * - GOOGLE_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 Default storage directory (optional)\n * - BASE_URL Default base URL for file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\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, GOOGLE_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, STORAGE_DIR, BASE_URL)\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 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, serviceAccountKeyFile\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) 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","GOOGLE_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-gmail/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-google.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-google.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-gmail/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.js';\nexport { createHTTPServer } from './http.js';\nexport { createOAuthAdapters } from './oauth-google.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,oBAAoB;AACxD,cAAc,eAAe;AAC7B,SAASC,iBAAiB,QAAQ,aAAa"}
@@ -0,0 +1,54 @@
1
+ import { type AuthEmailProvider } from '@mcp-z/oauth';
2
+ import type { CachedToken } from '@mcp-z/oauth-google';
3
+ import { DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
4
+ import type { Logger, PromptModule, ToolModule } from '@mcp-z/server';
5
+ import type { Router } from 'express';
6
+ import type { Keyv } from 'keyv';
7
+ import type { ServerConfig } from '../types.js';
8
+ /**
9
+ * Gmail OAuth runtime dependencies.
10
+ */
11
+ export interface OAuthRuntimeDeps {
12
+ logger: Logger;
13
+ tokenStore: Keyv<CachedToken>;
14
+ dcrStore?: Keyv<unknown>;
15
+ }
16
+ /**
17
+ * Auth middleware helpers used to wrap MCP modules.
18
+ */
19
+ export interface AuthMiddleware {
20
+ withToolAuth<T extends {
21
+ name: string;
22
+ config: unknown;
23
+ handler: unknown;
24
+ }>(module: T): T;
25
+ withResourceAuth<T extends {
26
+ name: string;
27
+ template?: unknown;
28
+ config?: unknown;
29
+ handler: unknown;
30
+ }>(module: T): T;
31
+ withPromptAuth<T extends {
32
+ name: string;
33
+ config: unknown;
34
+ handler: unknown;
35
+ }>(module: T): T;
36
+ }
37
+ /**
38
+ * Result returned by createOAuthAdapters.
39
+ */
40
+ export interface OAuthAdapters {
41
+ primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;
42
+ middleware: AuthMiddleware;
43
+ authAdapter: AuthEmailProvider;
44
+ accountTools: ToolModule[];
45
+ accountPrompts: PromptModule[];
46
+ dcrRouter?: Router;
47
+ }
48
+ /**
49
+ * Create Gmail OAuth adapters and helpers.
50
+ *
51
+ * @param config Gmail server configuration.
52
+ * @param deps Runtime dependencies (logger, token store, optional DCR store).
53
+ */
54
+ export declare function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters>;
@@ -0,0 +1,142 @@
1
+ import { AccountServer } from '@mcp-z/oauth';
2
+ import { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
3
+ import { GOOGLE_SCOPE } from '../constants.js';
4
+ /**
5
+ * Create Gmail OAuth adapters and helpers.
6
+ *
7
+ * @param config Gmail server configuration.
8
+ * @param deps Runtime dependencies (logger, token store, optional DCR store).
9
+ */ export async function createOAuthAdapters(config, deps, baseUrl) {
10
+ const { logger, tokenStore, dcrStore } = deps;
11
+ const oauthStaticConfig = {
12
+ service: config.name,
13
+ clientId: config.clientId,
14
+ clientSecret: config.clientSecret,
15
+ scope: GOOGLE_SCOPE,
16
+ auth: config.auth,
17
+ headless: config.headless,
18
+ redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,
19
+ ...config.serviceAccountKeyFile && {
20
+ serviceAccountKeyFile: config.serviceAccountKeyFile
21
+ },
22
+ ...baseUrl && {
23
+ baseUrl
24
+ }
25
+ };
26
+ let primary;
27
+ if (oauthStaticConfig.auth === 'dcr') {
28
+ logger.debug('Creating DCR provider', {
29
+ service: oauthStaticConfig.service
30
+ });
31
+ if (!dcrStore) {
32
+ throw new Error('DCR mode requires dcrStore to be configured');
33
+ }
34
+ if (!oauthStaticConfig.baseUrl) {
35
+ throw new Error('DCR mode requires baseUrl to be configured');
36
+ }
37
+ primary = new DcrOAuthProvider({
38
+ clientId: oauthStaticConfig.clientId,
39
+ ...oauthStaticConfig.clientSecret && {
40
+ clientSecret: oauthStaticConfig.clientSecret
41
+ },
42
+ scope: oauthStaticConfig.scope,
43
+ verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,
44
+ logger
45
+ });
46
+ const dcrRouter = createDcrRouter({
47
+ store: dcrStore,
48
+ issuerUrl: oauthStaticConfig.baseUrl,
49
+ baseUrl: oauthStaticConfig.baseUrl,
50
+ scopesSupported: oauthStaticConfig.scope.split(' '),
51
+ clientConfig: {
52
+ clientId: oauthStaticConfig.clientId,
53
+ ...oauthStaticConfig.clientSecret && {
54
+ clientSecret: oauthStaticConfig.clientSecret
55
+ }
56
+ }
57
+ });
58
+ const middleware = primary.authMiddleware();
59
+ const authAdapter = {
60
+ getUserEmail: ()=>{
61
+ throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');
62
+ }
63
+ };
64
+ return {
65
+ primary,
66
+ middleware: middleware,
67
+ authAdapter,
68
+ accountTools: [],
69
+ accountPrompts: [],
70
+ dcrRouter
71
+ };
72
+ }
73
+ if (oauthStaticConfig.auth === 'service-account') {
74
+ if (!oauthStaticConfig.serviceAccountKeyFile) {
75
+ throw new Error('Service account key file is required when auth mode is "service-account". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');
76
+ }
77
+ logger.debug('Creating service account provider', {
78
+ service: oauthStaticConfig.service
79
+ });
80
+ primary = new ServiceAccountProvider({
81
+ keyFilePath: oauthStaticConfig.serviceAccountKeyFile,
82
+ scopes: oauthStaticConfig.scope.split(' '),
83
+ logger
84
+ });
85
+ } else {
86
+ logger.debug('Creating loopback OAuth provider', {
87
+ service: oauthStaticConfig.service
88
+ });
89
+ primary = new LoopbackOAuthProvider({
90
+ service: oauthStaticConfig.service,
91
+ clientId: oauthStaticConfig.clientId,
92
+ clientSecret: oauthStaticConfig.clientSecret,
93
+ scope: oauthStaticConfig.scope,
94
+ headless: oauthStaticConfig.headless,
95
+ logger,
96
+ tokenStore,
97
+ ...oauthStaticConfig.redirectUri !== undefined && {
98
+ redirectUri: oauthStaticConfig.redirectUri
99
+ }
100
+ });
101
+ }
102
+ const authAdapter = {
103
+ getUserEmail: (accountId)=>primary.getUserEmail(accountId),
104
+ ...'authenticateNewAccount' in primary && primary.authenticateNewAccount ? {
105
+ authenticateNewAccount: ()=>{
106
+ var _primary_authenticateNewAccount;
107
+ return (_primary_authenticateNewAccount = primary.authenticateNewAccount) === null || _primary_authenticateNewAccount === void 0 ? void 0 : _primary_authenticateNewAccount.call(primary);
108
+ }
109
+ } : {}
110
+ };
111
+ let middleware;
112
+ let accountTools;
113
+ let accountPrompts;
114
+ if (oauthStaticConfig.auth === 'service-account') {
115
+ middleware = primary.authMiddleware();
116
+ accountTools = [];
117
+ accountPrompts = [];
118
+ logger.debug('Service account mode - no account tools', {
119
+ service: oauthStaticConfig.service
120
+ });
121
+ } else {
122
+ middleware = primary.authMiddleware();
123
+ const result = AccountServer.createLoopback({
124
+ service: oauthStaticConfig.service,
125
+ store: tokenStore,
126
+ logger,
127
+ auth: authAdapter
128
+ });
129
+ accountTools = result.tools;
130
+ accountPrompts = result.prompts;
131
+ logger.debug('Loopback OAuth (multi-account mode)', {
132
+ service: oauthStaticConfig.service
133
+ });
134
+ }
135
+ return {
136
+ primary,
137
+ middleware: middleware,
138
+ authAdapter,
139
+ accountTools,
140
+ accountPrompts
141
+ };
142
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/oauth-google.ts"],"sourcesContent":["import { AccountServer, type AuthEmailProvider } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\n/**\n * Gmail OAuth runtime dependencies.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware helpers used to wrap MCP modules.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result returned by createOAuthAdapters.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AuthEmailProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n}\n\n/**\n * Create Gmail OAuth adapters and helpers.\n *\n * @param config Gmail server configuration.\n * @param deps Runtime dependencies (logger, token store, optional DCR store).\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: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\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 primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n const middleware = primary.authMiddleware();\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 return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools: [],\n accountPrompts: [],\n dcrRouter,\n };\n }\n\n if (oauthStaticConfig.auth === 'service-account') {\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n }\n\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => primary.getUserEmail(accountId),\n ...('authenticateNewAccount' in primary && primary.authenticateNewAccount\n ? {\n authenticateNewAccount: () => primary.authenticateNewAccount?.(),\n }\n : {}),\n };\n\n let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools,\n accountPrompts,\n };\n}\n"],"names":["AccountServer","createDcrRouter","DcrOAuthProvider","LoopbackOAuthProvider","ServiceAccountProvider","GOOGLE_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","service","name","clientId","clientSecret","scope","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getUserEmail","accountTools","accountPrompts","keyFilePath","scopes","accountId","authenticateNewAccount","result","createLoopback","tools","prompts"],"mappings":"AAAA,SAASA,aAAa,QAAgC,eAAe;AAErE,SAASC,eAAe,EAAEC,gBAAgB,EAAEC,qBAAqB,EAAEC,sBAAsB,QAAQ,sBAAsB;AAIvH,SAASC,YAAY,QAAQ,kBAAkB;AAiC/C;;;;;CAKC,GACD,OAAO,eAAeC,oBAAoBC,MAAoB,EAAEC,IAAsB,EAAEC,OAAgB;IACtG,MAAM,EAAEC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGJ;IACzC,MAAMK,oBAAoB;QACxBC,SAASP,OAAOQ,IAAI;QACpBC,UAAUT,OAAOS,QAAQ;QACzBC,cAAcV,OAAOU,YAAY;QACjCC,OAAOb;QACPc,MAAMZ,OAAOY,IAAI;QACjBC,UAAUb,OAAOa,QAAQ;QACzBC,aAAad,OAAOe,SAAS,CAACC,IAAI,KAAK,UAAUC,YAAYjB,OAAOc,WAAW;QAC/E,GAAId,OAAOkB,qBAAqB,IAAI;YAAEA,uBAAuBlB,OAAOkB,qBAAqB;QAAC,CAAC;QAC3F,GAAIhB,WAAW;YAAEA;QAAQ,CAAC;IAC5B;IAEA,IAAIiB;IAEJ,IAAIb,kBAAkBM,IAAI,KAAK,OAAO;QACpCT,OAAOiB,KAAK,CAAC,yBAAyB;YAAEb,SAASD,kBAAkBC,OAAO;QAAC;QAE3E,IAAI,CAACF,UAAU;YACb,MAAM,IAAIgB,MAAM;QAClB;QACA,IAAI,CAACf,kBAAkBJ,OAAO,EAAE;YAC9B,MAAM,IAAImB,MAAM;QAClB;QAEAF,UAAU,IAAIxB,iBAAiB;YAC7Bc,UAAUH,kBAAkBG,QAAQ;YACpC,GAAIH,kBAAkBI,YAAY,IAAI;gBAAEA,cAAcJ,kBAAkBI,YAAY;YAAC,CAAC;YACtFC,OAAOL,kBAAkBK,KAAK;YAC9BW,gBAAgB,GAAGhB,kBAAkBJ,OAAO,CAAC,aAAa,CAAC;YAC3DC;QACF;QAEA,MAAMoB,YAAY7B,gBAAgB;YAChC8B,OAAOnB;YACPoB,WAAWnB,kBAAkBJ,OAAO;YACpCA,SAASI,kBAAkBJ,OAAO;YAClCwB,iBAAiBpB,kBAAkBK,KAAK,CAACgB,KAAK,CAAC;YAC/CC,cAAc;gBACZnB,UAAUH,kBAAkBG,QAAQ;gBACpC,GAAIH,kBAAkBI,YAAY,IAAI;oBAAEA,cAAcJ,kBAAkBI,YAAY;gBAAC,CAAC;YACxF;QACF;QAEA,MAAMmB,aAAaV,QAAQW,cAAc;QACzC,MAAMC,cAAiC;YACrCC,cAAc;gBACZ,MAAM,IAAIX,MAAM;YAClB;QACF;QAEA,OAAO;YACLF;YACAU,YAAYA;YACZE;YACAE,cAAc,EAAE;YAChBC,gBAAgB,EAAE;YAClBX;QACF;IACF;IAEA,IAAIjB,kBAAkBM,IAAI,KAAK,mBAAmB;QAChD,IAAI,CAACN,kBAAkBY,qBAAqB,EAAE;YAC5C,MAAM,IAAIG,MAAM;QAClB;QAEAlB,OAAOiB,KAAK,CAAC,qCAAqC;YAAEb,SAASD,kBAAkBC,OAAO;QAAC;QACvFY,UAAU,IAAItB,uBAAuB;YACnCsC,aAAa7B,kBAAkBY,qBAAqB;YACpDkB,QAAQ9B,kBAAkBK,KAAK,CAACgB,KAAK,CAAC;YACtCxB;QACF;IACF,OAAO;QACLA,OAAOiB,KAAK,CAAC,oCAAoC;YAAEb,SAASD,kBAAkBC,OAAO;QAAC;QACtFY,UAAU,IAAIvB,sBAAsB;YAClCW,SAASD,kBAAkBC,OAAO;YAClCE,UAAUH,kBAAkBG,QAAQ;YACpCC,cAAcJ,kBAAkBI,YAAY;YAC5CC,OAAOL,kBAAkBK,KAAK;YAC9BE,UAAUP,kBAAkBO,QAAQ;YACpCV;YACAC;YACA,GAAIE,kBAAkBQ,WAAW,KAAKG,aAAa;gBAAEH,aAAaR,kBAAkBQ,WAAW;YAAC,CAAC;QACnG;IACF;IAEA,MAAMiB,cAAiC;QACrCC,cAAc,CAACK,YAAclB,QAAQa,YAAY,CAACK;QAClD,GAAI,4BAA4BlB,WAAWA,QAAQmB,sBAAsB,GACrE;YACEA,wBAAwB;oBAAMnB;wBAAAA,kCAAAA,QAAQmB,sBAAsB,cAA9BnB,sDAAAA,qCAAAA;;QAChC,IACA,CAAC,CAAC;IACR;IAEA,IAAIU;IACJ,IAAII;IACJ,IAAIC;IAEJ,IAAI5B,kBAAkBM,IAAI,KAAK,mBAAmB;QAChDiB,aAAaV,QAAQW,cAAc;QACnCG,eAAe,EAAE;QACjBC,iBAAiB,EAAE;QACnB/B,OAAOiB,KAAK,CAAC,2CAA2C;YAAEb,SAASD,kBAAkBC,OAAO;QAAC;IAC/F,OAAO;QACLsB,aAAaV,QAAQW,cAAc;QAEnC,MAAMS,SAAS9C,cAAc+C,cAAc,CAAC;YAC1CjC,SAASD,kBAAkBC,OAAO;YAClCiB,OAAOpB;YACPD;YACAS,MAAMmB;QACR;QACAE,eAAeM,OAAOE,KAAK;QAC3BP,iBAAiBK,OAAOG,OAAO;QAC/BvC,OAAOiB,KAAK,CAAC,uCAAuC;YAAEb,SAASD,kBAAkBC,OAAO;QAAC;IAC3F;IAEA,OAAO;QACLY;QACAU,YAAYA;QACZE;QACAE;QACAC;IACF;AACF"}
@@ -0,0 +1,12 @@
1
+ import type { CachedToken } from '@mcp-z/oauth-google';
2
+ import type { Logger, MiddlewareLayer } from '@mcp-z/server';
3
+ import type { CommonRuntime, RuntimeOverrides, ServerConfig, StorageContext } from '../types.js';
4
+ import { type OAuthAdapters } from './oauth-google.js';
5
+ export declare function createLogger(config: ServerConfig): Logger;
6
+ export declare function createTokenStore(baseDir: string): Promise<import("keyv").Keyv<CachedToken>>;
7
+ export declare function createDcrStore(baseDir: string, required: boolean): Promise<import("keyv").Keyv<unknown>>;
8
+ export declare function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer;
9
+ export declare function createLoggingLayer(logger: Logger): MiddlewareLayer;
10
+ export declare function createStorageLayer(storageContext: StorageContext): MiddlewareLayer;
11
+ export declare function assertStorageConfig(config: ServerConfig): void;
12
+ export declare function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime>;
@@ -0,0 +1,115 @@
1
+ import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';
2
+ import { createLoggingMiddleware } from '@mcp-z/server';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import pino from 'pino';
6
+ import createStore from '../lib/create-store.js';
7
+ import * as mcp from '../mcp/index.js';
8
+ import { createOAuthAdapters } from './oauth-google.js';
9
+ export function createLogger(config) {
10
+ var _config_logLevel;
11
+ const hasStdio = config.transport.type === 'stdio';
12
+ const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);
13
+ if (hasStdio) fs.mkdirSync(path.dirname(logsPath), {
14
+ recursive: true
15
+ });
16
+ return pino({
17
+ level: (_config_logLevel = config.logLevel) !== null && _config_logLevel !== void 0 ? _config_logLevel : 'info',
18
+ formatters: sanitizeForLoggingFormatter()
19
+ }, hasStdio ? pino.destination({
20
+ dest: logsPath,
21
+ sync: false
22
+ }) : pino.destination(1));
23
+ }
24
+ export async function createTokenStore(baseDir) {
25
+ const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;
26
+ return createStore(storeUri);
27
+ }
28
+ export async function createDcrStore(baseDir, required) {
29
+ if (!required) return undefined;
30
+ const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;
31
+ return createStore(dcrStoreUri);
32
+ }
33
+ export function createAuthLayer(authMiddleware) {
34
+ return {
35
+ withTool: authMiddleware.withToolAuth,
36
+ withResource: authMiddleware.withResourceAuth,
37
+ withPrompt: authMiddleware.withPromptAuth
38
+ };
39
+ }
40
+ export function createLoggingLayer(logger) {
41
+ const logging = createLoggingMiddleware({
42
+ logger
43
+ });
44
+ return {
45
+ withTool: logging.withToolLogging,
46
+ withResource: logging.withResourceLogging,
47
+ withPrompt: logging.withPromptLogging
48
+ };
49
+ }
50
+ export function createStorageLayer(storageContext) {
51
+ const wrapAtPosition = (module, extraPosition)=>{
52
+ const originalHandler = module.handler;
53
+ const wrappedHandler = async (...allArgs)=>{
54
+ const extra = allArgs[extraPosition];
55
+ extra.storageContext = storageContext;
56
+ return await originalHandler(...allArgs);
57
+ };
58
+ return {
59
+ ...module,
60
+ handler: wrappedHandler
61
+ };
62
+ };
63
+ return {
64
+ withTool: (module)=>wrapAtPosition(module, 1)
65
+ };
66
+ }
67
+ export function assertStorageConfig(config) {
68
+ if (!config.storageDir) {
69
+ throw new Error('gmail-messages-export-csv: Server configuration missing storageDir.');
70
+ }
71
+ if (config.transport.type === 'http' && !config.baseUrl && !config.transport.port) {
72
+ throw new Error('gmail-messages-export-csv: HTTP transport requires either baseUrl in server config or port in transport config. This is a server configuration error - please provide --base-url or --port.');
73
+ }
74
+ }
75
+ export async function createDefaultRuntime(config, overrides) {
76
+ var _config_baseUrl, _ref, _ref1;
77
+ if (config.auth === 'dcr' && config.transport.type !== 'http') throw new Error('DCR mode requires an HTTP transport');
78
+ assertStorageConfig(config);
79
+ const logger = createLogger(config);
80
+ const tokenStore = await createTokenStore(config.baseDir);
81
+ const baseUrl = (_config_baseUrl = config.baseUrl) !== null && _config_baseUrl !== void 0 ? _config_baseUrl : config.transport.type === 'http' && config.transport.port ? `http://localhost:${config.transport.port}` : undefined;
82
+ const dcrStore = await createDcrStore(config.baseDir, config.auth === 'dcr');
83
+ const oauthAdapters = await createOAuthAdapters(config, {
84
+ logger,
85
+ tokenStore,
86
+ dcrStore
87
+ }, baseUrl);
88
+ const deps = {
89
+ config,
90
+ logger,
91
+ tokenStore,
92
+ oauthAdapters,
93
+ baseUrl
94
+ };
95
+ const createDomainModules = (_ref = overrides === null || overrides === void 0 ? void 0 : overrides.createDomainModules) !== null && _ref !== void 0 ? _ref : ()=>({
96
+ tools: Object.values(mcp.toolFactories).map((factory)=>factory()),
97
+ resources: Object.values(mcp.resourceFactories).map((factory)=>factory()),
98
+ prompts: Object.values(mcp.promptFactories).map((factory)=>factory())
99
+ });
100
+ const middlewareFactories = (_ref1 = overrides === null || overrides === void 0 ? void 0 : overrides.middlewareFactories) !== null && _ref1 !== void 0 ? _ref1 : [
101
+ ()=>createAuthLayer(oauthAdapters.middleware),
102
+ ()=>createLoggingLayer(logger),
103
+ ()=>createStorageLayer({
104
+ storageDir: config.storageDir,
105
+ baseUrl: config.baseUrl,
106
+ transport: config.transport
107
+ })
108
+ ];
109
+ return {
110
+ deps,
111
+ middlewareFactories,
112
+ createDomainModules,
113
+ close: async ()=>{}
114
+ };
115
+ }