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 +20 -0
- package/dist/index.js +43 -5
- package/manifest.json +11 -3
- package/package.json +1 -1
- package/src/tools/calendar-extra.ts +35 -0
- package/tests/tools/calendar-extra.test.ts +50 -0
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
|
|
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
|
|
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
|
|
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' });
|