gogcli-mcp-slides 4.6.1 → 4.6.2

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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "Extended Google Slides for Claude via gogcli — auth + full Slides support (create, edit, export, templates, markdown)",
10
- "version": "4.6.1"
10
+ "version": "4.6.2"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "gogcli (Slides)",
16
16
  "source": "./",
17
17
  "description": "Extended Google Slides for Claude via gogcli — auth + full Slides support (create, edit, export, templates, markdown)",
18
- "version": "4.6.1",
18
+ "version": "4.6.2",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp-slides",
3
3
  "displayName": "gogcli (Slides)",
4
- "version": "4.6.1",
4
+ "version": "4.6.2",
5
5
  "description": "Extended Google Slides for Claude via gogcli — auth + full Slides support (create, edit, export, templates, markdown)",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/dist/index.js CHANGED
@@ -19763,7 +19763,7 @@ function date4(params) {
19763
19763
  return _coercedDate(ZodDate, params);
19764
19764
  }
19765
19765
 
19766
- // ../../node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/auth-CGP0BDVq.mjs
19766
+ // ../../node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs
19767
19767
  var LATEST_PROTOCOL_VERSION = "2025-11-25";
19768
19768
  var SUPPORTED_PROTOCOL_VERSIONS = [
19769
19769
  LATEST_PROTOCOL_VERSION,
@@ -20652,7 +20652,8 @@ var OAuthTokensSchema = object({
20652
20652
  token_type: string2(),
20653
20653
  expires_in: coerce_exports.number().optional(),
20654
20654
  scope: string2().optional(),
20655
- refresh_token: string2().optional()
20655
+ refresh_token: string2().optional(),
20656
+ issuer: string2().optional().catch(void 0)
20656
20657
  }).strip();
20657
20658
  var IdJagTokenExchangeResponseSchema = object({
20658
20659
  issued_token_type: literal("urn:ietf:params:oauth:token-type:id-jag"),
@@ -20690,7 +20691,8 @@ var OAuthClientInformationSchema = object({
20690
20691
  client_id: string2(),
20691
20692
  client_secret: string2().optional(),
20692
20693
  client_id_issued_at: number2().optional(),
20693
- client_secret_expires_at: number2().optional()
20694
+ client_secret_expires_at: number2().optional(),
20695
+ issuer: string2().optional().catch(void 0)
20694
20696
  }).strip();
20695
20697
  var OAuthClientInformationFullSchema = OAuthClientMetadataSchema.merge(OAuthClientInformationSchema);
20696
20698
  var OAuthClientRegistrationErrorSchema = object({
@@ -20702,7 +20704,7 @@ var OAuthTokenRevocationRequestSchema = object({
20702
20704
  token_type_hint: string2().optional()
20703
20705
  }).strip();
20704
20706
 
20705
- // ../../node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs
20707
+ // ../../node_modules/@modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs
20706
20708
  var BRANDS = /* @__PURE__ */ Symbol.for("mcp.sdk.errorBrands");
20707
20709
  function stampErrorBrands(instance, ctor) {
20708
20710
  const brands = /* @__PURE__ */ new Set();
@@ -22945,7 +22947,8 @@ function build() {
22945
22947
  ListResourceTemplatesResultResponseSchema: wireResultResponse(ListResourceTemplatesResultSchema$1),
22946
22948
  ReadResourceResultResponseSchema: wireResultResponse(union([ReadResourceResultSchema$1, InputRequiredResultSchema])),
22947
22949
  CompleteResultResponseSchema: wireResultResponse(CompleteResultSchema$1),
22948
- DiscoverResultResponseSchema: wireResultResponse(DiscoverResultSchema$1)
22950
+ DiscoverResultResponseSchema: wireResultResponse(DiscoverResultSchema$1),
22951
+ SubscriptionsListenResultResponseSchema: wireResultResponse(SubscriptionsListenResultSchema$1)
22949
22952
  };
22950
22953
  }
22951
22954
  var memo2;
@@ -23373,6 +23376,8 @@ var rev2026Codec = {
23373
23376
  const rawInputRequests = raw["inputRequests"];
23374
23377
  const inputRequests = isPlainObject$4(rawInputRequests) ? rawInputRequests : {};
23375
23378
  const requestState = raw["requestState"];
23379
+ const metaParse = raw["_meta"] === void 0 ? void 0 : buildSchemas2026().ResultMetaSchema.safeParse(raw["_meta"]);
23380
+ const meta3 = metaParse?.success ? metaParse.data : void 0;
23376
23381
  if (Object.keys(inputRequests).length === 0 && typeof requestState !== "string") return {
23377
23382
  kind: "invalid",
23378
23383
  error: new SdkError(SdkErrorCode.InvalidResult, `Invalid result for ${method}: input_required carries neither inputRequests nor requestState (every input_required result must include at least one of the two)`, {
@@ -23383,7 +23388,8 @@ var rev2026Codec = {
23383
23388
  return {
23384
23389
  kind: "input_required",
23385
23390
  inputRequests,
23386
- ...typeof requestState === "string" && { requestState }
23391
+ ...typeof requestState === "string" && { requestState },
23392
+ ...meta3 !== void 0 && { _meta: meta3 }
23387
23393
  };
23388
23394
  }
23389
23395
  if (rawResultType !== "complete") return {
@@ -23450,6 +23456,9 @@ function isSpecRequestMethod(method) {
23450
23456
  function isSpecNotificationMethod(method) {
23451
23457
  return ALL_CODECS.some((codec2) => codec2.hasNotificationMethod(method));
23452
23458
  }
23459
+ function isExtensionReusedRequestMethod(method) {
23460
+ return method === "tasks/get" || method === "tasks/cancel";
23461
+ }
23453
23462
  var ALL_CODECS = [rev2025Codec, rev2026Codec];
23454
23463
  function isPlainObject$3(value) {
23455
23464
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -24427,6 +24436,8 @@ var Protocol = class {
24427
24436
  _transport;
24428
24437
  _requestMessageId = 0;
24429
24438
  _requestHandlers = /* @__PURE__ */ new Map();
24439
+ /** Methods registered with an explicit schema; the era gate in `_onrequest` reads it for the Tasks extension names. */
24440
+ _customSchemaRequestMethods = /* @__PURE__ */ new Set();
24430
24441
  _requestHandlerAbortControllers = /* @__PURE__ */ new Map();
24431
24442
  _notificationHandlers = /* @__PURE__ */ new Map();
24432
24443
  _responseHandlers = /* @__PURE__ */ new Map();
@@ -24710,7 +24721,7 @@ var Protocol = class {
24710
24721
  return;
24711
24722
  }
24712
24723
  }
24713
- if (isSpecRequestMethod(request.method) && !codec2.hasRequestMethod(request.method)) {
24724
+ if (isSpecRequestMethod(request.method) && !codec2.hasRequestMethod(request.method) && !(isExtensionReusedRequestMethod(request.method) && this._customSchemaRequestMethods.has(request.method))) {
24714
24725
  sendErrorResponse(ProtocolErrorCode.MethodNotFound, "Method not found");
24715
24726
  return;
24716
24727
  }
@@ -24843,8 +24854,11 @@ var Protocol = class {
24843
24854
  }
24844
24855
  request(request, schemaOrOptions, maybeOptions) {
24845
24856
  const codec2 = this._resolveOutboundCodec(request.method);
24857
+ if (isStandardSchema(schemaOrOptions)) {
24858
+ if (!isExtensionReusedRequestMethod(request.method)) this._assertOutboundRequestInEra(codec2, request.method);
24859
+ return this._requestWithSchemaViaCodec(codec2, request, schemaOrOptions, maybeOptions);
24860
+ }
24846
24861
  this._assertOutboundRequestInEra(codec2, request.method);
24847
- if (isStandardSchema(schemaOrOptions)) return this._requestWithSchemaViaCodec(codec2, request, schemaOrOptions, maybeOptions);
24848
24862
  const validate2 = codecResultValidator(codec2, request.method);
24849
24863
  if (validate2 === void 0) throw new TypeError(`'${request.method}' is not a spec method; pass a result schema as the second argument to request().`);
24850
24864
  return this._requestWithSchemaViaCodec(codec2, request, validate2, schemaOrOptions);
@@ -25037,7 +25051,7 @@ var Protocol = class {
25037
25051
  * Emits a notification, which is a one-way message that does not expect a response.
25038
25052
  */
25039
25053
  async notification(notification, options) {
25040
- return this._notificationViaCodec(this._resolveOutboundCodec(notification.method), notification, options);
25054
+ return await this._notificationViaCodec(this._resolveOutboundCodec(notification.method), notification, options);
25041
25055
  }
25042
25056
  /**
25043
25057
  * The notification funnel proper, keyed by the resolved era codec —
@@ -25088,6 +25102,8 @@ var Protocol = class {
25088
25102
  return maybeHandler(parsed.data, ctx);
25089
25103
  };
25090
25104
  else throw new TypeError("setRequestHandler: handler is required");
25105
+ if (typeof schemasOrHandler === "function") this._customSchemaRequestMethods.delete(method);
25106
+ else this._customSchemaRequestMethods.add(method);
25091
25107
  this._requestHandlers.set(method, this._wrapHandler(method, stored));
25092
25108
  }
25093
25109
  /**
@@ -25117,6 +25133,7 @@ var Protocol = class {
25117
25133
  */
25118
25134
  removeRequestHandler(method) {
25119
25135
  this._requestHandlers.delete(method);
25136
+ this._customSchemaRequestMethods.delete(method);
25120
25137
  }
25121
25138
  /**
25122
25139
  * Asserts that a request handler has not already been set for the given method, in preparation for a new one being automatically installed.
@@ -25194,7 +25211,8 @@ function manualInputRequiredValue(decoded) {
25194
25211
  return {
25195
25212
  resultType: "input_required",
25196
25213
  inputRequests: decoded.inputRequests,
25197
- ...decoded.requestState !== void 0 && { requestState: decoded.requestState }
25214
+ ...decoded.requestState !== void 0 && { requestState: decoded.requestState },
25215
+ ...decoded._meta !== void 0 && { _meta: decoded._meta }
25198
25216
  };
25199
25217
  }
25200
25218
  var require_content_type = /* @__PURE__ */ __commonJSMin(((exports) => {
@@ -32358,7 +32376,7 @@ var Ajv = import_ajv.Ajv;
32358
32376
  // ../../node_modules/@modelcontextprotocol/server/dist/shimsNode.mjs
32359
32377
  import process2 from "node:process";
32360
32378
 
32361
- // ../../node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs
32379
+ // ../../node_modules/@modelcontextprotocol/server/dist/mcp-DIH4cS6P.mjs
32362
32380
  var COMPLETABLE_SYMBOL = /* @__PURE__ */ Symbol.for("mcp.completable");
32363
32381
  function isCompletable(schema) {
32364
32382
  return !!schema && typeof schema === "object" && COMPLETABLE_SYMBOL in schema;
@@ -32423,7 +32441,7 @@ var StdioListenRouter = class {
32423
32441
  _serverCapabilities;
32424
32442
  /**
32425
32443
  * The serving instance's identity, stamped onto the graceful-close
32426
- * results' `_meta` (the spec's `SubscriptionsListenResultMeta` extends
32444
+ * results' `_meta` (the spec's `SubscriptionsListenResultMetaObject` extends
32427
32445
  * `ResultMetaObject`). Handed over together with the capabilities.
32428
32446
  */
32429
32447
  _serverInfo;
@@ -32755,6 +32773,11 @@ var Server = class extends Protocol {
32755
32773
  if (modernProtocolVersions(this._supportedProtocolVersions).length > 0) this.setRequestHandler("server/discover", () => this._ondiscover());
32756
32774
  if (this._capabilities.logging) this._registerLoggingHandler();
32757
32775
  }
32776
+ /** Attaches to the given transport; rejects while this instance is connected to another one. */
32777
+ async connect(transport) {
32778
+ if (this.transport !== void 0) throw new SdkError(SdkErrorCode.AlreadyConnected, "Use a separate Server instance per connection: this instance is already connected to a transport. To connect it to a new transport, call close() first.");
32779
+ await super.connect(transport);
32780
+ }
32758
32781
  /**
32759
32782
  * Registers the built-in `logging/setLevel` request handler.
32760
32783
  *
@@ -33308,21 +33331,41 @@ var Server = class extends Protocol {
33308
33331
  function discoverAdvertisedCapabilities(capabilities) {
33309
33332
  return { ...capabilities };
33310
33333
  }
33334
+ function toolInputElementCount(value, max) {
33335
+ let count = 0;
33336
+ const stack = [value];
33337
+ while (stack.length > 0) {
33338
+ const node2 = stack.pop();
33339
+ if (node2 === null || typeof node2 !== "object") continue;
33340
+ if (Array.isArray(node2)) for (const child of node2) {
33341
+ if (++count > max) return count;
33342
+ if (child !== null && typeof child === "object") stack.push(child);
33343
+ }
33344
+ else for (const key in node2) {
33345
+ if (!Object.prototype.hasOwnProperty.call(node2, key)) continue;
33346
+ if (++count > max) return count;
33347
+ const child = node2[key];
33348
+ if (child !== null && typeof child === "object") stack.push(child);
33349
+ }
33350
+ }
33351
+ return count;
33352
+ }
33353
+ function resolveMaxToolInputElements(value) {
33354
+ if (value === void 0 || value === Infinity) return void 0;
33355
+ if (typeof value !== "number" || Number.isNaN(value) || value < 1) throw new RangeError(`maxToolInputElements must be a number of at least 1, or Infinity, got ${String(value)}`);
33356
+ return value;
33357
+ }
33311
33358
  var McpServer = class {
33312
33359
  /**
33313
33360
  * The underlying {@linkcode Server} instance, useful for advanced operations like sending notifications.
33314
33361
  */
33315
33362
  server;
33363
+ _maxToolInputElements;
33316
33364
  _registeredResources = {};
33317
33365
  _registeredResourceTemplates = {};
33318
33366
  _registeredTools = {};
33319
33367
  _registeredPrompts = {};
33320
- /**
33321
- * Per-tool JSON-converted `inputSchema`, memoized so the SEP-2243
33322
- * registration-time scan and the pre-dispatch validation step share one
33323
- * conversion instead of paying it twice per request under the
33324
- * per-request-factory `createMcpHandler` model.
33325
- */
33368
+ /** Per-tool JSON-converted `inputSchema`, filled on first use by `toolInputSchemaJson()`. */
33326
33369
  _toolInputSchemaJson = {};
33327
33370
  /**
33328
33371
  * The JSON-serialized `inputSchema` of a registered tool, or `undefined`
@@ -33347,6 +33390,7 @@ var McpServer = class {
33347
33390
  }
33348
33391
  constructor(serverInfo, options) {
33349
33392
  this.server = new Server(serverInfo, options);
33393
+ this._maxToolInputElements = resolveMaxToolInputElements(options?.maxToolInputElements);
33350
33394
  if (options?.capabilities?.tools) this.setToolRequestHandlers();
33351
33395
  if (options?.capabilities?.resources) this.setResourceRequestHandlers();
33352
33396
  if (options?.capabilities?.prompts) this.setPromptRequestHandlers();
@@ -33419,7 +33463,7 @@ var McpServer = class {
33419
33463
  name,
33420
33464
  title: tool.title,
33421
33465
  description: tool.description,
33422
- inputSchema: tool.inputSchema ? standardSchemaToJsonSchema(tool.inputSchema, "input") : EMPTY_OBJECT_JSON_SCHEMA,
33466
+ inputSchema: tool.inputSchema ? convertListedInputSchema(name, tool.inputSchema) : EMPTY_OBJECT_JSON_SCHEMA,
33423
33467
  annotations: tool.annotations,
33424
33468
  icons: tool.icons,
33425
33469
  execution: tool.execution,
@@ -33464,6 +33508,7 @@ var McpServer = class {
33464
33508
  * Validates tool input arguments against the tool's input schema.
33465
33509
  */
33466
33510
  async validateToolInput(tool, args, toolName) {
33511
+ if (this._maxToolInputElements !== void 0 && toolInputElementCount(args, this._maxToolInputElements) > this._maxToolInputElements) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for tool ${toolName}: arguments contain more than the maximum of ${this._maxToolInputElements} elements`);
33467
33512
  if (!tool.inputSchema) return;
33468
33513
  const parseResult = await validateStandardSchema(tool.inputSchema, args ?? {});
33469
33514
  if (!parseResult.success) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${toolName}: ${parseResult.error}`);
@@ -33738,20 +33783,19 @@ var McpServer = class {
33738
33783
  }
33739
33784
  _createRegisteredTool(name, title, description, inputSchema, outputSchema, annotations, icons, execution, scopeChallenge, _meta, handler) {
33740
33785
  validateAndWarnToolName(name);
33741
- if (inputSchema !== void 0) try {
33742
- const json2 = standardSchemaToJsonSchema(inputSchema, "input");
33743
- this._toolInputSchemaJson[name] = json2;
33744
- const scan = scanXMcpHeaderDeclarations(json2);
33745
- if (!scan.valid) console.warn(`[mcp-sdk] tool '${name}' carries an invalid x-mcp-header declaration and will be excluded by conforming Streamable HTTP clients: ${scan.reason}`);
33746
- } catch {
33747
- }
33748
33786
  let currentHandler = handler;
33787
+ let outputSchemaJson;
33749
33788
  const registeredTool = {
33750
33789
  title,
33751
33790
  description,
33752
33791
  inputSchema,
33753
33792
  outputSchema,
33754
- outputSchemaJson: convertOutputSchemaJson(outputSchema),
33793
+ get outputSchemaJson() {
33794
+ return outputSchemaJson ??= convertOutputSchemaJson(registeredTool.outputSchema);
33795
+ },
33796
+ set outputSchemaJson(value) {
33797
+ outputSchemaJson = value;
33798
+ },
33755
33799
  annotations,
33756
33800
  icons,
33757
33801
  execution,
@@ -33878,6 +33922,12 @@ var EMPTY_OBJECT_JSON_SCHEMA = {
33878
33922
  type: "object",
33879
33923
  properties: {}
33880
33924
  };
33925
+ function convertListedInputSchema(name, inputSchema) {
33926
+ const json2 = standardSchemaToJsonSchema(inputSchema, "input");
33927
+ const scan = scanXMcpHeaderDeclarations(json2);
33928
+ if (!scan.valid) console.warn(`[mcp-sdk] tool '${name}' carries an invalid x-mcp-header declaration and will be excluded by conforming Streamable HTTP clients: ${scan.reason}`);
33929
+ return json2;
33930
+ }
33881
33931
  function convertOutputSchemaJson(outputSchema) {
33882
33932
  if (outputSchema === void 0) return void 0;
33883
33933
  try {
@@ -33890,7 +33940,7 @@ function createPromptHandler(name, argsSchema, callback) {
33890
33940
  if (argsSchema) {
33891
33941
  const typedCallback = callback;
33892
33942
  return async (args, ctx) => {
33893
- const parseResult = await validateStandardSchema(argsSchema, args);
33943
+ const parseResult = await validateStandardSchema(argsSchema, args ?? {});
33894
33944
  if (!parseResult.success) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for prompt ${name}: ${parseResult.error}`);
33895
33945
  return typedCallback(parseResult.data, ctx);
33896
33946
  };
@@ -34715,7 +34765,10 @@ function surfaceToolHints(server) {
34715
34765
  ));
34716
34766
  }
34717
34767
  async function createMcpServer(opts) {
34718
- const server = new McpServer({ name: opts.name, version: opts.version }, { supportedProtocolVersions: [...SERVER_PROTOCOL_VERSIONS] });
34768
+ const server = new McpServer({ name: opts.name, version: opts.version }, {
34769
+ supportedProtocolVersions: [...SERVER_PROTOCOL_VERSIONS],
34770
+ ...opts.maxToolInputElements !== void 0 ? { maxToolInputElements: opts.maxToolInputElements } : {}
34771
+ });
34719
34772
  if (opts.surfaceHints !== false)
34720
34773
  surfaceToolHints(server);
34721
34774
  if (opts.banner !== void 0) {
@@ -36014,7 +36067,7 @@ function registerSlidesTools(server) {
36014
36067
  }
36015
36068
 
36016
36069
  // ../gogcli-mcp/src/server.ts
36017
- var VERSION = true ? "4.6.1" : "0.0.0";
36070
+ var VERSION = true ? "4.6.2" : "0.0.0";
36018
36071
 
36019
36072
  // ../gogcli-mcp/src/bootstrap-auth.ts
36020
36073
  import { join as join5 } from "node:path";
@@ -36850,7 +36903,7 @@ await runMcp({
36850
36903
  });
36851
36904
  /*! Bundled license information:
36852
36905
 
36853
- @modelcontextprotocol/server/dist/src-D-y6h4N7.mjs:
36906
+ @modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs:
36854
36907
  (*!
36855
36908
  * content-type
36856
36909
  * Copyright(c) 2015 Douglas Christopher Wilson
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp-slides",
5
5
  "display_name": "gogcli (Slides)",
6
- "version": "4.6.1",
6
+ "version": "4.6.2",
7
7
  "description": "Extended Google Slides for Claude via gogcli — auth + full Slides support (create, edit, export, templates, markdown)",
8
8
  "author": {
9
9
  "name": "Chris Hall",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-slides",
3
- "version": "4.6.1",
3
+ "version": "4.6.2",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp-slides",
5
5
  "description": "Extended Google Slides MCP server via gogcli — auth + full Slides support",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -24,8 +24,8 @@
24
24
  "test:coverage": "vitest run --coverage"
25
25
  },
26
26
  "dependencies": {
27
- "@chrischall/mcp-utils": "^2.13.0",
28
- "@modelcontextprotocol/server": "^2.1.0",
27
+ "@chrischall/mcp-utils": "^2.14.0",
28
+ "@modelcontextprotocol/server": "^2.3.0",
29
29
  "zod": "^4.6.1"
30
30
  },
31
31
  "license": "MIT",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "source": "github",
8
8
  "subfolder": "packages/gogcli-mcp-slides"
9
9
  },
10
- "version": "4.6.1",
10
+ "version": "4.6.2",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-slides",
15
- "version": "4.6.1",
15
+ "version": "4.6.2",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },