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
@@ -0,0 +1,981 @@
1
+ // GENERATED by scripts/gen-tools.ts — do not edit. Regenerate: npm run gen:tools
2
+ import { z } from 'zod';
3
+ import { coerceArray, coerceBoolean, coerceJson } from '../_coerce.js';
4
+ import { accountField, registerGeneratedTool } from './_shared.js';
5
+ export function registerAnalyticsGeneratedTools(registry) {
6
+ // Interned method scope sets (shared across tools; see scope-observability).
7
+ const S_analyticsadmin_v1beta = [
8
+ ["https://www.googleapis.com/auth/analytics.edit"],
9
+ ["https://www.googleapis.com/auth/analytics.edit", "https://www.googleapis.com/auth/analytics.readonly"],
10
+ ];
11
+ registerGeneratedTool(registry, {
12
+ name: "analytics_accounts_delete",
13
+ cud: "delete",
14
+ description: "Marks target Account as soft-deleted (ie: \"trashed\") and returns it. This API does not have a method to restore soft-deleted accounts. However, they can be rest",
15
+ method: { id: "analyticsadmin.accounts.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
16
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
17
+ hasBody: false,
18
+ shape: {
19
+ account: accountField(),
20
+ name: z.string().describe("Required. The name of the Account to soft-delete. Format: accounts/{account} Example: \"accounts/100\""),
21
+ fields: z.string().optional().describe('Response field mask.'),
22
+ },
23
+ });
24
+ registerGeneratedTool(registry, {
25
+ name: "analytics_accounts_get",
26
+ cud: "read",
27
+ description: "Lookup for a single Account.",
28
+ method: { id: "analyticsadmin.accounts.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
29
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
30
+ hasBody: false,
31
+ shape: {
32
+ account: accountField(),
33
+ name: z.string().describe("Required. The name of the account to lookup. Format: accounts/{account} Example: \"accounts/100\""),
34
+ fields: z.string().optional().describe('Response field mask.'),
35
+ },
36
+ });
37
+ registerGeneratedTool(registry, {
38
+ name: "analytics_accounts_get_data_sharing_settings",
39
+ cud: "read",
40
+ description: "Get data sharing settings on an account. Data sharing settings are singletons.",
41
+ method: { id: "analyticsadmin.accounts.getDataSharingSettings", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
42
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
43
+ hasBody: false,
44
+ shape: {
45
+ account: accountField(),
46
+ name: z.string().describe("Required. The name of the settings to lookup. Format: accounts/{account}/dataSharingSettings Example: `accounts/1000/dataSharingSettings`"),
47
+ fields: z.string().optional().describe('Response field mask.'),
48
+ },
49
+ });
50
+ registerGeneratedTool(registry, {
51
+ name: "analytics_accounts_list",
52
+ cud: "read",
53
+ description: "Returns all accounts accessible by the caller. Note that these accounts might not currently have GA properties. Soft-deleted (ie: \"trashed\") accounts are exclud",
54
+ method: { id: "analyticsadmin.accounts.list", httpMethod: "GET", path: "v1beta/accounts", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: [], scopes: S_analyticsadmin_v1beta[1] },
55
+ params: [{ "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "showDeleted", "api": "showDeleted", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
56
+ hasBody: false,
57
+ shape: {
58
+ account: accountField(),
59
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. The service may return fewer than this value, even if there are additional pages. If unspecified, at most 50 resources will be returned. The maximu").optional(),
60
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListAccounts` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListAccounts` must match the call").optional(),
61
+ showDeleted: coerceBoolean.describe("Whether to include soft-deleted (ie: \"trashed\") Accounts in the results. Accounts can be inspected to determine whether they are deleted or not.").optional(),
62
+ fields: z.string().optional().describe('Response field mask.'),
63
+ },
64
+ });
65
+ registerGeneratedTool(registry, {
66
+ name: "analytics_accounts_patch",
67
+ cud: "update",
68
+ description: "Updates an account.",
69
+ method: { id: "analyticsadmin.accounts.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
70
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
71
+ hasBody: true,
72
+ bodyParams: [{ "field": "createTime", "api": "createTime" }, { "field": "deleted", "api": "deleted" }, { "field": "displayName", "api": "displayName" }, { "field": "gmpOrganization", "api": "gmpOrganization" }, { "field": "name_", "api": "name" }, { "field": "regionCode", "api": "regionCode" }, { "field": "updateTime", "api": "updateTime" }],
73
+ shape: {
74
+ account: accountField(),
75
+ name: z.string().describe("Identifier. Resource name of this account. Format: accounts/{account} Example: \"accounts/100\""),
76
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (for example, \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the ").optional(),
77
+ createTime: z.string().describe("Output only. Time when this account was originally created.").optional(),
78
+ deleted: coerceBoolean.describe("Output only. Indicates whether this Account is soft-deleted or not. Deleted accounts are excluded from List results unless specifically requested.").optional(),
79
+ displayName: z.string().describe("Required. Human-readable display name for this account.").optional(),
80
+ gmpOrganization: z.string().describe("Output only. The URI for a Google Marketing Platform organization resource. Only set when this account is connected to a GMP organization. Format: marketingplatformadmin.googleapis.com/organizations/{").optional(),
81
+ name_: z.string().describe("Identifier. Resource name of this account. Format: accounts/{account} Example: \"accounts/100\"").optional(),
82
+ regionCode: z.string().describe("Country of business. Must be a Unicode CLDR region code.").optional(),
83
+ updateTime: z.string().describe("Output only. Time when account payload fields were last updated.").optional(),
84
+ fields: z.string().optional().describe('Response field mask.'),
85
+ },
86
+ });
87
+ registerGeneratedTool(registry, {
88
+ name: "analytics_accounts_provision_account_ticket",
89
+ cud: "create",
90
+ description: "Requests a ticket for creating an account.",
91
+ method: { id: "analyticsadmin.accounts.provisionAccountTicket", httpMethod: "POST", path: "v1beta/accounts:provisionAccountTicket", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: [], scopes: S_analyticsadmin_v1beta[0] },
92
+ params: [{ "field": "fields", "api": "fields", "location": "query" }],
93
+ hasBody: true,
94
+ shape: {
95
+ account: accountField(),
96
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaProvisionAccountTicketRequest JSON request body. Top-level fields: account, redirectUri."),
97
+ fields: z.string().optional().describe('Response field mask.'),
98
+ },
99
+ });
100
+ registerGeneratedTool(registry, {
101
+ name: "analytics_accounts_run_access_report",
102
+ cud: "read",
103
+ description: "Returns a customized report of data access records. The report provides records of each time a user reads Google Analytics reporting data. Access records are re",
104
+ method: { id: "analyticsadmin.accounts.runAccessReport", httpMethod: "POST", path: "v1beta/{+entity}:runAccessReport", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["entity"], scopes: S_analyticsadmin_v1beta[1] },
105
+ params: [{ "field": "entity", "api": "entity", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
106
+ hasBody: true,
107
+ shape: {
108
+ account: accountField(),
109
+ entity: z.string().describe("The Data Access Report supports requesting at the property level or account level. If requested at the account level, Data Access Reports include all access for all properties under that account. To r"),
110
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaRunAccessReportRequest JSON request body. Top-level fields: dateRanges, dimensionFilter, dimensions, expandGroups, includeAllUsers, limit, metricFilter, metrics, offset, orderBys, returnEntityQuota, timeZone."),
111
+ fields: z.string().optional().describe('Response field mask.'),
112
+ },
113
+ });
114
+ registerGeneratedTool(registry, {
115
+ name: "analytics_accounts_search_change_history_events",
116
+ cud: "read",
117
+ description: "Searches through all changes to an account or its children given the specified set of filters. Only returns the subset of changes supported by the API. The UI m",
118
+ method: { id: "analyticsadmin.accounts.searchChangeHistoryEvents", httpMethod: "POST", path: "v1beta/{+account}:searchChangeHistoryEvents", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["account"], scopes: S_analyticsadmin_v1beta[0] },
119
+ params: [{ "field": "account_", "api": "account", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
120
+ hasBody: true,
121
+ bodyParams: [{ "field": "action", "api": "action" }, { "field": "actorEmail", "api": "actorEmail" }, { "field": "earliestChangeTime", "api": "earliestChangeTime" }, { "field": "latestChangeTime", "api": "latestChangeTime" }, { "field": "pageSize", "api": "pageSize" }, { "field": "pageToken", "api": "pageToken" }, { "field": "property", "api": "property" }, { "field": "resourceType", "api": "resourceType" }],
122
+ shape: {
123
+ account: accountField(),
124
+ account_: z.string().describe("Required. The account resource for which to return change history resources. Format: accounts/{account} Example: `accounts/100`"),
125
+ action: coerceArray(z.enum(["ACTION_TYPE_UNSPECIFIED", "CREATED", "UPDATED", "DELETED"])).describe("Optional. If set, only return changes that match one or more of these types of actions.").optional(),
126
+ actorEmail: coerceArray(z.string()).describe("Optional. If set, only return changes if they are made by a user in this list.").optional(),
127
+ earliestChangeTime: z.string().describe("Optional. If set, only return changes made after this time (inclusive).").optional(),
128
+ latestChangeTime: z.string().describe("Optional. If set, only return changes made before this time (inclusive).").optional(),
129
+ pageSize: z.number().describe("Optional. The maximum number of ChangeHistoryEvent items to return. If unspecified, at most 50 items will be returned. The maximum value is 200 (higher values will be coerced to the maximum). Note tha").optional(),
130
+ pageToken: z.string().describe("Optional. A page token, received from a previous `SearchChangeHistoryEvents` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `SearchChangeHistoryE").optional(),
131
+ property: z.string().describe("Optional. Resource name for a child property. If set, only return changes made to this property or its child resources. Format: properties/{propertyId} Example: `properties/100`").optional(),
132
+ resourceType: coerceArray(z.enum(["CHANGE_HISTORY_RESOURCE_TYPE_UNSPECIFIED", "ACCOUNT", "PROPERTY", "FIREBASE_LINK", "GOOGLE_ADS_LINK", "GOOGLE_SIGNALS_SETTINGS", "CONVERSION_EVENT", "MEASUREMENT_PROTOCOL_SECRET", "CUSTOM_DIMENSION", "CUSTOM_METRIC", "DATA_RETENTION_SETTINGS", "DISPLAY_VIDEO_360_ADVERTISER_LINK", "DISPLAY_VIDEO_360_ADVERTISER_LINK_PROPOSAL", "DATA_STREAM", "ATTRIBUTION_SETTINGS"])).describe("Optional. If set, only return changes if they are for a resource that matches at least one of these types.").optional(),
133
+ fields: z.string().optional().describe('Response field mask.'),
134
+ },
135
+ });
136
+ registerGeneratedTool(registry, {
137
+ name: "analytics_properties_acknowledge_user_data_collection",
138
+ cud: "update",
139
+ description: "Acknowledges the terms of user data collection for the specified property. This acknowledgement must be completed (either in the Google Analytics UI or through",
140
+ method: { id: "analyticsadmin.properties.acknowledgeUserDataCollection", httpMethod: "POST", path: "v1beta/{+property}:acknowledgeUserDataCollection", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["property"], scopes: S_analyticsadmin_v1beta[0] },
141
+ params: [{ "field": "property", "api": "property", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
142
+ hasBody: true,
143
+ bodyParams: [{ "field": "acknowledgement", "api": "acknowledgement" }],
144
+ shape: {
145
+ account: accountField(),
146
+ property: z.string().describe("Required. The property for which to acknowledge user data collection."),
147
+ acknowledgement: z.string().describe("Required. An acknowledgement that the caller of this method understands the terms of user data collection. This field must contain the exact value: \"I acknowledge that I have the necessary privacy dis").optional(),
148
+ fields: z.string().optional().describe('Response field mask.'),
149
+ },
150
+ });
151
+ registerGeneratedTool(registry, {
152
+ name: "analytics_properties_conversion_events_create",
153
+ cud: "create",
154
+ description: "Deprecated: Use `CreateKeyEvent` instead. Creates a conversion event with the specified attributes.",
155
+ method: { id: "analyticsadmin.properties.conversionEvents.create", httpMethod: "POST", path: "v1beta/{+parent}/conversionEvents", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
156
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
157
+ hasBody: true,
158
+ shape: {
159
+ account: accountField(),
160
+ parent: z.string().describe("Required. The resource name of the parent property where this conversion event will be created. Format: properties/123"),
161
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaConversionEvent JSON request body. Top-level fields: countingMethod, createTime, custom, defaultConversionValue, deletable, eventName, name."),
162
+ fields: z.string().optional().describe('Response field mask.'),
163
+ },
164
+ });
165
+ registerGeneratedTool(registry, {
166
+ name: "analytics_properties_conversion_events_delete",
167
+ cud: "delete",
168
+ description: "Deprecated: Use `DeleteKeyEvent` instead. Deletes a conversion event in a property.",
169
+ method: { id: "analyticsadmin.properties.conversionEvents.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
170
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
171
+ hasBody: false,
172
+ shape: {
173
+ account: accountField(),
174
+ name: z.string().describe("Required. The resource name of the conversion event to delete. Format: properties/{property}/conversionEvents/{conversion_event} Example: \"properties/123/conversionEvents/456\""),
175
+ fields: z.string().optional().describe('Response field mask.'),
176
+ },
177
+ });
178
+ registerGeneratedTool(registry, {
179
+ name: "analytics_properties_conversion_events_get",
180
+ cud: "read",
181
+ description: "Deprecated: Use `GetKeyEvent` instead. Retrieve a single conversion event.",
182
+ method: { id: "analyticsadmin.properties.conversionEvents.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
183
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
184
+ hasBody: false,
185
+ shape: {
186
+ account: accountField(),
187
+ name: z.string().describe("Required. The resource name of the conversion event to retrieve. Format: properties/{property}/conversionEvents/{conversion_event} Example: \"properties/123/conversionEvents/456\""),
188
+ fields: z.string().optional().describe('Response field mask.'),
189
+ },
190
+ });
191
+ registerGeneratedTool(registry, {
192
+ name: "analytics_properties_conversion_events_list",
193
+ cud: "read",
194
+ description: "Deprecated: Use `ListKeyEvents` instead. Returns a list of conversion events in the specified parent property. Returns an empty list if no conversion events are",
195
+ method: { id: "analyticsadmin.properties.conversionEvents.list", httpMethod: "GET", path: "v1beta/{+parent}/conversionEvents", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
196
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
197
+ hasBody: false,
198
+ shape: {
199
+ account: accountField(),
200
+ parent: z.string().describe("Required. The resource name of the parent property. Example: 'properties/123'"),
201
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200; (higher values will be coerced to the maximum)").optional(),
202
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListConversionEvents` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListConversionEvents` mus").optional(),
203
+ fields: z.string().optional().describe('Response field mask.'),
204
+ },
205
+ });
206
+ registerGeneratedTool(registry, {
207
+ name: "analytics_properties_conversion_events_patch",
208
+ cud: "update",
209
+ description: "Deprecated: Use `UpdateKeyEvent` instead. Updates a conversion event with the specified attributes.",
210
+ method: { id: "analyticsadmin.properties.conversionEvents.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
211
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
212
+ hasBody: true,
213
+ shape: {
214
+ account: accountField(),
215
+ name: z.string().describe("Identifier. Resource name of this conversion event. Format: properties/{property}/conversionEvents/{conversion_event}"),
216
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (e.g., \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the string ").optional(),
217
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaConversionEvent JSON request body. Top-level fields: countingMethod, createTime, custom, defaultConversionValue, deletable, eventName, name."),
218
+ fields: z.string().optional().describe('Response field mask.'),
219
+ },
220
+ });
221
+ registerGeneratedTool(registry, {
222
+ name: "analytics_properties_create",
223
+ cud: "create",
224
+ description: "Creates a Google Analytics property with the specified location and attributes.",
225
+ method: { id: "analyticsadmin.properties.create", httpMethod: "POST", path: "v1beta/properties", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: [], scopes: S_analyticsadmin_v1beta[0] },
226
+ params: [{ "field": "fields", "api": "fields", "location": "query" }],
227
+ hasBody: true,
228
+ bodyParams: [{ "field": "account_", "api": "account" }, { "field": "createTime", "api": "createTime" }, { "field": "currencyCode", "api": "currencyCode" }, { "field": "deleteTime", "api": "deleteTime" }, { "field": "displayName", "api": "displayName" }, { "field": "expireTime", "api": "expireTime" }, { "field": "industryCategory", "api": "industryCategory" }, { "field": "name", "api": "name" }, { "field": "parent", "api": "parent" }, { "field": "propertyType", "api": "propertyType" }, { "field": "serviceLevel", "api": "serviceLevel" }, { "field": "timeZone", "api": "timeZone" }, { "field": "updateTime", "api": "updateTime" }],
229
+ shape: {
230
+ account: accountField(),
231
+ account_: z.string().describe("Immutable. The resource name of the parent account Format: accounts/{account_id} Example: \"accounts/123\"").optional(),
232
+ createTime: z.string().describe("Output only. Time when the entity was originally created.").optional(),
233
+ currencyCode: z.string().describe("The currency type used in reports involving monetary values. Format: https://en.wikipedia.org/wiki/ISO_4217 Examples: \"USD\", \"EUR\", \"JPY\"").optional(),
234
+ deleteTime: z.string().describe("Output only. If set, the time at which this property was trashed. If not set, then this property is not currently in the trash can.").optional(),
235
+ displayName: z.string().describe("Required. Human-readable display name for this property. The max allowed display name length is 100 UTF-16 code units.").optional(),
236
+ expireTime: z.string().describe("Output only. If set, the time at which this trashed property will be permanently deleted. If not set, then this property is not currently in the trash can and is not slated to be deleted.").optional(),
237
+ industryCategory: z.enum(["INDUSTRY_CATEGORY_UNSPECIFIED", "AUTOMOTIVE", "BUSINESS_AND_INDUSTRIAL_MARKETS", "FINANCE", "HEALTHCARE", "TECHNOLOGY", "TRAVEL", "OTHER", "ARTS_AND_ENTERTAINMENT", "BEAUTY_AND_FITNESS", "BOOKS_AND_LITERATURE", "FOOD_AND_DRINK", "GAMES", "HOBBIES_AND_LEISURE", "HOME_AND_GARDEN", "INTERNET_AND_TELECOM", "LAW_AND_GOVERNMENT", "NEWS", "ONLINE_COMMUNITIES", "PEOPLE_AND_SOCIETY", "PETS_AND_ANIMALS", "REAL_ESTATE", "REFERENCE", "SCIENCE", "SPORTS", "JOBS_AND_EDUCATION", "SHOPPING"]).describe("Industry associated with this property Example: AUTOMOTIVE, FOOD_AND_DRINK").optional(),
238
+ name: z.string().describe("Identifier. Resource name of this property. Format: properties/{property_id} Example: \"properties/1000\"").optional(),
239
+ parent: z.string().describe("Immutable. Resource name of this property's logical parent. Note: The Property-Moving UI can be used to change the parent. Format: accounts/{account}, properties/{property} Example: \"accounts/100\", \"p").optional(),
240
+ propertyType: z.enum(["PROPERTY_TYPE_UNSPECIFIED", "PROPERTY_TYPE_ORDINARY", "PROPERTY_TYPE_SUBPROPERTY", "PROPERTY_TYPE_ROLLUP"]).describe("Immutable. The property type for this Property resource. When creating a property, if the type is \"PROPERTY_TYPE_UNSPECIFIED\", then \"ORDINARY_PROPERTY\" will be implied.").optional(),
241
+ serviceLevel: z.enum(["SERVICE_LEVEL_UNSPECIFIED", "GOOGLE_ANALYTICS_STANDARD", "GOOGLE_ANALYTICS_360"]).describe("Output only. The Google Analytics service level that applies to this property.").optional(),
242
+ timeZone: z.string().describe("Required. Reporting Time Zone, used as the day boundary for reports, regardless of where the data originates. If the time zone honors DST, Analytics will automatically adjust for the changes. NOTE: Ch").optional(),
243
+ updateTime: z.string().describe("Output only. Time when entity payload fields were last updated.").optional(),
244
+ fields: z.string().optional().describe('Response field mask.'),
245
+ },
246
+ });
247
+ registerGeneratedTool(registry, {
248
+ name: "analytics_properties_custom_dimensions_archive",
249
+ cud: "delete",
250
+ description: "Archives a CustomDimension on a property.",
251
+ method: { id: "analyticsadmin.properties.customDimensions.archive", httpMethod: "POST", path: "v1beta/{+name}:archive", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
252
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
253
+ hasBody: true,
254
+ bodyParams: [],
255
+ shape: {
256
+ account: accountField(),
257
+ name: z.string().describe("Required. The name of the CustomDimension to archive. Example format: properties/1234/customDimensions/5678"),
258
+ fields: z.string().optional().describe('Response field mask.'),
259
+ },
260
+ });
261
+ registerGeneratedTool(registry, {
262
+ name: "analytics_properties_custom_dimensions_create",
263
+ cud: "create",
264
+ description: "Creates a CustomDimension. Warning: It's not permissible to use this method to collect data on individual users. In particular, sending user IDs in custom dimen",
265
+ method: { id: "analyticsadmin.properties.customDimensions.create", httpMethod: "POST", path: "v1beta/{+parent}/customDimensions", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
266
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
267
+ hasBody: true,
268
+ bodyParams: [{ "field": "description", "api": "description" }, { "field": "disallowAdsPersonalization", "api": "disallowAdsPersonalization" }, { "field": "displayName", "api": "displayName" }, { "field": "name", "api": "name" }, { "field": "parameterName", "api": "parameterName" }, { "field": "scope", "api": "scope" }],
269
+ shape: {
270
+ account: accountField(),
271
+ parent: z.string().describe("Required. Example format: properties/1234"),
272
+ description: z.string().describe("Optional. Description for this custom dimension. Max length of 150 characters.").optional(),
273
+ disallowAdsPersonalization: coerceBoolean.describe("Optional. If set to true, sets this dimension as NPA and excludes it from ads personalization. This is currently only supported by user-scoped custom dimensions.").optional(),
274
+ displayName: z.string().describe("Required. Display name for this custom dimension as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated displ").optional(),
275
+ name: z.string().describe("Identifier. Resource name for this CustomDimension resource. Format: properties/{property}/customDimensions/{customDimension}").optional(),
276
+ parameterName: z.string().describe("Required. Immutable. Tagging parameter name for this custom dimension. If this is a user-scoped dimension, then this is the user property name. If this is an event-scoped dimension, then this is the e").optional(),
277
+ scope: z.enum(["DIMENSION_SCOPE_UNSPECIFIED", "EVENT", "USER", "ITEM"]).describe("Required. Immutable. The scope of this dimension.").optional(),
278
+ fields: z.string().optional().describe('Response field mask.'),
279
+ },
280
+ });
281
+ registerGeneratedTool(registry, {
282
+ name: "analytics_properties_custom_dimensions_get",
283
+ cud: "read",
284
+ description: "Lookup for a single CustomDimension.",
285
+ method: { id: "analyticsadmin.properties.customDimensions.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
286
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
287
+ hasBody: false,
288
+ shape: {
289
+ account: accountField(),
290
+ name: z.string().describe("Required. The name of the CustomDimension to get. Example format: properties/1234/customDimensions/5678"),
291
+ fields: z.string().optional().describe('Response field mask.'),
292
+ },
293
+ });
294
+ registerGeneratedTool(registry, {
295
+ name: "analytics_properties_custom_dimensions_list",
296
+ cud: "read",
297
+ description: "Lists CustomDimensions on a property.",
298
+ method: { id: "analyticsadmin.properties.customDimensions.list", httpMethod: "GET", path: "v1beta/{+parent}/customDimensions", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
299
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
300
+ hasBody: false,
301
+ shape: {
302
+ account: accountField(),
303
+ parent: z.string().describe("Required. Example format: properties/1234"),
304
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200 (higher values will be coerced to the maximum).").optional(),
305
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListCustomDimensions` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListCustomDimensions` mus").optional(),
306
+ fields: z.string().optional().describe('Response field mask.'),
307
+ },
308
+ });
309
+ registerGeneratedTool(registry, {
310
+ name: "analytics_properties_custom_dimensions_patch",
311
+ cud: "update",
312
+ description: "Updates a CustomDimension on a property.",
313
+ method: { id: "analyticsadmin.properties.customDimensions.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
314
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
315
+ hasBody: true,
316
+ bodyParams: [{ "field": "description", "api": "description" }, { "field": "disallowAdsPersonalization", "api": "disallowAdsPersonalization" }, { "field": "displayName", "api": "displayName" }, { "field": "name_", "api": "name" }, { "field": "parameterName", "api": "parameterName" }, { "field": "scope", "api": "scope" }],
317
+ shape: {
318
+ account: accountField(),
319
+ name: z.string().describe("Identifier. Resource name for this CustomDimension resource. Format: properties/{property}/customDimensions/{customDimension}"),
320
+ updateMask: z.string().describe("Required. The list of fields to be updated. Omitted fields will not be updated. To replace the entire entity, use one path with the string \"*\" to match all fields.").optional(),
321
+ description: z.string().describe("Optional. Description for this custom dimension. Max length of 150 characters.").optional(),
322
+ disallowAdsPersonalization: coerceBoolean.describe("Optional. If set to true, sets this dimension as NPA and excludes it from ads personalization. This is currently only supported by user-scoped custom dimensions.").optional(),
323
+ displayName: z.string().describe("Required. Display name for this custom dimension as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated displ").optional(),
324
+ name_: z.string().describe("Identifier. Resource name for this CustomDimension resource. Format: properties/{property}/customDimensions/{customDimension}").optional(),
325
+ parameterName: z.string().describe("Required. Immutable. Tagging parameter name for this custom dimension. If this is a user-scoped dimension, then this is the user property name. If this is an event-scoped dimension, then this is the e").optional(),
326
+ scope: z.enum(["DIMENSION_SCOPE_UNSPECIFIED", "EVENT", "USER", "ITEM"]).describe("Required. Immutable. The scope of this dimension.").optional(),
327
+ fields: z.string().optional().describe('Response field mask.'),
328
+ },
329
+ });
330
+ registerGeneratedTool(registry, {
331
+ name: "analytics_properties_custom_metrics_archive",
332
+ cud: "delete",
333
+ description: "Archives a CustomMetric on a property.",
334
+ method: { id: "analyticsadmin.properties.customMetrics.archive", httpMethod: "POST", path: "v1beta/{+name}:archive", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
335
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
336
+ hasBody: true,
337
+ bodyParams: [],
338
+ shape: {
339
+ account: accountField(),
340
+ name: z.string().describe("Required. The name of the CustomMetric to archive. Example format: properties/1234/customMetrics/5678"),
341
+ fields: z.string().optional().describe('Response field mask.'),
342
+ },
343
+ });
344
+ registerGeneratedTool(registry, {
345
+ name: "analytics_properties_custom_metrics_create",
346
+ cud: "create",
347
+ description: "Creates a CustomMetric.",
348
+ method: { id: "analyticsadmin.properties.customMetrics.create", httpMethod: "POST", path: "v1beta/{+parent}/customMetrics", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
349
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
350
+ hasBody: true,
351
+ bodyParams: [{ "field": "description", "api": "description" }, { "field": "displayName", "api": "displayName" }, { "field": "measurementUnit", "api": "measurementUnit" }, { "field": "name", "api": "name" }, { "field": "parameterName", "api": "parameterName" }, { "field": "restrictedMetricType", "api": "restrictedMetricType" }, { "field": "scope", "api": "scope" }],
352
+ shape: {
353
+ account: accountField(),
354
+ parent: z.string().describe("Required. Example format: properties/1234"),
355
+ description: z.string().describe("Optional. Description for this custom dimension. Max length of 150 characters.").optional(),
356
+ displayName: z.string().describe("Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display ").optional(),
357
+ measurementUnit: z.enum(["MEASUREMENT_UNIT_UNSPECIFIED", "STANDARD", "CURRENCY", "FEET", "METERS", "KILOMETERS", "MILES", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS"]).describe("Required. The type for the custom metric's value.").optional(),
358
+ name: z.string().describe("Identifier. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}").optional(),
359
+ parameterName: z.string().describe("Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting wit").optional(),
360
+ restrictedMetricType: coerceArray(z.enum(["RESTRICTED_METRIC_TYPE_UNSPECIFIED", "COST_DATA", "REVENUE_DATA"])).describe("Optional. Types of restricted data that this metric may contain. Required for metrics with CURRENCY measurement unit. Must be empty for metrics with a non-CURRENCY measurement unit.").optional(),
361
+ scope: z.enum(["METRIC_SCOPE_UNSPECIFIED", "EVENT"]).describe("Required. Immutable. The scope of this custom metric.").optional(),
362
+ fields: z.string().optional().describe('Response field mask.'),
363
+ },
364
+ });
365
+ registerGeneratedTool(registry, {
366
+ name: "analytics_properties_custom_metrics_get",
367
+ cud: "read",
368
+ description: "Lookup for a single CustomMetric.",
369
+ method: { id: "analyticsadmin.properties.customMetrics.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
370
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
371
+ hasBody: false,
372
+ shape: {
373
+ account: accountField(),
374
+ name: z.string().describe("Required. The name of the CustomMetric to get. Example format: properties/1234/customMetrics/5678"),
375
+ fields: z.string().optional().describe('Response field mask.'),
376
+ },
377
+ });
378
+ registerGeneratedTool(registry, {
379
+ name: "analytics_properties_custom_metrics_list",
380
+ cud: "read",
381
+ description: "Lists CustomMetrics on a property.",
382
+ method: { id: "analyticsadmin.properties.customMetrics.list", httpMethod: "GET", path: "v1beta/{+parent}/customMetrics", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
383
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
384
+ hasBody: false,
385
+ shape: {
386
+ account: accountField(),
387
+ parent: z.string().describe("Required. Example format: properties/1234"),
388
+ pageSize: z.number().describe("The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200 (higher values will be coerced to the maximum).").optional(),
389
+ pageToken: z.string().describe("A page token, received from a previous `ListCustomMetrics` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListCustomMetrics` must match the call").optional(),
390
+ fields: z.string().optional().describe('Response field mask.'),
391
+ },
392
+ });
393
+ registerGeneratedTool(registry, {
394
+ name: "analytics_properties_custom_metrics_patch",
395
+ cud: "update",
396
+ description: "Updates a CustomMetric on a property.",
397
+ method: { id: "analyticsadmin.properties.customMetrics.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
398
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
399
+ hasBody: true,
400
+ bodyParams: [{ "field": "description", "api": "description" }, { "field": "displayName", "api": "displayName" }, { "field": "measurementUnit", "api": "measurementUnit" }, { "field": "name_", "api": "name" }, { "field": "parameterName", "api": "parameterName" }, { "field": "restrictedMetricType", "api": "restrictedMetricType" }, { "field": "scope", "api": "scope" }],
401
+ shape: {
402
+ account: accountField(),
403
+ name: z.string().describe("Identifier. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}"),
404
+ updateMask: z.string().describe("Required. The list of fields to be updated. Omitted fields will not be updated. To replace the entire entity, use one path with the string \"*\" to match all fields.").optional(),
405
+ description: z.string().describe("Optional. Description for this custom dimension. Max length of 150 characters.").optional(),
406
+ displayName: z.string().describe("Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display ").optional(),
407
+ measurementUnit: z.enum(["MEASUREMENT_UNIT_UNSPECIFIED", "STANDARD", "CURRENCY", "FEET", "METERS", "KILOMETERS", "MILES", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS"]).describe("Required. The type for the custom metric's value.").optional(),
408
+ name_: z.string().describe("Identifier. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}").optional(),
409
+ parameterName: z.string().describe("Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting wit").optional(),
410
+ restrictedMetricType: coerceArray(z.enum(["RESTRICTED_METRIC_TYPE_UNSPECIFIED", "COST_DATA", "REVENUE_DATA"])).describe("Optional. Types of restricted data that this metric may contain. Required for metrics with CURRENCY measurement unit. Must be empty for metrics with a non-CURRENCY measurement unit.").optional(),
411
+ scope: z.enum(["METRIC_SCOPE_UNSPECIFIED", "EVENT"]).describe("Required. Immutable. The scope of this custom metric.").optional(),
412
+ fields: z.string().optional().describe('Response field mask.'),
413
+ },
414
+ });
415
+ registerGeneratedTool(registry, {
416
+ name: "analytics_properties_data_streams_create",
417
+ cud: "create",
418
+ description: "Creates a DataStream.",
419
+ method: { id: "analyticsadmin.properties.dataStreams.create", httpMethod: "POST", path: "v1beta/{+parent}/dataStreams", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
420
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
421
+ hasBody: true,
422
+ shape: {
423
+ account: accountField(),
424
+ parent: z.string().describe("Required. Example format: properties/1234"),
425
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaDataStream JSON request body. Top-level fields: androidAppStreamData, createTime, displayName, iosAppStreamData, name, type, updateTime, webStreamData."),
426
+ fields: z.string().optional().describe('Response field mask.'),
427
+ },
428
+ });
429
+ registerGeneratedTool(registry, {
430
+ name: "analytics_properties_data_streams_delete",
431
+ cud: "delete",
432
+ description: "Deletes a DataStream on a property.",
433
+ method: { id: "analyticsadmin.properties.dataStreams.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
434
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
435
+ hasBody: false,
436
+ shape: {
437
+ account: accountField(),
438
+ name: z.string().describe("Required. The name of the DataStream to delete. Example format: properties/1234/dataStreams/5678"),
439
+ fields: z.string().optional().describe('Response field mask.'),
440
+ },
441
+ });
442
+ registerGeneratedTool(registry, {
443
+ name: "analytics_properties_data_streams_get",
444
+ cud: "read",
445
+ description: "Lookup for a single DataStream.",
446
+ method: { id: "analyticsadmin.properties.dataStreams.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
447
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
448
+ hasBody: false,
449
+ shape: {
450
+ account: accountField(),
451
+ name: z.string().describe("Required. The name of the DataStream to get. Example format: properties/1234/dataStreams/5678"),
452
+ fields: z.string().optional().describe('Response field mask.'),
453
+ },
454
+ });
455
+ registerGeneratedTool(registry, {
456
+ name: "analytics_properties_data_streams_list",
457
+ cud: "read",
458
+ description: "Lists DataStreams on a property.",
459
+ method: { id: "analyticsadmin.properties.dataStreams.list", httpMethod: "GET", path: "v1beta/{+parent}/dataStreams", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
460
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
461
+ hasBody: false,
462
+ shape: {
463
+ account: accountField(),
464
+ parent: z.string().describe("Required. Example format: properties/1234"),
465
+ pageSize: z.number().describe("The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200 (higher values will be coerced to the maximum).").optional(),
466
+ pageToken: z.string().describe("A page token, received from a previous `ListDataStreams` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListDataStreams` must match the call tha").optional(),
467
+ fields: z.string().optional().describe('Response field mask.'),
468
+ },
469
+ });
470
+ registerGeneratedTool(registry, {
471
+ name: "analytics_data_streams_measurement_protocol_secrets_create",
472
+ cud: "create",
473
+ description: "Creates a measurement protocol secret.",
474
+ method: { id: "analyticsadmin.properties.dataStreams.measurementProtocolSecrets.create", httpMethod: "POST", path: "v1beta/{+parent}/measurementProtocolSecrets", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
475
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
476
+ hasBody: true,
477
+ bodyParams: [{ "field": "displayName", "api": "displayName" }, { "field": "name", "api": "name" }, { "field": "secretValue", "api": "secretValue" }],
478
+ shape: {
479
+ account: accountField(),
480
+ parent: z.string().describe("Required. The parent resource where this secret will be created. Format: properties/{property}/dataStreams/{dataStream}"),
481
+ displayName: z.string().describe("Required. Human-readable display name for this secret.").optional(),
482
+ name: z.string().describe("Identifier. Resource name of this secret. This secret may be a child of any type of stream. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret").optional(),
483
+ secretValue: z.string().describe("Output only. The measurement protocol secret value. Pass this value to the api_secret field of the Measurement Protocol API when sending hits to this secret's parent property.").optional(),
484
+ fields: z.string().optional().describe('Response field mask.'),
485
+ },
486
+ });
487
+ registerGeneratedTool(registry, {
488
+ name: "analytics_data_streams_measurement_protocol_secrets_delete",
489
+ cud: "delete",
490
+ description: "Deletes target MeasurementProtocolSecret.",
491
+ method: { id: "analyticsadmin.properties.dataStreams.measurementProtocolSecrets.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
492
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
493
+ hasBody: false,
494
+ shape: {
495
+ account: accountField(),
496
+ name: z.string().describe("Required. The name of the MeasurementProtocolSecret to delete. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret}"),
497
+ fields: z.string().optional().describe('Response field mask.'),
498
+ },
499
+ });
500
+ registerGeneratedTool(registry, {
501
+ name: "analytics_data_streams_measurement_protocol_secrets_get",
502
+ cud: "read",
503
+ description: "Lookup for a single MeasurementProtocolSecret.",
504
+ method: { id: "analyticsadmin.properties.dataStreams.measurementProtocolSecrets.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
505
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
506
+ hasBody: false,
507
+ shape: {
508
+ account: accountField(),
509
+ name: z.string().describe("Required. The name of the measurement protocol secret to lookup. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret}"),
510
+ fields: z.string().optional().describe('Response field mask.'),
511
+ },
512
+ });
513
+ registerGeneratedTool(registry, {
514
+ name: "analytics_data_streams_measurement_protocol_secrets_list",
515
+ cud: "read",
516
+ description: "Returns child MeasurementProtocolSecrets under the specified parent Property.",
517
+ method: { id: "analyticsadmin.properties.dataStreams.measurementProtocolSecrets.list", httpMethod: "GET", path: "v1beta/{+parent}/measurementProtocolSecrets", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
518
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
519
+ hasBody: false,
520
+ shape: {
521
+ account: accountField(),
522
+ parent: z.string().describe("Required. The resource name of the parent stream. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets"),
523
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. If unspecified, at most 10 resources will be returned. The maximum value is 10. Higher values will be coerced to the maximum.").optional(),
524
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListMeasurementProtocolSecrets` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListMeasurement").optional(),
525
+ fields: z.string().optional().describe('Response field mask.'),
526
+ },
527
+ });
528
+ registerGeneratedTool(registry, {
529
+ name: "analytics_data_streams_measurement_protocol_secrets_patch",
530
+ cud: "update",
531
+ description: "Updates a measurement protocol secret.",
532
+ method: { id: "analyticsadmin.properties.dataStreams.measurementProtocolSecrets.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
533
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
534
+ hasBody: true,
535
+ bodyParams: [{ "field": "displayName", "api": "displayName" }, { "field": "name_", "api": "name" }, { "field": "secretValue", "api": "secretValue" }],
536
+ shape: {
537
+ account: accountField(),
538
+ name: z.string().describe("Identifier. Resource name of this secret. This secret may be a child of any type of stream. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret"),
539
+ updateMask: z.string().describe("Required. The list of fields to be updated. Omitted fields will not be updated.").optional(),
540
+ displayName: z.string().describe("Required. Human-readable display name for this secret.").optional(),
541
+ name_: z.string().describe("Identifier. Resource name of this secret. This secret may be a child of any type of stream. Format: properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret").optional(),
542
+ secretValue: z.string().describe("Output only. The measurement protocol secret value. Pass this value to the api_secret field of the Measurement Protocol API when sending hits to this secret's parent property.").optional(),
543
+ fields: z.string().optional().describe('Response field mask.'),
544
+ },
545
+ });
546
+ registerGeneratedTool(registry, {
547
+ name: "analytics_properties_data_streams_patch",
548
+ cud: "update",
549
+ description: "Updates a DataStream on a property.",
550
+ method: { id: "analyticsadmin.properties.dataStreams.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
551
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
552
+ hasBody: true,
553
+ shape: {
554
+ account: accountField(),
555
+ name: z.string().describe("Identifier. Resource name of this Data Stream. Format: properties/{property_id}/dataStreams/{stream_id} Example: \"properties/1000/dataStreams/2000\""),
556
+ updateMask: z.string().describe("Required. The list of fields to be updated. Omitted fields will not be updated. To replace the entire entity, use one path with the string \"*\" to match all fields.").optional(),
557
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaDataStream JSON request body. Top-level fields: androidAppStreamData, createTime, displayName, iosAppStreamData, name, type, updateTime, webStreamData."),
558
+ fields: z.string().optional().describe('Response field mask.'),
559
+ },
560
+ });
561
+ registerGeneratedTool(registry, {
562
+ name: "analytics_properties_delete",
563
+ cud: "delete",
564
+ description: "Marks target Property as soft-deleted (ie: \"trashed\") and returns it. This API does not have a method to restore soft-deleted properties. However, they can be r",
565
+ method: { id: "analyticsadmin.properties.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
566
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
567
+ hasBody: false,
568
+ shape: {
569
+ account: accountField(),
570
+ name: z.string().describe("Required. The name of the Property to soft-delete. Format: properties/{property_id} Example: \"properties/1000\""),
571
+ fields: z.string().optional().describe('Response field mask.'),
572
+ },
573
+ });
574
+ registerGeneratedTool(registry, {
575
+ name: "analytics_properties_firebase_links_create",
576
+ cud: "create",
577
+ description: "Creates a FirebaseLink. Properties can have at most one FirebaseLink.",
578
+ method: { id: "analyticsadmin.properties.firebaseLinks.create", httpMethod: "POST", path: "v1beta/{+parent}/firebaseLinks", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
579
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
580
+ hasBody: true,
581
+ bodyParams: [{ "field": "createTime", "api": "createTime" }, { "field": "name", "api": "name" }, { "field": "project", "api": "project" }],
582
+ shape: {
583
+ account: accountField(),
584
+ parent: z.string().describe("Required. Format: properties/{property_id} Example: `properties/1234`"),
585
+ createTime: z.string().describe("Output only. Time when this FirebaseLink was originally created.").optional(),
586
+ name: z.string().describe("Identifier. Example format: properties/1234/firebaseLinks/5678").optional(),
587
+ project: z.string().describe("Immutable. Firebase project resource name. When creating a FirebaseLink, you may provide this resource name using either a project number or project ID. Once this resource has been created, returned F").optional(),
588
+ fields: z.string().optional().describe('Response field mask.'),
589
+ },
590
+ });
591
+ registerGeneratedTool(registry, {
592
+ name: "analytics_properties_firebase_links_delete",
593
+ cud: "delete",
594
+ description: "Deletes a FirebaseLink on a property",
595
+ method: { id: "analyticsadmin.properties.firebaseLinks.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
596
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
597
+ hasBody: false,
598
+ shape: {
599
+ account: accountField(),
600
+ name: z.string().describe("Required. Format: properties/{property_id}/firebaseLinks/{firebase_link_id} Example: `properties/1234/firebaseLinks/5678`"),
601
+ fields: z.string().optional().describe('Response field mask.'),
602
+ },
603
+ });
604
+ registerGeneratedTool(registry, {
605
+ name: "analytics_properties_firebase_links_list",
606
+ cud: "read",
607
+ description: "Lists FirebaseLinks on a property. Properties can have at most one FirebaseLink.",
608
+ method: { id: "analyticsadmin.properties.firebaseLinks.list", httpMethod: "GET", path: "v1beta/{+parent}/firebaseLinks", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
609
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
610
+ hasBody: false,
611
+ shape: {
612
+ account: accountField(),
613
+ parent: z.string().describe("Required. Format: properties/{property_id} Example: `properties/1234`"),
614
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. The service may return fewer than this value, even if there are additional pages. If unspecified, at most 50 resources will be returned. The maximu").optional(),
615
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListFirebaseLinks` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListFirebaseLinks` must matc").optional(),
616
+ fields: z.string().optional().describe('Response field mask.'),
617
+ },
618
+ });
619
+ registerGeneratedTool(registry, {
620
+ name: "analytics_properties_get",
621
+ cud: "read",
622
+ description: "Lookup for a single GA Property.",
623
+ method: { id: "analyticsadmin.properties.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
624
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
625
+ hasBody: false,
626
+ shape: {
627
+ account: accountField(),
628
+ name: z.string().describe("Required. The name of the property to lookup. Format: properties/{property_id} Example: \"properties/1000\""),
629
+ fields: z.string().optional().describe('Response field mask.'),
630
+ },
631
+ });
632
+ registerGeneratedTool(registry, {
633
+ name: "analytics_properties_get_data_retention_settings",
634
+ cud: "read",
635
+ description: "Returns the singleton data retention settings for this property.",
636
+ method: { id: "analyticsadmin.properties.getDataRetentionSettings", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
637
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
638
+ hasBody: false,
639
+ shape: {
640
+ account: accountField(),
641
+ name: z.string().describe("Required. The name of the settings to lookup. Format: properties/{property}/dataRetentionSettings Example: \"properties/1000/dataRetentionSettings\""),
642
+ fields: z.string().optional().describe('Response field mask.'),
643
+ },
644
+ });
645
+ registerGeneratedTool(registry, {
646
+ name: "analytics_properties_google_ads_links_create",
647
+ cud: "create",
648
+ description: "Creates a GoogleAdsLink.",
649
+ method: { id: "analyticsadmin.properties.googleAdsLinks.create", httpMethod: "POST", path: "v1beta/{+parent}/googleAdsLinks", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
650
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
651
+ hasBody: true,
652
+ bodyParams: [{ "field": "adsPersonalizationEnabled", "api": "adsPersonalizationEnabled" }, { "field": "canManageClients", "api": "canManageClients" }, { "field": "createTime", "api": "createTime" }, { "field": "creatorEmailAddress", "api": "creatorEmailAddress" }, { "field": "customerId", "api": "customerId" }, { "field": "name", "api": "name" }, { "field": "updateTime", "api": "updateTime" }],
653
+ shape: {
654
+ account: accountField(),
655
+ parent: z.string().describe("Required. Example format: properties/1234"),
656
+ adsPersonalizationEnabled: coerceBoolean.describe("Enable personalized advertising features with this integration. Automatically publish my Google Analytics audience lists and Google Analytics remarketing events/parameters to the linked Google Ads acc").optional(),
657
+ canManageClients: coerceBoolean.describe("Output only. If true, this link is for a Google Ads manager account.").optional(),
658
+ createTime: z.string().describe("Output only. Time when this link was originally created.").optional(),
659
+ creatorEmailAddress: z.string().describe("Output only. Email address of the user that created the link. An empty string will be returned if the email address can't be retrieved.").optional(),
660
+ customerId: z.string().describe("Immutable. Google Ads customer ID.").optional(),
661
+ name: z.string().describe("Identifier. Format: properties/{propertyId}/googleAdsLinks/{googleAdsLinkId} Note: googleAdsLinkId is not the Google Ads customer ID.").optional(),
662
+ updateTime: z.string().describe("Output only. Time when this link was last updated.").optional(),
663
+ fields: z.string().optional().describe('Response field mask.'),
664
+ },
665
+ });
666
+ registerGeneratedTool(registry, {
667
+ name: "analytics_properties_google_ads_links_delete",
668
+ cud: "delete",
669
+ description: "Deletes a GoogleAdsLink on a property",
670
+ method: { id: "analyticsadmin.properties.googleAdsLinks.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
671
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
672
+ hasBody: false,
673
+ shape: {
674
+ account: accountField(),
675
+ name: z.string().describe("Required. Example format: properties/1234/googleAdsLinks/5678"),
676
+ fields: z.string().optional().describe('Response field mask.'),
677
+ },
678
+ });
679
+ registerGeneratedTool(registry, {
680
+ name: "analytics_properties_google_ads_links_list",
681
+ cud: "read",
682
+ description: "Lists GoogleAdsLinks on a property.",
683
+ method: { id: "analyticsadmin.properties.googleAdsLinks.list", httpMethod: "GET", path: "v1beta/{+parent}/googleAdsLinks", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
684
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
685
+ hasBody: false,
686
+ shape: {
687
+ account: accountField(),
688
+ parent: z.string().describe("Required. Example format: properties/1234"),
689
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200 (higher values will be coerced to the maximum).").optional(),
690
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListGoogleAdsLinks` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListGoogleAdsLinks` must ma").optional(),
691
+ fields: z.string().optional().describe('Response field mask.'),
692
+ },
693
+ });
694
+ registerGeneratedTool(registry, {
695
+ name: "analytics_properties_google_ads_links_patch",
696
+ cud: "update",
697
+ description: "Updates a GoogleAdsLink on a property",
698
+ method: { id: "analyticsadmin.properties.googleAdsLinks.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
699
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
700
+ hasBody: true,
701
+ bodyParams: [{ "field": "adsPersonalizationEnabled", "api": "adsPersonalizationEnabled" }, { "field": "canManageClients", "api": "canManageClients" }, { "field": "createTime", "api": "createTime" }, { "field": "creatorEmailAddress", "api": "creatorEmailAddress" }, { "field": "customerId", "api": "customerId" }, { "field": "name_", "api": "name" }, { "field": "updateTime", "api": "updateTime" }],
702
+ shape: {
703
+ account: accountField(),
704
+ name: z.string().describe("Identifier. Format: properties/{propertyId}/googleAdsLinks/{googleAdsLinkId} Note: googleAdsLinkId is not the Google Ads customer ID."),
705
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (e.g., \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the string ").optional(),
706
+ adsPersonalizationEnabled: coerceBoolean.describe("Enable personalized advertising features with this integration. Automatically publish my Google Analytics audience lists and Google Analytics remarketing events/parameters to the linked Google Ads acc").optional(),
707
+ canManageClients: coerceBoolean.describe("Output only. If true, this link is for a Google Ads manager account.").optional(),
708
+ createTime: z.string().describe("Output only. Time when this link was originally created.").optional(),
709
+ creatorEmailAddress: z.string().describe("Output only. Email address of the user that created the link. An empty string will be returned if the email address can't be retrieved.").optional(),
710
+ customerId: z.string().describe("Immutable. Google Ads customer ID.").optional(),
711
+ name_: z.string().describe("Identifier. Format: properties/{propertyId}/googleAdsLinks/{googleAdsLinkId} Note: googleAdsLinkId is not the Google Ads customer ID.").optional(),
712
+ updateTime: z.string().describe("Output only. Time when this link was last updated.").optional(),
713
+ fields: z.string().optional().describe('Response field mask.'),
714
+ },
715
+ });
716
+ registerGeneratedTool(registry, {
717
+ name: "analytics_properties_key_events_create",
718
+ cud: "create",
719
+ description: "Creates a Key Event.",
720
+ method: { id: "analyticsadmin.properties.keyEvents.create", httpMethod: "POST", path: "v1beta/{+parent}/keyEvents", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[0] },
721
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
722
+ hasBody: true,
723
+ shape: {
724
+ account: accountField(),
725
+ parent: z.string().describe("Required. The resource name of the parent property where this Key Event will be created. Format: properties/123"),
726
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaKeyEvent JSON request body. Top-level fields: countingMethod, createTime, custom, defaultValue, deletable, eventName, name."),
727
+ fields: z.string().optional().describe('Response field mask.'),
728
+ },
729
+ });
730
+ registerGeneratedTool(registry, {
731
+ name: "analytics_properties_key_events_delete",
732
+ cud: "delete",
733
+ description: "Deletes a Key Event.",
734
+ method: { id: "analyticsadmin.properties.keyEvents.delete", httpMethod: "DELETE", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
735
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
736
+ hasBody: false,
737
+ shape: {
738
+ account: accountField(),
739
+ name: z.string().describe("Required. The resource name of the Key Event to delete. Format: properties/{property}/keyEvents/{key_event} Example: \"properties/123/keyEvents/456\""),
740
+ fields: z.string().optional().describe('Response field mask.'),
741
+ },
742
+ });
743
+ registerGeneratedTool(registry, {
744
+ name: "analytics_properties_key_events_get",
745
+ cud: "read",
746
+ description: "Retrieves a single Key Event.",
747
+ method: { id: "analyticsadmin.properties.keyEvents.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[1] },
748
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
749
+ hasBody: false,
750
+ shape: {
751
+ account: accountField(),
752
+ name: z.string().describe("Required. The resource name of the Key Event to retrieve. Format: properties/{property}/keyEvents/{key_event} Example: \"properties/123/keyEvents/456\""),
753
+ fields: z.string().optional().describe('Response field mask.'),
754
+ },
755
+ });
756
+ registerGeneratedTool(registry, {
757
+ name: "analytics_properties_key_events_list",
758
+ cud: "read",
759
+ description: "Returns a list of Key Events in the specified parent property. Returns an empty list if no Key Events are found.",
760
+ method: { id: "analyticsadmin.properties.keyEvents.list", httpMethod: "GET", path: "v1beta/{+parent}/keyEvents", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsadmin_v1beta[1] },
761
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
762
+ hasBody: false,
763
+ shape: {
764
+ account: accountField(),
765
+ parent: z.string().describe("Required. The resource name of the parent property. Example: 'properties/123'"),
766
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. If unspecified, at most 50 resources will be returned. The maximum value is 200; (higher values will be coerced to the maximum)").optional(),
767
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListKeyEvents` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListKeyEvents` must match the ca").optional(),
768
+ fields: z.string().optional().describe('Response field mask.'),
769
+ },
770
+ });
771
+ registerGeneratedTool(registry, {
772
+ name: "analytics_properties_key_events_patch",
773
+ cud: "update",
774
+ description: "Updates a Key Event.",
775
+ method: { id: "analyticsadmin.properties.keyEvents.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
776
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
777
+ hasBody: true,
778
+ shape: {
779
+ account: accountField(),
780
+ name: z.string().describe("Output only. Resource name of this key event. Format: properties/{property}/keyEvents/{key_event}"),
781
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (e.g., \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the string ").optional(),
782
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaKeyEvent JSON request body. Top-level fields: countingMethod, createTime, custom, defaultValue, deletable, eventName, name."),
783
+ fields: z.string().optional().describe('Response field mask.'),
784
+ },
785
+ });
786
+ registerGeneratedTool(registry, {
787
+ name: "analytics_properties_list",
788
+ cud: "read",
789
+ description: "Returns child Properties under the specified parent Account. Properties will be excluded if the caller does not have access. Soft-deleted (ie: \"trashed\") proper",
790
+ method: { id: "analyticsadmin.properties.list", httpMethod: "GET", path: "v1beta/properties", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: [], scopes: S_analyticsadmin_v1beta[1] },
791
+ params: [{ "field": "filter", "api": "filter", "location": "query" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "showDeleted", "api": "showDeleted", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
792
+ hasBody: false,
793
+ shape: {
794
+ account: accountField(),
795
+ filter: z.string().describe("Required. An expression for filtering the results of the request. Fields eligible for filtering are: `parent:`(The resource name of the parent account/property) or `ancestor:`(The resource name of the").optional(),
796
+ pageSize: z.number().describe("Optional. The maximum number of resources to return. The service may return fewer than this value, even if there are additional pages. If unspecified, at most 50 resources will be returned. The maximu").optional(),
797
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListProperties` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListProperties` must match the ").optional(),
798
+ showDeleted: coerceBoolean.describe("Whether to include soft-deleted (ie: \"trashed\") Properties in the results. Properties can be inspected to determine whether they are deleted or not.").optional(),
799
+ fields: z.string().optional().describe('Response field mask.'),
800
+ },
801
+ });
802
+ registerGeneratedTool(registry, {
803
+ name: "analytics_properties_patch",
804
+ cud: "update",
805
+ description: "Updates a property.",
806
+ method: { id: "analyticsadmin.properties.patch", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
807
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
808
+ hasBody: true,
809
+ bodyParams: [{ "field": "account_", "api": "account" }, { "field": "createTime", "api": "createTime" }, { "field": "currencyCode", "api": "currencyCode" }, { "field": "deleteTime", "api": "deleteTime" }, { "field": "displayName", "api": "displayName" }, { "field": "expireTime", "api": "expireTime" }, { "field": "industryCategory", "api": "industryCategory" }, { "field": "name_", "api": "name" }, { "field": "parent", "api": "parent" }, { "field": "propertyType", "api": "propertyType" }, { "field": "serviceLevel", "api": "serviceLevel" }, { "field": "timeZone", "api": "timeZone" }, { "field": "updateTime", "api": "updateTime" }],
810
+ shape: {
811
+ account: accountField(),
812
+ name: z.string().describe("Identifier. Resource name of this property. Format: properties/{property_id} Example: \"properties/1000\""),
813
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (e.g., \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the string ").optional(),
814
+ account_: z.string().describe("Immutable. The resource name of the parent account Format: accounts/{account_id} Example: \"accounts/123\"").optional(),
815
+ createTime: z.string().describe("Output only. Time when the entity was originally created.").optional(),
816
+ currencyCode: z.string().describe("The currency type used in reports involving monetary values. Format: https://en.wikipedia.org/wiki/ISO_4217 Examples: \"USD\", \"EUR\", \"JPY\"").optional(),
817
+ deleteTime: z.string().describe("Output only. If set, the time at which this property was trashed. If not set, then this property is not currently in the trash can.").optional(),
818
+ displayName: z.string().describe("Required. Human-readable display name for this property. The max allowed display name length is 100 UTF-16 code units.").optional(),
819
+ expireTime: z.string().describe("Output only. If set, the time at which this trashed property will be permanently deleted. If not set, then this property is not currently in the trash can and is not slated to be deleted.").optional(),
820
+ industryCategory: z.enum(["INDUSTRY_CATEGORY_UNSPECIFIED", "AUTOMOTIVE", "BUSINESS_AND_INDUSTRIAL_MARKETS", "FINANCE", "HEALTHCARE", "TECHNOLOGY", "TRAVEL", "OTHER", "ARTS_AND_ENTERTAINMENT", "BEAUTY_AND_FITNESS", "BOOKS_AND_LITERATURE", "FOOD_AND_DRINK", "GAMES", "HOBBIES_AND_LEISURE", "HOME_AND_GARDEN", "INTERNET_AND_TELECOM", "LAW_AND_GOVERNMENT", "NEWS", "ONLINE_COMMUNITIES", "PEOPLE_AND_SOCIETY", "PETS_AND_ANIMALS", "REAL_ESTATE", "REFERENCE", "SCIENCE", "SPORTS", "JOBS_AND_EDUCATION", "SHOPPING"]).describe("Industry associated with this property Example: AUTOMOTIVE, FOOD_AND_DRINK").optional(),
821
+ name_: z.string().describe("Identifier. Resource name of this property. Format: properties/{property_id} Example: \"properties/1000\"").optional(),
822
+ parent: z.string().describe("Immutable. Resource name of this property's logical parent. Note: The Property-Moving UI can be used to change the parent. Format: accounts/{account}, properties/{property} Example: \"accounts/100\", \"p").optional(),
823
+ propertyType: z.enum(["PROPERTY_TYPE_UNSPECIFIED", "PROPERTY_TYPE_ORDINARY", "PROPERTY_TYPE_SUBPROPERTY", "PROPERTY_TYPE_ROLLUP"]).describe("Immutable. The property type for this Property resource. When creating a property, if the type is \"PROPERTY_TYPE_UNSPECIFIED\", then \"ORDINARY_PROPERTY\" will be implied.").optional(),
824
+ serviceLevel: z.enum(["SERVICE_LEVEL_UNSPECIFIED", "GOOGLE_ANALYTICS_STANDARD", "GOOGLE_ANALYTICS_360"]).describe("Output only. The Google Analytics service level that applies to this property.").optional(),
825
+ timeZone: z.string().describe("Required. Reporting Time Zone, used as the day boundary for reports, regardless of where the data originates. If the time zone honors DST, Analytics will automatically adjust for the changes. NOTE: Ch").optional(),
826
+ updateTime: z.string().describe("Output only. Time when entity payload fields were last updated.").optional(),
827
+ fields: z.string().optional().describe('Response field mask.'),
828
+ },
829
+ });
830
+ registerGeneratedTool(registry, {
831
+ name: "analytics_properties_run_access_report",
832
+ cud: "read",
833
+ description: "Returns a customized report of data access records. The report provides records of each time a user reads Google Analytics reporting data. Access records are re",
834
+ method: { id: "analyticsadmin.properties.runAccessReport", httpMethod: "POST", path: "v1beta/{+entity}:runAccessReport", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["entity"], scopes: S_analyticsadmin_v1beta[1] },
835
+ params: [{ "field": "entity", "api": "entity", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
836
+ hasBody: true,
837
+ shape: {
838
+ account: accountField(),
839
+ entity: z.string().describe("The Data Access Report supports requesting at the property level or account level. If requested at the account level, Data Access Reports include all access for all properties under that account. To r"),
840
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("GoogleAnalyticsAdminV1betaRunAccessReportRequest JSON request body. Top-level fields: dateRanges, dimensionFilter, dimensions, expandGroups, includeAllUsers, limit, metricFilter, metrics, offset, orderBys, returnEntityQuota, timeZone."),
841
+ fields: z.string().optional().describe('Response field mask.'),
842
+ },
843
+ });
844
+ registerGeneratedTool(registry, {
845
+ name: "analytics_properties_update_data_retention_settings",
846
+ cud: "update",
847
+ description: "Updates the singleton data retention settings for this property.",
848
+ method: { id: "analyticsadmin.properties.updateDataRetentionSettings", httpMethod: "PATCH", path: "v1beta/{+name}", baseUrl: "https://analyticsadmin.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsadmin_v1beta[0] },
849
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "updateMask", "api": "updateMask", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
850
+ hasBody: true,
851
+ bodyParams: [{ "field": "eventDataRetention", "api": "eventDataRetention" }, { "field": "name_", "api": "name" }, { "field": "resetUserDataOnNewActivity", "api": "resetUserDataOnNewActivity" }, { "field": "userDataRetention", "api": "userDataRetention" }],
852
+ shape: {
853
+ account: accountField(),
854
+ name: z.string().describe("Identifier. Resource name for this DataRetentionSetting resource. Format: properties/{property}/dataRetentionSettings"),
855
+ updateMask: z.string().describe("Required. The list of fields to be updated. Field names must be in snake case (e.g., \"field_to_update\"). Omitted fields will not be updated. To replace the entire entity, use one path with the string ").optional(),
856
+ eventDataRetention: z.enum(["RETENTION_DURATION_UNSPECIFIED", "TWO_MONTHS", "FOURTEEN_MONTHS", "TWENTY_SIX_MONTHS", "THIRTY_EIGHT_MONTHS", "FIFTY_MONTHS"]).describe("Required. The length of time that event-level data is retained.").optional(),
857
+ name_: z.string().describe("Identifier. Resource name for this DataRetentionSetting resource. Format: properties/{property}/dataRetentionSettings").optional(),
858
+ resetUserDataOnNewActivity: coerceBoolean.describe("If true, reset the retention period for the user identifier with every event from that user.").optional(),
859
+ userDataRetention: z.enum(["RETENTION_DURATION_UNSPECIFIED", "TWO_MONTHS", "FOURTEEN_MONTHS", "TWENTY_SIX_MONTHS", "THIRTY_EIGHT_MONTHS", "FIFTY_MONTHS"]).describe("Required. The length of time that user-level data is retained.").optional(),
860
+ fields: z.string().optional().describe('Response field mask.'),
861
+ },
862
+ });
863
+ // Interned method scope sets (shared across tools; see scope-observability).
864
+ const S_analyticsdata_v1beta = [
865
+ ["https://www.googleapis.com/auth/analytics", "https://www.googleapis.com/auth/analytics.readonly"],
866
+ ];
867
+ registerGeneratedTool(registry, {
868
+ name: "analytics_properties_audience_exports_create",
869
+ cud: "create",
870
+ description: "Creates an audience export for later retrieval. This method quickly returns the audience export's resource name and initiates a long running asynchronous reques",
871
+ method: { id: "analyticsdata.properties.audienceExports.create", httpMethod: "POST", path: "v1beta/{+parent}/audienceExports", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsdata_v1beta[0] },
872
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
873
+ hasBody: true,
874
+ shape: {
875
+ account: accountField(),
876
+ parent: z.string().describe("Required. The parent resource where this audience export will be created. Format: `properties/{property}`"),
877
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("AudienceExport JSON request body. Top-level fields: audience, audienceDisplayName, beginCreatingTime, creationQuotaTokensCharged, dimensions, errorMessage, name, percentageCompleted, rowCount, state."),
878
+ fields: z.string().optional().describe('Response field mask.'),
879
+ },
880
+ });
881
+ registerGeneratedTool(registry, {
882
+ name: "analytics_properties_audience_exports_get",
883
+ cud: "read",
884
+ description: "Gets configuration metadata about a specific audience export. This method can be used to understand an audience export after it has been created. See [Creating",
885
+ method: { id: "analyticsdata.properties.audienceExports.get", httpMethod: "GET", path: "v1beta/{+name}", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsdata_v1beta[0] },
886
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
887
+ hasBody: false,
888
+ shape: {
889
+ account: accountField(),
890
+ name: z.string().describe("Required. The audience export resource name. Format: `properties/{property}/audienceExports/{audience_export}`"),
891
+ fields: z.string().optional().describe('Response field mask.'),
892
+ },
893
+ });
894
+ registerGeneratedTool(registry, {
895
+ name: "analytics_properties_audience_exports_list",
896
+ cud: "read",
897
+ description: "Lists all audience exports for a property. This method can be used for you to find and reuse existing audience exports rather than creating unnecessary new audi",
898
+ method: { id: "analyticsdata.properties.audienceExports.list", httpMethod: "GET", path: "v1beta/{+parent}/audienceExports", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["parent"], scopes: S_analyticsdata_v1beta[0] },
899
+ params: [{ "field": "parent", "api": "parent", "location": "path" }, { "field": "pageSize", "api": "pageSize", "location": "query" }, { "field": "pageToken", "api": "pageToken", "location": "query" }, { "field": "fields", "api": "fields", "location": "query" }],
900
+ hasBody: false,
901
+ shape: {
902
+ account: accountField(),
903
+ parent: z.string().describe("Required. All audience exports for this property will be listed in the response. Format: `properties/{property}`"),
904
+ pageSize: z.number().describe("Optional. The maximum number of audience exports to return. The service may return fewer than this value. If unspecified, at most 200 audience exports will be returned. The maximum value is 1000 (high").optional(),
905
+ pageToken: z.string().describe("Optional. A page token, received from a previous `ListAudienceExports` call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to `ListAudienceExports` must ").optional(),
906
+ fields: z.string().optional().describe('Response field mask.'),
907
+ },
908
+ });
909
+ registerGeneratedTool(registry, {
910
+ name: "analytics_properties_audience_exports_query",
911
+ cud: "read",
912
+ description: "Retrieves an audience export of users. After creating an audience, the users are not immediately available for exporting. First, a request to `CreateAudienceExp",
913
+ method: { id: "analyticsdata.properties.audienceExports.query", httpMethod: "POST", path: "v1beta/{+name}:query", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["name"], scopes: S_analyticsdata_v1beta[0] },
914
+ params: [{ "field": "name", "api": "name", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
915
+ hasBody: true,
916
+ bodyParams: [{ "field": "limit", "api": "limit" }, { "field": "offset", "api": "offset" }],
917
+ shape: {
918
+ account: accountField(),
919
+ name: z.string().describe("Required. The name of the audience export to retrieve users from. Format: `properties/{property}/audienceExports/{audience_export}`"),
920
+ limit: z.string().describe("Optional. The number of rows to return. If unspecified, 10,000 rows are returned. The API returns a maximum of 250,000 rows per request, no matter how many you ask for. `limit` must be positive. The A").optional(),
921
+ offset: z.string().describe("Optional. The row count of the start row. The first row is counted as row 0. When paging, the first request does not specify offset; or equivalently, sets offset to 0; the first request returns the fi").optional(),
922
+ fields: z.string().optional().describe('Response field mask.'),
923
+ },
924
+ });
925
+ registerGeneratedTool(registry, {
926
+ name: "analytics_properties_batch_run_pivot_reports",
927
+ cud: "read",
928
+ description: "Returns multiple pivot reports in a batch. All reports must be for the same Google Analytics property.",
929
+ method: { id: "analyticsdata.properties.batchRunPivotReports", httpMethod: "POST", path: "v1beta/{+property}:batchRunPivotReports", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["property"], scopes: S_analyticsdata_v1beta[0] },
930
+ params: [{ "field": "property", "api": "property", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
931
+ hasBody: true,
932
+ shape: {
933
+ account: accountField(),
934
+ property: z.string().describe("A Google Analytics property identifier whose events are tracked. Specified in the URL path and not the body. To learn more, see [where to find your Property ID](https://developers.google.com/analytics"),
935
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("BatchRunPivotReportsRequest JSON request body. Top-level fields: requests."),
936
+ fields: z.string().optional().describe('Response field mask.'),
937
+ },
938
+ });
939
+ registerGeneratedTool(registry, {
940
+ name: "analytics_properties_batch_run_reports",
941
+ cud: "read",
942
+ description: "Returns multiple reports in a batch. All reports must be for the same Google Analytics property.",
943
+ method: { id: "analyticsdata.properties.batchRunReports", httpMethod: "POST", path: "v1beta/{+property}:batchRunReports", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["property"], scopes: S_analyticsdata_v1beta[0] },
944
+ params: [{ "field": "property", "api": "property", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
945
+ hasBody: true,
946
+ shape: {
947
+ account: accountField(),
948
+ property: z.string().describe("A Google Analytics property identifier whose events are tracked. Specified in the URL path and not the body. To learn more, see [where to find your Property ID](https://developers.google.com/analytics"),
949
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("BatchRunReportsRequest JSON request body. Top-level fields: requests."),
950
+ fields: z.string().optional().describe('Response field mask.'),
951
+ },
952
+ });
953
+ registerGeneratedTool(registry, {
954
+ name: "analytics_properties_check_compatibility",
955
+ cud: "read",
956
+ description: "This compatibility method lists dimensions and metrics that can be added to a report request and maintain compatibility. This method fails if the request's dime",
957
+ method: { id: "analyticsdata.properties.checkCompatibility", httpMethod: "POST", path: "v1beta/{+property}:checkCompatibility", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["property"], scopes: S_analyticsdata_v1beta[0] },
958
+ params: [{ "field": "property", "api": "property", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
959
+ hasBody: true,
960
+ shape: {
961
+ account: accountField(),
962
+ property: z.string().describe("A Google Analytics property identifier whose events are tracked. To learn more, see [where to find your Property ID](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id). `"),
963
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("CheckCompatibilityRequest JSON request body. Top-level fields: compatibilityFilter, dimensionFilter, dimensions, metricFilter, metrics."),
964
+ fields: z.string().optional().describe('Response field mask.'),
965
+ },
966
+ });
967
+ registerGeneratedTool(registry, {
968
+ name: "analytics_properties_run_pivot_report",
969
+ cud: "read",
970
+ description: "Returns a customized pivot report of your Google Analytics event data. Pivot reports are more advanced and expressive formats than regular reports. In a pivot r",
971
+ method: { id: "analyticsdata.properties.runPivotReport", httpMethod: "POST", path: "v1beta/{+property}:runPivotReport", baseUrl: "https://analyticsdata.googleapis.com/", requiredParams: ["property"], scopes: S_analyticsdata_v1beta[0] },
972
+ params: [{ "field": "property", "api": "property", "location": "path" }, { "field": "fields", "api": "fields", "location": "query" }],
973
+ hasBody: true,
974
+ shape: {
975
+ account: accountField(),
976
+ property: z.string().describe("A Google Analytics property identifier whose events are tracked. Specified in the URL path and not the body. To learn more, see [where to find your Property ID](https://developers.google.com/analytics"),
977
+ body: coerceJson(z.record(z.string(), z.unknown())).describe("RunPivotReportRequest JSON request body. Top-level fields: cohortSpec, comparisons, currencyCode, dateRanges, dimensionFilter, dimensions, keepEmptyRows, metricFilter, metrics, pivots, property, returnPropertyQuota."),
978
+ fields: z.string().optional().describe('Response field mask.'),
979
+ },
980
+ });
981
+ }