@mcp-z/mcp-sheets 1.0.0 → 1.0.1

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 (150) hide show
  1. package/README.md +32 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/index.js +13 -13
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/lib/create-store.js.map +1 -1
  7. package/dist/cjs/mcp/index.js +6 -6
  8. package/dist/cjs/mcp/index.js.map +1 -1
  9. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -1
  10. package/dist/cjs/mcp/prompts/index.js +2 -2
  11. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  12. package/dist/cjs/mcp/resources/index.js +2 -2
  13. package/dist/cjs/mcp/resources/index.js.map +1 -1
  14. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -1
  15. package/dist/cjs/mcp/tools/cells-format.js +8 -8
  16. package/dist/cjs/mcp/tools/cells-format.js.map +1 -1
  17. package/dist/cjs/mcp/tools/chart-create.js +8 -8
  18. package/dist/cjs/mcp/tools/chart-create.js.map +1 -1
  19. package/dist/cjs/mcp/tools/columns-get.js +3 -3
  20. package/dist/cjs/mcp/tools/columns-get.js.map +1 -1
  21. package/dist/cjs/mcp/tools/columns-update.js +10 -10
  22. package/dist/cjs/mcp/tools/columns-update.js.map +1 -1
  23. package/dist/cjs/mcp/tools/csv-get-columns.js +2 -2
  24. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -1
  25. package/dist/cjs/mcp/tools/dimensions-batch-update.js +16 -16
  26. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -1
  27. package/dist/cjs/mcp/tools/dimensions-move.js +5 -5
  28. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -1
  29. package/dist/cjs/mcp/tools/index.js +52 -52
  30. package/dist/cjs/mcp/tools/index.js.map +1 -1
  31. package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -1
  32. package/dist/cjs/mcp/tools/rows-append.js +10 -10
  33. package/dist/cjs/mcp/tools/rows-append.js.map +1 -1
  34. package/dist/cjs/mcp/tools/rows-csv-append.js +13 -13
  35. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -1
  36. package/dist/cjs/mcp/tools/rows-get.js +4 -4
  37. package/dist/cjs/mcp/tools/rows-get.js.map +1 -1
  38. package/dist/cjs/mcp/tools/sheet-copy-to.js +4 -4
  39. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -1
  40. package/dist/cjs/mcp/tools/sheet-copy.js +5 -5
  41. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -1
  42. package/dist/cjs/mcp/tools/sheet-create.js +4 -4
  43. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -1
  44. package/dist/cjs/mcp/tools/sheet-delete.js +4 -4
  45. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -1
  46. package/dist/cjs/mcp/tools/sheet-find.js +7 -7
  47. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -1
  48. package/dist/cjs/mcp/tools/sheet-rename.js +5 -5
  49. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -1
  50. package/dist/cjs/mcp/tools/spreadsheet-copy.js +2 -2
  51. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -1
  52. package/dist/cjs/mcp/tools/spreadsheet-create.js +2 -2
  53. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -1
  54. package/dist/cjs/mcp/tools/spreadsheet-find.js +6 -6
  55. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -1
  56. package/dist/cjs/mcp/tools/spreadsheet-rename.js +3 -3
  57. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -1
  58. package/dist/cjs/mcp/tools/validation-set.js +8 -8
  59. package/dist/cjs/mcp/tools/validation-set.js.map +1 -1
  60. package/dist/cjs/mcp/tools/values-batch-update.js +8 -8
  61. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -1
  62. package/dist/cjs/mcp/tools/values-clear.js +6 -6
  63. package/dist/cjs/mcp/tools/values-clear.js.map +1 -1
  64. package/dist/cjs/mcp/tools/values-csv-update.js +8 -8
  65. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -1
  66. package/dist/cjs/mcp/tools/values-replace.js +8 -8
  67. package/dist/cjs/mcp/tools/values-replace.js.map +1 -1
  68. package/dist/cjs/mcp/tools/values-search.js +5 -5
  69. package/dist/cjs/mcp/tools/values-search.js.map +1 -1
  70. package/dist/cjs/schemas/index.js.map +1 -1
  71. package/dist/cjs/setup/config.js +11 -1
  72. package/dist/cjs/setup/config.js.map +1 -1
  73. package/dist/cjs/setup/http.js +6 -2
  74. package/dist/cjs/setup/http.js.map +1 -1
  75. package/dist/cjs/setup/index.js +9 -9
  76. package/dist/cjs/setup/index.js.map +1 -1
  77. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  78. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  79. package/dist/cjs/setup/oauth-google.js +15 -12
  80. package/dist/cjs/setup/oauth-google.js.map +1 -1
  81. package/dist/cjs/setup/runtime.js +9 -9
  82. package/dist/cjs/setup/runtime.js.map +1 -1
  83. package/dist/cjs/setup/stdio.js +2 -2
  84. package/dist/cjs/setup/stdio.js.map +1 -1
  85. package/dist/cjs/spreadsheet/column-utilities.js.map +1 -1
  86. package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -1
  87. package/dist/cjs/spreadsheet/data-operations.js +9 -9
  88. package/dist/cjs/spreadsheet/data-operations.js.map +1 -1
  89. package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -1
  90. package/dist/cjs/spreadsheet/range-operations.js +2 -2
  91. package/dist/cjs/spreadsheet/range-operations.js.map +1 -1
  92. package/dist/cjs/spreadsheet/sheet-operations.js +3 -3
  93. package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -1
  94. package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -1
  95. package/dist/esm/constants.js.map +1 -1
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/lib/create-store.js.map +1 -1
  98. package/dist/esm/mcp/index.js.map +1 -1
  99. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -1
  100. package/dist/esm/mcp/prompts/index.js.map +1 -1
  101. package/dist/esm/mcp/resources/index.js.map +1 -1
  102. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -1
  103. package/dist/esm/mcp/tools/cells-format.js.map +1 -1
  104. package/dist/esm/mcp/tools/chart-create.js.map +1 -1
  105. package/dist/esm/mcp/tools/columns-get.js.map +1 -1
  106. package/dist/esm/mcp/tools/columns-update.js.map +1 -1
  107. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -1
  108. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -1
  109. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -1
  110. package/dist/esm/mcp/tools/index.js.map +1 -1
  111. package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -1
  112. package/dist/esm/mcp/tools/rows-append.js.map +1 -1
  113. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -1
  114. package/dist/esm/mcp/tools/rows-get.js.map +1 -1
  115. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -1
  116. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -1
  117. package/dist/esm/mcp/tools/sheet-create.js.map +1 -1
  118. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -1
  119. package/dist/esm/mcp/tools/sheet-find.js.map +1 -1
  120. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -1
  121. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -1
  122. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -1
  123. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -1
  124. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -1
  125. package/dist/esm/mcp/tools/validation-set.js.map +1 -1
  126. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -1
  127. package/dist/esm/mcp/tools/values-clear.js.map +1 -1
  128. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -1
  129. package/dist/esm/mcp/tools/values-replace.js.map +1 -1
  130. package/dist/esm/mcp/tools/values-search.js.map +1 -1
  131. package/dist/esm/schemas/index.js.map +1 -1
  132. package/dist/esm/setup/config.js +12 -2
  133. package/dist/esm/setup/config.js.map +1 -1
  134. package/dist/esm/setup/http.js +4 -0
  135. package/dist/esm/setup/http.js.map +1 -1
  136. package/dist/esm/setup/index.js.map +1 -1
  137. package/dist/esm/setup/oauth-google.d.ts +3 -2
  138. package/dist/esm/setup/oauth-google.js +8 -11
  139. package/dist/esm/setup/oauth-google.js.map +1 -1
  140. package/dist/esm/setup/runtime.js.map +1 -1
  141. package/dist/esm/setup/stdio.js.map +1 -1
  142. package/dist/esm/spreadsheet/column-utilities.js.map +1 -1
  143. package/dist/esm/spreadsheet/csv-streaming.js.map +1 -1
  144. package/dist/esm/spreadsheet/data-operations.js.map +1 -1
  145. package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -1
  146. package/dist/esm/spreadsheet/range-operations.js.map +1 -1
  147. package/dist/esm/spreadsheet/sheet-operations.js.map +1 -1
  148. package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -1
  149. package/dist/esm/types.js.map +1 -1
  150. package/package.json +1 -1
