@mcp-z/mcp-sheets 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +3 -2
  2. package/dist/cjs/constants.js.map +1 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/lib/create-store.js.map +1 -1
  5. package/dist/cjs/mcp/index.js.map +1 -1
  6. package/dist/cjs/mcp/prompts/a1-notation.js +1 -1
  7. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -1
  8. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  9. package/dist/cjs/mcp/resources/index.js.map +1 -1
  10. package/dist/cjs/mcp/resources/spreadsheet.js +1 -1
  11. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -1
  12. package/dist/cjs/mcp/tools/cells-format.js +4 -2
  13. package/dist/cjs/mcp/tools/cells-format.js.map +1 -1
  14. package/dist/cjs/mcp/tools/chart-create.js +4 -2
  15. package/dist/cjs/mcp/tools/chart-create.js.map +1 -1
  16. package/dist/cjs/mcp/tools/columns-get.js +1 -0
  17. package/dist/cjs/mcp/tools/columns-get.js.map +1 -1
  18. package/dist/cjs/mcp/tools/columns-update.js +1 -0
  19. package/dist/cjs/mcp/tools/columns-update.js.map +1 -1
  20. package/dist/cjs/mcp/tools/csv-get-columns.js +1 -0
  21. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -1
  22. package/dist/cjs/mcp/tools/dimensions-batch-update.js +1 -0
  23. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -1
  24. package/dist/cjs/mcp/tools/dimensions-move.js +1 -0
  25. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -1
  26. package/dist/cjs/mcp/tools/index.d.cts +1 -0
  27. package/dist/cjs/mcp/tools/index.d.ts +1 -0
  28. package/dist/cjs/mcp/tools/index.js +4 -0
  29. package/dist/cjs/mcp/tools/index.js.map +1 -1
  30. package/dist/cjs/mcp/tools/lib/dimension-operations.d.cts +2 -2
  31. package/dist/cjs/mcp/tools/lib/dimension-operations.d.ts +2 -2
  32. package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -1
  33. package/dist/cjs/mcp/tools/rows-append.js +1 -0
  34. package/dist/cjs/mcp/tools/rows-append.js.map +1 -1
  35. package/dist/cjs/mcp/tools/rows-csv-append.js +2 -1
  36. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -1
  37. package/dist/cjs/mcp/tools/rows-get.js +1 -0
  38. package/dist/cjs/mcp/tools/rows-get.js.map +1 -1
  39. package/dist/cjs/mcp/tools/sheet-copy-to.js +1 -0
  40. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -1
  41. package/dist/cjs/mcp/tools/sheet-copy.js +1 -0
  42. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -1
  43. package/dist/cjs/mcp/tools/sheet-create.js +1 -0
  44. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -1
  45. package/dist/cjs/mcp/tools/sheet-delete.js +1 -0
  46. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -1
  47. package/dist/cjs/mcp/tools/sheet-find.js +1 -0
  48. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -1
  49. package/dist/cjs/mcp/tools/sheet-rename.js +1 -0
  50. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -1
  51. package/dist/cjs/mcp/tools/spreadsheet-copy.js +1 -0
  52. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -1
  53. package/dist/cjs/mcp/tools/spreadsheet-create.js +1 -0
  54. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -1
  55. package/dist/cjs/mcp/tools/spreadsheet-find.js +1 -0
  56. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -1
  57. package/dist/cjs/mcp/tools/spreadsheet-rename.js +1 -0
  58. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -1
  59. package/dist/cjs/mcp/tools/validation-set.js +1 -0
  60. package/dist/cjs/mcp/tools/validation-set.js.map +1 -1
  61. package/dist/cjs/mcp/tools/values-batch-update.d.cts +1 -1
  62. package/dist/cjs/mcp/tools/values-batch-update.d.ts +1 -1
  63. package/dist/cjs/mcp/tools/values-batch-update.js +2 -1
  64. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -1
  65. package/dist/cjs/mcp/tools/values-clear.js +1 -0
  66. package/dist/cjs/mcp/tools/values-clear.js.map +1 -1
  67. package/dist/cjs/mcp/tools/values-csv-update.js +1 -0
  68. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -1
  69. package/dist/cjs/mcp/tools/values-markdown-update.d.cts +76 -0
  70. package/dist/cjs/mcp/tools/values-markdown-update.d.ts +76 -0
  71. package/dist/cjs/mcp/tools/values-markdown-update.js +413 -0
  72. package/dist/cjs/mcp/tools/values-markdown-update.js.map +1 -0
  73. package/dist/cjs/mcp/tools/values-replace.js +1 -0
  74. package/dist/cjs/mcp/tools/values-replace.js.map +1 -1
  75. package/dist/cjs/mcp/tools/values-search.js +2 -1
  76. package/dist/cjs/mcp/tools/values-search.js.map +1 -1
  77. package/dist/cjs/schemas/index.js.map +1 -1
  78. package/dist/cjs/setup/config.js.map +1 -1
  79. package/dist/cjs/setup/http.js +1 -1
  80. package/dist/cjs/setup/http.js.map +1 -1
  81. package/dist/cjs/setup/index.js.map +1 -1
  82. package/dist/cjs/setup/oauth-google.js +3 -2
  83. package/dist/cjs/setup/oauth-google.js.map +1 -1
  84. package/dist/cjs/setup/runtime.d.cts +1 -1
  85. package/dist/cjs/setup/runtime.d.ts +1 -1
  86. package/dist/cjs/setup/runtime.js +1 -1
  87. package/dist/cjs/setup/runtime.js.map +1 -1
  88. package/dist/cjs/setup/stdio.js +1 -1
  89. package/dist/cjs/setup/stdio.js.map +1 -1
  90. package/dist/cjs/spreadsheet/column-utilities.js.map +1 -1
  91. package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -1
  92. package/dist/cjs/spreadsheet/data-operations.js +4 -3
  93. package/dist/cjs/spreadsheet/data-operations.js.map +1 -1
  94. package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -1
  95. package/dist/cjs/spreadsheet/markdown-runs.d.cts +67 -0
  96. package/dist/cjs/spreadsheet/markdown-runs.d.ts +67 -0
  97. package/dist/cjs/spreadsheet/markdown-runs.js +441 -0
  98. package/dist/cjs/spreadsheet/markdown-runs.js.map +1 -0
  99. package/dist/cjs/spreadsheet/range-operations.d.cts +1 -1
  100. package/dist/cjs/spreadsheet/range-operations.d.ts +1 -1
  101. package/dist/cjs/spreadsheet/range-operations.js.map +1 -1
  102. package/dist/cjs/spreadsheet/sheet-operations.d.cts +1 -1
  103. package/dist/cjs/spreadsheet/sheet-operations.d.ts +1 -1
  104. package/dist/cjs/spreadsheet/sheet-operations.js +1 -1
  105. package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -1
  106. package/dist/cjs/spreadsheet/spreadsheet-management.d.cts +8 -8
  107. package/dist/cjs/spreadsheet/spreadsheet-management.d.ts +8 -8
  108. package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -1
  109. package/dist/esm/constants.js.map +1 -1
  110. package/dist/esm/index.js.map +1 -1
  111. package/dist/esm/lib/create-store.js.map +1 -1
  112. package/dist/esm/mcp/index.js.map +1 -1
  113. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -1
  114. package/dist/esm/mcp/prompts/index.js.map +1 -1
  115. package/dist/esm/mcp/resources/index.js.map +1 -1
  116. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -1
  117. package/dist/esm/mcp/tools/cells-format.js +3 -2
  118. package/dist/esm/mcp/tools/cells-format.js.map +1 -1
  119. package/dist/esm/mcp/tools/chart-create.js +3 -2
  120. package/dist/esm/mcp/tools/chart-create.js.map +1 -1
  121. package/dist/esm/mcp/tools/columns-get.js.map +1 -1
  122. package/dist/esm/mcp/tools/columns-update.js.map +1 -1
  123. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -1
  124. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -1
  125. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -1
  126. package/dist/esm/mcp/tools/index.d.ts +1 -0
  127. package/dist/esm/mcp/tools/index.js +1 -0
  128. package/dist/esm/mcp/tools/index.js.map +1 -1
  129. package/dist/esm/mcp/tools/lib/dimension-operations.d.ts +2 -2
  130. package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -1
  131. package/dist/esm/mcp/tools/rows-append.js.map +1 -1
  132. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -1
  133. package/dist/esm/mcp/tools/rows-get.js.map +1 -1
  134. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -1
  135. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -1
  136. package/dist/esm/mcp/tools/sheet-create.js.map +1 -1
  137. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -1
  138. package/dist/esm/mcp/tools/sheet-find.js.map +1 -1
  139. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -1
  140. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -1
  141. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -1
  142. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -1
  143. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -1
  144. package/dist/esm/mcp/tools/validation-set.js.map +1 -1
  145. package/dist/esm/mcp/tools/values-batch-update.d.ts +1 -1
  146. package/dist/esm/mcp/tools/values-batch-update.js +1 -1
  147. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -1
  148. package/dist/esm/mcp/tools/values-clear.js.map +1 -1
  149. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -1
  150. package/dist/esm/mcp/tools/values-markdown-update.d.ts +76 -0
  151. package/dist/esm/mcp/tools/values-markdown-update.js +216 -0
  152. package/dist/esm/mcp/tools/values-markdown-update.js.map +1 -0
  153. package/dist/esm/mcp/tools/values-replace.js.map +1 -1
  154. package/dist/esm/mcp/tools/values-search.js.map +1 -1
  155. package/dist/esm/schemas/index.js.map +1 -1
  156. package/dist/esm/setup/config.js.map +1 -1
  157. package/dist/esm/setup/http.js.map +1 -1
  158. package/dist/esm/setup/index.js.map +1 -1
  159. package/dist/esm/setup/oauth-google.js.map +1 -1
  160. package/dist/esm/setup/runtime.d.ts +1 -1
  161. package/dist/esm/setup/runtime.js.map +1 -1
  162. package/dist/esm/setup/stdio.js.map +1 -1
  163. package/dist/esm/spreadsheet/column-utilities.js.map +1 -1
  164. package/dist/esm/spreadsheet/csv-streaming.js.map +1 -1
  165. package/dist/esm/spreadsheet/data-operations.js.map +1 -1
  166. package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -1
  167. package/dist/esm/spreadsheet/markdown-runs.d.ts +67 -0
  168. package/dist/esm/spreadsheet/markdown-runs.js +325 -0
  169. package/dist/esm/spreadsheet/markdown-runs.js.map +1 -0
  170. package/dist/esm/spreadsheet/range-operations.d.ts +1 -1
  171. package/dist/esm/spreadsheet/range-operations.js.map +1 -1
  172. package/dist/esm/spreadsheet/sheet-operations.d.ts +1 -1
  173. package/dist/esm/spreadsheet/sheet-operations.js.map +1 -1
  174. package/dist/esm/spreadsheet/spreadsheet-management.d.ts +8 -8
  175. package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -1
  176. package/dist/esm/types.js.map +1 -1
  177. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/tools/values-csv-update.ts"],"sourcesContent":["/** Import CSV data to Google Sheets with range-based update (no deduplication) */\n\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { parse } from 'csv-parse';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { A1NotationSchema, SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.ts';\n\n/** Batch size for Sheets API calls (1000 rows × avg 10 cols = 10K cells, well under 40K limit) */\nconst BATCH_SIZE = 1000;\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),\n startRange: A1NotationSchema.default('A1').describe('Top-left cell where CSV data starts (default: A1)'),\n valueInputOption: z.enum(['RAW', 'USER_ENTERED']).default('USER_ENTERED').describe('How to interpret values (RAW = exact, USER_ENTERED = parse formulas/dates)'),\n sourceHasHeaders: z.boolean().default(true).describe('First row is headers (metadata) - exclude from data range. Set to false to include first row as data.'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n spreadsheetTitle: z.string().describe('Spreadsheet title'),\n spreadsheetUrl: z.string().describe('Spreadsheet URL'),\n sheetTitle: z.string().describe('Sheet title'),\n sheetUrl: z.string().describe('Sheet URL'),\n updatedRange: z.string().describe('A1 notation range that was updated'),\n updatedRows: z.number().describe('Number of rows updated'),\n updatedColumns: z.number().describe('Number of columns updated'),\n updatedCells: z.number().describe('Number of cells updated'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Import CSV to sheet range. Overwrites existing data at startRange. Use rows-csv-append for database-style appends with deduplication.',\n inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, gid, sourceUri, startRange, valueInputOption = 'USER_ENTERED', sourceHasHeaders }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.values.csv-update called', { id, gid, sourceUri, startRange, valueInputOption, sourceHasHeaders });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get spreadsheet and sheet info in single API call\n const spreadsheetResponse = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title',\n });\n\n const spreadsheetData = spreadsheetResponse.data;\n\n // Find the sheet by gid\n const sheet = spreadsheetData.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? '';\n\n // Streaming CSV processing state\n let sourceHeaders: string[] = [];\n const allRows: (string | number | boolean | null)[][] = [];\n let totalCols = 0;\n\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser with native streaming\n const parser = readStream.pipe(\n parse({\n columns: !!sourceHasHeaders, // Parse first row as column names if source has headers\n skip_empty_lines: true,\n trim: true,\n cast: true, // Auto-convert numbers/booleans\n relax_column_count: true,\n })\n );\n\n // Stream and collect all rows (with batching for very large files)\n for await (const record of parser) {\n if (sourceHasHeaders) {\n // Extract source headers from first record\n if (sourceHeaders.length === 0) {\n sourceHeaders = Object.keys(record as Record<string, unknown>);\n totalCols = sourceHeaders.length;\n logger.info('sheets.values.csv-update source headers', { sourceHeaders, totalCols });\n }\n\n // Convert record to row array (exclude source headers from data range)\n // CSV values are strings/numbers/booleans/nulls from the parser\n const row = sourceHeaders.map((header) => (record as Record<string, string | number | boolean | null>)[header] ?? null);\n allRows.push(row);\n } else {\n // sourceHasHeaders=false: record is an array, include all rows (including first row)\n const row = record as (string | number | boolean | null)[];\n allRows.push(row);\n\n if (totalCols === 0) {\n totalCols = row.length;\n }\n }\n }\n\n if (allRows.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'CSV file is empty');\n }\n\n // Prepare data for update (all rows)\n const dataToWrite: (string | number | boolean | null)[][] = allRows;\n\n // For large datasets, use batchUpdate to write in chunks\n // This respects the 40K cell limit per request\n const batchRequests = [];\n const currentRow = startRange.match(/[A-Z]+(\\d+)/)?.[1] || '1';\n let currentRowNum = Number.parseInt(currentRow, 10);\n\n for (let i = 0; i < dataToWrite.length; i += BATCH_SIZE) {\n const batchData = dataToWrite.slice(i, i + BATCH_SIZE);\n const batchRange = `${sheetTitle}!${startRange.match(/[A-Z]+/)?.[0]}${currentRowNum}`;\n\n batchRequests.push({\n range: batchRange,\n values: batchData,\n });\n\n currentRowNum += batchData.length;\n }\n\n logger.info('sheets.values.csv-update batching', { totalBatches: batchRequests.length, batchSize: BATCH_SIZE });\n\n // Execute batch update\n const batchUpdateResponse = await sheets.spreadsheets.values.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n valueInputOption,\n data: batchRequests,\n },\n });\n\n const totalUpdatedCells = batchUpdateResponse.data.totalUpdatedCells || 0;\n const totalUpdatedRows = batchUpdateResponse.data.totalUpdatedRows || 0;\n const totalUpdatedColumns = batchUpdateResponse.data.totalUpdatedColumns || 0;\n const firstUpdatedRange = batchUpdateResponse.data.responses?.[0]?.updatedRange || `${sheetTitle}!${startRange}`;\n\n logger.info('sheets.values.csv-update completed', { id, gid: sheet.properties.sheetId, updatedRange: firstUpdatedRange, updatedRows: totalUpdatedRows, sourceUri });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheet.properties.sheetId ?? ''),\n spreadsheetTitle: spreadsheetData.properties?.title ?? '',\n spreadsheetUrl: spreadsheetData.spreadsheetUrl ?? `https://docs.google.com/spreadsheets/d/${id}`,\n sheetTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheet.properties.sheetId}`,\n updatedRange: firstUpdatedRange,\n updatedRows: totalUpdatedRows,\n updatedColumns: totalUpdatedColumns,\n updatedCells: totalUpdatedCells,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.values.csv-update error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error updating values from CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'values-csv-update',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BATCH_SIZE","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","sourceUri","string","trim","min","describe","startRange","A1NotationSchema","default","valueInputOption","enum","sourceHasHeaders","boolean","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","spreadsheetTitle","spreadsheetUrl","sheetTitle","sheetUrl","updatedRange","updatedRows","number","updatedColumns","updatedCells","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sheet","spreadsheetData","batchUpdateResponse","sheets","spreadsheetResponse","sourceHeaders","allRows","totalCols","readStream","parser","dataToWrite","batchRequests","currentRow","currentRowNum","i","batchData","batchRange","totalUpdatedCells","totalUpdatedRows","totalUpdatedColumns","firstUpdatedRange","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","title","getCsvReadStream","pipe","parse","columns","skip_empty_lines","cast","relax_column_count","record","length","Object","keys","row","map","header","push","match","Number","parseInt","slice","range","values","totalBatches","batchSize","batchUpdate","requestBody","responses","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/mcp/tools/values-csv-update.ts"],"sourcesContent":["/** Import CSV data to Google Sheets with range-based update (no deduplication) */\n\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { parse } from 'csv-parse';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { A1NotationSchema, SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.ts';\n\n/** Batch size for Sheets API calls (1000 rows × avg 10 cols = 10K cells, well under 40K limit) */\nconst BATCH_SIZE = 1000;\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),\n startRange: A1NotationSchema.default('A1').describe('Top-left cell where CSV data starts (default: A1)'),\n valueInputOption: z.enum(['RAW', 'USER_ENTERED']).default('USER_ENTERED').describe('How to interpret values (RAW = exact, USER_ENTERED = parse formulas/dates)'),\n sourceHasHeaders: z.boolean().default(true).describe('First row is headers (metadata) - exclude from data range. Set to false to include first row as data.'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n spreadsheetTitle: z.string().describe('Spreadsheet title'),\n spreadsheetUrl: z.string().describe('Spreadsheet URL'),\n sheetTitle: z.string().describe('Sheet title'),\n sheetUrl: z.string().describe('Sheet URL'),\n updatedRange: z.string().describe('A1 notation range that was updated'),\n updatedRows: z.number().describe('Number of rows updated'),\n updatedColumns: z.number().describe('Number of columns updated'),\n updatedCells: z.number().describe('Number of cells updated'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Import CSV to sheet range. Overwrites existing data at startRange. Use rows-csv-append for database-style appends with deduplication.',\n inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, gid, sourceUri, startRange, valueInputOption = 'USER_ENTERED', sourceHasHeaders }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.values.csv-update called', { id, gid, sourceUri, startRange, valueInputOption, sourceHasHeaders });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get spreadsheet and sheet info in single API call\n const spreadsheetResponse = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title',\n });\n\n const spreadsheetData = spreadsheetResponse.data;\n\n // Find the sheet by gid\n const sheet = spreadsheetData.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? '';\n\n // Streaming CSV processing state\n let sourceHeaders: string[] = [];\n const allRows: (string | number | boolean | null)[][] = [];\n let totalCols = 0;\n\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser with native streaming\n const parser = readStream.pipe(\n parse({\n columns: !!sourceHasHeaders, // Parse first row as column names if source has headers\n skip_empty_lines: true,\n trim: true,\n cast: true, // Auto-convert numbers/booleans\n relax_column_count: true,\n })\n );\n\n // Stream and collect all rows (with batching for very large files)\n for await (const record of parser) {\n if (sourceHasHeaders) {\n // Extract source headers from first record\n if (sourceHeaders.length === 0) {\n sourceHeaders = Object.keys(record as Record<string, unknown>);\n totalCols = sourceHeaders.length;\n logger.info('sheets.values.csv-update source headers', { sourceHeaders, totalCols });\n }\n\n // Convert record to row array (exclude source headers from data range)\n // CSV values are strings/numbers/booleans/nulls from the parser\n const row = sourceHeaders.map((header) => (record as Record<string, string | number | boolean | null>)[header] ?? null);\n allRows.push(row);\n } else {\n // sourceHasHeaders=false: record is an array, include all rows (including first row)\n const row = record as (string | number | boolean | null)[];\n allRows.push(row);\n\n if (totalCols === 0) {\n totalCols = row.length;\n }\n }\n }\n\n if (allRows.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'CSV file is empty');\n }\n\n // Prepare data for update (all rows)\n const dataToWrite: (string | number | boolean | null)[][] = allRows;\n\n // For large datasets, use batchUpdate to write in chunks\n // This respects the 40K cell limit per request\n const batchRequests = [];\n const currentRow = startRange.match(/[A-Z]+(\\d+)/)?.[1] || '1';\n let currentRowNum = Number.parseInt(currentRow, 10);\n\n for (let i = 0; i < dataToWrite.length; i += BATCH_SIZE) {\n const batchData = dataToWrite.slice(i, i + BATCH_SIZE);\n const batchRange = `${sheetTitle}!${startRange.match(/[A-Z]+/)?.[0]}${currentRowNum}`;\n\n batchRequests.push({\n range: batchRange,\n values: batchData,\n });\n\n currentRowNum += batchData.length;\n }\n\n logger.info('sheets.values.csv-update batching', { totalBatches: batchRequests.length, batchSize: BATCH_SIZE });\n\n // Execute batch update\n const batchUpdateResponse = await sheets.spreadsheets.values.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n valueInputOption,\n data: batchRequests,\n },\n });\n\n const totalUpdatedCells = batchUpdateResponse.data.totalUpdatedCells || 0;\n const totalUpdatedRows = batchUpdateResponse.data.totalUpdatedRows || 0;\n const totalUpdatedColumns = batchUpdateResponse.data.totalUpdatedColumns || 0;\n const firstUpdatedRange = batchUpdateResponse.data.responses?.[0]?.updatedRange || `${sheetTitle}!${startRange}`;\n\n logger.info('sheets.values.csv-update completed', { id, gid: sheet.properties.sheetId, updatedRange: firstUpdatedRange, updatedRows: totalUpdatedRows, sourceUri });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheet.properties.sheetId ?? ''),\n spreadsheetTitle: spreadsheetData.properties?.title ?? '',\n spreadsheetUrl: spreadsheetData.spreadsheetUrl ?? `https://docs.google.com/spreadsheets/d/${id}`,\n sheetTitle,\n sheetUrl: `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheet.properties.sheetId}`,\n updatedRange: firstUpdatedRange,\n updatedRows: totalUpdatedRows,\n updatedColumns: totalUpdatedColumns,\n updatedCells: totalUpdatedCells,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('sheets.values.csv-update error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error updating values from CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'values-csv-update',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BATCH_SIZE","inputSchema","z","object","id","SpreadsheetIdSchema","gid","SheetGidSchema","sourceUri","string","trim","min","describe","startRange","A1NotationSchema","default","valueInputOption","enum","sourceHasHeaders","boolean","successBranchSchema","type","literal","SpreadsheetIdOutput","SheetGidOutput","spreadsheetTitle","spreadsheetUrl","sheetTitle","sheetUrl","updatedRange","updatedRows","number","updatedColumns","updatedCells","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sheet","spreadsheetData","batchUpdateResponse","sheets","spreadsheetResponse","sourceHeaders","allRows","totalCols","readStream","parser","dataToWrite","batchRequests","currentRow","currentRowNum","i","batchData","batchRange","totalUpdatedCells","totalUpdatedRows","totalUpdatedColumns","firstUpdatedRange","error","message","info","google","version","auth","authContext","spreadsheets","get","spreadsheetId","fields","data","find","s","String","properties","sheetId","McpError","ErrorCode","InvalidParams","title","getCsvReadStream","pipe","parse","columns","skip_empty_lines","cast","relax_column_count","record","length","Object","keys","row","map","header","push","match","Number","parseInt","slice","range","values","totalBatches","batchSize","batchUpdate","requestBody","responses","content","text","JSON","stringify","structuredContent","Error","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ gid: z.ZodCoercedString<unknown>;
7
+ requests: z.ZodArray<z.ZodObject<{
8
+ cell: z.ZodString;
9
+ text: z.ZodString;
10
+ }, z.core.$strip>>;
11
+ }, z.core.$strip>;
12
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
13
+ type: z.ZodLiteral<"success">;
14
+ id: z.ZodString;
15
+ gid: z.ZodString;
16
+ sheetTitle: z.ZodString;
17
+ sheetUrl: z.ZodString;
18
+ successCount: z.ZodNumber;
19
+ cells: z.ZodArray<z.ZodObject<{
20
+ cell: z.ZodString;
21
+ text: z.ZodString;
22
+ linkCount: z.ZodNumber;
23
+ }, z.core.$strip>>;
24
+ failedCells: z.ZodOptional<z.ZodArray<z.ZodObject<{
25
+ cell: z.ZodString;
26
+ error: z.ZodString;
27
+ }, z.core.$strip>>>;
28
+ }, z.core.$strip>, z.ZodObject<{
29
+ type: z.ZodLiteral<"auth_required">;
30
+ provider: z.ZodString;
31
+ message: z.ZodString;
32
+ url: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>], "type">;
34
+ export type Input = z.infer<typeof inputSchema>;
35
+ export type Output = z.infer<typeof outputSchema>;
36
+ declare function handler({ id, gid, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
37
+ export default function createTool(): {
38
+ name: string;
39
+ config: {
40
+ readonly description: "Replace cell content with text parsed from inline markdown. Supports [label](url) links, bare URLs, **bold**, *italic*, ~~strikethrough~~ — the only way to put MULTIPLE clickable links in one cell. Block syntax (headers, lists, tables) and other unsupported markdown is written as literal text. Writes text cells only — no formula or number coercion. For whole-cell formatting (colors, borders, number formats) use cells-format.";
41
+ readonly inputSchema: z.ZodObject<{
42
+ id: z.ZodString;
43
+ gid: z.ZodCoercedString<unknown>;
44
+ requests: z.ZodArray<z.ZodObject<{
45
+ cell: z.ZodString;
46
+ text: z.ZodString;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>;
49
+ readonly outputSchema: z.ZodObject<{
50
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
51
+ type: z.ZodLiteral<"success">;
52
+ id: z.ZodString;
53
+ gid: z.ZodString;
54
+ sheetTitle: z.ZodString;
55
+ sheetUrl: z.ZodString;
56
+ successCount: z.ZodNumber;
57
+ cells: z.ZodArray<z.ZodObject<{
58
+ cell: z.ZodString;
59
+ text: z.ZodString;
60
+ linkCount: z.ZodNumber;
61
+ }, z.core.$strip>>;
62
+ failedCells: z.ZodOptional<z.ZodArray<z.ZodObject<{
63
+ cell: z.ZodString;
64
+ error: z.ZodString;
65
+ }, z.core.$strip>>>;
66
+ }, z.core.$strip>, z.ZodObject<{
67
+ type: z.ZodLiteral<"auth_required">;
68
+ provider: z.ZodString;
69
+ message: z.ZodString;
70
+ url: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strip>], "type">;
72
+ }, z.core.$strip>;
73
+ };
74
+ handler: typeof handler;
75
+ };
76
+ export {};
@@ -0,0 +1,76 @@
1
+ import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ declare const inputSchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ gid: z.ZodCoercedString<unknown>;
7
+ requests: z.ZodArray<z.ZodObject<{
8
+ cell: z.ZodString;
9
+ text: z.ZodString;
10
+ }, z.core.$strip>>;
11
+ }, z.core.$strip>;
12
+ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
13
+ type: z.ZodLiteral<"success">;
14
+ id: z.ZodString;
15
+ gid: z.ZodString;
16
+ sheetTitle: z.ZodString;
17
+ sheetUrl: z.ZodString;
18
+ successCount: z.ZodNumber;
19
+ cells: z.ZodArray<z.ZodObject<{
20
+ cell: z.ZodString;
21
+ text: z.ZodString;
22
+ linkCount: z.ZodNumber;
23
+ }, z.core.$strip>>;
24
+ failedCells: z.ZodOptional<z.ZodArray<z.ZodObject<{
25
+ cell: z.ZodString;
26
+ error: z.ZodString;
27
+ }, z.core.$strip>>>;
28
+ }, z.core.$strip>, z.ZodObject<{
29
+ type: z.ZodLiteral<"auth_required">;
30
+ provider: z.ZodString;
31
+ message: z.ZodString;
32
+ url: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>], "type">;
34
+ export type Input = z.infer<typeof inputSchema>;
35
+ export type Output = z.infer<typeof outputSchema>;
36
+ declare function handler({ id, gid, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
37
+ export default function createTool(): {
38
+ name: string;
39
+ config: {
40
+ readonly description: "Replace cell content with text parsed from inline markdown. Supports [label](url) links, bare URLs, **bold**, *italic*, ~~strikethrough~~ — the only way to put MULTIPLE clickable links in one cell. Block syntax (headers, lists, tables) and other unsupported markdown is written as literal text. Writes text cells only — no formula or number coercion. For whole-cell formatting (colors, borders, number formats) use cells-format.";
41
+ readonly inputSchema: z.ZodObject<{
42
+ id: z.ZodString;
43
+ gid: z.ZodCoercedString<unknown>;
44
+ requests: z.ZodArray<z.ZodObject<{
45
+ cell: z.ZodString;
46
+ text: z.ZodString;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>;
49
+ readonly outputSchema: z.ZodObject<{
50
+ result: z.ZodDiscriminatedUnion<[z.ZodObject<{
51
+ type: z.ZodLiteral<"success">;
52
+ id: z.ZodString;
53
+ gid: z.ZodString;
54
+ sheetTitle: z.ZodString;
55
+ sheetUrl: z.ZodString;
56
+ successCount: z.ZodNumber;
57
+ cells: z.ZodArray<z.ZodObject<{
58
+ cell: z.ZodString;
59
+ text: z.ZodString;
60
+ linkCount: z.ZodNumber;
61
+ }, z.core.$strip>>;
62
+ failedCells: z.ZodOptional<z.ZodArray<z.ZodObject<{
63
+ cell: z.ZodString;
64
+ error: z.ZodString;
65
+ }, z.core.$strip>>>;
66
+ }, z.core.$strip>, z.ZodObject<{
67
+ type: z.ZodLiteral<"auth_required">;
68
+ provider: z.ZodString;
69
+ message: z.ZodString;
70
+ url: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strip>], "type">;
72
+ }, z.core.$strip>;
73
+ };
74
+ handler: typeof handler;
75
+ };
76
+ export {};
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createTool;
9
+ }
10
+ });
11
+ var _oauthgoogle = require("@mcp-z/oauth-google");
12
+ var _types = require("@modelcontextprotocol/sdk/types.js");
13
+ var _googleapis = require("googleapis");
14
+ var _zod = require("zod");
15
+ var _indexts = require("../../schemas/index.js");
16
+ var _markdownrunsts = require("../../spreadsheet/markdown-runs.js");
17
+ var _rangeoperationsts = require("../../spreadsheet/range-operations.js");
18
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
19
+ try {
20
+ var info = gen[key](arg);
21
+ var value = info.value;
22
+ } catch (error) {
23
+ reject(error);
24
+ return;
25
+ }
26
+ if (info.done) {
27
+ resolve(value);
28
+ } else {
29
+ Promise.resolve(value).then(_next, _throw);
30
+ }
31
+ }
32
+ function _async_to_generator(fn) {
33
+ return function() {
34
+ var self = this, args = arguments;
35
+ return new Promise(function(resolve, reject) {
36
+ var gen = fn.apply(self, args);
37
+ function _next(value) {
38
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
39
+ }
40
+ function _throw(err) {
41
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
42
+ }
43
+ _next(undefined);
44
+ });
45
+ };
46
+ }
47
+ function _instanceof(left, right) {
48
+ "@swc/helpers - instanceof";
49
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
50
+ return !!right[Symbol.hasInstance](left);
51
+ } else {
52
+ return left instanceof right;
53
+ }
54
+ }
55
+ function _ts_generator(thisArg, body) {
56
+ var f, y, t, _ = {
57
+ label: 0,
58
+ sent: function() {
59
+ if (t[0] & 1) throw t[1];
60
+ return t[1];
61
+ },
62
+ trys: [],
63
+ ops: []
64
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
65
+ return d(g, "next", {
66
+ value: verb(0)
67
+ }), d(g, "throw", {
68
+ value: verb(1)
69
+ }), d(g, "return", {
70
+ value: verb(2)
71
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
72
+ value: function() {
73
+ return this;
74
+ }
75
+ }), g;
76
+ function verb(n) {
77
+ return function(v) {
78
+ return step([
79
+ n,
80
+ v
81
+ ]);
82
+ };
83
+ }
84
+ function step(op) {
85
+ if (f) throw new TypeError("Generator is already executing.");
86
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
87
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
88
+ if (y = 0, t) op = [
89
+ op[0] & 2,
90
+ t.value
91
+ ];
92
+ switch(op[0]){
93
+ case 0:
94
+ case 1:
95
+ t = op;
96
+ break;
97
+ case 4:
98
+ _.label++;
99
+ return {
100
+ value: op[1],
101
+ done: false
102
+ };
103
+ case 5:
104
+ _.label++;
105
+ y = op[1];
106
+ op = [
107
+ 0
108
+ ];
109
+ continue;
110
+ case 7:
111
+ op = _.ops.pop();
112
+ _.trys.pop();
113
+ continue;
114
+ default:
115
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
116
+ _ = 0;
117
+ continue;
118
+ }
119
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
120
+ _.label = op[1];
121
+ break;
122
+ }
123
+ if (op[0] === 6 && _.label < t[1]) {
124
+ _.label = t[1];
125
+ t = op;
126
+ break;
127
+ }
128
+ if (t && _.label < t[2]) {
129
+ _.label = t[2];
130
+ _.ops.push(op);
131
+ break;
132
+ }
133
+ if (t[2]) _.ops.pop();
134
+ _.trys.pop();
135
+ continue;
136
+ }
137
+ op = body.call(thisArg, _);
138
+ } catch (e) {
139
+ op = [
140
+ 6,
141
+ e
142
+ ];
143
+ y = 0;
144
+ } finally{
145
+ f = t = 0;
146
+ }
147
+ if (op[0] & 5) throw op[1];
148
+ return {
149
+ value: op[0] ? op[1] : void 0,
150
+ done: true
151
+ };
152
+ }
153
+ }
154
+ var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
155
+ // Input schema for a single markdown-cell request
156
+ var MarkdownCellRequestSchema = _zod.z.object({
157
+ cell: _zod.z.string().min(1).describe('Single-cell A1 reference (e.g., "I2"). Multi-cell ranges (e.g., "A1:B2") are rejected as a per-request failure.'),
158
+ text: _zod.z.string().describe('Cell content as inline markdown: [label](url) links, bare URLs, **bold**, *italic*, ~~strikethrough~~. Block syntax and other unsupported markdown is written as literal text.')
159
+ });
160
+ var inputSchema = _zod.z.object({
161
+ id: _indexts.SpreadsheetIdSchema,
162
+ gid: _indexts.SheetGidSchema,
163
+ requests: _zod.z.array(MarkdownCellRequestSchema).min(1).max(50).describe('Array of cell markdown requests. Batch multiple cells for efficiency.')
164
+ });
165
+ var successBranchSchema = _zod.z.object({
166
+ type: _zod.z.literal('success'),
167
+ id: _indexts.SpreadsheetIdOutput,
168
+ gid: _indexts.SheetGidOutput,
169
+ sheetTitle: _zod.z.string().describe('Title of the updated sheet'),
170
+ sheetUrl: _zod.z.string().describe('URL of the updated sheet'),
171
+ successCount: _zod.z.number().int().nonnegative().describe('Number of cells successfully written'),
172
+ cells: _zod.z.array(_zod.z.object({
173
+ cell: _zod.z.string().describe('A1 reference of the cell that was written'),
174
+ text: _zod.z.string().describe('Resolved plain text written to the cell (markdown syntax stripped/literalized)'),
175
+ linkCount: _zod.z.number().int().nonnegative().describe('Number of clickable links written into the cell')
176
+ })).describe('Cells successfully written'),
177
+ failedCells: _zod.z.array(_zod.z.object({
178
+ cell: _zod.z.string().describe('A1 reference that failed'),
179
+ error: _zod.z.string().describe('Why the cell failed (e.g., not a single-cell reference)')
180
+ })).optional().describe('Only populated if some cells failed')
181
+ });
182
+ var outputSchema = _zod.z.discriminatedUnion('type', [
183
+ successBranchSchema,
184
+ AuthRequiredBranchSchema
185
+ ]);
186
+ var config = {
187
+ description: 'Replace cell content with text parsed from inline markdown. Supports [label](url) links, bare URLs, **bold**, *italic*, ~~strikethrough~~ — the only way to put MULTIPLE clickable links in one cell. Block syntax (headers, lists, tables) and other unsupported markdown is written as literal text. Writes text cells only — no formula or number coercion. For whole-cell formatting (colors, borders, number formats) use cells-format.',
188
+ inputSchema: inputSchema,
189
+ outputSchema: _zod.z.object({
190
+ result: outputSchema
191
+ })
192
+ };
193
+ function handler(_0, _1) {
194
+ return _async_to_generator(function(param, extra) {
195
+ var id, gid, requests, logger, _sheet_properties_title, _sheet_properties_sheetId, _spreadsheetResponse_data_sheets, sheets, spreadsheetResponse, sheet, sheetTitle, sheetId, sheetUrl, batchRequests, cells, failedCells, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, request, rangeRef, gridRange, parsed, runs, message, result, result1, error, message1;
196
+ return _ts_generator(this, function(_state) {
197
+ switch(_state.label){
198
+ case 0:
199
+ id = param.id, gid = param.gid, requests = param.requests;
200
+ logger = extra.logger;
201
+ logger.info('sheets.values.markdownUpdate called', {
202
+ id: id,
203
+ gid: gid,
204
+ requestCount: requests.length
205
+ });
206
+ _state.label = 1;
207
+ case 1:
208
+ _state.trys.push([
209
+ 1,
210
+ 4,
211
+ ,
212
+ 5
213
+ ]);
214
+ sheets = _googleapis.google.sheets({
215
+ version: 'v4',
216
+ auth: extra.authContext.auth
217
+ });
218
+ return [
219
+ 4,
220
+ sheets.spreadsheets.get({
221
+ spreadsheetId: id,
222
+ fields: 'sheets.properties.sheetId,sheets.properties.title'
223
+ })
224
+ ];
225
+ case 2:
226
+ spreadsheetResponse = _state.sent();
227
+ // Find sheet by gid
228
+ sheet = (_spreadsheetResponse_data_sheets = spreadsheetResponse.data.sheets) === null || _spreadsheetResponse_data_sheets === void 0 ? void 0 : _spreadsheetResponse_data_sheets.find(function(s) {
229
+ var _s_properties;
230
+ return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
231
+ });
232
+ if (!(sheet === null || sheet === void 0 ? void 0 : sheet.properties)) {
233
+ logger.info('Sheet not found for markdown update', {
234
+ id: id,
235
+ gid: gid,
236
+ requestCount: requests.length
237
+ });
238
+ throw new _types.McpError(_types.ErrorCode.InvalidParams, "Sheet not found: ".concat(gid));
239
+ }
240
+ sheetTitle = (_sheet_properties_title = sheet.properties.title) !== null && _sheet_properties_title !== void 0 ? _sheet_properties_title : gid;
241
+ // googleapis types sheetId as `number | null | undefined`; coerce for rangeReferenceToGridRange below (same pattern as values-batch-update.ts's sheetGid).
242
+ sheetId = (_sheet_properties_sheetId = sheet.properties.sheetId) !== null && _sheet_properties_sheetId !== void 0 ? _sheet_properties_sheetId : 0;
243
+ sheetUrl = "https://docs.google.com/spreadsheets/d/".concat(id, "/edit#gid=").concat(sheetId);
244
+ // Build one updateCells request per cell
245
+ batchRequests = [];
246
+ cells = [];
247
+ failedCells = [];
248
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
249
+ try {
250
+ for(_iterator = requests[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
251
+ request = _step.value;
252
+ try {
253
+ // Parse A1 notation and reject anything that isn't a single cell
254
+ rangeRef = (0, _rangeoperationsts.parseA1Notation)(request.cell);
255
+ if (rangeRef.type !== 'cell') {
256
+ throw new Error('Not a single-cell reference: "'.concat(request.cell, '"'));
257
+ }
258
+ gridRange = (0, _rangeoperationsts.rangeReferenceToGridRange)(rangeRef, sheetId);
259
+ parsed = (0, _markdownrunsts.parseInlineMarkdown)(request.text);
260
+ runs = (0, _markdownrunsts.buildTextFormatRuns)(parsed);
261
+ batchRequests.push({
262
+ updateCells: {
263
+ range: gridRange,
264
+ rows: [
265
+ {
266
+ values: [
267
+ {
268
+ userEnteredValue: {
269
+ stringValue: parsed.text
270
+ },
271
+ textFormatRuns: runs
272
+ }
273
+ ]
274
+ }
275
+ ],
276
+ fields: 'userEnteredValue,textFormatRuns'
277
+ }
278
+ });
279
+ cells.push({
280
+ cell: request.cell,
281
+ text: parsed.text,
282
+ linkCount: parsed.linkCount
283
+ });
284
+ } catch (error) {
285
+ message = _instanceof(error, Error) ? error.message : String(error);
286
+ logger.info('Failed to parse cell for markdown update', {
287
+ cell: request.cell,
288
+ error: message
289
+ });
290
+ failedCells.push({
291
+ cell: request.cell,
292
+ error: "Failed to parse cell: ".concat(message)
293
+ });
294
+ }
295
+ }
296
+ } catch (err) {
297
+ _didIteratorError = true;
298
+ _iteratorError = err;
299
+ } finally{
300
+ try {
301
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
302
+ _iterator.return();
303
+ }
304
+ } finally{
305
+ if (_didIteratorError) {
306
+ throw _iteratorError;
307
+ }
308
+ }
309
+ }
310
+ // Early return if all cells failed
311
+ if (batchRequests.length === 0) {
312
+ result = {
313
+ type: 'success',
314
+ id: id,
315
+ gid: String(sheetId),
316
+ sheetTitle: sheetTitle,
317
+ sheetUrl: sheetUrl,
318
+ successCount: 0,
319
+ cells: [],
320
+ failedCells: failedCells.length > 0 ? failedCells : undefined
321
+ };
322
+ return [
323
+ 2,
324
+ {
325
+ content: [
326
+ {
327
+ type: 'text',
328
+ text: JSON.stringify(result)
329
+ }
330
+ ],
331
+ structuredContent: {
332
+ result: result
333
+ }
334
+ }
335
+ ];
336
+ }
337
+ logger.info('sheets.values.markdownUpdate executing batch request', {
338
+ spreadsheetId: id,
339
+ sheetTitle: sheetTitle,
340
+ batchRequestsCount: batchRequests.length
341
+ });
342
+ // Execute the batch update
343
+ return [
344
+ 4,
345
+ sheets.spreadsheets.batchUpdate({
346
+ spreadsheetId: id,
347
+ requestBody: {
348
+ requests: batchRequests
349
+ }
350
+ })
351
+ ];
352
+ case 3:
353
+ _state.sent();
354
+ logger.info('sheets.values.markdownUpdate completed successfully', {
355
+ successCount: cells.length,
356
+ failedCount: failedCells.length
357
+ });
358
+ result1 = {
359
+ type: 'success',
360
+ id: id,
361
+ gid: String(sheetId),
362
+ sheetTitle: sheetTitle,
363
+ sheetUrl: sheetUrl,
364
+ successCount: cells.length,
365
+ cells: cells,
366
+ failedCells: failedCells.length > 0 ? failedCells : undefined
367
+ };
368
+ return [
369
+ 2,
370
+ {
371
+ content: [
372
+ {
373
+ type: 'text',
374
+ text: JSON.stringify(result1)
375
+ }
376
+ ],
377
+ structuredContent: {
378
+ result: result1
379
+ }
380
+ }
381
+ ];
382
+ case 4:
383
+ error = _state.sent();
384
+ // Re-throw McpError as-is
385
+ if (_instanceof(error, _types.McpError)) {
386
+ throw error;
387
+ }
388
+ message1 = _instanceof(error, Error) ? error.message : String(error);
389
+ logger.error('Markdown update operation failed', {
390
+ id: id,
391
+ gid: gid,
392
+ requestCount: requests.length,
393
+ error: message1
394
+ });
395
+ throw new _types.McpError(_types.ErrorCode.InternalError, "Error writing markdown to cells: ".concat(message1), {
396
+ stack: _instanceof(error, Error) ? error.stack : undefined
397
+ });
398
+ case 5:
399
+ return [
400
+ 2
401
+ ];
402
+ }
403
+ });
404
+ }).apply(this, arguments);
405
+ }
406
+ function createTool() {
407
+ return {
408
+ name: 'values-markdown-update',
409
+ config: config,
410
+ handler: handler
411
+ };
412
+ }
413
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }