gogcli-mcp-calendar 2.0.11 → 2.1.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+
3
+ ## [2.1.0](https://github.com/chrischall/gogcli-mcp/compare/v2.0.13...v2.1.0) (2026-05-25)
4
+
5
+
6
+ ### Features
7
+
8
+ * wrap new gog cli v0.18.0 tools ([173242a](https://github.com/chrischall/gogcli-mcp/commit/173242aafaa8c2f2d7282a2fbd8faedfc65a63bd))
9
+
10
+
11
+ ### Refactor
12
+
13
+ * aggressive cleanup pass (audit findings) ([e635b39](https://github.com/chrischall/gogcli-mcp/commit/e635b391cf611e9c102a422ffbce5ebe28687b80))
14
+ * rebalance base vs sub-package tool split (120 -> 84 base) ([1074953](https://github.com/chrischall/gogcli-mcp/commit/1074953833fc4766e85cc0b28cbcc08834f8dc47))
15
+ * review-pass cleanup (enums, shared schemas, test harness) ([ea851de](https://github.com/chrischall/gogcli-mcp/commit/ea851deb30b9cfef3f07ed506a011fc363b34018))
16
+
17
+
18
+ ### Documentation
19
+
20
+ * update gogcli repo URLs to openclaw/gogcli (was steipete/gogcli) ([951a181](https://github.com/chrischall/gogcli-mcp/commit/951a1818ebc269f203aee723ccbea32c13817d8b))
package/dist/index.js CHANGED
@@ -31254,7 +31254,7 @@ function registerCalendarTools(server2) {
31254
31254
  return runOrDiagnose(["calendar", "event", calendarId, eventId], { account });
31255
31255
  });
31256
31256
  server2.registerTool("gog_calendar_create", {
31257
- description: "Create a calendar event.",
31257
+ description: "Create a calendar event. Set withZoom=true to attach a Zoom meeting (requires Zoom S2S OAuth setup via gog_zoom_auth_setup; the join URL + meeting ID + passcode are appended to the event description \u2014 Google rejects native conference card writes from non-Workspace-Marketplace OAuth clients).",
31258
31258
  annotations: { destructiveHint: false },
31259
31259
  inputSchema: {
31260
31260
  calendarId: external_exports.string().describe('Calendar ID (use "primary" for the default calendar)'),
@@ -31265,18 +31265,20 @@ function registerCalendarTools(server2) {
31265
31265
  location: external_exports.string().optional().describe("Event location"),
31266
31266
  attendees: external_exports.string().optional().describe("Attendee emails, comma-separated"),
31267
31267
  allDay: external_exports.boolean().optional().describe("All-day event (use date-only in from/to)"),
31268
+ withZoom: external_exports.boolean().optional().describe("Create a Zoom video conference for this event (requires Zoom S2S OAuth setup)"),
31268
31269
  account: accountParam
31269
31270
  }
31270
- }, async ({ calendarId, summary, from, to, description, location, attendees, allDay, account }) => {
31271
+ }, async ({ calendarId, summary, from, to, description, location, attendees, allDay, withZoom, account }) => {
31271
31272
  const args = ["calendar", "create", calendarId, `--summary=${summary}`, `--from=${from}`, `--to=${to}`];
31272
31273
  if (description) args.push(`--description=${description}`);
31273
31274
  if (location) args.push(`--location=${location}`);
31274
31275
  if (attendees) args.push(`--attendees=${attendees}`);
31275
31276
  if (allDay) args.push("--all-day");
31277
+ if (withZoom) args.push("--with-zoom");
31276
31278
  return runOrDiagnose(args, { account });
31277
31279
  });
31278
31280
  server2.registerTool("gog_calendar_update", {
31279
- description: "Update an existing calendar event.",
31281
+ description: "Update an existing calendar event. Zoom: withZoom adds a Zoom meeting, regenerateZoom replaces the existing one, removeZoom strips it (each are independent \u2014 use one per call).",
31280
31282
  annotations: { destructiveHint: false },
31281
31283
  inputSchema: {
31282
31284
  calendarId: external_exports.string().describe("Calendar ID"),
@@ -31287,9 +31289,12 @@ function registerCalendarTools(server2) {
31287
31289
  description: external_exports.string().optional().describe("New description"),
31288
31290
  location: external_exports.string().optional().describe("New location"),
31289
31291
  attendees: external_exports.string().optional().describe("New attendee emails, comma-separated (replaces existing)"),
31292
+ withZoom: external_exports.boolean().optional().describe("Create a Zoom video conference for this event"),
31293
+ regenerateZoom: external_exports.boolean().optional().describe("Replace the event's existing Zoom video conference"),
31294
+ removeZoom: external_exports.boolean().optional().describe("Remove the event's Zoom video conference"),
31290
31295
  account: accountParam
31291
31296
  }
31292
- }, async ({ calendarId, eventId, summary, from, to, description, location, attendees, account }) => {
31297
+ }, async ({ calendarId, eventId, summary, from, to, description, location, attendees, withZoom, regenerateZoom, removeZoom, account }) => {
31293
31298
  const args = ["calendar", "update", calendarId, eventId];
31294
31299
  if (summary !== void 0) args.push(`--summary=${summary}`);
31295
31300
  if (from !== void 0) args.push(`--from=${from}`);
@@ -31297,6 +31302,9 @@ function registerCalendarTools(server2) {
31297
31302
  if (description !== void 0) args.push(`--description=${description}`);
31298
31303
  if (location !== void 0) args.push(`--location=${location}`);
31299
31304
  if (attendees !== void 0) args.push(`--attendees=${attendees}`);
31305
+ if (withZoom) args.push("--with-zoom");
31306
+ if (regenerateZoom) args.push("--regenerate-zoom");
31307
+ if (removeZoom) args.push("--remove-zoom");
31300
31308
  return runOrDiagnose(args, { account });
31301
31309
  });
31302
31310
  server2.registerTool("gog_calendar_delete", {
@@ -31332,7 +31340,7 @@ function registerCalendarTools(server2) {
31332
31340
  var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
31333
31341
 
31334
31342
  // ../gogcli-mcp/src/server.ts
31335
- var VERSION = true ? "2.0.11" : "0.0.0";
31343
+ var VERSION = true ? "2.1.0" : "0.0.0";
31336
31344
  function createServer(options) {
31337
31345
  return new McpServer({
31338
31346
  name: options?.name ?? "gogcli",
@@ -31406,6 +31414,36 @@ function registerExtraCalendarTools(server2) {
31406
31414
  if (all) args.push("--all");
31407
31415
  return runOrDiagnose(args, { account });
31408
31416
  });
31417
+ server2.registerTool("gog_zoom_auth_setup", {
31418
+ description: "Store Zoom Server-to-Server (S2S) OAuth credentials so calendar events can be attached to Zoom meetings via the --with-zoom flag on gog_calendar_create / gog_calendar_update. Credentials are saved in gogcli's keyring under the given alias.",
31419
+ annotations: { destructiveHint: true },
31420
+ inputSchema: {
31421
+ accountId: external_exports.string().describe("Zoom S2S OAuth account ID"),
31422
+ clientId: external_exports.string().describe("Zoom S2S OAuth client ID"),
31423
+ clientSecret: external_exports.string().describe("Zoom S2S OAuth client secret"),
31424
+ alias: external_exports.string().optional().describe('Zoom credential alias (default: "default")'),
31425
+ skipValidate: external_exports.boolean().optional().describe("Store credentials without calling Zoom /users/me to validate")
31426
+ }
31427
+ }, async ({ accountId, clientId, clientSecret, alias, skipValidate }) => {
31428
+ const args = ["zoom", "auth", "setup"];
31429
+ if (alias) args.push(`--alias=${alias}`);
31430
+ args.push(`--account-id=${accountId}`);
31431
+ args.push(`--client-id=${clientId}`);
31432
+ args.push(`--client-secret=${clientSecret}`);
31433
+ if (skipValidate) args.push("--skip-validate");
31434
+ return runOrDiagnose(args, {});
31435
+ });
31436
+ server2.registerTool("gog_zoom_auth_doctor", {
31437
+ description: "Validate stored Zoom S2S OAuth credentials by calling Zoom /users/me.",
31438
+ annotations: { readOnlyHint: true },
31439
+ inputSchema: {
31440
+ alias: external_exports.string().optional().describe('Zoom credential alias to check (default: "default")')
31441
+ }
31442
+ }, async ({ alias }) => {
31443
+ const args = ["zoom", "auth", "doctor"];
31444
+ if (alias) args.push(`--alias=${alias}`);
31445
+ return runOrDiagnose(args, {});
31446
+ });
31409
31447
  server2.registerTool("gog_meet_participants", {
31410
31448
  description: "List participants from the latest (or a specific) Meet call.",
31411
31449
  annotations: { readOnlyHint: true },
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp-calendar",
5
5
  "display_name": "gogcli (Calendar)",
6
- "version": "2.0.11",
6
+ "version": "2.1.0",
7
7
  "description": "Extended Google Calendar for Claude via gogcli — auth + Calendar events + Meet space management",
8
8
  "author": {
9
9
  "name": "Chris Hall",
@@ -84,11 +84,11 @@
84
84
  },
85
85
  {
86
86
  "name": "gog_calendar_create",
87
- "description": "Create a calendar event"
87
+ "description": "Create a calendar event (optionally attach a Zoom meeting via withZoom)"
88
88
  },
89
89
  {
90
90
  "name": "gog_calendar_update",
91
- "description": "Update an existing calendar event"
91
+ "description": "Update an existing calendar event (add/replace/remove Zoom meeting via withZoom/regenerateZoom/removeZoom)"
92
92
  },
93
93
  {
94
94
  "name": "gog_calendar_delete",
@@ -125,6 +125,14 @@
125
125
  {
126
126
  "name": "gog_meet_participants",
127
127
  "description": "List participants from a Meet call"
128
+ },
129
+ {
130
+ "name": "gog_zoom_auth_setup",
131
+ "description": "Store Zoom Server-to-Server OAuth credentials (needed for calendar event Zoom attachment)"
132
+ },
133
+ {
134
+ "name": "gog_zoom_auth_doctor",
135
+ "description": "Validate stored Zoom Server-to-Server OAuth credentials"
128
136
  }
129
137
  ],
130
138
  "compatibility": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-calendar",
3
- "version": "2.0.11",
3
+ "version": "2.1.0",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp-calendar",
5
5
  "description": "Extended Google Calendar + Meet MCP server via gogcli — auth + Calendar events + Meet space management",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -75,6 +75,41 @@ export function registerExtraCalendarTools(server: McpServer): void {
75
75
  return runOrDiagnose(args, { account });
76
76
  });
77
77
 
78
+ // Zoom S2S OAuth credentials are scoped to Zoom-as-calendar-conferencing
79
+ // today (the `--with-zoom` flag on calendar create/update), so the auth
80
+ // helpers live in the calendar extras alongside meet space management.
81
+ server.registerTool('gog_zoom_auth_setup', {
82
+ description: 'Store Zoom Server-to-Server (S2S) OAuth credentials so calendar events can be attached to Zoom meetings via the --with-zoom flag on gog_calendar_create / gog_calendar_update. Credentials are saved in gogcli\'s keyring under the given alias.',
83
+ annotations: { destructiveHint: true },
84
+ inputSchema: {
85
+ accountId: z.string().describe('Zoom S2S OAuth account ID'),
86
+ clientId: z.string().describe('Zoom S2S OAuth client ID'),
87
+ clientSecret: z.string().describe('Zoom S2S OAuth client secret'),
88
+ alias: z.string().optional().describe('Zoom credential alias (default: "default")'),
89
+ skipValidate: z.boolean().optional().describe('Store credentials without calling Zoom /users/me to validate'),
90
+ },
91
+ }, async ({ accountId, clientId, clientSecret, alias, skipValidate }) => {
92
+ const args = ['zoom', 'auth', 'setup'];
93
+ if (alias) args.push(`--alias=${alias}`);
94
+ args.push(`--account-id=${accountId}`);
95
+ args.push(`--client-id=${clientId}`);
96
+ args.push(`--client-secret=${clientSecret}`);
97
+ if (skipValidate) args.push('--skip-validate');
98
+ return runOrDiagnose(args, {});
99
+ });
100
+
101
+ server.registerTool('gog_zoom_auth_doctor', {
102
+ description: 'Validate stored Zoom S2S OAuth credentials by calling Zoom /users/me.',
103
+ annotations: { readOnlyHint: true },
104
+ inputSchema: {
105
+ alias: z.string().optional().describe('Zoom credential alias to check (default: "default")'),
106
+ },
107
+ }, async ({ alias }) => {
108
+ const args = ['zoom', 'auth', 'doctor'];
109
+ if (alias) args.push(`--alias=${alias}`);
110
+ return runOrDiagnose(args, {});
111
+ });
112
+
78
113
  server.registerTool('gog_meet_participants', {
79
114
  description: 'List participants from the latest (or a specific) Meet call.',
80
115
  annotations: { readOnlyHint: true },
@@ -93,6 +93,56 @@ describe('gog_meet_history', () => {
93
93
  });
94
94
  });
95
95
 
96
+ // --- gog 0.18.0 Zoom S2S OAuth (Zoom is calendar conferencing — lives here) ---
97
+
98
+ describe('gog_zoom_auth_setup', () => {
99
+ it('passes credentials and uses default alias when omitted', async () => {
100
+ await handlers.get('gog_zoom_auth_setup')!({
101
+ accountId: 'acct',
102
+ clientId: 'cid',
103
+ clientSecret: 'csecret',
104
+ });
105
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
106
+ [
107
+ 'zoom', 'auth', 'setup',
108
+ '--account-id=acct', '--client-id=cid', '--client-secret=csecret',
109
+ ],
110
+ { account: undefined },
111
+ );
112
+ });
113
+
114
+ it('passes --alias and --skip-validate when provided', async () => {
115
+ await handlers.get('gog_zoom_auth_setup')!({
116
+ accountId: 'acct', clientId: 'cid', clientSecret: 'csecret',
117
+ alias: 'work', skipValidate: true,
118
+ });
119
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
120
+ [
121
+ 'zoom', 'auth', 'setup',
122
+ '--alias=work',
123
+ '--account-id=acct', '--client-id=cid', '--client-secret=csecret',
124
+ '--skip-validate',
125
+ ],
126
+ { account: undefined },
127
+ );
128
+ });
129
+ });
130
+
131
+ describe('gog_zoom_auth_doctor', () => {
132
+ it('validates default alias', async () => {
133
+ await handlers.get('gog_zoom_auth_doctor')!({});
134
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(['zoom', 'auth', 'doctor'], { account: undefined });
135
+ });
136
+
137
+ it('passes --alias when provided', async () => {
138
+ await handlers.get('gog_zoom_auth_doctor')!({ alias: 'work' });
139
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
140
+ ['zoom', 'auth', 'doctor', '--alias=work'],
141
+ { account: undefined },
142
+ );
143
+ });
144
+ });
145
+
96
146
  describe('gog_meet_participants', () => {
97
147
  it('calls runOrDiagnose with meetingCode', async () => {
98
148
  await handlers.get('gog_meet_participants')!({ meetingCode: 'abc-defg-hij' });