@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,58 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import { z } from 'zod';
3
+ declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
4
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5
+ type: z.ZodLiteral<"success">;
6
+ items: z.ZodArray<z.ZodObject<{
7
+ id: z.ZodString;
8
+ name: z.ZodString;
9
+ description: z.ZodString;
10
+ }, z.core.$strip>>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ type: z.ZodLiteral<"auth_required">;
13
+ provider: z.ZodString;
14
+ message: z.ZodString;
15
+ url: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>], "type">;
17
+ export type Input = z.infer<typeof inputSchema>;
18
+ export type Output = z.infer<typeof outputSchema>;
19
+ declare function handler(_args: Input, extra: EnrichedExtra): Promise<{
20
+ content: {
21
+ type: "text";
22
+ text: string;
23
+ }[];
24
+ structuredContent: {
25
+ result: {
26
+ type: "success";
27
+ items: {
28
+ id: string;
29
+ name: string;
30
+ description: string;
31
+ }[];
32
+ };
33
+ };
34
+ }>;
35
+ export default function createTool(): {
36
+ name: string;
37
+ config: {
38
+ readonly description: "List Gmail category labels (CATEGORY_*) with IDs and descriptions.";
39
+ readonly inputSchema: z.ZodObject<{}, z.core.$strip>;
40
+ readonly outputSchema: z.ZodObject<{
41
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
42
+ type: z.ZodLiteral<"success">;
43
+ items: z.ZodArray<z.ZodObject<{
44
+ id: z.ZodString;
45
+ name: z.ZodString;
46
+ description: z.ZodString;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>, z.ZodObject<{
49
+ type: z.ZodLiteral<"auth_required">;
50
+ provider: z.ZodString;
51
+ message: z.ZodString;
52
+ url: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$strip>], "type">;
54
+ }, z.core.$strip>;
55
+ };
56
+ handler: typeof handler;
57
+ };
58
+ export {};
@@ -0,0 +1,124 @@
1
+ import { schemas } from '@mcp-z/oauth-google';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
4
+ import { google } from 'googleapis';
5
+ import { z } from 'zod';
6
+ // Schema for individual category items
7
+ const CategorySchema = z.object({
8
+ id: z.string().describe('Gmail category ID (e.g., CATEGORY_PERSONAL)'),
9
+ name: z.string().describe('Human-readable category name'),
10
+ description: z.string().describe('Description of what emails belong in this category')
11
+ });
12
+ const inputSchema = z.object({});
13
+ // Success branch schema
14
+ const successBranchSchema = z.object({
15
+ type: z.literal('success'),
16
+ items: z.array(CategorySchema)
17
+ });
18
+ // Output schema with auth_required support
19
+ const outputSchema = z.discriminatedUnion('type', [
20
+ successBranchSchema,
21
+ AuthRequiredBranchSchema
22
+ ]);
23
+ const config = {
24
+ description: 'List Gmail category labels (CATEGORY_*) with IDs and descriptions.',
25
+ inputSchema: inputSchema,
26
+ outputSchema: z.object({
27
+ result: outputSchema
28
+ })
29
+ };
30
+ async function handler(_args, extra) {
31
+ const logger = extra.logger;
32
+ logger.info('gmail.categories.list called');
33
+ try {
34
+ const gmail = google.gmail({
35
+ version: 'v1',
36
+ auth: extra.authContext.auth
37
+ });
38
+ const started = Date.now();
39
+ // Fetch all labels from Gmail API
40
+ const response = await gmail.users.labels.list({
41
+ userId: 'me'
42
+ });
43
+ const labels = response.data.labels || [];
44
+ // Filter for CATEGORY_* system labels and map to our schema
45
+ const categories = labels.filter((label)=>{
46
+ var _label_id;
47
+ return (_label_id = label.id) === null || _label_id === void 0 ? void 0 : _label_id.startsWith('CATEGORY_');
48
+ }).map((label)=>{
49
+ const id = label.id;
50
+ let name = label.name || id;
51
+ let description = '';
52
+ // Map known category types to user-friendly names and descriptions
53
+ switch(id){
54
+ case 'CATEGORY_PERSONAL':
55
+ name = 'Primary';
56
+ description = 'Important emails from people you know';
57
+ break;
58
+ case 'CATEGORY_SOCIAL':
59
+ name = 'Social';
60
+ description = 'Social networks and social websites';
61
+ break;
62
+ case 'CATEGORY_PROMOTIONS':
63
+ name = 'Promotions';
64
+ description = 'Deals, offers, and marketing emails';
65
+ break;
66
+ case 'CATEGORY_UPDATES':
67
+ name = 'Updates';
68
+ description = 'Confirmations, receipts, bills, and statements';
69
+ break;
70
+ case 'CATEGORY_FORUMS':
71
+ name = 'Forums';
72
+ description = 'Online groups, discussion boards, mailing lists';
73
+ break;
74
+ default:
75
+ // For any unknown CATEGORY_* labels, use the label name as-is
76
+ name = label.name || id.replace('CATEGORY_', '');
77
+ description = `Gmail category: ${name}`;
78
+ }
79
+ return {
80
+ id,
81
+ name,
82
+ description
83
+ };
84
+ }).sort((a, b)=>a.name.localeCompare(b.name)); // Sort alphabetically by name
85
+ const durationMs = Date.now() - started;
86
+ logger.info('gmail.categories.list results', {
87
+ categoryCount: categories.length,
88
+ totalLabels: labels.length
89
+ });
90
+ logger.info('gmail.categories.list metrics', {
91
+ durationMs
92
+ });
93
+ const result = {
94
+ type: 'success',
95
+ items: categories
96
+ };
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: JSON.stringify(result)
102
+ }
103
+ ],
104
+ structuredContent: {
105
+ result
106
+ }
107
+ };
108
+ } catch (error) {
109
+ const message = error instanceof Error ? error.message : String(error);
110
+ logger.error('gmail.categories.list error', {
111
+ error: message
112
+ });
113
+ throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {
114
+ stack: error instanceof Error ? error.stack : undefined
115
+ });
116
+ }
117
+ }
118
+ export default function createTool() {
119
+ return {
120
+ name: 'categories-list',
121
+ config,
122
+ handler
123
+ };
124
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\n// Schema for individual category items\nconst CategorySchema = z.object({\n id: z.string().describe('Gmail category ID (e.g., CATEGORY_PERSONAL)'),\n name: z.string().describe('Human-readable category name'),\n description: z.string().describe('Description of what emails belong in this category'),\n});\n\nconst inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(CategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Gmail category labels (CATEGORY_*) with IDs and descriptions.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_args: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.categories.list called');\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n const started = Date.now();\n\n // Fetch all labels from Gmail API\n const response = await gmail.users.labels.list({ userId: 'me' });\n const labels = response.data.labels || [];\n\n // Filter for CATEGORY_* system labels and map to our schema\n const categories = labels\n .filter((label) => label.id?.startsWith('CATEGORY_'))\n .map((label) => {\n const id = label.id as string;\n let name = label.name || id;\n let description = '';\n\n // Map known category types to user-friendly names and descriptions\n switch (id) {\n case 'CATEGORY_PERSONAL':\n name = 'Primary';\n description = 'Important emails from people you know';\n break;\n case 'CATEGORY_SOCIAL':\n name = 'Social';\n description = 'Social networks and social websites';\n break;\n case 'CATEGORY_PROMOTIONS':\n name = 'Promotions';\n description = 'Deals, offers, and marketing emails';\n break;\n case 'CATEGORY_UPDATES':\n name = 'Updates';\n description = 'Confirmations, receipts, bills, and statements';\n break;\n case 'CATEGORY_FORUMS':\n name = 'Forums';\n description = 'Online groups, discussion boards, mailing lists';\n break;\n default:\n // For any unknown CATEGORY_* labels, use the label name as-is\n name = label.name || id.replace('CATEGORY_', '');\n description = `Gmail category: ${name}`;\n }\n\n return {\n id,\n name,\n description,\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name)); // Sort alphabetically by name\n\n const durationMs = Date.now() - started;\n\n logger.info('gmail.categories.list results', { categoryCount: categories.length, totalLabels: labels.length });\n logger.info('gmail.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.categories.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","CategorySchema","object","id","string","describe","name","description","inputSchema","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","result","handler","_args","extra","logger","info","gmail","version","auth","authContext","started","Date","now","response","users","labels","list","userId","data","categories","filter","label","startsWith","map","replace","sort","a","b","localeCompare","durationMs","categoryCount","length","totalLabels","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { default as categoriesList } from './categories-list.js';
2
+ export { default as labelAdd } from './label-add.js';
3
+ export { default as labelDelete } from './label-delete.js';
4
+ export { default as labelsList } from './labels-list.js';
5
+ export { default as messageGet } from './message-get.js';
6
+ export { default as messageMarkRead } from './message-mark-read.js';
7
+ export { default as messageMoveToTrash } from './message-move-to-trash.js';
8
+ export { default as messageRespond } from './message-respond.js';
9
+ export { default as messageSearch } from './message-search.js';
10
+ export { default as messageSend } from './message-send.js';
11
+ export { default as messagesExportCsv } from './messages-export-csv.js';
@@ -0,0 +1,11 @@
1
+ export { default as categoriesList } from './categories-list.js';
2
+ export { default as labelAdd } from './label-add.js';
3
+ export { default as labelDelete } from './label-delete.js';
4
+ export { default as labelsList } from './labels-list.js';
5
+ export { default as messageGet } from './message-get.js';
6
+ export { default as messageMarkRead } from './message-mark-read.js';
7
+ export { default as messageMoveToTrash } from './message-move-to-trash.js';
8
+ export { default as messageRespond } from './message-respond.js';
9
+ export { default as messageSearch } from './message-search.js';
10
+ export { default as messageSend } from './message-send.js';
11
+ export { default as messagesExportCsv } from './messages-export-csv.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/index.ts"],"sourcesContent":["export { default as categoriesList } from './categories-list.js';\nexport { default as labelAdd } from './label-add.js';\nexport { default as labelDelete } from './label-delete.js';\nexport { default as labelsList } from './labels-list.js';\nexport { default as messageGet } from './message-get.js';\nexport { default as messageMarkRead } from './message-mark-read.js';\nexport { default as messageMoveToTrash } from './message-move-to-trash.js';\nexport { default as messageRespond } from './message-respond.js';\nexport { default as messageSearch } from './message-search.js';\nexport { default as messageSend } from './message-send.js';\nexport { default as messagesExportCsv } from './messages-export-csv.js';\n"],"names":["default","categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":"AAAA,SAASA,WAAWC,cAAc,QAAQ,uBAAuB;AACjE,SAASD,WAAWE,QAAQ,QAAQ,iBAAiB;AACrD,SAASF,WAAWG,WAAW,QAAQ,oBAAoB;AAC3D,SAASH,WAAWI,UAAU,QAAQ,mBAAmB;AACzD,SAASJ,WAAWK,UAAU,QAAQ,mBAAmB;AACzD,SAASL,WAAWM,eAAe,QAAQ,yBAAyB;AACpE,SAASN,WAAWO,kBAAkB,QAAQ,6BAA6B;AAC3E,SAASP,WAAWQ,cAAc,QAAQ,uBAAuB;AACjE,SAASR,WAAWS,aAAa,QAAQ,sBAAsB;AAC/D,SAAST,WAAWU,WAAW,QAAQ,oBAAoB;AAC3D,SAASV,WAAWW,iBAAiB,QAAQ,2BAA2B"}
@@ -0,0 +1,61 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import { z } from 'zod';
3
+ declare const inputSchema: z.ZodObject<{
4
+ id: z.ZodCoercedString<unknown>;
5
+ label: z.ZodCoercedString<unknown>;
6
+ }, z.core.$strip>;
7
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
8
+ type: z.ZodLiteral<"success">;
9
+ item: z.ZodObject<{
10
+ id: z.ZodString;
11
+ label: z.ZodString;
12
+ }, z.core.$strip>;
13
+ }, z.core.$strip>, z.ZodObject<{
14
+ type: z.ZodLiteral<"auth_required">;
15
+ provider: z.ZodString;
16
+ message: z.ZodString;
17
+ url: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>], "type">;
19
+ export type Input = z.infer<typeof inputSchema>;
20
+ export type Output = z.infer<typeof outputSchema>;
21
+ declare function handler({ id, label }: Input, extra: EnrichedExtra): Promise<{
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ structuredContent: {
27
+ result: {
28
+ type: "success";
29
+ item: {
30
+ id: string;
31
+ label: string;
32
+ };
33
+ };
34
+ };
35
+ }>;
36
+ export default function createTool(): {
37
+ name: string;
38
+ config: {
39
+ readonly description: "Add a label to a Gmail message";
40
+ readonly inputSchema: z.ZodObject<{
41
+ id: z.ZodCoercedString<unknown>;
42
+ label: z.ZodCoercedString<unknown>;
43
+ }, z.core.$strip>;
44
+ readonly outputSchema: z.ZodObject<{
45
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
46
+ type: z.ZodLiteral<"success">;
47
+ item: z.ZodObject<{
48
+ id: z.ZodString;
49
+ label: z.ZodString;
50
+ }, z.core.$strip>;
51
+ }, z.core.$strip>, z.ZodObject<{
52
+ type: z.ZodLiteral<"auth_required">;
53
+ provider: z.ZodString;
54
+ message: z.ZodString;
55
+ url: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strip>], "type">;
57
+ }, z.core.$strip>;
58
+ };
59
+ handler: typeof handler;
60
+ };
61
+ export {};
@@ -0,0 +1,101 @@
1
+ import { schemas } from '@mcp-z/oauth-google';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
4
+ import { google } from 'googleapis';
5
+ import { z } from 'zod';
6
+ import { ensureLabelId } from '../../labels/gmail-labels.js';
7
+ const inputSchema = z.object({
8
+ id: z.coerce.string().trim().min(1).describe('Gmail message ID to add label to'),
9
+ label: z.coerce.string().trim().min(1).describe('Label name or ID (use gmail-labels-list to discover available labels)')
10
+ });
11
+ // Success branch schema
12
+ const successBranchSchema = z.object({
13
+ type: z.literal('success'),
14
+ item: z.object({
15
+ id: z.string().describe('Message ID the label was added to'),
16
+ label: z.string().describe('Label that was added')
17
+ })
18
+ });
19
+ // Output schema with auth_required support
20
+ const outputSchema = z.discriminatedUnion('type', [
21
+ successBranchSchema,
22
+ AuthRequiredBranchSchema
23
+ ]);
24
+ const config = {
25
+ description: 'Add a label to a Gmail message',
26
+ inputSchema: inputSchema,
27
+ outputSchema: z.object({
28
+ result: outputSchema
29
+ })
30
+ };
31
+ async function handler({ id, label }, extra) {
32
+ const logger = extra.logger;
33
+ logger.info('gmail.label.add called', {
34
+ id,
35
+ label
36
+ });
37
+ if (!id || !label) {
38
+ logger.info('gmail.label.add missing parameters', {
39
+ id,
40
+ label
41
+ });
42
+ throw new McpError(ErrorCode.InvalidParams, 'Missing id or label');
43
+ }
44
+ try {
45
+ const gmail = google.gmail({
46
+ version: 'v1',
47
+ auth: extra.authContext.auth
48
+ });
49
+ const labelId = await ensureLabelId(gmail, 'me', label);
50
+ await gmail.users.messages.modify({
51
+ userId: 'me',
52
+ id: id,
53
+ requestBody: {
54
+ addLabelIds: [
55
+ labelId
56
+ ]
57
+ }
58
+ });
59
+ logger.info('gmail.label.add success', {
60
+ id,
61
+ label
62
+ });
63
+ logger.info('gmail.label.add result (typed)', {
64
+ id,
65
+ label
66
+ });
67
+ const result = {
68
+ type: 'success',
69
+ item: {
70
+ id,
71
+ label
72
+ }
73
+ };
74
+ return {
75
+ content: [
76
+ {
77
+ type: 'text',
78
+ text: JSON.stringify(result)
79
+ }
80
+ ],
81
+ structuredContent: {
82
+ result
83
+ }
84
+ };
85
+ } catch (error) {
86
+ const message = error instanceof Error ? error.message : String(error);
87
+ logger.error('gmail.label.add error', {
88
+ error: message
89
+ });
90
+ throw new McpError(ErrorCode.InternalError, `Error adding label to message: ${message}`, {
91
+ stack: error instanceof Error ? error.stack : undefined
92
+ });
93
+ }
94
+ }
95
+ export default function createTool() {
96
+ return {
97
+ name: 'label-add',
98
+ config,
99
+ handler
100
+ };
101
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/label-add.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { ensureLabelId } from '../../labels/gmail-labels.js';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to add label to'),\n label: z.coerce.string().trim().min(1).describe('Label name or ID (use gmail-labels-list to discover available labels)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: z.object({\n id: z.string().describe('Message ID the label was added to'),\n label: z.string().describe('Label that was added'),\n }),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add a label to a Gmail message',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, label }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.label.add called', { id, label });\n\n if (!id || !label) {\n logger.info('gmail.label.add missing parameters', { id, label });\n throw new McpError(ErrorCode.InvalidParams, 'Missing id or label');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n const labelId = await ensureLabelId(gmail, 'me', label);\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n addLabelIds: [labelId],\n },\n });\n\n logger.info('gmail.label.add success', { id, label });\n logger.info('gmail.label.add result (typed)', { id, label });\n\n const result: Output = {\n type: 'success' as const,\n item: { id, label },\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.label.add error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error adding label to message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-add',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","ensureLabelId","inputSchema","object","id","coerce","string","trim","min","describe","label","successBranchSchema","type","literal","item","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","InvalidParams","gmail","version","auth","authContext","labelId","users","messages","modify","userId","requestBody","addLabelIds","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,sBAAsB;AAE9C,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAASE,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AACzE,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,aAAa,QAAQ,+BAA+B;AAE7D,MAAMC,cAAcF,EAAEG,MAAM,CAAC;IAC3BC,IAAIJ,EAAEK,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;IAC7CC,OAAOV,EAAEK,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAClD;AAEA,wBAAwB;AACxB,MAAME,sBAAsBX,EAAEG,MAAM,CAAC;IACnCS,MAAMZ,EAAEa,OAAO,CAAC;IAChBC,MAAMd,EAAEG,MAAM,CAAC;QACbC,IAAIJ,EAAEM,MAAM,GAAGG,QAAQ,CAAC;QACxBC,OAAOV,EAAEM,MAAM,GAAGG,QAAQ,CAAC;IAC7B;AACF;AAEA,2CAA2C;AAC3C,MAAMM,eAAef,EAAEgB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBf;CAAyB;AAEjG,MAAMqB,SAAS;IACbC,aAAa;IACbhB,aAAaA;IACba,cAAcf,EAAEG,MAAM,CAAC;QACrBgB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEhB,EAAE,EAAEM,KAAK,EAAS,EAAEW,KAAoB;IAC/D,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC,0BAA0B;QAAEnB;QAAIM;IAAM;IAElD,IAAI,CAACN,MAAM,CAACM,OAAO;QACjBY,OAAOC,IAAI,CAAC,sCAAsC;YAAEnB;YAAIM;QAAM;QAC9D,MAAM,IAAIZ,SAASD,UAAU2B,aAAa,EAAE;IAC9C;IAEA,IAAI;QACF,MAAMC,QAAQ1B,OAAO0B,KAAK,CAAC;YAAEC,SAAS;YAAMC,MAAMN,MAAMO,WAAW,CAACD,IAAI;QAAC;QAEzE,MAAME,UAAU,MAAM5B,cAAcwB,OAAO,MAAMf;QACjD,MAAMe,MAAMK,KAAK,CAACC,QAAQ,CAACC,MAAM,CAAC;YAChCC,QAAQ;YACR7B,IAAIA;YACJ8B,aAAa;gBACXC,aAAa;oBAACN;iBAAQ;YACxB;QACF;QAEAP,OAAOC,IAAI,CAAC,2BAA2B;YAAEnB;YAAIM;QAAM;QACnDY,OAAOC,IAAI,CAAC,kCAAkC;YAAEnB;YAAIM;QAAM;QAE1D,MAAMS,SAAiB;YACrBP,MAAM;YACNE,MAAM;gBAAEV;gBAAIM;YAAM;QACpB;QAEA,OAAO;YACL0B,SAAS;gBACP;oBACExB,MAAM;oBACNyB,MAAMC,KAAKC,SAAS,CAACpB;gBACvB;aACD;YACDqB,mBAAmB;gBAAErB;YAAO;QAC9B;IACF,EAAE,OAAOsB,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChEnB,OAAOmB,KAAK,CAAC,yBAAyB;YAAEA,OAAOC;QAAQ;QAEvD,MAAM,IAAI5C,SAASD,UAAUgD,aAAa,EAAE,CAAC,+BAA+B,EAAEH,SAAS,EAAE;YACvFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACNhC;QACAG;IACF;AACF"}
@@ -0,0 +1,71 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import { z } from 'zod';
3
+ declare const inputSchema: z.ZodObject<{
4
+ ids: z.ZodArray<z.ZodCoercedString<unknown>>;
5
+ }, z.core.$strip>;
6
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7
+ type: z.ZodLiteral<"success">;
8
+ totalRequested: z.ZodNumber;
9
+ successCount: z.ZodNumber;
10
+ failureCount: z.ZodNumber;
11
+ results: z.ZodArray<z.ZodObject<{
12
+ id: z.ZodString;
13
+ success: z.ZodBoolean;
14
+ error: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>>;
16
+ }, z.core.$strip>, z.ZodObject<{
17
+ type: z.ZodLiteral<"auth_required">;
18
+ provider: z.ZodString;
19
+ message: z.ZodString;
20
+ url: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$strip>], "type">;
22
+ export type Input = z.infer<typeof inputSchema>;
23
+ export type Output = z.infer<typeof outputSchema>;
24
+ declare function handler({ ids }: Input, extra: EnrichedExtra): Promise<{
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ structuredContent: {
30
+ result: {
31
+ type: "success";
32
+ totalRequested: number;
33
+ successCount: number;
34
+ failureCount: number;
35
+ results: {
36
+ id: string;
37
+ success: boolean;
38
+ error?: string;
39
+ }[];
40
+ };
41
+ };
42
+ }>;
43
+ export default function createTool(): {
44
+ name: string;
45
+ config: {
46
+ readonly description: "Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.";
47
+ readonly inputSchema: z.ZodObject<{
48
+ ids: z.ZodArray<z.ZodCoercedString<unknown>>;
49
+ }, z.core.$strip>;
50
+ readonly outputSchema: z.ZodObject<{
51
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
52
+ type: z.ZodLiteral<"success">;
53
+ totalRequested: z.ZodNumber;
54
+ successCount: z.ZodNumber;
55
+ failureCount: z.ZodNumber;
56
+ results: z.ZodArray<z.ZodObject<{
57
+ id: z.ZodString;
58
+ success: z.ZodBoolean;
59
+ error: z.ZodOptional<z.ZodString>;
60
+ }, z.core.$strip>>;
61
+ }, z.core.$strip>, z.ZodObject<{
62
+ type: z.ZodLiteral<"auth_required">;
63
+ provider: z.ZodString;
64
+ message: z.ZodString;
65
+ url: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>], "type">;
67
+ }, z.core.$strip>;
68
+ };
69
+ handler: typeof handler;
70
+ };
71
+ export {};
@@ -0,0 +1,186 @@
1
+ import { schemas } from '@mcp-z/oauth-google';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
4
+ import { google } from 'googleapis';
5
+ import { z } from 'zod';
6
+ import { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.js';
7
+ const inputSchema = z.object({
8
+ ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail label IDs to delete')
9
+ });
10
+ const successBranchSchema = z.object({
11
+ type: z.literal('success'),
12
+ totalRequested: z.number().describe('Total number of labels requested to delete'),
13
+ successCount: z.number().describe('Number of labels successfully deleted'),
14
+ failureCount: z.number().describe('Number of labels that failed to delete'),
15
+ results: z.array(z.object({
16
+ id: z.string().describe('Label ID'),
17
+ success: z.boolean().describe('Whether the operation succeeded'),
18
+ error: z.string().optional().describe('Error message if operation failed')
19
+ })).describe('Individual results for each label')
20
+ });
21
+ const outputSchema = z.discriminatedUnion('type', [
22
+ successBranchSchema,
23
+ AuthRequiredBranchSchema
24
+ ]);
25
+ const config = {
26
+ description: 'Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.',
27
+ inputSchema: inputSchema,
28
+ outputSchema: z.object({
29
+ result: outputSchema
30
+ })
31
+ };
32
+ async function handler({ ids }, extra) {
33
+ const logger = extra.logger;
34
+ logger.info('gmail-label-delete called', {
35
+ count: ids.length
36
+ });
37
+ if (!ids || ids.length === 0) {
38
+ throw new McpError(ErrorCode.InvalidParams, 'Missing ids');
39
+ }
40
+ // Validate batch size to prevent memory exhaustion
41
+ if (ids.length > MAX_BATCH_SIZE) {
42
+ throw new McpError(ErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);
43
+ }
44
+ // Validate and sanitize IDs
45
+ const validatedIds = [];
46
+ const invalidIds = [];
47
+ for (const id of ids){
48
+ const trimmedId = id.trim();
49
+ if (!trimmedId) {
50
+ invalidIds.push(id);
51
+ continue;
52
+ }
53
+ // Basic Gmail label ID validation - should not contain certain characters
54
+ if (trimmedId.includes('/') || trimmedId.includes('\\') || trimmedId.includes('<') || trimmedId.includes('>')) {
55
+ invalidIds.push(id);
56
+ continue;
57
+ }
58
+ validatedIds.push(trimmedId);
59
+ }
60
+ if (invalidIds.length > 0) {
61
+ throw new McpError(ErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);
62
+ }
63
+ if (validatedIds.length === 0) {
64
+ throw new McpError(ErrorCode.InvalidParams, 'No valid IDs found after validation');
65
+ }
66
+ try {
67
+ const gmail = google.gmail({
68
+ version: 'v1',
69
+ auth: extra.authContext.auth
70
+ });
71
+ // Get all labels first to check for system labels
72
+ const labelsResponse = await gmail.users.labels.list({
73
+ userId: 'me'
74
+ });
75
+ const allLabels = labelsResponse.data.labels || [];
76
+ const labelMap = new Map(allLabels.map((label)=>[
77
+ label.id || '',
78
+ label
79
+ ]));
80
+ // Process deletions in chunks to prevent memory exhaustion
81
+ const allResults = [];
82
+ for(let i = 0; i < validatedIds.length; i += CHUNK_SIZE){
83
+ const chunk = validatedIds.slice(i, i + CHUNK_SIZE);
84
+ logger.info('Processing chunk', {
85
+ chunkIndex: i / CHUNK_SIZE + 1,
86
+ chunkSize: chunk.length,
87
+ totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE)
88
+ });
89
+ const chunkResults = await Promise.allSettled(chunk.map(async (id)=>{
90
+ const label = labelMap.get(id);
91
+ // Check if label exists
92
+ if (!label) {
93
+ throw new Error(`Label not found: ${id}`);
94
+ }
95
+ // Check if it's a system label
96
+ if (label.type === 'system') {
97
+ throw new Error(`Cannot delete system label: ${label.name} (${id})`);
98
+ }
99
+ // Delete the label
100
+ await gmail.users.labels.delete({
101
+ userId: 'me',
102
+ id: id
103
+ });
104
+ return {
105
+ id,
106
+ success: true
107
+ };
108
+ }));
109
+ // Process chunk results
110
+ const processedChunkResults = chunkResults.map((result, chunkIndex)=>{
111
+ const id = chunk[chunkIndex];
112
+ if (!id) {
113
+ throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);
114
+ }
115
+ if (result.status === 'fulfilled') {
116
+ return {
117
+ id,
118
+ success: true
119
+ };
120
+ }
121
+ // Extract error message more robustly
122
+ let errorMessage = 'Unknown error';
123
+ if (result.reason) {
124
+ if (typeof result.reason === 'string') {
125
+ errorMessage = result.reason;
126
+ } else if (result.reason instanceof Error) {
127
+ errorMessage = result.reason.message;
128
+ } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {
129
+ errorMessage = String(result.reason.message);
130
+ } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {
131
+ errorMessage = String(result.reason.error);
132
+ } else {
133
+ errorMessage = String(result.reason);
134
+ }
135
+ }
136
+ return {
137
+ id,
138
+ success: false,
139
+ error: errorMessage
140
+ };
141
+ });
142
+ allResults.push(...processedChunkResults);
143
+ }
144
+ const successCount = allResults.filter((r)=>r.success).length;
145
+ const failureCount = allResults.filter((r)=>!r.success).length;
146
+ logger.info('gmail-label-delete completed', {
147
+ totalRequested: validatedIds.length,
148
+ successCount,
149
+ failureCount,
150
+ chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE)
151
+ });
152
+ const result = {
153
+ type: 'success',
154
+ totalRequested: validatedIds.length,
155
+ successCount,
156
+ failureCount,
157
+ results: allResults
158
+ };
159
+ return {
160
+ content: [
161
+ {
162
+ type: 'text',
163
+ text: JSON.stringify(result)
164
+ }
165
+ ],
166
+ structuredContent: {
167
+ result
168
+ }
169
+ };
170
+ } catch (error) {
171
+ const message = error instanceof Error ? error.message : String(error);
172
+ logger.error('gmail-label-delete error', {
173
+ error: message
174
+ });
175
+ throw new McpError(ErrorCode.InternalError, `Error deleting labels: ${message}`, {
176
+ stack: error instanceof Error ? error.stack : undefined
177
+ });
178
+ }
179
+ }
180
+ export default function createTool() {
181
+ return {
182
+ name: 'label-delete',
183
+ config,
184
+ handler
185
+ };
186
+ }