@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,61 @@
1
+ export interface GmailMessage {
2
+ id?: string;
3
+ threadId?: string;
4
+ labelIds?: string[];
5
+ snippet?: string;
6
+ payload?: {
7
+ headers?: Array<{
8
+ name: string;
9
+ value: string;
10
+ }>;
11
+ body?: {
12
+ data?: string;
13
+ };
14
+ parts?: Array<{
15
+ mimeType: string;
16
+ body?: {
17
+ data?: string;
18
+ };
19
+ }>;
20
+ };
21
+ }
22
+ interface GmailEmailSummary {
23
+ id: string;
24
+ provider: 'gmail';
25
+ threadId?: string | undefined;
26
+ date?: string | undefined;
27
+ from?: string | undefined;
28
+ fromName?: string | undefined;
29
+ to?: string | undefined;
30
+ cc?: string | undefined;
31
+ bcc?: string | undefined;
32
+ subject?: string | undefined;
33
+ snippet?: string | undefined;
34
+ body?: string | undefined;
35
+ }
36
+ interface FormatOptions {
37
+ body?: boolean;
38
+ addressFormat?: 'raw' | 'name' | 'email';
39
+ }
40
+ export declare function toRowFromGmail(msg?: GmailMessage, opts?: FormatOptions): string[];
41
+ export declare function toRowFromGmailSummary(msg: GmailEmailSummary, opts?: FormatOptions): string[];
42
+ interface ClientSideFilters {
43
+ subjectIncludes?: string[];
44
+ bodyIncludes?: string[];
45
+ textIncludes?: string[];
46
+ fromIncludes?: string[];
47
+ toIncludes?: string[];
48
+ ccIncludes?: string[];
49
+ bccIncludes?: string[];
50
+ }
51
+ interface FilterContent {
52
+ subject?: string;
53
+ snippetOrPreview?: string;
54
+ fullBody?: string;
55
+ from?: string;
56
+ to?: string;
57
+ cc?: string;
58
+ bcc?: string;
59
+ }
60
+ export declare function filterClientSide(filters: ClientSideFilters, { subject, snippetOrPreview, fullBody, from, to, cc, bcc }?: FilterContent): boolean;
61
+ export {};
@@ -0,0 +1,188 @@
1
+ import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';
2
+ function getHeader(headers, name) {
3
+ if (!headers || !Array.isArray(headers)) return '';
4
+ const header = headers.find((h)=>h.name.toLowerCase() === name.toLowerCase());
5
+ return header ? header.value : '';
6
+ }
7
+ function parseEmailHeader(headerValue) {
8
+ if (!headerValue) return [];
9
+ const parts = [];
10
+ let current = '';
11
+ let inQuotes = false;
12
+ for(let i = 0; i < headerValue.length; i++){
13
+ const char = headerValue[i];
14
+ if (char === '"') {
15
+ inQuotes = !inQuotes;
16
+ current += char;
17
+ } else if (char === ',' && !inQuotes) {
18
+ parts.push(current.trim());
19
+ current = '';
20
+ } else {
21
+ current += char;
22
+ }
23
+ }
24
+ if (current) parts.push(current.trim());
25
+ return parts.map((part)=>{
26
+ const match = part.match(/^(?:"?([^"]*)"? <([^>]+)>|([^,]+))$/);
27
+ if (match) {
28
+ if (match[2]) {
29
+ return {
30
+ name: match[1] || undefined,
31
+ email: match[2]
32
+ };
33
+ }
34
+ return {
35
+ email: match[3] || ''
36
+ };
37
+ }
38
+ return {
39
+ email: part.trim()
40
+ };
41
+ }).filter((token)=>!!token.email); // Type guard to ensure email is always present
42
+ }
43
+ function formatRecipientHeader(headerValue, mode = 'email') {
44
+ const addresses = parseEmailHeader(headerValue);
45
+ return formatAddresses(addresses, mode);
46
+ }
47
+ /**
48
+ * Sanitizes email body text for Google Sheets export by enforcing cell character limits.
49
+ * Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.
50
+ */ function sanitizeForSheetsExport(text) {
51
+ // Google Sheets has a 50,000 character limit per cell
52
+ // Leave some buffer for safety
53
+ const GOOGLE_SHEETS_CELL_LIMIT = 49000;
54
+ if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;
55
+ // Truncate and add indication that it was truncated
56
+ const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);
57
+ return `${truncated}\n\n[...content truncated to fit Google Sheets cell limit...]`;
58
+ }
59
+ export function toRowFromGmail(msg = {}, opts = {
60
+ body: false,
61
+ addressFormat: 'email'
62
+ }) {
63
+ var _msg_id, _msg_threadId, _normalizeDateToISO, _msg_snippet;
64
+ var _msg_payload;
65
+ const id = (_msg_id = msg.id) !== null && _msg_id !== void 0 ? _msg_id : '';
66
+ const provider = 'gmail';
67
+ const threadId = (_msg_threadId = msg.threadId) !== null && _msg_threadId !== void 0 ? _msg_threadId : '';
68
+ const fmt = opts.addressFormat || 'email';
69
+ const headers = ((_msg_payload = msg.payload) === null || _msg_payload === void 0 ? void 0 : _msg_payload.headers) || [];
70
+ const toHeader = getHeader(headers, 'To');
71
+ const fromHeader = getHeader(headers, 'From');
72
+ const ccHeader = getHeader(headers, 'Cc');
73
+ const bccHeader = getHeader(headers, 'Bcc');
74
+ const dateHeader = getHeader(headers, 'Date');
75
+ const subjectHeader = getHeader(headers, 'Subject');
76
+ const to = formatRecipientHeader(toHeader, fmt);
77
+ const from = formatRecipientHeader(fromHeader, fmt);
78
+ const cc = formatRecipientHeader(ccHeader, fmt);
79
+ const bcc = formatRecipientHeader(bccHeader, fmt);
80
+ const date = (_normalizeDateToISO = normalizeDateToISO(dateHeader)) !== null && _normalizeDateToISO !== void 0 ? _normalizeDateToISO : '';
81
+ const subject = subjectHeader !== null && subjectHeader !== void 0 ? subjectHeader : '';
82
+ const labels = (msg.labelIds || []).join(', ');
83
+ const snippet = (_msg_snippet = msg.snippet) !== null && _msg_snippet !== void 0 ? _msg_snippet : '';
84
+ let bodyFull = '';
85
+ if (opts.body) {
86
+ if (msg.payload) {
87
+ var _msg_payload_body;
88
+ if ((_msg_payload_body = msg.payload.body) === null || _msg_payload_body === void 0 ? void 0 : _msg_payload_body.data) {
89
+ const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');
90
+ bodyFull = extractCurrentMessageFromText(rawBody);
91
+ } else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {
92
+ for (const part of msg.payload.parts){
93
+ var _part_body;
94
+ if ((_part_body = part.body) === null || _part_body === void 0 ? void 0 : _part_body.data) {
95
+ const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');
96
+ if (part.mimeType === 'text/plain') {
97
+ bodyFull = extractCurrentMessageFromText(rawBody);
98
+ break;
99
+ }
100
+ if (part.mimeType === 'text/html') {
101
+ bodyFull = extractCurrentMessageFromHtmlToText(rawBody);
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ return [
110
+ id,
111
+ provider,
112
+ threadId,
113
+ to,
114
+ from,
115
+ cc,
116
+ bcc,
117
+ date,
118
+ subject,
119
+ labels,
120
+ snippet,
121
+ sanitizeForSheetsExport(bodyFull)
122
+ ];
123
+ }
124
+ export function toRowFromGmailSummary(msg, opts = {
125
+ body: false,
126
+ addressFormat: 'email'
127
+ }) {
128
+ var _msg_id, _msg_threadId, _msg_to, _msg_from, _msg_cc, _msg_bcc, _normalizeDateToISO, _msg_subject, _msg_snippet;
129
+ const id = (_msg_id = msg.id) !== null && _msg_id !== void 0 ? _msg_id : '';
130
+ const provider = msg.provider || 'gmail';
131
+ const threadId = (_msg_threadId = msg.threadId) !== null && _msg_threadId !== void 0 ? _msg_threadId : '';
132
+ const fmt = opts.addressFormat || 'email';
133
+ const to = formatRecipientHeader((_msg_to = msg.to) !== null && _msg_to !== void 0 ? _msg_to : '', fmt);
134
+ const from = formatRecipientHeader((_msg_from = msg.from) !== null && _msg_from !== void 0 ? _msg_from : '', fmt);
135
+ const cc = formatRecipientHeader((_msg_cc = msg.cc) !== null && _msg_cc !== void 0 ? _msg_cc : '', fmt);
136
+ const bcc = formatRecipientHeader((_msg_bcc = msg.bcc) !== null && _msg_bcc !== void 0 ? _msg_bcc : '', fmt);
137
+ const date = (_normalizeDateToISO = normalizeDateToISO(msg.date)) !== null && _normalizeDateToISO !== void 0 ? _normalizeDateToISO : '';
138
+ const subject = (_msg_subject = msg.subject) !== null && _msg_subject !== void 0 ? _msg_subject : '';
139
+ const labels = '';
140
+ const snippet = (_msg_snippet = msg.snippet) !== null && _msg_snippet !== void 0 ? _msg_snippet : '';
141
+ let bodyFull = '';
142
+ if (opts.body && msg.body) {
143
+ bodyFull = extractCurrentMessageFromText(msg.body);
144
+ }
145
+ return [
146
+ id,
147
+ provider,
148
+ threadId,
149
+ to,
150
+ from,
151
+ cc,
152
+ bcc,
153
+ date,
154
+ subject,
155
+ labels,
156
+ snippet,
157
+ sanitizeForSheetsExport(bodyFull)
158
+ ];
159
+ }
160
+ export function filterClientSide(filters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' } = {}) {
161
+ var _ref;
162
+ const lower = (a)=>a.map((t)=>String(t).toLowerCase());
163
+ const subjectTokens = lower(filters.subjectIncludes || []);
164
+ const bodyTokens = lower(filters.bodyIncludes || []);
165
+ const textTokens = lower(filters.textIncludes || []);
166
+ const fromTokens = lower(filters.fromIncludes || []);
167
+ const toCredentials = lower(filters.toIncludes || []);
168
+ const ccTokens = lower(filters.ccIncludes || []);
169
+ const bccTokens = lower(filters.bccIncludes || []);
170
+ const s = String(subject !== null && subject !== void 0 ? subject : '').toLowerCase();
171
+ const b = String((_ref = fullBody || snippetOrPreview) !== null && _ref !== void 0 ? _ref : '').toLowerCase();
172
+ const f = String(from !== null && from !== void 0 ? from : '').toLowerCase();
173
+ const t = String(to !== null && to !== void 0 ? to : '').toLowerCase();
174
+ const c = String(cc !== null && cc !== void 0 ? cc : '').toLowerCase();
175
+ const bc = String(bcc !== null && bcc !== void 0 ? bcc : '').toLowerCase();
176
+ const anyIncludes = (val, tokens)=>{
177
+ var _tokens_;
178
+ return tokens.length === 1 ? val.includes((_tokens_ = tokens[0]) !== null && _tokens_ !== void 0 ? _tokens_ : '') : tokens.some((token)=>val.includes(token));
179
+ };
180
+ const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;
181
+ const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;
182
+ const textOk = textTokens.length ? textTokens.some((token)=>s.includes(token) || b.includes(token)) : true;
183
+ const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;
184
+ const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;
185
+ const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;
186
+ const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;
187
+ return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;
188
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\nexport interface GmailMessage {\n id?: string;\n threadId?: string;\n labelIds?: string[];\n snippet?: string;\n payload?: {\n headers?: Array<{ name: string; value: string }>;\n body?: {\n data?: string;\n };\n parts?: Array<{\n mimeType: string;\n body?: {\n data?: string;\n };\n }>;\n };\n}\n\ninterface GmailEmailSummary {\n id: string;\n provider: 'gmail';\n threadId?: string | undefined;\n date?: string | undefined;\n from?: string | undefined;\n fromName?: string | undefined;\n to?: string | undefined;\n cc?: string | undefined;\n bcc?: string | undefined;\n subject?: string | undefined;\n snippet?: string | undefined;\n body?: string | undefined;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\nfunction getHeader(headers: Array<{ name: string; value: string }> | undefined, name: string): string {\n if (!headers || !Array.isArray(headers)) return '';\n const header = headers.find((h) => h.name.toLowerCase() === name.toLowerCase());\n return header ? header.value : '';\n}\n\ninterface AddressToken {\n name?: string | undefined;\n email: string;\n}\n\nfunction parseEmailHeader(headerValue: string): AddressToken[] {\n if (!headerValue) return [];\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < headerValue.length; i++) {\n const char = headerValue[i];\n if (char === '\"') {\n inQuotes = !inQuotes;\n current += char;\n } else if (char === ',' && !inQuotes) {\n parts.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current.trim());\n\n return parts\n .map((part): AddressToken => {\n const match = part.match(/^(?:\"?([^\"]*)\"? <([^>]+)>|([^,]+))$/);\n if (match) {\n if (match[2]) {\n return { name: match[1] || undefined, email: match[2] };\n }\n return { email: match[3] || '' };\n }\n return { email: part.trim() };\n })\n .filter((token) => !!token.email); // Type guard to ensure email is always present\n}\n\nfunction formatRecipientHeader(headerValue: string, mode: 'raw' | 'name' | 'email' = 'email'): string {\n const addresses = parseEmailHeader(headerValue);\n return formatAddresses(addresses, mode);\n}\n\n/**\n * Sanitizes email body text for Google Sheets export by enforcing cell character limits.\n * Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.\n */\nfunction sanitizeForSheetsExport(text: string): string {\n // Google Sheets has a 50,000 character limit per cell\n // Leave some buffer for safety\n const GOOGLE_SHEETS_CELL_LIMIT = 49000;\n\n if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;\n\n // Truncate and add indication that it was truncated\n const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);\n return `${truncated}\\n\\n[...content truncated to fit Google Sheets cell limit...]`;\n}\n\nexport function toRowFromGmail(msg: GmailMessage = {}, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const headers = msg.payload?.headers || [];\n const toHeader = getHeader(headers, 'To');\n const fromHeader = getHeader(headers, 'From');\n const ccHeader = getHeader(headers, 'Cc');\n const bccHeader = getHeader(headers, 'Bcc');\n const dateHeader = getHeader(headers, 'Date');\n const subjectHeader = getHeader(headers, 'Subject');\n\n const to = formatRecipientHeader(toHeader, fmt);\n const from = formatRecipientHeader(fromHeader, fmt);\n const cc = formatRecipientHeader(ccHeader, fmt);\n const bcc = formatRecipientHeader(bccHeader, fmt);\n const date = normalizeDateToISO(dateHeader) ?? '';\n const subject = subjectHeader ?? '';\n\n const labels = (msg.labelIds || []).join(', ');\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body) {\n if (msg.payload) {\n if (msg.payload.body?.data) {\n const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');\n bodyFull = extractCurrentMessageFromText(rawBody);\n } else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {\n for (const part of msg.payload.parts) {\n if (part.body?.data) {\n const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');\n if (part.mimeType === 'text/plain') {\n bodyFull = extractCurrentMessageFromText(rawBody);\n break;\n }\n if (part.mimeType === 'text/html') {\n bodyFull = extractCurrentMessageFromHtmlToText(rawBody);\n break;\n }\n }\n }\n }\n }\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\nexport function toRowFromGmailSummary(msg: GmailEmailSummary, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = msg.provider || 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const to = formatRecipientHeader(msg.to ?? '', fmt);\n const from = formatRecipientHeader(msg.from ?? '', fmt);\n const cc = formatRecipientHeader(msg.cc ?? '', fmt);\n const bcc = formatRecipientHeader(msg.bcc ?? '', fmt);\n const date = normalizeDateToISO(msg.date) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n bodyFull = extractCurrentMessageFromText(msg.body);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["extractCurrentMessageFromHtmlToText","extractCurrentMessageFromText","formatAddresses","normalizeDateToISO","getHeader","headers","name","Array","isArray","header","find","h","toLowerCase","value","parseEmailHeader","headerValue","parts","current","inQuotes","i","length","char","push","trim","map","part","match","undefined","email","filter","token","formatRecipientHeader","mode","addresses","sanitizeForSheetsExport","text","GOOGLE_SHEETS_CELL_LIMIT","truncated","substring","toRowFromGmail","msg","opts","body","addressFormat","id","provider","threadId","fmt","payload","toHeader","fromHeader","ccHeader","bccHeader","dateHeader","subjectHeader","to","from","cc","bcc","date","subject","labels","labelIds","join","snippet","bodyFull","data","rawBody","Buffer","toString","mimeType","toRowFromGmailSummary","filterClientSide","filters","snippetOrPreview","fullBody","lower","a","t","String","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","f","c","bc","anyIncludes","val","tokens","includes","some","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * as promptFactories from './prompts/index.js';
2
+ export * as resourceFactories from './resources/index.js';
3
+ export * as toolFactories from './tools/index.js';
@@ -0,0 +1,6 @@
1
+ import * as _promptFactories from './prompts/index.js';
2
+ export { _promptFactories as promptFactories };
3
+ import * as _resourceFactories from './resources/index.js';
4
+ export { _resourceFactories as resourceFactories };
5
+ import * as _toolFactories from './tools/index.js';
6
+ export { _toolFactories as toolFactories };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":"AAAA,kCAAiC,qBAAqB;AAAtD,SAAO,oBAAKA,eAAe,GAA2B;AACtD,oCAAmC,uBAAuB;AAA1D,SAAO,sBAAKC,iBAAiB,GAA6B;AAC1D,gCAA+B,mBAAmB;AAAlD,SAAO,kBAAKC,aAAa,GAAyB"}
@@ -0,0 +1,30 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ export default function createPrompt(): {
5
+ name: string;
6
+ config: {
7
+ description: string;
8
+ argsSchema: {
9
+ context: z.ZodString;
10
+ tone: z.ZodOptional<z.ZodString>;
11
+ };
12
+ };
13
+ handler: (args: {
14
+ [x: string]: unknown;
15
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
16
+ messages: ({
17
+ role: "system";
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ };
22
+ } | {
23
+ role: "user";
24
+ content: {
25
+ type: "text";
26
+ text: string;
27
+ };
28
+ })[];
29
+ }>;
30
+ };
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export default function createPrompt() {
3
+ const argsSchema = z.object({
4
+ context: z.string().min(1).describe('Email context to draft response for'),
5
+ tone: z.string().optional().describe('Email tone (default: professional)')
6
+ });
7
+ const config = {
8
+ description: 'Draft an email response',
9
+ argsSchema: argsSchema.shape
10
+ };
11
+ const handler = async (args, _extra)=>{
12
+ const { context, tone } = argsSchema.parse(args);
13
+ return {
14
+ messages: [
15
+ {
16
+ role: 'system',
17
+ content: {
18
+ type: 'text',
19
+ text: 'You are an expert email assistant.'
20
+ }
21
+ },
22
+ {
23
+ role: 'user',
24
+ content: {
25
+ type: 'text',
26
+ text: `Draft a ${tone || 'professional'} email:\n\n${context}`
27
+ }
28
+ }
29
+ ]
30
+ };
31
+ };
32
+ return {
33
+ name: 'draft-email',
34
+ config,
35
+ handler
36
+ };
37
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["z","createPrompt","argsSchema","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":"AAGA,SAASA,CAAC,QAAQ,MAAM;AAExB,eAAe,SAASC;IACtB,MAAMC,aAAaF,EAAEG,MAAM,CAAC;QAC1BC,SAASJ,EAAEK,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMR,EAAEK,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,MAAMG,SAAS;QACbC,aAAa;QACbT,YAAYA,WAAWU,KAAK;IAC9B;IAEA,MAAMC,UAAU,OAAOC,MAAgCC;QACrD,MAAM,EAAEX,OAAO,EAAEI,IAAI,EAAE,GAAGN,WAAWc,KAAK,CAACF;QAC3C,OAAO;YACLG,UAAU;gBACR;oBAAEC,MAAM;oBAAmBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM;oBAAqC;gBAAE;gBAC1G;oBAAEH,MAAM;oBAAiBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM,CAAC,QAAQ,EAAEb,QAAQ,eAAe,WAAW,EAAEJ,SAAS;oBAAC;gBAAE;aAC7H;QACH;IACF;IAEA,OAAO;QACLkB,MAAM;QACNZ;QACAG;IACF;AACF"}
@@ -0,0 +1,2 @@
1
+ export { default as draftEmail } from './draft-email.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1,2 @@
1
+ export { default as draftEmail } from './draft-email.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["default","draftEmail","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,UAAU,QAAQ,mBAAmB;AACzD,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
@@ -0,0 +1,19 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ export default function createPrompt(): {
4
+ name: string;
5
+ config: {
6
+ description: string;
7
+ };
8
+ handler: (_args: {
9
+ [x: string]: unknown;
10
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
11
+ messages: {
12
+ role: "user";
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ };
17
+ }[];
18
+ }>;
19
+ };
@@ -0,0 +1,74 @@
1
+ export default function createPrompt() {
2
+ const config = {
3
+ description: 'Reference guide for Gmail query syntax'
4
+ };
5
+ const handler = async (_args, _extra)=>{
6
+ return {
7
+ messages: [
8
+ {
9
+ role: 'user',
10
+ content: {
11
+ type: 'text',
12
+ text: `# Gmail Query Syntax Reference
13
+
14
+ ## Logical Operators
15
+ - \`$and\`: Array of conditions that ALL must match
16
+ - \`$or\`: Array of conditions where ANY must match
17
+ - \`$not\`: Condition that must NOT match
18
+
19
+ ## Email Address Fields
20
+ - \`from\`, \`to\`, \`cc\`, \`bcc\`: String or field operators
21
+
22
+ ## Content Fields
23
+ - \`subject\`: Search subject line
24
+ - \`body\`: Search message body
25
+ - \`text\`: Search all text content
26
+ - \`fuzzyPhrase\`: Approximate phrase matching (words appear together)
27
+
28
+ ## Boolean Flags
29
+ - \`hasAttachment\`: true/false
30
+ - \`isRead\`: true/false
31
+
32
+ ## Date Range
33
+ \`\`\`json
34
+ { "date": { "$gte": "2024-01-01", "$lt": "2024-12-31" } }
35
+ \`\`\`
36
+
37
+ ## Gmail-Specific
38
+ - \`categories\`: primary, social, promotions, updates, forums
39
+ - \`label\`: User labels (case-sensitive, use gmail-labels-list to discover)
40
+ - \`rawGmailQuery\`: Escape hatch for advanced Gmail syntax
41
+
42
+ ## Field Operators (for multi-value fields)
43
+ - \`$any\`: OR - matches if ANY value matches
44
+ - \`$all\`: AND - matches if ALL values match
45
+ - \`$none\`: NOT - matches if NONE match
46
+
47
+ ## Example Queries
48
+ \`\`\`json
49
+ // Unread from specific sender
50
+ { "from": "boss@company.com", "isRead": false }
51
+
52
+ // Recent with attachment
53
+ { "hasAttachment": true, "date": { "$gte": "2024-01-01" } }
54
+
55
+ // Multiple senders
56
+ { "from": { "$any": ["alice@example.com", "bob@example.com"] } }
57
+
58
+ // Complex: promotions OR social, unread
59
+ { "$and": [
60
+ { "categories": { "$any": ["promotions", "social"] } },
61
+ { "isRead": false }
62
+ ]}
63
+ \`\`\``
64
+ }
65
+ }
66
+ ]
67
+ };
68
+ };
69
+ return {
70
+ name: 'query-syntax',
71
+ config,
72
+ handler
73
+ };
74
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Gmail query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Gmail Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`fuzzyPhrase\\`: Approximate phrase matching (words appear together)\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Gmail-Specific\n- \\`categories\\`: primary, social, promotions, updates, forums\n- \\`label\\`: User labels (case-sensitive, use gmail-labels-list to discover)\n- \\`rawGmailQuery\\`: Escape hatch for advanced Gmail syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// Recent with attachment\n{ \"hasAttachment\": true, \"date\": { \"$gte\": \"2024-01-01\" } }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: promotions OR social, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"promotions\", \"social\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAIA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmDb,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
@@ -0,0 +1,11 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
3
+ import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ export default function createResource(): {
5
+ name: string;
6
+ template: ResourceTemplate;
7
+ config: import("@modelcontextprotocol/sdk/server/mcp.js").ResourceMetadata;
8
+ handler: (uri: URL, variables: {
9
+ id: string;
10
+ }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ReadResourceResult>;
11
+ };
@@ -0,0 +1,92 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { google } from 'googleapis';
3
+ import { extractEmails, extractFrom } from '../../email/parsing/message-extraction.js';
4
+ import { toIsoUtc } from '../../lib/date-conversion.js';
5
+ export default function createResource() {
6
+ const template = new ResourceTemplate('gmail://messages/{id}', {
7
+ list: undefined
8
+ });
9
+ const config = {
10
+ description: 'Gmail message metadata (lightweight: id, subject, from, to, date)',
11
+ mimeType: 'application/json'
12
+ };
13
+ const handler = async (uri, variables, extra)=>{
14
+ try {
15
+ var _fullData_id, _headersMap_Subject;
16
+ var _fullData_payload;
17
+ const { logger, authContext } = extra;
18
+ logger.info(variables, 'gmail-email resource fetch');
19
+ const gmail = google.gmail({
20
+ version: 'v1',
21
+ auth: authContext.auth
22
+ });
23
+ const response = await gmail.users.messages.get({
24
+ userId: 'me',
25
+ id: variables.id,
26
+ format: 'metadata',
27
+ metadataHeaders: [
28
+ 'From',
29
+ 'To',
30
+ 'Subject',
31
+ 'Date'
32
+ ]
33
+ });
34
+ const fullData = response.data;
35
+ if (!fullData) {
36
+ throw new Error('Message not found');
37
+ }
38
+ // Extract headers
39
+ const headers = fullData === null || fullData === void 0 ? void 0 : (_fullData_payload = fullData.payload) === null || _fullData_payload === void 0 ? void 0 : _fullData_payload.headers;
40
+ const headersArray = Array.isArray(headers) ? headers : [];
41
+ const headersMap = Object.fromEntries(headersArray.map((h)=>{
42
+ var _header_name, _header_value;
43
+ const header = h;
44
+ return [
45
+ String((_header_name = header.name) !== null && _header_name !== void 0 ? _header_name : ''),
46
+ String((_header_value = header.value) !== null && _header_value !== void 0 ? _header_value : '')
47
+ ];
48
+ }));
49
+ const fromInfo = extractFrom(headersMap.From);
50
+ const toStr = extractEmails(headersMap.To).join(', ');
51
+ // Return lightweight metadata only (no body/snippet)
52
+ const metadata = {
53
+ id: (_fullData_id = fullData.id) !== null && _fullData_id !== void 0 ? _fullData_id : variables.id,
54
+ subject: (_headersMap_Subject = headersMap.Subject) !== null && _headersMap_Subject !== void 0 ? _headersMap_Subject : '',
55
+ from: (fromInfo === null || fromInfo === void 0 ? void 0 : fromInfo.address) || headersMap.From,
56
+ to: toStr,
57
+ date: toIsoUtc(headersMap.Date) || headersMap.Date
58
+ };
59
+ return {
60
+ contents: [
61
+ {
62
+ uri: uri.href,
63
+ mimeType: 'application/json',
64
+ text: JSON.stringify(metadata)
65
+ }
66
+ ]
67
+ };
68
+ } catch (e) {
69
+ var _ref;
70
+ const { logger } = extra;
71
+ logger.error(e, 'gmail-email resource fetch failed');
72
+ const error = e;
73
+ return {
74
+ contents: [
75
+ {
76
+ uri: uri.href,
77
+ mimeType: 'application/json',
78
+ text: JSON.stringify({
79
+ error: String((_ref = error === null || error === void 0 ? void 0 : error.message) !== null && _ref !== void 0 ? _ref : e)
80
+ })
81
+ }
82
+ ]
83
+ };
84
+ }
85
+ };
86
+ return {
87
+ name: 'email',
88
+ template,
89
+ config,
90
+ handler
91
+ };
92
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/resources/email.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { type gmail_v1, google } from 'googleapis';\nimport { extractEmails, extractFrom } from '../../email/parsing/message-extraction.js';\nimport { toIsoUtc } from '../../lib/date-conversion.js';\n\nexport default function createResource() {\n const template = new ResourceTemplate('gmail://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Gmail message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'gmail-email resource fetch');\n\n const gmail = google.gmail({ version: 'v1', auth: authContext.auth });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: variables.id,\n format: 'metadata',\n metadataHeaders: ['From', 'To', 'Subject', 'Date'],\n });\n\n const fullData = response.data;\n if (!fullData) {\n throw new Error('Message not found');\n }\n\n // Extract headers\n const headers = fullData?.payload?.headers;\n const headersArray = Array.isArray(headers) ? headers : [];\n const headersMap: Record<string, string> = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as gmail_v1.Schema$MessagePartHeader;\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n\n const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: fullData.id ?? variables.id,\n subject: headersMap.Subject ?? '',\n from: fromInfo?.address || headersMap.From,\n to: toStr,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'gmail-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["ResourceTemplate","google","extractEmails","extractFrom","toIsoUtc","createResource","template","list","undefined","config","description","mimeType","handler","uri","variables","extra","fullData","headersMap","logger","authContext","info","gmail","version","auth","response","users","messages","get","userId","id","format","metadataHeaders","data","Error","headers","payload","headersArray","Array","isArray","Object","fromEntries","map","h","header","String","name","value","fromInfo","From","toStr","To","join","metadata","subject","Subject","from","address","to","date","Date","contents","href","text","JSON","stringify","e","error","message"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,0CAA0C;AAG3E,SAAwBC,MAAM,QAAQ,aAAa;AACnD,SAASC,aAAa,EAAEC,WAAW,QAAQ,4CAA4C;AACvF,SAASC,QAAQ,QAAQ,+BAA+B;AAExD,eAAe,SAASC;IACtB,MAAMC,WAAW,IAAIN,iBAAiB,yBAAyB;QAC7DO,MAAMC;IACR;IACA,MAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,MAAMC,UAAU,OAAOC,KAAUC,WAA2BC;QAC1D,IAAI;gBAiCIC,cACKC;gBAfKD;YAlBhB,MAAM,EAAEE,MAAM,EAAEC,WAAW,EAAE,GAAGJ;YAEhCG,OAAOE,IAAI,CAACN,WAAW;YAEvB,MAAMO,QAAQpB,OAAOoB,KAAK,CAAC;gBAAEC,SAAS;gBAAMC,MAAMJ,YAAYI,IAAI;YAAC;YACnE,MAAMC,WAAW,MAAMH,MAAMI,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC;gBAC9CC,QAAQ;gBACRC,IAAIf,UAAUe,EAAE;gBAChBC,QAAQ;gBACRC,iBAAiB;oBAAC;oBAAQ;oBAAM;oBAAW;iBAAO;YACpD;YAEA,MAAMf,WAAWQ,SAASQ,IAAI;YAC9B,IAAI,CAAChB,UAAU;gBACb,MAAM,IAAIiB,MAAM;YAClB;YAEA,kBAAkB;YAClB,MAAMC,UAAUlB,qBAAAA,gCAAAA,oBAAAA,SAAUmB,OAAO,cAAjBnB,wCAAAA,kBAAmBkB,OAAO;YAC1C,MAAME,eAAeC,MAAMC,OAAO,CAACJ,WAAWA,UAAU,EAAE;YAC1D,MAAMjB,aAAqCsB,OAAOC,WAAW,CAC3DJ,aAAaK,GAAG,CAAC,CAACC;oBAEDC,cAA2BA;gBAD1C,MAAMA,SAASD;gBACf,OAAO;oBAACE,QAAOD,eAAAA,OAAOE,IAAI,cAAXF,0BAAAA,eAAe;oBAAKC,QAAOD,gBAAAA,OAAOG,KAAK,cAAZH,2BAAAA,gBAAgB;iBAAI;YAChE;YAGF,MAAMI,WAAW5C,YAAYc,WAAW+B,IAAI;YAC5C,MAAMC,QAAQ/C,cAAce,WAAWiC,EAAE,EAAEC,IAAI,CAAC;YAEhD,qDAAqD;YACrD,MAAMC,WAAW;gBACfvB,EAAE,GAAEb,eAAAA,SAASa,EAAE,cAAXb,0BAAAA,eAAeF,UAAUe,EAAE;gBAC/BwB,OAAO,GAAEpC,sBAAAA,WAAWqC,OAAO,cAAlBrC,iCAAAA,sBAAsB;gBAC/BsC,MAAMR,CAAAA,qBAAAA,+BAAAA,SAAUS,OAAO,KAAIvC,WAAW+B,IAAI;gBAC1CS,IAAIR;gBACJS,MAAMtD,SAASa,WAAW0C,IAAI,KAAK1C,WAAW0C,IAAI;YACpD;YAEA,OAAO;gBACLC,UAAU;oBACR;wBACE/C,KAAKA,IAAIgD,IAAI;wBACblD,UAAU;wBACVmD,MAAMC,KAAKC,SAAS,CAACZ;oBACvB;iBACD;YACH;QACF,EAAE,OAAOa,GAAG;;YACV,MAAM,EAAE/C,MAAM,EAAE,GAAGH;YACnBG,OAAOgD,KAAK,CAACD,GAA8B;YAC3C,MAAMC,QAAQD;YACd,OAAO;gBACLL,UAAU;oBACR;wBACE/C,KAAKA,IAAIgD,IAAI;wBACblD,UAAU;wBACVmD,MAAMC,KAAKC,SAAS,CAAC;4BAAEE,OAAOtB,eAAOsB,kBAAAA,4BAAAA,MAAOC,OAAO,uCAAIF;wBAAG;oBAC5D;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLpB,MAAM;QACNvC;QACAG;QACAG;IACF;AACF"}
@@ -0,0 +1 @@
1
+ export { default as email } from './email.js';
@@ -0,0 +1 @@
1
+ export { default as email } from './email.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/resources/index.ts"],"sourcesContent":["export { default as email } from './email.js';\n"],"names":["default","email"],"mappings":"AAAA,SAASA,WAAWC,KAAK,QAAQ,aAAa"}