@aaronsb/google-workspace-mcp 2.0.0-alpha.4

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/build/__helpers__/testSetup.d.ts +1 -0
  4. package/build/__helpers__/testSetup.js +6 -0
  5. package/build/__helpers__/testSetup.js.map +1 -0
  6. package/build/__tests__/accounts/credentials.test.d.ts +1 -0
  7. package/build/__tests__/accounts/credentials.test.js +129 -0
  8. package/build/__tests__/accounts/credentials.test.js.map +1 -0
  9. package/build/__tests__/accounts/registry.test.d.ts +1 -0
  10. package/build/__tests__/accounts/registry.test.js +74 -0
  11. package/build/__tests__/accounts/registry.test.js.map +1 -0
  12. package/build/__tests__/executor/errors.test.d.ts +1 -0
  13. package/build/__tests__/executor/errors.test.js +42 -0
  14. package/build/__tests__/executor/errors.test.js.map +1 -0
  15. package/build/__tests__/executor/gws.test.d.ts +1 -0
  16. package/build/__tests__/executor/gws.test.js +178 -0
  17. package/build/__tests__/executor/gws.test.js.map +1 -0
  18. package/build/__tests__/executor/paths.test.d.ts +1 -0
  19. package/build/__tests__/executor/paths.test.js +60 -0
  20. package/build/__tests__/executor/paths.test.js.map +1 -0
  21. package/build/__tests__/executor/workspace.test.d.ts +1 -0
  22. package/build/__tests__/executor/workspace.test.js +117 -0
  23. package/build/__tests__/executor/workspace.test.js.map +1 -0
  24. package/build/__tests__/factory/generator.test.d.ts +1 -0
  25. package/build/__tests__/factory/generator.test.js +178 -0
  26. package/build/__tests__/factory/generator.test.js.map +1 -0
  27. package/build/__tests__/factory/patch-coverage.test.d.ts +10 -0
  28. package/build/__tests__/factory/patch-coverage.test.js +148 -0
  29. package/build/__tests__/factory/patch-coverage.test.js.map +1 -0
  30. package/build/__tests__/factory/safety.test.d.ts +1 -0
  31. package/build/__tests__/factory/safety.test.js +107 -0
  32. package/build/__tests__/factory/safety.test.js.map +1 -0
  33. package/build/__tests__/integration/executor.test.d.ts +5 -0
  34. package/build/__tests__/integration/executor.test.js +46 -0
  35. package/build/__tests__/integration/executor.test.js.map +1 -0
  36. package/build/__tests__/integration/handlers.test.d.ts +6 -0
  37. package/build/__tests__/integration/handlers.test.js +95 -0
  38. package/build/__tests__/integration/handlers.test.js.map +1 -0
  39. package/build/__tests__/integration/setup.d.ts +19 -0
  40. package/build/__tests__/integration/setup.js +61 -0
  41. package/build/__tests__/integration/setup.js.map +1 -0
  42. package/build/__tests__/server/formatting/markdown.test.d.ts +1 -0
  43. package/build/__tests__/server/formatting/markdown.test.js +149 -0
  44. package/build/__tests__/server/formatting/markdown.test.js.map +1 -0
  45. package/build/__tests__/server/formatting/next-steps.test.d.ts +1 -0
  46. package/build/__tests__/server/formatting/next-steps.test.js +42 -0
  47. package/build/__tests__/server/formatting/next-steps.test.js.map +1 -0
  48. package/build/__tests__/server/handler.test.d.ts +1 -0
  49. package/build/__tests__/server/handler.test.js +97 -0
  50. package/build/__tests__/server/handler.test.js.map +1 -0
  51. package/build/__tests__/server/handlers/__mocks__/executor.d.ts +147 -0
  52. package/build/__tests__/server/handlers/__mocks__/executor.js +114 -0
  53. package/build/__tests__/server/handlers/__mocks__/executor.js.map +1 -0
  54. package/build/__tests__/server/handlers/accounts.test.d.ts +1 -0
  55. package/build/__tests__/server/handlers/accounts.test.js +127 -0
  56. package/build/__tests__/server/handlers/accounts.test.js.map +1 -0
  57. package/build/__tests__/server/handlers/calendar.test.d.ts +1 -0
  58. package/build/__tests__/server/handlers/calendar.test.js +95 -0
  59. package/build/__tests__/server/handlers/calendar.test.js.map +1 -0
  60. package/build/__tests__/server/handlers/drive.test.d.ts +1 -0
  61. package/build/__tests__/server/handlers/drive.test.js +81 -0
  62. package/build/__tests__/server/handlers/drive.test.js.map +1 -0
  63. package/build/__tests__/server/handlers/email.test.d.ts +1 -0
  64. package/build/__tests__/server/handlers/email.test.js +99 -0
  65. package/build/__tests__/server/handlers/email.test.js.map +1 -0
  66. package/build/__tests__/server/handlers/validate.test.d.ts +1 -0
  67. package/build/__tests__/server/handlers/validate.test.js +88 -0
  68. package/build/__tests__/server/handlers/validate.test.js.map +1 -0
  69. package/build/__tests__/server/queue.test.d.ts +1 -0
  70. package/build/__tests__/server/queue.test.js +194 -0
  71. package/build/__tests__/server/queue.test.js.map +1 -0
  72. package/build/__tests__/server/server.test.d.ts +7 -0
  73. package/build/__tests__/server/server.test.js +135 -0
  74. package/build/__tests__/server/server.test.js.map +1 -0
  75. package/build/__tests__/server/tools.test.d.ts +1 -0
  76. package/build/__tests__/server/tools.test.js +91 -0
  77. package/build/__tests__/server/tools.test.js.map +1 -0
  78. package/build/accounts/auth.d.ts +24 -0
  79. package/build/accounts/auth.js +118 -0
  80. package/build/accounts/auth.js.map +1 -0
  81. package/build/accounts/credentials.d.ts +11 -0
  82. package/build/accounts/credentials.js +52 -0
  83. package/build/accounts/credentials.js.map +1 -0
  84. package/build/accounts/index.d.ts +6 -0
  85. package/build/accounts/index.js +4 -0
  86. package/build/accounts/index.js.map +1 -0
  87. package/build/accounts/registry.d.ts +11 -0
  88. package/build/accounts/registry.js +62 -0
  89. package/build/accounts/registry.js.map +1 -0
  90. package/build/executor/errors.d.ts +15 -0
  91. package/build/executor/errors.js +37 -0
  92. package/build/executor/errors.js.map +1 -0
  93. package/build/executor/file-output.d.ts +23 -0
  94. package/build/executor/file-output.js +67 -0
  95. package/build/executor/file-output.js.map +1 -0
  96. package/build/executor/gws.d.ts +23 -0
  97. package/build/executor/gws.js +144 -0
  98. package/build/executor/gws.js.map +1 -0
  99. package/build/executor/index.d.ts +4 -0
  100. package/build/executor/index.js +4 -0
  101. package/build/executor/index.js.map +1 -0
  102. package/build/executor/paths.d.ts +6 -0
  103. package/build/executor/paths.js +25 -0
  104. package/build/executor/paths.js.map +1 -0
  105. package/build/executor/workspace.d.ts +38 -0
  106. package/build/executor/workspace.js +146 -0
  107. package/build/executor/workspace.js.map +1 -0
  108. package/build/factory/defaults.d.ts +8 -0
  109. package/build/factory/defaults.js +101 -0
  110. package/build/factory/defaults.js.map +1 -0
  111. package/build/factory/generator.d.ts +23 -0
  112. package/build/factory/generator.js +253 -0
  113. package/build/factory/generator.js.map +1 -0
  114. package/build/factory/manifest.yaml +852 -0
  115. package/build/factory/patches.d.ts +6 -0
  116. package/build/factory/patches.js +13 -0
  117. package/build/factory/patches.js.map +1 -0
  118. package/build/factory/registry.d.ts +12 -0
  119. package/build/factory/registry.js +18 -0
  120. package/build/factory/registry.js.map +1 -0
  121. package/build/factory/safety.d.ts +68 -0
  122. package/build/factory/safety.js +157 -0
  123. package/build/factory/safety.js.map +1 -0
  124. package/build/factory/types.d.ts +102 -0
  125. package/build/factory/types.js +6 -0
  126. package/build/factory/types.js.map +1 -0
  127. package/build/factory/yaml.d.ts +2 -0
  128. package/build/factory/yaml.js +3 -0
  129. package/build/factory/yaml.js.map +1 -0
  130. package/build/index.d.ts +2 -0
  131. package/build/index.js +14 -0
  132. package/build/index.js.map +1 -0
  133. package/build/server/formatting/markdown.d.ts +21 -0
  134. package/build/server/formatting/markdown.js +324 -0
  135. package/build/server/formatting/markdown.js.map +1 -0
  136. package/build/server/formatting/next-steps.d.ts +9 -0
  137. package/build/server/formatting/next-steps.js +123 -0
  138. package/build/server/formatting/next-steps.js.map +1 -0
  139. package/build/server/handler.d.ts +3 -0
  140. package/build/server/handler.js +24 -0
  141. package/build/server/handler.js.map +1 -0
  142. package/build/server/handlers/accounts.d.ts +2 -0
  143. package/build/server/handlers/accounts.js +181 -0
  144. package/build/server/handlers/accounts.js.map +1 -0
  145. package/build/server/handlers/calendar.d.ts +2 -0
  146. package/build/server/handlers/calendar.js +93 -0
  147. package/build/server/handlers/calendar.js.map +1 -0
  148. package/build/server/handlers/drive.d.ts +2 -0
  149. package/build/server/handlers/drive.js +74 -0
  150. package/build/server/handlers/drive.js.map +1 -0
  151. package/build/server/handlers/email.d.ts +2 -0
  152. package/build/server/handlers/email.js +115 -0
  153. package/build/server/handlers/email.js.map +1 -0
  154. package/build/server/handlers/validate.d.ts +3 -0
  155. package/build/server/handlers/validate.js +22 -0
  156. package/build/server/handlers/validate.js.map +1 -0
  157. package/build/server/handlers/workspace.d.ts +9 -0
  158. package/build/server/handlers/workspace.js +110 -0
  159. package/build/server/handlers/workspace.js.map +1 -0
  160. package/build/server/index.d.ts +4 -0
  161. package/build/server/index.js +4 -0
  162. package/build/server/index.js.map +1 -0
  163. package/build/server/queue.d.ts +11 -0
  164. package/build/server/queue.js +141 -0
  165. package/build/server/queue.js.map +1 -0
  166. package/build/server/server.d.ts +3 -0
  167. package/build/server/server.js +214 -0
  168. package/build/server/server.js.map +1 -0
  169. package/build/server/tools.d.ts +13 -0
  170. package/build/server/tools.js +99 -0
  171. package/build/server/tools.js.map +1 -0
  172. package/build/services/calendar/patch.d.ts +11 -0
  173. package/build/services/calendar/patch.js +116 -0
  174. package/build/services/calendar/patch.js.map +1 -0
  175. package/build/services/drive/patch.d.ts +10 -0
  176. package/build/services/drive/patch.js +131 -0
  177. package/build/services/drive/patch.js.map +1 -0
  178. package/build/services/gmail/attachments.d.ts +19 -0
  179. package/build/services/gmail/attachments.js +90 -0
  180. package/build/services/gmail/attachments.js.map +1 -0
  181. package/build/services/gmail/patch.d.ts +10 -0
  182. package/build/services/gmail/patch.js +226 -0
  183. package/build/services/gmail/patch.js.map +1 -0
  184. package/package.json +34 -0
@@ -0,0 +1,852 @@
1
+ # Service manifest — declarative registry for the tool factory (ADR-300).
2
+ # Each entry produces one MCP tool via the generator.
3
+ # gws 0.13.3 — 6 services, 51 operations
4
+ #
5
+ # Note: People (contacts) and Meet are supported by gws but excluded here
6
+ # because gws auth login doesn't offer their required OAuth scopes.
7
+ # See https://github.com/googleworkspace/cli/issues/556
8
+ # Re-add when gws supports contacts.readonly and meetings.space.created scopes.
9
+
10
+ services:
11
+ gmail:
12
+ tool_name: manage_email
13
+ description: "Search, read, send, forward, or manage emails in a Google Workspace account. Supports Gmail search syntax."
14
+ requires_email: true
15
+ gws_service: gmail
16
+ operations:
17
+
18
+ # --- Core message operations ---
19
+
20
+ search:
21
+ type: list
22
+ description: "find emails by query"
23
+ resource: users.messages.list
24
+ params:
25
+ query:
26
+ type: string
27
+ description: 'Gmail search query (e.g. "from:alice subject:meeting has:attachment")'
28
+ maps_to: q
29
+ maxResults:
30
+ type: number
31
+ description: "Max results (default: 10, max: 50)"
32
+ default: 10
33
+ max: 50
34
+ defaults:
35
+ userId: me
36
+ hydration:
37
+ resource: users.messages.get
38
+ format: metadata
39
+ headers: [From, Subject, Date]
40
+
41
+ read:
42
+ type: detail
43
+ description: "get full email by ID"
44
+ resource: users.messages.get
45
+ params:
46
+ messageId:
47
+ type: string
48
+ description: "Email message ID"
49
+ required: true
50
+ maps_to: id
51
+ defaults:
52
+ userId: me
53
+
54
+ send:
55
+ type: action
56
+ description: "compose and send a new email"
57
+ helper: "+send"
58
+ params:
59
+ to:
60
+ type: string
61
+ description: "Recipient email(s), comma-separated"
62
+ required: true
63
+ subject:
64
+ type: string
65
+ description: "Email subject line"
66
+ required: true
67
+ body:
68
+ type: string
69
+ description: "Email body text"
70
+ required: true
71
+ cc:
72
+ type: string
73
+ description: "CC email(s), comma-separated"
74
+ bcc:
75
+ type: string
76
+ description: "BCC email(s), comma-separated"
77
+ cli_args:
78
+ to: "--to"
79
+ subject: "--subject"
80
+ body: "--body"
81
+ cc: "--cc"
82
+ bcc: "--bcc"
83
+
84
+ reply:
85
+ type: action
86
+ description: "reply to a message (thread-aware)"
87
+ helper: "+reply"
88
+ params:
89
+ messageId:
90
+ type: string
91
+ description: "Message ID to reply to"
92
+ required: true
93
+ body:
94
+ type: string
95
+ description: "Reply body text"
96
+ required: true
97
+ cli_args:
98
+ messageId: "--message-id"
99
+ body: "--body"
100
+
101
+ replyAll:
102
+ type: action
103
+ description: "reply-all to a message (thread-aware, includes all recipients)"
104
+ helper: "+reply-all"
105
+ params:
106
+ messageId:
107
+ type: string
108
+ description: "Message ID to reply to"
109
+ required: true
110
+ body:
111
+ type: string
112
+ description: "Reply body text"
113
+ required: true
114
+ cc:
115
+ type: string
116
+ description: "Additional CC email(s), comma-separated"
117
+ cli_args:
118
+ messageId: "--message-id"
119
+ body: "--body"
120
+ cc: "--cc"
121
+
122
+ forward:
123
+ type: action
124
+ description: "forward a message to new recipients"
125
+ helper: "+forward"
126
+ params:
127
+ messageId:
128
+ type: string
129
+ description: "Message ID to forward"
130
+ required: true
131
+ to:
132
+ type: string
133
+ description: "Recipient email(s), comma-separated"
134
+ required: true
135
+ body:
136
+ type: string
137
+ description: "Optional note to prepend above forwarded message"
138
+ cli_args:
139
+ messageId: "--message-id"
140
+ to: "--to"
141
+ body: "--body"
142
+
143
+ # --- Inbox management ---
144
+
145
+ triage:
146
+ type: list
147
+ description: "unread inbox summary (sender, subject, date)"
148
+ helper: "+triage"
149
+
150
+ trash:
151
+ type: action
152
+ description: "move a message to trash"
153
+ resource: users.messages.trash
154
+ params:
155
+ messageId:
156
+ type: string
157
+ description: "Message ID to trash"
158
+ required: true
159
+ maps_to: id
160
+ defaults:
161
+ userId: me
162
+
163
+ untrash:
164
+ type: action
165
+ description: "restore a message from trash"
166
+ resource: users.messages.untrash
167
+ params:
168
+ messageId:
169
+ type: string
170
+ description: "Message ID to restore"
171
+ required: true
172
+ maps_to: id
173
+ defaults:
174
+ userId: me
175
+
176
+ getAttachment:
177
+ type: detail
178
+ description: "download an email attachment to workspace directory (use read first to see attachment list)"
179
+ resource: users.messages.attachments.get
180
+ params:
181
+ messageId:
182
+ type: string
183
+ description: "Message ID containing the attachment"
184
+ required: true
185
+ filename:
186
+ type: string
187
+ description: "Filename to save as (from the read response, e.g. 'invoice_template.md')"
188
+ required: true
189
+ defaults:
190
+ userId: me
191
+
192
+ modify:
193
+ type: action
194
+ description: "add or remove labels on a message (e.g. archive, mark read/unread)"
195
+ resource: users.messages.modify
196
+ params:
197
+ messageId:
198
+ type: string
199
+ description: "Message ID to modify"
200
+ required: true
201
+ maps_to: id
202
+ addLabelIds:
203
+ type: string
204
+ description: "Comma-separated label IDs to add (e.g. STARRED, IMPORTANT, Label_123)"
205
+ removeLabelIds:
206
+ type: string
207
+ description: "Comma-separated label IDs to remove (e.g. UNREAD, INBOX to archive)"
208
+ defaults:
209
+ userId: me
210
+
211
+ # --- Labels ---
212
+
213
+ labels:
214
+ type: list
215
+ description: "list all labels in the mailbox"
216
+ resource: users.labels.list
217
+ defaults:
218
+ userId: me
219
+
220
+ # --- Threads ---
221
+
222
+ threads:
223
+ type: list
224
+ description: "list email threads by query"
225
+ resource: users.threads.list
226
+ params:
227
+ query:
228
+ type: string
229
+ description: "Gmail search query to filter threads"
230
+ maps_to: q
231
+ maxResults:
232
+ type: number
233
+ description: "Max threads to return (default: 10, max: 50)"
234
+ default: 10
235
+ max: 50
236
+ defaults:
237
+ userId: me
238
+
239
+ getThread:
240
+ type: detail
241
+ description: "get all messages in a thread"
242
+ resource: users.threads.get
243
+ params:
244
+ threadId:
245
+ type: string
246
+ description: "Thread ID to retrieve"
247
+ required: true
248
+ maps_to: id
249
+ defaults:
250
+ userId: me
251
+ format: metadata
252
+ metadataHeaders: "From,Subject,Date,To"
253
+
254
+ calendar:
255
+ tool_name: manage_calendar
256
+ description: "List events, view agenda, check availability, or manage calendar events."
257
+ requires_email: true
258
+ gws_service: calendar
259
+ operations:
260
+
261
+ # --- Event viewing ---
262
+
263
+ list:
264
+ type: list
265
+ description: "upcoming events on primary calendar"
266
+ resource: events.list
267
+ params:
268
+ timeMin:
269
+ type: string
270
+ description: "Start of range (ISO 8601) — defaults to today"
271
+ timeMax:
272
+ type: string
273
+ description: "End of range (ISO 8601)"
274
+ maxResults:
275
+ type: number
276
+ description: "Max events (default: 10, max: 50)"
277
+ default: 10
278
+ max: 50
279
+ query:
280
+ type: string
281
+ description: "Free-text search terms to filter events"
282
+ maps_to: q
283
+ defaults:
284
+ calendarId: primary
285
+ singleEvents: true
286
+ orderBy: startTime
287
+
288
+ agenda:
289
+ type: list
290
+ description: "today's schedule at a glance (all calendars)"
291
+ helper: "+agenda"
292
+
293
+ get:
294
+ type: detail
295
+ description: "full event details by ID"
296
+ resource: events.get
297
+ params:
298
+ eventId:
299
+ type: string
300
+ description: "Event ID"
301
+ required: true
302
+ defaults:
303
+ calendarId: primary
304
+
305
+ # --- Event management ---
306
+
307
+ create:
308
+ type: action
309
+ description: "create a new calendar event"
310
+ helper: "+insert"
311
+ params:
312
+ summary:
313
+ type: string
314
+ description: "Event title"
315
+ required: true
316
+ start:
317
+ type: string
318
+ description: "Start time (ISO 8601)"
319
+ required: true
320
+ end:
321
+ type: string
322
+ description: "End time (ISO 8601)"
323
+ required: true
324
+ description:
325
+ type: string
326
+ description: "Event description or notes"
327
+ location:
328
+ type: string
329
+ description: "Event location"
330
+ attendees:
331
+ type: string
332
+ description: "Comma-separated attendee emails"
333
+ cli_args:
334
+ summary: "--summary"
335
+ start: "--start"
336
+ end: "--end"
337
+ description: "--description"
338
+ location: "--location"
339
+ attendees: "--attendees"
340
+
341
+ quickAdd:
342
+ type: action
343
+ description: "create event from natural language (e.g. 'Lunch with Alice tomorrow at noon')"
344
+ resource: events.quickAdd
345
+ params:
346
+ text:
347
+ type: string
348
+ description: "Natural language event description"
349
+ required: true
350
+ defaults:
351
+ calendarId: primary
352
+
353
+ update:
354
+ type: action
355
+ description: "update an existing event (patch semantics — only changed fields needed)"
356
+ resource: events.patch
357
+ params:
358
+ eventId:
359
+ type: string
360
+ description: "Event ID to update"
361
+ required: true
362
+ summary:
363
+ type: string
364
+ description: "Updated event title"
365
+ start:
366
+ type: string
367
+ description: "Updated start time (ISO 8601)"
368
+ end:
369
+ type: string
370
+ description: "Updated end time (ISO 8601)"
371
+ description:
372
+ type: string
373
+ description: "Updated description"
374
+ location:
375
+ type: string
376
+ description: "Updated location"
377
+ defaults:
378
+ calendarId: primary
379
+
380
+ delete:
381
+ type: action
382
+ description: "delete an event"
383
+ resource: events.delete
384
+ params:
385
+ eventId:
386
+ type: string
387
+ description: "Event ID to delete"
388
+ required: true
389
+ defaults:
390
+ calendarId: primary
391
+
392
+ # --- Calendar management ---
393
+
394
+ calendars:
395
+ type: list
396
+ description: "list all calendars the user has access to"
397
+ resource: calendarList.list
398
+
399
+ freebusy:
400
+ type: detail
401
+ description: "check availability (free/busy) for a time range"
402
+ resource: freebusy.query
403
+ params:
404
+ timeMin:
405
+ type: string
406
+ description: "Start of range (ISO 8601)"
407
+ required: true
408
+ timeMax:
409
+ type: string
410
+ description: "End of range (ISO 8601)"
411
+ required: true
412
+
413
+ drive:
414
+ tool_name: manage_drive
415
+ description: "Search, upload, download, share, or manage files in Google Drive."
416
+ requires_email: true
417
+ gws_service: drive
418
+ operations:
419
+
420
+ # --- File discovery ---
421
+
422
+ search:
423
+ type: list
424
+ description: "find files by query"
425
+ resource: files.list
426
+ params:
427
+ query:
428
+ type: string
429
+ description: "Drive search query (e.g. \"name contains 'budget'\" or \"mimeType='application/pdf'\")"
430
+ maps_to: q
431
+ maxResults:
432
+ type: number
433
+ description: "Max results (default: 10, max: 50)"
434
+ default: 10
435
+ max: 50
436
+ maps_to: pageSize
437
+ defaults:
438
+ fields: "files(id, name, mimeType, modifiedTime, size, webViewLink)"
439
+
440
+ get:
441
+ type: detail
442
+ description: "get file metadata"
443
+ resource: files.get
444
+ params:
445
+ fileId:
446
+ type: string
447
+ description: "File ID"
448
+ required: true
449
+ defaults:
450
+ fields: "id, name, mimeType, modifiedTime, size, webViewLink, owners, shared, parents"
451
+
452
+ # --- File operations ---
453
+
454
+ upload:
455
+ type: action
456
+ description: "upload a local file to Drive"
457
+ helper: "+upload"
458
+ params:
459
+ filePath:
460
+ type: string
461
+ description: "Local file path to upload"
462
+ required: true
463
+ name:
464
+ type: string
465
+ description: "File name in Drive (defaults to local name)"
466
+ parentFolderId:
467
+ type: string
468
+ description: "Destination folder ID"
469
+ cli_args:
470
+ name: "--name"
471
+ parentFolderId: "--parent"
472
+
473
+ download:
474
+ type: detail
475
+ description: "download file content to local path"
476
+ resource: files.get
477
+ params:
478
+ fileId:
479
+ type: string
480
+ description: "File ID to download"
481
+ required: true
482
+ outputPath:
483
+ type: string
484
+ description: "Local path to save the file"
485
+ defaults:
486
+ alt: media
487
+
488
+ copy:
489
+ type: action
490
+ description: "create a copy of a file"
491
+ resource: files.copy
492
+ params:
493
+ fileId:
494
+ type: string
495
+ description: "File ID to copy"
496
+ required: true
497
+ name:
498
+ type: string
499
+ description: "Name for the copy"
500
+
501
+ delete:
502
+ type: action
503
+ description: "permanently delete a file (cannot be undone)"
504
+ resource: files.delete
505
+ params:
506
+ fileId:
507
+ type: string
508
+ description: "File ID to delete"
509
+ required: true
510
+
511
+ export:
512
+ type: action
513
+ description: "export a Google Workspace document (Docs, Sheets, Slides) to a file format"
514
+ resource: files.export
515
+ params:
516
+ fileId:
517
+ type: string
518
+ description: "File ID to export"
519
+ required: true
520
+ mimeType:
521
+ type: string
522
+ description: "Target format (e.g. application/pdf, text/csv, text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document)"
523
+ required: true
524
+ outputPath:
525
+ type: string
526
+ description: "Local path to save exported file"
527
+
528
+ # --- Sharing ---
529
+
530
+ listPermissions:
531
+ type: list
532
+ description: "list sharing permissions on a file"
533
+ resource: permissions.list
534
+ params:
535
+ fileId:
536
+ type: string
537
+ description: "File ID"
538
+ required: true
539
+
540
+ share:
541
+ type: action
542
+ description: "share a file with a user or group"
543
+ resource: permissions.create
544
+ params:
545
+ fileId:
546
+ type: string
547
+ description: "File ID to share"
548
+ required: true
549
+ shareEmail:
550
+ type: string
551
+ description: "Email address to share with"
552
+ required: true
553
+ role:
554
+ type: string
555
+ description: "Permission level"
556
+ enum: [reader, commenter, writer, organizer]
557
+ default: reader
558
+
559
+ unshare:
560
+ type: action
561
+ description: "remove sharing permission from a file"
562
+ resource: permissions.delete
563
+ params:
564
+ fileId:
565
+ type: string
566
+ description: "File ID"
567
+ required: true
568
+ permissionId:
569
+ type: string
570
+ description: "Permission ID to remove (from listPermissions)"
571
+ required: true
572
+
573
+ # ========================================================================
574
+ # Sheets
575
+ # ========================================================================
576
+
577
+ sheets:
578
+ tool_name: manage_sheets
579
+ description: "Read, write, and manage Google Sheets spreadsheets."
580
+ requires_email: true
581
+ gws_service: sheets
582
+ operations:
583
+
584
+ get:
585
+ type: detail
586
+ description: "get spreadsheet metadata and sheet names"
587
+ resource: spreadsheets.get
588
+ params:
589
+ spreadsheetId:
590
+ type: string
591
+ description: "Spreadsheet ID"
592
+ required: true
593
+
594
+ create:
595
+ type: action
596
+ description: "create a new empty spreadsheet"
597
+ resource: spreadsheets.create
598
+
599
+ read:
600
+ type: detail
601
+ description: "read cell values from a range"
602
+ helper: "+read"
603
+ params:
604
+ spreadsheetId:
605
+ type: string
606
+ description: "Spreadsheet ID"
607
+ required: true
608
+ range:
609
+ type: string
610
+ description: "Range to read (e.g. 'Sheet1!A1:D10' or just 'Sheet1')"
611
+ required: true
612
+ cli_args:
613
+ spreadsheetId: "--spreadsheet"
614
+ range: "--range"
615
+
616
+ append:
617
+ type: action
618
+ description: "append rows to a spreadsheet"
619
+ helper: "+append"
620
+ params:
621
+ spreadsheetId:
622
+ type: string
623
+ description: "Spreadsheet ID"
624
+ required: true
625
+ values:
626
+ type: string
627
+ description: "Comma-separated values for a single row (e.g. 'Alice,100,true')"
628
+ jsonValues:
629
+ type: string
630
+ description: "JSON array of rows for bulk insert (e.g. '[[\"a\",\"b\"],[\"c\",\"d\"]]')"
631
+ cli_args:
632
+ spreadsheetId: "--spreadsheet"
633
+ values: "--values"
634
+ jsonValues: "--json-values"
635
+
636
+ getValues:
637
+ type: detail
638
+ description: "get values from a specific range (raw API)"
639
+ resource: spreadsheets.values.get
640
+ params:
641
+ spreadsheetId:
642
+ type: string
643
+ description: "Spreadsheet ID"
644
+ required: true
645
+ range:
646
+ type: string
647
+ description: "A1 notation range (e.g. 'Sheet1!A1:B10')"
648
+ required: true
649
+
650
+ updateValues:
651
+ type: action
652
+ description: "write values to a specific range"
653
+ resource: spreadsheets.values.update
654
+ params:
655
+ spreadsheetId:
656
+ type: string
657
+ description: "Spreadsheet ID"
658
+ required: true
659
+ range:
660
+ type: string
661
+ description: "A1 notation range to write to"
662
+ required: true
663
+
664
+ # ========================================================================
665
+ # Docs
666
+ # ========================================================================
667
+
668
+ docs:
669
+ tool_name: manage_docs
670
+ description: "Read and write Google Docs documents."
671
+ requires_email: true
672
+ gws_service: docs
673
+ operations:
674
+
675
+ get:
676
+ type: detail
677
+ description: "get document content and metadata"
678
+ resource: documents.get
679
+ params:
680
+ documentId:
681
+ type: string
682
+ description: "Document ID"
683
+ required: true
684
+
685
+ create:
686
+ type: action
687
+ description: "create a new blank document"
688
+ resource: documents.create
689
+
690
+ write:
691
+ type: action
692
+ description: "append text to the end of a document"
693
+ helper: "+write"
694
+ params:
695
+ documentId:
696
+ type: string
697
+ description: "Document ID"
698
+ required: true
699
+ text:
700
+ type: string
701
+ description: "Text to append (plain text)"
702
+ required: true
703
+ cli_args:
704
+ documentId: "--document"
705
+ text: "--text"
706
+
707
+ # ========================================================================
708
+ # Tasks
709
+ # ========================================================================
710
+
711
+ tasks:
712
+ tool_name: manage_tasks
713
+ description: "Manage task lists and tasks in Google Tasks."
714
+ requires_email: true
715
+ gws_service: tasks
716
+ operations:
717
+
718
+ # --- Task lists ---
719
+
720
+ listTaskLists:
721
+ type: list
722
+ description: "list all task lists"
723
+ resource: tasklists.list
724
+
725
+ getTaskList:
726
+ type: detail
727
+ description: "get a task list by ID"
728
+ resource: tasklists.get
729
+ params:
730
+ taskListId:
731
+ type: string
732
+ description: "Task list ID"
733
+ required: true
734
+ maps_to: tasklist
735
+
736
+ createTaskList:
737
+ type: action
738
+ description: "create a new task list"
739
+ resource: tasklists.insert
740
+
741
+ deleteTaskList:
742
+ type: action
743
+ description: "delete a task list and all its tasks"
744
+ resource: tasklists.delete
745
+ params:
746
+ taskListId:
747
+ type: string
748
+ description: "Task list ID to delete"
749
+ required: true
750
+ maps_to: tasklist
751
+
752
+ # --- Tasks ---
753
+
754
+ list:
755
+ type: list
756
+ description: "list tasks in a task list"
757
+ resource: tasks.list
758
+ params:
759
+ taskListId:
760
+ type: string
761
+ description: "Task list ID (use listTaskLists to find)"
762
+ required: true
763
+ maps_to: tasklist
764
+ showCompleted:
765
+ type: boolean
766
+ description: "Include completed tasks (default: true)"
767
+ maxResults:
768
+ type: number
769
+ description: "Max tasks to return (default: 20, max: 100)"
770
+ default: 20
771
+ max: 100
772
+
773
+ get:
774
+ type: detail
775
+ description: "get a specific task"
776
+ resource: tasks.get
777
+ params:
778
+ taskListId:
779
+ type: string
780
+ description: "Task list ID"
781
+ required: true
782
+ maps_to: tasklist
783
+ taskId:
784
+ type: string
785
+ description: "Task ID"
786
+ required: true
787
+ maps_to: task
788
+
789
+ create:
790
+ type: action
791
+ description: "create a new task"
792
+ resource: tasks.insert
793
+ params:
794
+ taskListId:
795
+ type: string
796
+ description: "Task list ID"
797
+ required: true
798
+ maps_to: tasklist
799
+
800
+ update:
801
+ type: action
802
+ description: "update a task (patch semantics)"
803
+ resource: tasks.patch
804
+ params:
805
+ taskListId:
806
+ type: string
807
+ description: "Task list ID"
808
+ required: true
809
+ maps_to: tasklist
810
+ taskId:
811
+ type: string
812
+ description: "Task ID"
813
+ required: true
814
+ maps_to: task
815
+
816
+ complete:
817
+ type: action
818
+ description: "mark a task as completed"
819
+ resource: tasks.patch
820
+ params:
821
+ taskListId:
822
+ type: string
823
+ description: "Task list ID"
824
+ required: true
825
+ maps_to: tasklist
826
+ taskId:
827
+ type: string
828
+ description: "Task ID"
829
+ required: true
830
+ maps_to: task
831
+ defaults:
832
+ status: completed
833
+
834
+ delete:
835
+ type: action
836
+ description: "delete a task"
837
+ resource: tasks.delete
838
+ params:
839
+ taskListId:
840
+ type: string
841
+ description: "Task list ID"
842
+ required: true
843
+ maps_to: tasklist
844
+ taskId:
845
+ type: string
846
+ description: "Task ID to delete"
847
+ required: true
848
+ maps_to: task
849
+
850
+ # People (contacts) and Meet are excluded pending gws auth scope support.
851
+ # See https://github.com/googleworkspace/cli/issues/556
852
+ # Manifest entries ready at git tag pre-contacts-meet-removal if needed.