gogcli-mcp-classroom 4.2.0 → 4.2.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 Classroom for Claude via gogcli — auth + full Classroom support (courses, rosters, coursework, submissions, announcements, topics, invitations)",
10
- "version": "4.2.0"
10
+ "version": "4.2.2"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "gogcli (Classroom)",
16
16
  "source": "./",
17
17
  "description": "Extended Google Classroom for Claude via gogcli — auth + full Classroom support (courses, rosters, coursework, submissions, announcements, topics, invitations)",
18
- "version": "4.2.0",
18
+ "version": "4.2.2",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp-classroom",
3
3
  "displayName": "gogcli (Classroom)",
4
- "version": "4.2.0",
4
+ "version": "4.2.2",
5
5
  "description": "Extended Google Classroom for Claude via gogcli — auth + full Classroom support (courses, rosters, coursework, submissions, announcements, topics, invitations)",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/dist/index.js CHANGED
@@ -8,8 +8,8 @@ var __export = (target, all) => {
8
8
  // ../../node_modules/@chrischall/mcp-utils/dist/cancel/index.js
9
9
  import { AsyncLocalStorage } from "node:async_hooks";
10
10
  var storage = new AsyncLocalStorage();
11
- function withCallSignal(signal, fn) {
12
- return signal ? storage.run({ signal }, fn) : fn();
11
+ function withCallSignal(signal, fn, request) {
12
+ return signal ? storage.run({ signal, ...request ? { request } : {} }, fn) : fn();
13
13
  }
14
14
  function currentCallSignal() {
15
15
  return storage.getStore()?.signal;
@@ -31,6 +31,13 @@ function killOnCancel(child, signal = "SIGTERM") {
31
31
  return () => ambient.removeEventListener("abort", onAbort);
32
32
  }
33
33
 
34
+ // ../../node_modules/@chrischall/mcp-utils/dist/caller/index.js
35
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
36
+ var storage2 = new AsyncLocalStorage2();
37
+ function withCallerCapabilities(capabilities, fn) {
38
+ return capabilities ? storage2.run(capabilities, fn) : fn();
39
+ }
40
+
34
41
  // ../../node_modules/@modelcontextprotocol/server/dist/chunk-Br0eD_fh.mjs
35
42
  var __create = Object.create;
36
43
  var __defProp2 = Object.defineProperty;
@@ -34459,6 +34466,15 @@ Hint: ${err.hint}`);
34459
34466
  }
34460
34467
  throw err;
34461
34468
  }
34469
+ function mcpRequestFrom(args) {
34470
+ const ctx = args.at(-1);
34471
+ if (typeof ctx !== "object" || ctx === null)
34472
+ return void 0;
34473
+ const req = ctx.mcpReq;
34474
+ if (typeof req !== "object" || req === null)
34475
+ return void 0;
34476
+ return typeof req.notify === "function" ? req : void 0;
34477
+ }
34462
34478
  function callSignalFrom(args) {
34463
34479
  const ctx = args.at(-1);
34464
34480
  if (typeof ctx !== "object" || ctx === null)
@@ -34469,6 +34485,20 @@ function callSignalFrom(args) {
34469
34485
  const signal = req.signal;
34470
34486
  return signal instanceof AbortSignal ? signal : void 0;
34471
34487
  }
34488
+ function declaredCapabilitiesFrom(server) {
34489
+ const inner = server.server;
34490
+ if (typeof inner !== "object" || inner === null)
34491
+ return void 0;
34492
+ const read = inner.getClientCapabilities;
34493
+ if (typeof read !== "function")
34494
+ return void 0;
34495
+ try {
34496
+ const declared = read.call(inner);
34497
+ return typeof declared === "object" && declared !== null ? declared : void 0;
34498
+ } catch {
34499
+ return void 0;
34500
+ }
34501
+ }
34472
34502
  function surfaceToolHints(server) {
34473
34503
  const register2 = server.registerTool.bind(server);
34474
34504
  server.registerTool = (name, config2, cb) => register2(name, config2, (...args) => (
@@ -34484,15 +34514,24 @@ function surfaceToolHints(server) {
34484
34514
  // Here because this is the one wrapper every tool already passes
34485
34515
  // through: threading the signal by hand would mean editing several
34486
34516
  // hundred handlers and missing exactly the ones nobody edits.
34487
- withCallSignal(callSignalFrom(args), () => {
34488
- let result;
34489
- try {
34490
- result = cb(...args);
34491
- } catch (err) {
34492
- return hintResultOrRethrow(err);
34493
- }
34494
- return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
34495
- })
34517
+ withCallSignal(callSignalFrom(args), () => (
34518
+ // WHAT THE CALLER CAN DO, made ambient for the same reason and in
34519
+ // the same place (`caller/index.ts`). Only the 2025-era half needs
34520
+ // the wrapper — a 2026-07-28 request answers for itself off its own
34521
+ // envelope — but a guarded tool that cannot tell whether the caller
34522
+ // can be shown a prompt returns one the SDK then refuses to deliver,
34523
+ // and that refusal reaches the caller as an unexplained protocol
34524
+ // error it had no chance to catch.
34525
+ withCallerCapabilities(declaredCapabilitiesFrom(server), () => {
34526
+ let result;
34527
+ try {
34528
+ result = cb(...args);
34529
+ } catch (err) {
34530
+ return hintResultOrRethrow(err);
34531
+ }
34532
+ return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
34533
+ })
34534
+ ), mcpRequestFrom(args))
34496
34535
  ));
34497
34536
  }
34498
34537
  async function createMcpServer(opts) {
@@ -35282,6 +35321,7 @@ function registerAuthToolsWith(server, defaultServices) {
35282
35321
  });
35283
35322
  server.registerTool("gog_auth_add_url", {
35284
35323
  description: "Begin REMOTE/headless Google authorization (step 1 of 2). Returns a sign-in URL to open in any browser \u2014 no local server or terminal on the gogcli host is needed, so this works on a hosted deployment where the interactive gog_auth_add cannot. Hand the URL to the user; after they sign in, the browser is redirected to a localhost URL that fails to load \u2014 that is expected. They copy that full redirected URL (from the address bar) and you pass it to gog_auth_add_complete. The link is valid for 10 minutes. If you pass a custom `services` here, pass the SAME value to gog_auth_add_complete or the second step will not match this one.",
35324
+ annotations: { readOnlyHint: true },
35285
35325
  inputSchema: external_exports.object({
35286
35326
  email: external_exports.string().describe("Google account email to authorize"),
35287
35327
  services: external_exports.string().optional().default(defaultServices).describe(servicesDescribe),
@@ -35793,7 +35833,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
35793
35833
  );
35794
35834
 
35795
35835
  // ../gogcli-mcp/src/server.ts
35796
- var VERSION = true ? "4.2.0" : "0.0.0";
35836
+ var VERSION = true ? "4.2.2" : "0.0.0";
35797
35837
 
35798
35838
  // ../gogcli-mcp/src/bootstrap-auth.ts
35799
35839
  import { join as join2 } from "node:path";
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp-classroom",
5
5
  "display_name": "gogcli (Classroom)",
6
- "version": "4.2.0",
6
+ "version": "4.2.2",
7
7
  "description": "Extended Google Classroom for Claude via gogcli — auth + full Classroom support (courses, rosters, coursework, submissions, announcements, topics, invitations)",
8
8
  "author": {
9
9
  "name": "Chris Hall",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-classroom",
3
- "version": "4.2.0",
3
+ "version": "4.2.2",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp-classroom",
5
5
  "description": "Extended Google Classroom MCP server via gogcli — auth + full Classroom support",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -24,7 +24,7 @@
24
24
  "test:coverage": "vitest run --coverage"
25
25
  },
26
26
  "dependencies": {
27
- "@chrischall/mcp-utils": "^2.0.0",
27
+ "@chrischall/mcp-utils": "^2.1.0",
28
28
  "@modelcontextprotocol/server": "^2.0.0",
29
29
  "zod": "^4.6.1"
30
30
  },
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "source": "github",
8
8
  "subfolder": "packages/gogcli-mcp-classroom"
9
9
  },
10
- "version": "4.2.0",
10
+ "version": "4.2.2",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-classroom",
15
- "version": "4.2.0",
15
+ "version": "4.2.2",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },