@mcp-z/mcp-sheets 1.2.2 → 2.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 (217) hide show
  1. package/README.md +5 -1
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/mcp/prompts/a1-notation.d.cts +2 -3
  4. package/dist/cjs/mcp/prompts/a1-notation.d.ts +2 -3
  5. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -1
  6. package/dist/cjs/mcp/resources/spreadsheet.js +2 -2
  7. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -1
  8. package/dist/cjs/mcp/tools/cells-format.d.cts +1 -1
  9. package/dist/cjs/mcp/tools/cells-format.d.ts +1 -1
  10. package/dist/cjs/mcp/tools/cells-format.js +3 -3
  11. package/dist/cjs/mcp/tools/cells-format.js.map +1 -1
  12. package/dist/cjs/mcp/tools/chart-create.d.cts +1 -1
  13. package/dist/cjs/mcp/tools/chart-create.d.ts +1 -1
  14. package/dist/cjs/mcp/tools/chart-create.js +7 -7
  15. package/dist/cjs/mcp/tools/chart-create.js.map +1 -1
  16. package/dist/cjs/mcp/tools/columns-get.d.cts +1 -1
  17. package/dist/cjs/mcp/tools/columns-get.d.ts +1 -1
  18. package/dist/cjs/mcp/tools/columns-get.js +3 -3
  19. package/dist/cjs/mcp/tools/columns-get.js.map +1 -1
  20. package/dist/cjs/mcp/tools/columns-update.d.cts +1 -1
  21. package/dist/cjs/mcp/tools/columns-update.d.ts +1 -1
  22. package/dist/cjs/mcp/tools/columns-update.js +4 -4
  23. package/dist/cjs/mcp/tools/columns-update.js.map +1 -1
  24. package/dist/cjs/mcp/tools/csv-get-columns.d.cts +1 -1
  25. package/dist/cjs/mcp/tools/csv-get-columns.d.ts +1 -1
  26. package/dist/cjs/mcp/tools/csv-get-columns.js +2 -2
  27. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -1
  28. package/dist/cjs/mcp/tools/dimensions-batch-update.d.cts +1 -1
  29. package/dist/cjs/mcp/tools/dimensions-batch-update.d.ts +1 -1
  30. package/dist/cjs/mcp/tools/dimensions-batch-update.js +8 -8
  31. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -1
  32. package/dist/cjs/mcp/tools/dimensions-move.d.cts +1 -1
  33. package/dist/cjs/mcp/tools/dimensions-move.d.ts +1 -1
  34. package/dist/cjs/mcp/tools/dimensions-move.js +6 -6
  35. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -1
  36. package/dist/cjs/mcp/tools/rows-append.d.cts +1 -1
  37. package/dist/cjs/mcp/tools/rows-append.d.ts +1 -1
  38. package/dist/cjs/mcp/tools/rows-append.js +3 -3
  39. package/dist/cjs/mcp/tools/rows-append.js.map +1 -1
  40. package/dist/cjs/mcp/tools/rows-csv-append.d.cts +1 -1
  41. package/dist/cjs/mcp/tools/rows-csv-append.d.ts +1 -1
  42. package/dist/cjs/mcp/tools/rows-csv-append.js +7 -7
  43. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -1
  44. package/dist/cjs/mcp/tools/rows-get.d.cts +1 -1
  45. package/dist/cjs/mcp/tools/rows-get.d.ts +1 -1
  46. package/dist/cjs/mcp/tools/rows-get.js +4 -4
  47. package/dist/cjs/mcp/tools/rows-get.js.map +1 -1
  48. package/dist/cjs/mcp/tools/sheet-copy-to.d.cts +1 -1
  49. package/dist/cjs/mcp/tools/sheet-copy-to.d.ts +1 -1
  50. package/dist/cjs/mcp/tools/sheet-copy-to.js +4 -4
  51. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -1
  52. package/dist/cjs/mcp/tools/sheet-copy.d.cts +1 -1
  53. package/dist/cjs/mcp/tools/sheet-copy.d.ts +1 -1
  54. package/dist/cjs/mcp/tools/sheet-copy.js +4 -4
  55. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -1
  56. package/dist/cjs/mcp/tools/sheet-create.d.cts +1 -1
  57. package/dist/cjs/mcp/tools/sheet-create.d.ts +1 -1
  58. package/dist/cjs/mcp/tools/sheet-create.js +3 -3
  59. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -1
  60. package/dist/cjs/mcp/tools/sheet-delete.d.cts +1 -1
  61. package/dist/cjs/mcp/tools/sheet-delete.d.ts +1 -1
  62. package/dist/cjs/mcp/tools/sheet-delete.js +2 -2
  63. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -1
  64. package/dist/cjs/mcp/tools/sheet-find.d.cts +1 -1
  65. package/dist/cjs/mcp/tools/sheet-find.d.ts +1 -1
  66. package/dist/cjs/mcp/tools/sheet-find.js +3 -3
  67. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -1
  68. package/dist/cjs/mcp/tools/sheet-rename.d.cts +1 -1
  69. package/dist/cjs/mcp/tools/sheet-rename.d.ts +1 -1
  70. package/dist/cjs/mcp/tools/sheet-rename.js +4 -4
  71. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -1
  72. package/dist/cjs/mcp/tools/spreadsheet-copy.d.cts +1 -1
  73. package/dist/cjs/mcp/tools/spreadsheet-copy.d.ts +1 -1
  74. package/dist/cjs/mcp/tools/spreadsheet-copy.js +2 -2
  75. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -1
  76. package/dist/cjs/mcp/tools/spreadsheet-create.d.cts +1 -1
  77. package/dist/cjs/mcp/tools/spreadsheet-create.d.ts +1 -1
  78. package/dist/cjs/mcp/tools/spreadsheet-create.js +3 -3
  79. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -1
  80. package/dist/cjs/mcp/tools/spreadsheet-find.d.cts +1 -1
  81. package/dist/cjs/mcp/tools/spreadsheet-find.d.ts +1 -1
  82. package/dist/cjs/mcp/tools/spreadsheet-find.js +2 -2
  83. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -1
  84. package/dist/cjs/mcp/tools/spreadsheet-rename.d.cts +1 -1
  85. package/dist/cjs/mcp/tools/spreadsheet-rename.d.ts +1 -1
  86. package/dist/cjs/mcp/tools/spreadsheet-rename.js +2 -2
  87. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -1
  88. package/dist/cjs/mcp/tools/validation-set.d.cts +1 -1
  89. package/dist/cjs/mcp/tools/validation-set.d.ts +1 -1
  90. package/dist/cjs/mcp/tools/validation-set.js +4 -4
  91. package/dist/cjs/mcp/tools/validation-set.js.map +1 -1
  92. package/dist/cjs/mcp/tools/values-batch-update.d.cts +1 -1
  93. package/dist/cjs/mcp/tools/values-batch-update.d.ts +1 -1
  94. package/dist/cjs/mcp/tools/values-batch-update.js +5 -5
  95. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -1
  96. package/dist/cjs/mcp/tools/values-clear.d.cts +1 -1
  97. package/dist/cjs/mcp/tools/values-clear.d.ts +1 -1
  98. package/dist/cjs/mcp/tools/values-clear.js +3 -3
  99. package/dist/cjs/mcp/tools/values-clear.js.map +1 -1
  100. package/dist/cjs/mcp/tools/values-csv-update.d.cts +1 -1
  101. package/dist/cjs/mcp/tools/values-csv-update.d.ts +1 -1
  102. package/dist/cjs/mcp/tools/values-csv-update.js +4 -4
  103. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -1
  104. package/dist/cjs/mcp/tools/values-markdown-update.d.cts +1 -1
  105. package/dist/cjs/mcp/tools/values-markdown-update.d.ts +1 -1
  106. package/dist/cjs/mcp/tools/values-markdown-update.js +5 -5
  107. package/dist/cjs/mcp/tools/values-markdown-update.js.map +1 -1
  108. package/dist/cjs/mcp/tools/values-replace.d.cts +1 -1
  109. package/dist/cjs/mcp/tools/values-replace.d.ts +1 -1
  110. package/dist/cjs/mcp/tools/values-replace.js +5 -5
  111. package/dist/cjs/mcp/tools/values-replace.js.map +1 -1
  112. package/dist/cjs/mcp/tools/values-search.d.cts +1 -1
  113. package/dist/cjs/mcp/tools/values-search.d.ts +1 -1
  114. package/dist/cjs/mcp/tools/values-search.js +3 -3
  115. package/dist/cjs/mcp/tools/values-search.js.map +1 -1
  116. package/dist/cjs/setup/http.d.cts +1 -1
  117. package/dist/cjs/setup/http.d.ts +1 -1
  118. package/dist/cjs/setup/http.js +23 -13
  119. package/dist/cjs/setup/http.js.map +1 -1
  120. package/dist/cjs/setup/stdio.d.cts +1 -1
  121. package/dist/cjs/setup/stdio.d.ts +1 -1
  122. package/dist/cjs/setup/stdio.js +1 -2
  123. package/dist/cjs/setup/stdio.js.map +1 -1
  124. package/dist/esm/index.js +1 -1
  125. package/dist/esm/index.js.map +1 -1
  126. package/dist/esm/mcp/prompts/a1-notation.d.ts +2 -3
  127. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -1
  128. package/dist/esm/mcp/resources/spreadsheet.js +1 -1
  129. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -1
  130. package/dist/esm/mcp/tools/cells-format.d.ts +1 -1
  131. package/dist/esm/mcp/tools/cells-format.js +3 -3
  132. package/dist/esm/mcp/tools/cells-format.js.map +1 -1
  133. package/dist/esm/mcp/tools/chart-create.d.ts +1 -1
  134. package/dist/esm/mcp/tools/chart-create.js +7 -7
  135. package/dist/esm/mcp/tools/chart-create.js.map +1 -1
  136. package/dist/esm/mcp/tools/columns-get.d.ts +1 -1
  137. package/dist/esm/mcp/tools/columns-get.js +3 -3
  138. package/dist/esm/mcp/tools/columns-get.js.map +1 -1
  139. package/dist/esm/mcp/tools/columns-update.d.ts +1 -1
  140. package/dist/esm/mcp/tools/columns-update.js +4 -4
  141. package/dist/esm/mcp/tools/columns-update.js.map +1 -1
  142. package/dist/esm/mcp/tools/csv-get-columns.d.ts +1 -1
  143. package/dist/esm/mcp/tools/csv-get-columns.js +2 -2
  144. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -1
  145. package/dist/esm/mcp/tools/dimensions-batch-update.d.ts +1 -1
  146. package/dist/esm/mcp/tools/dimensions-batch-update.js +8 -8
  147. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -1
  148. package/dist/esm/mcp/tools/dimensions-move.d.ts +1 -1
  149. package/dist/esm/mcp/tools/dimensions-move.js +6 -6
  150. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -1
  151. package/dist/esm/mcp/tools/rows-append.d.ts +1 -1
  152. package/dist/esm/mcp/tools/rows-append.js +3 -3
  153. package/dist/esm/mcp/tools/rows-append.js.map +1 -1
  154. package/dist/esm/mcp/tools/rows-csv-append.d.ts +1 -1
  155. package/dist/esm/mcp/tools/rows-csv-append.js +7 -7
  156. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -1
  157. package/dist/esm/mcp/tools/rows-get.d.ts +1 -1
  158. package/dist/esm/mcp/tools/rows-get.js +4 -4
  159. package/dist/esm/mcp/tools/rows-get.js.map +1 -1
  160. package/dist/esm/mcp/tools/sheet-copy-to.d.ts +1 -1
  161. package/dist/esm/mcp/tools/sheet-copy-to.js +4 -4
  162. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -1
  163. package/dist/esm/mcp/tools/sheet-copy.d.ts +1 -1
  164. package/dist/esm/mcp/tools/sheet-copy.js +4 -4
  165. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -1
  166. package/dist/esm/mcp/tools/sheet-create.d.ts +1 -1
  167. package/dist/esm/mcp/tools/sheet-create.js +3 -3
  168. package/dist/esm/mcp/tools/sheet-create.js.map +1 -1
  169. package/dist/esm/mcp/tools/sheet-delete.d.ts +1 -1
  170. package/dist/esm/mcp/tools/sheet-delete.js +2 -2
  171. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -1
  172. package/dist/esm/mcp/tools/sheet-find.d.ts +1 -1
  173. package/dist/esm/mcp/tools/sheet-find.js +3 -3
  174. package/dist/esm/mcp/tools/sheet-find.js.map +1 -1
  175. package/dist/esm/mcp/tools/sheet-rename.d.ts +1 -1
  176. package/dist/esm/mcp/tools/sheet-rename.js +4 -4
  177. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -1
  178. package/dist/esm/mcp/tools/spreadsheet-copy.d.ts +1 -1
  179. package/dist/esm/mcp/tools/spreadsheet-copy.js +2 -2
  180. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -1
  181. package/dist/esm/mcp/tools/spreadsheet-create.d.ts +1 -1
  182. package/dist/esm/mcp/tools/spreadsheet-create.js +3 -3
  183. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -1
  184. package/dist/esm/mcp/tools/spreadsheet-find.d.ts +1 -1
  185. package/dist/esm/mcp/tools/spreadsheet-find.js +2 -2
  186. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -1
  187. package/dist/esm/mcp/tools/spreadsheet-rename.d.ts +1 -1
  188. package/dist/esm/mcp/tools/spreadsheet-rename.js +2 -2
  189. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -1
  190. package/dist/esm/mcp/tools/validation-set.d.ts +1 -1
  191. package/dist/esm/mcp/tools/validation-set.js +4 -4
  192. package/dist/esm/mcp/tools/validation-set.js.map +1 -1
  193. package/dist/esm/mcp/tools/values-batch-update.d.ts +1 -1
  194. package/dist/esm/mcp/tools/values-batch-update.js +5 -5
  195. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -1
  196. package/dist/esm/mcp/tools/values-clear.d.ts +1 -1
  197. package/dist/esm/mcp/tools/values-clear.js +3 -3
  198. package/dist/esm/mcp/tools/values-clear.js.map +1 -1
  199. package/dist/esm/mcp/tools/values-csv-update.d.ts +1 -1
  200. package/dist/esm/mcp/tools/values-csv-update.js +4 -4
  201. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -1
  202. package/dist/esm/mcp/tools/values-markdown-update.d.ts +1 -1
  203. package/dist/esm/mcp/tools/values-markdown-update.js +5 -5
  204. package/dist/esm/mcp/tools/values-markdown-update.js.map +1 -1
  205. package/dist/esm/mcp/tools/values-replace.d.ts +1 -1
  206. package/dist/esm/mcp/tools/values-replace.js +5 -5
  207. package/dist/esm/mcp/tools/values-replace.js.map +1 -1
  208. package/dist/esm/mcp/tools/values-search.d.ts +1 -1
  209. package/dist/esm/mcp/tools/values-search.js +3 -3
  210. package/dist/esm/mcp/tools/values-search.js.map +1 -1
  211. package/dist/esm/setup/http.d.ts +1 -1
  212. package/dist/esm/setup/http.js +21 -11
  213. package/dist/esm/setup/http.js.map +1 -1
  214. package/dist/esm/setup/stdio.d.ts +1 -1
  215. package/dist/esm/setup/stdio.js +1 -2
  216. package/dist/esm/setup/stdio.js.map +1 -1
  217. package/package.json +7 -13
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
12
+ var _server = require("@mcp-z/server");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
15
  var _indexts = require("../../schemas/index.js");
