@aaronsb/google-workspace-mcp 4.2.0 → 4.3.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.
Files changed (47) hide show
  1. package/README.md +6 -5
  2. package/build/accounts/auth.d.ts +18 -2
  3. package/build/accounts/auth.js +31 -7
  4. package/build/accounts/auth.js.map +1 -1
  5. package/build/accounts/credentials.d.ts +20 -0
  6. package/build/accounts/credentials.js.map +1 -1
  7. package/build/accounts/oauth.d.ts +51 -1
  8. package/build/accounts/oauth.js +69 -5
  9. package/build/accounts/oauth.js.map +1 -1
  10. package/build/accounts/registry.d.ts +2 -1
  11. package/build/accounts/registry.js +2 -2
  12. package/build/accounts/registry.js.map +1 -1
  13. package/build/factory/manifest/calendar.yaml +22 -22
  14. package/build/factory/manifest/contacts.yaml +247 -0
  15. package/build/factory/manifest/drive.yaml +16 -16
  16. package/build/factory/manifest/gmail.yaml +18 -18
  17. package/build/factory/manifest/meet.yaml +91 -13
  18. package/build/factory/manifest/sheets.yaml +29 -29
  19. package/build/factory/manifest/tasks.yaml +14 -14
  20. package/build/factory/patches.js +2 -0
  21. package/build/factory/patches.js.map +1 -1
  22. package/build/factory/safety.js +4 -0
  23. package/build/factory/safety.js.map +1 -1
  24. package/build/google/descriptor.d.ts +8 -0
  25. package/build/google/descriptor.js +9 -2
  26. package/build/google/descriptor.js.map +1 -1
  27. package/build/google/descriptor.json +1883 -0
  28. package/build/google/methods.d.ts +4 -1
  29. package/build/server/handler.js +16 -1
  30. package/build/server/handler.js.map +1 -1
  31. package/build/server/handlers/accounts.js +100 -6
  32. package/build/server/handlers/accounts.js.map +1 -1
  33. package/build/server/queue.d.ts +1 -1
  34. package/build/server/queue.js +16 -1
  35. package/build/server/queue.js.map +1 -1
  36. package/build/server/tools.js +31 -1
  37. package/build/server/tools.js.map +1 -1
  38. package/build/services/calendar/patch.js +62 -8
  39. package/build/services/calendar/patch.js.map +1 -1
  40. package/build/services/contacts/patch.d.ts +31 -0
  41. package/build/services/contacts/patch.js +496 -0
  42. package/build/services/contacts/patch.js.map +1 -0
  43. package/build/services/meet/patch.js +202 -0
  44. package/build/services/meet/patch.js.map +1 -1
  45. package/build/version.d.ts +1 -1
  46. package/build/version.js +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,247 @@
