@mcp-z/mcp-sheets 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +32 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/index.js +13 -13
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/lib/create-store.js.map +1 -1
  7. package/dist/cjs/mcp/index.js +6 -6
  8. package/dist/cjs/mcp/index.js.map +1 -1
  9. package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -1
  10. package/dist/cjs/mcp/prompts/index.js +2 -2
  11. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  12. package/dist/cjs/mcp/resources/index.js +2 -2
  13. package/dist/cjs/mcp/resources/index.js.map +1 -1
  14. package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -1
  15. package/dist/cjs/mcp/tools/cells-format.js +8 -8
  16. package/dist/cjs/mcp/tools/cells-format.js.map +1 -1
  17. package/dist/cjs/mcp/tools/chart-create.js +8 -8
  18. package/dist/cjs/mcp/tools/chart-create.js.map +1 -1
  19. package/dist/cjs/mcp/tools/columns-get.js +3 -3
  20. package/dist/cjs/mcp/tools/columns-get.js.map +1 -1
  21. package/dist/cjs/mcp/tools/columns-update.js +10 -10
  22. package/dist/cjs/mcp/tools/columns-update.js.map +1 -1
  23. package/dist/cjs/mcp/tools/csv-get-columns.js +2 -2
  24. package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -1
  25. package/dist/cjs/mcp/tools/dimensions-batch-update.js +16 -16
  26. package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -1
  27. package/dist/cjs/mcp/tools/dimensions-move.js +5 -5
  28. package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -1
  29. package/dist/cjs/mcp/tools/index.js +52 -52
  30. package/dist/cjs/mcp/tools/index.js.map +1 -1
  31. package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -1
  32. package/dist/cjs/mcp/tools/rows-append.js +10 -10
  33. package/dist/cjs/mcp/tools/rows-append.js.map +1 -1
  34. package/dist/cjs/mcp/tools/rows-csv-append.js +13 -13
  35. package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -1
  36. package/dist/cjs/mcp/tools/rows-get.js +4 -4
  37. package/dist/cjs/mcp/tools/rows-get.js.map +1 -1
  38. package/dist/cjs/mcp/tools/sheet-copy-to.js +4 -4
  39. package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -1
  40. package/dist/cjs/mcp/tools/sheet-copy.js +5 -5
  41. package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -1
  42. package/dist/cjs/mcp/tools/sheet-create.js +4 -4
  43. package/dist/cjs/mcp/tools/sheet-create.js.map +1 -1
  44. package/dist/cjs/mcp/tools/sheet-delete.js +4 -4
  45. package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -1
  46. package/dist/cjs/mcp/tools/sheet-find.js +7 -7
  47. package/dist/cjs/mcp/tools/sheet-find.js.map +1 -1
  48. package/dist/cjs/mcp/tools/sheet-rename.js +5 -5
  49. package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -1
  50. package/dist/cjs/mcp/tools/spreadsheet-copy.js +2 -2
  51. package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -1
  52. package/dist/cjs/mcp/tools/spreadsheet-create.js +2 -2
  53. package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -1
  54. package/dist/cjs/mcp/tools/spreadsheet-find.js +6 -6
  55. package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -1
  56. package/dist/cjs/mcp/tools/spreadsheet-rename.js +3 -3
  57. package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -1
  58. package/dist/cjs/mcp/tools/validation-set.js +8 -8
  59. package/dist/cjs/mcp/tools/validation-set.js.map +1 -1
  60. package/dist/cjs/mcp/tools/values-batch-update.js +8 -8
  61. package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -1
  62. package/dist/cjs/mcp/tools/values-clear.js +6 -6
  63. package/dist/cjs/mcp/tools/values-clear.js.map +1 -1
  64. package/dist/cjs/mcp/tools/values-csv-update.js +8 -8
  65. package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -1
  66. package/dist/cjs/mcp/tools/values-replace.js +8 -8
  67. package/dist/cjs/mcp/tools/values-replace.js.map +1 -1
  68. package/dist/cjs/mcp/tools/values-search.js +5 -5
  69. package/dist/cjs/mcp/tools/values-search.js.map +1 -1
  70. package/dist/cjs/schemas/index.js.map +1 -1
  71. package/dist/cjs/setup/config.js +11 -1
  72. package/dist/cjs/setup/config.js.map +1 -1
  73. package/dist/cjs/setup/http.js +6 -2
  74. package/dist/cjs/setup/http.js.map +1 -1
  75. package/dist/cjs/setup/index.js +9 -9
  76. package/dist/cjs/setup/index.js.map +1 -1
  77. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  78. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  79. package/dist/cjs/setup/oauth-google.js +15 -12
  80. package/dist/cjs/setup/oauth-google.js.map +1 -1
  81. package/dist/cjs/setup/runtime.js +9 -9
  82. package/dist/cjs/setup/runtime.js.map +1 -1
  83. package/dist/cjs/setup/stdio.js +2 -2
  84. package/dist/cjs/setup/stdio.js.map +1 -1
  85. package/dist/cjs/spreadsheet/column-utilities.js.map +1 -1
  86. package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -1
  87. package/dist/cjs/spreadsheet/data-operations.js +9 -9
  88. package/dist/cjs/spreadsheet/data-operations.js.map +1 -1
  89. package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -1
  90. package/dist/cjs/spreadsheet/range-operations.js +2 -2
  91. package/dist/cjs/spreadsheet/range-operations.js.map +1 -1
  92. package/dist/cjs/spreadsheet/sheet-operations.js +3 -3
  93. package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -1
  94. package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -1
  95. package/dist/esm/constants.js.map +1 -1
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/lib/create-store.js.map +1 -1
  98. package/dist/esm/mcp/index.js.map +1 -1
  99. package/dist/esm/mcp/prompts/a1-notation.js.map +1 -1
  100. package/dist/esm/mcp/prompts/index.js.map +1 -1
  101. package/dist/esm/mcp/resources/index.js.map +1 -1
  102. package/dist/esm/mcp/resources/spreadsheet.js.map +1 -1
  103. package/dist/esm/mcp/tools/cells-format.js.map +1 -1
  104. package/dist/esm/mcp/tools/chart-create.js.map +1 -1
  105. package/dist/esm/mcp/tools/columns-get.js.map +1 -1
  106. package/dist/esm/mcp/tools/columns-update.js.map +1 -1
  107. package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -1
  108. package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -1
  109. package/dist/esm/mcp/tools/dimensions-move.js.map +1 -1
  110. package/dist/esm/mcp/tools/index.js.map +1 -1
  111. package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -1
  112. package/dist/esm/mcp/tools/rows-append.js.map +1 -1
  113. package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -1
  114. package/dist/esm/mcp/tools/rows-get.js.map +1 -1
  115. package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -1
  116. package/dist/esm/mcp/tools/sheet-copy.js.map +1 -1
  117. package/dist/esm/mcp/tools/sheet-create.js.map +1 -1
  118. package/dist/esm/mcp/tools/sheet-delete.js.map +1 -1
  119. package/dist/esm/mcp/tools/sheet-find.js.map +1 -1
  120. package/dist/esm/mcp/tools/sheet-rename.js.map +1 -1
  121. package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -1
  122. package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -1
  123. package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -1
  124. package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -1
  125. package/dist/esm/mcp/tools/validation-set.js.map +1 -1
  126. package/dist/esm/mcp/tools/values-batch-update.js.map +1 -1
  127. package/dist/esm/mcp/tools/values-clear.js.map +1 -1
  128. package/dist/esm/mcp/tools/values-csv-update.js.map +1 -1
  129. package/dist/esm/mcp/tools/values-replace.js.map +1 -1
  130. package/dist/esm/mcp/tools/values-search.js.map +1 -1
  131. package/dist/esm/schemas/index.js.map +1 -1
  132. package/dist/esm/setup/config.js +12 -2
  133. package/dist/esm/setup/config.js.map +1 -1
  134. package/dist/esm/setup/http.js +4 -0
  135. package/dist/esm/setup/http.js.map +1 -1
  136. package/dist/esm/setup/index.js.map +1 -1
  137. package/dist/esm/setup/oauth-google.d.ts +3 -2
  138. package/dist/esm/setup/oauth-google.js +8 -11
  139. package/dist/esm/setup/oauth-google.js.map +1 -1
  140. package/dist/esm/setup/runtime.js.map +1 -1
  141. package/dist/esm/setup/stdio.js.map +1 -1
  142. package/dist/esm/spreadsheet/column-utilities.js.map +1 -1
  143. package/dist/esm/spreadsheet/csv-streaming.js.map +1 -1
  144. package/dist/esm/spreadsheet/data-operations.js.map +1 -1
  145. package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -1
  146. package/dist/esm/spreadsheet/range-operations.js.map +1 -1
  147. package/dist/esm/spreadsheet/sheet-operations.js.map +1 -1
  148. package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -1
  149. package/dist/esm/types.js.map +1 -1
  150. package/package.json +1 -1
package/README.md CHANGED
@@ -50,6 +50,12 @@ MCP supports stdio and HTTP.
50
50
  3. Enable the Google Sheets API.
51
51
  4. Create OAuth 2.0 credentials (Desktop app).
52
52
  5. Copy the Client ID and Client Secret.
53
+ 6. Select your MCP transport (stdio for local and http for remote) and platform
54
+ - For stdio, choose "APIs & Services", + Create client, "Desktop app" type
55
+ - For http, choose "APIs & Services", + Create client, "Web application" type, add your URL (default is http://localhost:3000/oauth/callback based on the --port or PORT)
56
+ - For local hosting, add "http://127.0.0.1" for [Ephemeral redirect URL](https://en.wikipedia.org/wiki/Ephemeral_port)
57
+ 7. Enable OAuth2 [scopes](https://console.cloud.google.com/auth/scopes): openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive
58
+ 8. Add [test emails](https://console.cloud.google.com/auth/audience)
53
59
 
54
60
  ## OAuth modes
55
61
 
@@ -64,7 +70,7 @@ GOOGLE_CLIENT_ID=your-client-id
64
70
  GOOGLE_CLIENT_SECRET=your-client-secret
65
71
  ```
66
72
 
67
- Example:
73
+ Example (stdio) - Create .mcp.json:
68
74
  ```json
69
75
  {
70
76
  "mcpServers": {
@@ -72,14 +78,37 @@ Example:
72
78
  "command": "npx",
73
79
  "args": ["-y", "@mcp-z/mcp-sheets"],
74
80
  "env": {
75
- "GOOGLE_CLIENT_ID": "your-client-id",
76
- "GOOGLE_CLIENT_SECRET": "your-client-secret"
81
+ "GOOGLE_CLIENT_ID": "your-client-id"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ Example (http) - Create .mcp.json:
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "sheets": {
93
+ "type": "http",
94
+ "url": "http://localhost:3000",
95
+ "start": {
96
+ "command": "npx",
97
+ "args": ["-y", "@mcp-z/mcp-sheets", "--port=3000"],
98
+ "env": {
99
+ "GOOGLE_CLIENT_ID": "your-client-id"
100
+ }
77
101
  }
78
102
  }
79
103
  }
80
104
  }
81
105
  ```
82
106
 
107
+ Local (default): omit REDIRECT_URI → ephemeral loopback.
108
+ Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
109
+
110
+ Note: start block is a helper in "npx @mcp-z/cli up" for starting an http server from your .mpc.json. See [@mcp-z/cli](https://github.com/mcp-z/cli) for details.
111
+
83
112
  ### Service account
84
113
 
85
114
  Environment variables:
package/bin/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // biome-ignore lint/security/noGlobalEval: dual esm and cjs
4
- if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-sheets')).catch((err) => { console.log(err); process.exit(-1); });");
4
+ if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-sheets')).catch((err) => { console.error(err); process.exit(-1); });");
5
5
  else require('../dist/cjs/index.js')(process.argv.slice(2), 'mcp-sheets');
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/constants.ts"],"sourcesContent":["/**\n * Sheets MCP Server Constants\n *\n * These scopes are required for Google Sheets and Drive functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\n// Google OAuth scopes required for Sheets and Drive operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive';\n"],"names":["GOOGLE_SCOPE"],"mappings":"AAAA;;;;;CAKC,GAED,+DAA+D;;;;;+BAClDA;;;eAAAA;;;AAAN,IAAMA,eAAe"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/constants.ts"],"sourcesContent":["/**\n * Sheets MCP Server Constants\n *\n * These scopes are required for Google Sheets and Drive functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\n// Google OAuth scopes required for Sheets and Drive operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive';\n"],"names":["GOOGLE_SCOPE"],"mappings":"AAAA;;;;;CAKC,GAED,+DAA+D;;;;;+BAClDA;;;eAAAA;;;AAAN,IAAMA,eAAe"}
package/dist/cjs/index.js CHANGED
@@ -16,25 +16,25 @@ _export(exports, {
16
16
  return main;
17
17
  },
18
18
  get mcp () {
19
- return _index;
19
+ return _indexts;
20
20
  },
21
21
  get schemas () {
22
- return _index1;
22
+ return _indexts1;
23
23
  },
24
24
  get setup () {
25
- return _index2;
25
+ return _indexts2;
26
26
  },
27
27
  get startServer () {
28
28
  return startServer;
29
29
  }
30
30
  });
31
- var _config = require("./setup/config.js");
32
- var _http = require("./setup/http.js");
33
- var _stdio = require("./setup/stdio.js");
31
+ var _configts = require("./setup/config.js");
32
+ var _httpts = require("./setup/http.js");
33
+ var _stdiots = require("./setup/stdio.js");
34
34
  var _constantsts = require("./constants.js");
35
- var _index = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
36
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
37
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
35
+ var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
36
+ var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
37
+ var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
38
38
  _export_star(require("./types.js"), exports);
39
39
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
40
40
  try {
@@ -230,7 +230,7 @@ function startServer(config) {
230
230
  ];
231
231
  return [
232
232
  4,
233
- (0, _stdio.createStdioServer)(config)
233
+ (0, _stdiots.createStdioServer)(config)
234
234
  ];
235
235
  case 1:
236
236
  _tmp = _state.sent();
@@ -241,7 +241,7 @@ function startServer(config) {
241
241
  case 2:
242
242
  return [
243
243
  4,
244
- (0, _http.createHTTPServer)(config)
244
+ (0, _httpts.createHTTPServer)(config)
245
245
  ];
246
246
  case 3:
247
247
  _tmp = _state.sent();
@@ -288,13 +288,13 @@ function main() {
288
288
  switch(_state.label){
289
289
  case 0:
290
290
  // Check for help/version flags FIRST, before config parsing
291
- versionHelpResult = (0, _config.handleVersionHelp)(process.argv);
291
+ versionHelpResult = (0, _configts.handleVersionHelp)(process.argv);
292
292
  if (versionHelpResult.handled) {
293
293
  console.log(versionHelpResult.output);
294
294
  process.exit(0);
295
295
  }
296
296
  // Only parse config if no help/version flags
297
- config = (0, _config.createConfig)();
297
+ config = (0, _configts.createConfig)();
298
298
  return [
299
299
  4,
300
300
  startServer(config)
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.js';\nimport { createHTTPServer } from './setup/http.js';\nimport { createStdioServer } from './setup/stdio.js';\nimport type { ServerConfig } from './types.js';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.js';\nexport * as schemas from './schemas/index.js';\nexport * as setup from './setup/index.js';\nexport * from './types.js';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["GOOGLE_SCOPE","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,yBAAY;;QAkBrB;eAA8BC;;QAjBlBC;;;QACAC;;;QACAC;;;QAGUC;eAAAA;;;sBAX0B;oBACf;qBACC;2BAGL;6DACR;8DACI;8DACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,wBAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,sBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAehB;;YAEtBiB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,yBAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,oBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["GOOGLE_SCOPE","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,yBAAY;;QAkBrB;eAA8BC;;QAjBlBC;;;QACAC;;;QACAC;;;QAGUC;eAAAA;;;wBAX0B;sBACf;uBACC;2BAGL;+DACR;gEACI;gEACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,0BAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,wBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAehB;;YAEtBiB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,2BAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,sBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["createStore","uri","store","keyvRegistry","Error"],"mappings":";;;;+BAGA;;;eAA8BA;;;mEAFL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAAeA,YAAeC,GAAW;;YAChDC;;;;oBAAQ;;wBAAMC,IAAAA,qBAAY,EAAIF;;;oBAA9BC,QAAQ;oBACd,IAAI,CAACA,OAAO,MAAM,IAAIE,MAAM,AAAC,mCAAsC,OAAJH;oBAC/D;;wBAAOC;;;;IACT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["createStore","uri","store","keyvRegistry","Error"],"mappings":";;;;+BAGA;;;eAA8BA;;;mEAFL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAAeA,YAAeC,GAAW;;YAChDC;;;;oBAAQ;;wBAAMC,IAAAA,qBAAY,EAAIF;;;oBAA9BC,QAAQ;oBACd,IAAI,CAACA,OAAO,MAAM,IAAIE,MAAM,AAAC,mCAAsC,OAAJH;oBAC/D;;wBAAOC;;;;IACT"}
@@ -10,18 +10,18 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  get promptFactories () {
13
- return _index;
13
+ return _indexts;
14
14
  },
15
15
  get resourceFactories () {
16
- return _index1;
16
+ return _indexts1;
17
17
  },
18
18
  get toolFactories () {
19
- return _index2;
19
+ return _indexts2;
20
20
  }
21
21
  });
22
- var _index = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
23
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
24
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
22
+ var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
23
+ var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
24
+ var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
25
25
  function _getRequireWildcardCache(nodeInterop) {
26
26
  if (typeof WeakMap !== "function") return null;
27
27
  var cacheBabelInterop = new WeakMap();
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;6DAFqB;8DACE;8DACJ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;+DAFqB;gEACE;gEACJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/prompts/a1-notation.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Sheets A1 notation syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Sheets A1 Notation Reference\n\nA1 notation identifies cells and ranges in Google Sheets.\n\n## Cell References\n- \\`B5\\` - Single cell at column B, row 5\n- \\`A1\\` - Top-left cell\n\n## Range References\n- \\`A1:D10\\` - Rectangle from A1 to D10\n- \\`A5:D5\\` - Single row (columns A-D of row 5)\n- \\`B1:B10\\` - Single column segment (rows 1-10 of column B)\n\n## Full Row/Column References\n- \\`5:5\\` - Entire row 5\n- \\`B:B\\` - Entire column B\n- \\`A:D\\` - Columns A through D (all rows)\n- \\`1:10\\` - Rows 1 through 10 (all columns)\n\n## Common Patterns\n| Goal | Notation |\n|------|----------|\n| Get one cell | \\`B5\\` |\n| Get a row | \\`A5:Z5\\` or \\`5:5\\` |\n| Get a column | \\`B:B\\` or \\`B1:B1000\\` |\n| Get a data table | \\`A1:F100\\` |\n| Get headers | \\`1:1\\` or \\`A1:Z1\\` |`,\n },\n },\n ],\n };\n };\n\n return {\n name: 'a1-notation',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":";;;;+BAIA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;IACf;IAEA,IAAMC,UAAU,SAAOC,OAAiCC;;;gBACtD;;oBAAO;wBACLC,QAAQ;4BACN;gCACEC,MAAM;gCACNC,SAAS;oCACPC,MAAM;oCACNC,MAAM;gCA2BR;4BACF;;oBAEJ;;;QACF;;IAEA,OAAO;QACLC,MAAM;QACNV,QAAAA;QACAE,SAAAA;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/prompts/a1-notation.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Sheets A1 notation syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Sheets A1 Notation Reference\n\nA1 notation identifies cells and ranges in Google Sheets.\n\n## Cell References\n- \\`B5\\` - Single cell at column B, row 5\n- \\`A1\\` - Top-left cell\n\n## Range References\n- \\`A1:D10\\` - Rectangle from A1 to D10\n- \\`A5:D5\\` - Single row (columns A-D of row 5)\n- \\`B1:B10\\` - Single column segment (rows 1-10 of column B)\n\n## Full Row/Column References\n- \\`5:5\\` - Entire row 5\n- \\`B:B\\` - Entire column B\n- \\`A:D\\` - Columns A through D (all rows)\n- \\`1:10\\` - Rows 1 through 10 (all columns)\n\n## Common Patterns\n| Goal | Notation |\n|------|----------|\n| Get one cell | \\`B5\\` |\n| Get a row | \\`A5:Z5\\` or \\`5:5\\` |\n| Get a column | \\`B:B\\` or \\`B1:B1000\\` |\n| Get a data table | \\`A1:F100\\` |\n| Get headers | \\`1:1\\` or \\`A1:Z1\\` |`,\n },\n },\n ],\n };\n };\n\n return {\n name: 'a1-notation',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":";;;;+BAIA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;IACf;IAEA,IAAMC,UAAU,SAAOC,OAAiCC;;;gBACtD;;oBAAO;wBACLC,QAAQ;4BACN;gCACEC,MAAM;gCACNC,SAAS;oCACPC,MAAM;oCACNC,MAAM;gCA2BR;4BACF;;oBAEJ;;;QACF;;IAEA,OAAO;QACLC,MAAM;QACNV,QAAAA;QACAE,SAAAA;IACF;AACF"}
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  Object.defineProperty(exports, "a1Notation", {
6
6
  enumerable: true,
7
7
  get: function() {
8
- return _a1notation.default;
8
+ return _a1notationts.default;
9
9
  }
10
10
  });
11
- var _a1notation = /*#__PURE__*/ _interop_require_default(require("./a1-notation.js"));
11
+ var _a1notationts = /*#__PURE__*/ _interop_require_default(require("./a1-notation.js"));
12
12
  function _interop_require_default(obj) {
13
13
  return obj && obj.__esModule ? obj : {
14
14
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as a1Notation } from './a1-notation.js';\n"],"names":["a1Notation"],"mappings":";;;;+BAAoBA;;;eAAAA,mBAAU;;;iEAAQ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as a1Notation } from './a1-notation.ts';\n"],"names":["a1Notation"],"mappings":";;;;+BAAoBA;;;eAAAA,qBAAU;;;mEAAQ"}
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  Object.defineProperty(exports, "spreadsheet", {
6
6
  enumerable: true,
7
7
  get: function() {
8
- return _spreadsheet.default;
8
+ return _spreadsheetts.default;
9
9
  }
10
10
  });
11
- var _spreadsheet = /*#__PURE__*/ _interop_require_default(require("./spreadsheet.js"));
11
+ var _spreadsheetts = /*#__PURE__*/ _interop_require_default(require("./spreadsheet.js"));
12
12
  function _interop_require_default(obj) {
13
13
  return obj && obj.__esModule ? obj : {
14
14
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/resources/index.ts"],"sourcesContent":["export { default as spreadsheet } from './spreadsheet.js';\n"],"names":["spreadsheet"],"mappings":";;;;+BAAoBA;;;eAAAA,oBAAW;;;kEAAQ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/resources/index.ts"],"sourcesContent":["export { default as spreadsheet } from './spreadsheet.ts';\n"],"names":["spreadsheet"],"mappings":";;;;+BAAoBA;;;eAAAA,sBAAW;;;oEAAQ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/resources/spreadsheet.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { google, type sheets_v4 } from 'googleapis';\nimport type { GoogleApiError } from '../../types.js';\n\nexport default function createResource(): ResourceModule {\n const template = new ResourceTemplate('sheets://spreadsheets/{spreadsheetId}', { list: undefined });\n const config: ResourceConfig = {\n description: 'Sheets spreadsheet resource',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: Record<string, string | string[]>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n const spreadsheetId = Array.isArray(variables.spreadsheetId) ? variables.spreadsheetId[0] : variables.spreadsheetId;\n\n if (!spreadsheetId) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: 'spreadsheetId is required' }),\n },\n ],\n };\n }\n\n try {\n // Safe type guard to access middleware-enriched extra\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n const sheets = google.sheets({ version: 'v4', auth: authContext.auth });\n const resp = await sheets.spreadsheets.get({\n spreadsheetId,\n fields: 'spreadsheetId,properties.title,sheets.properties',\n });\n const data = resp.data as sheets_v4.Schema$Spreadsheet;\n logger.info('sheets-spreadsheet resource fetch success', {\n spreadsheetId: data.spreadsheetId,\n title: data?.properties?.title,\n sheetCount: (data?.sheets || []).length,\n });\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n id: data?.spreadsheetId,\n title: data?.properties?.title,\n sheets: (data?.sheets || []).map((s) => ({\n id: s?.properties?.sheetId,\n title: s?.properties?.title,\n rowCount: s?.properties?.gridProperties?.rowCount,\n columnCount: s?.properties?.gridProperties?.columnCount,\n })),\n }),\n },\n ],\n };\n } catch (error) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.info('sheets-spreadsheet resource fetch failed', error as Record<string, unknown>);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n error: String((error as GoogleApiError)?.message ?? error),\n }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'spreadsheet',\n template,\n config,\n handler,\n };\n}\n"],"names":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","spreadsheetId","data","logger","authContext","sheets","resp","error","Array","isArray","contents","href","text","JSON","stringify","google","version","auth","spreadsheets","get","fields","info","title","properties","sheetCount","length","id","map","s","sheetId","rowCount","gridProperties","columnCount","String","message","name"],"mappings":";;;;+BAQA;;;eAAwBA;;;mBANS;0BAGM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGxB,SAASA;IACtB,IAAMC,WAAW,IAAIC,qBAAgB,CAAC,yCAAyC;QAAEC,MAAMC;IAAU;IACjG,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,SAAOC,KAAUC,WAA8CC;;gBACvEC,eAyBKC,kBAUMA,mBAnBPC,QAAQC,aACVC,QACAC,MAIAJ,MAwBCK,aACCJ;;;;wBA/CJF,gBAAgBO,MAAMC,OAAO,CAACV,UAAUE,aAAa,IAAIF,UAAUE,aAAa,CAAC,EAAE,GAAGF,UAAUE,aAAa;wBAEnH,IAAI,CAACA,eAAe;4BAClB;;gCAAO;oCACLS,QAAQ;wCACN;4CACEZ,KAAKA,IAAIa,IAAI;4CACbf,UAAU;4CACVgB,MAAMC,KAAKC,SAAS,CAAC;gDAAEP,OAAO;4CAA4B;wCAC5D;;gCAEJ;;wBACF;;;;;;;;;wBAGE,sDAAsD;wBAC9CJ,SAAwBH,MAAxBG,QAAQC,cAAgBJ,MAAhBI;wBACVC,SAASU,kBAAM,CAACV,MAAM,CAAC;4BAAEW,SAAS;4BAAMC,MAAMb,YAAYa,IAAI;wBAAC;wBACxD;;4BAAMZ,OAAOa,YAAY,CAACC,GAAG,CAAC;gCACzClB,eAAAA;gCACAmB,QAAQ;4BACV;;;wBAHMd,OAAO;wBAIPJ,OAAOI,KAAKJ,IAAI;wBACtBC,OAAOkB,IAAI,CAAC,6CAA6C;4BACvDpB,eAAeC,KAAKD,aAAa;4BACjCqB,KAAK,EAAEpB,iBAAAA,4BAAAA,mBAAAA,KAAMqB,UAAU,cAAhBrB,uCAAAA,iBAAkBoB,KAAK;4BAC9BE,YAAY,AAACtB,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAMG,MAAM,OAAK,EAAGoB,MAAM;wBACzC;wBACA;;4BAAO;gCACLf,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAAC;4CACnBY,EAAE,EAAExB,iBAAAA,2BAAAA,KAAMD,aAAa;4CACvBqB,KAAK,EAAEpB,iBAAAA,4BAAAA,oBAAAA,KAAMqB,UAAU,cAAhBrB,wCAAAA,kBAAkBoB,KAAK;4CAC9BjB,QAAQ,AAACH,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAMG,MAAM,OAAK,EAAGsB,GAAG,CAAC,SAACC;oDAC5BA,eACGA,gBACGA,8BAAAA,gBACGA,+BAAAA;uDAJ0B;oDACvCF,EAAE,EAAEE,cAAAA,yBAAAA,gBAAAA,EAAGL,UAAU,cAAbK,oCAAAA,cAAeC,OAAO;oDAC1BP,KAAK,EAAEM,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,qCAAAA,eAAeN,KAAK;oDAC3BQ,QAAQ,EAAEF,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,sCAAAA,+BAAAA,eAAeG,cAAc,cAA7BH,mDAAAA,6BAA+BE,QAAQ;oDACjDE,WAAW,EAAEJ,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,sCAAAA,gCAAAA,eAAeG,cAAc,cAA7BH,oDAAAA,8BAA+BI,WAAW;gDACzD;;wCACF;oCACF;;4BAEJ;;;wBACOzB;wBACCJ,UAAWH,MAAXG;wBACRA,QAAOkB,IAAI,CAAC,4CAA4Cd;wBACxD;;4BAAO;gCACLG,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAAC;4CACnBP,OAAO0B,eAAQ1B,kBAAAA,4BAAD,AAACA,MAA0B2B,OAAO,uCAAI3B;wCACtD;oCACF;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACL4B,MAAM;QACN7C,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/resources/spreadsheet.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { google, type sheets_v4 } from 'googleapis';\nimport type { GoogleApiError } from '../../types.ts';\n\nexport default function createResource(): ResourceModule {\n const template = new ResourceTemplate('sheets://spreadsheets/{spreadsheetId}', { list: undefined });\n const config: ResourceConfig = {\n description: 'Sheets spreadsheet resource',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: Record<string, string | string[]>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n const spreadsheetId = Array.isArray(variables.spreadsheetId) ? variables.spreadsheetId[0] : variables.spreadsheetId;\n\n if (!spreadsheetId) {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: 'spreadsheetId is required' }),\n },\n ],\n };\n }\n\n try {\n // Safe type guard to access middleware-enriched extra\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n const sheets = google.sheets({ version: 'v4', auth: authContext.auth });\n const resp = await sheets.spreadsheets.get({\n spreadsheetId,\n fields: 'spreadsheetId,properties.title,sheets.properties',\n });\n const data = resp.data as sheets_v4.Schema$Spreadsheet;\n logger.info('sheets-spreadsheet resource fetch success', {\n spreadsheetId: data.spreadsheetId,\n title: data?.properties?.title,\n sheetCount: (data?.sheets || []).length,\n });\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n id: data?.spreadsheetId,\n title: data?.properties?.title,\n sheets: (data?.sheets || []).map((s) => ({\n id: s?.properties?.sheetId,\n title: s?.properties?.title,\n rowCount: s?.properties?.gridProperties?.rowCount,\n columnCount: s?.properties?.gridProperties?.columnCount,\n })),\n }),\n },\n ],\n };\n } catch (error) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.info('sheets-spreadsheet resource fetch failed', error as Record<string, unknown>);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n error: String((error as GoogleApiError)?.message ?? error),\n }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'spreadsheet',\n template,\n config,\n handler,\n };\n}\n"],"names":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","spreadsheetId","data","logger","authContext","sheets","resp","error","Array","isArray","contents","href","text","JSON","stringify","google","version","auth","spreadsheets","get","fields","info","title","properties","sheetCount","length","id","map","s","sheetId","rowCount","gridProperties","columnCount","String","message","name"],"mappings":";;;;+BAQA;;;eAAwBA;;;mBANS;0BAGM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGxB,SAASA;IACtB,IAAMC,WAAW,IAAIC,qBAAgB,CAAC,yCAAyC;QAAEC,MAAMC;IAAU;IACjG,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,SAAOC,KAAUC,WAA8CC;;gBACvEC,eAyBKC,kBAUMA,mBAnBPC,QAAQC,aACVC,QACAC,MAIAJ,MAwBCK,aACCJ;;;;wBA/CJF,gBAAgBO,MAAMC,OAAO,CAACV,UAAUE,aAAa,IAAIF,UAAUE,aAAa,CAAC,EAAE,GAAGF,UAAUE,aAAa;wBAEnH,IAAI,CAACA,eAAe;4BAClB;;gCAAO;oCACLS,QAAQ;wCACN;4CACEZ,KAAKA,IAAIa,IAAI;4CACbf,UAAU;4CACVgB,MAAMC,KAAKC,SAAS,CAAC;gDAAEP,OAAO;4CAA4B;wCAC5D;;gCAEJ;;wBACF;;;;;;;;;wBAGE,sDAAsD;wBAC9CJ,SAAwBH,MAAxBG,QAAQC,cAAgBJ,MAAhBI;wBACVC,SAASU,kBAAM,CAACV,MAAM,CAAC;4BAAEW,SAAS;4BAAMC,MAAMb,YAAYa,IAAI;wBAAC;wBACxD;;4BAAMZ,OAAOa,YAAY,CAACC,GAAG,CAAC;gCACzClB,eAAAA;gCACAmB,QAAQ;4BACV;;;wBAHMd,OAAO;wBAIPJ,OAAOI,KAAKJ,IAAI;wBACtBC,OAAOkB,IAAI,CAAC,6CAA6C;4BACvDpB,eAAeC,KAAKD,aAAa;4BACjCqB,KAAK,EAAEpB,iBAAAA,4BAAAA,mBAAAA,KAAMqB,UAAU,cAAhBrB,uCAAAA,iBAAkBoB,KAAK;4BAC9BE,YAAY,AAACtB,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAMG,MAAM,OAAK,EAAGoB,MAAM;wBACzC;wBACA;;4BAAO;gCACLf,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAAC;4CACnBY,EAAE,EAAExB,iBAAAA,2BAAAA,KAAMD,aAAa;4CACvBqB,KAAK,EAAEpB,iBAAAA,4BAAAA,oBAAAA,KAAMqB,UAAU,cAAhBrB,wCAAAA,kBAAkBoB,KAAK;4CAC9BjB,QAAQ,AAACH,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAMG,MAAM,OAAK,EAAGsB,GAAG,CAAC,SAACC;oDAC5BA,eACGA,gBACGA,8BAAAA,gBACGA,+BAAAA;uDAJ0B;oDACvCF,EAAE,EAAEE,cAAAA,yBAAAA,gBAAAA,EAAGL,UAAU,cAAbK,oCAAAA,cAAeC,OAAO;oDAC1BP,KAAK,EAAEM,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,qCAAAA,eAAeN,KAAK;oDAC3BQ,QAAQ,EAAEF,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,sCAAAA,+BAAAA,eAAeG,cAAc,cAA7BH,mDAAAA,6BAA+BE,QAAQ;oDACjDE,WAAW,EAAEJ,cAAAA,yBAAAA,iBAAAA,EAAGL,UAAU,cAAbK,sCAAAA,gCAAAA,eAAeG,cAAc,cAA7BH,oDAAAA,8BAA+BI,WAAW;gDACzD;;wCACF;oCACF;;4BAEJ;;;wBACOzB;wBACCJ,UAAWH,MAAXG;wBACRA,QAAOkB,IAAI,CAAC,4CAA4Cd;wBACxD;;4BAAO;gCACLG,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAAC;4CACnBP,OAAO0B,eAAQ1B,kBAAAA,4BAAD,AAACA,MAA0B2B,OAAO,uCAAI3B;wCACtD;oCACF;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACL4B,MAAM;QACN7C,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
@@ -12,8 +12,8 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
16
- var _rangeoperations = require("../../spreadsheet/range-operations.js");
15
+ var _indexts = require("../../schemas/index.js");
16
+ var _rangeoperationsts = require("../../spreadsheet/range-operations.js");
17
17
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
18
18
  try {
19
19
  var info = gen[key](arg);
@@ -193,14 +193,14 @@ var FormatRequestSchema = _zod.z.object({
193
193
  borders: BorderSchema.optional().describe('Cell borders')
194
194
  });
195
195
  var inputSchema = _zod.z.object({
196
- id: _index.SpreadsheetIdSchema,
197
- gid: _index.SheetGidSchema,
196
+ id: _indexts.SpreadsheetIdSchema,
197
+ gid: _indexts.SheetGidSchema,
198
198
  requests: _zod.z.array(FormatRequestSchema).min(1).max(50).describe('Array of formatting requests. Batch multiple ranges for efficiency.')
199
199
  });
200
200
  var successBranchSchema = _zod.z.object({
201
201
  type: _zod.z.literal('success'),
202
- id: _index.SpreadsheetIdOutput,
203
- gid: _index.SheetGidOutput,
202
+ id: _indexts.SpreadsheetIdOutput,
203
+ gid: _indexts.SheetGidOutput,
204
204
  sheetTitle: _zod.z.string().describe('Title of the formatted sheet'),
205
205
  sheetUrl: _zod.z.string().describe('URL of the formatted sheet'),
206
206
  successCount: _zod.z.number().int().nonnegative().describe('Number of format requests successfully applied'),
@@ -279,9 +279,9 @@ function handler(_0, _1) {
279
279
  request = _step.value;
280
280
  try {
281
281
  // Parse A1 notation to range reference
282
- rangeRef = (0, _rangeoperations.parseA1Notation)(request.range);
282
+ rangeRef = (0, _rangeoperationsts.parseA1Notation)(request.range);
283
283
  // Build grid range from range reference using helper function
284
- gridRange = (0, _rangeoperations.rangeReferenceToGridRange)(rangeRef, sheetId);
284
+ gridRange = (0, _rangeoperationsts.rangeReferenceToGridRange)(rangeRef, sheetId);
285
285
  // Build cell format object
286
286
  cellFormat = {};
287
287
  fields = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/cells-format.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 { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';\nimport { parseA1Notation, rangeReferenceToGridRange } from '../../spreadsheet/range-operations.js';\n\n// RGB color schema (0-1 range for Google Sheets API)\nconst ColorSchema = z.object({\n red: z.number().min(0).max(1).describe('Red component (0-1)'),\n green: z.number().min(0).max(1).describe('Green component (0-1)'),\n blue: z.number().min(0).max(1).describe('Blue component (0-1)'),\n});\n\n// Number format schema\nconst NumberFormatSchema = z.object({\n type: z.enum(['TEXT', 'NUMBER', 'PERCENT', 'CURRENCY', 'DATE', 'TIME']).describe('Number format type'),\n pattern: z.string().optional().describe('Custom format pattern (e.g., \"$#,##0.00\" for currency)'),\n});\n\n// Border schema\nconst BorderSchema = z.object({\n style: z.enum(['SOLID', 'DASHED', 'DOTTED']).describe('Border line style'),\n color: ColorSchema.describe('Border color'),\n});\n\n// Input schema for format requests\nconst FormatRequestSchema = z.object({\n range: z.string().min(1).describe('A1 notation range to format (e.g., \"A1:D10\", \"B:B\", \"5:5\")'),\n backgroundColor: ColorSchema.optional().describe('Cell background color'),\n textColor: ColorSchema.optional().describe('Text color'),\n bold: z.boolean().optional().describe('Bold text'),\n fontSize: z.number().int().min(6).max(36).optional().describe('Font size in points'),\n horizontalAlignment: z.enum(['LEFT', 'CENTER', 'RIGHT']).optional().describe('Horizontal text alignment'),\n numberFormat: NumberFormatSchema.optional().describe('Number format pattern'),\n borders: BorderSchema.optional().describe('Cell borders'),\n});\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n requests: z.array(FormatRequestSchema).min(1).max(50).describe('Array of formatting requests. Batch multiple ranges for efficiency.'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Title of the formatted sheet'),\n sheetUrl: z.string().describe('URL of the formatted sheet'),\n successCount: z.number().int().nonnegative().describe('Number of format requests successfully applied'),\n failedRanges: z\n .array(\n z.object({\n range: z.string().describe('A1 notation of range that failed'),\n error: z.string().describe('Why formatting failed for this range'),\n })\n )\n .optional()\n .describe('Only populated if some ranges failed to format'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Apply formatting (colors, borders, fonts, alignment, number formats) to cell ranges without modifying data. Supports batch operations for efficiency. Colors use 0-1 RGB format. Best for creating professional, visually organized spreadsheets.',\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, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.cells.format called', {\n id,\n gid,\n requestCount: requests.length,\n });\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: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n // Find sheet by gid\n const sheet = spreadsheetResponse.data.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n logger.info('Sheet not found for format cells', { id, gid, requestCount: requests.length });\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? gid;\n const sheetId = sheet.properties.sheetId;\n const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`;\n\n // Build batch update requests\n const batchRequests: sheets_v4.Schema$Request[] = [];\n const failedRanges: Array<{ range: string; error: string }> = [];\n\n for (const request of requests) {\n try {\n // Parse A1 notation to range reference\n const rangeRef = parseA1Notation(request.range);\n\n // Build grid range from range reference using helper function\n const gridRange = rangeReferenceToGridRange(rangeRef, sheetId);\n\n // Build cell format object\n const cellFormat: {\n backgroundColor?: sheets_v4.Schema$Color;\n textFormat?: sheets_v4.Schema$TextFormat;\n horizontalAlignment?: string;\n numberFormat?: sheets_v4.Schema$NumberFormat;\n } = {};\n const fields: string[] = [];\n\n // Background color\n if (request.backgroundColor) {\n cellFormat.backgroundColor = request.backgroundColor;\n fields.push('backgroundColor');\n }\n\n // Text format\n if (request.textColor || request.bold !== undefined || request.fontSize !== undefined) {\n cellFormat.textFormat = {};\n if (request.textColor) {\n cellFormat.textFormat.foregroundColor = request.textColor;\n fields.push('textFormat.foregroundColor');\n }\n if (request.bold !== undefined) {\n cellFormat.textFormat.bold = request.bold;\n fields.push('textFormat.bold');\n }\n if (request.fontSize !== undefined) {\n cellFormat.textFormat.fontSize = request.fontSize;\n fields.push('textFormat.fontSize');\n }\n }\n\n // Horizontal alignment\n if (request.horizontalAlignment) {\n cellFormat.horizontalAlignment = request.horizontalAlignment;\n fields.push('horizontalAlignment');\n }\n\n // Number format\n if (request.numberFormat) {\n const numberFormat: sheets_v4.Schema$NumberFormat = {\n type: request.numberFormat.type,\n };\n if (request.numberFormat.pattern !== undefined) {\n numberFormat.pattern = request.numberFormat.pattern;\n }\n cellFormat.numberFormat = numberFormat;\n fields.push('numberFormat');\n }\n\n // Add repeatCell request for this range\n if (fields.length > 0) {\n batchRequests.push({\n repeatCell: {\n range: gridRange,\n cell: {\n userEnteredFormat: cellFormat,\n },\n fields: `userEnteredFormat(${fields.join(',')})`,\n },\n });\n }\n\n // Add border formatting if specified\n if (request.borders) {\n batchRequests.push({\n updateBorders: {\n range: gridRange,\n top: {\n style: request.borders.style,\n color: request.borders.color,\n },\n bottom: {\n style: request.borders.style,\n color: request.borders.color,\n },\n left: {\n style: request.borders.style,\n color: request.borders.color,\n },\n right: {\n style: request.borders.style,\n color: request.borders.color,\n },\n },\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.info('Failed to parse range for formatting', {\n range: request.range,\n error: message,\n });\n failedRanges.push({\n range: request.range,\n error: `Failed to parse range: ${message}`,\n });\n }\n }\n\n // Early return if all ranges failed\n if (batchRequests.length === 0) {\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheetId),\n sheetTitle,\n sheetUrl,\n successCount: 0,\n failedRanges: failedRanges.length > 0 ? failedRanges : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n }\n\n logger.info('sheets.cells.format executing batch request', {\n spreadsheetId: id,\n sheetTitle,\n batchRequestsCount: batchRequests.length,\n });\n\n // Execute the batch update\n await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: batchRequests,\n },\n });\n\n logger.info('sheets.cells.format completed successfully', {\n successCount: requests.length - failedRanges.length,\n failedCount: failedRanges.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheetId),\n sheetTitle,\n sheetUrl,\n successCount: requests.length - failedRanges.length,\n failedRanges: failedRanges.length > 0 ? failedRanges : undefined,\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('Format cells operation failed', {\n id,\n gid,\n requestCount: requests.length,\n error: message,\n });\n\n throw new McpError(ErrorCode.InternalError, `Error formatting cells: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'cells-format',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","ColorSchema","z","object","red","number","min","max","describe","green","blue","NumberFormatSchema","type","enum","pattern","string","optional","BorderSchema","style","color","FormatRequestSchema","range","backgroundColor","textColor","bold","boolean","fontSize","int","horizontalAlignment","numberFormat","borders","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","requests","array","successBranchSchema","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","sheetUrl","successCount","nonnegative","failedRanges","error","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sheet","spreadsheetResponse","sheets","sheetId","batchRequests","request","rangeRef","gridRange","cellFormat","fields","message","info","requestCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","data","find","s","String","properties","McpError","ErrorCode","InvalidParams","title","parseA1Notation","rangeReferenceToGridRange","push","undefined","textFormat","foregroundColor","repeatCell","cell","userEnteredFormat","join","updateBorders","top","bottom","left","right","Error","content","text","JSON","stringify","structuredContent","batchRequestsCount","batchUpdate","requestBody","failedCount","InternalError","stack","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-sheets/src/mcp/tools/cells-format.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 { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.ts';\nimport { parseA1Notation, rangeReferenceToGridRange } from '../../spreadsheet/range-operations.ts';\n\n// RGB color schema (0-1 range for Google Sheets API)\nconst ColorSchema = z.object({\n red: z.number().min(0).max(1).describe('Red component (0-1)'),\n green: z.number().min(0).max(1).describe('Green component (0-1)'),\n blue: z.number().min(0).max(1).describe('Blue component (0-1)'),\n});\n\n// Number format schema\nconst NumberFormatSchema = z.object({\n type: z.enum(['TEXT', 'NUMBER', 'PERCENT', 'CURRENCY', 'DATE', 'TIME']).describe('Number format type'),\n pattern: z.string().optional().describe('Custom format pattern (e.g., \"$#,##0.00\" for currency)'),\n});\n\n// Border schema\nconst BorderSchema = z.object({\n style: z.enum(['SOLID', 'DASHED', 'DOTTED']).describe('Border line style'),\n color: ColorSchema.describe('Border color'),\n});\n\n// Input schema for format requests\nconst FormatRequestSchema = z.object({\n range: z.string().min(1).describe('A1 notation range to format (e.g., \"A1:D10\", \"B:B\", \"5:5\")'),\n backgroundColor: ColorSchema.optional().describe('Cell background color'),\n textColor: ColorSchema.optional().describe('Text color'),\n bold: z.boolean().optional().describe('Bold text'),\n fontSize: z.number().int().min(6).max(36).optional().describe('Font size in points'),\n horizontalAlignment: z.enum(['LEFT', 'CENTER', 'RIGHT']).optional().describe('Horizontal text alignment'),\n numberFormat: NumberFormatSchema.optional().describe('Number format pattern'),\n borders: BorderSchema.optional().describe('Cell borders'),\n});\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n requests: z.array(FormatRequestSchema).min(1).max(50).describe('Array of formatting requests. Batch multiple ranges for efficiency.'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n sheetTitle: z.string().describe('Title of the formatted sheet'),\n sheetUrl: z.string().describe('URL of the formatted sheet'),\n successCount: z.number().int().nonnegative().describe('Number of format requests successfully applied'),\n failedRanges: z\n .array(\n z.object({\n range: z.string().describe('A1 notation of range that failed'),\n error: z.string().describe('Why formatting failed for this range'),\n })\n )\n .optional()\n .describe('Only populated if some ranges failed to format'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Apply formatting (colors, borders, fonts, alignment, number formats) to cell ranges without modifying data. Supports batch operations for efficiency. Colors use 0-1 RGB format. Best for creating professional, visually organized spreadsheets.',\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, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('sheets.cells.format called', {\n id,\n gid,\n requestCount: requests.length,\n });\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: 'sheets.properties.sheetId,sheets.properties.title',\n });\n\n // Find sheet by gid\n const sheet = spreadsheetResponse.data.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n logger.info('Sheet not found for format cells', { id, gid, requestCount: requests.length });\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? gid;\n const sheetId = sheet.properties.sheetId;\n const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`;\n\n // Build batch update requests\n const batchRequests: sheets_v4.Schema$Request[] = [];\n const failedRanges: Array<{ range: string; error: string }> = [];\n\n for (const request of requests) {\n try {\n // Parse A1 notation to range reference\n const rangeRef = parseA1Notation(request.range);\n\n // Build grid range from range reference using helper function\n const gridRange = rangeReferenceToGridRange(rangeRef, sheetId);\n\n // Build cell format object\n const cellFormat: {\n backgroundColor?: sheets_v4.Schema$Color;\n textFormat?: sheets_v4.Schema$TextFormat;\n horizontalAlignment?: string;\n numberFormat?: sheets_v4.Schema$NumberFormat;\n } = {};\n const fields: string[] = [];\n\n // Background color\n if (request.backgroundColor) {\n cellFormat.backgroundColor = request.backgroundColor;\n fields.push('backgroundColor');\n }\n\n // Text format\n if (request.textColor || request.bold !== undefined || request.fontSize !== undefined) {\n cellFormat.textFormat = {};\n if (request.textColor) {\n cellFormat.textFormat.foregroundColor = request.textColor;\n fields.push('textFormat.foregroundColor');\n }\n if (request.bold !== undefined) {\n cellFormat.textFormat.bold = request.bold;\n fields.push('textFormat.bold');\n }\n if (request.fontSize !== undefined) {\n cellFormat.textFormat.fontSize = request.fontSize;\n fields.push('textFormat.fontSize');\n }\n }\n\n // Horizontal alignment\n if (request.horizontalAlignment) {\n cellFormat.horizontalAlignment = request.horizontalAlignment;\n fields.push('horizontalAlignment');\n }\n\n // Number format\n if (request.numberFormat) {\n const numberFormat: sheets_v4.Schema$NumberFormat = {\n type: request.numberFormat.type,\n };\n if (request.numberFormat.pattern !== undefined) {\n numberFormat.pattern = request.numberFormat.pattern;\n }\n cellFormat.numberFormat = numberFormat;\n fields.push('numberFormat');\n }\n\n // Add repeatCell request for this range\n if (fields.length > 0) {\n batchRequests.push({\n repeatCell: {\n range: gridRange,\n cell: {\n userEnteredFormat: cellFormat,\n },\n fields: `userEnteredFormat(${fields.join(',')})`,\n },\n });\n }\n\n // Add border formatting if specified\n if (request.borders) {\n batchRequests.push({\n updateBorders: {\n range: gridRange,\n top: {\n style: request.borders.style,\n color: request.borders.color,\n },\n bottom: {\n style: request.borders.style,\n color: request.borders.color,\n },\n left: {\n style: request.borders.style,\n color: request.borders.color,\n },\n right: {\n style: request.borders.style,\n color: request.borders.color,\n },\n },\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.info('Failed to parse range for formatting', {\n range: request.range,\n error: message,\n });\n failedRanges.push({\n range: request.range,\n error: `Failed to parse range: ${message}`,\n });\n }\n }\n\n // Early return if all ranges failed\n if (batchRequests.length === 0) {\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheetId),\n sheetTitle,\n sheetUrl,\n successCount: 0,\n failedRanges: failedRanges.length > 0 ? failedRanges : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n }\n\n logger.info('sheets.cells.format executing batch request', {\n spreadsheetId: id,\n sheetTitle,\n batchRequestsCount: batchRequests.length,\n });\n\n // Execute the batch update\n await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: batchRequests,\n },\n });\n\n logger.info('sheets.cells.format completed successfully', {\n successCount: requests.length - failedRanges.length,\n failedCount: failedRanges.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheetId),\n sheetTitle,\n sheetUrl,\n successCount: requests.length - failedRanges.length,\n failedRanges: failedRanges.length > 0 ? failedRanges : undefined,\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('Format cells operation failed', {\n id,\n gid,\n requestCount: requests.length,\n error: message,\n });\n\n throw new McpError(ErrorCode.InternalError, `Error formatting cells: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'cells-format',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","ColorSchema","z","object","red","number","min","max","describe","green","blue","NumberFormatSchema","type","enum","pattern","string","optional","BorderSchema","style","color","FormatRequestSchema","range","backgroundColor","textColor","bold","boolean","fontSize","int","horizontalAlignment","numberFormat","borders","inputSchema","id","SpreadsheetIdSchema","gid","SheetGidSchema","requests","array","successBranchSchema","literal","SpreadsheetIdOutput","SheetGidOutput","sheetTitle","sheetUrl","successCount","nonnegative","failedRanges","error","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","sheet","spreadsheetResponse","sheets","sheetId","batchRequests","request","rangeRef","gridRange","cellFormat","fields","message","info","requestCount","length","google","version","auth","authContext","spreadsheets","get","spreadsheetId","data","find","s","String","properties","McpError","ErrorCode","InvalidParams","title","parseA1Notation","rangeReferenceToGridRange","push","undefined","textFormat","foregroundColor","repeatCell","cell","userEnteredFormat","join","updateBorders","top","bottom","left","right","Error","content","text","JSON","stringify","structuredContent","batchRequestsCount","batchUpdate","requestBody","failedCount","InternalError","stack","name"],"mappings":"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"}
@@ -12,8 +12,8 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
12
12
  var _types = require("@modelcontextprotocol/sdk/types.js");
13
13
  var _googleapis = require("googleapis");
14
14
  var _zod = require("zod");
15
- var _index = require("../../schemas/index.js");
16
- var _rangeoperations = require("../../spreadsheet/range-operations.js");
15
+ var _indexts = require("../../schemas/index.js");
16
+ var _rangeoperationsts = require("../../spreadsheet/range-operations.js");
17
17
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
18
18
  try {
19
19
  var info = gen[key](arg);
@@ -157,8 +157,8 @@ var ChartPositionSchema = _zod.z.object({
157
157
  offsetY: _zod.z.number().int().default(0).describe('Vertical pixel offset from anchor')
158
158
  });
159
159
  var inputSchema = _zod.z.object({
160
- id: _index.SpreadsheetIdSchema,
161
- gid: _index.SheetGidSchema,
160
+ id: _indexts.SpreadsheetIdSchema,
161
+ gid: _indexts.SheetGidSchema,
162
162
  chartType: _zod.z.enum([
163
163
  'PIE',
164
164
  'BAR',
@@ -180,8 +180,8 @@ var inputSchema = _zod.z.object({
180
180
  // Success branch schema
181
181
  var successBranchSchema = _zod.z.object({
182
182
  type: _zod.z.literal('success'),
183
- id: _index.SpreadsheetIdOutput,
184
- gid: _index.SheetGidOutput,
183
+ id: _indexts.SpreadsheetIdOutput,
184
+ gid: _indexts.SheetGidOutput,
185
185
  sheetTitle: _zod.z.string().describe('Title of the sheet containing the chart'),
186
186
  sheetUrl: _zod.z.string().describe('URL of the sheet containing the chart'),
187
187
  chartId: _zod.z.number().int().describe('Unique chart ID for future updates/deletion'),
@@ -298,8 +298,8 @@ function handler(_0, _1) {
298
298
  throw new _types.McpError(_types.ErrorCode.InvalidParams, "Failed to parse anchor cell: ".concat(message));
299
299
  }
300
300
  try {
301
- rangeRef = (0, _rangeoperations.parseA1Notation)(dataRange);
302
- dataGridRange = (0, _rangeoperations.rangeReferenceToGridRange)(rangeRef, sheetId);
301
+ rangeRef = (0, _rangeoperationsts.parseA1Notation)(dataRange);
302
+ dataGridRange = (0, _rangeoperationsts.rangeReferenceToGridRange)(rangeRef, sheetId);
303
303
  // Validate that required properties are defined for chart creation
304
304
  if (dataGridRange.startColumnIndex === undefined || dataGridRange.startColumnIndex === null) {
305
305
  throw new Error('Data range must include column information');