@@ -220,7 +220,7 @@ function handler(_0, _1) {
220
220
  return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
221
221
  });
222
222
  if (!sheet) {
223
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Sheet not found');
223
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Sheet not found');
224
224
  }
225
225
  sheetTitle = (_ref = sheet === null || sheet === void 0 ? void 0 : (_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.title) !== null && _ref !== void 0 ? _ref : '';
226
226
  // Smart header handling and data processing
@@ -310,7 +310,7 @@ function handler(_0, _1) {
310
310
  logger.error('sheets.rows.append error', {
311
311
  error: message
312
312
  });
313
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error appending rows: ".concat(message), {
313
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error appending rows: ".concat(message), {
314
314
  stack: _instanceof(error, Error) ? error.stack : undefined
315
315
  });
316
316
  case 7:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-append.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 } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { appendRows, mapRowsToHeader } from '../../spreadsheet/data-operations.ts';\nimport { ensureTabAndHeaders } from '../../spreadsheet/sheet-operations.ts';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n rows: z\n .array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])).min(1))\n .min(1)\n .describe('Array of rows, where each row is an array of cell values. Use null to skip a cell (preserve existing value), empty string \"\" to clear it.'),\n headers: z.array(z.string()).optional().describe('Column order/names - used for blank sheets or column mapping'),\n deduplicateBy: z.array(z.string()).optional().describe('Column names to use as composite key for deduplication'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Sheet tab name'),\n updatedRows: z.number().describe('Number of rows appended'),\n rowsSkipped: z.number().optional().describe('Number of duplicate rows skipped'),\n sheetUrl: z.string().optional().describe('URL to view the sheet'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add new rows to the bottom of an existing sheet with smart header handling and optional deduplication. BEST FOR: Structured database operations where spreadsheet has headers defining schema and rows represent records.',\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, rows, headers, deduplicateBy }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.append called', { id, gid, rowCount: rows.length, headers, deduplicateBy });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid\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\n if (!sheet) {\n throw new McpError(ErrorCode.InvalidParams, 'Sheet not found');\n }\n\n const sheetTitle = sheet?.properties?.title ?? '';\n\n // Smart header handling and data processing\n let processedRows = rows;\n let currentHeaders: string[] = [];\n let rowsSkipped = 0;\n let existingKeySet: Set<string> = new Set();\n\n if (headers && headers.length > 0) {\n // Use ensureTabAndHeaders to handle header logic\n const headerResult = await ensureTabAndHeaders(sheets, {\n spreadsheetId: id,\n sheetTitle,\n requiredHeader: headers,\n keyColumns: deduplicateBy || [],\n logger,\n });\n\n currentHeaders = headerResult.header;\n existingKeySet = headerResult.keySet;\n\n // Map data rows to match current header order\n processedRows = mapRowsToHeader({ rows, header: currentHeaders, canonical: headers }) as (string | number | boolean | null)[][];\n }\n\n // Append rows with optional deduplication\n // If headers are empty but deduplication is requested, skip deduplication for empty spreadsheets\n const effectiveKeyColumns = currentHeaders.length === 0 && deduplicateBy && deduplicateBy.length > 0 ? [] : deduplicateBy || [];\n\n const appendResult = await appendRows(sheets, {\n spreadsheetId: id,\n sheetTitle,\n rows: processedRows,\n keySet: existingKeySet,\n keyColumns: effectiveKeyColumns,\n header: currentHeaders,\n logger,\n });\n\n rowsSkipped = appendResult.rowsSkipped || 0;\n // Only count data rows, not headers - headers are metadata, not items\n const updatedRows = appendResult.updatedRows || 0;\n\n const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${gid}`;\n\n logger.info('sheets.rows.append completed', { id, gid, updatedRows, rowsSkipped });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid,\n sheetTitle,\n updatedRows,\n rowsSkipped, // Always include rowsSkipped, even when 0\n sheetUrl,\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.rows.append error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error appending rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-append',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","rows","array","union","string","number","boolean","null","min","describe","headers","optional","deduplicateBy","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","updatedRows","rowsSkipped","sheetUrl","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetResponse","sheet","sheets","processedRows","currentHeaders","existingKeySet","headerResult","effectiveKeyColumns","appendResult","error","message","info","rowCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","title","Set","ensureTabAndHeaders","requiredHeader","keyColumns","header","keySet","mapRowsToHeader","canonical","appendRows","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-append.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { CallToolResult, ToolModule } from '@mcp-z/server';\nimport { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { appendRows, mapRowsToHeader } from '../../spreadsheet/data-operations.ts';\nimport { ensureTabAndHeaders } from '../../spreadsheet/sheet-operations.ts';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n rows: z\n .array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])).min(1))\n .min(1)\n .describe('Array of rows, where each row is an array of cell values. Use null to skip a cell (preserve existing value), empty string \"\" to clear it.'),\n headers: z.array(z.string()).optional().describe('Column order/names - used for blank sheets or column mapping'),\n deduplicateBy: z.array(z.string()).optional().describe('Column names to use as composite key for deduplication'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Sheet tab name'),\n updatedRows: z.number().describe('Number of rows appended'),\n rowsSkipped: z.number().optional().describe('Number of duplicate rows skipped'),\n sheetUrl: z.string().optional().describe('URL to view the sheet'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add new rows to the bottom of an existing sheet with smart header handling and optional deduplication. BEST FOR: Structured database operations where spreadsheet has headers defining schema and rows represent records.',\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, rows, headers, deduplicateBy }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.append called', { id, gid, rowCount: rows.length, headers, deduplicateBy });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid\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\n if (!sheet) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Sheet not found');\n }\n\n const sheetTitle = sheet?.properties?.title ?? '';\n\n // Smart header handling and data processing\n let processedRows = rows;\n let currentHeaders: string[] = [];\n let rowsSkipped = 0;\n let existingKeySet: Set<string> = new Set();\n\n if (headers && headers.length > 0) {\n // Use ensureTabAndHeaders to handle header logic\n const headerResult = await ensureTabAndHeaders(sheets, {\n spreadsheetId: id,\n sheetTitle,\n requiredHeader: headers,\n keyColumns: deduplicateBy || [],\n logger,\n });\n\n currentHeaders = headerResult.header;\n existingKeySet = headerResult.keySet;\n\n // Map data rows to match current header order\n processedRows = mapRowsToHeader({ rows, header: currentHeaders, canonical: headers }) as (string | number | boolean | null)[][];\n }\n\n // Append rows with optional deduplication\n // If headers are empty but deduplication is requested, skip deduplication for empty spreadsheets\n const effectiveKeyColumns = currentHeaders.length === 0 && deduplicateBy && deduplicateBy.length > 0 ? [] : deduplicateBy || [];\n\n const appendResult = await appendRows(sheets, {\n spreadsheetId: id,\n sheetTitle,\n rows: processedRows,\n keySet: existingKeySet,\n keyColumns: effectiveKeyColumns,\n header: currentHeaders,\n logger,\n });\n\n rowsSkipped = appendResult.rowsSkipped || 0;\n // Only count data rows, not headers - headers are metadata, not items\n const updatedRows = appendResult.updatedRows || 0;\n\n const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${gid}`;\n\n logger.info('sheets.rows.append completed', { id, gid, updatedRows, rowsSkipped });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid,\n sheetTitle,\n updatedRows,\n rowsSkipped, // Always include rowsSkipped, even when 0\n sheetUrl,\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.rows.append error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error appending rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-append',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","rows","array","union","string","number","boolean","null","min","describe","headers","optional","deduplicateBy","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","updatedRows","rowsSkipped","sheetUrl","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetResponse","sheet","sheets","processedRows","currentHeaders","existingKeySet","headerResult","effectiveKeyColumns","appendResult","error","message","info","rowCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","ProtocolError","ProtocolErrorCode","InvalidParams","title","Set","ensureTabAndHeaders","requiredHeader","keyColumns","header","keySet","mapRowsToHeader","canonical","appendRows","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":";;;;+BAyIA;;;eAAwBA;;;2BAxIA;sBAKyB;0BAC1B;mBACL;uBACuE;gCAC7C;iCACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AARpC,IAAM,AAAEC,2BAA6BC,oBAAO,CAApCD;AAUR,IAAME,cAAcC,MAAC,CAACC,MAAM,CAAC;IAC3BC,IAAIC,4BAAmB;IACvBC,KAAKC,uBAAc;IACnBC,MAAMN,MAAC,CACJO,KAAK,CAACP,MAAC,CAACO,KAAK,CAACP,MAAC,CAACQ,KAAK,CAAC;QAACR,MAAC,CAACS,MAAM;QAAIT,MAAC,CAACU,MAAM;QAAIV,MAAC,CAACW,OAAO;QAAIX,MAAC,CAACY,IAAI;KAAG,GAAGC,GAAG,CAAC,IAC5EA,GAAG,CAAC,GACJC,QAAQ,CAAC;IACZC,SAASf,MAAC,CAACO,KAAK,CAACP,MAAC,CAACS,MAAM,IAAIO,QAAQ,GAAGF,QAAQ,CAAC;IACjDG,eAAejB,MAAC,CAACO,KAAK,CAACP,MAAC,CAACS,MAAM,IAAIO,QAAQ,GAAGF,QAAQ,CAAC;AACzD;AAEA,IAAMI,sBAAsBlB,MAAC,CAACC,MAAM,CAAC;IACnCkB,MAAMnB,MAAC,CAACoB,OAAO,CAAC;IAChBlB,IAAImB,4BAAmB;IACvBjB,KAAKkB,uBAAc;IACnBC,YAAYvB,MAAC,CAACS,MAAM,GAAGK,QAAQ,CAAC;IAChCU,aAAaxB,MAAC,CAACU,MAAM,GAAGI,QAAQ,CAAC;IACjCW,aAAazB,MAAC,CAACU,MAAM,GAAGM,QAAQ,GAAGF,QAAQ,CAAC;IAC5CY,UAAU1B,MAAC,CAACS,MAAM,GAAGO,QAAQ,GAAGF,QAAQ,CAAC;AAC3C;AAEA,IAAMa,eAAe3B,MAAC,CAAC4B,kBAAkB,CAAC,QAAQ;IAACV;IAAqBrB;CAAyB;AAEjG,IAAMgC,SAAS;IACbC,aAAa;IACb/B,aAAAA;IACA4B,cAAc3B,MAAC,CAACC,MAAM,CAAC;QACrB8B,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAgD,EAAEC,KAAoB;YAApE/B,IAAIE,KAAKE,MAAMS,SAASE,eACzCiB,cAYUC,kCAMKC,mBAdbC,QAGAF,qBAKAC,OAMAb,YAGFe,eACAC,gBACAd,aACAe,gBAIIC,cAiBFC,qBAEAC,cAYAnB,aAEAE,UAIAK,QAcCa,OACDC;;;;oBAjFe3C,KAAF,MAAEA,IAAIE,MAAN,MAAMA,KAAKE,OAAX,MAAWA,MAAMS,UAAjB,MAAiBA,SAASE,gBAA1B,MAA0BA;oBACzCiB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOY,IAAI,CAAC,6BAA6B;wBAAE5C,IAAAA;wBAAIE,KAAAA;wBAAK2C,UAAUzC,KAAK0C,MAAM;wBAAEjC,SAAAA;wBAASE,eAAAA;oBAAc;;;;;;;;;oBAG1FoB,SAASY,kBAAM,CAACZ,MAAM,CAAC;wBAAEa,SAAS;wBAAMC,MAAMlB,MAAMmB,WAAW,CAACD,IAAI;oBAAC;oBAG/C;;wBAAMd,OAAOgB,YAAY,CAACC,GAAG,CAAC;4BACxDC,eAAerD;4BACfsD,QAAQ;wBACV;;;oBAHMrB,sBAAsB;oBAKtBC,SAAQD,mCAAAA,oBAAoBsB,IAAI,CAACpB,MAAM,cAA/BF,uDAAAA,iCAAiCuB,IAAI,CAAC,SAACC;4BAAaA;+BAAPC,QAAOD,gBAAAA,EAAEE,UAAU,cAAZF,oCAAAA,cAAcG,OAAO,MAAM1D;;oBAE7F,IAAI,CAACgC,OAAO;wBACV,MAAM,IAAI2B,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE;oBAC3D;oBAEM1C,qBAAaa,kBAAAA,6BAAAA,oBAAAA,MAAOyB,UAAU,cAAjBzB,wCAAAA,kBAAmB8B,KAAK,uCAAI;oBAE/C,4CAA4C;oBACxC5B,gBAAgBhC;oBAChBiC;oBACAd,cAAc;oBACde,iBAA8B,IAAI2B;yBAElCpD,CAAAA,WAAWA,QAAQiC,MAAM,GAAG,CAAA,GAA5BjC;;;;oBAEmB;;wBAAMqD,IAAAA,sCAAmB,EAAC/B,QAAQ;4BACrDkB,eAAerD;4BACfqB,YAAAA;4BACA8C,gBAAgBtD;4BAChBuD,YAAYrD;4BACZiB,QAAAA;wBACF;;;oBANMO,eAAe;oBAQrBF,iBAAiBE,aAAa8B,MAAM;oBACpC/B,iBAAiBC,aAAa+B,MAAM;oBAEpC,8CAA8C;oBAC9ClC,gBAAgBmC,IAAAA,iCAAe,EAAC;wBAAEnE,MAAAA;wBAAMiE,QAAQhC;wBAAgBmC,WAAW3D;oBAAQ;;;oBAGrF,0CAA0C;oBAC1C,iGAAiG;oBAC3F2B,sBAAsBH,eAAeS,MAAM,KAAK,KAAK/B,iBAAiBA,cAAc+B,MAAM,GAAG,SAAS/B;oBAEvF;;wBAAM0D,IAAAA,4BAAU,EAACtC,QAAQ;4BAC5CkB,eAAerD;4BACfqB,YAAAA;4BACAjB,MAAMgC;4BACNkC,QAAQhC;4BACR8B,YAAY5B;4BACZ6B,QAAQhC;4BACRL,QAAAA;wBACF;;;oBARMS,eAAe;oBAUrBlB,cAAckB,aAAalB,WAAW,IAAI;oBAC1C,sEAAsE;oBAChED,cAAcmB,aAAanB,WAAW,IAAI;oBAE1CE,WAAW,AAAC,0CAAwDtB,OAAfF,IAAG,cAAgB,OAAJE;oBAE1E8B,OAAOY,IAAI,CAAC,gCAAgC;wBAAE5C,IAAAA;wBAAIE,KAAAA;wBAAKoB,aAAAA;wBAAaC,aAAAA;oBAAY;oBAE1EM,SAAiB;wBACrBZ,MAAM;wBACNjB,IAAAA;wBACAE,KAAAA;wBACAmB,YAAAA;wBACAC,aAAAA;wBACAC,aAAAA;wBACAC,UAAAA;oBACF;oBAEA;;wBAAO;4BACLkD,OAAO;gCAAG;oCAAEzD,MAAM;oCAAiB0D,MAAMC,KAAKC,SAAS,CAAChD;gCAAQ;;4BAChEiD,mBAAmB;gCAAEjD,QAAAA;4BAAO;wBAC9B;;;oBACOa;oBACDC,UAAUD,AAAK,YAALA,OAAiBqC,SAAQrC,MAAMC,OAAO,GAAGe,OAAOhB;oBAChEV,OAAOU,KAAK,CAAC,4BAA4B;wBAAEA,OAAOC;oBAAQ;oBAE1D,MAAM,IAAIkB,qBAAa,CAACC,yBAAiB,CAACkB,aAAa,EAAE,AAAC,yBAAgC,OAARrC,UAAW;wBAC3FsC,OAAOvC,AAAK,YAALA,OAAiBqC,SAAQrC,MAAMuC,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASxF;IACtB,OAAO;QACLyF,MAAM;QACNxD,QAAAA;QACAG,SAAAA;IACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  /** Import CSV data to Google Sheets with database-style row append and deduplication */
2
2
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
3
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { CallToolResult } from '@mcp-z/server';
4
4
  import { z } from 'zod';
5
5
  declare const inputSchema: z.ZodObject<{
6
6
  id: z.ZodString;
@@ -1,6 +1,6 @@
1
1
  /** Import CSV data to Google Sheets with database-style row append and deduplication */
2
2
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
3
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { CallToolResult } from '@mcp-z/server';
4
4
  import { z } from 'zod';
5
5
  declare const inputSchema: z.ZodObject<{
6
6
  id: z.ZodString;
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
12
+ var _server = require("@mcp-z/server");
13
13
  var _csvparse = require("csv-parse");
14
14
  var _googleapis = require("googleapis");
15
15
  var _zod = require("zod");
@@ -329,7 +329,7 @@ function handler(_0, _1) {
329
329
  26
330
330
  ]);
331
331
  if (headerMap.length === 0) {
332
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'headerMap cannot be empty');
332
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'headerMap cannot be empty');
333
333
  }
334
334
  // Validate: if sourceHasHeaders=false, all references must be numeric
335
335
  if (!sourceHasHeaders) {
@@ -338,10 +338,10 @@ function handler(_0, _1) {
338
338
  for(_iterator = headerMap[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
339
339
  _step_value = _step.value, source = _step_value.source, target = _step_value.target;
340
340
  if (typeof source === 'string') {
341
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices. Got string source: "'.concat(source, '"'));
341
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices. Got string source: "'.concat(source, '"'));
342
342
  }
343
343
  if (typeof target === 'string') {
344
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices. Got string target: "'.concat(target, '"'));
344
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices. Got string target: "'.concat(target, '"'));
345
345
  }
346
346
  }
347
347
  } catch (err) {
@@ -364,7 +364,7 @@ function handler(_0, _1) {
364
364
  for(_iterator1 = deduplicateBy[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
365
365
  colRef = _step1.value;
366
366
  if (typeof colRef === 'string') {
367
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices in deduplicateBy. Got string: "'.concat(colRef, '"'));
367
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'sourceHasHeaders=false requires numeric indices in deduplicateBy. Got string: "'.concat(colRef, '"'));
368
368
  }
369
369
  }
370
370
  } catch (err) {
@@ -401,7 +401,7 @@ function handler(_0, _1) {
401
401
  return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
402
402
  });
403
403
  if (!sheet) {
404
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Sheet not found');
404
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Sheet not found');
405
405
  }
406
406
  sheetTitle = (_ref = sheet === null || sheet === void 0 ? void 0 : (_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.title) !== null && _ref !== void 0 ? _ref : '';
407
407
  // Determine target headers (for sourceHasHeaders=true) or column count (for sourceHasHeaders=false)
@@ -842,7 +842,7 @@ function handler(_0, _1) {
842
842
  logger.error('sheets.rows.csv-append error', {
843
843
  error: message
844
844
  });
845
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error appending CSV rows: ".concat(message), {
845
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error appending CSV rows: ".concat(message), {
846
846
  stack: _instanceof(error, Error) ? error.stack : undefined
847
847
  });
848
848
  case 26:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-csv-append.ts"],"sourcesContent":["/** Import CSV data to Google Sheets with database-style row append and 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 { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.ts';\nimport { buildDeduplicationKey } from '../../spreadsheet/deduplication-utils.ts';\nimport { ensureTabAndHeaders } from '../../spreadsheet/sheet-operations.ts';\n\n// Header mapping schema: source/target can be string (name) or number (0-based index)\nconst HeaderMapItemSchema = z.object({\n source: z.union([z.string(), z.number().int().min(0)]).describe('CSV column: header name (string) or 0-based index (number)'),\n target: z.union([z.string(), z.number().int().min(0)]).describe('Sheet column: header name (string) or 0-based index (number)'),\n});\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 sourceHasHeaders: z.boolean().default(true).describe('Source has header row for column name mapping. Set to false for data-only sources (numeric indices required).'),\n headerMap: z.array(HeaderMapItemSchema).describe('Column mappings from CSV to sheet'),\n deduplicateBy: z\n .array(z.union([z.string(), z.number().int().min(0)]))\n .optional()\n .describe('Sheet columns for deduplication (names or indices)'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Sheet tab name'),\n updatedRows: z.number().describe('Number of rows appended'),\n rowsSkipped: z.number().optional().describe('Number of duplicate rows skipped'),\n sheetUrl: z.string().optional().describe('URL to view the sheet'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Import CSV to Google Sheets with column mapping and optional deduplication. Streams data for large files.',\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\n/** Batch size for Sheets API calls (1000 rows × 12 cols = 12K cells, well under 40K limit) */\nconst BATCH_SIZE = 1000;\n\n/**\n * Resolve column reference to numeric index\n * @param ref Column reference (string name or number index)\n * @param headers Header row (null when sourceHasHeaders=false)\n * @param sourceHasHeaders Whether headers are present\n * @returns 0-based column index\n */\nfunction resolveColumnReference(ref: string | number, headers: string[] | null, sourceHasHeaders: boolean, context: string): number {\n // If number, use directly as 0-based index\n if (typeof ref === 'number') {\n if (ref < 0) {\n throw new Error(`${context}: Column index must be >= 0, got ${ref}`);\n }\n return ref;\n }\n\n // If string, must be header name\n if (!sourceHasHeaders || !headers) {\n throw new Error(`${context}: String column reference \"${ref}\" requires sourceHasHeaders=true. Use numeric index when sourceHasHeaders=false.`);\n }\n\n const index = headers.indexOf(ref);\n if (index === -1) {\n throw new Error(`${context}: Header \"${ref}\" not found in [${headers.join(', ')}]`);\n }\n\n return index;\n}\n\nasync function handler({ id, gid, sourceUri, sourceHasHeaders, headerMap, deduplicateBy }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.csv-append called', { id, gid, sourceUri, sourceHasHeaders, headerMap, deduplicateBy });\n\n try {\n if (headerMap.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'headerMap cannot be empty');\n }\n\n // Validate: if sourceHasHeaders=false, all references must be numeric\n if (!sourceHasHeaders) {\n for (const { source, target } of headerMap) {\n if (typeof source === 'string') {\n throw new McpError(ErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices. Got string source: \"${source}\"`);\n }\n if (typeof target === 'string') {\n throw new McpError(ErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices. Got string target: \"${target}\"`);\n }\n }\n if (deduplicateBy) {\n for (const colRef of deduplicateBy) {\n if (typeof colRef === 'string') {\n throw new McpError(ErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices in deduplicateBy. Got string: \"${colRef}\"`);\n }\n }\n }\n }\n\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid\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\n if (!sheet) {\n throw new McpError(ErrorCode.InvalidParams, 'Sheet not found');\n }\n\n const sheetTitle = sheet?.properties?.title ?? '';\n\n // Determine target headers (for sourceHasHeaders=true) or column count (for sourceHasHeaders=false)\n let sheetHeaders: string[] | null = null;\n let existingKeySet: Set<string> = new Set();\n const keyColumns: (string | number)[] = deduplicateBy || [];\n\n if (sourceHasHeaders) {\n // Extract target header names from headerMap\n const targetHeaderNames = headerMap.map(({ target }) => target).filter((t) => typeof t === 'string') as string[];\n\n // Use ensureTabAndHeaders to setup headers and fetch existing keys\n const headerResult = await ensureTabAndHeaders(sheets, {\n spreadsheetId: id,\n sheetTitle,\n requiredHeader: targetHeaderNames.length > 0 ? targetHeaderNames : null,\n keyColumns: keyColumns.filter((k) => typeof k === 'string') as string[],\n logger,\n });\n\n sheetHeaders = headerResult.header;\n existingKeySet = headerResult.keySet;\n } else {\n // sourceHasHeaders=false: Read existing data for deduplication (if needed)\n if (deduplicateBy && deduplicateBy.length > 0) {\n // Read data in chunks for memory efficiency with large sheets\n const CHUNK_SIZE = 1000;\n let startRow = 1;\n let hasMore = true;\n\n while (hasMore) {\n const endRow = startRow + CHUNK_SIZE - 1;\n const chunkRange = `${sheetTitle}!A${startRow}:ZZZ${endRow}`;\n\n const response = await sheets.spreadsheets.values.get({\n spreadsheetId: id,\n range: chunkRange,\n });\n\n const rows = response.data.values || [];\n\n for (const row of rows) {\n const key = buildDeduplicationKey(row, keyColumns, null, false);\n if (key.replace(/::/g, '') !== '') {\n existingKeySet.add(key);\n }\n }\n\n // Check if there are more rows to read\n if (rows.length < CHUNK_SIZE) {\n hasMore = false;\n } else {\n startRow += CHUNK_SIZE;\n }\n }\n\n logger.info('sheets.rows.csv-append existing keys loaded', { keyCount: existingKeySet.size });\n }\n }\n\n // Streaming CSV processing state\n let sourceHeaders: string[] | null = null;\n let batch: (string | number | boolean | null)[][] = [];\n let totalRows = 0;\n let rowsSkipped = 0;\n\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser\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 // Helper to append batch to Sheets\n const appendBatch = async (rows: (string | number | boolean | null)[][]): Promise<void> => {\n if (rows.length === 0) return;\n\n await sheets.spreadsheets.values.append({\n spreadsheetId: id,\n range: `${sheetTitle}!A:A`,\n valueInputOption: 'USER_ENTERED',\n requestBody: { values: rows, majorDimension: 'ROWS' },\n });\n\n logger.info('sheets.rows.csv-append batch appended', { batchSize: rows.length, totalRows });\n };\n\n // Resolve headerMap to numeric indices (do this after extracting CSV headers)\n let resolvedMap: Array<{ sourceIdx: number; targetIdx: number }> = [];\n\n // Stream and process records\n for await (const record of parser) {\n if (sourceHasHeaders) {\n // Extract source headers from first record\n if (sourceHeaders === null) {\n sourceHeaders = Object.keys(record as Record<string, unknown>);\n logger.info('sheets.rows.csv-append source headers', { sourceHeaders });\n\n // Resolve headerMap now that we have both source and sheet headers\n resolvedMap = headerMap.map(({ source, target }) => ({\n sourceIdx: resolveColumnReference(source, sourceHeaders, sourceHasHeaders, 'headerMap.source'),\n targetIdx: resolveColumnReference(target, sheetHeaders, sourceHasHeaders, 'headerMap.target'),\n }));\n }\n\n // Map source record to sheet row\n const sourceRow = sourceHeaders?.map((h) => (record as Record<string, unknown>)[h] ?? null);\n const maxTargetIdx = Math.max(...resolvedMap.map((m) => m.targetIdx));\n const sheetRow = new Array(maxTargetIdx + 1).fill(null);\n\n for (const { sourceIdx, targetIdx } of resolvedMap) {\n if (sourceRow) {\n sheetRow[targetIdx] = sourceRow[sourceIdx] ?? null;\n }\n }\n\n // Check deduplication\n if (deduplicateBy && deduplicateBy.length > 0) {\n const key = buildDeduplicationKey(sheetRow, keyColumns, sheetHeaders, sourceHasHeaders);\n if (existingKeySet.has(key)) {\n rowsSkipped++;\n continue; // Skip duplicate\n }\n existingKeySet.add(key); // Add to set for future deduplication\n }\n\n // Add to batch\n batch.push(sheetRow);\n totalRows++;\n } else {\n // sourceHasHeaders=false: record is an array (not an object)\n // Resolve map on first row\n if (resolvedMap.length === 0) {\n resolvedMap = headerMap.map(({ source, target }) => ({\n sourceIdx: resolveColumnReference(source, null, sourceHasHeaders, 'headerMap.source'),\n targetIdx: resolveColumnReference(target, null, sourceHasHeaders, 'headerMap.target'),\n }));\n }\n\n const sourceRow = record as unknown[];\n const maxTargetIdx = Math.max(...resolvedMap.map((m) => m.targetIdx));\n const sheetRow = new Array(maxTargetIdx + 1).fill(null);\n\n for (const { sourceIdx, targetIdx } of resolvedMap) {\n if (sourceIdx < sourceRow.length) {\n sheetRow[targetIdx] = sourceRow[sourceIdx] ?? null;\n }\n }\n\n // Check deduplication\n if (deduplicateBy && deduplicateBy.length > 0) {\n const key = buildDeduplicationKey(sheetRow, keyColumns, null, sourceHasHeaders);\n if (existingKeySet.has(key)) {\n rowsSkipped++;\n continue; // Skip duplicate\n }\n existingKeySet.add(key);\n }\n\n // Add to batch\n batch.push(sheetRow);\n totalRows++;\n }\n\n // Append batch when full\n if (batch.length >= BATCH_SIZE) {\n await appendBatch(batch);\n batch = []; // Clear batch\n }\n }\n\n // Flush remaining rows\n if (batch.length > 0) {\n await appendBatch(batch);\n }\n\n logger.info('sheets.rows.csv-append streaming complete', { totalRows, rowsSkipped });\n\n const updatedRows = totalRows;\n\n logger.info('sheets.rows.csv-append completed', { id, gid, updatedRows, rowsSkipped, sourceUri });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid,\n sheetTitle,\n updatedRows,\n rowsSkipped,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${gid}`,\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.rows.csv-append error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error appending CSV rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-csv-append',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","HeaderMapItemSchema","z","object","source","union","string","number","int","min","describe","target","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","sourceUri","trim","sourceHasHeaders","boolean","default","headerMap","array","deduplicateBy","optional","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","updatedRows","rowsSkipped","sheetUrl","outputSchema","discriminatedUnion","config","description","result","BATCH_SIZE","resolveColumnReference","ref","headers","context","Error","index","indexOf","join","handler","extra","logger","spreadsheetResponse","sheet","colRef","sheets","sheetHeaders","existingKeySet","keyColumns","targetHeaderNames","headerResult","CHUNK_SIZE","startRow","hasMore","endRow","chunkRange","response","rows","row","key","sourceHeaders","batch","totalRows","readStream","parser","appendBatch","resolvedMap","error","message","info","length","McpError","ErrorCode","InvalidParams","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","title","Set","map","filter","t","ensureTabAndHeaders","requiredHeader","k","header","keySet","values","range","buildDeduplicationKey","replace","add","keyCount","size","getCsvReadStream","pipe","parse","columns","skip_empty_lines","cast","relax_column_count","append","valueInputOption","requestBody","majorDimension","batchSize","record","Math","sourceRow","maxTargetIdx","sheetRow","sourceIdx","targetIdx","Object","keys","h","max","m","Array","fill","has","push","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-csv-append.ts"],"sourcesContent":["/** Import CSV data to Google Sheets with database-style row append and deduplication */\n\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { CallToolResult, ToolModule } from '@mcp-z/server';\nimport { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { parse } from 'csv-parse';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.ts';\nimport { buildDeduplicationKey } from '../../spreadsheet/deduplication-utils.ts';\nimport { ensureTabAndHeaders } from '../../spreadsheet/sheet-operations.ts';\n\n// Header mapping schema: source/target can be string (name) or number (0-based index)\nconst HeaderMapItemSchema = z.object({\n source: z.union([z.string(), z.number().int().min(0)]).describe('CSV column: header name (string) or 0-based index (number)'),\n target: z.union([z.string(), z.number().int().min(0)]).describe('Sheet column: header name (string) or 0-based index (number)'),\n});\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 sourceHasHeaders: z.boolean().default(true).describe('Source has header row for column name mapping. Set to false for data-only sources (numeric indices required).'),\n headerMap: z.array(HeaderMapItemSchema).describe('Column mappings from CSV to sheet'),\n deduplicateBy: z\n .array(z.union([z.string(), z.number().int().min(0)]))\n .optional()\n .describe('Sheet columns for deduplication (names or indices)'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Sheet tab name'),\n updatedRows: z.number().describe('Number of rows appended'),\n rowsSkipped: z.number().optional().describe('Number of duplicate rows skipped'),\n sheetUrl: z.string().optional().describe('URL to view the sheet'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Import CSV to Google Sheets with column mapping and optional deduplication. Streams data for large files.',\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\n/** Batch size for Sheets API calls (1000 rows × 12 cols = 12K cells, well under 40K limit) */\nconst BATCH_SIZE = 1000;\n\n/**\n * Resolve column reference to numeric index\n * @param ref Column reference (string name or number index)\n * @param headers Header row (null when sourceHasHeaders=false)\n * @param sourceHasHeaders Whether headers are present\n * @returns 0-based column index\n */\nfunction resolveColumnReference(ref: string | number, headers: string[] | null, sourceHasHeaders: boolean, context: string): number {\n // If number, use directly as 0-based index\n if (typeof ref === 'number') {\n if (ref < 0) {\n throw new Error(`${context}: Column index must be >= 0, got ${ref}`);\n }\n return ref;\n }\n\n // If string, must be header name\n if (!sourceHasHeaders || !headers) {\n throw new Error(`${context}: String column reference \"${ref}\" requires sourceHasHeaders=true. Use numeric index when sourceHasHeaders=false.`);\n }\n\n const index = headers.indexOf(ref);\n if (index === -1) {\n throw new Error(`${context}: Header \"${ref}\" not found in [${headers.join(', ')}]`);\n }\n\n return index;\n}\n\nasync function handler({ id, gid, sourceUri, sourceHasHeaders, headerMap, deduplicateBy }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.csv-append called', { id, gid, sourceUri, sourceHasHeaders, headerMap, deduplicateBy });\n\n try {\n if (headerMap.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'headerMap cannot be empty');\n }\n\n // Validate: if sourceHasHeaders=false, all references must be numeric\n if (!sourceHasHeaders) {\n for (const { source, target } of headerMap) {\n if (typeof source === 'string') {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices. Got string source: \"${source}\"`);\n }\n if (typeof target === 'string') {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices. Got string target: \"${target}\"`);\n }\n }\n if (deduplicateBy) {\n for (const colRef of deduplicateBy) {\n if (typeof colRef === 'string') {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `sourceHasHeaders=false requires numeric indices in deduplicateBy. Got string: \"${colRef}\"`);\n }\n }\n }\n }\n\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid\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\n if (!sheet) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Sheet not found');\n }\n\n const sheetTitle = sheet?.properties?.title ?? '';\n\n // Determine target headers (for sourceHasHeaders=true) or column count (for sourceHasHeaders=false)\n let sheetHeaders: string[] | null = null;\n let existingKeySet: Set<string> = new Set();\n const keyColumns: (string | number)[] = deduplicateBy || [];\n\n if (sourceHasHeaders) {\n // Extract target header names from headerMap\n const targetHeaderNames = headerMap.map(({ target }) => target).filter((t) => typeof t === 'string') as string[];\n\n // Use ensureTabAndHeaders to setup headers and fetch existing keys\n const headerResult = await ensureTabAndHeaders(sheets, {\n spreadsheetId: id,\n sheetTitle,\n requiredHeader: targetHeaderNames.length > 0 ? targetHeaderNames : null,\n keyColumns: keyColumns.filter((k) => typeof k === 'string') as string[],\n logger,\n });\n\n sheetHeaders = headerResult.header;\n existingKeySet = headerResult.keySet;\n } else {\n // sourceHasHeaders=false: Read existing data for deduplication (if needed)\n if (deduplicateBy && deduplicateBy.length > 0) {\n // Read data in chunks for memory efficiency with large sheets\n const CHUNK_SIZE = 1000;\n let startRow = 1;\n let hasMore = true;\n\n while (hasMore) {\n const endRow = startRow + CHUNK_SIZE - 1;\n const chunkRange = `${sheetTitle}!A${startRow}:ZZZ${endRow}`;\n\n const response = await sheets.spreadsheets.values.get({\n spreadsheetId: id,\n range: chunkRange,\n });\n\n const rows = response.data.values || [];\n\n for (const row of rows) {\n const key = buildDeduplicationKey(row, keyColumns, null, false);\n if (key.replace(/::/g, '') !== '') {\n existingKeySet.add(key);\n }\n }\n\n // Check if there are more rows to read\n if (rows.length < CHUNK_SIZE) {\n hasMore = false;\n } else {\n startRow += CHUNK_SIZE;\n }\n }\n\n logger.info('sheets.rows.csv-append existing keys loaded', { keyCount: existingKeySet.size });\n }\n }\n\n // Streaming CSV processing state\n let sourceHeaders: string[] | null = null;\n let batch: (string | number | boolean | null)[][] = [];\n let totalRows = 0;\n let rowsSkipped = 0;\n\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser\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 // Helper to append batch to Sheets\n const appendBatch = async (rows: (string | number | boolean | null)[][]): Promise<void> => {\n if (rows.length === 0) return;\n\n await sheets.spreadsheets.values.append({\n spreadsheetId: id,\n range: `${sheetTitle}!A:A`,\n valueInputOption: 'USER_ENTERED',\n requestBody: { values: rows, majorDimension: 'ROWS' },\n });\n\n logger.info('sheets.rows.csv-append batch appended', { batchSize: rows.length, totalRows });\n };\n\n // Resolve headerMap to numeric indices (do this after extracting CSV headers)\n let resolvedMap: Array<{ sourceIdx: number; targetIdx: number }> = [];\n\n // Stream and process records\n for await (const record of parser) {\n if (sourceHasHeaders) {\n // Extract source headers from first record\n if (sourceHeaders === null) {\n sourceHeaders = Object.keys(record as Record<string, unknown>);\n logger.info('sheets.rows.csv-append source headers', { sourceHeaders });\n\n // Resolve headerMap now that we have both source and sheet headers\n resolvedMap = headerMap.map(({ source, target }) => ({\n sourceIdx: resolveColumnReference(source, sourceHeaders, sourceHasHeaders, 'headerMap.source'),\n targetIdx: resolveColumnReference(target, sheetHeaders, sourceHasHeaders, 'headerMap.target'),\n }));\n }\n\n // Map source record to sheet row\n const sourceRow = sourceHeaders?.map((h) => (record as Record<string, unknown>)[h] ?? null);\n const maxTargetIdx = Math.max(...resolvedMap.map((m) => m.targetIdx));\n const sheetRow = new Array(maxTargetIdx + 1).fill(null);\n\n for (const { sourceIdx, targetIdx } of resolvedMap) {\n if (sourceRow) {\n sheetRow[targetIdx] = sourceRow[sourceIdx] ?? null;\n }\n }\n\n // Check deduplication\n if (deduplicateBy && deduplicateBy.length > 0) {\n const key = buildDeduplicationKey(sheetRow, keyColumns, sheetHeaders, sourceHasHeaders);\n if (existingKeySet.has(key)) {\n rowsSkipped++;\n continue; // Skip duplicate\n }\n existingKeySet.add(key); // Add to set for future deduplication\n }\n\n // Add to batch\n batch.push(sheetRow);\n totalRows++;\n } else {\n // sourceHasHeaders=false: record is an array (not an object)\n // Resolve map on first row\n if (resolvedMap.length === 0) {\n resolvedMap = headerMap.map(({ source, target }) => ({\n sourceIdx: resolveColumnReference(source, null, sourceHasHeaders, 'headerMap.source'),\n targetIdx: resolveColumnReference(target, null, sourceHasHeaders, 'headerMap.target'),\n }));\n }\n\n const sourceRow = record as unknown[];\n const maxTargetIdx = Math.max(...resolvedMap.map((m) => m.targetIdx));\n const sheetRow = new Array(maxTargetIdx + 1).fill(null);\n\n for (const { sourceIdx, targetIdx } of resolvedMap) {\n if (sourceIdx < sourceRow.length) {\n sheetRow[targetIdx] = sourceRow[sourceIdx] ?? null;\n }\n }\n\n // Check deduplication\n if (deduplicateBy && deduplicateBy.length > 0) {\n const key = buildDeduplicationKey(sheetRow, keyColumns, null, sourceHasHeaders);\n if (existingKeySet.has(key)) {\n rowsSkipped++;\n continue; // Skip duplicate\n }\n existingKeySet.add(key);\n }\n\n // Add to batch\n batch.push(sheetRow);\n totalRows++;\n }\n\n // Append batch when full\n if (batch.length >= BATCH_SIZE) {\n await appendBatch(batch);\n batch = []; // Clear batch\n }\n }\n\n // Flush remaining rows\n if (batch.length > 0) {\n await appendBatch(batch);\n }\n\n logger.info('sheets.rows.csv-append streaming complete', { totalRows, rowsSkipped });\n\n const updatedRows = totalRows;\n\n logger.info('sheets.rows.csv-append completed', { id, gid, updatedRows, rowsSkipped, sourceUri });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid,\n sheetTitle,\n updatedRows,\n rowsSkipped,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${gid}`,\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.rows.csv-append error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error appending CSV rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-csv-append',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","HeaderMapItemSchema","z","object","source","union","string","number","int","min","describe","target","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","sourceUri","trim","sourceHasHeaders","boolean","default","headerMap","array","deduplicateBy","optional","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","updatedRows","rowsSkipped","sheetUrl","outputSchema","discriminatedUnion","config","description","result","BATCH_SIZE","resolveColumnReference","ref","headers","context","Error","index","indexOf","join","handler","extra","logger","spreadsheetResponse","sheet","colRef","sheets","sheetHeaders","existingKeySet","keyColumns","targetHeaderNames","headerResult","CHUNK_SIZE","startRow","hasMore","endRow","chunkRange","response","rows","row","key","sourceHeaders","batch","totalRows","readStream","parser","appendBatch","resolvedMap","error","message","info","length","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","title","Set","map","filter","t","ensureTabAndHeaders","requiredHeader","k","header","keySet","values","range","buildDeduplicationKey","replace","add","keyCount","size","getCsvReadStream","pipe","parse","columns","skip_empty_lines","cast","relax_column_count","append","valueInputOption","requestBody","majorDimension","batchSize","record","Math","sourceRow","maxTargetIdx","sheetRow","sourceIdx","targetIdx","Object","keys","h","max","m","Array","fill","has","push","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  id: z.ZodString;
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  id: z.ZodString;
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
12
+ var _server = require("@mcp-z/server");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
15
  var _indexts = require("../../schemas/index.js");
@@ -218,7 +218,7 @@ function handler(_0, _1) {
218
218
  gid: gid,
219
219
  range: range
220
220
  });
221
- throw new _types.McpError(_types.ErrorCode.InvalidParams, "Sheet not found: ".concat(gid));
221
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, "Sheet not found: ".concat(gid));
222
222
  }
223
223
  sheetTitle = (_ref = (_sheet_properties = sheet.properties) === null || _sheet_properties === void 0 ? void 0 : _sheet_properties.title) !== null && _ref !== void 0 ? _ref : '';
224
224
  // Construct full range with sheet title
@@ -266,8 +266,8 @@ function handler(_0, _1) {
266
266
  logger.error('sheets.rows.get error', {
267
267
  error: message
268
268
  });
269
- // Throw McpError for proper MCP error handling
270
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error getting rows: ".concat(message), {
269
+ // Throw ProtocolError for proper MCP error handling
270
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error getting rows: ".concat(message), {
271
271
  stack: _instanceof(error, Error) ? error.stack : undefined
272
272
  });