1
+ tool_name: manage_contacts
2
+ description: "Search, read, create, update and delete Google Contacts: your saved contacts, the addresses you have corresponded with but never saved, and your organization's directory."
3
+ requires_email: true
4
+ google_service: people
5
+
6
+ # The People API asks the caller to name every field it wants back, on every call, via
7
+ # `personFields` or `readMask`. Omit the mask and the call is REJECTED outright — this is
8
+ # not a shape that degrades to a sensible default.
9
+ #
10
+ # Those masks live in `defaults` rather than `params` so they never enter the generated
11
+ # schema. An agent asking "who is Dana" should not first have to know that a birthday is
12
+ # spelled `birthdays` and lives behind a different parameter name depending on which of
13
+ # the seven operations it picked. The masks also differ per operation because Google
14
+ # restricts them per operation, which is exactly the routing this tool exists to absorb.
15
+ #
16
+ # `sources` is left out of the schema for a sharper reason: its legal values are NOT the
17
+ # same across operations. The contact operations take READ_SOURCE_TYPE_*, the directory
18
+ # operations take DIRECTORY_SOURCE_TYPE_*, and generateSchema keeps only the FIRST
19
+ # declaration of a param name — so a single advertised `sources` enum would be wrong for
20
+ # whichever half lost the race.
21
+ operations:
22
+
23
+ # --- Your own contacts ---
24
+
25
+ list:
26
+ type: list
27
+ description: "list your saved contacts"
28
+ resource: people.connections.list
29
+ params:
30
+ maxResults:
31
+ type: number
32
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
33
+ default: 25
34
+ max: 100
35
+ maps_to: pageSize
36
+ pageToken:
37
+ type: string
38
+ description: "Continue from where a previous page stopped — pass the token that response printed"
39
+ sortOrder:
40
+ type: string
41
+ description: "Order for `list` — by first name, by last name, or most recently changed first"
42
+ enum: [firstName, lastName, lastModified]
43
+ defaults:
44
+ # connections.list reads one person's connections, and the person is always the
45
+ # authenticated account. `people/me` is Google's alias for it, so the agent never
46
+ # has to know its own resource name.
47
+ resourceName: people/me
48
+ personFields: names,emailAddresses,phoneNumbers,organizations,metadata
49
+ sortOrder: firstName
50
+
51
+ search:
52
+ type: list
53
+ description: "search your saved contacts by name, email, nickname or phone"
54
+ resource: people.searchContacts
55
+ params:
56
+ query:
57
+ type: string
58
+ description: "Text to match against names, email addresses, nicknames and phone numbers. Matching is by PREFIX: `ann` finds Anna, `nna` finds nobody."
59
+ required: true
60
+ maxResults:
61
+ type: number
62
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
63
+ default: 25
64
+ max: 30
65
+ maps_to: pageSize
66
+ defaults:
67
+ readMask: names,emailAddresses,phoneNumbers,organizations,metadata
68
+
69
+ get:
70
+ type: detail
71
+ description: "get one person in full — addresses, birthday, notes, relations"
72
+ resource: people.get
73
+ params:
74
+ contactId:
75
+ type: string
76
+ description: "Person id as `list` or `search` printed it (e.g. `people/c1234567890`). A bare id without the `people/` prefix is accepted."
77
+ required: true
78
+ maps_to: resourceName
79
+ defaults:
80
+ personFields: names,nicknames,emailAddresses,phoneNumbers,addresses,organizations,birthdays,biographies,urls,relations,memberships,photos,metadata
81
+
82
+ # The Person body is built by the patch, not declared here. Every field the People API
83
+ # wants is a parallel array of objects — `names: [{givenName, familyName}]` — and any
84
+ # param this manifest declares that Google does not recognise as a query parameter goes
85
+ # into the request body VERBATIM. Declared flat, `name: "Ada Lovelace"` would be sent as
86
+ # a top-level `name` field, which Google ignores, producing a contact with no name and
87
+ # no error. So these are declared for the SCHEMA and converted before the call.
88
+ create:
89
+ type: action
90
+ description: "create a new contact"
91
+ resource: people.createContact
92
+ params:
93
+ name:
94
+ type: string
95
+ description: "Full name, e.g. `Ada Lovelace`. Split into given and family name on the way in; a single word becomes the given name."
96
+ contactEmail:
97
+ type: string
98
+ description: "The contact's email address. (`email` is the account making the call, not the person being saved.) On `update` this REPLACES every address the contact has — pass an empty string to clear them."
99
+ phone:
100
+ type: string
101
+ description: "Phone number, in whatever form you have it — Google normalizes it. On `update` this REPLACES every number the contact has — pass an empty string to clear them."
102
+ company:
103
+ type: string
104
+ description: "Organization name"
105
+ jobTitle:
106
+ type: string
107
+ description: "Job title within the organization"
108
+ notes:
109
+ type: string
110
+ description: "Free-text note stored on the contact"
111
+ defaults:
112
+ # Echoes back EVERY field this operation can write. Live, the shorter read mask
113
+ # confirmed a create without the note it had just stored — a confirmation that
114
+ # drops a field the caller supplied is indistinguishable from one that dropped it
115
+ # on the way in.
116
+ personFields: names,emailAddresses,phoneNumbers,organizations,biographies,metadata
117
+
118
+ # updatePersonFields is not sent from here — the patch derives it from which fields the
119
+ # caller actually supplied. A fixed list would name fields nobody touched, and naming a
120
+ # field in updatePersonFields with no value in the body CLEARS it. Declared statically,
121
+ # this operation would wipe a contact's phone number every time someone corrected a
122
+ # job title.
123
+ update:
124
+ type: action
125
+ description: "change an existing contact (only the fields you pass; pass an empty string to clear one)"
126
+ resource: people.updateContact
127
+ params:
128
+ contactId:
129
+ type: string
130
+ description: "Person id as `list` or `search` printed it (e.g. `people/c1234567890`). A bare id without the `people/` prefix is accepted."
131
+ required: true
132
+ maps_to: resourceName
133
+ name:
134
+ type: string
135
+ description: "Full name, e.g. `Ada Lovelace`. Split into given and family name on the way in; a single word becomes the given name."
136
+ contactEmail:
137
+ type: string
138
+ description: "The contact's email address. (`email` is the account making the call, not the person being saved.) On `update` this REPLACES every address the contact has — pass an empty string to clear them."
139
+ phone:
140
+ type: string
141
+ description: "Phone number, in whatever form you have it — Google normalizes it. On `update` this REPLACES every number the contact has — pass an empty string to clear them."
142
+ company:
143
+ type: string
144
+ description: "Organization name"
145
+ jobTitle:
146
+ type: string
147
+ description: "Job title within the organization"
148
+ notes:
149
+ type: string
150
+ description: "Free-text note stored on the contact"
151
+ defaults:
152
+ personFields: names,emailAddresses,phoneNumbers,organizations,biographies,metadata
153
+
154
+ delete:
155
+ type: action
156
+ description: "delete a contact"
157
+ resource: people.deleteContact
158
+ params:
159
+ contactId:
160
+ type: string
161
+ description: "Person id as `list` or `search` printed it (e.g. `people/c1234567890`). A bare id without the `people/` prefix is accepted."
162
+ required: true
163
+ maps_to: resourceName
164
+
165
+ # --- Other contacts: addresses seen in mail, never saved ---
166
+
167
+ listOther:
168
+ type: list
169
+ description: "list 'other contacts' — addresses you have corresponded with but never saved"
170
+ resource: otherContacts.list
171
+ params:
172
+ maxResults:
173
+ type: number
174
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
175
+ default: 25
176
+ max: 100
177
+ maps_to: pageSize
178
+ pageToken:
179
+ type: string
180
+ description: "Continue from where a previous page stopped — pass the token that response printed"
181
+ defaults:
182
+ # otherContacts accepts a narrower mask than the contact operations do; asking it
183
+ # for organizations is an error, not an empty field.
184
+ readMask: names,emailAddresses,phoneNumbers,metadata
185
+
186
+ searchOther:
187
+ type: list
188
+ description: "search 'other contacts' by name or email"
189
+ resource: otherContacts.search
190
+ params:
191
+ query:
192
+ type: string
193
+ description: "Text to match against names, email addresses, nicknames and phone numbers. Matching is by PREFIX: `ann` finds Anna, `nna` finds nobody."
194
+ required: true
195
+ maxResults:
196
+ type: number
197
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
198
+ default: 25
199
+ max: 30
200
+ maps_to: pageSize
201
+ defaults:
202
+ readMask: names,emailAddresses,phoneNumbers,metadata
203
+
204
+ # --- The organization directory (Google Workspace accounts only) ---
205
+
206
+ listDirectory:
207
+ type: list
208
+ description: "list people in your organization's directory (Workspace accounts only)"
209
+ resource: people.listDirectoryPeople
210
+ params:
211
+ maxResults:
212
+ type: number
213
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
214
+ default: 25
215
+ max: 100
216
+ maps_to: pageSize
217
+ pageToken:
218
+ type: string
219
+ description: "Continue from where a previous page stopped — pass the token that response printed"
220
+ defaults:
221
+ readMask: names,emailAddresses,phoneNumbers,organizations,metadata
222
+ # `sources` is REQUIRED here — the directory operations reject a call that does not
223
+ # say which directory to read. Both value sets are wanted: DOMAIN_PROFILE is the
224
+ # people with accounts, DOMAIN_CONTACT the shared contacts an admin published.
225
+ sources: DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE,DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT
226
+
227
+ searchDirectory:
228
+ type: list
229
+ description: "search your organization's directory by name or email (Workspace accounts only)"
230
+ resource: people.searchDirectoryPeople
231
+ params:
232
+ query:
233
+ type: string
234
+ description: "Text to match against names, email addresses, nicknames and phone numbers. Matching is by PREFIX: `ann` finds Anna, `nna` finds nobody."
235
+ required: true
236
+ maxResults:
237
+ type: number
238
+ description: "Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else."
239
+ default: 25
240
+ max: 100
241
+ maps_to: pageSize
242
+ pageToken:
243
+ type: string
244
+ description: "Continue from where a previous page stopped — pass the token that response printed"
245
+ defaults:
246
+ readMask: names,emailAddresses,phoneNumbers,organizations,metadata
247
+ sources: DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE,DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT
@@ -51,10 +51,10 @@ operations:
51
51
  required: true
