gogcli-mcp-sheets 1.0.9 → 2.0.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.
package/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # gogcli-mcp-sheets
2
2
 
3
- Extended Google Sheets [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/steipete/gogcli). Includes all 53 base tools from [gogcli-mcp](https://www.npmjs.com/package/gogcli-mcp) plus 22 additional dedicated Sheets tools for tab management, formatting, named ranges, and more.
3
+ > [!WARNING]
4
+ > **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.
5
+
6
+ Extended Google Sheets [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/steipete/gogcli). Includes auth tools plus 22 additional dedicated Sheets tools for tab management, formatting, named ranges, and more.
4
7
 
5
8
  ## Requirements
6
9
 
@@ -43,7 +46,7 @@ claude mcp add gogcli-sheets -- gogcli-mcp-sheets
43
46
 
44
47
  ## Extra Sheets Tools (22)
45
48
 
46
- These are in addition to the 53 base tools (Gmail, Calendar, Drive, Tasks, Contacts, Auth, basic Sheets/Docs).
49
+ Plus 5 auth tools and 8 base Sheets tools (get, update, append, clear, metadata, create, find-replace, run).
47
50
 
48
51
  | Tool | Description |
49
52
  |------|-------------|
package/SKILL.md CHANGED
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: gogcli-mcp-sheets
3
- description: Use when the user asks to read, write, format, or manage Google Sheets. Triggers for requests involving spreadsheet data, cell formatting, tab management, named ranges, merging cells, freezing rows/columns, exporting spreadsheets, or any Sheets operation. Also includes Gmail, Calendar, Drive, Docs, Tasks, and Contacts tools.
3
+ description: Use when the user asks to read, write, format, or manage Google Sheets. Triggers for requests involving spreadsheet data, cell formatting, tab management, named ranges, merging cells, freezing rows/columns, exporting spreadsheets, or any Sheets operation. Includes auth and Sheets tools only.
4
4
  ---
5
5
 
6
6
  # gogcli-mcp-sheets
7
7
 
8
- Extended Google Sheets MCP server via [gogcli](https://github.com/steipete/gogcli) — includes all base tools (Gmail, Calendar, Drive, Docs, Tasks, Contacts) plus 22 additional dedicated Sheets tools.
8
+ Extended Google Sheets MCP server via [gogcli](https://github.com/steipete/gogcli) — 35 tools: auth + 8 base Sheets + 22 extra dedicated Sheets tools.
9
9
 
10
10
  - **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)
11
11
 
@@ -57,4 +57,4 @@ Extended Google Sheets MCP server via [gogcli](https://github.com/steipete/gogcl
57
57
  | `gog_sheets_named_ranges_update` | Update a named range |
58
58
  | `gog_sheets_named_ranges_delete` | Delete a named range |
59
59
 
60
- These are in addition to the 52 base tools (Sheets CRUD, Gmail, Calendar, Drive, Docs, Tasks, Contacts, Auth).
60
+ Plus 5 auth tools and 8 base Sheets tools.
package/dist/index.js CHANGED
@@ -30189,7 +30189,9 @@ function toError(err) {
30189
30189
  return toText(err instanceof Error ? `Error: ${err.message}` : String(err));
30190
30190
  }
30191
30191
  var AUTH_ERROR_PATTERN = /\b(401|unauthorized|token.*(expired|revoked)|invalid_grant)\b/i;
30192
+ var TRANSIENT_ERROR_PATTERN = /\b429\b|\b5\d\d\b|\bquota\b|rateLimit|\bDEADLINE_EXCEEDED\b/i;
30192
30193
  var AUTH_HINT = "\n\nAuthentication may have expired. Use gog_auth_add to re-authorize the account. Ask the user if they would like to re-authenticate.";
30194
+ var TRANSIENT_HINT = "\n\nThis error is often transient. Retry the same call before trying a different approach (do not fall back to smaller writes or row-by-row operations).";
30193
30195
  async function runOrDiagnose(args, options) {
30194
30196
  try {
30195
30197
  return toText(await run(args, options));
@@ -30197,7 +30199,8 @@ async function runOrDiagnose(args, options) {
30197
30199
  const base = toError(err);
30198
30200
  const errText = base.content[0].text;
30199
30201
  const isAuthError = AUTH_ERROR_PATTERN.test(errText);
30200
- const hint = isAuthError ? AUTH_HINT : "";
30202
+ const isTransientError = !isAuthError && TRANSIENT_ERROR_PATTERN.test(errText);
30203
+ const hint = isAuthError ? AUTH_HINT : isTransientError ? TRANSIENT_HINT : "";
30201
30204
  try {
30202
30205
  const accounts = await run(["auth", "list"]);
30203
30206
  return toText(`${errText}
@@ -30276,440 +30279,6 @@ function registerAuthTools(server2) {
30276
30279
  });
30277
30280
  }
30278
30281
 
30279
- // ../gogcli-mcp/src/tools/calendar.ts
30280
- function registerCalendarTools(server2) {
30281
- server2.registerTool("gog_calendar_events", {
30282
- description: "List calendar events. Filters can be combined (e.g. --from + --to for a range, or --today for just today).",
30283
- annotations: { readOnlyHint: true },
30284
- inputSchema: {
30285
- calendarId: external_exports.string().optional().describe("Calendar ID (default: primary calendar)"),
30286
- from: external_exports.string().optional().describe("Start time filter (RFC3339, date, or natural language)"),
30287
- to: external_exports.string().optional().describe("End time filter (RFC3339, date, or natural language)"),
30288
- today: external_exports.boolean().optional().describe("Only show today's events"),
30289
- query: external_exports.string().optional().describe("Free text search within events"),
30290
- all: external_exports.boolean().optional().describe("Fetch events from all calendars"),
30291
- account: accountParam
30292
- }
30293
- }, async ({ calendarId, from, to, today, query, all, account }) => {
30294
- const args = ["calendar", "events"];
30295
- if (calendarId) args.push(calendarId);
30296
- if (from) args.push(`--from=${from}`);
30297
- if (to) args.push(`--to=${to}`);
30298
- if (today) args.push("--today");
30299
- if (query) args.push(`--query=${query}`);
30300
- if (all) args.push("--all");
30301
- return runOrDiagnose(args, { account });
30302
- });
30303
- server2.registerTool("gog_calendar_get", {
30304
- description: "Get a specific calendar event by ID.",
30305
- annotations: { readOnlyHint: true },
30306
- inputSchema: {
30307
- calendarId: external_exports.string().describe("Calendar ID"),
30308
- eventId: external_exports.string().describe("Event ID"),
30309
- account: accountParam
30310
- }
30311
- }, async ({ calendarId, eventId, account }) => {
30312
- return runOrDiagnose(["calendar", "event", calendarId, eventId], { account });
30313
- });
30314
- server2.registerTool("gog_calendar_create", {
30315
- description: "Create a calendar event.",
30316
- annotations: { destructiveHint: false },
30317
- inputSchema: {
30318
- calendarId: external_exports.string().describe('Calendar ID (use "primary" for the default calendar)'),
30319
- summary: external_exports.string().describe("Event title"),
30320
- from: external_exports.string().describe("Start time (RFC3339 or date for all-day events)"),
30321
- to: external_exports.string().describe("End time (RFC3339 or date for all-day events)"),
30322
- description: external_exports.string().optional().describe("Event description"),
30323
- location: external_exports.string().optional().describe("Event location"),
30324
- attendees: external_exports.string().optional().describe("Attendee emails, comma-separated"),
30325
- allDay: external_exports.boolean().optional().describe("All-day event (use date-only in from/to)"),
30326
- account: accountParam
30327
- }
30328
- }, async ({ calendarId, summary, from, to, description, location, attendees, allDay, account }) => {
30329
- const args = ["calendar", "create", calendarId, `--summary=${summary}`, `--from=${from}`, `--to=${to}`];
30330
- if (description) args.push(`--description=${description}`);
30331
- if (location) args.push(`--location=${location}`);
30332
- if (attendees) args.push(`--attendees=${attendees}`);
30333
- if (allDay) args.push("--all-day");
30334
- return runOrDiagnose(args, { account });
30335
- });
30336
- server2.registerTool("gog_calendar_update", {
30337
- description: "Update an existing calendar event.",
30338
- annotations: { destructiveHint: false },
30339
- inputSchema: {
30340
- calendarId: external_exports.string().describe("Calendar ID"),
30341
- eventId: external_exports.string().describe("Event ID"),
30342
- summary: external_exports.string().optional().describe("New event title"),
30343
- from: external_exports.string().optional().describe("New start time (RFC3339)"),
30344
- to: external_exports.string().optional().describe("New end time (RFC3339)"),
30345
- description: external_exports.string().optional().describe("New description"),
30346
- location: external_exports.string().optional().describe("New location"),
30347
- attendees: external_exports.string().optional().describe("New attendee emails, comma-separated (replaces existing)"),
30348
- account: accountParam
30349
- }
30350
- }, async ({ calendarId, eventId, summary, from, to, description, location, attendees, account }) => {
30351
- const args = ["calendar", "update", calendarId, eventId];
30352
- if (summary !== void 0) args.push(`--summary=${summary}`);
30353
- if (from !== void 0) args.push(`--from=${from}`);
30354
- if (to !== void 0) args.push(`--to=${to}`);
30355
- if (description !== void 0) args.push(`--description=${description}`);
30356
- if (location !== void 0) args.push(`--location=${location}`);
30357
- if (attendees !== void 0) args.push(`--attendees=${attendees}`);
30358
- return runOrDiagnose(args, { account });
30359
- });
30360
- server2.registerTool("gog_calendar_delete", {
30361
- description: "Delete a calendar event.",
30362
- annotations: { destructiveHint: true },
30363
- inputSchema: {
30364
- calendarId: external_exports.string().describe("Calendar ID"),
30365
- eventId: external_exports.string().describe("Event ID"),
30366
- account: accountParam
30367
- }
30368
- }, async ({ calendarId, eventId, account }) => {
30369
- return runOrDiagnose(["calendar", "delete", calendarId, eventId], { account });
30370
- });
30371
- server2.registerTool("gog_calendar_respond", {
30372
- description: "Respond to a calendar event invitation.",
30373
- annotations: { destructiveHint: true },
30374
- inputSchema: {
30375
- calendarId: external_exports.string().describe("Calendar ID"),
30376
- eventId: external_exports.string().describe("Event ID"),
30377
- status: external_exports.enum(["accepted", "declined", "tentative"]).describe("Response status"),
30378
- comment: external_exports.string().optional().describe("Optional comment to include with response"),
30379
- account: accountParam
30380
- }
30381
- }, async ({ calendarId, eventId, status, comment, account }) => {
30382
- const args = ["calendar", "respond", calendarId, eventId, `--status=${status}`];
30383
- if (comment) args.push(`--comment=${comment}`);
30384
- return runOrDiagnose(args, { account });
30385
- });
30386
- server2.registerTool("gog_calendar_run", {
30387
- description: "Run any gog calendar subcommand not covered by the other tools. Run `gog calendar --help` for the full list of subcommands, or `gog calendar <subcommand> --help` for flags on a specific subcommand.",
30388
- annotations: { destructiveHint: true },
30389
- inputSchema: {
30390
- subcommand: external_exports.string().describe('The gog calendar subcommand to run, e.g. "calendars", "freebusy"'),
30391
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30392
- account: accountParam
30393
- }
30394
- }, async ({ subcommand, args, account }) => {
30395
- return runOrDiagnose(["calendar", subcommand, ...args], { account });
30396
- });
30397
- }
30398
-
30399
- // ../gogcli-mcp/src/tools/contacts.ts
30400
- function registerContactsTools(server2) {
30401
- server2.registerTool("gog_contacts_search", {
30402
- description: "Search Google Contacts by name, email, or phone.",
30403
- annotations: { readOnlyHint: true },
30404
- inputSchema: {
30405
- query: external_exports.string().describe("Search query (name, email, or phone)"),
30406
- account: accountParam
30407
- }
30408
- }, async ({ query, account }) => {
30409
- return runOrDiagnose(["contacts", "search", query], { account });
30410
- });
30411
- server2.registerTool("gog_contacts_list", {
30412
- description: "List all Google Contacts.",
30413
- annotations: { readOnlyHint: true },
30414
- inputSchema: {
30415
- account: accountParam
30416
- }
30417
- }, async ({ account }) => {
30418
- return runOrDiagnose(["contacts", "list"], { account });
30419
- });
30420
- server2.registerTool("gog_contacts_get", {
30421
- description: "Get a contact by resource name.",
30422
- annotations: { readOnlyHint: true },
30423
- inputSchema: {
30424
- resourceName: external_exports.string().describe("Contact resource name (e.g. people/c12345)"),
30425
- account: accountParam
30426
- }
30427
- }, async ({ resourceName, account }) => {
30428
- return runOrDiagnose(["contacts", "get", resourceName], { account });
30429
- });
30430
- server2.registerTool("gog_contacts_create", {
30431
- description: "Create a new Google Contact.",
30432
- annotations: { destructiveHint: false },
30433
- inputSchema: {
30434
- givenName: external_exports.string().describe("Given (first) name"),
30435
- familyName: external_exports.string().optional().describe("Family (last) name"),
30436
- email: external_exports.string().optional().describe("Email address"),
30437
- phone: external_exports.string().optional().describe("Phone number"),
30438
- org: external_exports.string().optional().describe("Organization/company name"),
30439
- title: external_exports.string().optional().describe("Job title"),
30440
- account: accountParam
30441
- }
30442
- }, async ({ givenName, familyName, email: email3, phone, org, title, account }) => {
30443
- const args = ["contacts", "create", `--given=${givenName}`];
30444
- if (familyName) args.push(`--family=${familyName}`);
30445
- if (email3) args.push(`--email=${email3}`);
30446
- if (phone) args.push(`--phone=${phone}`);
30447
- if (org) args.push(`--org=${org}`);
30448
- if (title) args.push(`--title=${title}`);
30449
- return runOrDiagnose(args, { account });
30450
- });
30451
- server2.registerTool("gog_contacts_run", {
30452
- description: "Run any gog contacts subcommand not covered by the other tools. Run `gog contacts --help` for the full list of subcommands, or `gog contacts <subcommand> --help` for flags on a specific subcommand.",
30453
- annotations: { destructiveHint: true },
30454
- inputSchema: {
30455
- subcommand: external_exports.string().describe('The gog contacts subcommand to run, e.g. "update", "delete", "directory"'),
30456
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30457
- account: accountParam
30458
- }
30459
- }, async ({ subcommand, args, account }) => {
30460
- return runOrDiagnose(["contacts", subcommand, ...args], { account });
30461
- });
30462
- }
30463
-
30464
- // ../gogcli-mcp/src/tools/docs.ts
30465
- function registerDocsTools(server2) {
30466
- server2.registerTool("gog_docs_info", {
30467
- description: "Get Google Doc metadata: title, ID, and other properties.",
30468
- annotations: { readOnlyHint: true },
30469
- inputSchema: {
30470
- docId: external_exports.string().describe("Doc ID (from the URL)"),
30471
- account: accountParam
30472
- }
30473
- }, async ({ docId, account }) => {
30474
- return runOrDiagnose(["docs", "info", docId], { account });
30475
- });
30476
- server2.registerTool("gog_docs_cat", {
30477
- description: "Read a Google Doc as plain text.",
30478
- annotations: { readOnlyHint: true },
30479
- inputSchema: {
30480
- docId: external_exports.string().describe("Doc ID (from the URL)"),
30481
- account: accountParam
30482
- }
30483
- }, async ({ docId, account }) => {
30484
- return runOrDiagnose(["docs", "cat", docId], { account });
30485
- });
30486
- server2.registerTool("gog_docs_create", {
30487
- description: "Create a new Google Doc. Returns JSON with the new docId and URL.",
30488
- inputSchema: {
30489
- title: external_exports.string().describe("Title for the new document"),
30490
- account: accountParam
30491
- }
30492
- }, async ({ title, account }) => {
30493
- return runOrDiagnose(["docs", "create", title], { account });
30494
- });
30495
- server2.registerTool("gog_docs_write", {
30496
- description: "Write text content to a Google Doc, replacing existing body content by default. Set append=true to add after existing content.",
30497
- annotations: { destructiveHint: true },
30498
- inputSchema: {
30499
- docId: external_exports.string().describe("Doc ID (from the URL)"),
30500
- text: external_exports.string().describe("Text content to write"),
30501
- append: external_exports.boolean().optional().describe("Append to existing content instead of replacing (default: false)"),
30502
- account: accountParam
30503
- }
30504
- }, async ({ docId, text, append, account }) => {
30505
- const args = ["docs", "write", docId, `--text=${text}`];
30506
- if (append) args.push("--append");
30507
- return runOrDiagnose(args, { account });
30508
- });
30509
- server2.registerTool("gog_docs_find_replace", {
30510
- description: "Find and replace text in a Google Doc.",
30511
- annotations: { destructiveHint: true },
30512
- inputSchema: {
30513
- docId: external_exports.string().describe("Doc ID (from the URL)"),
30514
- find: external_exports.string().describe("Text to find"),
30515
- replace: external_exports.string().describe("Replacement text"),
30516
- account: accountParam
30517
- }
30518
- }, async ({ docId, find, replace, account }) => {
30519
- return runOrDiagnose(["docs", "find-replace", docId, find, replace], { account });
30520
- });
30521
- server2.registerTool("gog_docs_structure", {
30522
- description: "Show a Google Doc's structure with numbered paragraphs. Useful for understanding the document layout before making index-based edits.",
30523
- annotations: { readOnlyHint: true },
30524
- inputSchema: {
30525
- docId: external_exports.string().describe("Doc ID (from the URL)"),
30526
- account: accountParam
30527
- }
30528
- }, async ({ docId, account }) => {
30529
- return runOrDiagnose(["docs", "structure", docId], { account });
30530
- });
30531
- server2.registerTool("gog_docs_run", {
30532
- description: "Run any gog docs subcommand not covered by the other tools. Run `gog docs --help` for the full list of subcommands, or `gog docs <subcommand> --help` for flags on a specific subcommand.",
30533
- annotations: { destructiveHint: true },
30534
- inputSchema: {
30535
- subcommand: external_exports.string().describe('The gog docs subcommand to run, e.g. "copy", "clear", "insert", "sed", "export"'),
30536
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30537
- account: accountParam
30538
- }
30539
- }, async ({ subcommand, args, account }) => {
30540
- return runOrDiagnose(["docs", subcommand, ...args], { account });
30541
- });
30542
- }
30543
-
30544
- // ../gogcli-mcp/src/tools/drive.ts
30545
- function registerDriveTools(server2) {
30546
- server2.registerTool("gog_drive_ls", {
30547
- description: "List files in a Google Drive folder (default: root).",
30548
- annotations: { readOnlyHint: true },
30549
- inputSchema: {
30550
- folderId: external_exports.string().optional().describe("Folder ID to list (default: root)"),
30551
- account: accountParam
30552
- }
30553
- }, async ({ folderId, account }) => {
30554
- const args = ["drive", "ls"];
30555
- if (folderId) args.push(folderId);
30556
- return runOrDiagnose(args, { account });
30557
- });
30558
- server2.registerTool("gog_drive_search", {
30559
- description: "Search Google Drive files by full-text query.",
30560
- annotations: { readOnlyHint: true },
30561
- inputSchema: {
30562
- query: external_exports.string().describe("Search query"),
30563
- account: accountParam
30564
- }
30565
- }, async ({ query, account }) => {
30566
- return runOrDiagnose(["drive", "search", query], { account });
30567
- });
30568
- server2.registerTool("gog_drive_get", {
30569
- description: "Get metadata for a Google Drive file.",
30570
- annotations: { readOnlyHint: true },
30571
- inputSchema: {
30572
- fileId: external_exports.string().describe("File ID"),
30573
- account: accountParam
30574
- }
30575
- }, async ({ fileId, account }) => {
30576
- return runOrDiagnose(["drive", "get", fileId], { account });
30577
- });
30578
- server2.registerTool("gog_drive_mkdir", {
30579
- description: "Create a new folder in Google Drive.",
30580
- annotations: { destructiveHint: false },
30581
- inputSchema: {
30582
- name: external_exports.string().describe("Folder name"),
30583
- account: accountParam
30584
- }
30585
- }, async ({ name, account }) => {
30586
- return runOrDiagnose(["drive", "mkdir", name], { account });
30587
- });
30588
- server2.registerTool("gog_drive_rename", {
30589
- description: "Rename a file or folder in Google Drive.",
30590
- annotations: { destructiveHint: true },
30591
- inputSchema: {
30592
- fileId: external_exports.string().describe("File or folder ID"),
30593
- newName: external_exports.string().describe("New name"),
30594
- account: accountParam
30595
- }
30596
- }, async ({ fileId, newName, account }) => {
30597
- return runOrDiagnose(["drive", "rename", fileId, newName], { account });
30598
- });
30599
- server2.registerTool("gog_drive_move", {
30600
- description: "Move a file to a different folder in Google Drive.",
30601
- annotations: { destructiveHint: true },
30602
- inputSchema: {
30603
- fileId: external_exports.string().describe("File ID to move"),
30604
- parentId: external_exports.string().describe("Destination folder ID"),
30605
- account: accountParam
30606
- }
30607
- }, async ({ fileId, parentId, account }) => {
30608
- return runOrDiagnose(["drive", "move", fileId, `--parent=${parentId}`], { account });
30609
- });
30610
- server2.registerTool("gog_drive_delete", {
30611
- description: "Move a Google Drive file to trash.",
30612
- annotations: { destructiveHint: true },
30613
- inputSchema: {
30614
- fileId: external_exports.string().describe("File ID to trash"),
30615
- account: accountParam
30616
- }
30617
- }, async ({ fileId, account }) => {
30618
- return runOrDiagnose(["drive", "delete", fileId], { account });
30619
- });
30620
- server2.registerTool("gog_drive_share", {
30621
- description: "Share a Google Drive file or folder.",
30622
- annotations: { destructiveHint: true },
30623
- inputSchema: {
30624
- fileId: external_exports.string().describe("File or folder ID"),
30625
- to: external_exports.enum(["user", "anyone", "domain"]).describe("Share target type"),
30626
- email: external_exports.string().optional().describe("User email (required when to=user)"),
30627
- domain: external_exports.string().optional().describe("Domain (required when to=domain)"),
30628
- role: external_exports.enum(["reader", "writer"]).optional().describe("Permission role (default: reader)"),
30629
- account: accountParam
30630
- }
30631
- }, async ({ fileId, to, email: email3, domain: domain2, role, account }) => {
30632
- const args = ["drive", "share", fileId, `--to=${to}`];
30633
- if (email3) args.push(`--email=${email3}`);
30634
- if (domain2) args.push(`--domain=${domain2}`);
30635
- if (role) args.push(`--role=${role}`);
30636
- return runOrDiagnose(args, { account });
30637
- });
30638
- server2.registerTool("gog_drive_run", {
30639
- description: "Run any gog drive subcommand not covered by the other tools. Run `gog drive --help` for the full list of subcommands, or `gog drive <subcommand> --help` for flags on a specific subcommand.",
30640
- annotations: { destructiveHint: true },
30641
- inputSchema: {
30642
- subcommand: external_exports.string().describe('The gog drive subcommand to run, e.g. "copy", "upload", "download", "permissions"'),
30643
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30644
- account: accountParam
30645
- }
30646
- }, async ({ subcommand, args, account }) => {
30647
- return runOrDiagnose(["drive", subcommand, ...args], { account });
30648
- });
30649
- }
30650
-
30651
- // ../gogcli-mcp/src/tools/gmail.ts
30652
- function registerGmailTools(server2) {
30653
- server2.registerTool("gog_gmail_search", {
30654
- description: 'Search Gmail threads using Gmail query syntax (e.g. "from:alice subject:invoice is:unread").',
30655
- annotations: { readOnlyHint: true },
30656
- inputSchema: {
30657
- query: external_exports.string().describe("Gmail search query"),
30658
- max: external_exports.number().int().optional().describe("Max results to return (default: 10)"),
30659
- account: accountParam
30660
- }
30661
- }, async ({ query, max, account }) => {
30662
- const args = ["gmail", "search", query];
30663
- if (max !== void 0) args.push(`--max=${max}`);
30664
- return runOrDiagnose(args, { account });
30665
- });
30666
- server2.registerTool("gog_gmail_get", {
30667
- description: "Get a Gmail message by ID.",
30668
- annotations: { readOnlyHint: true },
30669
- inputSchema: {
30670
- messageId: external_exports.string().describe("Message ID"),
30671
- format: external_exports.enum(["full", "metadata", "raw"]).optional().describe("Message format (default: full)"),
30672
- account: accountParam
30673
- }
30674
- }, async ({ messageId, format, account }) => {
30675
- const args = ["gmail", "get", messageId];
30676
- if (format) args.push(`--format=${format}`);
30677
- return runOrDiagnose(args, { account });
30678
- });
30679
- server2.registerTool("gog_gmail_send", {
30680
- description: "Send an email.",
30681
- annotations: { destructiveHint: true },
30682
- inputSchema: {
30683
- to: external_exports.string().describe("Recipient(s), comma-separated"),
30684
- subject: external_exports.string().describe("Subject line"),
30685
- body: external_exports.string().describe("Email body (plain text)"),
30686
- cc: external_exports.string().optional().describe("CC recipients, comma-separated"),
30687
- bcc: external_exports.string().optional().describe("BCC recipients, comma-separated"),
30688
- replyToMessageId: external_exports.string().optional().describe("Message ID to reply to"),
30689
- threadId: external_exports.string().optional().describe("Thread ID to reply within"),
30690
- account: accountParam
30691
- }
30692
- }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, account }) => {
30693
- const args = ["gmail", "send", `--to=${to}`, `--subject=${subject}`, `--body=${body}`];
30694
- if (cc) args.push(`--cc=${cc}`);
30695
- if (bcc) args.push(`--bcc=${bcc}`);
30696
- if (replyToMessageId) args.push(`--reply-to-message-id=${replyToMessageId}`);
30697
- if (threadId) args.push(`--thread-id=${threadId}`);
30698
- return runOrDiagnose(args, { account });
30699
- });
30700
- server2.registerTool("gog_gmail_run", {
30701
- description: "Run any gog gmail subcommand not covered by the other tools. Run `gog gmail --help` for the full list of subcommands, or `gog gmail <subcommand> --help` for flags on a specific subcommand.",
30702
- annotations: { destructiveHint: true },
30703
- inputSchema: {
30704
- subcommand: external_exports.string().describe('The gog gmail subcommand to run, e.g. "archive", "mark-read", "labels"'),
30705
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30706
- account: accountParam
30707
- }
30708
- }, async ({ subcommand, args, account }) => {
30709
- return runOrDiagnose(["gmail", subcommand, ...args], { account });
30710
- });
30711
- }
30712
-
30713
30282
  // ../gogcli-mcp/src/tools/sheets.ts
30714
30283
  function registerSheetsTools(server2) {
30715
30284
  server2.registerTool("gog_sheets_get", {
@@ -30809,105 +30378,13 @@ function registerSheetsTools(server2) {
30809
30378
  });
30810
30379
  }
30811
30380
 
30812
- // ../gogcli-mcp/src/tools/tasks.ts
30813
- function registerTasksTools(server2) {
30814
- server2.registerTool("gog_tasks_lists", {
30815
- description: "List all Google Task lists.",
30816
- annotations: { readOnlyHint: true },
30817
- inputSchema: {
30818
- account: accountParam
30819
- }
30820
- }, async ({ account }) => {
30821
- return runOrDiagnose(["tasks", "lists", "list"], { account });
30822
- });
30823
- server2.registerTool("gog_tasks_list", {
30824
- description: "List tasks in a Google Task list.",
30825
- annotations: { readOnlyHint: true },
30826
- inputSchema: {
30827
- tasklistId: external_exports.string().describe("Task list ID (use gog_tasks_lists to find IDs)"),
30828
- account: accountParam
30829
- }
30830
- }, async ({ tasklistId, account }) => {
30831
- return runOrDiagnose(["tasks", "list", tasklistId], { account });
30832
- });
30833
- server2.registerTool("gog_tasks_get", {
30834
- description: "Get a specific task by ID.",
30835
- annotations: { readOnlyHint: true },
30836
- inputSchema: {
30837
- tasklistId: external_exports.string().describe("Task list ID"),
30838
- taskId: external_exports.string().describe("Task ID"),
30839
- account: accountParam
30840
- }
30841
- }, async ({ tasklistId, taskId, account }) => {
30842
- return runOrDiagnose(["tasks", "get", tasklistId, taskId], { account });
30843
- });
30844
- server2.registerTool("gog_tasks_add", {
30845
- description: "Add a task to a Google Task list.",
30846
- annotations: { destructiveHint: false },
30847
- inputSchema: {
30848
- tasklistId: external_exports.string().describe("Task list ID"),
30849
- title: external_exports.string().describe("Task title"),
30850
- notes: external_exports.string().optional().describe("Task notes/description"),
30851
- due: external_exports.string().optional().describe("Due date (YYYY-MM-DD or RFC3339)"),
30852
- account: accountParam
30853
- }
30854
- }, async ({ tasklistId, title, notes, due, account }) => {
30855
- const args = ["tasks", "add", tasklistId, `--title=${title}`];
30856
- if (notes) args.push(`--notes=${notes}`);
30857
- if (due) args.push(`--due=${due}`);
30858
- return runOrDiagnose(args, { account });
30859
- });
30860
- server2.registerTool("gog_tasks_done", {
30861
- description: "Mark a task as completed.",
30862
- annotations: { destructiveHint: true },
30863
- inputSchema: {
30864
- tasklistId: external_exports.string().describe("Task list ID"),
30865
- taskId: external_exports.string().describe("Task ID"),
30866
- account: accountParam
30867
- }
30868
- }, async ({ tasklistId, taskId, account }) => {
30869
- return runOrDiagnose(["tasks", "done", tasklistId, taskId], { account });
30870
- });
30871
- server2.registerTool("gog_tasks_delete", {
30872
- description: "Delete a task.",
30873
- annotations: { destructiveHint: true },
30874
- inputSchema: {
30875
- tasklistId: external_exports.string().describe("Task list ID"),
30876
- taskId: external_exports.string().describe("Task ID"),
30877
- account: accountParam
30878
- }
30879
- }, async ({ tasklistId, taskId, account }) => {
30880
- return runOrDiagnose(["tasks", "delete", tasklistId, taskId], { account });
30881
- });
30882
- server2.registerTool("gog_tasks_run", {
30883
- description: "Run any gog tasks subcommand not covered by the other tools. Run `gog tasks --help` for the full list of subcommands, or `gog tasks <subcommand> --help` for flags on a specific subcommand.",
30884
- annotations: { destructiveHint: true },
30885
- inputSchema: {
30886
- subcommand: external_exports.string().describe('The gog tasks subcommand to run, e.g. "update", "undo", "clear"'),
30887
- args: external_exports.array(external_exports.string()).describe("Additional positional args and flags"),
30888
- account: accountParam
30889
- }
30890
- }, async ({ subcommand, args, account }) => {
30891
- return runOrDiagnose(["tasks", subcommand, ...args], { account });
30892
- });
30893
- }
30894
-
30895
30381
  // ../gogcli-mcp/src/server.ts
30896
- var VERSION = true ? "1.0.10" : "0.0.0";
30897
- function createBaseServer(options) {
30898
- const server2 = new McpServer({
30382
+ var VERSION = true ? "2.0.2" : "0.0.0";
30383
+ function createServer(options) {
30384
+ return new McpServer({
30899
30385
  name: options?.name ?? "gogcli",
30900
30386
  version: options?.version ?? VERSION
30901
30387
  });
30902
- registerAuthTools(server2);
30903
- registerCalendarTools(server2);
30904
- registerContactsTools(server2);
30905
- registerDocsTools(server2);
30906
- registerDriveTools(server2);
30907
- registerGmailTools(server2);
30908
- registerSheetsTools(server2);
30909
- registerTasksTools(server2);
30910
- return server2;
30911
30388
  }
30912
30389
 
30913
30390
  // src/tools/sheets-extra.ts
@@ -31206,7 +30683,9 @@ function registerExtraSheetsTools(server2) {
31206
30683
  }
31207
30684
 
31208
30685
  // src/index.ts
31209
- var server = createBaseServer({ name: "gogcli-sheets" });
30686
+ var server = createServer({ name: "gogcli-sheets" });
30687
+ registerAuthTools(server);
30688
+ registerSheetsTools(server);
31210
30689
  registerExtraSheetsTools(server);
31211
30690
  var transport = new StdioServerTransport();
31212
30691
  await server.connect(transport);
package/manifest.json CHANGED
@@ -3,8 +3,8 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp-sheets",
5
5
  "display_name": "gogcli (Sheets)",
6
- "version": "1.0.10",
7
- "description": "Extended Google Sheets for Claude via gogcli — all base tools plus full Sheets support",
6
+ "version": "2.0.2",
7
+ "description": "Extended Google Sheets for Claude via gogcli — auth + full Sheets support",
8
8
  "author": {
9
9
  "name": "Chris Hall",
10
10
  "email": "chris.c.hall@gmail.com",
@@ -21,9 +21,6 @@
21
21
  "google",
22
22
  "sheets",
23
23
  "spreadsheet",
24
- "gmail",
25
- "calendar",
26
- "drive",
27
24
  "gogcli",
28
25
  "gog",
29
26
  "tabs",
@@ -79,162 +76,6 @@
79
76
  "name": "gog_auth_run",
80
77
  "description": "Run any gog auth subcommand (escape hatch)"
81
78
  },
82
- {
83
- "name": "gog_gmail_search",
84
- "description": "Search Gmail threads by query"
85
- },
86
- {
87
- "name": "gog_gmail_get",
88
- "description": "Get a Gmail message by ID"
89
- },
90
- {
91
- "name": "gog_gmail_send",
92
- "description": "Send an email"
93
- },
94
- {
95
- "name": "gog_gmail_run",
96
- "description": "Run any gog gmail subcommand (escape hatch)"
97
- },
98
- {
99
- "name": "gog_calendar_events",
100
- "description": "List calendar events with optional filters"
101
- },
102
- {
103
- "name": "gog_calendar_get",
104
- "description": "Get a specific calendar event"
105
- },
106
- {
107
- "name": "gog_calendar_create",
108
- "description": "Create a calendar event"
109
- },
110
- {
111
- "name": "gog_calendar_update",
112
- "description": "Update an existing calendar event"
113
- },
114
- {
115
- "name": "gog_calendar_delete",
116
- "description": "Delete a calendar event"
117
- },
118
- {
119
- "name": "gog_calendar_respond",
120
- "description": "Respond to a calendar event invitation"
121
- },
122
- {
123
- "name": "gog_calendar_run",
124
- "description": "Run any gog calendar subcommand (escape hatch)"
125
- },
126
- {
127
- "name": "gog_drive_ls",
128
- "description": "List files in a Google Drive folder"
129
- },
130
- {
131
- "name": "gog_drive_search",
132
- "description": "Search Google Drive files"
133
- },
134
- {
135
- "name": "gog_drive_get",
136
- "description": "Get Google Drive file metadata"
137
- },
138
- {
139
- "name": "gog_drive_mkdir",
140
- "description": "Create a folder in Google Drive"
141
- },
142
- {
143
- "name": "gog_drive_rename",
144
- "description": "Rename a file or folder in Google Drive"
145
- },
146
- {
147
- "name": "gog_drive_move",
148
- "description": "Move a file to a different folder"
149
- },
150
- {
151
- "name": "gog_drive_delete",
152
- "description": "Move a file to trash"
153
- },
154
- {
155
- "name": "gog_drive_share",
156
- "description": "Share a file or folder"
157
- },
158
- {
159
- "name": "gog_drive_run",
160
- "description": "Run any gog drive subcommand (escape hatch)"
161
- },
162
- {
163
- "name": "gog_tasks_lists",
164
- "description": "List all Google Task lists"
165
- },
166
- {
167
- "name": "gog_tasks_list",
168
- "description": "List tasks in a task list"
169
- },
170
- {
171
- "name": "gog_tasks_get",
172
- "description": "Get a specific task"
173
- },
174
- {
175
- "name": "gog_tasks_add",
176
- "description": "Add a task to a task list"
177
- },
178
- {
179
- "name": "gog_tasks_done",
180
- "description": "Mark a task as completed"
181
- },
182
- {
183
- "name": "gog_tasks_delete",
184
- "description": "Delete a task"
185
- },
186
- {
187
- "name": "gog_tasks_run",
188
- "description": "Run any gog tasks subcommand (escape hatch)"
189
- },
190
- {
191
- "name": "gog_contacts_search",
192
- "description": "Search Google Contacts"
193
- },
194
- {
195
- "name": "gog_contacts_list",
196
- "description": "List all Google Contacts"
197
- },
198
- {
199
- "name": "gog_contacts_get",
200
- "description": "Get a contact by resource name"
201
- },
202
- {
203
- "name": "gog_contacts_create",
204
- "description": "Create a new Google Contact"
205
- },
206
- {
207
- "name": "gog_contacts_run",
208
- "description": "Run any gog contacts subcommand (escape hatch)"
209
- },
210
- {
211
- "name": "gog_docs_info",
212
- "description": "Get Google Doc metadata (title, ID, properties)"
213
- },
214
- {
215
- "name": "gog_docs_cat",
216
- "description": "Read a Google Doc as plain text"
217
- },
218
- {
219
- "name": "gog_docs_create",
220
- "description": "Create a new Google Doc"
221
- },
222
- {
223
- "name": "gog_docs_write",
224
- "description": "Write or append text content to a Google Doc"
225
- },
226
- {
227
- "name": "gog_docs_find_replace",
228
- "description": "Find and replace text in a Google Doc"
229
- },
230
- {
231
- "name": "gog_docs_structure",
232
- "description": "Show document structure with numbered paragraphs"
233
- },
234
- {
235
- "name": "gog_docs_run",
236
- "description": "Run any gog docs subcommand (escape hatch)"
237
- },
238
79
  {
239
80
  "name": "gog_sheets_get",
240
81
  "description": "Read values from a Google Sheets range"
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "gogcli-mcp-sheets",
3
- "version": "1.0.9",
3
+ "version": "2.0.2",
4
4
  "description": "Extended Google Sheets MCP server via gogcli — all base tools plus full Sheets support",
5
+ "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/chrischall/gogcli-mcp"
@@ -25,5 +26,15 @@
25
26
  "@modelcontextprotocol/sdk": "^1.29.0",
26
27
  "zod": "^4.3.6"
27
28
  },
28
- "license": "MIT"
29
+ "license": "MIT",
30
+ "keywords": [
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "claude",
34
+ "ai",
35
+ "google",
36
+ "gogcli",
37
+ "google-sheets",
38
+ "spreadsheets"
39
+ ]
29
40
  }
package/src/index.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { createBaseServer } from '../../gogcli-mcp/src/lib.js';
3
+ import { createServer, registerAuthTools, registerSheetsTools } from '../../gogcli-mcp/src/lib.js';
4
4
  import { registerExtraSheetsTools } from './tools/sheets-extra.js';
5
5
 
6
- const server = createBaseServer({ name: 'gogcli-sheets' });
6
+ const server = createServer({ name: 'gogcli-sheets' });
7
+ registerAuthTools(server);
8
+ registerSheetsTools(server);
7
9
  registerExtraSheetsTools(server);
8
10
 
9
11
  const transport = new StdioServerTransport();