@mcp-z/mcp-sheets 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 (363) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +7 -0
  5. package/dist/cjs/constants.d.ts +7 -0
  6. package/dist/cjs/constants.js +18 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/index.d.cts +8 -0
  9. package/dist/cjs/index.d.ts +8 -0
  10. package/dist/cjs/index.js +314 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/lib/create-store.d.cts +2 -0
  13. package/dist/cjs/lib/create-store.d.ts +2 -0
  14. package/dist/cjs/lib/create-store.js +166 -0
  15. package/dist/cjs/lib/create-store.js.map +1 -0
  16. package/dist/cjs/mcp/index.d.cts +3 -0
  17. package/dist/cjs/mcp/index.d.ts +3 -0
  18. package/dist/cjs/mcp/index.js +66 -0
  19. package/dist/cjs/mcp/index.js.map +1 -0
  20. package/dist/cjs/mcp/prompts/a1-notation.d.cts +19 -0
  21. package/dist/cjs/mcp/prompts/a1-notation.d.ts +19 -0
  22. package/dist/cjs/mcp/prompts/a1-notation.js +169 -0
  23. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -0
  24. package/dist/cjs/mcp/prompts/index.d.cts +1 -0
  25. package/dist/cjs/mcp/prompts/index.d.ts +1 -0
  26. package/dist/cjs/mcp/prompts/index.js +17 -0
  27. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  28. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  29. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  30. package/dist/cjs/mcp/resources/index.js +17 -0
  31. package/dist/cjs/mcp/resources/index.js.map +1 -0
  32. package/dist/cjs/mcp/resources/spreadsheet.d.cts +2 -0
  33. package/dist/cjs/mcp/resources/spreadsheet.d.ts +2 -0
  34. package/dist/cjs/mcp/resources/spreadsheet.js +258 -0
  35. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -0
  36. package/dist/cjs/mcp/tools/cells-format.d.cts +144 -0
  37. package/dist/cjs/mcp/tools/cells-format.d.ts +144 -0
  38. package/dist/cjs/mcp/tools/cells-format.js +484 -0
  39. package/dist/cjs/mcp/tools/cells-format.js.map +1 -0
  40. package/dist/cjs/mcp/tools/chart-create.d.cts +94 -0
  41. package/dist/cjs/mcp/tools/chart-create.d.ts +94 -0
  42. package/dist/cjs/mcp/tools/chart-create.js +575 -0
  43. package/dist/cjs/mcp/tools/chart-create.js.map +1 -0
  44. package/dist/cjs/mcp/tools/columns-get.d.cts +55 -0
  45. package/dist/cjs/mcp/tools/columns-get.d.ts +55 -0
  46. package/dist/cjs/mcp/tools/columns-get.js +289 -0
  47. package/dist/cjs/mcp/tools/columns-get.js.map +1 -0
  48. package/dist/cjs/mcp/tools/columns-update.d.cts +86 -0
  49. package/dist/cjs/mcp/tools/columns-update.d.ts +86 -0
  50. package/dist/cjs/mcp/tools/columns-update.js +482 -0
  51. package/dist/cjs/mcp/tools/columns-update.js.map +1 -0
  52. package/dist/cjs/mcp/tools/csv-get-columns.d.cts +43 -0
  53. package/dist/cjs/mcp/tools/csv-get-columns.d.ts +43 -0
  54. package/dist/cjs/mcp/tools/csv-get-columns.js +386 -0
  55. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -0
  56. package/dist/cjs/mcp/tools/dimensions-batch-update.d.cts +118 -0
  57. package/dist/cjs/mcp/tools/dimensions-batch-update.d.ts +118 -0
  58. package/dist/cjs/mcp/tools/dimensions-batch-update.js +504 -0
  59. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -0
  60. package/dist/cjs/mcp/tools/dimensions-move.d.cts +86 -0
  61. package/dist/cjs/mcp/tools/dimensions-move.d.ts +86 -0
  62. package/dist/cjs/mcp/tools/dimensions-move.js +359 -0
  63. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -0
  64. package/dist/cjs/mcp/tools/index.d.cts +26 -0
  65. package/dist/cjs/mcp/tools/index.d.ts +26 -0
  66. package/dist/cjs/mcp/tools/index.js +122 -0
  67. package/dist/cjs/mcp/tools/index.js.map +1 -0
  68. package/dist/cjs/mcp/tools/lib/dimension-operations.d.cts +48 -0
  69. package/dist/cjs/mcp/tools/lib/dimension-operations.d.ts +48 -0
  70. package/dist/cjs/mcp/tools/lib/dimension-operations.js +177 -0
  71. package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -0
  72. package/dist/cjs/mcp/tools/rows-append.d.cts +58 -0
  73. package/dist/cjs/mcp/tools/rows-append.d.ts +58 -0
  74. package/dist/cjs/mcp/tools/rows-append.js +335 -0
  75. package/dist/cjs/mcp/tools/rows-append.js.map +1 -0
  76. package/dist/cjs/mcp/tools/rows-csv-append.d.cts +67 -0
  77. package/dist/cjs/mcp/tools/rows-csv-append.d.ts +67 -0
  78. package/dist/cjs/mcp/tools/rows-csv-append.js +859 -0
  79. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -0
  80. package/dist/cjs/mcp/tools/rows-get.d.cts +56 -0
  81. package/dist/cjs/mcp/tools/rows-get.d.ts +56 -0
  82. package/dist/cjs/mcp/tools/rows-get.js +292 -0
  83. package/dist/cjs/mcp/tools/rows-get.js.map +1 -0
  84. package/dist/cjs/mcp/tools/sheet-copy-to.d.cts +68 -0
  85. package/dist/cjs/mcp/tools/sheet-copy-to.d.ts +68 -0
  86. package/dist/cjs/mcp/tools/sheet-copy-to.js +341 -0
  87. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -0
  88. package/dist/cjs/mcp/tools/sheet-copy.d.cts +80 -0
  89. package/dist/cjs/mcp/tools/sheet-copy.d.ts +80 -0
  90. package/dist/cjs/mcp/tools/sheet-copy.js +394 -0
  91. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -0
  92. package/dist/cjs/mcp/tools/sheet-create.d.cts +56 -0
  93. package/dist/cjs/mcp/tools/sheet-create.d.ts +56 -0
  94. package/dist/cjs/mcp/tools/sheet-create.js +283 -0
  95. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -0
  96. package/dist/cjs/mcp/tools/sheet-delete.d.cts +62 -0
  97. package/dist/cjs/mcp/tools/sheet-delete.d.ts +62 -0
  98. package/dist/cjs/mcp/tools/sheet-delete.js +341 -0
  99. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -0
  100. package/dist/cjs/mcp/tools/sheet-find.d.cts +48 -0
  101. package/dist/cjs/mcp/tools/sheet-find.d.ts +48 -0
  102. package/dist/cjs/mcp/tools/sheet-find.js +261 -0
  103. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -0
  104. package/dist/cjs/mcp/tools/sheet-rename.d.cts +60 -0
  105. package/dist/cjs/mcp/tools/sheet-rename.d.ts +60 -0
  106. package/dist/cjs/mcp/tools/sheet-rename.js +305 -0
  107. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -0
  108. package/dist/cjs/mcp/tools/spreadsheet-copy.d.cts +58 -0
  109. package/dist/cjs/mcp/tools/spreadsheet-copy.d.ts +58 -0
  110. package/dist/cjs/mcp/tools/spreadsheet-copy.js +319 -0
  111. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -0
  112. package/dist/cjs/mcp/tools/spreadsheet-create.d.cts +52 -0
  113. package/dist/cjs/mcp/tools/spreadsheet-create.d.ts +52 -0
  114. package/dist/cjs/mcp/tools/spreadsheet-create.js +270 -0
  115. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -0
  116. package/dist/cjs/mcp/tools/spreadsheet-find.d.cts +58 -0
  117. package/dist/cjs/mcp/tools/spreadsheet-find.d.ts +58 -0
  118. package/dist/cjs/mcp/tools/spreadsheet-find.js +334 -0
  119. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -0
  120. package/dist/cjs/mcp/tools/spreadsheet-rename.d.cts +56 -0
  121. package/dist/cjs/mcp/tools/spreadsheet-rename.d.ts +56 -0
  122. package/dist/cjs/mcp/tools/spreadsheet-rename.js +289 -0
  123. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -0
  124. package/dist/cjs/mcp/tools/validation-set.d.cts +144 -0
  125. package/dist/cjs/mcp/tools/validation-set.d.ts +144 -0
  126. package/dist/cjs/mcp/tools/validation-set.js +564 -0
  127. package/dist/cjs/mcp/tools/validation-set.js.map +1 -0
  128. package/dist/cjs/mcp/tools/values-batch-update.d.cts +102 -0
  129. package/dist/cjs/mcp/tools/values-batch-update.d.ts +102 -0
  130. package/dist/cjs/mcp/tools/values-batch-update.js +409 -0
  131. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -0
  132. package/dist/cjs/mcp/tools/values-clear.d.cts +56 -0
  133. package/dist/cjs/mcp/tools/values-clear.d.ts +56 -0
  134. package/dist/cjs/mcp/tools/values-clear.js +308 -0
  135. package/dist/cjs/mcp/tools/values-clear.js.map +1 -0
  136. package/dist/cjs/mcp/tools/values-csv-update.d.cts +75 -0
  137. package/dist/cjs/mcp/tools/values-csv-update.d.ts +75 -0
  138. package/dist/cjs/mcp/tools/values-csv-update.js +500 -0
  139. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -0
  140. package/dist/cjs/mcp/tools/values-replace.d.cts +68 -0
  141. package/dist/cjs/mcp/tools/values-replace.d.ts +68 -0
  142. package/dist/cjs/mcp/tools/values-replace.js +378 -0
  143. package/dist/cjs/mcp/tools/values-replace.js.map +1 -0
  144. package/dist/cjs/mcp/tools/values-search.d.cts +74 -0
  145. package/dist/cjs/mcp/tools/values-search.d.ts +74 -0
  146. package/dist/cjs/mcp/tools/values-search.js +470 -0
  147. package/dist/cjs/mcp/tools/values-search.js.map +1 -0
  148. package/dist/cjs/package.json +1 -0
  149. package/dist/cjs/schemas/index.d.cts +14 -0
  150. package/dist/cjs/schemas/index.d.ts +14 -0
  151. package/dist/cjs/schemas/index.js +64 -0
  152. package/dist/cjs/schemas/index.js.map +1 -0
  153. package/dist/cjs/setup/config.d.cts +44 -0
  154. package/dist/cjs/setup/config.d.ts +44 -0
  155. package/dist/cjs/setup/config.js +201 -0
  156. package/dist/cjs/setup/config.js.map +1 -0
  157. package/dist/cjs/setup/http.d.cts +8 -0
  158. package/dist/cjs/setup/http.d.ts +8 -0
  159. package/dist/cjs/setup/http.js +260 -0
  160. package/dist/cjs/setup/http.js.map +1 -0
  161. package/dist/cjs/setup/index.d.cts +5 -0
  162. package/dist/cjs/setup/index.d.ts +5 -0
  163. package/dist/cjs/setup/index.js +46 -0
  164. package/dist/cjs/setup/index.js.map +1 -0
  165. package/dist/cjs/setup/oauth-google.d.cts +54 -0
  166. package/dist/cjs/setup/oauth-google.d.ts +54 -0
  167. package/dist/cjs/setup/oauth-google.js +332 -0
  168. package/dist/cjs/setup/oauth-google.js.map +1 -0
  169. package/dist/cjs/setup/runtime.d.cts +10 -0
  170. package/dist/cjs/setup/runtime.d.ts +10 -0
  171. package/dist/cjs/setup/runtime.js +353 -0
  172. package/dist/cjs/setup/runtime.js.map +1 -0
  173. package/dist/cjs/setup/stdio.d.cts +7 -0
  174. package/dist/cjs/setup/stdio.d.ts +7 -0
  175. package/dist/cjs/setup/stdio.js +239 -0
  176. package/dist/cjs/setup/stdio.js.map +1 -0
  177. package/dist/cjs/spreadsheet/column-utilities.d.cts +1 -0
  178. package/dist/cjs/spreadsheet/column-utilities.d.ts +1 -0
  179. package/dist/cjs/spreadsheet/column-utilities.js +21 -0
  180. package/dist/cjs/spreadsheet/column-utilities.js.map +1 -0
  181. package/dist/cjs/spreadsheet/csv-streaming.d.cts +19 -0
  182. package/dist/cjs/spreadsheet/csv-streaming.d.ts +19 -0
  183. package/dist/cjs/spreadsheet/csv-streaming.js +188 -0
  184. package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -0
  185. package/dist/cjs/spreadsheet/data-operations.d.cts +115 -0
  186. package/dist/cjs/spreadsheet/data-operations.d.ts +115 -0
  187. package/dist/cjs/spreadsheet/data-operations.js +1515 -0
  188. package/dist/cjs/spreadsheet/data-operations.js.map +1 -0
  189. package/dist/cjs/spreadsheet/deduplication-utils.d.cts +31 -0
  190. package/dist/cjs/spreadsheet/deduplication-utils.d.ts +31 -0
  191. package/dist/cjs/spreadsheet/deduplication-utils.js +65 -0
  192. package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -0
  193. package/dist/cjs/spreadsheet/range-operations.d.cts +184 -0
  194. package/dist/cjs/spreadsheet/range-operations.d.ts +184 -0
  195. package/dist/cjs/spreadsheet/range-operations.js +672 -0
  196. package/dist/cjs/spreadsheet/range-operations.js.map +1 -0
  197. package/dist/cjs/spreadsheet/sheet-operations.d.cts +30 -0
  198. package/dist/cjs/spreadsheet/sheet-operations.d.ts +30 -0
  199. package/dist/cjs/spreadsheet/sheet-operations.js +811 -0
  200. package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -0
  201. package/dist/cjs/spreadsheet/spreadsheet-management.d.cts +21 -0
  202. package/dist/cjs/spreadsheet/spreadsheet-management.d.ts +21 -0
  203. package/dist/cjs/spreadsheet/spreadsheet-management.js +310 -0
  204. package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -0
  205. package/dist/cjs/types.d.cts +53 -0
  206. package/dist/cjs/types.d.ts +53 -0
  207. package/dist/cjs/types.js +5 -0
  208. package/dist/cjs/types.js.map +1 -0
  209. package/dist/esm/constants.d.ts +7 -0
  210. package/dist/esm/constants.js +7 -0
  211. package/dist/esm/constants.js.map +1 -0
  212. package/dist/esm/index.d.ts +8 -0
  213. package/dist/esm/index.js +34 -0
  214. package/dist/esm/index.js.map +1 -0
  215. package/dist/esm/lib/create-store.d.ts +2 -0
  216. package/dist/esm/lib/create-store.js +6 -0
  217. package/dist/esm/lib/create-store.js.map +1 -0
  218. package/dist/esm/mcp/index.d.ts +3 -0
  219. package/dist/esm/mcp/index.js +6 -0
  220. package/dist/esm/mcp/index.js.map +1 -0
  221. package/dist/esm/mcp/prompts/a1-notation.d.ts +19 -0
  222. package/dist/esm/mcp/prompts/a1-notation.js +49 -0
  223. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -0
  224. package/dist/esm/mcp/prompts/index.d.ts +1 -0
  225. package/dist/esm/mcp/prompts/index.js +1 -0
  226. package/dist/esm/mcp/prompts/index.js.map +1 -0
  227. package/dist/esm/mcp/resources/index.d.ts +1 -0
  228. package/dist/esm/mcp/resources/index.js +1 -0
  229. package/dist/esm/mcp/resources/index.js.map +1 -0
  230. package/dist/esm/mcp/resources/spreadsheet.d.ts +2 -0
  231. package/dist/esm/mcp/resources/spreadsheet.js +88 -0
  232. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -0
  233. package/dist/esm/mcp/tools/cells-format.d.ts +144 -0
  234. package/dist/esm/mcp/tools/cells-format.js +288 -0
  235. package/dist/esm/mcp/tools/cells-format.js.map +1 -0
  236. package/dist/esm/mcp/tools/chart-create.d.ts +94 -0
  237. package/dist/esm/mcp/tools/chart-create.js +408 -0
  238. package/dist/esm/mcp/tools/chart-create.js.map +1 -0
  239. package/dist/esm/mcp/tools/columns-get.d.ts +55 -0
  240. package/dist/esm/mcp/tools/columns-get.js +113 -0
  241. package/dist/esm/mcp/tools/columns-get.js.map +1 -0
  242. package/dist/esm/mcp/tools/columns-update.d.ts +86 -0
  243. package/dist/esm/mcp/tools/columns-update.js +296 -0
  244. package/dist/esm/mcp/tools/columns-update.js.map +1 -0
  245. package/dist/esm/mcp/tools/csv-get-columns.d.ts +43 -0
  246. package/dist/esm/mcp/tools/csv-get-columns.js +95 -0
  247. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -0
  248. package/dist/esm/mcp/tools/dimensions-batch-update.d.ts +118 -0
  249. package/dist/esm/mcp/tools/dimensions-batch-update.js +321 -0
  250. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -0
  251. package/dist/esm/mcp/tools/dimensions-move.d.ts +86 -0
  252. package/dist/esm/mcp/tools/dimensions-move.js +183 -0
  253. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -0
  254. package/dist/esm/mcp/tools/index.d.ts +26 -0
  255. package/dist/esm/mcp/tools/index.js +26 -0
  256. package/dist/esm/mcp/tools/index.js.map +1 -0
  257. package/dist/esm/mcp/tools/lib/dimension-operations.d.ts +48 -0
  258. package/dist/esm/mcp/tools/lib/dimension-operations.js +93 -0
  259. package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -0
  260. package/dist/esm/mcp/tools/rows-append.d.ts +58 -0
  261. package/dist/esm/mcp/tools/rows-append.js +151 -0
  262. package/dist/esm/mcp/tools/rows-append.js.map +1 -0
  263. package/dist/esm/mcp/tools/rows-csv-append.d.ts +67 -0
  264. package/dist/esm/mcp/tools/rows-csv-append.js +342 -0
  265. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -0
  266. package/dist/esm/mcp/tools/rows-get.d.ts +56 -0
  267. package/dist/esm/mcp/tools/rows-get.js +116 -0
  268. package/dist/esm/mcp/tools/rows-get.js.map +1 -0
  269. package/dist/esm/mcp/tools/sheet-copy-to.d.ts +68 -0
  270. package/dist/esm/mcp/tools/sheet-copy-to.js +156 -0
  271. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -0
  272. package/dist/esm/mcp/tools/sheet-copy.d.ts +80 -0
  273. package/dist/esm/mcp/tools/sheet-copy.js +177 -0
  274. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -0
  275. package/dist/esm/mcp/tools/sheet-create.d.ts +56 -0
  276. package/dist/esm/mcp/tools/sheet-create.js +110 -0
  277. package/dist/esm/mcp/tools/sheet-create.js.map +1 -0
  278. package/dist/esm/mcp/tools/sheet-delete.d.ts +62 -0
  279. package/dist/esm/mcp/tools/sheet-delete.js +125 -0
  280. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -0
  281. package/dist/esm/mcp/tools/sheet-find.d.ts +48 -0
  282. package/dist/esm/mcp/tools/sheet-find.js +90 -0
  283. package/dist/esm/mcp/tools/sheet-find.js.map +1 -0
  284. package/dist/esm/mcp/tools/sheet-rename.d.ts +60 -0
  285. package/dist/esm/mcp/tools/sheet-rename.js +128 -0
  286. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -0
  287. package/dist/esm/mcp/tools/spreadsheet-copy.d.ts +58 -0
  288. package/dist/esm/mcp/tools/spreadsheet-copy.js +117 -0
  289. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -0
  290. package/dist/esm/mcp/tools/spreadsheet-create.d.ts +52 -0
  291. package/dist/esm/mcp/tools/spreadsheet-create.js +97 -0
  292. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -0
  293. package/dist/esm/mcp/tools/spreadsheet-find.d.ts +58 -0
  294. package/dist/esm/mcp/tools/spreadsheet-find.js +113 -0
  295. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -0
  296. package/dist/esm/mcp/tools/spreadsheet-rename.d.ts +56 -0
  297. package/dist/esm/mcp/tools/spreadsheet-rename.js +112 -0
  298. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -0
  299. package/dist/esm/mcp/tools/validation-set.d.ts +144 -0
  300. package/dist/esm/mcp/tools/validation-set.js +366 -0
  301. package/dist/esm/mcp/tools/validation-set.js.map +1 -0
  302. package/dist/esm/mcp/tools/values-batch-update.d.ts +102 -0
  303. package/dist/esm/mcp/tools/values-batch-update.js +224 -0
  304. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -0
  305. package/dist/esm/mcp/tools/values-clear.d.ts +56 -0
  306. package/dist/esm/mcp/tools/values-clear.js +131 -0
  307. package/dist/esm/mcp/tools/values-clear.js.map +1 -0
  308. package/dist/esm/mcp/tools/values-csv-update.d.ts +75 -0
  309. package/dist/esm/mcp/tools/values-csv-update.js +202 -0
  310. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -0
  311. package/dist/esm/mcp/tools/values-replace.d.ts +68 -0
  312. package/dist/esm/mcp/tools/values-replace.js +171 -0
  313. package/dist/esm/mcp/tools/values-replace.js.map +1 -0
  314. package/dist/esm/mcp/tools/values-search.d.ts +74 -0
  315. package/dist/esm/mcp/tools/values-search.js +229 -0
  316. package/dist/esm/mcp/tools/values-search.js.map +1 -0
  317. package/dist/esm/package.json +1 -0
  318. package/dist/esm/schemas/index.d.ts +14 -0
  319. package/dist/esm/schemas/index.js +35 -0
  320. package/dist/esm/schemas/index.js.map +1 -0
  321. package/dist/esm/setup/config.d.ts +44 -0
  322. package/dist/esm/setup/config.js +151 -0
  323. package/dist/esm/setup/config.js.map +1 -0
  324. package/dist/esm/setup/http.d.ts +8 -0
  325. package/dist/esm/setup/http.js +54 -0
  326. package/dist/esm/setup/http.js.map +1 -0
  327. package/dist/esm/setup/index.d.ts +5 -0
  328. package/dist/esm/setup/index.js +5 -0
  329. package/dist/esm/setup/index.js.map +1 -0
  330. package/dist/esm/setup/oauth-google.d.ts +54 -0
  331. package/dist/esm/setup/oauth-google.js +142 -0
  332. package/dist/esm/setup/oauth-google.js.map +1 -0
  333. package/dist/esm/setup/runtime.d.ts +10 -0
  334. package/dist/esm/setup/runtime.js +84 -0
  335. package/dist/esm/setup/runtime.js.map +1 -0
  336. package/dist/esm/setup/stdio.d.ts +7 -0
  337. package/dist/esm/setup/stdio.js +38 -0
  338. package/dist/esm/setup/stdio.js.map +1 -0
  339. package/dist/esm/spreadsheet/column-utilities.d.ts +1 -0
  340. package/dist/esm/spreadsheet/column-utilities.js +10 -0
  341. package/dist/esm/spreadsheet/column-utilities.js.map +1 -0
  342. package/dist/esm/spreadsheet/csv-streaming.d.ts +19 -0
  343. package/dist/esm/spreadsheet/csv-streaming.js +43 -0
  344. package/dist/esm/spreadsheet/csv-streaming.js.map +1 -0
  345. package/dist/esm/spreadsheet/data-operations.d.ts +115 -0
  346. package/dist/esm/spreadsheet/data-operations.js +712 -0
  347. package/dist/esm/spreadsheet/data-operations.js.map +1 -0
  348. package/dist/esm/spreadsheet/deduplication-utils.d.ts +31 -0
  349. package/dist/esm/spreadsheet/deduplication-utils.js +54 -0
  350. package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -0
  351. package/dist/esm/spreadsheet/range-operations.d.ts +184 -0
  352. package/dist/esm/spreadsheet/range-operations.js +591 -0
  353. package/dist/esm/spreadsheet/range-operations.js.map +1 -0
  354. package/dist/esm/spreadsheet/sheet-operations.d.ts +30 -0
  355. package/dist/esm/spreadsheet/sheet-operations.js +359 -0
  356. package/dist/esm/spreadsheet/sheet-operations.js.map +1 -0
  357. package/dist/esm/spreadsheet/spreadsheet-management.d.ts +21 -0
  358. package/dist/esm/spreadsheet/spreadsheet-management.js +73 -0
  359. package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -0
  360. package/dist/esm/types.d.ts +53 -0
  361. package/dist/esm/types.js +1 -0
  362. package/dist/esm/types.js.map +1 -0
  363. package/package.json +108 -0
@@ -0,0 +1,202 @@
1
+ /** Import CSV data to Google Sheets with range-based update (no deduplication) */ import { schemas } from '@mcp-z/oauth-google';
2
+ const { AuthRequiredBranchSchema } = schemas;
3
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
4
+ import { parse } from 'csv-parse';
5
+ import { google } from 'googleapis';
6
+ import { z } from 'zod';
7
+ import { A1NotationSchema, SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';
8
+ import { getCsvReadStream } from '../../spreadsheet/csv-streaming.js';
9
+ /** Batch size for Sheets API calls (1000 rows × avg 10 cols = 10K cells, well under 40K limit) */ const BATCH_SIZE = 1000;
10
+ const inputSchema = z.object({
11
+ id: SpreadsheetIdSchema,
12
+ gid: SheetGidSchema,
13
+ sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),
14
+ startRange: A1NotationSchema.default('A1').describe('Top-left cell where CSV data starts (default: A1)'),
15
+ valueInputOption: z.enum([
16
+ 'RAW',
17
+ 'USER_ENTERED'
18
+ ]).default('USER_ENTERED').describe('How to interpret values (RAW = exact, USER_ENTERED = parse formulas/dates)'),
19
+ sourceHasHeaders: z.boolean().default(true).describe('First row is headers (metadata) - exclude from data range. Set to false to include first row as data.')
20
+ });
21
+ const successBranchSchema = z.object({
22
+ type: z.literal('success'),
23
+ id: SpreadsheetIdOutput,
24
+ gid: SheetGidOutput,
25
+ spreadsheetTitle: z.string().describe('Spreadsheet title'),
26
+ spreadsheetUrl: z.string().describe('Spreadsheet URL'),
27
+ sheetTitle: z.string().describe('Sheet title'),
28
+ sheetUrl: z.string().describe('Sheet URL'),
29
+ updatedRange: z.string().describe('A1 notation range that was updated'),
30
+ updatedRows: z.number().describe('Number of rows updated'),
31
+ updatedColumns: z.number().describe('Number of columns updated'),
32
+ updatedCells: z.number().describe('Number of cells updated')
33
+ });
34
+ const outputSchema = z.discriminatedUnion('type', [
35
+ successBranchSchema,
36
+ AuthRequiredBranchSchema
37
+ ]);
38
+ const config = {
39
+ description: 'Import CSV to sheet range. Overwrites existing data at startRange. Use rows-csv-append for database-style appends with deduplication.',
40
+ inputSchema,
41
+ outputSchema: z.object({
42
+ result: outputSchema
43
+ })
44
+ };
45
+ async function handler({ id, gid, sourceUri, startRange, valueInputOption = 'USER_ENTERED', sourceHasHeaders }, extra) {
46
+ const logger = extra.logger;
47
+ logger.info('sheets.values.csv-update called', {
48
+ id,
49
+ gid,
50
+ sourceUri,
51
+ startRange,
52
+ valueInputOption,
53
+ sourceHasHeaders
54
+ });
55
+ try {
56
+ var _sheet_properties_title, _sheet_properties_sheetId, _ref, _spreadsheetData_spreadsheetUrl;
57
+ var _spreadsheetData_sheets, _startRange_match, _batchUpdateResponse_data_responses_, _batchUpdateResponse_data_responses, _spreadsheetData_properties;
58
+ const sheets = google.sheets({
59
+ version: 'v4',
60
+ auth: extra.authContext.auth
61
+ });
62
+ // Get spreadsheet and sheet info in single API call
63
+ const spreadsheetResponse = await sheets.spreadsheets.get({
64
+ spreadsheetId: id,
65
+ fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title'
66
+ });
67
+ const spreadsheetData = spreadsheetResponse.data;
68
+ // Find the sheet by gid
69
+ const sheet = (_spreadsheetData_sheets = spreadsheetData.sheets) === null || _spreadsheetData_sheets === void 0 ? void 0 : _spreadsheetData_sheets.find((s)=>{
70
+ var _s_properties;
71
+ return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
72
+ });
73
+ if (!(sheet === null || sheet === void 0 ? void 0 : sheet.properties)) {
74
+ throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);
75
+ }
76
+ const sheetTitle = (_sheet_properties_title = sheet.properties.title) !== null && _sheet_properties_title !== void 0 ? _sheet_properties_title : '';
77
+ // Streaming CSV processing state
78
+ let sourceHeaders = [];
79
+ const allRows = [];
80
+ let totalCols = 0;
81
+ // Get readable stream from CSV URI (no temp files!)
82
+ const readStream = await getCsvReadStream(sourceUri);
83
+ // Create CSV parser with native streaming
84
+ const parser = readStream.pipe(parse({
85
+ columns: !!sourceHasHeaders,
86
+ skip_empty_lines: true,
87
+ trim: true,
88
+ cast: true,
89
+ relax_column_count: true
90
+ }));
91
+ // Stream and collect all rows (with batching for very large files)
92
+ for await (const record of parser){
93
+ if (sourceHasHeaders) {
94
+ // Extract source headers from first record
95
+ if (sourceHeaders.length === 0) {
96
+ sourceHeaders = Object.keys(record);
97
+ totalCols = sourceHeaders.length;
98
+ logger.info('sheets.values.csv-update source headers', {
99
+ sourceHeaders,
100
+ totalCols
101
+ });
102
+ }
103
+ // Convert record to row array (exclude source headers from data range)
104
+ // CSV values are strings/numbers/booleans/nulls from the parser
105
+ const row = sourceHeaders.map((header)=>{
106
+ var _record_header;
107
+ return (_record_header = record[header]) !== null && _record_header !== void 0 ? _record_header : null;
108
+ });
109
+ allRows.push(row);
110
+ } else {
111
+ // sourceHasHeaders=false: record is an array, include all rows (including first row)
112
+ const row = record;
113
+ allRows.push(row);
114
+ if (totalCols === 0) {
115
+ totalCols = row.length;
116
+ }
117
+ }
118
+ }
119
+ if (allRows.length === 0) {
120
+ throw new McpError(ErrorCode.InvalidParams, 'CSV file is empty');
121
+ }
122
+ // Prepare data for update (all rows)
123
+ const dataToWrite = allRows;
124
+ // For large datasets, use batchUpdate to write in chunks
125
+ // This respects the 40K cell limit per request
126
+ const batchRequests = [];
127
+ const currentRow = ((_startRange_match = startRange.match(/[A-Z]+(\d+)/)) === null || _startRange_match === void 0 ? void 0 : _startRange_match[1]) || '1';
128
+ let currentRowNum = Number.parseInt(currentRow, 10);
129
+ for(let i = 0; i < dataToWrite.length; i += BATCH_SIZE){
130
+ var _startRange_match1;
131
+ const batchData = dataToWrite.slice(i, i + BATCH_SIZE);
132
+ const batchRange = `${sheetTitle}!${(_startRange_match1 = startRange.match(/[A-Z]+/)) === null || _startRange_match1 === void 0 ? void 0 : _startRange_match1[0]}${currentRowNum}`;
133
+ batchRequests.push({
134
+ range: batchRange,
135
+ values: batchData
136
+ });
137
+ currentRowNum += batchData.length;
138
+ }
139
+ logger.info('sheets.values.csv-update batching', {
140
+ totalBatches: batchRequests.length,
141
+ batchSize: BATCH_SIZE
142
+ });
143
+ // Execute batch update
144
+ const batchUpdateResponse = await sheets.spreadsheets.values.batchUpdate({
145
+ spreadsheetId: id,
146
+ requestBody: {
147
+ valueInputOption,
148
+ data: batchRequests
149
+ }
150
+ });
151
+ const totalUpdatedCells = batchUpdateResponse.data.totalUpdatedCells || 0;
152
+ const totalUpdatedRows = batchUpdateResponse.data.totalUpdatedRows || 0;
153
+ const totalUpdatedColumns = batchUpdateResponse.data.totalUpdatedColumns || 0;
154
+ const firstUpdatedRange = ((_batchUpdateResponse_data_responses = batchUpdateResponse.data.responses) === null || _batchUpdateResponse_data_responses === void 0 ? void 0 : (_batchUpdateResponse_data_responses_ = _batchUpdateResponse_data_responses[0]) === null || _batchUpdateResponse_data_responses_ === void 0 ? void 0 : _batchUpdateResponse_data_responses_.updatedRange) || `${sheetTitle}!${startRange}`;
155
+ logger.info('sheets.values.csv-update completed', {
156
+ id,
157
+ gid: sheet.properties.sheetId,
158
+ updatedRange: firstUpdatedRange,
159
+ updatedRows: totalUpdatedRows,
160
+ sourceUri
161
+ });
162
+ const result = {
163
+ type: 'success',
164
+ id,
165
+ gid: String((_sheet_properties_sheetId = sheet.properties.sheetId) !== null && _sheet_properties_sheetId !== void 0 ? _sheet_properties_sheetId : ''),
166
+ spreadsheetTitle: (_ref = (_spreadsheetData_properties = spreadsheetData.properties) === null || _spreadsheetData_properties === void 0 ? void 0 : _spreadsheetData_properties.title) !== null && _ref !== void 0 ? _ref : '',
167
+ spreadsheetUrl: (_spreadsheetData_spreadsheetUrl = spreadsheetData.spreadsheetUrl) !== null && _spreadsheetData_spreadsheetUrl !== void 0 ? _spreadsheetData_spreadsheetUrl : `https://docs.google.com/spreadsheets/d/${id}`,
168
+ sheetTitle,
169
+ sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheet.properties.sheetId}`,
170
+ updatedRange: firstUpdatedRange,
171
+ updatedRows: totalUpdatedRows,
172
+ updatedColumns: totalUpdatedColumns,
173
+ updatedCells: totalUpdatedCells
174
+ };
175
+ return {
176
+ content: [
177
+ {
178
+ type: 'text',
179
+ text: JSON.stringify(result)
180
+ }
181
+ ],
182
+ structuredContent: {
183
+ result
184
+ }
185
+ };
186
+ } catch (error) {
187
+ const message = error instanceof Error ? error.message : String(error);
188
+ logger.error('sheets.values.csv-update error', {
189
+ error: message
190
+ });
191
+ throw new McpError(ErrorCode.InternalError, `Error updating values from CSV: ${message}`, {
192
+ stack: error instanceof Error ? error.stack : undefined
193
+ });
194
+ }
195
+ }
196
+ export default function createTool() {
197
+ return {
198
+ name: 'values-csv-update',
199
+ config,
200
+ handler
201
+ };
202
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/values-csv-update.ts"],"sourcesContent":["/** Import CSV data to Google Sheets with range-based update (no deduplication) */\n\nimport 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 type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { parse } from 'csv-parse';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { A1NotationSchema, SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.js';\n\n/** Batch size for Sheets API calls (1000 rows × avg 10 cols = 10K cells, well under 40K limit) */\nconst BATCH_SIZE = 1000;\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),\n startRange: A1NotationSchema.default('A1').describe('Top-left cell where CSV data starts (default: A1)'),\n valueInputOption: z.enum(['RAW', 'USER_ENTERED']).default('USER_ENTERED').describe('How to interpret values (RAW = exact, USER_ENTERED = parse formulas/dates)'),\n sourceHasHeaders: z.boolean().default(true).describe('First row is headers (metadata) - exclude from data range. Set to false to include first row as data.'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n spreadsheetTitle: z.string().describe('Spreadsheet title'),\n spreadsheetUrl: z.string().describe('Spreadsheet URL'),\n sheetTitle: z.string().describe('Sheet title'),\n sheetUrl: z.string().describe('Sheet URL'),\n updatedRange: z.string().describe('A1 notation range that was updated'),\n updatedRows: z.number().describe('Number of rows updated'),\n updatedColumns: z.number().describe('Number of columns updated'),\n updatedCells: z.number().describe('Number of cells updated'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Import CSV to sheet range. Overwrites existing data at startRange. Use rows-csv-append for database-style appends with deduplication.',\n 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, gid, sourceUri, startRange, valueInputOption = 'USER_ENTERED', sourceHasHeaders }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.values.csv-update called', { id, gid, sourceUri, startRange, valueInputOption, sourceHasHeaders });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get spreadsheet and sheet info in single API call\n const spreadsheetResponse = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title',\n });\n\n const spreadsheetData = spreadsheetResponse.data;\n\n // Find the sheet by gid\n const sheet = spreadsheetData.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? '';\n\n // Streaming CSV processing state\n let sourceHeaders: string[] = [];\n const allRows: (string | number | boolean | null)[][] = [];\n let totalCols = 0;\n\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser with native streaming\n const parser = readStream.pipe(\n parse({\n columns: !!sourceHasHeaders, // Parse first row as column names if source has headers\n skip_empty_lines: true,\n trim: true,\n cast: true, // Auto-convert numbers/booleans\n relax_column_count: true,\n })\n );\n\n // Stream and collect all rows (with batching for very large files)\n for await (const record of parser) {\n if (sourceHasHeaders) {\n // Extract source headers from first record\n if (sourceHeaders.length === 0) {\n sourceHeaders = Object.keys(record as Record<string, unknown>);\n totalCols = sourceHeaders.length;\n logger.info('sheets.values.csv-update source headers', { sourceHeaders, totalCols });\n }\n\n // Convert record to row array (exclude source headers from data range)\n // CSV values are strings/numbers/booleans/nulls from the parser\n const row = sourceHeaders.map((header) => (record as Record<string, string | number | boolean | null>)[header] ?? null);\n allRows.push(row);\n } else {\n // sourceHasHeaders=false: record is an array, include all rows (including first row)\n const row = record as (string | number | boolean | null)[];\n allRows.push(row);\n\n if (totalCols === 0) {\n totalCols = row.length;\n }\n }\n }\n\n if (allRows.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'CSV file is empty');\n }\n\n // Prepare data for update (all rows)\n const dataToWrite: (string | number | boolean | null)[][] = allRows;\n\n // For large datasets, use batchUpdate to write in chunks\n // This respects the 40K cell limit per request\n const batchRequests = [];\n const currentRow = startRange.match(/[A-Z]+(\\d+)/)?.[1] || '1';\n let currentRowNum = Number.parseInt(currentRow, 10);\n\n for (let i = 0; i < dataToWrite.length; i += BATCH_SIZE) {\n const batchData = dataToWrite.slice(i, i + BATCH_SIZE);\n const batchRange = `${sheetTitle}!${startRange.match(/[A-Z]+/)?.[0]}${currentRowNum}`;\n\n batchRequests.push({\n range: batchRange,\n values: batchData,\n });\n\n currentRowNum += batchData.length;\n }\n\n logger.info('sheets.values.csv-update batching', { totalBatches: batchRequests.length, batchSize: BATCH_SIZE });\n\n // Execute batch update\n const batchUpdateResponse = await sheets.spreadsheets.values.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n valueInputOption,\n data: batchRequests,\n },\n });\n\n const totalUpdatedCells = batchUpdateResponse.data.totalUpdatedCells || 0;\n const totalUpdatedRows = batchUpdateResponse.data.totalUpdatedRows || 0;\n const totalUpdatedColumns = batchUpdateResponse.data.totalUpdatedColumns || 0;\n const firstUpdatedRange = batchUpdateResponse.data.responses?.[0]?.updatedRange || `${sheetTitle}!${startRange}`;\n\n logger.info('sheets.values.csv-update completed', { id, gid: sheet.properties.sheetId, updatedRange: firstUpdatedRange, updatedRows: totalUpdatedRows, sourceUri });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheet.properties.sheetId ?? ''),\n spreadsheetTitle: spreadsheetData.properties?.title ?? '',\n spreadsheetUrl: spreadsheetData.spreadsheetUrl ?? `https://docs.google.com/spreadsheets/d/${id}`,\n sheetTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheet.properties.sheetId}`,\n updatedRange: firstUpdatedRange,\n updatedRows: totalUpdatedRows,\n updatedColumns: totalUpdatedColumns,\n updatedCells: totalUpdatedCells,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.values.csv-update error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error updating values from CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'values-csv-update',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","parse","google","z","A1NotationSchema","SheetGidOutput","SheetGidSchema","SpreadsheetIdOutput","SpreadsheetIdSchema","getCsvReadStream","BATCH_SIZE","inputSchema","object","id","gid","sourceUri","string","trim","min","describe","startRange","default","valueInputOption","enum","sourceHasHeaders","boolean","successBranchSchema","type","literal","spreadsheetTitle","spreadsheetUrl","sheetTitle","sheetUrl","updatedRange","updatedRows","number","updatedColumns","updatedCells","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","sheet","spreadsheetData","batchUpdateResponse","sheets","version","auth","authContext","spreadsheetResponse","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","InvalidParams","title","sourceHeaders","allRows","totalCols","readStream","parser","pipe","columns","skip_empty_lines","cast","relax_column_count","record","length","Object","keys","row","map","header","push","dataToWrite","batchRequests","currentRow","match","currentRowNum","Number","parseInt","i","batchData","slice","batchRange","range","values","totalBatches","batchSize","batchUpdate","requestBody","totalUpdatedCells","totalUpdatedRows","totalUpdatedColumns","firstUpdatedRange","responses","content","text","JSON","stringify","structuredContent","error","message","Error","InternalError","stack","undefined","createTool","name"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ find: z.ZodString;
7
+ replacement: z.ZodString;
8
+ gid: z.ZodOptional<z.ZodCoercedString<unknown>>;
9
+ range: z.ZodOptional<z.ZodString>;
10
+ matchCase: z.ZodOptional<z.ZodBoolean>;
11
+ matchEntireCell: z.ZodOptional<z.ZodBoolean>;
12
+ searchByRegex: z.ZodOptional<z.ZodBoolean>;
13
+ includeFormulas: z.ZodOptional<z.ZodBoolean>;
14
+ }, z.core.$strip>;
15
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
16
+ type: z.ZodLiteral<"success">;
17
+ id: z.ZodString;
18
+ spreadsheetUrl: z.ZodString;
19
+ occurrencesChanged: z.ZodNumber;
20
+ valuesChanged: z.ZodNumber;
21
+ formulasChanged: z.ZodNumber;
22
+ rowsChanged: z.ZodNumber;
23
+ sheetsChanged: z.ZodNumber;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ type: z.ZodLiteral<"auth_required">;
26
+ provider: z.ZodString;
27
+ message: z.ZodString;
28
+ url: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>], "type">;
30
+ export type Input = z.infer<typeof inputSchema>;
31
+ export type Output = z.infer<typeof outputSchema>;
32
+ declare function handler({ id, find, replacement, gid, range, matchCase, matchEntireCell, searchByRegex, includeFormulas }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
33
+ export default function createTool(): {
34
+ name: string;
35
+ config: {
36
+ readonly description: "Find and replace text across a spreadsheet. Searches all sheets by default, or limit with gid/range. Supports regex with capture groups ($1, $2).";
37
+ readonly inputSchema: z.ZodObject<{
38
+ id: z.ZodString;
39
+ find: z.ZodString;
40
+ replacement: z.ZodString;
41
+ gid: z.ZodOptional<z.ZodCoercedString<unknown>>;
42
+ range: z.ZodOptional<z.ZodString>;
43
+ matchCase: z.ZodOptional<z.ZodBoolean>;
44
+ matchEntireCell: z.ZodOptional<z.ZodBoolean>;
45
+ searchByRegex: z.ZodOptional<z.ZodBoolean>;
46
+ includeFormulas: z.ZodOptional<z.ZodBoolean>;
47
+ }, z.core.$strip>;
48
+ readonly outputSchema: z.ZodObject<{
49
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
50
+ type: z.ZodLiteral<"success">;
51
+ id: z.ZodString;
52
+ spreadsheetUrl: z.ZodString;
53
+ occurrencesChanged: z.ZodNumber;
54
+ valuesChanged: z.ZodNumber;
55
+ formulasChanged: z.ZodNumber;
56
+ rowsChanged: z.ZodNumber;
57
+ sheetsChanged: z.ZodNumber;
58
+ }, z.core.$strip>, z.ZodObject<{
59
+ type: z.ZodLiteral<"auth_required">;
60
+ provider: z.ZodString;
61
+ message: z.ZodString;
62
+ url: z.ZodOptional<z.ZodString>;
63
+ }, z.core.$strip>], "type">;
64
+ }, z.core.$strip>;
65
+ };
66
+ handler: typeof handler;
67
+ };
68
+ export {};
@@ -0,0 +1,171 @@
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 { A1NotationSchema, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';
7
+ import { parseA1Notation, rangeReferenceToGridRange } from '../../spreadsheet/range-operations.js';
8
+ const inputSchema = z.object({
9
+ id: SpreadsheetIdSchema,
10
+ find: z.string().min(1).describe('Text or regex pattern to find'),
11
+ replacement: z.string().describe('Replacement text. Use $1, $2 for regex capture groups. Empty string deletes matches.'),
12
+ // Scope - defaults to all sheets if neither specified
13
+ gid: SheetGidSchema.optional().describe('Limit to specific sheet. If omitted, searches all sheets.'),
14
+ range: A1NotationSchema.optional().describe('Limit to specific A1 range within the sheet (requires gid)'),
15
+ // Match options
16
+ matchCase: z.boolean().optional().describe('Case-sensitive matching'),
17
+ matchEntireCell: z.boolean().optional().describe('Only match entire cell content'),
18
+ searchByRegex: z.boolean().optional().describe('Treat find as RE2 regex'),
19
+ includeFormulas: z.boolean().optional().describe('Search within formula text')
20
+ }).refine((data)=>!(data.range && !data.gid), {
21
+ message: 'range requires gid'
22
+ });
23
+ const successBranchSchema = z.object({
24
+ type: z.literal('success'),
25
+ id: SpreadsheetIdOutput,
26
+ spreadsheetUrl: z.string().describe('URL of the spreadsheet'),
27
+ occurrencesChanged: z.number().int().nonnegative().describe('Total replacements made'),
28
+ valuesChanged: z.number().int().nonnegative().describe('Number of non-formula cells changed'),
29
+ formulasChanged: z.number().int().nonnegative().describe('Number of formula cells changed'),
30
+ rowsChanged: z.number().int().nonnegative().describe('Number of rows with replacements'),
31
+ sheetsChanged: z.number().int().nonnegative().describe('Number of sheets with replacements')
32
+ });
33
+ const outputSchema = z.discriminatedUnion('type', [
34
+ successBranchSchema,
35
+ AuthRequiredBranchSchema
36
+ ]);
37
+ const config = {
38
+ description: 'Find and replace text across a spreadsheet. Searches all sheets by default, or limit with gid/range. Supports regex with capture groups ($1, $2).',
39
+ inputSchema,
40
+ outputSchema: z.object({
41
+ result: outputSchema
42
+ })
43
+ };
44
+ async function handler({ id, find, replacement, gid, range, matchCase, matchEntireCell, searchByRegex, includeFormulas }, extra) {
45
+ const logger = extra.logger;
46
+ logger.info('sheets.values-replace called', {
47
+ id,
48
+ find,
49
+ replacement,
50
+ gid,
51
+ range
52
+ });
53
+ try {
54
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
55
+ var _response_data_replies_, _response_data_replies;
56
+ const sheets = google.sheets({
57
+ version: 'v4',
58
+ auth: extra.authContext.auth
59
+ });
60
+ // Build FindReplaceRequest - only include defined options
61
+ const findReplaceRequest = {
62
+ find,
63
+ replacement,
64
+ ...matchCase !== undefined && {
65
+ matchCase
66
+ },
67
+ ...matchEntireCell !== undefined && {
68
+ matchEntireCell
69
+ },
70
+ ...searchByRegex !== undefined && {
71
+ searchByRegex
72
+ },
73
+ ...includeFormulas !== undefined && {
74
+ includeFormulas
75
+ }
76
+ };
77
+ // Set scope based on gid/range
78
+ if (!gid) {
79
+ // No gid = search all sheets
80
+ findReplaceRequest.allSheets = true;
81
+ } else {
82
+ var _spreadsheetResponse_data_sheets, _sheet_properties;
83
+ // Need to resolve sheet to get numeric sheetId
84
+ const spreadsheetResponse = await sheets.spreadsheets.get({
85
+ spreadsheetId: id,
86
+ fields: 'sheets.properties.sheetId,sheets.properties.title'
87
+ });
88
+ const sheet = (_spreadsheetResponse_data_sheets = spreadsheetResponse.data.sheets) === null || _spreadsheetResponse_data_sheets === void 0 ? void 0 : _spreadsheetResponse_data_sheets.find((s)=>{
89
+ var _s_properties;
90
+ return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
91
+ });
92
+ if (!sheet) {
93
+ throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);
94
+ }
95
+ // Note: sheetId can be 0 which is falsy, so check explicitly for undefined/null
96
+ const sheetId = (_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.sheetId;
97
+ if (sheetId === undefined || sheetId === null) {
98
+ throw new McpError(ErrorCode.InternalError, 'Sheet properties not available');
99
+ }
100
+ if (!range) {
101
+ // gid but no range = search specific sheet
102
+ findReplaceRequest.sheetId = sheetId;
103
+ } else {
104
+ // gid + range = search specific range
105
+ const rangeRef = parseA1Notation(range);
106
+ findReplaceRequest.range = rangeReferenceToGridRange(rangeRef, sheetId);
107
+ }
108
+ }
109
+ // Execute batchUpdate
110
+ const response = await sheets.spreadsheets.batchUpdate({
111
+ spreadsheetId: id,
112
+ requestBody: {
113
+ requests: [
114
+ {
115
+ findReplace: findReplaceRequest
116
+ }
117
+ ]
118
+ }
119
+ });
120
+ const findReplaceResponse = (_response_data_replies = response.data.replies) === null || _response_data_replies === void 0 ? void 0 : (_response_data_replies_ = _response_data_replies[0]) === null || _response_data_replies_ === void 0 ? void 0 : _response_data_replies_.findReplace;
121
+ const spreadsheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit`;
122
+ logger.info('sheets.values-replace completed', {
123
+ occurrencesChanged: (_ref = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.occurrencesChanged) !== null && _ref !== void 0 ? _ref : 0,
124
+ sheetsChanged: (_ref1 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.sheetsChanged) !== null && _ref1 !== void 0 ? _ref1 : 0
125
+ });
126
+ const result = {
127
+ type: 'success',
128
+ id,
129
+ spreadsheetUrl,
130
+ occurrencesChanged: (_ref2 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.occurrencesChanged) !== null && _ref2 !== void 0 ? _ref2 : 0,
131
+ valuesChanged: (_ref3 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.valuesChanged) !== null && _ref3 !== void 0 ? _ref3 : 0,
132
+ formulasChanged: (_ref4 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.formulasChanged) !== null && _ref4 !== void 0 ? _ref4 : 0,
133
+ rowsChanged: (_ref5 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.rowsChanged) !== null && _ref5 !== void 0 ? _ref5 : 0,
134
+ sheetsChanged: (_ref6 = findReplaceResponse === null || findReplaceResponse === void 0 ? void 0 : findReplaceResponse.sheetsChanged) !== null && _ref6 !== void 0 ? _ref6 : 0
135
+ };
136
+ return {
137
+ content: [
138
+ {
139
+ type: 'text',
140
+ text: JSON.stringify(result)
141
+ }
142
+ ],
143
+ structuredContent: {
144
+ result
145
+ }
146
+ };
147
+ } catch (error) {
148
+ if (error instanceof McpError) {
149
+ throw error;
150
+ }
151
+ const message = error instanceof Error ? error.message : String(error);
152
+ logger.error('Replace operation failed', {
153
+ id,
154
+ find,
155
+ replacement,
156
+ gid,
157
+ range,
158
+ error: message
159
+ });
160
+ throw new McpError(ErrorCode.InternalError, `Error replacing values: ${message}`, {
161
+ stack: error instanceof Error ? error.stack : undefined
162
+ });
163
+ }
164
+ }
165
+ export default function createTool() {
166
+ return {
167
+ name: 'values-replace',
168
+ config,
169
+ handler
170
+ };
171
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/values-replace.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 type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google, type sheets_v4 } from 'googleapis';\nimport { z } from 'zod';\nimport { A1NotationSchema, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';\nimport { parseA1Notation, rangeReferenceToGridRange } from '../../spreadsheet/range-operations.js';\n\nconst inputSchema = z\n .object({\n id: SpreadsheetIdSchema,\n find: z.string().min(1).describe('Text or regex pattern to find'),\n replacement: z.string().describe('Replacement text. Use $1, $2 for regex capture groups. Empty string deletes matches.'),\n\n // Scope - defaults to all sheets if neither specified\n gid: SheetGidSchema.optional().describe('Limit to specific sheet. If omitted, searches all sheets.'),\n range: A1NotationSchema.optional().describe('Limit to specific A1 range within the sheet (requires gid)'),\n\n // Match options\n matchCase: z.boolean().optional().describe('Case-sensitive matching'),\n matchEntireCell: z.boolean().optional().describe('Only match entire cell content'),\n searchByRegex: z.boolean().optional().describe('Treat find as RE2 regex'),\n includeFormulas: z.boolean().optional().describe('Search within formula text'),\n })\n .refine((data) => !(data.range && !data.gid), { message: 'range requires gid' });\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n spreadsheetUrl: z.string().describe('URL of the spreadsheet'),\n occurrencesChanged: z.number().int().nonnegative().describe('Total replacements made'),\n valuesChanged: z.number().int().nonnegative().describe('Number of non-formula cells changed'),\n formulasChanged: z.number().int().nonnegative().describe('Number of formula cells changed'),\n rowsChanged: z.number().int().nonnegative().describe('Number of rows with replacements'),\n sheetsChanged: z.number().int().nonnegative().describe('Number of sheets with replacements'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Find and replace text across a spreadsheet. Searches all sheets by default, or limit with gid/range. Supports regex with capture groups ($1, $2).',\n 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, find, replacement, gid, range, matchCase, matchEntireCell, searchByRegex, includeFormulas }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.values-replace called', { id, find, replacement, gid, range });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Build FindReplaceRequest - only include defined options\n const findReplaceRequest: sheets_v4.Schema$FindReplaceRequest = {\n find,\n replacement,\n ...(matchCase !== undefined && { matchCase }),\n ...(matchEntireCell !== undefined && { matchEntireCell }),\n ...(searchByRegex !== undefined && { searchByRegex }),\n ...(includeFormulas !== undefined && { includeFormulas }),\n };\n\n // Set scope based on gid/range\n if (!gid) {\n // No gid = search all sheets\n findReplaceRequest.allSheets = true;\n } else {\n // Need to resolve sheet to get numeric sheetId\n const spreadsheetResponse = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n const sheet = spreadsheetResponse.data.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet) {\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n // Note: sheetId can be 0 which is falsy, so check explicitly for undefined/null\n const sheetId = sheet.properties?.sheetId;\n if (sheetId === undefined || sheetId === null) {\n throw new McpError(ErrorCode.InternalError, 'Sheet properties not available');\n }\n\n if (!range) {\n // gid but no range = search specific sheet\n findReplaceRequest.sheetId = sheetId;\n } else {\n // gid + range = search specific range\n const rangeRef = parseA1Notation(range);\n findReplaceRequest.range = rangeReferenceToGridRange(rangeRef, sheetId);\n }\n }\n\n // Execute batchUpdate\n const response = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: [{ findReplace: findReplaceRequest }],\n },\n });\n\n const findReplaceResponse = response.data.replies?.[0]?.findReplace;\n const spreadsheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit`;\n\n logger.info('sheets.values-replace completed', {\n occurrencesChanged: findReplaceResponse?.occurrencesChanged ?? 0,\n sheetsChanged: findReplaceResponse?.sheetsChanged ?? 0,\n });\n\n const result: Output = {\n type: 'success' as const,\n id,\n spreadsheetUrl,\n occurrencesChanged: findReplaceResponse?.occurrencesChanged ?? 0,\n valuesChanged: findReplaceResponse?.valuesChanged ?? 0,\n formulasChanged: findReplaceResponse?.formulasChanged ?? 0,\n rowsChanged: findReplaceResponse?.rowsChanged ?? 0,\n sheetsChanged: findReplaceResponse?.sheetsChanged ?? 0,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n if (error instanceof McpError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Replace operation failed', {\n id,\n find,\n replacement,\n gid,\n range,\n error: message,\n });\n\n throw new McpError(ErrorCode.InternalError, `Error replacing values: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'values-replace',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","A1NotationSchema","SheetGidSchema","SpreadsheetIdOutput","SpreadsheetIdSchema","parseA1Notation","rangeReferenceToGridRange","inputSchema","object","id","find","string","min","describe","replacement","gid","optional","range","matchCase","boolean","matchEntireCell","searchByRegex","includeFormulas","refine","data","message","successBranchSchema","type","literal","spreadsheetUrl","occurrencesChanged","number","int","nonnegative","valuesChanged","formulasChanged","rowsChanged","sheetsChanged","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","response","sheets","version","auth","authContext","findReplaceRequest","undefined","allSheets","spreadsheetResponse","sheet","spreadsheets","get","spreadsheetId","fields","s","String","properties","sheetId","InvalidParams","InternalError","rangeRef","batchUpdate","requestBody","requests","findReplace","findReplaceResponse","replies","content","text","JSON","stringify","structuredContent","error","Error","stack","createTool","name"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ gid: z.ZodCoercedString<unknown>;
7
+ query: z.ZodOptional<z.ZodCoercedString<unknown>>;
8
+ select: z.ZodEnum<{
9
+ columns: "columns";
10
+ rows: "rows";
11
+ cells: "cells";
12
+ }>;
13
+ values: z.ZodOptional<z.ZodBoolean>;
14
+ a1s: z.ZodOptional<z.ZodBoolean>;
15
+ render: z.ZodOptional<z.ZodEnum<{
16
+ FORMATTED_VALUE: "FORMATTED_VALUE";
17
+ UNFORMATTED_VALUE: "UNFORMATTED_VALUE";
18
+ FORMULA: "FORMULA";
19
+ }>>;
20
+ matchCase: z.ZodOptional<z.ZodBoolean>;
21
+ }, z.core.$strip>;
22
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
23
+ type: z.ZodLiteral<"success">;
24
+ count: z.ZodNumber;
25
+ a1s: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ values: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodLiteral<number>, z.ZodLiteral<number>, z.ZodBoolean, z.ZodNull]>>, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodLiteral<number>, z.ZodLiteral<number>, z.ZodBoolean, z.ZodNull]>]>>>;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ type: z.ZodLiteral<"auth_required">;
29
+ provider: z.ZodString;
30
+ message: z.ZodString;
31
+ url: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>], "type">;
33
+ export type Input = z.infer<typeof inputSchema>;
34
+ export type Output = z.infer<typeof outputSchema>;
35
+ declare function handler({ id, gid, query, select, values, a1s, render, matchCase }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
36
+ export default function createTool(): {
37
+ name: string;
38
+ config: {
39
+ readonly description: "Search spreadsheet and return matches at cell, row, or column granularity. Use a1-notation prompt for range syntax.";
40
+ readonly inputSchema: z.ZodObject<{
41
+ id: z.ZodString;
42
+ gid: z.ZodCoercedString<unknown>;
43
+ query: z.ZodOptional<z.ZodCoercedString<unknown>>;
44
+ select: z.ZodEnum<{
45
+ columns: "columns";
46
+ rows: "rows";
47
+ cells: "cells";
48
+ }>;
49
+ values: z.ZodOptional<z.ZodBoolean>;
50
+ a1s: z.ZodOptional<z.ZodBoolean>;
51
+ render: z.ZodOptional<z.ZodEnum<{
52
+ FORMATTED_VALUE: "FORMATTED_VALUE";
53
+ UNFORMATTED_VALUE: "UNFORMATTED_VALUE";
54
+ FORMULA: "FORMULA";
55
+ }>>;
56
+ matchCase: z.ZodOptional<z.ZodBoolean>;
57
+ }, z.core.$strip>;
58
+ readonly outputSchema: z.ZodObject<{
59
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
60
+ type: z.ZodLiteral<"success">;
61
+ count: z.ZodNumber;
62
+ a1s: z.ZodOptional<z.ZodArray<z.ZodString>>;
63
+ values: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodLiteral<number>, z.ZodLiteral<number>, z.ZodBoolean, z.ZodNull]>>, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodLiteral<number>, z.ZodLiteral<number>, z.ZodBoolean, z.ZodNull]>]>>>;
64
+ }, z.core.$strip>, z.ZodObject<{
65
+ type: z.ZodLiteral<"auth_required">;
66
+ provider: z.ZodString;
67
+ message: z.ZodString;
68
+ url: z.ZodOptional<z.ZodString>;
69
+ }, z.core.$strip>], "type">;
70
+ }, z.core.$strip>;
71
+ };
72
+ handler: typeof handler;
73
+ };
74
+ export {};