52
52
  name:
53
53
  type: string
54
- description: "File name in Drive (defaults to local name)"
54
+ description: "File name in Drive. On `upload`, defaults to the local file's name. On `copy`, the name for the copy — without it Drive names it 'Copy of <original>'. On `update`, the new name (a rename)."
55
55
  parentFolderId:
56
56
  type: string
57
- description: "Destination folder ID"
57
+ description: "Destination folder ID. On `copy`, defaults to the source file's folder."
58
58
 
59
59
  viewImage:
60
60
  type: detail
@@ -63,7 +63,7 @@ operations:
63
63
  params:
64
64
  fileId:
65
65
  type: string
66
- description: "File ID of the image to view"
66
+ description: "File ID"
67
67
  required: true
68
68
  defaults:
69
69
  supportsAllDrives: true
@@ -75,7 +75,7 @@ operations:
75
75
  params:
76
76
  fileId:
77
77
  type: string
78
- description: "File ID to download"
78
+ description: "File ID"
79
79
  required: true
80
80
  outputPath:
81
81
  type: string
@@ -91,14 +91,14 @@ operations:
91
91
  params:
92
92
  fileId:
93
93
  type: string
94
- description: "File ID to copy"
94
+ description: "File ID"
95
95
  required: true
96
96
  name:
97
97
  type: string
98
- description: "Name for the copy (without it, Drive names it 'Copy of <original>')"
98
+ description: "File name in Drive. On `upload`, defaults to the local file's name. On `copy`, the name for the copy — without it Drive names it 'Copy of <original>'. On `update`, the new name (a rename)."
99
99
  parentFolderId:
100
100
  type: string
101
- description: "Folder ID to place the copy in (defaults to the source's folder)"
101
+ description: "Destination folder ID. On `copy`, defaults to the source file's folder."
102
102
  defaults:
103
103
  supportsAllDrives: true
104
104
 
@@ -109,11 +109,11 @@ operations:
109
109
  params:
110
110
  fileId:
111
111
  type: string
112
- description: "File ID to update"
112
+ description: "File ID"
113
113
  required: true
114
114
  name:
115
115
  type: string
116
- description: "New file name (rename)"
116
+ description: "File name in Drive. On `upload`, defaults to the local file's name. On `copy`, the name for the copy — without it Drive names it 'Copy of <original>'. On `update`, the new name (a rename)."
117
117
  addParents:
118
118
  type: string
119
119
  description: "Comma-separated folder ID(s) to add as parents (move into a folder)"
@@ -130,7 +130,7 @@ operations:
130
130
  params:
131
131
  fileId:
132
132
  type: string
133
- description: "File ID to delete"
133
+ description: "File ID"
134
134
  required: true
135
135
  defaults:
136
136
  supportsAllDrives: true
@@ -142,7 +142,7 @@ operations:
142
142
  params:
143
143
  fileId:
144
144
  type: string
145
- description: "File ID to export"
145
+ description: "File ID"
146
146
  required: true
147
147
  mimeType:
148
148
  type: string
@@ -150,7 +150,7 @@ operations:
150
150
  required: true
151
151
  outputPath:
152
152
  type: string
153
- description: "Local path to save exported file"
153
+ description: "Local path to save the file"
154
154
  defaults:
155
155
  supportsAllDrives: true
156
156
 
@@ -175,7 +175,7 @@ operations:
175
175
  params:
176
176
  fileId:
177
177
  type: string
178
- description: "File ID to share"
178
+ description: "File ID"
179
179
  required: true
180
180
  shareEmail:
181
181
  type: string
@@ -258,7 +258,7 @@ operations:
258
258
  required: true
259
259
  content:
260
260
  type: string
261
- description: "Comment text"
261
+ description: "Comment text. On `replyToComment`, the reply text."
262
262
  required: true
263
263
  quotedText:
264
264
  type: string
@@ -299,11 +299,11 @@ operations:
299
299
  required: true
300
300
  commentId:
301
301
  type: string
302
- description: "Comment ID to reply to"
302
+ description: "Comment ID"
303
303
  required: true
304
304
  content:
305
305
  type: string
306
- description: "Reply text"
306
+ description: "Comment text. On `replyToComment`, the reply text."
307
307
  required: true
308
308
  defaults:
309
309
  fields: "id, content, htmlContent, author(displayName), createdTime"
@@ -60,14 +60,14 @@ operations:
60
60
  required: true
61
61
  body:
62
62
  type: string
63
- description: "Email body text"
63
+ description: "Email body text. On `forward`, an optional note prepended ABOVE the forwarded message."
64
64
  required: true
65
65
  from:
66
66
  type: string
67
67
  description: "Sender email or RFC 2822 mailbox for a verified Gmail Send As alias"
68
68
  cc:
69
69
  type: string
70
- description: "CC email(s), comma-separated"
70
+ description: "CC email(s), comma-separated. On `replyAll` these are ADDITIONAL — they do not replace the recipients already on the thread."
71
71
  bcc:
72
72
  type: string
73
73
  description: "BCC email(s), comma-separated"
@@ -87,11 +87,11 @@ operations:
87
87
  params:
88
88
  messageId:
89
89
  type: string
90
- description: "Message ID to reply to"
90
+ description: "Email message ID"
91
91
  required: true
92
92
  body:
93
93
  type: string
94
- description: "Reply body text"
94
+ description: "Email body text. On `forward`, an optional note prepended ABOVE the forwarded message."
95
95
  required: true
96
96
  attachments:
97
97
  type: string
@@ -109,15 +109,15 @@ operations:
109
109
  params:
110
110
  messageId:
111
111
  type: string
112
- description: "Message ID to reply to"
112
+ description: "Email message ID"
113
113
  required: true
114
114
  body:
115
115
  type: string
116
- description: "Reply body text"
116
+ description: "Email body text. On `forward`, an optional note prepended ABOVE the forwarded message."
117
117
  required: true
118
118
  cc:
119
119
  type: string
120
- description: "Additional CC email(s), comma-separated"
120
+ description: "CC email(s), comma-separated. On `replyAll` these are ADDITIONAL — they do not replace the recipients already on the thread."
121
121
  attachments:
122
122
  type: string
123
123
  description: "Workspace filenames to attach, comma-separated (files must exist in workspace via manage_workspace). Creates draft when present."
@@ -134,7 +134,7 @@ operations:
134
134
  params:
135
135
  messageId:
136
136
  type: string
137
- description: "Message ID to forward"
137
+ description: "Email message ID"
138
138
  required: true
139
139
  to:
140
140
  type: string
@@ -142,7 +142,7 @@ operations:
142
142
  required: true
143
143
  body:
144
144
  type: string
145
- description: "Optional note to prepend above forwarded message"
145
+ description: "Email body text. On `forward`, an optional note prepended ABOVE the forwarded message."
146
146
 
147
147
  # --- Inbox management ---
148
148
 
@@ -165,7 +165,7 @@ operations:
165
165
  params:
166
166
  messageId:
167
167
  type: string
168
- description: "Message ID to trash"
168
+ description: "Email message ID"
169
169
  required: true
170
170
  maps_to: id
171
171
  defaults:
@@ -178,7 +178,7 @@ operations:
178
178
  params:
179
179
  messageId:
180
180
  type: string
181
- description: "Message ID to restore"
181
+ description: "Email message ID"
182
182
  required: true
183
183
  maps_to: id
184
184
  defaults:
@@ -191,11 +191,11 @@ operations:
191
191
  params:
192
192
  messageId:
193
193
  type: string
194
- description: "Message ID containing the attachment"
194
+ description: "Email message ID"
195
195
  required: true
196
196
  filename:
197
197
  type: string
198
- description: "Filename to save as (from the read response, e.g. 'invoice_template.md')"
198
+ description: "Attachment filename, exactly as it appears in the `read` response (e.g. 'invoice_template.md')"
199
199
  required: true
200
200
  defaults:
201
201
  userId: me
@@ -207,11 +207,11 @@ operations:
207
207
  params:
208
208
  messageId:
209
209
  type: string
210
- description: "Message ID containing the attachment"
210
+ description: "Email message ID"
211
211
  required: true
212
212
  filename:
213
213
  type: string
214
- description: "Image filename from the read response"
214
+ description: "Attachment filename, exactly as it appears in the `read` response (e.g. 'invoice_template.md')"
215
215
  required: true
216
216
  defaults:
217
217
  userId: me
@@ -223,7 +223,7 @@ operations:
223
223
  params:
224
224
  messageId:
225
225
  type: string
226
- description: "Message ID to modify"
226
+ description: "Email message ID"
227
227
  required: true
228
228
  maps_to: id
229
229
  addLabelIds:
@@ -253,11 +253,11 @@ operations:
253
253
  params:
254
254
  query:
255
255
  type: string
256
- description: "Gmail search query to filter threads"
256
+ description: "Gmail search query (e.g. \"from:alice subject:meeting has:attachment\")"
257
257
  maps_to: q
258
258
  maxResults:
259
259
  type: number
260
- description: "Max threads to return (default: 10, max: 50)"
260
+ description: "Max results (default: 10, max: 50)"
261
261
  default: 10
262
262
  max: 50
263
263
  defaults:
@@ -13,10 +13,10 @@ operations:
13
13
  params:
14
14
  filter:
15
15
  type: string
16
- description: "EBNF filter (e.g. 'space.meeting_code = \"abc-mnop-xyz\"' or 'start_time>=\"2026-01-01T00:00:00Z\"')"
16
+ description: "EBNF filter. On `listConferences`, e.g. 'space.meeting_code = \"abc-mnop-xyz\"' or 'start_time>=\"2026-01-01T00:00:00Z\"'. On `listParticipants`, e.g. 'latest_end_time IS NULL' for active participants."
17
17
  maxResults:
18
18
  type: number
19
- description: "Max conferences to return (default: 25, max: 100)"
19
+ description: "Max results per page, as default/ceiling. Differs by operation: `listConferences` 25/100, `listParticipants` 100/250, `listTranscriptEntries` 100/100. (Google's own default for transcript entries is 10; this tool raises it.)"
20
20
  default: 25
21
21
  max: 100
22
22
  maps_to: pageSize
@@ -28,7 +28,7 @@ operations:
28
28
  params:
29
29
  conferenceId:
30
30
  type: string
31
- description: "Conference record ID (from listConferences)"
31
+ description: "Conference record ID (from `listConferences`)"
32
32
  required: true
33
33
  maps_to: name
34
34
 
@@ -41,15 +41,15 @@ operations:
41
41
  params:
42
42
  conferenceId:
43
43
  type: string
44
- description: "Conference record ID"
44
+ description: "Conference record ID (from `listConferences`)"
45
45
  required: true
46
46
  maps_to: parent
47
47
  filter:
48
48
  type: string
49
- description: "Filter (e.g. 'latest_end_time IS NULL' for active participants)"
49
+ description: "EBNF filter. On `listConferences`, e.g. 'space.meeting_code = \"abc-mnop-xyz\"' or 'start_time>=\"2026-01-01T00:00:00Z\"'. On `listParticipants`, e.g. 'latest_end_time IS NULL' for active participants."
50
50
  maxResults:
51
51
  type: number
52
- description: "Max participants (default: 100, max: 250)"
52
+ description: "Max results per page, as default/ceiling. Differs by operation: `listConferences` 25/100, `listParticipants` 100/250, `listTranscriptEntries` 100/100. (Google's own default for transcript entries is 10; this tool raises it.)"
53
53
  default: 100
54
54
  max: 250
55
55
  maps_to: pageSize
@@ -63,7 +63,7 @@ operations:
63
63
  params:
64
64
  conferenceId:
65
65
  type: string
66
- description: "Conference record ID"
66
+ description: "Conference record ID (from `listConferences`)"
67
67
  required: true
68
68
  maps_to: parent
69
69
 
@@ -74,7 +74,7 @@ operations:
74
74
  params:
75
75
  transcriptName:
76
76
  type: string
77
- description: "Transcript resource name (from listTranscripts)"
77
+ description: "Transcript resource name (from `listTranscripts`, e.g. conferenceRecords/.../transcripts/...)"
78
78
  required: true
79
79
  maps_to: name
80
80
 
@@ -85,12 +85,12 @@ operations:
85
85
  params:
86
86
  transcriptName:
87
87
  type: string
88
- description: "Transcript resource name (e.g. conferenceRecords/.../transcripts/...)"
88
+ description: "Transcript resource name (from `listTranscripts`, e.g. conferenceRecords/.../transcripts/...)"
89
89
  required: true
90
90
  maps_to: parent
91
91
  maxResults:
92
92
  type: number
93
- description: "Max entries per page (default: 10, max: 100)"
93
+ description: "Max results per page, as default/ceiling. Differs by operation: `listConferences` 25/100, `listParticipants` 100/250, `listTranscriptEntries` 100/100. (Google's own default for transcript entries is 10; this tool raises it.)"
94
94
  default: 100
95
95
  max: 100
96
96
  maps_to: pageSize
@@ -104,7 +104,7 @@ operations:
104
104
  params:
105
105
  conferenceId:
106
106
  type: string
107
- description: "Conference record ID"
107
+ description: "Conference record ID (from `listConferences`)"
108
108
  required: true
109
109
  maps_to: parent
110
110
 
@@ -128,7 +128,7 @@ operations:
128
128
  params:
129
129
  conferenceId:
130
130
  type: string
131
- description: "Conference record ID (from listConferences)"
131
+ description: "Conference record ID (from `listConferences`)"
132
132
  required: true
133
133
  pageToken:
134
134
  type: string
@@ -143,7 +143,7 @@ operations:
143
143
  params:
144
144
  conferenceId:
