gogcli-mcp 2.0.2 → 2.0.6

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.
Files changed (44) hide show
  1. package/.claude-plugin/marketplace.json +38 -0
  2. package/.claude-plugin/plugin.json +25 -0
  3. package/.mcp.json +14 -0
  4. package/.mcpbignore +27 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +1334 -963
  8. package/dist/lib.d.ts +6 -0
  9. package/dist/lib.d.ts.map +1 -0
  10. package/dist/lib.js +1560 -1189
  11. package/dist/runner.d.ts +12 -0
  12. package/dist/runner.d.ts.map +1 -0
  13. package/dist/server.d.ts +7 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/tools/auth.d.ts +3 -0
  16. package/dist/tools/auth.d.ts.map +1 -0
  17. package/dist/tools/calendar.d.ts +3 -0
  18. package/dist/tools/calendar.d.ts.map +1 -0
  19. package/dist/tools/contacts.d.ts +3 -0
  20. package/dist/tools/contacts.d.ts.map +1 -0
  21. package/dist/tools/docs.d.ts +3 -0
  22. package/dist/tools/docs.d.ts.map +1 -0
  23. package/dist/tools/drive.d.ts +3 -0
  24. package/dist/tools/drive.d.ts.map +1 -0
  25. package/dist/tools/gmail.d.ts +3 -0
  26. package/dist/tools/gmail.d.ts.map +1 -0
  27. package/dist/tools/sheets.d.ts +3 -0
  28. package/dist/tools/sheets.d.ts.map +1 -0
  29. package/dist/tools/tasks.d.ts +3 -0
  30. package/dist/tools/tasks.d.ts.map +1 -0
  31. package/dist/tools/utils.d.ts +14 -0
  32. package/dist/tools/utils.d.ts.map +1 -0
  33. package/manifest.json +1 -101
  34. package/package.json +4 -3
  35. package/server.json +35 -0
  36. package/src/runner.ts +4 -1
  37. package/src/tools/classroom.ts +2 -297
  38. package/src/tools/contacts.ts +1 -1
  39. package/src/tools/slides.ts +1 -108
  40. package/tests/helpers/extras-harness.ts +31 -0
  41. package/tests/runner.test.ts +30 -0
  42. package/tests/tools/calendar.test.ts +1 -0
  43. package/tests/tools/classroom.test.ts +0 -352
  44. package/tests/tools/slides.test.ts +6 -278
@@ -0,0 +1,12 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ export type Spawner = (command: string, args: string[], options: {
3
+ env: NodeJS.ProcessEnv;
4
+ }) => ChildProcess;
5
+ export interface RunOptions {
6
+ account?: string;
7
+ spawner?: Spawner;
8
+ interactive?: boolean;
9
+ timeout?: number;
10
+ }
11
+ export declare function run(args: string[], options?: RunOptions): Promise<string>;
12
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAChC,YAAY,CAAC;AAElB,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DnF"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const VERSION: string;
3
+ export declare function createBaseServer(options?: {
4
+ name?: string;
5
+ version?: string;
6
+ }): McpServer;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,eAAO,MAAM,OAAO,QAAmE,CAAC;AAExF,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgBzF"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAuthTools(server: McpServer): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwEzD"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCalendarTools(server: McpServer): void;
3
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2H7D"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerContactsTools(server: McpServer): void;
3
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkE7D"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerDocsTools(server: McpServer): void;
3
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoGzD"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerDriveTools(server: McpServer): void;
3
+ //# sourceMappingURL=drive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../src/tools/drive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgH1D"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerGmailTools(server: McpServer): void;
3
+ //# sourceMappingURL=gmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/tools/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D1D"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSheetsTools(server: McpServer): void;
3
+ //# sourceMappingURL=sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../src/tools/sheets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuG3D"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTasksTools(server: McpServer): void;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsF1D"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export type ToolResult = {
3
+ content: [{
4
+ type: 'text';
5
+ text: string;
6
+ }];
7
+ };
8
+ export declare const accountParam: z.ZodOptional<z.ZodString>;
9
+ export declare function toText(output: string): ToolResult;
10
+ export declare function toError(err: unknown): ToolResult;
11
+ export declare function runOrDiagnose(args: string[], options: {
12
+ account?: string;
13
+ }): Promise<ToolResult>;
14
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAEvE,eAAO,MAAM,YAAY,4BAExB,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEjD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAEhD;AAQD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,UAAU,CAAC,CAerB"}
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp",
5
5
  "display_name": "gogcli",
6
- "version": "2.0.2",
6
+ "version": "2.0.6",
7
7
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
8
8
  "author": {
9
9
  "name": "Chris Hall",
@@ -128,26 +128,6 @@
128
128
  "name": "gog_classroom_courses_get",
129
129
  "description": "Get a single course by ID"
130
130
  },
131
- {
132
- "name": "gog_classroom_courses_create",
133
- "description": "Create a new course"
134
- },
135
- {
136
- "name": "gog_classroom_courses_update",
137
- "description": "Update an existing course"
138
- },
139
- {
140
- "name": "gog_classroom_courses_delete",
141
- "description": "Delete a course"
142
- },
143
- {
144
- "name": "gog_classroom_courses_archive",
145
- "description": "Archive a course"
146
- },
147
- {
148
- "name": "gog_classroom_courses_unarchive",
149
- "description": "Unarchive a course"
150
- },
151
131
  {
152
132
  "name": "gog_classroom_students_list",
153
133
  "description": "List students in a course"
@@ -156,14 +136,6 @@
156
136
  "name": "gog_classroom_students_get",
157
137
  "description": "Get a specific student"
158
138
  },
159
- {
160
- "name": "gog_classroom_students_add",
161
- "description": "Add a student to a course"
162
- },
163
- {
164
- "name": "gog_classroom_students_remove",
165
- "description": "Remove a student from a course"
166
- },
167
139
  {
168
140
  "name": "gog_classroom_teachers_list",
169
141
  "description": "List teachers in a course"
@@ -172,14 +144,6 @@
172
144
  "name": "gog_classroom_teachers_get",
173
145
  "description": "Get a specific teacher"
174
146
  },
175
- {
176
- "name": "gog_classroom_teachers_add",
177
- "description": "Add a teacher to a course"
178
- },
179
- {
180
- "name": "gog_classroom_teachers_remove",
181
- "description": "Remove a teacher from a course"
182
- },
183
147
  {
184
148
  "name": "gog_classroom_roster",
185
149
  "description": "List the full course roster (students and/or teachers)"
@@ -192,18 +156,6 @@
192
156
  "name": "gog_classroom_coursework_get",
193
157
  "description": "Get a single coursework item"
194
158
  },
195
- {
196
- "name": "gog_classroom_coursework_create",
197
- "description": "Create coursework (assignment/question)"
198
- },
199
- {
200
- "name": "gog_classroom_coursework_update",
201
- "description": "Update existing coursework"
202
- },
203
- {
204
- "name": "gog_classroom_coursework_delete",
205
- "description": "Delete coursework"
206
- },
207
159
  {
208
160
  "name": "gog_classroom_submissions_list",
209
161
  "description": "List student submissions for coursework"
@@ -240,14 +192,6 @@
240
192
  "name": "gog_classroom_announcements_create",
241
193
  "description": "Create an announcement"
242
194
  },
243
- {
244
- "name": "gog_classroom_announcements_update",
245
- "description": "Update an announcement"
246
- },
247
- {
248
- "name": "gog_classroom_announcements_delete",
249
- "description": "Delete an announcement"
250
- },
251
195
  {
252
196
  "name": "gog_classroom_topics_list",
253
197
  "description": "List topics in a course"
@@ -256,18 +200,6 @@
256
200
  "name": "gog_classroom_topics_get",
257
201
  "description": "Get a topic"
258
202
  },
259
- {
260
- "name": "gog_classroom_topics_create",
261
- "description": "Create a topic"
262
- },
263
- {
264
- "name": "gog_classroom_topics_update",
265
- "description": "Rename a topic"
266
- },
267
- {
268
- "name": "gog_classroom_topics_delete",
269
- "description": "Delete a topic"
270
- },
271
203
  {
272
204
  "name": "gog_classroom_invitations_list",
273
205
  "description": "List classroom invitations"
@@ -276,18 +208,10 @@
276
208
  "name": "gog_classroom_invitations_get",
277
209
  "description": "Get an invitation"
278
210
  },
279
- {
280
- "name": "gog_classroom_invitations_create",
281
- "description": "Create an invitation"
282
- },
283
211
  {
284
212
  "name": "gog_classroom_invitations_accept",
285
213
  "description": "Accept an invitation"
286
214
  },
287
- {
288
- "name": "gog_classroom_invitations_delete",
289
- "description": "Delete (revoke) an invitation"
290
- },
291
215
  {
292
216
  "name": "gog_classroom_profile_get",
293
217
  "description": "Get a classroom user profile (omit userId for self)"
@@ -452,42 +376,18 @@
452
376
  "name": "gog_slides_create",
453
377
  "description": "Create a new Google Slides presentation"
454
378
  },
455
- {
456
- "name": "gog_slides_create_from_markdown",
457
- "description": "Create a new Google Slides presentation from markdown content"
458
- },
459
- {
460
- "name": "gog_slides_create_from_template",
461
- "description": "Create a new Google Slides presentation from a template with placeholder replacements"
462
- },
463
379
  {
464
380
  "name": "gog_slides_copy",
465
381
  "description": "Copy a Google Slides presentation"
466
382
  },
467
- {
468
- "name": "gog_slides_add_slide",
469
- "description": "Add a slide to a presentation from a local image"
470
- },
471
383
  {
472
384
  "name": "gog_slides_list_slides",
473
385
  "description": "List slides in a presentation"
474
386
  },
475
- {
476
- "name": "gog_slides_delete_slide",
477
- "description": "Delete a slide from a presentation"
478
- },
479
387
  {
480
388
  "name": "gog_slides_read_slide",
481
389
  "description": "Read the content of a slide"
482
390
  },
483
- {
484
- "name": "gog_slides_update_notes",
485
- "description": "Update speaker notes on a slide"
486
- },
487
- {
488
- "name": "gog_slides_replace_slide",
489
- "description": "Replace the image content of an existing slide"
490
- },
491
391
  {
492
392
  "name": "gog_slides_run",
493
393
  "description": "Run any gog slides subcommand (escape hatch)"
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
- "version": "2.0.2",
3
+ "version": "2.0.6",
4
+ "mcpName": "io.github.chrischall/gogcli-mcp",
4
5
  "description": "MCP server wrapping gogcli for Google service access",
5
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
6
7
  "repository": {
@@ -41,10 +42,10 @@
41
42
  },
42
43
  "dependencies": {
43
44
  "@modelcontextprotocol/sdk": "^1.29.0",
44
- "zod": "^4.3.6"
45
+ "zod": "^4.4.3"
45
46
  },
46
47
  "devDependencies": {
47
- "@types/node": "^25.5.2",
48
+ "@types/node": "^25.6.2",
48
49
  "@vitest/coverage-v8": "^4.1.2",
49
50
  "esbuild": "^0.28.0",
50
51
  "typescript": "^6.0.2",
package/server.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.chrischall/gogcli-mcp",
4
+ "description": "Google Sheets (and more) for Claude via gogcli \u2014 read, write, and manage spreadsheets",
5
+ "repository": {
6
+ "url": "https://github.com/chrischall/gogcli-mcp",
7
+ "source": "github",
8
+ "subfolder": "packages/gogcli-mcp"
9
+ },
10
+ "version": "2.0.3",
11
+ "packages": [
12
+ {
13
+ "registryType": "npm",
14
+ "identifier": "gogcli-mcp",
15
+ "version": "2.0.3",
16
+ "transport": {
17
+ "type": "stdio"
18
+ },
19
+ "environmentVariables": [
20
+ {
21
+ "name": "GOG_ACCOUNT",
22
+ "description": "Email address of the Google account to use (matches gogcli auth)",
23
+ "isRequired": false,
24
+ "format": "string"
25
+ },
26
+ {
27
+ "name": "GOG_PATH",
28
+ "description": "Override path to the gogcli binary (auto-discovered otherwise)",
29
+ "isRequired": false,
30
+ "format": "string"
31
+ }
32
+ ]
33
+ }
34
+ ]
35
+ }
package/src/runner.ts CHANGED
@@ -45,7 +45,10 @@ export async function run(args: string[], options: RunOptions = {}): Promise<str
45
45
  // Strip GOG_ACCESS_TOKEN so gogcli uses stored refresh tokens instead of
46
46
  // a potentially stale direct access token passed through MCP env config.
47
47
  const { GOG_ACCESS_TOKEN: _, ...cleanEnv } = process.env;
48
- const child = spawner(process.env.GOG_PATH ?? 'gog', fullArgs, { env: cleanEnv });
48
+ // Use `||` (not `??`) so an empty-string GOG_PATH common when the .mcpb
49
+ // user_config "gog_path" is left blank and substituted as "" — falls back
50
+ // to PATH lookup instead of trying to spawn an empty executable name.
51
+ const child = spawner(process.env.GOG_PATH || 'gog', fullArgs, { env: cleanEnv });
49
52
  const stdoutChunks: Buffer[] = [];
50
53
  const stderrChunks: Buffer[] = [];
51
54
  let settled = false;