@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 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.js';\nexport { createHTTPServer } from './http.js';\nexport { createOAuthAdapters } from './oauth-google.js';\nexport * from './runtime.js';\nexport { createStdioServer } from './stdio.js';\n"],"names":["createConfig","parseConfig","createHTTPServer","createOAuthAdapters","createStdioServer"],"mappings":"AAAA,SAASA,YAAY,EAAEC,WAAW,QAAQ,cAAc;AACxD,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,mBAAmB,QAAQ,oBAAoB;AACxD,cAAc,eAAe;AAC7B,SAASC,iBAAiB,QAAQ,aAAa"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type AuthEmailProvider } from '@mcp-z/oauth';
|
|
2
|
+
import type { CachedToken } from '@mcp-z/oauth-google';
|
|
3
|
+
import { DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
|
|
4
|
+
import type { Logger, PromptModule, ToolModule } from '@mcp-z/server';
|
|
5
|
+
import type { Router } from 'express';
|
|
6
|
+
import type { Keyv } from 'keyv';
|
|
7
|
+
import type { ServerConfig } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Gmail OAuth runtime dependencies.
|
|
10
|
+
*/
|
|
11
|
+
export interface OAuthRuntimeDeps {
|
|
12
|
+
logger: Logger;
|
|
13
|
+
tokenStore: Keyv<CachedToken>;
|
|
14
|
+
dcrStore?: Keyv<unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Auth middleware helpers used to wrap MCP modules.
|
|
18
|
+
*/
|
|
19
|
+
export interface AuthMiddleware {
|
|
20
|
+
withToolAuth<T extends {
|
|
21
|
+
name: string;
|
|
22
|
+
config: unknown;
|
|
23
|
+
handler: unknown;
|
|
24
|
+
}>(module: T): T;
|
|
25
|
+
withResourceAuth<T extends {
|
|
26
|
+
name: string;
|
|
27
|
+
template?: unknown;
|
|
28
|
+
config?: unknown;
|
|
29
|
+
handler: unknown;
|
|
30
|
+
}>(module: T): T;
|
|
31
|
+
withPromptAuth<T extends {
|
|
32
|
+
name: string;
|
|
33
|
+
config: unknown;
|
|
34
|
+
handler: unknown;
|
|
35
|
+
}>(module: T): T;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Result returned by createOAuthAdapters.
|
|
39
|
+
*/
|
|
40
|
+
export interface OAuthAdapters {
|
|
41
|
+
primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;
|
|
42
|
+
middleware: AuthMiddleware;
|
|
43
|
+
authAdapter: AuthEmailProvider;
|
|
44
|
+
accountTools: ToolModule[];
|
|
45
|
+
accountPrompts: PromptModule[];
|
|
46
|
+
dcrRouter?: Router;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create Sheets OAuth adapters and helpers.
|
|
50
|
+
*
|
|
51
|
+
* @param config Sheets server configuration.
|
|
52
|
+
* @param deps Runtime dependencies (logger, token store, optional DCR store).
|
|
53
|
+
*/
|
|
54
|
+
export declare function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { AccountServer } from '@mcp-z/oauth';
|
|
2
|
+
import { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
|
|
3
|
+
import { GOOGLE_SCOPE } from '../constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create Sheets OAuth adapters and helpers.
|
|
6
|
+
*
|
|
7
|
+
* @param config Sheets server configuration.
|
|
8
|
+
* @param deps Runtime dependencies (logger, token store, optional DCR store).
|
|
9
|
+
*/ export async function createOAuthAdapters(config, deps, baseUrl) {
|
|
10
|
+
const { logger, tokenStore, dcrStore } = deps;
|
|
11
|
+
const oauthStaticConfig = {
|
|
12
|
+
service: config.name,
|
|
13
|
+
clientId: config.clientId,
|
|
14
|
+
clientSecret: config.clientSecret,
|
|
15
|
+
scope: GOOGLE_SCOPE,
|
|
16
|
+
auth: config.auth,
|
|
17
|
+
headless: config.headless,
|
|
18
|
+
redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,
|
|
19
|
+
...config.serviceAccountKeyFile && {
|
|
20
|
+
serviceAccountKeyFile: config.serviceAccountKeyFile
|
|
21
|
+
},
|
|
22
|
+
...baseUrl && {
|
|
23
|
+
baseUrl
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
let primary;
|
|
27
|
+
if (oauthStaticConfig.auth === 'dcr') {
|
|
28
|
+
logger.debug('Creating DCR provider', {
|
|
29
|
+
service: oauthStaticConfig.service
|
|
30
|
+
});
|
|
31
|
+
if (!dcrStore) {
|
|
32
|
+
throw new Error('DCR mode requires dcrStore to be configured');
|
|
33
|
+
}
|
|
34
|
+
if (!oauthStaticConfig.baseUrl) {
|
|
35
|
+
throw new Error('DCR mode requires baseUrl to be configured');
|
|
36
|
+
}
|
|
37
|
+
primary = new DcrOAuthProvider({
|
|
38
|
+
clientId: oauthStaticConfig.clientId,
|
|
39
|
+
...oauthStaticConfig.clientSecret && {
|
|
40
|
+
clientSecret: oauthStaticConfig.clientSecret
|
|
41
|
+
},
|
|
42
|
+
scope: oauthStaticConfig.scope,
|
|
43
|
+
verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,
|
|
44
|
+
logger
|
|
45
|
+
});
|
|
46
|
+
const dcrRouter = createDcrRouter({
|
|
47
|
+
store: dcrStore,
|
|
48
|
+
issuerUrl: oauthStaticConfig.baseUrl,
|
|
49
|
+
baseUrl: oauthStaticConfig.baseUrl,
|
|
50
|
+
scopesSupported: oauthStaticConfig.scope.split(' '),
|
|
51
|
+
clientConfig: {
|
|
52
|
+
clientId: oauthStaticConfig.clientId,
|
|
53
|
+
...oauthStaticConfig.clientSecret && {
|
|
54
|
+
clientSecret: oauthStaticConfig.clientSecret
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const middleware = primary.authMiddleware();
|
|
59
|
+
const authAdapter = {
|
|
60
|
+
getUserEmail: ()=>{
|
|
61
|
+
throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
primary,
|
|
66
|
+
middleware: middleware,
|
|
67
|
+
authAdapter,
|
|
68
|
+
accountTools: [],
|
|
69
|
+
accountPrompts: [],
|
|
70
|
+
dcrRouter
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (oauthStaticConfig.auth === 'service-account') {
|
|
74
|
+
if (!oauthStaticConfig.serviceAccountKeyFile) {
|
|
75
|
+
throw new Error('Service account key file is required when auth mode is "service-account". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');
|
|
76
|
+
}
|
|
77
|
+
logger.debug('Creating service account provider', {
|
|
78
|
+
service: oauthStaticConfig.service
|
|
79
|
+
});
|
|
80
|
+
primary = new ServiceAccountProvider({
|
|
81
|
+
keyFilePath: oauthStaticConfig.serviceAccountKeyFile,
|
|
82
|
+
scopes: oauthStaticConfig.scope.split(' '),
|
|
83
|
+
logger
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
logger.debug('Creating loopback OAuth provider', {
|
|
87
|
+
service: oauthStaticConfig.service
|
|
88
|
+
});
|
|
89
|
+
primary = new LoopbackOAuthProvider({
|
|
90
|
+
service: oauthStaticConfig.service,
|
|
91
|
+
clientId: oauthStaticConfig.clientId,
|
|
92
|
+
clientSecret: oauthStaticConfig.clientSecret,
|
|
93
|
+
scope: oauthStaticConfig.scope,
|
|
94
|
+
headless: oauthStaticConfig.headless,
|
|
95
|
+
logger,
|
|
96
|
+
tokenStore,
|
|
97
|
+
...oauthStaticConfig.redirectUri !== undefined && {
|
|
98
|
+
redirectUri: oauthStaticConfig.redirectUri
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const authAdapter = {
|
|
103
|
+
getUserEmail: (accountId)=>primary.getUserEmail(accountId),
|
|
104
|
+
...'authenticateNewAccount' in primary && primary.authenticateNewAccount ? {
|
|
105
|
+
authenticateNewAccount: ()=>{
|
|
106
|
+
var _primary_authenticateNewAccount;
|
|
107
|
+
return (_primary_authenticateNewAccount = primary.authenticateNewAccount) === null || _primary_authenticateNewAccount === void 0 ? void 0 : _primary_authenticateNewAccount.call(primary);
|
|
108
|
+
}
|
|
109
|
+
} : {}
|
|
110
|
+
};
|
|
111
|
+
let middleware;
|
|
112
|
+
let accountTools;
|
|
113
|
+
let accountPrompts;
|
|
114
|
+
if (oauthStaticConfig.auth === 'service-account') {
|
|
115
|
+
middleware = primary.authMiddleware();
|
|
116
|
+
accountTools = [];
|
|
117
|
+
accountPrompts = [];
|
|
118
|
+
logger.debug('Service account mode - no account tools', {
|
|
119
|
+
service: oauthStaticConfig.service
|
|
120
|
+
});
|
|
121
|
+
} else {
|
|
122
|
+
middleware = primary.authMiddleware();
|
|
123
|
+
const result = AccountServer.createLoopback({
|
|
124
|
+
service: oauthStaticConfig.service,
|
|
125
|
+
store: tokenStore,
|
|
126
|
+
logger,
|
|
127
|
+
auth: authAdapter
|
|
128
|
+
});
|
|
129
|
+
accountTools = result.tools;
|
|
130
|
+
accountPrompts = result.prompts;
|
|
131
|
+
logger.debug('Loopback OAuth (multi-account mode)', {
|
|
132
|
+
service: oauthStaticConfig.service
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
primary,
|
|
137
|
+
middleware: middleware,
|
|
138
|
+
authAdapter,
|
|
139
|
+
accountTools,
|
|
140
|
+
accountPrompts
|
|
141
|
+
};
|
|
142
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/setup/oauth-google.ts"],"sourcesContent":["import { AccountServer, type AuthEmailProvider } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\n/**\n * Gmail OAuth runtime dependencies.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware helpers used to wrap MCP modules.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result returned by createOAuthAdapters.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AuthEmailProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n}\n\n/**\n * Create Sheets OAuth adapters and helpers.\n *\n * @param config Sheets server configuration.\n * @param deps Runtime dependencies (logger, token store, optional DCR store).\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n const middleware = primary.authMiddleware();\n const authAdapter: AuthEmailProvider = {\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools: [],\n accountPrompts: [],\n dcrRouter,\n };\n }\n\n if (oauthStaticConfig.auth === 'service-account') {\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n }\n\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => primary.getUserEmail(accountId),\n ...('authenticateNewAccount' in primary && primary.authenticateNewAccount\n ? {\n authenticateNewAccount: () => primary.authenticateNewAccount?.(),\n }\n : {}),\n };\n\n let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools,\n accountPrompts,\n };\n}\n"],"names":["AccountServer","createDcrRouter","DcrOAuthProvider","LoopbackOAuthProvider","ServiceAccountProvider","GOOGLE_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","service","name","clientId","clientSecret","scope","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getUserEmail","accountTools","accountPrompts","keyFilePath","scopes","accountId","authenticateNewAccount","result","createLoopback","tools","prompts"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CachedToken } from '@mcp-z/oauth-google';
|
|
2
|
+
import type { Logger, MiddlewareLayer } from '@mcp-z/server';
|
|
3
|
+
import type { CommonRuntime, RuntimeOverrides, ServerConfig } from '../types.js';
|
|
4
|
+
import { type OAuthAdapters } from './oauth-google.js';
|
|
5
|
+
export declare function createLogger(config: ServerConfig): Logger;
|
|
6
|
+
export declare function createTokenStore(baseDir: string): Promise<import("keyv").Keyv<CachedToken>>;
|
|
7
|
+
export declare function createDcrStore(baseDir: string, required: boolean): Promise<import("keyv").Keyv<unknown>>;
|
|
8
|
+
export declare function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer;
|
|
9
|
+
export declare function createLoggingLayer(logger: Logger): MiddlewareLayer;
|
|
10
|
+
export declare function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';
|
|
2
|
+
import { createLoggingMiddleware } from '@mcp-z/server';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import pino from 'pino';
|
|
6
|
+
import createStore from '../lib/create-store.js';
|
|
7
|
+
import * as mcp from '../mcp/index.js';
|
|
8
|
+
import { createOAuthAdapters } from './oauth-google.js';
|
|
9
|
+
export function createLogger(config) {
|
|
10
|
+
var _config_logLevel;
|
|
11
|
+
const hasStdio = config.transport.type === 'stdio';
|
|
12
|
+
const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);
|
|
13
|
+
if (hasStdio) fs.mkdirSync(path.dirname(logsPath), {
|
|
14
|
+
recursive: true
|
|
15
|
+
});
|
|
16
|
+
return pino({
|
|
17
|
+
level: (_config_logLevel = config.logLevel) !== null && _config_logLevel !== void 0 ? _config_logLevel : 'info',
|
|
18
|
+
formatters: sanitizeForLoggingFormatter()
|
|
19
|
+
}, hasStdio ? pino.destination({
|
|
20
|
+
dest: logsPath,
|
|
21
|
+
sync: false
|
|
22
|
+
}) : pino.destination(1));
|
|
23
|
+
}
|
|
24
|
+
export async function createTokenStore(baseDir) {
|
|
25
|
+
const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;
|
|
26
|
+
return createStore(storeUri);
|
|
27
|
+
}
|
|
28
|
+
export async function createDcrStore(baseDir, required) {
|
|
29
|
+
if (!required) return undefined;
|
|
30
|
+
const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;
|
|
31
|
+
return createStore(dcrStoreUri);
|
|
32
|
+
}
|
|
33
|
+
export function createAuthLayer(authMiddleware) {
|
|
34
|
+
return {
|
|
35
|
+
withTool: authMiddleware.withToolAuth,
|
|
36
|
+
withResource: authMiddleware.withResourceAuth,
|
|
37
|
+
withPrompt: authMiddleware.withPromptAuth
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function createLoggingLayer(logger) {
|
|
41
|
+
const logging = createLoggingMiddleware({
|
|
42
|
+
logger
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
withTool: logging.withToolLogging,
|
|
46
|
+
withResource: logging.withResourceLogging,
|
|
47
|
+
withPrompt: logging.withPromptLogging
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export async function createDefaultRuntime(config, overrides) {
|
|
51
|
+
var _config_baseUrl, _ref, _ref1;
|
|
52
|
+
if (config.auth === 'dcr' && config.transport.type !== 'http') throw new Error('DCR mode requires an HTTP transport');
|
|
53
|
+
const logger = createLogger(config);
|
|
54
|
+
const tokenStore = await createTokenStore(config.baseDir);
|
|
55
|
+
const baseUrl = (_config_baseUrl = config.baseUrl) !== null && _config_baseUrl !== void 0 ? _config_baseUrl : config.transport.type === 'http' && config.transport.port ? `http://localhost:${config.transport.port}` : undefined;
|
|
56
|
+
const dcrStore = await createDcrStore(config.baseDir, config.auth === 'dcr');
|
|
57
|
+
const oauthAdapters = await createOAuthAdapters(config, {
|
|
58
|
+
logger,
|
|
59
|
+
tokenStore,
|
|
60
|
+
dcrStore
|
|
61
|
+
}, baseUrl);
|
|
62
|
+
const deps = {
|
|
63
|
+
config,
|
|
64
|
+
logger,
|
|
65
|
+
tokenStore,
|
|
66
|
+
oauthAdapters,
|
|
67
|
+
baseUrl
|
|
68
|
+
};
|
|
69
|
+
const createDomainModules = (_ref = overrides === null || overrides === void 0 ? void 0 : overrides.createDomainModules) !== null && _ref !== void 0 ? _ref : ()=>({
|
|
70
|
+
tools: Object.values(mcp.toolFactories).map((factory)=>factory()),
|
|
71
|
+
resources: Object.values(mcp.resourceFactories).map((factory)=>factory()),
|
|
72
|
+
prompts: Object.values(mcp.promptFactories).map((factory)=>factory())
|
|
73
|
+
});
|
|
74
|
+
const middlewareFactories = (_ref1 = overrides === null || overrides === void 0 ? void 0 : overrides.middlewareFactories) !== null && _ref1 !== void 0 ? _ref1 : [
|
|
75
|
+
()=>createAuthLayer(oauthAdapters.middleware),
|
|
76
|
+
()=>createLoggingLayer(logger)
|
|
77
|
+
];
|
|
78
|
+
return {
|
|
79
|
+
deps,
|
|
80
|
+
middlewareFactories,
|
|
81
|
+
createDomainModules,
|
|
82
|
+
close: async ()=>{}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport type { Logger, MiddlewareLayer } from '@mcp-z/server';\nimport { createLoggingMiddleware } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport pino from 'pino';\nimport createStore from '../lib/create-store.js';\nimport * as mcp from '../mcp/index.js';\nimport type { CommonRuntime, RuntimeDeps, RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createOAuthAdapters, type OAuthAdapters } from './oauth-google.js';\n\nexport function createLogger(config: ServerConfig): Logger {\n const hasStdio = config.transport.type === 'stdio';\n const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);\n if (hasStdio) fs.mkdirSync(path.dirname(logsPath), { recursive: true });\n return pino({ level: config.logLevel ?? 'info', formatters: sanitizeForLoggingFormatter() }, hasStdio ? pino.destination({ dest: logsPath, sync: false }) : pino.destination(1));\n}\n\nexport async function createTokenStore(baseDir: string) {\n const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<CachedToken>(storeUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;\n return createStore<unknown>(dcrStoreUri);\n}\n\nexport function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer {\n return {\n withTool: authMiddleware.withToolAuth,\n withResource: authMiddleware.withResourceAuth,\n withPrompt: authMiddleware.withPromptAuth,\n };\n}\n\nexport function createLoggingLayer(logger: Logger): MiddlewareLayer {\n const logging = createLoggingMiddleware({ logger });\n return {\n withTool: logging.withToolLogging,\n withResource: logging.withResourceLogging,\n withPrompt: logging.withPromptLogging,\n };\n}\n\nexport async function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime> {\n if (config.auth === 'dcr' && config.transport.type !== 'http') throw new Error('DCR mode requires an HTTP transport');\n\n const logger = createLogger(config);\n const tokenStore = await createTokenStore(config.baseDir);\n const baseUrl = config.baseUrl ?? (config.transport.type === 'http' && config.transport.port ? `http://localhost:${config.transport.port}` : undefined);\n const dcrStore = await createDcrStore(config.baseDir, config.auth === 'dcr');\n const oauthAdapters = await createOAuthAdapters(config, { logger, tokenStore, dcrStore }, baseUrl);\n const deps: RuntimeDeps = { config, logger, tokenStore, oauthAdapters, baseUrl };\n const createDomainModules =\n overrides?.createDomainModules ??\n (() => ({\n tools: Object.values(mcp.toolFactories).map((factory) => factory()),\n resources: Object.values(mcp.resourceFactories).map((factory) => factory()),\n prompts: Object.values(mcp.promptFactories).map((factory) => factory()),\n }));\n const middlewareFactories = overrides?.middlewareFactories ?? [() => createAuthLayer(oauthAdapters.middleware), () => createLoggingLayer(logger)];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["sanitizeForLoggingFormatter","createLoggingMiddleware","fs","path","pino","createStore","mcp","createOAuthAdapters","createLogger","config","hasStdio","transport","type","logsPath","join","baseDir","name","mkdirSync","dirname","recursive","level","logLevel","formatters","destination","dest","sync","createTokenStore","storeUri","process","env","STORE_URI","createDcrStore","required","undefined","dcrStoreUri","DCR_STORE_URI","createAuthLayer","authMiddleware","withTool","withToolAuth","withResource","withResourceAuth","withPrompt","withPromptAuth","createLoggingLayer","logger","logging","withToolLogging","withResourceLogging","withPromptLogging","createDefaultRuntime","overrides","auth","Error","tokenStore","baseUrl","port","dcrStore","oauthAdapters","deps","createDomainModules","tools","Object","values","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middlewareFactories","middleware","close"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { RuntimeOverrides, ServerConfig } from '../types.js';
|
|
3
|
+
export declare function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
|
|
4
|
+
mcpServer: McpServer;
|
|
5
|
+
logger: import("@mcp-z/server").Logger;
|
|
6
|
+
close: () => Promise<void>;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { createDefaultRuntime } from './runtime.js';
|
|
4
|
+
export async function createStdioServer(config, overrides) {
|
|
5
|
+
const runtime = await createDefaultRuntime(config, overrides);
|
|
6
|
+
const modules = runtime.createDomainModules();
|
|
7
|
+
const layers = runtime.middlewareFactories.map((factory)=>factory(runtime.deps));
|
|
8
|
+
const composed = composeMiddleware(modules, layers);
|
|
9
|
+
const logger = runtime.deps.logger;
|
|
10
|
+
const tools = [
|
|
11
|
+
...composed.tools,
|
|
12
|
+
...runtime.deps.oauthAdapters.accountTools
|
|
13
|
+
];
|
|
14
|
+
const prompts = [
|
|
15
|
+
...composed.prompts,
|
|
16
|
+
...runtime.deps.oauthAdapters.accountPrompts
|
|
17
|
+
];
|
|
18
|
+
const mcpServer = new McpServer({
|
|
19
|
+
name: config.name,
|
|
20
|
+
version: config.version
|
|
21
|
+
});
|
|
22
|
+
registerTools(mcpServer, tools);
|
|
23
|
+
registerResources(mcpServer, composed.resources);
|
|
24
|
+
registerPrompts(mcpServer, prompts);
|
|
25
|
+
logger.info(`Starting ${config.name} MCP server (stdio)`);
|
|
26
|
+
const { close } = await connectStdio(mcpServer, {
|
|
27
|
+
logger
|
|
28
|
+
});
|
|
29
|
+
logger.info('stdio transport ready');
|
|
30
|
+
return {
|
|
31
|
+
mcpServer,
|
|
32
|
+
logger,
|
|
33
|
+
close: async ()=>{
|
|
34
|
+
await close();
|
|
35
|
+
await runtime.close();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createDefaultRuntime } from './runtime.js';\n\nexport async function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(mcpServer, { logger });\n logger.info('stdio transport ready');\n\n return {\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectStdio","registerPrompts","registerResources","registerTools","McpServer","createDefaultRuntime","createStdioServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","info","close"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,YAAY,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AACnH,SAASC,SAAS,QAAQ,0CAA0C;AAEpE,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,kBAAkBC,MAAoB,EAAEC,SAA4B;IACxF,MAAMC,UAAU,MAAMJ,qBAAqBE,QAAQC;IACnD,MAAME,UAAUD,QAAQE,mBAAmB;IAC3C,MAAMC,SAASH,QAAQI,mBAAmB,CAACC,GAAG,CAAC,CAACC,UAAYA,QAAQN,QAAQO,IAAI;IAChF,MAAMC,WAAWlB,kBAAkBW,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAElC,MAAMC,QAAQ;WAAIF,SAASE,KAAK;WAAKV,QAAQO,IAAI,CAACI,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIL,SAASK,OAAO;WAAKb,QAAQO,IAAI,CAACI,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIpB,UAAU;QAAEqB,MAAMlB,OAAOkB,IAAI;QAAEC,SAASnB,OAAOmB,OAAO;IAAC;IAC7EvB,cAAcqB,WAAWL;IACzBjB,kBAAkBsB,WAAWP,SAASU,SAAS;IAC/C1B,gBAAgBuB,WAAWF;IAE3BJ,OAAOU,IAAI,CAAC,CAAC,SAAS,EAAErB,OAAOkB,IAAI,CAAC,mBAAmB,CAAC;IACxD,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAM7B,aAAawB,WAAW;QAAEN;IAAO;IACzDA,OAAOU,IAAI,CAAC;IAEZ,OAAO;QACLJ;QACAN;QACAW,OAAO;YACL,MAAMA;YACN,MAAMpB,QAAQoB,KAAK;QACrB;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function a1Col(colIndex: number): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/spreadsheet/column-utilities.ts"],"sourcesContent":["export function a1Col(colIndex: number): string {\n let col = '';\n let i = colIndex;\n while (i > 0) {\n const rem = (i - 1) % 26;\n col = String.fromCharCode(65 + rem) + col;\n i = Math.floor((i - 1) / 26);\n }\n return col;\n}\n"],"names":["a1Col","colIndex","col","i","rem","String","fromCharCode","Math","floor"],"mappings":"AAAA,OAAO,SAASA,MAAMC,QAAgB;IACpC,IAAIC,MAAM;IACV,IAAIC,IAAIF;IACR,MAAOE,IAAI,EAAG;QACZ,MAAMC,MAAM,AAACD,CAAAA,IAAI,CAAA,IAAK;QACtBD,MAAMG,OAAOC,YAAY,CAAC,KAAKF,OAAOF;QACtCC,IAAII,KAAKC,KAAK,CAAC,AAACL,CAAAA,IAAI,CAAA,IAAK;IAC3B;IACA,OAAOD;AACT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Streaming CSV parsing utilities for memory-efficient large file processing */
|
|
2
|
+
import { Readable } from 'stream';
|
|
3
|
+
/**
|
|
4
|
+
* Get readable stream from CSV URI
|
|
5
|
+
*
|
|
6
|
+
* Memory efficiency:
|
|
7
|
+
* - file:// URIs stream directly from disk
|
|
8
|
+
* - http:// URIs stream directly from response (no temp files!)
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const readStream = await getCsvReadStream(csvUri);
|
|
13
|
+
* const parser = readStream.pipe(parse({ columns: true }));
|
|
14
|
+
* for await (const record of parser) {
|
|
15
|
+
* // Process record
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function getCsvReadStream(csvUri: string): Promise<Readable>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Streaming CSV parsing utilities for memory-efficient large file processing */ import { createReadStream } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { Readable } from 'stream';
|
|
4
|
+
/**
|
|
5
|
+
* Get readable stream from CSV URI
|
|
6
|
+
*
|
|
7
|
+
* Memory efficiency:
|
|
8
|
+
* - file:// URIs stream directly from disk
|
|
9
|
+
* - http:// URIs stream directly from response (no temp files!)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const readStream = await getCsvReadStream(csvUri);
|
|
14
|
+
* const parser = readStream.pipe(parse({ columns: true }));
|
|
15
|
+
* for await (const record of parser) {
|
|
16
|
+
* // Process record
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/ export async function getCsvReadStream(csvUri) {
|
|
20
|
+
if (csvUri.startsWith('file://')) {
|
|
21
|
+
// Local file - stream directly from disk
|
|
22
|
+
const filePath = csvUri.replace('file://', '');
|
|
23
|
+
const resolvedPath = resolve(filePath);
|
|
24
|
+
return createReadStream(resolvedPath, {
|
|
25
|
+
encoding: 'utf-8'
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (csvUri.startsWith('http://') || csvUri.startsWith('https://')) {
|
|
29
|
+
// Remote file - stream directly from fetch response
|
|
30
|
+
const response = await fetch(csvUri);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`Failed to fetch CSV from ${csvUri}: ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
if (!response.body) {
|
|
35
|
+
throw new Error(`No response body from ${csvUri}`);
|
|
36
|
+
}
|
|
37
|
+
// Convert web stream to Node.js stream
|
|
38
|
+
// response.body is ReadableStream<Uint8Array> from fetch API
|
|
39
|
+
// Cast to Node.js ReadableStream type for compatibility with Readable.fromWeb
|
|
40
|
+
return Readable.fromWeb(response.body);
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Invalid CSV URI: ${csvUri}. Must start with file://, http://, or https://`);
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/spreadsheet/csv-streaming.ts"],"sourcesContent":["/** Streaming CSV parsing utilities for memory-efficient large file processing */\n\nimport { createReadStream } from 'fs';\nimport { resolve } from 'path';\nimport { Readable } from 'stream';\nimport type { ReadableStream as NodeReadableStream } from 'stream/web';\n\n/**\n * Get readable stream from CSV URI\n *\n * Memory efficiency:\n * - file:// URIs stream directly from disk\n * - http:// URIs stream directly from response (no temp files!)\n *\n * @example\n * ```ts\n * const readStream = await getCsvReadStream(csvUri);\n * const parser = readStream.pipe(parse({ columns: true }));\n * for await (const record of parser) {\n * // Process record\n * }\n * ```\n */\nexport async function getCsvReadStream(csvUri: string): Promise<Readable> {\n if (csvUri.startsWith('file://')) {\n // Local file - stream directly from disk\n const filePath = csvUri.replace('file://', '');\n const resolvedPath = resolve(filePath);\n return createReadStream(resolvedPath, { encoding: 'utf-8' });\n }\n\n if (csvUri.startsWith('http://') || csvUri.startsWith('https://')) {\n // Remote file - stream directly from fetch response\n const response = await fetch(csvUri);\n if (!response.ok) {\n throw new Error(`Failed to fetch CSV from ${csvUri}: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error(`No response body from ${csvUri}`);\n }\n\n // Convert web stream to Node.js stream\n // response.body is ReadableStream<Uint8Array> from fetch API\n // Cast to Node.js ReadableStream type for compatibility with Readable.fromWeb\n return Readable.fromWeb(response.body as unknown as NodeReadableStream<Uint8Array>);\n }\n\n throw new Error(`Invalid CSV URI: ${csvUri}. Must start with file://, http://, or https://`);\n}\n"],"names":["createReadStream","resolve","Readable","getCsvReadStream","csvUri","startsWith","filePath","replace","resolvedPath","encoding","response","fetch","ok","Error","statusText","body","fromWeb"],"mappings":"AAAA,+EAA+E,GAE/E,SAASA,gBAAgB,QAAQ,KAAK;AACtC,SAASC,OAAO,QAAQ,OAAO;AAC/B,SAASC,QAAQ,QAAQ,SAAS;AAGlC;;;;;;;;;;;;;;;CAeC,GACD,OAAO,eAAeC,iBAAiBC,MAAc;IACnD,IAAIA,OAAOC,UAAU,CAAC,YAAY;QAChC,yCAAyC;QACzC,MAAMC,WAAWF,OAAOG,OAAO,CAAC,WAAW;QAC3C,MAAMC,eAAeP,QAAQK;QAC7B,OAAON,iBAAiBQ,cAAc;YAAEC,UAAU;QAAQ;IAC5D;IAEA,IAAIL,OAAOC,UAAU,CAAC,cAAcD,OAAOC,UAAU,CAAC,aAAa;QACjE,oDAAoD;QACpD,MAAMK,WAAW,MAAMC,MAAMP;QAC7B,IAAI,CAACM,SAASE,EAAE,EAAE;YAChB,MAAM,IAAIC,MAAM,CAAC,yBAAyB,EAAET,OAAO,EAAE,EAAEM,SAASI,UAAU,EAAE;QAC9E;QAEA,IAAI,CAACJ,SAASK,IAAI,EAAE;YAClB,MAAM,IAAIF,MAAM,CAAC,sBAAsB,EAAET,QAAQ;QACnD;QAEA,uCAAuC;QACvC,6DAA6D;QAC7D,8EAA8E;QAC9E,OAAOF,SAASc,OAAO,CAACN,SAASK,IAAI;IACvC;IAEA,MAAM,IAAIF,MAAM,CAAC,iBAAiB,EAAET,OAAO,+CAA+C,CAAC;AAC7F"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { sheets_v4 } from 'googleapis';
|
|
2
|
+
import type { Logger } from '../types.js';
|
|
3
|
+
export type Cell = string | number | boolean | null | undefined;
|
|
4
|
+
export type Row = Cell[];
|
|
5
|
+
export interface ColumnMapping {
|
|
6
|
+
canonical: string;
|
|
7
|
+
sheet: string;
|
|
8
|
+
index: number;
|
|
9
|
+
}
|
|
10
|
+
export interface HeaderValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
missingColumns: string[];
|
|
13
|
+
extraColumns: string[];
|
|
14
|
+
mappings: ColumnMapping[];
|
|
15
|
+
}
|
|
16
|
+
export interface KeyGenerationStrategy {
|
|
17
|
+
keyColumns: string[];
|
|
18
|
+
useProviderIdLogic: boolean;
|
|
19
|
+
separator?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DataPartition {
|
|
22
|
+
toAppend: Row[];
|
|
23
|
+
toUpdate: Array<{
|
|
24
|
+
row: Row;
|
|
25
|
+
existingRowIndex: number;
|
|
26
|
+
}>;
|
|
27
|
+
skippedKeys: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface BatchOperationResult {
|
|
30
|
+
updatedRows: number;
|
|
31
|
+
inserted: string[];
|
|
32
|
+
rowsSkipped: number;
|
|
33
|
+
errors?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface UpsertOptions {
|
|
36
|
+
keyStrategy: KeyGenerationStrategy;
|
|
37
|
+
allowUpdates: boolean;
|
|
38
|
+
batchSize?: number;
|
|
39
|
+
valueInputOption?: 'RAW' | 'USER_ENTERED';
|
|
40
|
+
}
|
|
41
|
+
export declare function discoverHeader(sheets: sheets_v4.Sheets, spreadsheetId: string, sheetTitle: string): Promise<string[]>;
|
|
42
|
+
export declare function validateAndMapHeaders(sheetHeaders: string[], canonicalHeaders: string[], requiredColumns?: string[]): HeaderValidationResult;
|
|
43
|
+
/** Ensures consistent key generation across all functions */
|
|
44
|
+
export declare function generateRowKey(row: Row, header: string[], strategy: KeyGenerationStrategy): string;
|
|
45
|
+
export declare function validateRowKeys(rows: Row[], header: string[], strategy: KeyGenerationStrategy): {
|
|
46
|
+
valid: boolean;
|
|
47
|
+
duplicateKeys: string[];
|
|
48
|
+
keyMap: Map<string, number[]>;
|
|
49
|
+
};
|
|
50
|
+
export declare function appendRows(sheets: sheets_v4.Sheets, params: {
|
|
51
|
+
spreadsheetId: string;
|
|
52
|
+
sheetTitle: string;
|
|
53
|
+
rows?: unknown[];
|
|
54
|
+
keySet?: Set<string> | null;
|
|
55
|
+
keyColumns?: string[];
|
|
56
|
+
header?: string[];
|
|
57
|
+
logger: Logger;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
updatedRows: number;
|
|
60
|
+
inserted: string[];
|
|
61
|
+
rowsSkipped?: number;
|
|
62
|
+
}>;
|
|
63
|
+
export declare function appendRows(sheets: sheets_v4.Sheets, params: {
|
|
64
|
+
spreadsheetId: string;
|
|
65
|
+
sheetRef: string;
|
|
66
|
+
rows?: unknown[];
|
|
67
|
+
keySet?: Set<string> | null;
|
|
68
|
+
keyColumns?: string[];
|
|
69
|
+
header?: string[];
|
|
70
|
+
logger: Logger;
|
|
71
|
+
}): Promise<{
|
|
72
|
+
updatedRows: number;
|
|
73
|
+
inserted: string[];
|
|
74
|
+
rowsSkipped?: number;
|
|
75
|
+
}>;
|
|
76
|
+
export declare function mapRowsToHeader({ rows, header, canonical }: {
|
|
77
|
+
rows?: Row[];
|
|
78
|
+
header?: string[];
|
|
79
|
+
canonical?: string[];
|
|
80
|
+
}): Row[];
|
|
81
|
+
export declare function snapshotHeaderAndKeys(sheets: sheets_v4.Sheets, spreadsheetId: string, sheetTitle: string, keyColumns?: string[], keyStrategy?: Partial<KeyGenerationStrategy>): Promise<{
|
|
82
|
+
header: string[];
|
|
83
|
+
keySet: Set<string>;
|
|
84
|
+
keyIndices: number[];
|
|
85
|
+
}>;
|
|
86
|
+
/** Tracks row positions for updates in addition to keys */
|
|
87
|
+
export declare function snapshotHeaderKeysAndPositions(sheets: sheets_v4.Sheets, spreadsheetId: string, sheetTitle: string, keyColumns?: string[], keyStrategy?: Partial<KeyGenerationStrategy>): Promise<{
|
|
88
|
+
header: string[];
|
|
89
|
+
keySet: Set<string>;
|
|
90
|
+
keyToRowMap: Map<string, number>;
|
|
91
|
+
keyIndices: number[];
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* Partitions data into updates vs appends based on existing keys with row position tracking
|
|
95
|
+
*/
|
|
96
|
+
export declare function partitionDataForUpsert(rows: Row[], header: string[], keyStrategy: KeyGenerationStrategy, existingKeys: Set<string>, allowUpdates?: boolean, keyToRowMap?: Map<string, number>): DataPartition;
|
|
97
|
+
/**
|
|
98
|
+
* Performs batch updates on existing rows using batchUpdate API
|
|
99
|
+
*/
|
|
100
|
+
export declare function performBatchUpdates(sheets: sheets_v4.Sheets, spreadsheetId: string, sheetTitle: string, updates: Array<{
|
|
101
|
+
row: Row;
|
|
102
|
+
existingRowIndex: number;
|
|
103
|
+
}>, header: string[], batchSize: number, valueInputOption: 'RAW' | 'USER_ENTERED'): Promise<{
|
|
104
|
+
updatedRows: number;
|
|
105
|
+
errors?: string[];
|
|
106
|
+
}>;
|
|
107
|
+
export declare function upsertByKey(sheets: sheets_v4.Sheets, { spreadsheetId, sheetTitle, sheetRef, rows, canonicalHeaders, options, logger, }: {
|
|
108
|
+
spreadsheetId: string;
|
|
109
|
+
sheetTitle?: string;
|
|
110
|
+
sheetRef?: string;
|
|
111
|
+
rows: Row[];
|
|
112
|
+
canonicalHeaders?: string[];
|
|
113
|
+
options: UpsertOptions;
|
|
114
|
+
logger: Logger;
|
|
115
|
+
}): Promise<BatchOperationResult>;
|