gogcli-mcp-classroom 2.23.0 → 2.23.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": "2.23.0"
10
+ "version": "2.23.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": "2.23.0",
18
+ "version": "2.23.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": "2.23.0",
4
+ "version": "2.23.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
@@ -31542,6 +31542,26 @@ function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSource
31542
31542
  return JSON.stringify(parsed, null, detectIndent(text));
31543
31543
  }
31544
31544
 
31545
+ // ../gogcli-mcp/src/pagination.ts
31546
+ function detectIndent2(text) {
31547
+ const match = /\n(\s+)\S/.exec(text);
31548
+ return match ? match[1].replace(/\t/g, " ").length : 0;
31549
+ }
31550
+ function stripConsumedPageToken(text) {
31551
+ const trimmed = text.trim();
31552
+ if (trimmed === "" || !trimmed.startsWith("{")) return text;
31553
+ let parsed;
31554
+ try {
31555
+ parsed = JSON.parse(trimmed);
31556
+ } catch {
31557
+ return text;
31558
+ }
31559
+ const obj = parsed;
31560
+ if (obj.nextPageToken !== "") return text;
31561
+ delete obj.nextPageToken;
31562
+ return JSON.stringify(obj, null, detectIndent2(text));
31563
+ }
31564
+
31545
31565
  // ../gogcli-mcp/src/tools/utils.ts
31546
31566
  var accountParam = external_exports.string().optional().describe(
31547
31567
  "Google account email to use, e.g. you@gmail.com \u2014 must be the full address, not a bare username. Overrides the GOG_ACCOUNT env var. Omit to use the single configured account."
@@ -31570,9 +31590,19 @@ var ids = {
31570
31590
  // People API uses fully-qualified resource names ("people/c123") not bare IDs.
31571
31591
  person: external_exports.string().describe("Person resource name (people/...) or email")
31572
31592
  };
31593
+ var pageTokenParam = external_exports.string().optional().describe(
31594
+ "Cursor for the NEXT page. Pass back the nextPageToken from a previous response verbatim, keeping the query and max identical: call once, then call again with pageToken=<that value>. A response with NO nextPageToken is the last page."
31595
+ );
31596
+ var pageAliasParam = external_exports.string().optional().describe(
31597
+ "Deprecated alias for pageToken, accepted so existing callers keep working. Use pageToken \u2014 it matches the nextPageToken field in the response."
31598
+ );
31599
+ function resolvePageToken(p) {
31600
+ return p.pageToken ?? p.page;
31601
+ }
31573
31602
  var paginationParams = {
31574
31603
  max: external_exports.number().int().optional().describe("Max results"),
31575
- page: external_exports.string().optional().describe("Page token"),
31604
+ pageToken: pageTokenParam,
31605
+ page: pageAliasParam,
31576
31606
  all: external_exports.boolean().optional().describe("Fetch all pages")
31577
31607
  };
31578
31608
  function registerRunTool(server, options) {
@@ -31647,7 +31677,7 @@ ${accounts || "(none)"}${hint}`);
31647
31677
  async function runOrDiagnose(args, options) {
31648
31678
  try {
31649
31679
  const raw = await run(args, options);
31650
- return rawTextResult(options.lossless ? raw : normalizeTimestamps(raw));
31680
+ return rawTextResult(options.lossless ? raw : stripConsumedPageToken(normalizeTimestamps(raw)));
31651
31681
  } catch (err) {
31652
31682
  return diagnose(err);
31653
31683
  }
@@ -31828,17 +31858,19 @@ function registerClassroomTools(server) {
31828
31858
  teacher: external_exports.string().optional().describe("Filter by teacher user ID"),
31829
31859
  student: external_exports.string().optional().describe("Filter by student user ID"),
31830
31860
  max: external_exports.number().optional().describe("Max results per page"),
31831
- page: external_exports.string().optional().describe("Page token for pagination"),
31861
+ pageToken: pageTokenParam,
31862
+ page: pageAliasParam,
31832
31863
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31833
31864
  account: accountParam
31834
31865
  }
31835
- }, async ({ state, teacher, student, max, page, all, account }) => {
31866
+ }, async ({ state, teacher, student, max, pageToken, page, all, account }) => {
31836
31867
  const args = ["classroom", "courses", "list"];
31837
31868
  if (state) args.push(`--state=${state}`);
31838
31869
  if (teacher) args.push(`--teacher=${teacher}`);
31839
31870
  if (student) args.push(`--student=${student}`);
31840
31871
  if (max !== void 0) args.push(`--max=${max}`);
31841
- if (page) args.push(`--page=${page}`);
31872
+ const token = resolvePageToken({ pageToken, page });
31873
+ if (token) args.push(`--page=${token}`);
31842
31874
  if (all) args.push("--all");
31843
31875
  return runOrDiagnose(args, { account });
31844
31876
  });
@@ -31858,14 +31890,16 @@ function registerClassroomTools(server) {
31858
31890
  inputSchema: {
31859
31891
  courseId: external_exports.string().describe("Course ID"),
31860
31892
  max: external_exports.number().optional().describe("Max results per page"),
31861
- page: external_exports.string().optional().describe("Page token"),
31893
+ pageToken: pageTokenParam,
31894
+ page: pageAliasParam,
31862
31895
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31863
31896
  account: accountParam
31864
31897
  }
31865
- }, async ({ courseId, max, page, all, account }) => {
31898
+ }, async ({ courseId, max, pageToken, page, all, account }) => {
31866
31899
  const args = ["classroom", "students", "list", courseId];
31867
31900
  if (max !== void 0) args.push(`--max=${max}`);
31868
- if (page) args.push(`--page=${page}`);
31901
+ const token = resolvePageToken({ pageToken, page });
31902
+ if (token) args.push(`--page=${token}`);
31869
31903
  if (all) args.push("--all");
31870
31904
  return runOrDiagnose(args, { account });
31871
31905
  });
@@ -31886,14 +31920,16 @@ function registerClassroomTools(server) {
31886
31920
  inputSchema: {
31887
31921
  courseId: external_exports.string().describe("Course ID"),
31888
31922
  max: external_exports.number().optional().describe("Max results per page"),
31889
- page: external_exports.string().optional().describe("Page token"),
31923
+ pageToken: pageTokenParam,
31924
+ page: pageAliasParam,
31890
31925
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31891
31926
  account: accountParam
31892
31927
  }
31893
- }, async ({ courseId, max, page, all, account }) => {
31928
+ }, async ({ courseId, max, pageToken, page, all, account }) => {
31894
31929
  const args = ["classroom", "teachers", "list", courseId];
31895
31930
  if (max !== void 0) args.push(`--max=${max}`);
31896
- if (page) args.push(`--page=${page}`);
31931
+ const token = resolvePageToken({ pageToken, page });
31932
+ if (token) args.push(`--page=${token}`);
31897
31933
  if (all) args.push("--all");
31898
31934
  return runOrDiagnose(args, { account });
31899
31935
  });
@@ -31916,16 +31952,18 @@ function registerClassroomTools(server) {
31916
31952
  students: external_exports.boolean().optional().describe("Include students only"),
31917
31953
  teachers: external_exports.boolean().optional().describe("Include teachers only"),
31918
31954
  max: external_exports.number().optional().describe("Max results per page"),
31919
- page: external_exports.string().optional().describe("Page token"),
31955
+ pageToken: pageTokenParam,
31956
+ page: pageAliasParam,
31920
31957
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31921
31958
  account: accountParam
31922
31959
  }
31923
- }, async ({ courseId, students, teachers, max, page, all, account }) => {
31960
+ }, async ({ courseId, students, teachers, max, pageToken, page, all, account }) => {
31924
31961
  const args = ["classroom", "roster", courseId];
31925
31962
  if (students) args.push("--students");
31926
31963
  if (teachers) args.push("--teachers");
31927
31964
  if (max !== void 0) args.push(`--max=${max}`);
31928
- if (page) args.push(`--page=${page}`);
31965
+ const token = resolvePageToken({ pageToken, page });
31966
+ if (token) args.push(`--page=${token}`);
31929
31967
  if (all) args.push("--all");
31930
31968
  return runOrDiagnose(args, { account });
31931
31969
  });
@@ -31938,18 +31976,20 @@ function registerClassroomTools(server) {
31938
31976
  topic: external_exports.string().optional().describe("Filter by topic ID"),
31939
31977
  orderBy: external_exports.string().optional().describe('Sort order (e.g. "updateTime desc")'),
31940
31978
  max: external_exports.number().optional().describe("Max results per page"),
31941
- page: external_exports.string().optional().describe("Page token"),
31979
+ pageToken: pageTokenParam,
31980
+ page: pageAliasParam,
31942
31981
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31943
31982
  scanPages: external_exports.number().optional().describe("Max pages to scan when filtering"),
31944
31983
  account: accountParam
31945
31984
  }
31946
- }, async ({ courseId, state, topic, orderBy, max, page, all, scanPages, account }) => {
31985
+ }, async ({ courseId, state, topic, orderBy, max, pageToken, page, all, scanPages, account }) => {
31947
31986
  const args = ["classroom", "coursework", "list", courseId];
31948
31987
  if (state) args.push(`--state=${state}`);
31949
31988
  if (topic) args.push(`--topic=${topic}`);
31950
31989
  if (orderBy) args.push(`--order-by=${orderBy}`);
31951
31990
  if (max !== void 0) args.push(`--max=${max}`);
31952
- if (page) args.push(`--page=${page}`);
31991
+ const token = resolvePageToken({ pageToken, page });
31992
+ if (token) args.push(`--page=${token}`);
31953
31993
  if (all) args.push("--all");
31954
31994
  if (scanPages !== void 0) args.push(`--scan-pages=${scanPages}`);
31955
31995
  return runOrDiagnose(args, { account });
@@ -31975,17 +32015,19 @@ function registerClassroomTools(server) {
31975
32015
  late: external_exports.enum(["late", "not-late"]).optional().describe("Filter by late status"),
31976
32016
  user: external_exports.string().optional().describe("Filter by student user ID"),
31977
32017
  max: external_exports.number().optional().describe("Max results per page"),
31978
- page: external_exports.string().optional().describe("Page token"),
32018
+ pageToken: pageTokenParam,
32019
+ page: pageAliasParam,
31979
32020
  all: external_exports.boolean().optional().describe("Fetch all pages"),
31980
32021
  account: accountParam
31981
32022
  }
31982
- }, async ({ courseId, courseworkId, state, late: late2, user, max, page, all, account }) => {
32023
+ }, async ({ courseId, courseworkId, state, late: late2, user, max, pageToken, page, all, account }) => {
31983
32024
  const args = ["classroom", "submissions", "list", courseId, courseworkId];
31984
32025
  if (state) args.push(`--state=${state}`);
31985
32026
  if (late2) args.push(`--late=${late2}`);
31986
32027
  if (user) args.push(`--user=${user}`);
31987
32028
  if (max !== void 0) args.push(`--max=${max}`);
31988
- if (page) args.push(`--page=${page}`);
32029
+ const token = resolvePageToken({ pageToken, page });
32030
+ if (token) args.push(`--page=${token}`);
31989
32031
  if (all) args.push("--all");
31990
32032
  return runOrDiagnose(args, { account });
31991
32033
  });
@@ -32062,16 +32104,18 @@ function registerClassroomTools(server) {
32062
32104
  state: external_exports.string().optional().describe("Filter by announcement state"),
32063
32105
  orderBy: external_exports.string().optional().describe("Sort order"),
32064
32106
  max: external_exports.number().optional().describe("Max results per page"),
32065
- page: external_exports.string().optional().describe("Page token"),
32107
+ pageToken: pageTokenParam,
32108
+ page: pageAliasParam,
32066
32109
  all: external_exports.boolean().optional().describe("Fetch all pages"),
32067
32110
  account: accountParam
32068
32111
  }
32069
- }, async ({ courseId, state, orderBy, max, page, all, account }) => {
32112
+ }, async ({ courseId, state, orderBy, max, pageToken, page, all, account }) => {
32070
32113
  const args = ["classroom", "announcements", "list", courseId];
32071
32114
  if (state) args.push(`--state=${state}`);
32072
32115
  if (orderBy) args.push(`--order-by=${orderBy}`);
32073
32116
  if (max !== void 0) args.push(`--max=${max}`);
32074
- if (page) args.push(`--page=${page}`);
32117
+ const token = resolvePageToken({ pageToken, page });
32118
+ if (token) args.push(`--page=${token}`);
32075
32119
  if (all) args.push("--all");
32076
32120
  return runOrDiagnose(args, { account });
32077
32121
  });
@@ -32107,14 +32151,16 @@ function registerClassroomTools(server) {
32107
32151
  inputSchema: {
32108
32152
  courseId: external_exports.string().describe("Course ID"),
32109
32153
  max: external_exports.number().optional().describe("Max results per page"),
32110
- page: external_exports.string().optional().describe("Page token"),
32154
+ pageToken: pageTokenParam,
32155
+ page: pageAliasParam,
32111
32156
  all: external_exports.boolean().optional().describe("Fetch all pages"),
32112
32157
  account: accountParam
32113
32158
  }
32114
- }, async ({ courseId, max, page, all, account }) => {
32159
+ }, async ({ courseId, max, pageToken, page, all, account }) => {
32115
32160
  const args = ["classroom", "topics", "list", courseId];
32116
32161
  if (max !== void 0) args.push(`--max=${max}`);
32117
- if (page) args.push(`--page=${page}`);
32162
+ const token = resolvePageToken({ pageToken, page });
32163
+ if (token) args.push(`--page=${token}`);
32118
32164
  if (all) args.push("--all");
32119
32165
  return runOrDiagnose(args, { account });
32120
32166
  });
@@ -32136,16 +32182,18 @@ function registerClassroomTools(server) {
32136
32182
  course: external_exports.string().optional().describe("Filter by course ID"),
32137
32183
  user: external_exports.string().optional().describe("Filter by user ID"),
32138
32184
  max: external_exports.number().optional().describe("Max results per page"),
32139
- page: external_exports.string().optional().describe("Page token"),
32185
+ pageToken: pageTokenParam,
32186
+ page: pageAliasParam,
32140
32187
  all: external_exports.boolean().optional().describe("Fetch all pages"),
32141
32188
  account: accountParam
32142
32189
  }
32143
- }, async ({ course, user, max, page, all, account }) => {
32190
+ }, async ({ course, user, max, pageToken, page, all, account }) => {
32144
32191
  const args = ["classroom", "invitations", "list"];
32145
32192
  if (course) args.push(`--course=${course}`);
32146
32193
  if (user) args.push(`--user=${user}`);
32147
32194
  if (max !== void 0) args.push(`--max=${max}`);
32148
- if (page) args.push(`--page=${page}`);
32195
+ const token = resolvePageToken({ pageToken, page });
32196
+ if (token) args.push(`--page=${token}`);
32149
32197
  if (all) args.push("--all");
32150
32198
  return runOrDiagnose(args, { account });
32151
32199
  });
@@ -32197,7 +32245,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
32197
32245
  );
32198
32246
 
32199
32247
  // ../gogcli-mcp/src/server.ts
32200
- var VERSION = true ? "2.23.0" : "0.0.0";
32248
+ var VERSION = true ? "2.23.2" : "0.0.0";
32201
32249
 
32202
32250
  // ../gogcli-mcp/src/auth-log.ts
32203
32251
  var FAILURES = /* @__PURE__ */ new Set([
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": "2.23.0",
6
+ "version": "2.23.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": "2.23.0",
3
+ "version": "2.23.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>",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "source": "github",
8
8
  "subfolder": "packages/gogcli-mcp-classroom"
9
9
  },
10
- "version": "2.23.0",
10
+ "version": "2.23.2",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-classroom",
15
- "version": "2.23.0",
15
+ "version": "2.23.2",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },