gogcli-mcp-sheets 1.0.8 → 2.0.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/README.md +2 -2
- package/SKILL.md +60 -0
- package/dist/index.js +6 -530
- package/manifest.json +210 -0
- package/package.json +1 -1
- package/src/index.ts +4 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# gogcli-mcp-sheets
|
|
2
2
|
|
|
3
|
-
Extended Google Sheets [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/steipete/gogcli). Includes
|
|
3
|
+
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
4
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
|
@@ -43,7 +43,7 @@ claude mcp add gogcli-sheets -- gogcli-mcp-sheets
|
|
|
43
43
|
|
|
44
44
|
## Extra Sheets Tools (22)
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
Plus 5 auth tools and 8 base Sheets tools (get, update, append, clear, metadata, create, find-replace, run).
|
|
47
47
|
|
|
48
48
|
| Tool | Description |
|
|
49
49
|
|------|-------------|
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
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. Includes auth and Sheets tools only.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# gogcli-mcp-sheets
|
|
7
|
+
|
|
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
|
+
|
|
10
|
+
- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- [gogcli](https://github.com/steipete/gogcli) installed and authenticated
|
|
15
|
+
- Node.js 18 or later
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"gogcli-sheets": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "gogcli-mcp-sheets"],
|
|
25
|
+
"env": {
|
|
26
|
+
"GOG_ACCOUNT": "you@gmail.com"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Extra Sheets Tools
|
|
34
|
+
|
|
35
|
+
| Tool | What it does |
|
|
36
|
+
|------|-------------|
|
|
37
|
+
| `gog_sheets_add_tab` | Add a new sheet tab |
|
|
38
|
+
| `gog_sheets_delete_tab` | Delete a sheet tab |
|
|
39
|
+
| `gog_sheets_rename_tab` | Rename a sheet tab |
|
|
40
|
+
| `gog_sheets_copy` | Copy a sheet to another spreadsheet |
|
|
41
|
+
| `gog_sheets_export` | Export as CSV, TSV, XLSX, PDF |
|
|
42
|
+
| `gog_sheets_freeze` | Freeze rows and/or columns |
|
|
43
|
+
| `gog_sheets_insert` | Insert rows or columns |
|
|
44
|
+
| `gog_sheets_merge` | Merge cells |
|
|
45
|
+
| `gog_sheets_unmerge` | Unmerge cells |
|
|
46
|
+
| `gog_sheets_format` | Apply cell formatting |
|
|
47
|
+
| `gog_sheets_number_format` | Set number format |
|
|
48
|
+
| `gog_sheets_read_format` | Read cell formatting |
|
|
49
|
+
| `gog_sheets_resize_columns` | Resize column widths |
|
|
50
|
+
| `gog_sheets_resize_rows` | Resize row heights |
|
|
51
|
+
| `gog_sheets_notes` | Read cell notes |
|
|
52
|
+
| `gog_sheets_update_note` | Add or update cell notes |
|
|
53
|
+
| `gog_sheets_links` | List hyperlinks in a range |
|
|
54
|
+
| `gog_sheets_named_ranges_list` | List named ranges |
|
|
55
|
+
| `gog_sheets_named_ranges_get` | Get a named range |
|
|
56
|
+
| `gog_sheets_named_ranges_add` | Create a named range |
|
|
57
|
+
| `gog_sheets_named_ranges_update` | Update a named range |
|
|
58
|
+
| `gog_sheets_named_ranges_delete` | Delete a named range |
|
|
59
|
+
|
|
60
|
+
Plus 5 auth tools and 8 base Sheets tools.
|
package/dist/index.js
CHANGED
|
@@ -30276,440 +30276,6 @@ function registerAuthTools(server2) {
|
|
|
30276
30276
|
});
|
|
30277
30277
|
}
|
|
30278
30278
|
|
|
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
30279
|
// ../gogcli-mcp/src/tools/sheets.ts
|
|
30714
30280
|
function registerSheetsTools(server2) {
|
|
30715
30281
|
server2.registerTool("gog_sheets_get", {
|
|
@@ -30809,105 +30375,13 @@ function registerSheetsTools(server2) {
|
|
|
30809
30375
|
});
|
|
30810
30376
|
}
|
|
30811
30377
|
|
|
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
30378
|
// ../gogcli-mcp/src/server.ts
|
|
30896
|
-
var VERSION = true ? "
|
|
30897
|
-
function
|
|
30898
|
-
|
|
30379
|
+
var VERSION = true ? "2.0.0" : "0.0.0";
|
|
30380
|
+
function createServer(options) {
|
|
30381
|
+
return new McpServer({
|
|
30899
30382
|
name: options?.name ?? "gogcli",
|
|
30900
30383
|
version: options?.version ?? VERSION
|
|
30901
30384
|
});
|
|
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
30385
|
}
|
|
30912
30386
|
|
|
30913
30387
|
// src/tools/sheets-extra.ts
|
|
@@ -31206,7 +30680,9 @@ function registerExtraSheetsTools(server2) {
|
|
|
31206
30680
|
}
|
|
31207
30681
|
|
|
31208
30682
|
// src/index.ts
|
|
31209
|
-
var server =
|
|
30683
|
+
var server = createServer({ name: "gogcli-sheets" });
|
|
30684
|
+
registerAuthTools(server);
|
|
30685
|
+
registerSheetsTools(server);
|
|
31210
30686
|
registerExtraSheetsTools(server);
|
|
31211
30687
|
var transport = new StdioServerTransport();
|
|
31212
30688
|
await server.connect(transport);
|
package/manifest.json
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/anthropics/dxt/main/dist/mcpb-manifest.schema.json",
|
|
3
|
+
"manifest_version": "0.3",
|
|
4
|
+
"name": "gogcli-mcp-sheets",
|
|
5
|
+
"display_name": "gogcli (Sheets)",
|
|
6
|
+
"version": "2.0.0",
|
|
7
|
+
"description": "Extended Google Sheets for Claude via gogcli — auth + full Sheets support",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Chris Hall",
|
|
10
|
+
"email": "chris.c.hall@gmail.com",
|
|
11
|
+
"url": "https://github.com/chrischall"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/chrischall/gogcli-mcp"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/chrischall/gogcli-mcp",
|
|
18
|
+
"support": "https://github.com/chrischall/gogcli-mcp/issues",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"keywords": [
|
|
21
|
+
"google",
|
|
22
|
+
"sheets",
|
|
23
|
+
"spreadsheet",
|
|
24
|
+
"gogcli",
|
|
25
|
+
"gog",
|
|
26
|
+
"tabs",
|
|
27
|
+
"formatting",
|
|
28
|
+
"named-ranges"
|
|
29
|
+
],
|
|
30
|
+
"server": {
|
|
31
|
+
"type": "node",
|
|
32
|
+
"entry_point": "dist/index.js",
|
|
33
|
+
"mcp_config": {
|
|
34
|
+
"command": "node",
|
|
35
|
+
"args": [
|
|
36
|
+
"${__dirname}/dist/index.js"
|
|
37
|
+
],
|
|
38
|
+
"env": {
|
|
39
|
+
"GOG_ACCOUNT": "${user_config.gog_account}",
|
|
40
|
+
"GOG_PATH": "${user_config.gog_path}"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"user_config": {
|
|
45
|
+
"gog_account": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"title": "Google Account",
|
|
48
|
+
"description": "Default Google account email (optional — uses gogcli's configured default if omitted)",
|
|
49
|
+
"required": false
|
|
50
|
+
},
|
|
51
|
+
"gog_path": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"title": "gog Executable Path",
|
|
54
|
+
"description": "Path to the gog executable (optional — defaults to 'gog' on your PATH)",
|
|
55
|
+
"required": false
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"tools": [
|
|
59
|
+
{
|
|
60
|
+
"name": "gog_auth_add",
|
|
61
|
+
"description": "Authorize a Google account via browser-based OAuth"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "gog_auth_list",
|
|
65
|
+
"description": "List all Google accounts stored in gogcli"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "gog_auth_status",
|
|
69
|
+
"description": "Show gogcli auth configuration (keyring, credential files)"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "gog_auth_services",
|
|
73
|
+
"description": "List Google services and OAuth scopes supported by gogcli"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "gog_auth_run",
|
|
77
|
+
"description": "Run any gog auth subcommand (escape hatch)"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "gog_sheets_get",
|
|
81
|
+
"description": "Read values from a Google Sheets range"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "gog_sheets_update",
|
|
85
|
+
"description": "Write values to a Google Sheets range"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "gog_sheets_append",
|
|
89
|
+
"description": "Append rows to a Google Sheet"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "gog_sheets_clear",
|
|
93
|
+
"description": "Clear values in a Google Sheets range"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "gog_sheets_metadata",
|
|
97
|
+
"description": "Get spreadsheet metadata (title, tabs, named ranges)"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "gog_sheets_create",
|
|
101
|
+
"description": "Create a new Google Spreadsheet"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "gog_sheets_find_replace",
|
|
105
|
+
"description": "Find and replace text across a spreadsheet"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "gog_sheets_run",
|
|
109
|
+
"description": "Run any gog sheets subcommand (escape hatch)"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "gog_sheets_add_tab",
|
|
113
|
+
"description": "Add a new sheet tab to a spreadsheet."
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "gog_sheets_delete_tab",
|
|
117
|
+
"description": "Delete a sheet tab from a spreadsheet."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "gog_sheets_rename_tab",
|
|
121
|
+
"description": "Rename a sheet tab."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "gog_sheets_copy",
|
|
125
|
+
"description": "Copy a spreadsheet to a new spreadsheet with the given title."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"name": "gog_sheets_export",
|
|
129
|
+
"description": "Export a spreadsheet as CSV, TSV, or PDF."
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "gog_sheets_freeze",
|
|
133
|
+
"description": "Freeze rows and/or columns in a sheet."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"name": "gog_sheets_insert",
|
|
137
|
+
"description": "Insert rows or columns into a sheet."
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "gog_sheets_merge",
|
|
141
|
+
"description": "Merge cells in a range."
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "gog_sheets_unmerge",
|
|
145
|
+
"description": "Unmerge previously merged cells in a range."
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"name": "gog_sheets_format",
|
|
149
|
+
"description": "Apply cell formatting (bold, colors, alignment, etc.) to a range. Pass format as a JSON CellFormat object."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "gog_sheets_number_format",
|
|
153
|
+
"description": "Set number format on a range (currency, percentage, date, etc.)."
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "gog_sheets_read_format",
|
|
157
|
+
"description": "Read cell formatting for a range."
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"name": "gog_sheets_resize_columns",
|
|
161
|
+
"description": "Resize column widths. Use --auto for auto-fit or --width for a specific pixel width."
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "gog_sheets_resize_rows",
|
|
165
|
+
"description": "Resize row heights. Use --auto for auto-fit or --height for a specific pixel height."
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "gog_sheets_notes",
|
|
169
|
+
"description": "Read cell notes in a range."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"name": "gog_sheets_update_note",
|
|
173
|
+
"description": "Add, update, or clear a cell note. Pass an empty string to clear the note."
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "gog_sheets_links",
|
|
177
|
+
"description": "List hyperlinks in a range."
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "gog_sheets_named_ranges_list",
|
|
181
|
+
"description": "List all named ranges in a spreadsheet."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "gog_sheets_named_ranges_get",
|
|
185
|
+
"description": "Get a named range by name or ID."
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "gog_sheets_named_ranges_add",
|
|
189
|
+
"description": "Create a new named range."
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "gog_sheets_named_ranges_update",
|
|
193
|
+
"description": "Update a named range (change its name, range, or both)."
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"name": "gog_sheets_named_ranges_delete",
|
|
197
|
+
"description": "Delete a named range."
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
"compatibility": {
|
|
201
|
+
"platforms": [
|
|
202
|
+
"darwin",
|
|
203
|
+
"linux",
|
|
204
|
+
"win32"
|
|
205
|
+
],
|
|
206
|
+
"runtimes": {
|
|
207
|
+
"node": ">=18.0.0"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
package/package.json
CHANGED
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 {
|
|
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 =
|
|
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();
|