@@ -13,10 +13,10 @@ var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _csvparse = require("csv-parse");
14
14
  var _googleapis = require("googleapis");
15
15
  var _zod = require("zod");
16
- var _index = require("../../schemas/index.js");
17
- var _csvstreaming = require("../../spreadsheet/csv-streaming.js");
18
- var _deduplicationutils = require("../../spreadsheet/deduplication-utils.js");
19
- var _sheetoperations = require("../../spreadsheet/sheet-operations.js");
16
+ var _indexts = require("../../schemas/index.js");
17
+ var _csvstreamingts = require("../../spreadsheet/csv-streaming.js");
18
+ var _deduplicationutilsts = require("../../spreadsheet/deduplication-utils.js");
19
+ var _sheetoperationsts = require("../../spreadsheet/sheet-operations.js");
20
20
  function _array_like_to_array(arr, len) {
21
21
  if (len == null || len > arr.length) len = arr.length;
22
22
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -245,8 +245,8 @@ var HeaderMapItemSchema = _zod.z.object({
245
245
  ]).describe('Sheet column: header name (string) or 0-based index (number)')
246
246
  });
247
247
  var inputSchema = _zod.z.object({
248
- id: _index.SpreadsheetIdSchema,
249
- gid: _index.SheetGidSchema,
248
+ id: _indexts.SpreadsheetIdSchema,
249
+ gid: _indexts.SheetGidSchema,
250
250
  sourceUri: _zod.z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),
251
251
  sourceHasHeaders: _zod.z.boolean().default(true).describe('Source has header row for column name mapping. Set to false for data-only sources (numeric indices required).'),
252
252
  headerMap: _zod.z.array(HeaderMapItemSchema).describe('Column mappings from CSV to sheet'),
@@ -257,8 +257,8 @@ var inputSchema = _zod.z.object({
257
257
  });
258
258
  var successBranchSchema = _zod.z.object({
259
259
  type: _zod.z.literal('success'),
260
- id: _index.SpreadsheetIdOutput,
261
- gid: _index.SheetGidOutput,
260
+ id: _indexts.SpreadsheetIdOutput,
261
+ gid: _indexts.SheetGidOutput,
262
262
  sheetTitle: _zod.z.string().describe('Sheet tab name'),
263
263
  updatedRows: _zod.z.number().describe('Number of rows appended'),
264
264
  rowsSkipped: _zod.z.number().optional().describe('Number of duplicate rows skipped'),
@@ -417,7 +417,7 @@ function handler(_0, _1) {
417
417
  });
418
418
  return [
419
419
  4,
420
- (0, _sheetoperations.ensureTabAndHeaders)(sheets, {
420
+ (0, _sheetoperationsts.ensureTabAndHeaders)(sheets, {
421
421
  spreadsheetId: id,
422
422
  sheetTitle: sheetTitle,
423
423
  requiredHeader: targetHeaderNames.length > 0 ? targetHeaderNames : null,
@@ -466,7 +466,7 @@ function handler(_0, _1) {
466
466
  try {
467
467
  for(_iterator2 = rows[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
468
468
  row = _step2.value;
469
- key = (0, _deduplicationutils.buildDeduplicationKey)(row, keyColumns, null, false);
469
+ key = (0, _deduplicationutilsts.buildDeduplicationKey)(row, keyColumns, null, false);
470
470
  if (key.replace(/::/g, '') !== '') {
471
471
  existingKeySet.add(key);
472
472
  }
@@ -508,7 +508,7 @@ function handler(_0, _1) {
508
508
  rowsSkipped = 0;
509
509
  return [
510
510
  4,
511
- (0, _csvstreaming.getCsvReadStream)(sourceUri)
511
+ (0, _csvstreamingts.getCsvReadStream)(sourceUri)
512
512
  ];
513
513
  case 9:
514
514
  readStream = _state.sent();
@@ -623,7 +623,7 @@ function handler(_0, _1) {
623
623
  }
624
624
  // Check deduplication
625
625
  if (deduplicateBy && deduplicateBy.length > 0) {
626
- key = (0, _deduplicationutils.buildDeduplicationKey)(sheetRow, keyColumns, sheetHeaders, sourceHasHeaders);
626
+ key = (0, _deduplicationutilsts.buildDeduplicationKey)(sheetRow, keyColumns, sheetHeaders, sourceHasHeaders);
627
627
  if (existingKeySet.has(key)) {
628
628
  rowsSkipped++;
629
629
  return [
@@ -679,7 +679,7 @@ function handler(_0, _1) {
679
679
  }
680
680
  // Check deduplication
681
681
  if (deduplicateBy && deduplicateBy.length > 0) {
682
- key1 = (0, _deduplicationutils.buildDeduplicationKey)(sheetRow1, keyColumns, null, sourceHasHeaders);
682
+ key1 = (0, _deduplicationutilsts.buildDeduplicationKey)(sheetRow1, keyColumns, null, sourceHasHeaders);
683
683
  if (existingKeySet.has(key1)) {
684
684
  rowsSkipped++;
685
685
  return [
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/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.js';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.js';\nimport { buildDeduplicationKey } from '../../spreadsheet/deduplication-utils.js';\nimport { ensureTabAndHeaders } from '../../spreadsheet/sheet-operations.js';\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/Projects/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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"}
@@ -12,7 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
15
+ var _indexts = require("../../schemas/index.js");
16
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
17
17
  try {
18
18
  var info = gen[key](arg);
@@ -150,8 +150,8 @@ function _ts_generator(thisArg, body) {
150
150
  }
151
151
  var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
152
152
  var inputSchema = _zod.z.object({
153
- id: _index.SpreadsheetIdSchema,
154
- gid: _index.SheetGidSchema,
153
+ id: _indexts.SpreadsheetIdSchema,
154
+ gid: _indexts.SheetGidSchema,
155
155
  range: _zod.z.string().min(1).describe('A1 notation range to fetch (e.g., "B5", "A5:D5", "B:B", "5:5")'),
156
156
  render: _zod.z.enum([
157
157
  'FORMATTED_VALUE',
@@ -163,7 +163,7 @@ var inputSchema = _zod.z.object({
163
163
  var successBranchSchema = _zod.z.object({
164
164
  type: _zod.z.literal('success'),
165
165
  range: _zod.z.string().describe('The A1 notation range that was retrieved'),
166
- rows: _zod.z.array(_zod.z.array(_index.SheetCellSchema)).describe('2D array of row data (each inner array is a row)')
166
+ rows: _zod.z.array(_zod.z.array(_indexts.SheetCellSchema)).describe('2D array of row data (each inner array is a row)')
167
167
  });
168
168
  // Output schema with auth_required support
169
169
  var outputSchema = _zod.z.discriminatedUnion('type', [
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/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.js';\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/Projects/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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"}
@@ -12,7 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
15
+ var _indexts = require("../../schemas/index.js");
16
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
17
17
  try {
18
18
  var info = gen[key](arg);
@@ -151,9 +151,9 @@ function _ts_generator(thisArg, body) {
151
151
  var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
152
152
  // Note: Using contextual descriptions for source/destination IDs since they describe different spreadsheets/sheets
153
153
  var inputSchema = _zod.z.object({
154
- sourceId: _index.SpreadsheetIdSchema.describe('Source spreadsheet ID'),
155
- sourceGid: _index.SheetGidSchema.describe('Source sheet grid ID to copy'),
156
- destinationId: _index.SpreadsheetIdSchema.describe('Destination spreadsheet ID'),
154
+ sourceId: _indexts.SpreadsheetIdSchema.describe('Source spreadsheet ID'),
155
+ sourceGid: _indexts.SheetGidSchema.describe('Source sheet grid ID to copy'),
156
+ destinationId: _indexts.SpreadsheetIdSchema.describe('Destination spreadsheet ID'),
157
157
  newTitle: _zod.z.coerce.string().trim().min(1).optional().describe('New name for the copied sheet (optional, will use auto-generated name if not provided)')
158
158
  });
159
159
  // Success branch schema
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/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.js';\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/Projects/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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"}
@@ -12,7 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
15
+ var _indexts = require("../../schemas/index.js");
16
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
17
17
  try {
18
18
  var info = gen[key](arg);
@@ -183,13 +183,13 @@ var copyItemSchema = _zod.z.object({
183
183
  insertIndex: _zod.z.number().int().min(0).optional().describe('Position to insert the new sheet (0-indexed)')
184
184
  });
185
185
  var inputSchema = _zod.z.object({
186
- id: _index.SpreadsheetIdSchema,
187
- gid: _index.SheetGidSchema,
186
+ id: _indexts.SpreadsheetIdSchema,
187
+ gid: _indexts.SheetGidSchema,
188
188
  copies: _zod.z.array(copyItemSchema).min(1).max(MAX_BATCH_SIZE).describe('Array of copies to create from the source sheet')
189
189
  });
190
190
  // Created sheet info
191
191
  var createdSheetSchema = _zod.z.object({
192
- gid: _index.SheetGidOutput,
192
+ gid: _indexts.SheetGidOutput,
193
193
  title: _zod.z.string().describe('Title of the created sheet'),
194
194
  sheetUrl: _zod.z.string().describe('URL of the created sheet')
195
195
  });
@@ -200,7 +200,7 @@ var successBranchSchema = _zod.z.object({
200
200
  itemsProcessed: _zod.z.number().describe('Total copies attempted'),
201
201
  itemsChanged: _zod.z.number().describe('Successfully created copies'),
202
202
  completedAt: _zod.z.string().describe('ISO datetime when operation completed'),
203
- id: _index.SpreadsheetIdOutput,
203
+ id: _indexts.SpreadsheetIdOutput,
204
204
  sourceGid: _zod.z.string().describe('Source sheet ID'),
205
205
  sourceTitle: _zod.z.string().describe('Source sheet title'),
206
206
  items: _zod.z.array(createdSheetSchema).describe('Information about created sheets'),
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/sheet-copy.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.js';\n\nconst MAX_BATCH_SIZE = 100;\n\nconst copyItemSchema = z.object({\n newTitle: z.coerce.string().trim().min(1).describe('Name for the copied sheet'),\n insertIndex: z.number().int().min(0).optional().describe('Position to insert the new sheet (0-indexed)'),\n});\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n copies: z.array(copyItemSchema).min(1).max(MAX_BATCH_SIZE).describe('Array of copies to create from the source sheet'),\n});\n\n// Created sheet info\nconst createdSheetSchema = z.object({\n gid: SheetGidOutput,\n title: z.string().describe('Title of the created sheet'),\n sheetUrl: z.string().describe('URL of the created sheet'),\n});\n\n// Success branch schema - uses items: for consistency with standard vocabulary\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 copies attempted'),\n itemsChanged: z.number().describe('Successfully created copies'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n id: SpreadsheetIdOutput,\n sourceGid: z.string().describe('Source sheet ID'),\n sourceTitle: z.string().describe('Source sheet title'),\n items: z.array(createdSheetSchema).describe('Information about created sheets'),\n failures: z\n .array(\n z.object({\n title: z.string(),\n error: z.string(),\n })\n )\n .optional()\n .describe('Failed copies with error messages'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Copy a sheet/tab within the same spreadsheet. Supports batch copying: create multiple copies from a single source sheet (e.g., create 12 monthly sheets from a template). Copies all data, formatting, charts, and conditional formatting verbatim.',\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, copies }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.copy called', { id, gid, copyCount: copies.length });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // First, get the source sheet info\n const spreadsheetInfo = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n const sourceSheet = spreadsheetInfo.data.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sourceSheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Source sheet with gid \"${gid}\" not found in spreadsheet`);\n }\n\n const sourceTitle = sourceSheet.properties.title || '';\n const sourceSheetId = Number(gid);\n\n // Execute copies using Promise.allSettled for partial failure handling\n const results = await Promise.allSettled(\n copies.map(async (copy) => {\n const response = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: [\n {\n duplicateSheet: {\n sourceSheetId,\n newSheetName: copy.newTitle,\n ...(copy.insertIndex !== undefined && { insertSheetIndex: copy.insertIndex }),\n },\n },\n ],\n },\n });\n\n const newSheetId = response.data.replies?.[0]?.duplicateSheet?.properties?.sheetId;\n const newTitle = response.data.replies?.[0]?.duplicateSheet?.properties?.title;\n\n if (!newSheetId || !newTitle) {\n throw new Error('Failed to retrieve new sheet info from API response');\n }\n\n return {\n gid: String(newSheetId),\n title: newTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${newSheetId}`,\n };\n })\n );\n\n // Separate successes and failures\n const items: Array<{ gid: string; title: string; sheetUrl: string }> = [];\n const failures: Array<{ title: string; error: string }> = [];\n\n results.forEach((result, index) => {\n const copy = copies[index];\n if (!copy) return;\n\n if (result.status === 'fulfilled') {\n items.push(result.value);\n } else {\n const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason);\n failures.push({ title: copy.newTitle, error: errorMessage });\n }\n });\n\n const successCount = items.length;\n const failureCount = failures.length;\n const totalCount = copies.length;\n\n const summary = failureCount === 0 ? `Created ${successCount} cop${successCount === 1 ? 'y' : 'ies'} of \"${sourceTitle}\"` : `Created ${successCount} of ${totalCount} cop${totalCount === 1 ? 'y' : 'ies'} (${failureCount} failed)`;\n\n logger.info('sheets.sheet.copy completed', { totalCount, successCount, failureCount });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: summary,\n itemsProcessed: totalCount,\n itemsChanged: successCount,\n completedAt: new Date().toISOString(),\n id,\n sourceGid: gid,\n sourceTitle,\n items,\n ...(failures.length > 0 && { failures }),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n if (error instanceof McpError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.copy error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error copying sheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-copy',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","MAX_BATCH_SIZE","copyItemSchema","z","object","newTitle","coerce","string","trim","min","describe","insertIndex","number","int","optional","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","copies","array","max","createdSheetSchema","SheetGidOutput","title","sheetUrl","successBranchSchema","type","literal","operationSummary","itemsProcessed","itemsChanged","completedAt","SpreadsheetIdOutput","sourceGid","sourceTitle","items","failures","error","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetInfo","sheets","sourceSheet","sourceSheetId","results","successCount","failureCount","totalCount","summary","message","info","copyCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","Number","Promise","allSettled","map","copy","response","newSheetId","batchUpdate","requestBody","requests","duplicateSheet","newSheetName","undefined","insertSheetIndex","replies","Error","forEach","index","status","push","value","errorMessage","reason","Date","toISOString","content","text","JSON","stringify","structuredContent","InternalError","stack","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/tools/sheet-copy.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';\n\nconst MAX_BATCH_SIZE = 100;\n\nconst copyItemSchema = z.object({\n newTitle: z.coerce.string().trim().min(1).describe('Name for the copied sheet'),\n insertIndex: z.number().int().min(0).optional().describe('Position to insert the new sheet (0-indexed)'),\n});\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n copies: z.array(copyItemSchema).min(1).max(MAX_BATCH_SIZE).describe('Array of copies to create from the source sheet'),\n});\n\n// Created sheet info\nconst createdSheetSchema = z.object({\n gid: SheetGidOutput,\n title: z.string().describe('Title of the created sheet'),\n sheetUrl: z.string().describe('URL of the created sheet'),\n});\n\n// Success branch schema - uses items: for consistency with standard vocabulary\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 copies attempted'),\n itemsChanged: z.number().describe('Successfully created copies'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n id: SpreadsheetIdOutput,\n sourceGid: z.string().describe('Source sheet ID'),\n sourceTitle: z.string().describe('Source sheet title'),\n items: z.array(createdSheetSchema).describe('Information about created sheets'),\n failures: z\n .array(\n z.object({\n title: z.string(),\n error: z.string(),\n })\n )\n .optional()\n .describe('Failed copies with error messages'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Copy a sheet/tab within the same spreadsheet. Supports batch copying: create multiple copies from a single source sheet (e.g., create 12 monthly sheets from a template). Copies all data, formatting, charts, and conditional formatting verbatim.',\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, copies }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.copy called', { id, gid, copyCount: copies.length });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // First, get the source sheet info\n const spreadsheetInfo = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n const sourceSheet = spreadsheetInfo.data.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sourceSheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Source sheet with gid \"${gid}\" not found in spreadsheet`);\n }\n\n const sourceTitle = sourceSheet.properties.title || '';\n const sourceSheetId = Number(gid);\n\n // Execute copies using Promise.allSettled for partial failure handling\n const results = await Promise.allSettled(\n copies.map(async (copy) => {\n const response = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: [\n {\n duplicateSheet: {\n sourceSheetId,\n newSheetName: copy.newTitle,\n ...(copy.insertIndex !== undefined && { insertSheetIndex: copy.insertIndex }),\n },\n },\n ],\n },\n });\n\n const newSheetId = response.data.replies?.[0]?.duplicateSheet?.properties?.sheetId;\n const newTitle = response.data.replies?.[0]?.duplicateSheet?.properties?.title;\n\n if (!newSheetId || !newTitle) {\n throw new Error('Failed to retrieve new sheet info from API response');\n }\n\n return {\n gid: String(newSheetId),\n title: newTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${newSheetId}`,\n };\n })\n );\n\n // Separate successes and failures\n const items: Array<{ gid: string; title: string; sheetUrl: string }> = [];\n const failures: Array<{ title: string; error: string }> = [];\n\n results.forEach((result, index) => {\n const copy = copies[index];\n if (!copy) return;\n\n if (result.status === 'fulfilled') {\n items.push(result.value);\n } else {\n const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason);\n failures.push({ title: copy.newTitle, error: errorMessage });\n }\n });\n\n const successCount = items.length;\n const failureCount = failures.length;\n const totalCount = copies.length;\n\n const summary = failureCount === 0 ? `Created ${successCount} cop${successCount === 1 ? 'y' : 'ies'} of \"${sourceTitle}\"` : `Created ${successCount} of ${totalCount} cop${totalCount === 1 ? 'y' : 'ies'} (${failureCount} failed)`;\n\n logger.info('sheets.sheet.copy completed', { totalCount, successCount, failureCount });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: summary,\n itemsProcessed: totalCount,\n itemsChanged: successCount,\n completedAt: new Date().toISOString(),\n id,\n sourceGid: gid,\n sourceTitle,\n items,\n ...(failures.length > 0 && { failures }),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n if (error instanceof McpError) {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.copy error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error copying sheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-copy',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","MAX_BATCH_SIZE","copyItemSchema","z","object","newTitle","coerce","string","trim","min","describe","insertIndex","number","int","optional","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","copies","array","max","createdSheetSchema","SheetGidOutput","title","sheetUrl","successBranchSchema","type","literal","operationSummary","itemsProcessed","itemsChanged","completedAt","SpreadsheetIdOutput","sourceGid","sourceTitle","items","failures","error","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","spreadsheetInfo","sheets","sourceSheet","sourceSheetId","results","successCount","failureCount","totalCount","summary","message","info","copyCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","Number","Promise","allSettled","map","copy","response","newSheetId","batchUpdate","requestBody","requests","duplicateSheet","newSheetName","undefined","insertSheetIndex","replies","Error","forEach","index","status","push","value","errorMessage","reason","Date","toISOString","content","text","JSON","stringify","structuredContent","InternalError","stack","name"],"mappings":"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"}
@@ -12,7 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
15
+ var _indexts = require("../../schemas/index.js");
16
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
17
17
  try {
18
18
  var info = gen[key](arg);
@@ -150,7 +150,7 @@ function _ts_generator(thisArg, body) {
150
150
  }
151
151
  var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
152
152
  var inputSchema = _zod.z.object({
153
- id: _index.SpreadsheetIdSchema,
153
+ id: _indexts.SpreadsheetIdSchema,
154
154
  sheetTitle: _zod.z.coerce.string().trim().min(1).describe('Name for the new sheet tab')
155
155
  });
156
156
  // Success branch schema
@@ -160,8 +160,8 @@ var successBranchSchema = _zod.z.object({
160
160
  itemsProcessed: _zod.z.number().describe('Total items attempted (always 1 for single sheet)'),
161
161
  itemsChanged: _zod.z.number().describe('Successfully created sheets (always 1 on success)'),
162
162
  completedAt: _zod.z.string().describe('ISO datetime when operation completed'),
163
- id: _index.SpreadsheetIdOutput,
164
- gid: _index.SheetGidOutput,
163
+ id: _indexts.SpreadsheetIdOutput,
164
+ gid: _indexts.SheetGidOutput,
165
165
  sheetUrl: _zod.z.string().describe('URL of the created sheet'),
166
166
  sheetTitle: _zod.z.string().describe('Title of the created sheet')
167
167
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/sheet-create.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, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n sheetTitle: z.coerce.string().trim().min(1).describe('Name for the new sheet tab'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n operationSummary: z.string().describe('Summary of the sheet creation operation'),\n itemsProcessed: z.number().describe('Total items attempted (always 1 for single sheet)'),\n itemsChanged: z.number().describe('Successfully created sheets (always 1 on success)'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetUrl: z.string().describe('URL of the created sheet'),\n sheetTitle: z.string().describe('Title of the created sheet'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Create a new sheet/tab in the spreadsheet/workbook',\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, sheetTitle }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.create called', { id, sheetTitle });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n const response = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: [{ addSheet: { properties: { title: sheetTitle } } }],\n },\n });\n const batchResult = response.data;\n const sheetId = batchResult.replies?.[0]?.addSheet?.properties?.sheetId;\n if (!sheetId) {\n throw new Error('Failed to retrieve sheetId from Google Sheets API response');\n }\n logger.info('sheets.sheet.create success', { id, sheetTitle, sheetId });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: `Created sheet \"${sheetTitle}\"`,\n itemsProcessed: 1,\n itemsChanged: 1,\n completedAt: new Date().toISOString(),\n id,\n gid: String(sheetId),\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`,\n sheetTitle,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.create error', { error: message });\n\n // Throw McpError for proper MCP error handling\n throw new McpError(ErrorCode.InternalError, `Error creating sheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-create',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","sheetTitle","coerce","string","trim","min","describe","successBranchSchema","type","literal","operationSummary","itemsProcessed","number","itemsChanged","completedAt","SpreadsheetIdOutput","gid","SheetGidOutput","sheetUrl","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","batchResult","sheets","response","sheetId","error","message","info","google","version","auth","authContext","spreadsheets","batchUpdate","spreadsheetId","requestBody","requests","addSheet","properties","title","data","replies","Error","Date","toISOString","String","content","text","JSON","stringify","structuredContent","McpError","ErrorCode","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/tools/sheet-create.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, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n sheetTitle: z.coerce.string().trim().min(1).describe('Name for the new sheet tab'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n operationSummary: z.string().describe('Summary of the sheet creation operation'),\n itemsProcessed: z.number().describe('Total items attempted (always 1 for single sheet)'),\n itemsChanged: z.number().describe('Successfully created sheets (always 1 on success)'),\n completedAt: z.string().describe('ISO datetime when operation completed'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetUrl: z.string().describe('URL of the created sheet'),\n sheetTitle: z.string().describe('Title of the created sheet'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Create a new sheet/tab in the spreadsheet/workbook',\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, sheetTitle }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.sheet.create called', { id, sheetTitle });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n const response = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: [{ addSheet: { properties: { title: sheetTitle } } }],\n },\n });\n const batchResult = response.data;\n const sheetId = batchResult.replies?.[0]?.addSheet?.properties?.sheetId;\n if (!sheetId) {\n throw new Error('Failed to retrieve sheetId from Google Sheets API response');\n }\n logger.info('sheets.sheet.create success', { id, sheetTitle, sheetId });\n\n const result: Output = {\n type: 'success' as const,\n operationSummary: `Created sheet \"${sheetTitle}\"`,\n itemsProcessed: 1,\n itemsChanged: 1,\n completedAt: new Date().toISOString(),\n id,\n gid: String(sheetId),\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`,\n sheetTitle,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.sheet.create error', { error: message });\n\n // Throw McpError for proper MCP error handling\n throw new McpError(ErrorCode.InternalError, `Error creating sheet: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'sheet-create',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","SpreadsheetIdSchema","sheetTitle","coerce","string","trim","min","describe","successBranchSchema","type","literal","operationSummary","itemsProcessed","number","itemsChanged","completedAt","SpreadsheetIdOutput","gid","SheetGidOutput","sheetUrl","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","batchResult","sheets","response","sheetId","error","message","info","google","version","auth","authContext","spreadsheets","batchUpdate","spreadsheetId","requestBody","requests","addSheet","properties","title","data","replies","Error","Date","toISOString","String","content","text","JSON","stringify","structuredContent","McpError","ErrorCode","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -12,7 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
15
+ var _indexts = require("../../schemas/index.js");
16
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
17
17
  try {
18
18
  var info = gen[key](arg);
@@ -179,8 +179,8 @@ function _ts_generator(thisArg, body) {
179
179
  var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
180
180
  var MAX_BATCH_SIZE = 1000;
181
181
  var inputSchema = _zod.z.object({
182
- id: _index.SpreadsheetIdSchema,
183
- gids: _zod.z.array(_index.SheetGidSchema).min(1).max(MAX_BATCH_SIZE).describe('Sheet grid IDs to permanently delete')
182
+ id: _indexts.SpreadsheetIdSchema,
183
+ gids: _zod.z.array(_indexts.SheetGidSchema).min(1).max(MAX_BATCH_SIZE).describe('Sheet grid IDs to permanently delete')
184
184
  });
185
185
  var successBranchSchema = _zod.z.object({
186
186
  type: _zod.z.literal('success'),
@@ -189,7 +189,7 @@ var successBranchSchema = _zod.z.object({
189
189
  itemsChanged: _zod.z.number().describe('Number of sheets successfully deleted'),
190
190
  completedAt: _zod.z.string().describe('ISO timestamp when operation completed'),
191
191
  recoverable: _zod.z.literal(false).describe('Whether deletion can be undone (always false)'),
192
- id: _index.SpreadsheetIdOutput,
192
+ id: _indexts.SpreadsheetIdOutput,
193
193
  spreadsheetUrl: _zod.z.string().optional().describe('URL to view the spreadsheet'),
194
194
  failures: _zod.z.array(_zod.z.object({
195
195
  gid: _zod.z.string().describe('Grid ID of sheet that failed to delete'),