273
273
  case 5:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-get.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 } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetCellSchema, SheetGidSchema, SpreadsheetIdSchema } from '../../schemas/index.ts';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n range: z.string().min(1).describe('A1 notation range to fetch (e.g., \"B5\", \"A5:D5\", \"B:B\", \"5:5\")'),\n render: z.enum(['FORMATTED_VALUE', 'UNFORMATTED_VALUE', 'FORMULA']).optional().describe('How to render cell values. FORMATTED_VALUE (default): calculated with formatting. UNFORMATTED_VALUE: calculated without formatting. FORMULA: show formula text instead of result.'),\n});\n\n// Success branch schema - uses rows: for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n range: z.string().describe('The A1 notation range that was retrieved'),\n rows: z.array(z.array(SheetCellSchema)).describe('2D array of row data (each inner array is a row)'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Fetch row data from a specific range in A1 notation. Best used after values-search to get surrounding context. Use a1-notation prompt for syntax reference.',\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, range, render }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.get called', { id, gid, range, render });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid to get sheet title\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\n if (!sheet) {\n logger.info('sheets.rows.get sheet not found', { id, gid, range });\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties?.title ?? '';\n\n // Construct full range with sheet title\n const fullRange = `${sheetTitle}!${range}`;\n\n const response = await sheets.spreadsheets.values.get({\n spreadsheetId: id,\n range: fullRange,\n valueRenderOption: render || 'FORMATTED_VALUE',\n });\n\n const res = response.data;\n const rows = Array.isArray(res.values) ? (res.values as (string | number | boolean | null)[][]) : [];\n\n logger.info('sheets.rows.get success', { id, gid, range, rowCount: rows.length });\n\n const result: Output = {\n type: 'success' as const,\n range: res.range || fullRange,\n rows,\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.rows.get error', { error: message });\n\n // Throw McpError for proper MCP error handling\n throw new McpError(ErrorCode.InternalError, `Error getting rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","range","string","min","describe","render","enum","optional","successBranchSchema","type","literal","rows","array","SheetCellSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetResponse","sheet","sheets","sheetTitle","fullRange","response","res","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","title","values","valueRenderOption","Array","isArray","rowCount","length","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/rows-get.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { CallToolResult, ToolModule } from '@mcp-z/server';\nimport { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetCellSchema, SheetGidSchema, SpreadsheetIdSchema } from '../../schemas/index.ts';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n range: z.string().min(1).describe('A1 notation range to fetch (e.g., \"B5\", \"A5:D5\", \"B:B\", \"5:5\")'),\n render: z.enum(['FORMATTED_VALUE', 'UNFORMATTED_VALUE', 'FORMULA']).optional().describe('How to render cell values. FORMATTED_VALUE (default): calculated with formatting. UNFORMATTED_VALUE: calculated without formatting. FORMULA: show formula text instead of result.'),\n});\n\n// Success branch schema - uses rows: for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n range: z.string().describe('The A1 notation range that was retrieved'),\n rows: z.array(z.array(SheetCellSchema)).describe('2D array of row data (each inner array is a row)'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Fetch row data from a specific range in A1 notation. Best used after values-search to get surrounding context. Use a1-notation prompt for syntax reference.',\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, range, render }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.rows.get called', { id, gid, range, render });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get sheet details using the gid to get sheet title\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\n if (!sheet) {\n logger.info('sheets.rows.get sheet not found', { id, gid, range });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties?.title ?? '';\n\n // Construct full range with sheet title\n const fullRange = `${sheetTitle}!${range}`;\n\n const response = await sheets.spreadsheets.values.get({\n spreadsheetId: id,\n range: fullRange,\n valueRenderOption: render || 'FORMATTED_VALUE',\n });\n\n const res = response.data;\n const rows = Array.isArray(res.values) ? (res.values as (string | number | boolean | null)[][]) : [];\n\n logger.info('sheets.rows.get success', { id, gid, range, rowCount: rows.length });\n\n const result: Output = {\n type: 'success' as const,\n range: res.range || fullRange,\n rows,\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.rows.get error', { error: message });\n\n // Throw ProtocolError for proper MCP error handling\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting rows: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'rows-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","range","string","min","describe","render","enum","optional","successBranchSchema","type","literal","rows","array","SheetCellSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetResponse","sheet","sheets","sheetTitle","fullRange","response","res","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","ProtocolError","ProtocolErrorCode","InvalidParams","title","values","valueRenderOption","Array","isArray","rowCount","length","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  sourceId: z.ZodString;
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  sourceId: z.ZodString;
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
12
+ var _server = require("@mcp-z/server");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
15
  var _indexts = require("../../schemas/index.js");
@@ -220,7 +220,7 @@ function handler(_0, _1) {
220
220
  return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === sourceGid;
221
221
  });
222
222
  if (!(sourceSheet === null || sourceSheet === void 0 ? void 0 : sourceSheet.properties)) {
223
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Source sheet with gid "'.concat(sourceGid, '" not found in spreadsheet'));
223
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Source sheet with gid "'.concat(sourceGid, '" not found in spreadsheet'));
224
224
  }
225
225
  sourceTitle = sourceSheet.properties.title || '';
226
226
  return [
@@ -309,14 +309,14 @@ function handler(_0, _1) {
309
309
  ];
310
310
  case 6:
311
311
  error = _state.sent();
312
- if (_instanceof(error, _types.McpError)) {
312
+ if (_instanceof(error, _server.ProtocolError)) {
313
313
  throw error;
314
314
  }
315
315
  message = _instanceof(error, Error) ? error.message : String(error);
316
316
  logger.error('sheets.sheet.copyTo error', {
317
317
  error: message
318
318
  });
319
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error copying sheet to another spreadsheet: ".concat(message), {
319
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error copying sheet to another spreadsheet: ".concat(message), {
320
320
  stack: _instanceof(error, Error) ? error.stack : undefined
321
321
  });
322
322
  case 7:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/sheet-copy-to.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 } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidSchema, SpreadsheetIdSchema } from '../../schemas/index.ts';\n\n// Note: Using contextual descriptions for source/destination IDs since they describe different spreadsheets/sheets\n\nconst inputSchema = z.object({\n sourceId: SpreadsheetIdSchema.describe('Source spreadsheet ID'),\n sourceGid: SheetGidSchema.describe('Source sheet grid ID to copy'),\n destinationId: SpreadsheetIdSchema.describe('Destination spreadsheet ID'),\n newTitle: z.coerce.string().trim().min(1).optional().describe('New name for the copied sheet (optional, will use auto-generated name if not provided)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n operationSummary: z.string().describe('Summary of the copy operation'),\n itemsProcessed: z.number().describe('Total items attempted (always 1)'),\n itemsChanged: z.number().describe('Successfully copied (always 1 on success)'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n sourceId: z.string().describe('Source spreadsheet ID'),\n sourceGid: z.string().describe('Source sheet ID'),\n sourceTitle: z.string().describe('Source sheet title'),\n destinationId: z.string().describe('Destination spreadsheet ID'),\n destinationGid: z.string().describe('Copied sheet ID in destination'),\n destinationTitle: z.string().describe('Title of the copied sheet in destination'),\n sheetUrl: z.string().describe('URL of the copied sheet'),\n renamed: z.boolean().describe('Whether the sheet was renamed after copying'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Copy a sheet to another spreadsheet. Copies all data, formatting, and charts.',\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({ sourceId, sourceGid, destinationId, newTitle }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.copyTo called', { sourceId, sourceGid, destinationId, newTitle });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get source sheet info\n const sourceInfo = await sheets.spreadsheets.get({\n spreadsheetId: sourceId,\n fields: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n const sourceSheet = sourceInfo.data.sheets?.find((s) => String(s.properties?.sheetId) === sourceGid);\n if (!sourceSheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Source sheet with gid \"${sourceGid}\" not found in spreadsheet`);\n }\n\n const sourceTitle = sourceSheet.properties.title || '';\n\n // Copy the sheet to the destination spreadsheet\n const copyResponse = await sheets.spreadsheets.sheets.copyTo({\n spreadsheetId: sourceId,\n sheetId: Number(sourceGid),\n requestBody: {\n destinationSpreadsheetId: destinationId,\n },\n });\n\n const newSheetId = copyResponse.data.sheetId;\n let destinationTitle = copyResponse.data.title || '';\n\n if (!newSheetId) {\n throw new Error('Failed to retrieve new sheet ID from API response');\n }\n\n // If newTitle is provided, rename the sheet in the destination\n let renamed = false;\n if (newTitle && newTitle !== destinationTitle) {\n await sheets.spreadsheets.batchUpdate({\n spreadsheetId: destinationId,\n requestBody: {\n requests: [\n {\n updateSheetProperties: {\n properties: { sheetId: newSheetId, title: newTitle },\n fields: 'title',\n },\n },\n ],\n },\n });\n destinationTitle = newTitle;\n renamed = true;\n }\n\n logger.info('sheets.sheet.copyTo success', {\n sourceId,\n sourceGid,\n destinationId,\n destinationGid: String(newSheetId),\n renamed,\n });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: `Copied sheet \"${sourceTitle}\" to destination${renamed ? ` as \"${destinationTitle}\"` : ''}`,\n itemsProcessed: 1,\n itemsChanged: 1,\n completedAt: new Date().toISOString(),\n sourceId,\n sourceGid,\n sourceTitle,\n destinationId,\n destinationGid: String(newSheetId),\n destinationTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${destinationId}/edit#gid=${newSheetId}`,\n renamed,\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 if (error instanceof McpError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.copyTo error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error copying sheet to another spreadsheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-copy-to',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","sourceId","SpreadsheetIdSchema","describe","sourceGid","SheetGidSchema","destinationId","newTitle","coerce","string","trim","min","optional","successBranchSchema","type","literal","operationSummary","itemsProcessed","number","itemsChanged","completedAt","sourceTitle","destinationGid","destinationTitle","sheetUrl","renamed","boolean","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sourceInfo","sheets","sourceSheet","copyResponse","newSheetId","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","title","copyTo","Number","requestBody","destinationSpreadsheetId","Error","batchUpdate","requests","updateSheetProperties","Date","toISOString","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/sheet-copy-to.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { CallToolResult, ToolModule } from '@mcp-z/server';\nimport { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidSchema, SpreadsheetIdSchema } from '../../schemas/index.ts';\n\n// Note: Using contextual descriptions for source/destination IDs since they describe different spreadsheets/sheets\n\nconst inputSchema = z.object({\n sourceId: SpreadsheetIdSchema.describe('Source spreadsheet ID'),\n sourceGid: SheetGidSchema.describe('Source sheet grid ID to copy'),\n destinationId: SpreadsheetIdSchema.describe('Destination spreadsheet ID'),\n newTitle: z.coerce.string().trim().min(1).optional().describe('New name for the copied sheet (optional, will use auto-generated name if not provided)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n operationSummary: z.string().describe('Summary of the copy operation'),\n itemsProcessed: z.number().describe('Total items attempted (always 1)'),\n itemsChanged: z.number().describe('Successfully copied (always 1 on success)'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n sourceId: z.string().describe('Source spreadsheet ID'),\n sourceGid: z.string().describe('Source sheet ID'),\n sourceTitle: z.string().describe('Source sheet title'),\n destinationId: z.string().describe('Destination spreadsheet ID'),\n destinationGid: z.string().describe('Copied sheet ID in destination'),\n destinationTitle: z.string().describe('Title of the copied sheet in destination'),\n sheetUrl: z.string().describe('URL of the copied sheet'),\n renamed: z.boolean().describe('Whether the sheet was renamed after copying'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Copy a sheet to another spreadsheet. Copies all data, formatting, and charts.',\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({ sourceId, sourceGid, destinationId, newTitle }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.copyTo called', { sourceId, sourceGid, destinationId, newTitle });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get source sheet info\n const sourceInfo = await sheets.spreadsheets.get({\n spreadsheetId: sourceId,\n fields: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n const sourceSheet = sourceInfo.data.sheets?.find((s) => String(s.properties?.sheetId) === sourceGid);\n if (!sourceSheet?.properties) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Source sheet with gid \"${sourceGid}\" not found in spreadsheet`);\n }\n\n const sourceTitle = sourceSheet.properties.title || '';\n\n // Copy the sheet to the destination spreadsheet\n const copyResponse = await sheets.spreadsheets.sheets.copyTo({\n spreadsheetId: sourceId,\n sheetId: Number(sourceGid),\n requestBody: {\n destinationSpreadsheetId: destinationId,\n },\n });\n\n const newSheetId = copyResponse.data.sheetId;\n let destinationTitle = copyResponse.data.title || '';\n\n if (!newSheetId) {\n throw new Error('Failed to retrieve new sheet ID from API response');\n }\n\n // If newTitle is provided, rename the sheet in the destination\n let renamed = false;\n if (newTitle && newTitle !== destinationTitle) {\n await sheets.spreadsheets.batchUpdate({\n spreadsheetId: destinationId,\n requestBody: {\n requests: [\n {\n updateSheetProperties: {\n properties: { sheetId: newSheetId, title: newTitle },\n fields: 'title',\n },\n },\n ],\n },\n });\n destinationTitle = newTitle;\n renamed = true;\n }\n\n logger.info('sheets.sheet.copyTo success', {\n sourceId,\n sourceGid,\n destinationId,\n destinationGid: String(newSheetId),\n renamed,\n });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: `Copied sheet \"${sourceTitle}\" to destination${renamed ? ` as \"${destinationTitle}\"` : ''}`,\n itemsProcessed: 1,\n itemsChanged: 1,\n completedAt: new Date().toISOString(),\n sourceId,\n sourceGid,\n sourceTitle,\n destinationId,\n destinationGid: String(newSheetId),\n destinationTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${destinationId}/edit#gid=${newSheetId}`,\n renamed,\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 if (error instanceof ProtocolError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.copyTo error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error copying sheet to another spreadsheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-copy-to',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","sourceId","SpreadsheetIdSchema","describe","sourceGid","SheetGidSchema","destinationId","newTitle","coerce","string","trim","min","optional","successBranchSchema","type","literal","operationSummary","itemsProcessed","number","itemsChanged","completedAt","sourceTitle","destinationGid","destinationTitle","sheetUrl","renamed","boolean","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sourceInfo","sheets","sourceSheet","copyResponse","newSheetId","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","ProtocolError","ProtocolErrorCode","InvalidParams","title","copyTo","Number","requestBody","destinationSpreadsheetId","Error","batchUpdate","requests","updateSheetProperties","Date","toISOString","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  id: z.ZodString;
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  id: z.ZodString;
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
12
+ var _server = require("@mcp-z/server");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
15
  var _indexts = require("../../schemas/index.js");
@@ -254,7 +254,7 @@ function handler(_0, _1) {
254
254
  return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
255
255
  });
256
256
  if (!(sourceSheet === null || sourceSheet === void 0 ? void 0 : sourceSheet.properties)) {
257
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Source sheet with gid "'.concat(gid, '" not found in spreadsheet'));
257
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Source sheet with gid "'.concat(gid, '" not found in spreadsheet'));
258
258
  }
259
259
  sourceTitle = sourceSheet.properties.title || '';
260
260
  sourceSheetId = Number(gid);
@@ -360,14 +360,14 @@ function handler(_0, _1) {
360
360
  ];
361
361
  case 4:
362
362
  error = _state.sent();
363
- if (_instanceof(error, _types.McpError)) {
363
+ if (_instanceof(error, _server.ProtocolError)) {
364
364
  throw error;
365
365
  }
366
366
  message = _instanceof(error, Error) ? error.message : String(error);
367
367
  logger.error('sheets.sheet.copy error', {
368
368
  error: message
369
369
  });
370
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error copying sheet: ".concat(message), {
370
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error copying sheet: ".concat(message), {
371
371
  stack: _instanceof(error, Error) ? error.stack : undefined
372
372
  });
373
373
  case 5: