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