mcp-google-multi 6.0.0-alpha.2 → 6.0.0-alpha.21

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 (60) hide show
  1. package/README.md +5 -3
  2. package/dist/api-probe.d.ts +18 -0
  3. package/dist/api-probe.js +68 -0
  4. package/dist/arg-normalize.d.ts +19 -0
  5. package/dist/arg-normalize.js +90 -0
  6. package/dist/auth.js +15 -72
  7. package/dist/client.js +3 -1
  8. package/dist/discover.js +35 -14
  9. package/dist/discovery-client.d.ts +8 -1
  10. package/dist/discovery-client.js +67 -15
  11. package/dist/doctor.d.ts +12 -0
  12. package/dist/doctor.js +98 -15
  13. package/dist/http-transport.d.ts +3 -0
  14. package/dist/http-transport.js +2 -1
  15. package/dist/index.js +4 -1
  16. package/dist/oauth-consent.d.ts +25 -10
  17. package/dist/oauth-consent.js +85 -39
  18. package/dist/registry.d.ts +12 -0
  19. package/dist/registry.js +61 -3
  20. package/dist/scope-catalog.d.ts +1 -0
  21. package/dist/scope-catalog.js +17 -1
  22. package/dist/services.js +3 -1
  23. package/dist/tools/_errors.js +69 -5
  24. package/dist/tools/_local-files.d.ts +3 -0
  25. package/dist/tools/_local-files.js +34 -0
  26. package/dist/tools/account-wizard.d.ts +10 -0
  27. package/dist/tools/account-wizard.js +52 -19
  28. package/dist/tools/analytics.d.ts +18 -0
  29. package/dist/tools/analytics.js +279 -0
  30. package/dist/tools/drive.d.ts +2 -1
  31. package/dist/tools/drive.js +75 -33
  32. package/dist/tools/generated/_shared.d.ts +6 -0
  33. package/dist/tools/generated/_shared.js +11 -1
  34. package/dist/tools/generated/admin.js +160 -29
  35. package/dist/tools/generated/analytics.d.ts +2 -0
  36. package/dist/tools/generated/analytics.js +981 -0
  37. package/dist/tools/generated/chat.js +39 -12
  38. package/dist/tools/generated/classroom.js +56 -14
  39. package/dist/tools/generated/cloudidentity.js +18 -10
  40. package/dist/tools/generated/cloudsearch.js +4 -3
  41. package/dist/tools/generated/contacts.js +13 -4
  42. package/dist/tools/generated/drive.js +15 -6
  43. package/dist/tools/generated/drivelabels.js +33 -5
  44. package/dist/tools/generated/forms.js +1 -1
  45. package/dist/tools/generated/gmail.js +39 -12
  46. package/dist/tools/generated/index.js +2 -0
  47. package/dist/tools/generated/keep.js +3 -2
  48. package/dist/tools/generated/licensing.js +20 -4
  49. package/dist/tools/generated/meet.js +1 -1
  50. package/dist/tools/generated/reseller.js +8 -2
  51. package/dist/tools/generated/script.js +13 -3
  52. package/dist/tools/generated/searchconsole.js +4 -2
  53. package/dist/tools/generated/sheets.js +2 -1
  54. package/dist/tools/generated/tasks.js +7 -1
  55. package/dist/tools/generated/vault.js +18 -9
  56. package/dist/tools/generated/workspaceevents.js +3 -2
  57. package/dist/tools/gmail.js +3 -3
  58. package/dist/tools/google-api.d.ts +4 -1
  59. package/dist/tools/google-api.js +59 -15
  60. package/package.json +22 -17
@@ -15,7 +15,7 @@ export function registerCloudsearchGeneratedTools(registry) {
15
15
  ];
16
16
  registerGeneratedTool(registry, {
17
17
  name: "cloudsearch_debug_datasources_items_check_access",
18
- cud: "create",
18
+ cud: "read",
19
19
  description: "Checks whether an item is accessible by specified principal. Principal must be a user; groups and domain values aren't supported. **Note:** This API requires an",
20
20
  method: { id: "cloudsearch.debug.datasources.items.checkAccess", httpMethod: "POST", path: "v1/debug/{+name}:checkAccess", baseUrl: "https://cloudsearch.googleapis.com/", requiredParams: ["name"], scopes: S_cloudsearch_v1[0] },
21
21
  params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "debugOptions.enableDebugging", "api": "debugOptions.enableDebugging", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
@@ -276,9 +276,9 @@ export function registerCloudsearchGeneratedTools(registry) {
276
276
  method: { id: "cloudsearch.initializeCustomer", httpMethod: "POST", path: "v1:initializeCustomer", baseUrl: "https://cloudsearch.googleapis.com/", requiredParams: [], scopes: S_cloudsearch_v1[1] },
277
277
  params: [{ "field": "fields", "api": "fields", "location": "query" }],
278
278
  hasBody: true,
279
+ bodyParams: [],
279
280
  shape: {
280
281
  account: accountField(),
281
- body: coerceJson(z.record(z.string(), z.unknown())).describe("InitializeCustomerRequest JSON request body."),
282
282
  fields: z.string().optional().describe('Response field mask.'),
283
283
  },
284
284
  });
@@ -289,10 +289,11 @@ export function registerCloudsearchGeneratedTools(registry) {
289
289
  method: { id: "cloudsearch.media.upload", httpMethod: "POST", path: "v1/media/{+resourceName}", baseUrl: "https://cloudsearch.googleapis.com/", requiredParams: ["resourceName"], scopes: S_cloudsearch_v1[2] },
290
290
  params: [{ "field": "resourceName", "api": "resourceName", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
291
291
  hasBody: true,
292
+ bodyParams: [{ "field": "resourceName_", "api": "resourceName" }],
292
293
  shape: {
293
294
  account: accountField(),
294
295
  resourceName: z.string().describe("Name of the media that is being downloaded. See ReadRequest.resource_name."),
295
- body: coerceJson(z.record(z.string(), z.unknown())).describe("Media JSON request body. Top-level fields: resourceName."),
296
+ resourceName_: z.string().describe("Name of the media resource.").optional(),
296
297
  fields: z.string().optional().describe('Response field mask.'),
297
298
  },
298
299
  });
@@ -47,10 +47,12 @@ export function registerContactsGeneratedTools(registry) {
47
47
  method: { id: "people.contactGroups.members.modify", httpMethod: "POST", path: "v1/{+resourceName}/members:modify", baseUrl: "https://people.googleapis.com/", requiredParams: ["resourceName"], scopes: S_people_v1[1] },
48
48
  params: [{ "field": "resourceName", "api": "resourceName", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
49
49
  hasBody: true,
50
+ bodyParams: [{ "field": "resourceNamesToAdd", "api": "resourceNamesToAdd" }, { "field": "resourceNamesToRemove", "api": "resourceNamesToRemove" }],
50
51
  shape: {
51
52
  account: accountField(),
52
53
  resourceName: z.string().describe("Required. The resource name of the contact group to modify."),
53
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ModifyContactGroupMembersRequest JSON request body. Top-level fields: resourceNamesToAdd, resourceNamesToRemove."),
54
+ resourceNamesToAdd: coerceArray(z.string()).describe("Optional. The resource names of the contact people to add in the form of `people/{person_id}`. The total number of resource names in `resource_names_to_add` and `resource_names_to_remove` must be less").optional(),
55
+ resourceNamesToRemove: coerceArray(z.string()).describe("Optional. The resource names of the contact people to remove in the form of `people/{person_id}`. The total number of resource names in `resource_names_to_add` and `resource_names_to_remove` must be l").optional(),
54
56
  fields: z.string().optional().describe('Response field mask.'),
55
57
  },
56
58
  });
@@ -75,10 +77,13 @@ export function registerContactsGeneratedTools(registry) {
75
77
  method: { id: "people.otherContacts.copyOtherContactToMyContactsGroup", httpMethod: "POST", path: "v1/{+resourceName}:copyOtherContactToMyContactsGroup", baseUrl: "https://people.googleapis.com/", requiredParams: ["resourceName"], scopes: S_people_v1[2] },
76
78
  params: [{ "field": "resourceName", "api": "resourceName", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
77
79
  hasBody: true,
80
+ bodyParams: [{ "field": "copyMask", "api": "copyMask" }, { "field": "readMask", "api": "readMask" }, { "field": "sources", "api": "sources" }],
78
81
  shape: {
79
82
  account: accountField(),
80
83
  resourceName: z.string().describe("Required. The resource name of the \"Other contact\" to copy."),
81
- body: coerceJson(z.record(z.string(), z.unknown())).describe("CopyOtherContactToMyContactsGroupRequest JSON request body. Top-level fields: copyMask, readMask, sources."),
84
+ copyMask: z.string().describe("Required. A field mask to restrict which fields are copied into the new contact. Valid values are: * emailAddresses * names * phoneNumbers").optional(),
85
+ readMask: z.string().describe("Optional. A field mask to restrict which fields on the person are returned. Multiple fields can be specified by separating them with commas. Defaults to the copy mask with metadata and membership fiel").optional(),
86
+ sources: coerceArray(z.enum(["READ_SOURCE_TYPE_UNSPECIFIED", "READ_SOURCE_TYPE_PROFILE", "READ_SOURCE_TYPE_CONTACT", "READ_SOURCE_TYPE_DOMAIN_CONTACT", "READ_SOURCE_TYPE_OTHER_CONTACT"])).describe("Optional. A mask of what source types to return. Defaults to READ_SOURCE_TYPE_CONTACT and READ_SOURCE_TYPE_PROFILE if not set.").optional(),
82
87
  fields: z.string().optional().describe('Response field mask.'),
83
88
  },
84
89
  });
@@ -135,9 +140,10 @@ export function registerContactsGeneratedTools(registry) {
135
140
  method: { id: "people.people.batchDeleteContacts", httpMethod: "POST", path: "v1/people:batchDeleteContacts", baseUrl: "https://people.googleapis.com/", requiredParams: [], scopes: S_people_v1[1] },
136
141
  params: [{ "field": "fields", "api": "fields", "location": "query" }],
137
142
  hasBody: true,
143
+ bodyParams: [{ "field": "resourceNames", "api": "resourceNames" }],
138
144
  shape: {
139
145
  account: accountField(),
140
- body: coerceJson(z.record(z.string(), z.unknown())).describe("BatchDeleteContactsRequest JSON request body. Top-level fields: resourceNames."),
146
+ resourceNames: coerceArray(z.string()).describe("Required. The resource names of the contact to delete. It's repeatable. Allows up to 500 resource names in a single request.").optional(),
141
147
  fields: z.string().optional().describe('Response field mask.'),
142
148
  },
143
149
  });
@@ -213,10 +219,13 @@ export function registerContactsGeneratedTools(registry) {
213
219
  method: { id: "people.people.updateContactPhoto", httpMethod: "PATCH", path: "v1/{+resourceName}:updateContactPhoto", baseUrl: "https://people.googleapis.com/", requiredParams: ["resourceName"], scopes: S_people_v1[1] },
214
220
  params: [{ "field": "resourceName", "api": "resourceName", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
215
221
  hasBody: true,
222
+ bodyParams: [{ "field": "personFields", "api": "personFields" }, { "field": "photoBytes", "api": "photoBytes" }, { "field": "sources", "api": "sources" }],
216
223
  shape: {
217
224
  account: accountField(),
218
225
  resourceName: z.string().describe("Required. Person resource name"),
219
- body: coerceJson(z.record(z.string(), z.unknown())).describe("UpdateContactPhotoRequest JSON request body. Top-level fields: personFields, photoBytes, sources."),
226
+ personFields: z.string().describe("Optional. A field mask to restrict which fields on the person are returned. Multiple fields can be specified by separating them with commas. Defaults to empty if not set, which will skip the post muta").optional(),
227
+ photoBytes: z.string().describe("Required. Raw photo bytes").optional(),
228
+ sources: coerceArray(z.enum(["READ_SOURCE_TYPE_UNSPECIFIED", "READ_SOURCE_TYPE_PROFILE", "READ_SOURCE_TYPE_CONTACT", "READ_SOURCE_TYPE_DOMAIN_CONTACT", "READ_SOURCE_TYPE_OTHER_CONTACT"])).describe("Optional. A mask of what source types to return. Defaults to READ_SOURCE_TYPE_CONTACT and READ_SOURCE_TYPE_PROFILE if not set.").optional(),
220
229
  fields: z.string().optional().describe('Response field mask.'),
221
230
  },
222
231
  });
@@ -1,6 +1,6 @@
1
1
  // GENERATED by scripts/gen-tools.ts — do not edit. Regenerate: npm run gen:tools
2
2
  import { z } from 'zod';
3
- import { coerceBoolean, coerceJson } from '../_coerce.js';
3
+ import { coerceArray, coerceBoolean, coerceJson } from '../_coerce.js';
4
4
  import { accountField, registerGeneratedTool } from './_shared.js';
5
5
  export function registerDriveGeneratedTools(registry) {
6
6
  // Interned method scope sets (shared across tools; see scope-observability).
@@ -40,11 +40,12 @@ export function registerDriveGeneratedTools(registry) {
40
40
  method: { id: "drive.approvals.approve", httpMethod: "POST", path: "files/{fileId}/approvals/{approvalId}:approve", baseUrl: "https://www.googleapis.com/drive/v3/", requiredParams: ["fileId", "approvalId"], scopes: S_drive_v3[1] },
41
41
  params: [{ "field": "approvalId", "api": "approvalId", "location": "path" }, { "field": "fileId", "api": "fileId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
42
42
  hasBody: true,
43
+ bodyParams: [{ "field": "message", "api": "message" }],
43
44
  shape: {
44
45
  account: accountField(),
45
46
  approvalId: z.string().describe("Required. The ID of the approval to approve."),
46
47
  fileId: z.string().describe("Required. The ID of the file that the approval is on."),
47
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ApproveApprovalRequest JSON request body. Top-level fields: message."),
48
+ message: z.string().describe("Optional. A message to accompany the reviewer response on the approval. This message is included in notifications for the action and in the approval activity log.").optional(),
48
49
  fields: z.string().optional().describe('Response field mask.'),
49
50
  },
50
51
  });
@@ -55,11 +56,12 @@ export function registerDriveGeneratedTools(registry) {
55
56
  method: { id: "drive.approvals.cancel", httpMethod: "POST", path: "files/{fileId}/approvals/{approvalId}:cancel", baseUrl: "https://www.googleapis.com/drive/v3/", requiredParams: ["fileId", "approvalId"], scopes: S_drive_v3[1] },
56
57
  params: [{ "field": "approvalId", "api": "approvalId", "location": "path" }, { "field": "fileId", "api": "fileId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
57
58
  hasBody: true,
59
+ bodyParams: [{ "field": "message", "api": "message" }],
58
60
  shape: {
59
61
  account: accountField(),
60
62
  approvalId: z.string().describe("Required. The ID of the approval to cancel."),
61
63
  fileId: z.string().describe("Required. The ID of the file that the approval is on."),
62
- body: coerceJson(z.record(z.string(), z.unknown())).describe("CancelApprovalRequest JSON request body. Top-level fields: message."),
64
+ message: z.string().describe("Optional. A message to accompany the cancellation of the approval. This message is included in notifications for the action and in the approval activity log.").optional(),
63
65
  fields: z.string().optional().describe('Response field mask.'),
64
66
  },
65
67
  });
@@ -70,11 +72,12 @@ export function registerDriveGeneratedTools(registry) {
70
72
  method: { id: "drive.approvals.comment", httpMethod: "POST", path: "files/{fileId}/approvals/{approvalId}:comment", baseUrl: "https://www.googleapis.com/drive/v3/", requiredParams: ["fileId", "approvalId"], scopes: S_drive_v3[1] },
71
73
  params: [{ "field": "approvalId", "api": "approvalId", "location": "path" }, { "field": "fileId", "api": "fileId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
72
74
  hasBody: true,
75
+ bodyParams: [{ "field": "message", "api": "message" }],
73
76
  shape: {
74
77
  account: accountField(),
75
78
  approvalId: z.string().describe("Required. The ID of the approval to comment on."),
76
79
  fileId: z.string().describe("Required. The ID of the file that the approval is on."),
77
- body: coerceJson(z.record(z.string(), z.unknown())).describe("CommentApprovalRequest JSON request body. Top-level fields: message."),
80
+ message: z.string().describe("Required. A message to comment on the approval. This message is included in notifications for the action and in the approval activity log.").optional(),
78
81
  fields: z.string().optional().describe('Response field mask.'),
79
82
  },
80
83
  });
@@ -85,11 +88,12 @@ export function registerDriveGeneratedTools(registry) {
85
88
  method: { id: "drive.approvals.decline", httpMethod: "POST", path: "files/{fileId}/approvals/{approvalId}:decline", baseUrl: "https://www.googleapis.com/drive/v3/", requiredParams: ["fileId", "approvalId"], scopes: S_drive_v3[1] },
86
89
  params: [{ "field": "approvalId", "api": "approvalId", "location": "path" }, { "field": "fileId", "api": "fileId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
87
90
  hasBody: true,
91
+ bodyParams: [{ "field": "message", "api": "message" }],
88
92
  shape: {
89
93
  account: accountField(),
90
94
  approvalId: z.string().describe("Required. The ID of the approval to decline."),
91
95
  fileId: z.string().describe("Required. The ID of the file that the approval is on."),
92
- body: coerceJson(z.record(z.string(), z.unknown())).describe("DeclineApprovalRequest JSON request body. Top-level fields: message."),
96
+ message: z.string().describe("Optional. A message to accompany the reviewer response on the approval. This message is included in notifications for the action and in the approval activity log.").optional(),
93
97
  fields: z.string().optional().describe('Response field mask.'),
94
98
  },
95
99
  });
@@ -144,10 +148,15 @@ export function registerDriveGeneratedTools(registry) {
144
148
  method: { id: "drive.approvals.start", httpMethod: "POST", path: "files/{fileId}/approvals:start", baseUrl: "https://www.googleapis.com/drive/v3/", requiredParams: ["fileId"], scopes: S_drive_v3[1] },
145
149
  params: [{ "field": "fileId", "api": "fileId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
146
150
  hasBody: true,
151
+ bodyParams: [{ "field": "dueTime", "api": "dueTime" }, { "field": "fileContentChangeBehavior", "api": "fileContentChangeBehavior" }, { "field": "lockFile", "api": "lockFile" }, { "field": "message", "api": "message" }, { "field": "reviewerEmails", "api": "reviewerEmails" }],
147
152
  shape: {
148
153
  account: accountField(),
149
154
  fileId: z.string().describe("Required. The ID of the file that the approval is created on."),
150
- body: coerceJson(z.record(z.string(), z.unknown())).describe("StartApprovalRequest JSON request body. Top-level fields: dueTime, fileContentChangeBehavior, lockFile, message, reviewerEmails."),
155
+ dueTime: z.string().describe("Optional. The time that the approval is due.").optional(),
156
+ fileContentChangeBehavior: z.enum(["FILE_CONTENT_CHANGE_BEHAVIOR_UNSPECIFIED", "RESET_APPROVAL", "NO_APPROVAL_ACTION"]).describe("Optional. The behavior of the approval when the file content changes.").optional(),
157
+ lockFile: coerceBoolean.describe("Optional. Whether to lock the file when starting the approval.").optional(),
158
+ message: z.string().describe("Optional. A message to send to reviewers when notifying them of the approval request.").optional(),
159
+ reviewerEmails: coerceArray(z.string()).describe("Required. The emails of the users who are set to review the approval.").optional(),
151
160
  fields: z.string().optional().describe('Response field mask.'),
152
161
  },
153
162
  });
@@ -166,11 +166,17 @@ export function registerDrivelabelsGeneratedTools(registry) {
166
166
  method: { id: "drivelabels.labels.permissions.create", httpMethod: "POST", path: "v2/{+parent}/permissions", baseUrl: "https://drivelabels.googleapis.com/", requiredParams: ["parent"], scopes: S_drivelabels_v2[0] },
167
167
  params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "useAdminAccess", "api": "useAdminAccess", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
168
168
  hasBody: true,
169
+ bodyParams: [{ "field": "audience", "api": "audience" }, { "field": "email", "api": "email" }, { "field": "group", "api": "group" }, { "field": "name", "api": "name" }, { "field": "person", "api": "person" }, { "field": "role", "api": "role" }],
169
170
  shape: {
170
171
  account: accountField(),
171
172
  parent: z.string().describe("Required. The parent label resource name on the label permission is created. Format: `labels/{label}`."),
172
173
  useAdminAccess: coerceBoolean.describe("Set to `true` in order to use the user's admin credentials. The server will verify the user is an admin for the label before allowing access.").optional(),
173
- body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAppsDriveLabelsV2LabelPermission JSON request body. Top-level fields: audience, email, group, name, person, role."),
174
+ audience: z.string().describe("Audience to grant a role to. The magic value of `audiences/default` may be used to apply the role to the default audience in the context of the organization that owns the label.").optional(),
175
+ email: z.string().describe("Specifies the email address for a user or group principal. Not populated for audience principals. User and group permissions may only be inserted using an email address. On update requests, if email a").optional(),
176
+ group: z.string().describe("Group resource name.").optional(),
177
+ name: z.string().describe("Resource name of this permission.").optional(),
178
+ person: z.string().describe("Person resource name.").optional(),
179
+ role: z.enum(["LABEL_ROLE_UNSPECIFIED", "READER", "APPLIER", "ORGANIZER", "EDITOR"]).describe("The role the principal should have.").optional(),
174
180
  fields: z.string().optional().describe('Response field mask.'),
175
181
  },
176
182
  });
@@ -268,11 +274,17 @@ export function registerDrivelabelsGeneratedTools(registry) {
268
274
  method: { id: "drivelabels.labels.revisions.permissions.create", httpMethod: "POST", path: "v2/{+parent}/permissions", baseUrl: "https://drivelabels.googleapis.com/", requiredParams: ["parent"], scopes: S_drivelabels_v2[0] },
269
275
  params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "useAdminAccess", "api": "useAdminAccess", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
270
276
  hasBody: true,
277
+ bodyParams: [{ "field": "audience", "api": "audience" }, { "field": "email", "api": "email" }, { "field": "group", "api": "group" }, { "field": "name", "api": "name" }, { "field": "person", "api": "person" }, { "field": "role", "api": "role" }],
271
278
  shape: {
272
279
  account: accountField(),
273
280
  parent: z.string().describe("Required. The parent label resource name on the label permission is created. Format: `labels/{label}`."),
274
281
  useAdminAccess: coerceBoolean.describe("Set to `true` in order to use the user's admin credentials. The server will verify the user is an admin for the label before allowing access.").optional(),
275
- body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAppsDriveLabelsV2LabelPermission JSON request body. Top-level fields: audience, email, group, name, person, role."),
282
+ audience: z.string().describe("Audience to grant a role to. The magic value of `audiences/default` may be used to apply the role to the default audience in the context of the organization that owns the label.").optional(),
283
+ email: z.string().describe("Specifies the email address for a user or group principal. Not populated for audience principals. User and group permissions may only be inserted using an email address. On update requests, if email a").optional(),
284
+ group: z.string().describe("Group resource name.").optional(),
285
+ name: z.string().describe("Resource name of this permission.").optional(),
286
+ person: z.string().describe("Person resource name.").optional(),
287
+ role: z.enum(["LABEL_ROLE_UNSPECIFIED", "READER", "APPLIER", "ORGANIZER", "EDITOR"]).describe("The role the principal should have.").optional(),
276
288
  fields: z.string().optional().describe('Response field mask.'),
277
289
  },
278
290
  });
@@ -313,11 +325,17 @@ export function registerDrivelabelsGeneratedTools(registry) {
313
325
  method: { id: "drivelabels.labels.revisions.updatePermissions", httpMethod: "PATCH", path: "v2/{+parent}/permissions", baseUrl: "https://drivelabels.googleapis.com/", requiredParams: ["parent"], scopes: S_drivelabels_v2[0] },
314
326
  params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "useAdminAccess", "api": "useAdminAccess", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
315
327
  hasBody: true,
328
+ bodyParams: [{ "field": "audience", "api": "audience" }, { "field": "email", "api": "email" }, { "field": "group", "api": "group" }, { "field": "name", "api": "name" }, { "field": "person", "api": "person" }, { "field": "role", "api": "role" }],
316
329
  shape: {
317
330
  account: accountField(),
318
331
  parent: z.string().describe("Required. The parent label resource name."),
319
332
  useAdminAccess: coerceBoolean.describe("Set to `true` in order to use the user's admin credentials. The server will verify the user is an admin for the label before allowing access.").optional(),
320
- body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAppsDriveLabelsV2LabelPermission JSON request body. Top-level fields: audience, email, group, name, person, role."),
333
+ audience: z.string().describe("Audience to grant a role to. The magic value of `audiences/default` may be used to apply the role to the default audience in the context of the organization that owns the label.").optional(),
334
+ email: z.string().describe("Specifies the email address for a user or group principal. Not populated for audience principals. User and group permissions may only be inserted using an email address. On update requests, if email a").optional(),
335
+ group: z.string().describe("Group resource name.").optional(),
336
+ name: z.string().describe("Resource name of this permission.").optional(),
337
+ person: z.string().describe("Person resource name.").optional(),
338
+ role: z.enum(["LABEL_ROLE_UNSPECIFIED", "READER", "APPLIER", "ORGANIZER", "EDITOR"]).describe("The role the principal should have.").optional(),
321
339
  fields: z.string().optional().describe('Response field mask.'),
322
340
  },
323
341
  });
@@ -328,10 +346,14 @@ export function registerDrivelabelsGeneratedTools(registry) {
328
346
  method: { id: "drivelabels.labels.updateLabelCopyMode", httpMethod: "POST", path: "v2/{+name}:updateLabelCopyMode", baseUrl: "https://drivelabels.googleapis.com/", requiredParams: ["name"], scopes: S_drivelabels_v2[0] },
329
347
  params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
330
348
  hasBody: true,
349
+ bodyParams: [{ "field": "copyMode", "api": "copyMode" }, { "field": "languageCode", "api": "languageCode" }, { "field": "useAdminAccess", "api": "useAdminAccess" }, { "field": "view", "api": "view" }],
331
350
  shape: {
332
351
  account: accountField(),
333
352
  name: z.string().describe("Required. The resource name of the label to update."),
334
- body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAppsDriveLabelsV2UpdateLabelCopyModeRequest JSON request body. Top-level fields: copyMode, languageCode, useAdminAccess, view."),
353
+ copyMode: z.enum(["COPY_MODE_UNSPECIFIED", "DO_NOT_COPY", "ALWAYS_COPY", "COPY_APPLIABLE"]).describe("Required. Indicates how the applied label and field values should be copied when a Drive item is copied.").optional(),
354
+ languageCode: z.string().describe("The BCP-47 language code to use for evaluating localized field labels. When not specified, values in the default configured language will be used.").optional(),
355
+ useAdminAccess: coerceBoolean.describe("Set to `true` in order to use the user's admin credentials. The server will verify the user is an admin for the label before allowing access.").optional(),
356
+ view: z.enum(["LABEL_VIEW_BASIC", "LABEL_VIEW_FULL"]).describe("When specified, only certain fields belonging to the indicated view will be returned.").optional(),
335
357
  fields: z.string().optional().describe('Response field mask.'),
336
358
  },
337
359
  });
@@ -356,11 +378,17 @@ export function registerDrivelabelsGeneratedTools(registry) {
356
378
  method: { id: "drivelabels.labels.updatePermissions", httpMethod: "PATCH", path: "v2/{+parent}/permissions", baseUrl: "https://drivelabels.googleapis.com/", requiredParams: ["parent"], scopes: S_drivelabels_v2[0] },
357
379
  params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "useAdminAccess", "api": "useAdminAccess", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
358
380
  hasBody: true,
381
+ bodyParams: [{ "field": "audience", "api": "audience" }, { "field": "email", "api": "email" }, { "field": "group", "api": "group" }, { "field": "name", "api": "name" }, { "field": "person", "api": "person" }, { "field": "role", "api": "role" }],
359
382
  shape: {
360
383
  account: accountField(),
361
384
  parent: z.string().describe("Required. The parent label resource name."),
362
385
  useAdminAccess: coerceBoolean.describe("Set to `true` in order to use the user's admin credentials. The server will verify the user is an admin for the label before allowing access.").optional(),
363
- body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAppsDriveLabelsV2LabelPermission JSON request body. Top-level fields: audience, email, group, name, person, role."),
386
+ audience: z.string().describe("Audience to grant a role to. The magic value of `audiences/default` may be used to apply the role to the default audience in the context of the organization that owns the label.").optional(),
387
+ email: z.string().describe("Specifies the email address for a user or group principal. Not populated for audience principals. User and group permissions may only be inserted using an email address. On update requests, if email a").optional(),
388
+ group: z.string().describe("Group resource name.").optional(),
389
+ name: z.string().describe("Resource name of this permission.").optional(),
390
+ person: z.string().describe("Person resource name.").optional(),
391
+ role: z.enum(["LABEL_ROLE_UNSPECIFIED", "READER", "APPLIER", "ORGANIZER", "EDITOR"]).describe("The role the principal should have.").optional(),
364
392
  fields: z.string().optional().describe('Response field mask.'),
365
393
  },
366
394
  });
@@ -42,11 +42,11 @@ export function registerFormsGeneratedTools(registry) {
42
42
  method: { id: "forms.forms.watches.renew", httpMethod: "POST", path: "v1/forms/{formId}/watches/{watchId}:renew", baseUrl: "https://forms.googleapis.com/", requiredParams: ["formId", "watchId"], scopes: S_forms_v1[0] },
43
43
  params: [{ "field": "formId", "api": "formId", "location": "path" }, { "field": "watchId", "api": "watchId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
44
44
  hasBody: true,
45
+ bodyParams: [],
45
46
  shape: {
46
47
  account: accountField(),
47
48
  formId: z.string().describe("Required. The ID of the Form."),
48
49
  watchId: z.string().describe("Required. The ID of the Watch to renew."),
49
- body: coerceJson(z.record(z.string(), z.unknown())).describe("RenewWatchRequest JSON request body."),
50
50
  fields: z.string().optional().describe('Response field mask.'),
51
51
  },
52
52
  });
@@ -233,11 +233,11 @@ export function registerGmailGeneratedTools(registry) {
233
233
  method: { id: "gmail.users.settings.cse.keypairs.disable", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:disable", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId", "keyPairId"], scopes: S_gmail_v1[5] },
234
234
  params: [{ "field": "keyPairId", "api": "keyPairId", "location": "path" }, { "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
235
235
  hasBody: true,
236
+ bodyParams: [],
236
237
  shape: {
237
238
  account: accountField(),
238
239
  keyPairId: z.string().describe("The identifier of the key pair to turn off."),
239
240
  userId: z.string().describe("The requester's primary email address. To indicate the authenticated user, you can use the special value `me`."),
240
- body: coerceJson(z.record(z.string(), z.unknown())).describe("DisableCseKeyPairRequest JSON request body."),
241
241
  fields: z.string().optional().describe('Response field mask.'),
242
242
  },
243
243
  });
@@ -248,11 +248,11 @@ export function registerGmailGeneratedTools(registry) {
248
248
  method: { id: "gmail.users.settings.cse.keypairs.enable", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:enable", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId", "keyPairId"], scopes: S_gmail_v1[5] },
249
249
  params: [{ "field": "keyPairId", "api": "keyPairId", "location": "path" }, { "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
250
250
  hasBody: true,
251
+ bodyParams: [],
251
252
  shape: {
252
253
  account: accountField(),
253
254
  keyPairId: z.string().describe("The identifier of the key pair to turn on."),
254
255
  userId: z.string().describe("The requester's primary email address. To indicate the authenticated user, you can use the special value `me`."),
255
- body: coerceJson(z.record(z.string(), z.unknown())).describe("EnableCseKeyPairRequest JSON request body."),
256
256
  fields: z.string().optional().describe('Response field mask.'),
257
257
  },
258
258
  });
@@ -292,11 +292,11 @@ export function registerGmailGeneratedTools(registry) {
292
292
  method: { id: "gmail.users.settings.cse.keypairs.obliterate", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:obliterate", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId", "keyPairId"], scopes: S_gmail_v1[5] },
293
293
  params: [{ "field": "keyPairId", "api": "keyPairId", "location": "path" }, { "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
294
294
  hasBody: true,
295
+ bodyParams: [],
295
296
  shape: {
296
297
  account: accountField(),
297
298
  keyPairId: z.string().describe("The identifier of the key pair to obliterate."),
298
299
  userId: z.string().describe("The requester's primary email address. To indicate the authenticated user, you can use the special value `me`."),
299
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ObliterateCseKeyPairRequest JSON request body."),
300
300
  fields: z.string().optional().describe('Response field mask.'),
301
301
  },
302
302
  });
@@ -307,10 +307,12 @@ export function registerGmailGeneratedTools(registry) {
307
307
  method: { id: "gmail.users.settings.delegates.create", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/delegates", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[7] },
308
308
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
309
309
  hasBody: true,
310
+ bodyParams: [{ "field": "delegateEmail", "api": "delegateEmail" }, { "field": "verificationStatus", "api": "verificationStatus" }],
310
311
  shape: {
311
312
  account: accountField(),
312
313
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
313
- body: coerceJson(z.record(z.string(), z.unknown())).describe("Delegate JSON request body. Top-level fields: delegateEmail, verificationStatus."),
314
+ delegateEmail: z.string().describe("The email address of the delegate.").optional(),
315
+ verificationStatus: z.enum(["verificationStatusUnspecified", "accepted", "pending", "rejected", "expired"]).describe("Indicates whether this address has been verified and can act as a delegate for the account. Read-only.").optional(),
314
316
  fields: z.string().optional().describe('Response field mask.'),
315
317
  },
316
318
  });
@@ -417,10 +419,12 @@ export function registerGmailGeneratedTools(registry) {
417
419
  method: { id: "gmail.users.settings.forwardingAddresses.create", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/forwardingAddresses", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[7] },
418
420
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
419
421
  hasBody: true,
422
+ bodyParams: [{ "field": "forwardingEmail", "api": "forwardingEmail" }, { "field": "verificationStatus", "api": "verificationStatus" }],
420
423
  shape: {
421
424
  account: accountField(),
422
425
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
423
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ForwardingAddress JSON request body. Top-level fields: forwardingEmail, verificationStatus."),
426
+ forwardingEmail: z.string().describe("An email address to which messages can be forwarded.").optional(),
427
+ verificationStatus: z.enum(["verificationStatusUnspecified", "accepted", "pending"]).describe("Indicates whether this address has been verified and is usable for forwarding. Read-only.").optional(),
424
428
  fields: z.string().optional().describe('Response field mask.'),
425
429
  },
426
430
  });
@@ -624,11 +628,18 @@ export function registerGmailGeneratedTools(registry) {
624
628
  method: { id: "gmail.users.settings.sendAs.smimeInfo.insert", httpMethod: "POST", path: "gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId", "sendAsEmail"], scopes: S_gmail_v1[5] },
625
629
  params: [{ "field": "sendAsEmail", "api": "sendAsEmail", "location": "path" }, { "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
626
630
  hasBody: true,
631
+ bodyParams: [{ "field": "encryptedKeyPassword", "api": "encryptedKeyPassword" }, { "field": "expiration", "api": "expiration" }, { "field": "id", "api": "id" }, { "field": "isDefault", "api": "isDefault" }, { "field": "issuerCn", "api": "issuerCn" }, { "field": "pem", "api": "pem" }, { "field": "pkcs12", "api": "pkcs12" }],
627
632
  shape: {
628
633
  account: accountField(),
629
634
  sendAsEmail: z.string().describe("The email address that appears in the \"From:\" header for mail sent using this alias."),
630
635
  userId: z.string().describe("The user's email address. The special value `me` can be used to indicate the authenticated user."),
631
- body: coerceJson(z.record(z.string(), z.unknown())).describe("SmimeInfo JSON request body. Top-level fields: encryptedKeyPassword, expiration, id, isDefault, issuerCn, pem, pkcs12."),
636
+ encryptedKeyPassword: z.string().describe("Encrypted key password, when key is encrypted.").optional(),
637
+ expiration: z.string().describe("When the certificate expires (in milliseconds since epoch).").optional(),
638
+ id: z.string().describe("The immutable ID for the SmimeInfo.").optional(),
639
+ isDefault: coerceBoolean.describe("Whether this SmimeInfo is the default one for this user's send-as address.").optional(),
640
+ issuerCn: z.string().describe("The S/MIME certificate issuer's common name.").optional(),
641
+ pem: z.string().describe("PEM formatted X509 concatenated certificate string (standard base64 encoding). Format used for returning key, which includes public key as well as certificate chain (not private key).").optional(),
642
+ pkcs12: z.string().describe("PKCS#12 format containing a single private/public key pair and certificate chain. This format is only accepted from client for creating a new SmimeInfo and is never returned, because the private key i").optional(),
632
643
  fields: z.string().optional().describe('Response field mask.'),
633
644
  },
634
645
  });
@@ -697,10 +708,13 @@ export function registerGmailGeneratedTools(registry) {
697
708
  method: { id: "gmail.users.settings.updateAutoForwarding", httpMethod: "PUT", path: "gmail/v1/users/{userId}/settings/autoForwarding", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[7] },
698
709
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
699
710
  hasBody: true,
711
+ bodyParams: [{ "field": "disposition", "api": "disposition" }, { "field": "emailAddress", "api": "emailAddress" }, { "field": "enabled", "api": "enabled" }],
700
712
  shape: {
701
713
  account: accountField(),
702
714
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
703
- body: coerceJson(z.record(z.string(), z.unknown())).describe("AutoForwarding JSON request body. Top-level fields: disposition, emailAddress, enabled."),
715
+ disposition: z.enum(["dispositionUnspecified", "leaveInInbox", "archive", "trash", "markRead"]).describe("The state that a message should be left in after it has been forwarded.").optional(),
716
+ emailAddress: z.string().describe("Email address to which all incoming messages are forwarded. This email address must be a verified member of the forwarding addresses.").optional(),
717
+ enabled: coerceBoolean.describe("Whether all incoming mail is automatically forwarded to another address.").optional(),
704
718
  fields: z.string().optional().describe('Response field mask.'),
705
719
  },
706
720
  });
@@ -711,10 +725,14 @@ export function registerGmailGeneratedTools(registry) {
711
725
  method: { id: "gmail.users.settings.updateImap", httpMethod: "PUT", path: "gmail/v1/users/{userId}/settings/imap", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[9] },
712
726
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
713
727
  hasBody: true,
728
+ bodyParams: [{ "field": "autoExpunge", "api": "autoExpunge" }, { "field": "enabled", "api": "enabled" }, { "field": "expungeBehavior", "api": "expungeBehavior" }, { "field": "maxFolderSize", "api": "maxFolderSize" }],
714
729
  shape: {
715
730
  account: accountField(),
716
731
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
717
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ImapSettings JSON request body. Top-level fields: autoExpunge, enabled, expungeBehavior, maxFolderSize."),
732
+ autoExpunge: coerceBoolean.describe("If this value is true, Gmail will immediately expunge a message when it is marked as deleted in IMAP. Otherwise, Gmail will wait for an update from the client before expunging messages marked as delet").optional(),
733
+ enabled: coerceBoolean.describe("Whether IMAP is enabled for the account.").optional(),
734
+ expungeBehavior: z.enum(["expungeBehaviorUnspecified", "archive", "trash", "deleteForever"]).describe("The action that will be executed on a message when it is marked as deleted and expunged from the last visible IMAP folder.").optional(),
735
+ maxFolderSize: z.number().describe("An optional limit on the number of messages that an IMAP folder may contain. Legal values are 0, 1000, 2000, 5000 or 10000. A value of zero is interpreted to mean that there is no limit.").optional(),
718
736
  fields: z.string().optional().describe('Response field mask.'),
719
737
  },
720
738
  });
@@ -725,10 +743,11 @@ export function registerGmailGeneratedTools(registry) {
725
743
  method: { id: "gmail.users.settings.updateLanguage", httpMethod: "PUT", path: "gmail/v1/users/{userId}/settings/language", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[9] },
726
744
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
727
745
  hasBody: true,
746
+ bodyParams: [{ "field": "displayLanguage", "api": "displayLanguage" }],
728
747
  shape: {
729
748
  account: accountField(),
730
749
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
731
- body: coerceJson(z.record(z.string(), z.unknown())).describe("LanguageSettings JSON request body. Top-level fields: displayLanguage."),
750
+ displayLanguage: z.string().describe("The language to display Gmail in, formatted as an RFC 3066 Language Tag (for example `en-GB`, `fr` or `ja` for British English, French, or Japanese respectively). The set of languages supported by Gma").optional(),
732
751
  fields: z.string().optional().describe('Response field mask.'),
733
752
  },
734
753
  });
@@ -739,10 +758,12 @@ export function registerGmailGeneratedTools(registry) {
739
758
  method: { id: "gmail.users.settings.updatePop", httpMethod: "PUT", path: "gmail/v1/users/{userId}/settings/pop", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[9] },
740
759
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
741
760
  hasBody: true,
761
+ bodyParams: [{ "field": "accessWindow", "api": "accessWindow" }, { "field": "disposition", "api": "disposition" }],
742
762
  shape: {
743
763
  account: accountField(),
744
764
  userId: z.string().describe("User's email address. The special value \"me\" can be used to indicate the authenticated user."),
745
- body: coerceJson(z.record(z.string(), z.unknown())).describe("PopSettings JSON request body. Top-level fields: accessWindow, disposition."),
765
+ accessWindow: z.enum(["accessWindowUnspecified", "disabled", "fromNowOn", "allMail"]).describe("The range of messages which are accessible via POP.").optional(),
766
+ disposition: z.enum(["dispositionUnspecified", "leaveInInbox", "archive", "trash", "markRead"]).describe("The action that will be executed on a message after it has been fetched via POP.").optional(),
746
767
  fields: z.string().optional().describe('Response field mask.'),
747
768
  },
748
769
  });
@@ -798,11 +819,13 @@ export function registerGmailGeneratedTools(registry) {
798
819
  method: { id: "gmail.users.threads.modify", httpMethod: "POST", path: "gmail/v1/users/{userId}/threads/{id}/modify", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId", "id"], scopes: S_gmail_v1[4] },
799
820
  params: [{ "field": "id", "api": "id", "location": "path" }, { "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
800
821
  hasBody: true,
822
+ bodyParams: [{ "field": "addLabelIds", "api": "addLabelIds" }, { "field": "removeLabelIds", "api": "removeLabelIds" }],
801
823
  shape: {
802
824
  account: accountField(),
803
825
  id: z.string().describe("The ID of the thread to modify."),
804
826
  userId: z.string().describe("The user's email address. The special value `me` can be used to indicate the authenticated user."),
805
- body: coerceJson(z.record(z.string(), z.unknown())).describe("ModifyThreadRequest JSON request body. Top-level fields: addLabelIds, removeLabelIds."),
827
+ addLabelIds: coerceArray(z.string()).describe("A list of IDs of labels to add to this thread. You can add up to 100 labels with each update.").optional(),
828
+ removeLabelIds: coerceArray(z.string()).describe("A list of IDs of labels to remove from this thread. You can remove up to 100 labels with each update.").optional(),
806
829
  fields: z.string().optional().describe('Response field mask.'),
807
830
  },
808
831
  });
@@ -841,10 +864,14 @@ export function registerGmailGeneratedTools(registry) {
841
864
  method: { id: "gmail.users.watch", httpMethod: "POST", path: "gmail/v1/users/{userId}/watch", baseUrl: "https://gmail.googleapis.com/", requiredParams: ["userId"], scopes: S_gmail_v1[10] },
842
865
  params: [{ "field": "userId", "api": "userId", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
843
866
  hasBody: true,
867
+ bodyParams: [{ "field": "labelFilterAction", "api": "labelFilterAction" }, { "field": "labelFilterBehavior", "api": "labelFilterBehavior" }, { "field": "labelIds", "api": "labelIds" }, { "field": "topicName", "api": "topicName" }],
844
868
  shape: {
845
869
  account: accountField(),
846
870
  userId: z.string().describe("The user's email address. The special value `me` can be used to indicate the authenticated user."),
847
- body: coerceJson(z.record(z.string(), z.unknown())).describe("WatchRequest JSON request body. Top-level fields: labelFilterAction, labelFilterBehavior, labelIds, topicName."),
871
+ labelFilterAction: z.enum(["include", "exclude"]).describe("Filtering behavior of `labelIds list` specified. This field is deprecated because it caused incorrect behavior in some cases; use `label_filter_behavior` instead.").optional(),
872
+ labelFilterBehavior: z.enum(["include", "exclude"]).describe("Filtering behavior of `labelIds list` specified. This field replaces `label_filter_action`; if set, `label_filter_action` is ignored.").optional(),
873
+ labelIds: coerceArray(z.string()).describe("List of label_ids to restrict notifications about. By default, if unspecified, all changes are pushed out. If specified then dictates which labels are required for a push notification to be generated.").optional(),
874
+ topicName: z.string().describe("A fully qualified Google Cloud Pub/Sub API topic name to publish the events to. This topic name **must** already exist in Cloud Pub/Sub and you **must** have already granted gmail \"publish\" permission").optional(),
848
875
  fields: z.string().optional().describe('Response field mask.'),
849
876
  },
850
877
  });
@@ -1,4 +1,5 @@
1
1
  import { registerAdminGeneratedTools } from './admin.js';
2
+ import { registerAnalyticsGeneratedTools } from './analytics.js';
2
3
  import { registerAppsmarketGeneratedTools } from './appsmarket.js';
3
4
  import { registerCalendarGeneratedTools } from './calendar.js';
4
5
  import { registerChatGeneratedTools } from './chat.js';
@@ -26,6 +27,7 @@ import { registerVaultGeneratedTools } from './vault.js';
26
27
  import { registerWorkspaceeventsGeneratedTools } from './workspaceevents.js';
27
28
  export const GENERATED_SERVICES = [
28
29
  { name: "admin", register: registerAdminGeneratedTools },
30
+ { name: "analytics", register: registerAnalyticsGeneratedTools },
29
31
  { name: "appsmarket", register: registerAppsmarketGeneratedTools },
30
32
  { name: "calendar", register: registerCalendarGeneratedTools },
31
33
  { name: "chat", register: registerChatGeneratedTools },
@@ -1,6 +1,6 @@
1
1
  // GENERATED by scripts/gen-tools.ts — do not edit. Regenerate: npm run gen:tools
2
2
  import { z } from 'zod';
3
- import { coerceJson } from '../_coerce.js';
3
+ import { coerceArray, coerceJson } from '../_coerce.js';
4
4
  import { accountField, registerGeneratedTool } from './_shared.js';
5
5
  export function registerKeepGeneratedTools(registry) {
6
6
  // Interned method scope sets (shared across tools; see scope-observability).
@@ -97,10 +97,11 @@ export function registerKeepGeneratedTools(registry) {
97
97
  method: { id: "keep.notes.permissions.batchDelete", httpMethod: "POST", path: "v1/{+parent}/permissions:batchDelete", baseUrl: "https://keep.googleapis.com/", requiredParams: ["parent"], scopes: S_keep_v1[1] },
98
98
  params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
99
99
  hasBody: true,
100
+ bodyParams: [{ "field": "names", "api": "names" }],
100
101
  shape: {
101
102
  account: accountField(),
102
103
  parent: z.string().describe("The parent resource shared by all permissions being deleted. Format: `notes/{note}` If this is set, the parent of all of the permissions specified in the DeletePermissionRequest messages must match th"),
103
- body: coerceJson(z.record(z.string(), z.unknown())).describe("BatchDeletePermissionsRequest JSON request body. Top-level fields: names."),
104
+ names: coerceArray(z.string()).describe("Required. The names of the permissions to delete. Format: `notes/{note}/permissions/{permission}`").optional(),
104
105
  fields: z.string().optional().describe('Response field mask.'),
105
106
  },
106
107
  });