145
145
  type: string
146
- description: "Conference record ID"
146
+ description: "Conference record ID (from `listConferences`)"
147
147
  required: true
148
148
  maps_to: parent
149
149
 
@@ -157,3 +157,81 @@ operations:
157
157
  description: "Smart note resource name (from listSmartNotes)"
158
158
  required: true
159
159
  maps_to: name
160
+
161
+ # --- Meeting spaces ---
162
+ #
163
+ # A space is a standalone meeting link, not attached to a calendar event. For a link on
164
+ # an event, use `manage_calendar` with `meet: true` — that goes through Calendar and
165
+ # keeps the two together.
166
+ #
167
+ # `createSpace` is the first manage_meet operation that WRITES. Everything above reads
168
+ # conference records, which `meetings.space.readonly` covers on its own; creating a
169
+ # space needs `meetings.space.created`, which a read-only account does not hold
170
+ # (ADR-202). Both handlers are custom: spaces.create declares no parameters at all, so
171
+ # everything travels in the body, and the response nests the joinable URL.
172
+
173
+ createSpace:
174
+ type: action
175
+ description: "create a standalone Google Meet link (not attached to a calendar event)"
176
+ resource: spaces.create
177
+ params:
178
+ accessType:
179
+ type: string
180
+ enum: ["OPEN", "TRUSTED", "RESTRICTED"]
181
+ description: "Who can join without knocking. OPEN: anyone with the link. TRUSTED (default): people in your organization, plus invited guests. RESTRICTED: invited guests only."
182
+ moderation:
183
+ type: boolean
184
+ description: "Turn on host controls — the host admits guests and manages who can present or chat."
185
+
186
+ activeConferences:
187
+ type: list
188
+ description: "list conferences happening RIGHT NOW across your meetings"
189
+ resource: conferenceRecords.list
190
+ params:
191
+ maxResults:
192
+ type: number
193
+ description: "Max results per page, as default/ceiling. Differs by operation: `listConferences` 25/100, `listParticipants` 100/250, `listTranscriptEntries` 100/100. (Google's own default for transcript entries is 10; this tool raises it.)"
194
+ default: 25
195
+ max: 100
196
+
197
+ getSpace:
198
+ type: detail
199
+ description: "look up a meeting space by its meeting code or resource name"
200
+ resource: spaces.get
201
+ params:
202
+ space:
203
+ type: string
204
+ description: "Meeting code (the abc-mnop-xyz part of a Meet link) or a full spaces/... resource name"
205
+ required: true
206
+ maps_to: name
207
+
208
+ updateSpace:
209
+ type: action
210
+ description: "change who can join a meeting space, or turn host controls on or off"
211
+ resource: spaces.patch
212
+ params:
213
+ space:
214
+ type: string
215
+ description: "Meeting code (the abc-mnop-xyz part of a Meet link) or a full spaces/... resource name"
216
+ required: true
217
+ maps_to: name
218
+ accessType:
219
+ type: string
220
+ enum: ["OPEN", "TRUSTED", "RESTRICTED"]
221
+ description: "Who can join without knocking. OPEN: anyone with the link. TRUSTED (default): people in your organization, plus invited guests. RESTRICTED: invited guests only."
222
+ moderation:
223
+ type: boolean
224
+ description: "Turn on host controls — the host admits guests and manages who can present or chat."
225
+
226
+ # Ends the meeting for EVERYONE currently in it. There is no undo and no warning to
227
+ # participants; the call returns an empty body whether or not anyone was in the room.
228
+ endActiveConference:
229
+ type: action
230
+ description: "end the call happening in a space right now, disconnecting everyone in it"
231
+ resource: spaces.endActiveConference
232
+ params:
233
+ space:
234
+ type: string
235
+ description: "Meeting code (the abc-mnop-xyz part of a Meet link) or a full spaces/... resource name"
236
+ required: true
237
+ maps_to: name