@mcp-z/mcp-sheets 1.2.2 → 1.2.4

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @mcp-z/mcp-sheets
2
2
 
3
- Docs: https://mcp-z.github.io/mcp-sheets Google Sheets MCP server for reading, writing, and formatting spreadsheets.
3
+ MCP server for Google Sheets integration with OAuth authentication, spreadsheet management, batch operations, and advanced formatting
4
4
 
5
5
  ## Common uses
6
6
 
@@ -223,3 +223,7 @@ TOKEN_STORE_URI=redis://localhost:6379 mcp-sheets
223
223
  ```
224
224
 
225
225
  A protocol whose adapter is missing fails at startup naming the package to install.
226
+
227
+ ### Documentation
228
+
229
+ [API Docs](https://mcp-z.github.io/mcp-sheets)
@@ -172,7 +172,7 @@ function _unsupported_iterable_to_array(o, minLen) {
172
172
  }
173
173
  function createHTTPServer(config, overrides) {
174
174
  return _async_to_generator(function() {
175
- var runtime, modules, layers, composed, logger, port, tools, prompts, mcpServer, app, _ref, close, httpServer;
175
+ var runtime, modules, layers, composed, logger, port, tools, prompts, mcpServer, app, publicUrl, _ref, close, httpServer;
176
176
  return _ts_generator(this, function(_state) {
177
177
  switch(_state.label){
178
178
  case 0:
@@ -200,29 +200,40 @@ function createHTTPServer(config, overrides) {
200
200
  (0, _server.registerResources)(mcpServer, composed.resources);
201
201
  (0, _server.registerPrompts)(mcpServer, prompts);
202
202
  app = (0, _express.default)();
203
- app.use((0, _cors.default)());
204
203
  app.use(_express.default.json({
205
204
  limit: '10mb'
206
205
  }));
207
- if (runtime.deps.oauthAdapters.loopbackRouter) {
208
- app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
209
- logger.info('Mounted loopback OAuth callback router');
210
- }
211
- if (runtime.deps.oauthAdapters.dcrRouter) {
212
- app.use('/', runtime.deps.oauthAdapters.dcrRouter);
213
- logger.info('Mounted DCR router with OAuth endpoints');
214
- }
206
+ // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
207
+ // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
208
+ publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
215
209
  logger.info("Starting ".concat(config.name, " MCP server (http)"));
216
210
  return [
217
211
  4,
218
212
  (0, _server.connectHttp)(mcpServer, {
219
213
  logger: logger,
220
214
  app: app,
221
- port: port
215
+ port: port,
216
+ allowedOrigins: publicUrl ? [
217
+ publicUrl.origin
218
+ ] : undefined,
219
+ allowedHosts: publicUrl ? [
220
+ publicUrl.host
221
+ ] : undefined
222
222
  })
223
223
  ];
224
224
  case 2:
225
225
  _ref = _state.sent(), close = _ref.close, httpServer = _ref.httpServer;
226
+ // The loopback OAuth callback and the DCR discovery/registration endpoints are
227
+ // meant to be reached from a browser on another origin. Keep cors() for them,
228
+ // scoped to their own routes - never in front of '/mcp'.
229
+ if (runtime.deps.oauthAdapters.loopbackRouter) {
230
+ app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.loopbackRouter);
231
+ logger.info('Mounted loopback OAuth callback router');
232
+ }
233
+ if (runtime.deps.oauthAdapters.dcrRouter) {
234
+ app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.dcrRouter);
235
+ logger.info('Mounted DCR router with OAuth endpoints');
236
+ }
226
237
  logger.info('http transport ready');
227
238
  return [
228
239
  2,
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(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 const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\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 const app = express();\n app.use(cors());\n app.use(express.json({ limit: '10mb' }));\n\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, { logger, app, port });\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","prompts","mcpServer","app","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","express","use","cors","json","limit","loopbackRouter","info","dcrRouter","connectHttp"],"mappings":";;;;+BAOsBA;;;eAAAA;;;sBAP4E;mBACxE;2DACT;8DACG;yBAEiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,iBAAiBC,MAAoB,EAAEC,SAA4B;;YACjFC,SACAC,SACAC,QACAC,UACAC,QACAC,MAGAC,OACAC,SAEAC,WAKAC,KAewB,MAAtBC,OAAOC;;;;oBA/BC;;wBAAMC,IAAAA,+BAAoB,EAACd,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQa,mBAAmB;oBACrCX,SAASF,QAAQc,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQhB,QAAQiB,IAAI;;oBAC1Ed,WAAWe,IAAAA,yBAAiB,EAACjB,SAASC;oBACtCE,SAASJ,QAAQiB,IAAI,CAACb,MAAM;oBAC5BC,OAAOP,OAAOqB,SAAS,CAACd,IAAI;oBAClC,IAAI,CAACA,MAAM,MAAM,IAAIe,MAAM;oBAErBd,QAAQ,AAAC,qBAAGH,SAASG,KAAK,SAAE,qBAAGN,QAAQiB,IAAI,CAACI,aAAa,CAACC,YAAY;oBACtEf,UAAU,AAAC,qBAAGJ,SAASI,OAAO,SAAE,qBAAGP,QAAQiB,IAAI,CAACI,aAAa,CAACE,cAAc;oBAE5Ef,YAAY,IAAIgB,cAAS,CAAC;wBAAEC,MAAM3B,OAAO2B,IAAI;wBAAEC,SAAS5B,OAAO4B,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACnB,WAAWF;oBACzBsB,IAAAA,yBAAiB,EAACpB,WAAWL,SAAS0B,SAAS;oBAC/CC,IAAAA,uBAAe,EAACtB,WAAWD;oBAErBE,MAAMsB,IAAAA,gBAAO;oBACnBtB,IAAIuB,GAAG,CAACC,IAAAA,aAAI;oBACZxB,IAAIuB,GAAG,CAACD,gBAAO,CAACG,IAAI,CAAC;wBAAEC,OAAO;oBAAO;oBAErC,IAAInC,QAAQiB,IAAI,CAACI,aAAa,CAACe,cAAc,EAAE;wBAC7C3B,IAAIuB,GAAG,CAAC,KAAKhC,QAAQiB,IAAI,CAACI,aAAa,CAACe,cAAc;wBACtDhC,OAAOiC,IAAI,CAAC;oBACd;oBAEA,IAAIrC,QAAQiB,IAAI,CAACI,aAAa,CAACiB,SAAS,EAAE;wBACxC7B,IAAIuB,GAAG,CAAC,KAAKhC,QAAQiB,IAAI,CAACI,aAAa,CAACiB,SAAS;wBACjDlC,OAAOiC,IAAI,CAAC;oBACd;oBAEAjC,OAAOiC,IAAI,CAAC,AAAC,YAAuB,OAAZvC,OAAO2B,IAAI,EAAC;oBACN;;wBAAMc,IAAAA,mBAAW,EAAC/B,WAAW;4BAAEJ,QAAAA;4BAAQK,KAAAA;4BAAKJ,MAAAA;wBAAK;;;oBAAjD,OAAA,eAAtBK,QAAsB,KAAtBA,OAAOC,aAAe,KAAfA;oBACfP,OAAOiC,IAAI,CAAC;oBAEZ;;wBAAO;4BACL1B,YAAAA;4BACAH,WAAAA;4BACAJ,QAAAA;4BACAM,OAAO,SAAPA;;;;;gDACE;;oDAAMA;;;gDAAN;gDACA;;oDAAMV,QAAQU,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(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 const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\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 const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback and the DCR discovery/registration endpoints are\n // meant to be reached from a browser on another origin. Keep cors() for them,\n // scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","prompts","mcpServer","app","publicUrl","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","dcrRouter"],"mappings":"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"}
@@ -27,24 +27,35 @@ export async function createHTTPServer(config, overrides) {
27
27
  registerResources(mcpServer, composed.resources);
28
28
  registerPrompts(mcpServer, prompts);
29
29
  const app = express();
30
- app.use(cors());
31
30
  app.use(express.json({
32
31
  limit: '10mb'
33
32
  }));
33
+ // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
34
+ // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
35
+ const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
36
+ logger.info(`Starting ${config.name} MCP server (http)`);
37
+ const { close, httpServer } = await connectHttp(mcpServer, {
38
+ logger,
39
+ app,
40
+ port,
41
+ allowedOrigins: publicUrl ? [
42
+ publicUrl.origin
43
+ ] : undefined,
44
+ allowedHosts: publicUrl ? [
45
+ publicUrl.host
46
+ ] : undefined
47
+ });
48
+ // The loopback OAuth callback and the DCR discovery/registration endpoints are
49
+ // meant to be reached from a browser on another origin. Keep cors() for them,
50
+ // scoped to their own routes - never in front of '/mcp'.
34
51
  if (runtime.deps.oauthAdapters.loopbackRouter) {
35
- app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
52
+ app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);
36
53
  logger.info('Mounted loopback OAuth callback router');
37
54
  }
38
55
  if (runtime.deps.oauthAdapters.dcrRouter) {
39
- app.use('/', runtime.deps.oauthAdapters.dcrRouter);
56
+ app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);
40
57
  logger.info('Mounted DCR router with OAuth endpoints');
41
58
  }
42
- logger.info(`Starting ${config.name} MCP server (http)`);
43
- const { close, httpServer } = await connectHttp(mcpServer, {
44
- logger,
45
- app,
46
- port
47
- });
48
59
  logger.info('http transport ready');
49
60
  return {
50
61
  httpServer,
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(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 const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\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 const app = express();\n app.use(cors());\n app.use(express.json({ limit: '10mb' }));\n\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, { logger, app, port });\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectHttp","registerPrompts","registerResources","registerTools","McpServer","cors","express","createDefaultRuntime","createHTTPServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","port","transport","Error","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","app","use","json","limit","loopbackRouter","info","dcrRouter","close","httpServer"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,WAAW,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AAClH,SAASC,SAAS,QAAQ,0CAA0C;AACpE,OAAOC,UAAU,OAAO;AACxB,OAAOC,aAAa,UAAU;AAE9B,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,iBAAiBC,MAAoB,EAAEC,SAA4B;IACvF,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,WAAWpB,kBAAkBa,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAClC,MAAMC,OAAOZ,OAAOa,SAAS,CAACD,IAAI;IAClC,IAAI,CAACA,MAAM,MAAM,IAAIE,MAAM;IAE3B,MAAMC,QAAQ;WAAIL,SAASK,KAAK;WAAKb,QAAQO,IAAI,CAACO,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIR,SAASQ,OAAO;WAAKhB,QAAQO,IAAI,CAACO,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIzB,UAAU;QAAE0B,MAAMrB,OAAOqB,IAAI;QAAEC,SAAStB,OAAOsB,OAAO;IAAC;IAC7E5B,cAAc0B,WAAWL;IACzBtB,kBAAkB2B,WAAWV,SAASa,SAAS;IAC/C/B,gBAAgB4B,WAAWF;IAE3B,MAAMM,MAAM3B;IACZ2B,IAAIC,GAAG,CAAC7B;IACR4B,IAAIC,GAAG,CAAC5B,QAAQ6B,IAAI,CAAC;QAAEC,OAAO;IAAO;IAErC,IAAIzB,QAAQO,IAAI,CAACO,aAAa,CAACY,cAAc,EAAE;QAC7CJ,IAAIC,GAAG,CAAC,KAAKvB,QAAQO,IAAI,CAACO,aAAa,CAACY,cAAc;QACtDjB,OAAOkB,IAAI,CAAC;IACd;IAEA,IAAI3B,QAAQO,IAAI,CAACO,aAAa,CAACc,SAAS,EAAE;QACxCN,IAAIC,GAAG,CAAC,KAAKvB,QAAQO,IAAI,CAACO,aAAa,CAACc,SAAS;QACjDnB,OAAOkB,IAAI,CAAC;IACd;IAEAlB,OAAOkB,IAAI,CAAC,CAAC,SAAS,EAAE7B,OAAOqB,IAAI,CAAC,kBAAkB,CAAC;IACvD,MAAM,EAAEU,KAAK,EAAEC,UAAU,EAAE,GAAG,MAAMzC,YAAY6B,WAAW;QAAET;QAAQa;QAAKZ;IAAK;IAC/ED,OAAOkB,IAAI,CAAC;IAEZ,OAAO;QACLG;QACAZ;QACAT;QACAoB,OAAO;YACL,MAAMA;YACN,MAAM7B,QAAQ6B,KAAK;QACrB;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-sheets/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(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 const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\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 const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback and the DCR discovery/registration endpoints are\n // meant to be reached from a browser on another origin. Keep cors() for them,\n // scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectHttp","registerPrompts","registerResources","registerTools","McpServer","cors","express","createDefaultRuntime","createHTTPServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","port","transport","Error","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","app","use","json","limit","publicUrl","baseUrl","URL","undefined","info","close","httpServer","allowedOrigins","origin","allowedHosts","host","loopbackRouter","dcrRouter"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,WAAW,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AAClH,SAASC,SAAS,QAAQ,0CAA0C;AACpE,OAAOC,UAAU,OAAO;AACxB,OAAOC,aAAa,UAAU;AAE9B,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,iBAAiBC,MAAoB,EAAEC,SAA4B;IACvF,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,WAAWpB,kBAAkBa,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAClC,MAAMC,OAAOZ,OAAOa,SAAS,CAACD,IAAI;IAClC,IAAI,CAACA,MAAM,MAAM,IAAIE,MAAM;IAE3B,MAAMC,QAAQ;WAAIL,SAASK,KAAK;WAAKb,QAAQO,IAAI,CAACO,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIR,SAASQ,OAAO;WAAKhB,QAAQO,IAAI,CAACO,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIzB,UAAU;QAAE0B,MAAMrB,OAAOqB,IAAI;QAAEC,SAAStB,OAAOsB,OAAO;IAAC;IAC7E5B,cAAc0B,WAAWL;IACzBtB,kBAAkB2B,WAAWV,SAASa,SAAS;IAC/C/B,gBAAgB4B,WAAWF;IAE3B,MAAMM,MAAM3B;IACZ2B,IAAIC,GAAG,CAAC5B,QAAQ6B,IAAI,CAAC;QAAEC,OAAO;IAAO;IAErC,sFAAsF;IACtF,wFAAwF;IACxF,MAAMC,YAAY5B,OAAO6B,OAAO,GAAG,IAAIC,IAAI9B,OAAO6B,OAAO,IAAIE;IAC7DpB,OAAOqB,IAAI,CAAC,CAAC,SAAS,EAAEhC,OAAOqB,IAAI,CAAC,kBAAkB,CAAC;IACvD,MAAM,EAAEY,KAAK,EAAEC,UAAU,EAAE,GAAG,MAAM3C,YAAY6B,WAAW;QACzDT;QACAa;QACAZ;QACAuB,gBAAgBP,YAAY;YAACA,UAAUQ,MAAM;SAAC,GAAGL;QACjDM,cAAcT,YAAY;YAACA,UAAUU,IAAI;SAAC,GAAGP;IAC/C;IAEA,+EAA+E;IAC/E,8EAA8E;IAC9E,yDAAyD;IACzD,IAAI7B,QAAQO,IAAI,CAACO,aAAa,CAACuB,cAAc,EAAE;QAC7Cf,IAAIC,GAAG,CAAC,KAAK7B,QAAQM,QAAQO,IAAI,CAACO,aAAa,CAACuB,cAAc;QAC9D5B,OAAOqB,IAAI,CAAC;IACd;IAEA,IAAI9B,QAAQO,IAAI,CAACO,aAAa,CAACwB,SAAS,EAAE;QACxChB,IAAIC,GAAG,CAAC,KAAK7B,QAAQM,QAAQO,IAAI,CAACO,aAAa,CAACwB,SAAS;QACzD7B,OAAOqB,IAAI,CAAC;IACd;IAEArB,OAAOqB,IAAI,CAAC;IAEZ,OAAO;QACLE;QACAd;QACAT;QACAsB,OAAO;YACL,MAAMA;YACN,MAAM/B,QAAQ+B,KAAK;QACrB;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-z/mcp-sheets",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "MCP server for Google Sheets integration with OAuth authentication, spreadsheet management, batch operations, and advanced formatting",
5
5
  "keywords": [
6
6
  "sheets",
@@ -59,7 +59,7 @@
59
59
  "build": "tsds validate",
60
60
  "format": "tsds format",
61
61
  "prepublish:check": "ncp",
62
- "prepublishOnly": "tsds validate",
62
+ "prepublishOnly": "node scripts/require-dist-tag.cjs && tsds validate",
63
63
  "test": "tsds test:node --no-timeouts",
64
64
  "test:engines": "nvu engines tsds test:node --no-timeouts",
65
65
  "test:setup": "node scripts/setup-test.ts",
@@ -68,7 +68,7 @@
68
68
  "dependencies": {
69
69
  "@mcp-z/oauth": "^1.0.5",
70
70
  "@mcp-z/oauth-google": "^1.1.3",
71
- "@mcp-z/server": "^1.0.0",
71
+ "@mcp-z/server": "^1.2.0",
72
72
  "@modelcontextprotocol/sdk": "^1.0.0",
73
73
  "cors": "^2.0.0",
74
74
  "csv-parse": "^7.0.2",
@@ -98,12 +98,6 @@
98
98
  "engines": {
99
99
  "node": ">=20"
100
100
  },
101
- "allowScripts": {
102
- "node-filename-to-dist-paths": true,
103
- "node-semvers": true,
104
- "node-version-use": true,
105
- "thread-sleep-compat": true
106
- },
107
101
  "mcpName": "io.github.mcp-z/mcp-sheets",
108
102
  "tsds": {
109
103
  "source": "src/index.ts"