@open-loyalty/mcp-server 1.14.0 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -0
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +1 -1
- package/dist/server.js +1 -1
- package/dist/tools/analytics/handlers.js +2 -2
- package/dist/tools/analytics/index.d.ts +4 -4
- package/dist/tools/analytics/schemas.d.ts +4 -4
- package/dist/tools/analytics/schemas.js +7 -5
- package/dist/tools/apps/dashboard/handlers.d.ts +21 -6
- package/dist/tools/apps/dashboard/handlers.js +70 -13
- package/dist/tools/campaign/handlers.js +24 -5
- package/dist/tools/campaign/index.d.ts +227 -116
- package/dist/tools/campaign/index.js +4 -1
- package/dist/tools/campaign/normalizers.d.ts +5 -0
- package/dist/tools/campaign/normalizers.js +50 -0
- package/dist/tools/campaign/schemas.d.ts +227 -116
- package/dist/tools/campaign/schemas.js +34 -20
- package/dist/tools/campaign/types.d.ts +9 -7
- package/dist/types/schemas/analytics.d.ts +38 -6
- package/dist/types/schemas/analytics.js +6 -2
- package/dist/types/schemas/campaign.d.ts +120 -120
- package/dist/types/schemas/campaign.js +3 -3
- package/dist/ui/campaign-builder.html +45 -28
- package/dist/ui/dashboard.html +124 -133
- package/dist/ui/member-profile.html +50 -33
- package/dist/ui/rewards-catalog.html +36 -19
- package/dist/ui/tier-visualizer.html +38 -21
- package/dist/ui/transaction-timeline.html +44 -27
- package/dist/utils/errors.js +4 -3
- package/package.json +3 -3
|
@@ -11,7 +11,7 @@ const TranslationsInputSchema = z.object({
|
|
|
11
11
|
const CampaignEffectInputSchema = z.object({
|
|
12
12
|
effect: z.enum(["give_points", "give_reward", "deduct_unit", "assign_member_custom_attribute", "remove_member_custom_attribute"])
|
|
13
13
|
.describe("Effect type: give_points, give_reward, deduct_unit, etc. Use key `effect` (not `type`)."),
|
|
14
|
-
pointsRule: z.string().optional().describe("Points calculation expression (required for give_points).
|
|
14
|
+
pointsRule: z.union([z.string(), z.number()]).optional().describe("Points calculation expression (required for give_points). Prefer a STRING; numeric values are converted to strings. " +
|
|
15
15
|
"Fixed: '100'. Dynamic: 'transaction.grossValue * 10'. " +
|
|
16
16
|
"Category: 'transaction.category(\"electronics\").grossValue * 5'. " +
|
|
17
17
|
"Capped: '(transaction.grossValue * 2 >= 100) ? 100 : transaction.grossValue * 2'. " +
|
|
@@ -59,7 +59,8 @@ const CampaignActivityInputSchema = z.object({
|
|
|
59
59
|
});
|
|
60
60
|
// Visibility input schema
|
|
61
61
|
const CampaignVisibilityInputSchema = z.object({
|
|
62
|
-
target: z.enum(["
|
|
62
|
+
target: z.enum(["none", "tier", "segment", "all"]).describe("Who can see the campaign: tier (specific tiers), segment (specific segments), or none (invisible to everyone). " +
|
|
63
|
+
"Omit visibility for all members. Legacy 'all' is accepted and normalized by omitting visibility before calling the API."),
|
|
63
64
|
tiers: z.array(z.string()).optional().describe("Array of tier level IDs (required if target is 'tier')."),
|
|
64
65
|
segments: z.array(z.string()).optional().describe("Array of segment IDs (required if target is 'segment')."),
|
|
65
66
|
}).optional();
|
|
@@ -73,20 +74,31 @@ const CampaignAudienceInputSchema = z.object({
|
|
|
73
74
|
// Limit value input schema
|
|
74
75
|
// NOTE: Interval types must use "calendar" prefix (calendarDays, not days)
|
|
75
76
|
// Omitting interval entirely means "forever" (lifetime limit)
|
|
77
|
+
const CampaignLimitIntervalTypeSchema = z.enum([
|
|
78
|
+
"calendarHours",
|
|
79
|
+
"calendarDays",
|
|
80
|
+
"calendarWeeks",
|
|
81
|
+
"calendarMonths",
|
|
82
|
+
"calendarYears",
|
|
83
|
+
]);
|
|
76
84
|
const CampaignLimitValueInputSchema = z.object({
|
|
77
85
|
value: z.number().describe("Limit value."),
|
|
78
86
|
interval: z.object({
|
|
79
|
-
type:
|
|
80
|
-
|
|
81
|
-
value: z.number().optional().describe("Interval value (e.g., 1 for 'every 1 day', 7 for 'every 7 days')."),
|
|
87
|
+
type: CampaignLimitIntervalTypeSchema.describe("Interval type: calendarHours, calendarDays, calendarWeeks, calendarMonths, calendarYears. Omit interval entirely for lifetime limit."),
|
|
88
|
+
value: z.number().describe("Interval value (e.g., 1 for 'every 1 day'). Required when interval is present."),
|
|
82
89
|
}).optional().describe("Time interval for limit reset. If omitted, limit applies forever (lifetime)."),
|
|
83
90
|
});
|
|
91
|
+
const CampaignLimitInputSchema = z.union([
|
|
92
|
+
CampaignLimitValueInputSchema,
|
|
93
|
+
z.number().describe("Numeric shorthand for a lifetime limit; normalized to { value: number }."),
|
|
94
|
+
]);
|
|
84
95
|
// Limits input schema
|
|
85
96
|
const CampaignLimitsInputSchema = z.object({
|
|
86
|
-
points:
|
|
87
|
-
pointsPerMember:
|
|
88
|
-
executionsPerMember:
|
|
89
|
-
|
|
97
|
+
points: CampaignLimitInputSchema.optional().describe("Total points limit for the campaign."),
|
|
98
|
+
pointsPerMember: CampaignLimitInputSchema.optional().describe("Points limit per member."),
|
|
99
|
+
executionsPerMember: CampaignLimitInputSchema.optional().describe("Execution limit per member."),
|
|
100
|
+
perTransaction: z.unknown().optional().describe("Unsupported. Campaign limits do not support perTransaction; cap pointsRule for per-transaction point caps."),
|
|
101
|
+
}).passthrough().optional();
|
|
90
102
|
// Label input schema
|
|
91
103
|
const CampaignLabelInputSchema = z.object({
|
|
92
104
|
key: z.string().describe("Label key (e.g., 'category', 'channel', 'season')."),
|
|
@@ -189,7 +201,7 @@ export const CampaignUpdateInputSchema = {
|
|
|
189
201
|
})).optional().describe("Array of conditions that must match for rule to apply."),
|
|
190
202
|
})).describe("Campaign rules with effects and optional conditions."),
|
|
191
203
|
visibility: z.object({
|
|
192
|
-
target: z.enum(["
|
|
204
|
+
target: z.enum(["none", "tier", "segment"]).describe("Who can see the campaign: tier, segment, or none (invisible to everyone). Omit visibility for everyone."),
|
|
193
205
|
tiers: z.array(z.string()).optional().describe("Array of tier level IDs (required if target is 'tier'). Use ol_tierset_get_tiers to find IDs."),
|
|
194
206
|
segments: z.array(z.string()).optional().describe("Array of segment IDs (required if target is 'segment'). Use ol_segment_list to find IDs."),
|
|
195
207
|
}).optional().describe("Who can see the campaign."),
|
|
@@ -202,25 +214,25 @@ export const CampaignUpdateInputSchema = {
|
|
|
202
214
|
points: z.object({
|
|
203
215
|
value: z.number().describe("Maximum total points."),
|
|
204
216
|
interval: z.object({
|
|
205
|
-
type:
|
|
206
|
-
.describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears. Omit interval for lifetime limit."),
|
|
207
|
-
value: z.number().
|
|
217
|
+
type: CampaignLimitIntervalTypeSchema
|
|
218
|
+
.describe("Interval type: calendarHours, calendarDays, calendarWeeks, calendarMonths, calendarYears. Omit interval for lifetime limit."),
|
|
219
|
+
value: z.number().describe("Interval value (e.g., 1 for every 1 day). Required when interval is present."),
|
|
208
220
|
}).optional().describe("Time interval for limit reset. Omit for lifetime limit."),
|
|
209
221
|
}).optional().describe("Total points limit for the campaign."),
|
|
210
222
|
pointsPerMember: z.object({
|
|
211
223
|
value: z.number().describe("Maximum points per member."),
|
|
212
224
|
interval: z.object({
|
|
213
|
-
type:
|
|
214
|
-
.describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears."),
|
|
215
|
-
value: z.number().
|
|
225
|
+
type: CampaignLimitIntervalTypeSchema
|
|
226
|
+
.describe("Interval type: calendarHours, calendarDays, calendarWeeks, calendarMonths, calendarYears."),
|
|
227
|
+
value: z.number().describe("Interval value. Required when interval is present."),
|
|
216
228
|
}).optional().describe("Time interval for limit reset. Omit for lifetime limit."),
|
|
217
229
|
}).optional().describe("Points limit per member."),
|
|
218
230
|
executionsPerMember: z.object({
|
|
219
231
|
value: z.number().describe("Maximum executions per member."),
|
|
220
232
|
interval: z.object({
|
|
221
|
-
type:
|
|
222
|
-
.describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears."),
|
|
223
|
-
value: z.number().
|
|
233
|
+
type: CampaignLimitIntervalTypeSchema
|
|
234
|
+
.describe("Interval type: calendarHours, calendarDays, calendarWeeks, calendarMonths, calendarYears."),
|
|
235
|
+
value: z.number().describe("Interval value. Required when interval is present."),
|
|
224
236
|
}).optional().describe("Time interval for limit reset. Omit for lifetime limit."),
|
|
225
237
|
}).optional().describe("Execution limit per member."),
|
|
226
238
|
}).optional().describe("Campaign limits for points and executions."),
|
|
@@ -298,7 +310,9 @@ export const CampaignCreateInputSchema = {
|
|
|
298
310
|
limits: CampaignLimitsInputSchema.describe("Budget controls for the campaign. " +
|
|
299
311
|
"BUSINESS IMPACT: Without limits, a campaign running 12 months on 10K txn/month at 100 pts each = 12M points liability. " +
|
|
300
312
|
"BUSINESS DECISION: Set points (total cap), pointsPerMember (per-member cap), and/or executionsPerMember (frequency). " +
|
|
301
|
-
"
|
|
313
|
+
"Supported keys: points, pointsPerMember, executionsPerMember. Do NOT use perTransaction; cap pointsRule instead. " +
|
|
314
|
+
"Omit interval for lifetime limit, or use { type: 'calendarDays', value: 1 } for daily reset. " +
|
|
315
|
+
"Valid interval types: calendarHours, calendarDays, calendarWeeks, calendarMonths, calendarYears."),
|
|
302
316
|
active: z.boolean().optional().describe("Whether campaign is active (default: false)."),
|
|
303
317
|
displayOrder: z.number().optional().describe("Display order for sorting campaigns."),
|
|
304
318
|
labels: z.array(CampaignLabelInputSchema).optional().describe("Custom labels/tags for the campaign."),
|
|
@@ -105,7 +105,7 @@ export interface CampaignCreateInput {
|
|
|
105
105
|
target?: string;
|
|
106
106
|
effects: Array<{
|
|
107
107
|
effect: string;
|
|
108
|
-
pointsRule?: string;
|
|
108
|
+
pointsRule?: string | number;
|
|
109
109
|
walletCode?: string;
|
|
110
110
|
rewardId?: string;
|
|
111
111
|
customAttributeKey?: string;
|
|
@@ -128,27 +128,29 @@ export interface CampaignCreateInput {
|
|
|
128
128
|
segments?: string[];
|
|
129
129
|
};
|
|
130
130
|
limits?: {
|
|
131
|
-
points?: {
|
|
131
|
+
points?: number | {
|
|
132
132
|
value: number;
|
|
133
133
|
interval?: {
|
|
134
134
|
type: string;
|
|
135
|
-
value
|
|
135
|
+
value: number;
|
|
136
136
|
};
|
|
137
137
|
};
|
|
138
|
-
pointsPerMember?: {
|
|
138
|
+
pointsPerMember?: number | {
|
|
139
139
|
value: number;
|
|
140
140
|
interval?: {
|
|
141
141
|
type: string;
|
|
142
|
-
value
|
|
142
|
+
value: number;
|
|
143
143
|
};
|
|
144
144
|
};
|
|
145
|
-
executionsPerMember?: {
|
|
145
|
+
executionsPerMember?: number | {
|
|
146
146
|
value: number;
|
|
147
147
|
interval?: {
|
|
148
148
|
type: string;
|
|
149
|
-
value
|
|
149
|
+
value: number;
|
|
150
150
|
};
|
|
151
151
|
};
|
|
152
|
+
perTransaction?: unknown;
|
|
153
|
+
[key: string]: unknown;
|
|
152
154
|
};
|
|
153
155
|
active?: boolean;
|
|
154
156
|
displayOrder?: number;
|
|
@@ -363,6 +363,10 @@ export declare const DashboardHeaderSchema: z.ZodObject<{
|
|
|
363
363
|
transactions: z.ZodOptional<z.ZodNumber>;
|
|
364
364
|
avgTransactionValue: z.ZodOptional<z.ZodNumber>;
|
|
365
365
|
avgNumberOfTransactions: z.ZodOptional<z.ZodNumber>;
|
|
366
|
+
returnTransactions: z.ZodOptional<z.ZodNumber>;
|
|
367
|
+
totalReturns: z.ZodOptional<z.ZodNumber>;
|
|
368
|
+
avgReturnValue: z.ZodOptional<z.ZodNumber>;
|
|
369
|
+
avgNumberOfReturnTransactions: z.ZodOptional<z.ZodNumber>;
|
|
366
370
|
}, "strip", z.ZodTypeAny, {
|
|
367
371
|
transactions?: number | undefined;
|
|
368
372
|
registeredMembers?: number | undefined;
|
|
@@ -371,6 +375,10 @@ export declare const DashboardHeaderSchema: z.ZodObject<{
|
|
|
371
375
|
avgSpending?: number | undefined;
|
|
372
376
|
avgTransactionValue?: number | undefined;
|
|
373
377
|
avgNumberOfTransactions?: number | undefined;
|
|
378
|
+
returnTransactions?: number | undefined;
|
|
379
|
+
totalReturns?: number | undefined;
|
|
380
|
+
avgReturnValue?: number | undefined;
|
|
381
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
374
382
|
}, {
|
|
375
383
|
transactions?: number | undefined;
|
|
376
384
|
registeredMembers?: number | undefined;
|
|
@@ -379,6 +387,10 @@ export declare const DashboardHeaderSchema: z.ZodObject<{
|
|
|
379
387
|
avgSpending?: number | undefined;
|
|
380
388
|
avgTransactionValue?: number | undefined;
|
|
381
389
|
avgNumberOfTransactions?: number | undefined;
|
|
390
|
+
returnTransactions?: number | undefined;
|
|
391
|
+
totalReturns?: number | undefined;
|
|
392
|
+
avgReturnValue?: number | undefined;
|
|
393
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
382
394
|
}>;
|
|
383
395
|
export type DashboardHeader = z.infer<typeof DashboardHeaderSchema>;
|
|
384
396
|
export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
@@ -392,6 +404,10 @@ export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
|
392
404
|
transactions: z.ZodOptional<z.ZodNumber>;
|
|
393
405
|
avgTransactionValue: z.ZodOptional<z.ZodNumber>;
|
|
394
406
|
avgNumberOfTransactions: z.ZodOptional<z.ZodNumber>;
|
|
407
|
+
returnTransactions: z.ZodOptional<z.ZodNumber>;
|
|
408
|
+
totalReturns: z.ZodOptional<z.ZodNumber>;
|
|
409
|
+
avgReturnValue: z.ZodOptional<z.ZodNumber>;
|
|
410
|
+
avgNumberOfReturnTransactions: z.ZodOptional<z.ZodNumber>;
|
|
395
411
|
}, "strip", z.ZodTypeAny, {
|
|
396
412
|
transactions?: number | undefined;
|
|
397
413
|
registeredMembers?: number | undefined;
|
|
@@ -400,6 +416,10 @@ export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
|
400
416
|
avgSpending?: number | undefined;
|
|
401
417
|
avgTransactionValue?: number | undefined;
|
|
402
418
|
avgNumberOfTransactions?: number | undefined;
|
|
419
|
+
returnTransactions?: number | undefined;
|
|
420
|
+
totalReturns?: number | undefined;
|
|
421
|
+
avgReturnValue?: number | undefined;
|
|
422
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
403
423
|
}, {
|
|
404
424
|
transactions?: number | undefined;
|
|
405
425
|
registeredMembers?: number | undefined;
|
|
@@ -408,9 +428,13 @@ export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
|
408
428
|
avgSpending?: number | undefined;
|
|
409
429
|
avgTransactionValue?: number | undefined;
|
|
410
430
|
avgNumberOfTransactions?: number | undefined;
|
|
431
|
+
returnTransactions?: number | undefined;
|
|
432
|
+
totalReturns?: number | undefined;
|
|
433
|
+
avgReturnValue?: number | undefined;
|
|
434
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
411
435
|
}>>;
|
|
412
436
|
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
413
|
-
aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
|
|
437
|
+
aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month", "year"]>>;
|
|
414
438
|
dataType: z.ZodOptional<z.ZodString>;
|
|
415
439
|
}, "strip", z.ZodTypeAny, {
|
|
416
440
|
data?: Record<string, unknown> | undefined;
|
|
@@ -422,10 +446,14 @@ export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
|
422
446
|
avgSpending?: number | undefined;
|
|
423
447
|
avgTransactionValue?: number | undefined;
|
|
424
448
|
avgNumberOfTransactions?: number | undefined;
|
|
449
|
+
returnTransactions?: number | undefined;
|
|
450
|
+
totalReturns?: number | undefined;
|
|
451
|
+
avgReturnValue?: number | undefined;
|
|
452
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
425
453
|
} | undefined;
|
|
426
454
|
intervalStartDate?: string | undefined;
|
|
427
455
|
intervalEndDate?: string | undefined;
|
|
428
|
-
aggregationType?: "day" | "week" | "month" | undefined;
|
|
456
|
+
aggregationType?: "day" | "week" | "month" | "year" | undefined;
|
|
429
457
|
dataType?: string | undefined;
|
|
430
458
|
}, {
|
|
431
459
|
data?: Record<string, unknown> | undefined;
|
|
@@ -437,10 +465,14 @@ export declare const DashboardOverviewSchema: z.ZodObject<{
|
|
|
437
465
|
avgSpending?: number | undefined;
|
|
438
466
|
avgTransactionValue?: number | undefined;
|
|
439
467
|
avgNumberOfTransactions?: number | undefined;
|
|
468
|
+
returnTransactions?: number | undefined;
|
|
469
|
+
totalReturns?: number | undefined;
|
|
470
|
+
avgReturnValue?: number | undefined;
|
|
471
|
+
avgNumberOfReturnTransactions?: number | undefined;
|
|
440
472
|
} | undefined;
|
|
441
473
|
intervalStartDate?: string | undefined;
|
|
442
474
|
intervalEndDate?: string | undefined;
|
|
443
|
-
aggregationType?: "day" | "week" | "month" | undefined;
|
|
475
|
+
aggregationType?: "day" | "week" | "month" | "year" | undefined;
|
|
444
476
|
dataType?: string | undefined;
|
|
445
477
|
}>;
|
|
446
478
|
export type DashboardOverview = z.infer<typeof DashboardOverviewSchema>;
|
|
@@ -504,7 +536,7 @@ export declare const UnitsOverviewSchema: z.ZodObject<{
|
|
|
504
536
|
breakageRate?: number | undefined;
|
|
505
537
|
}>>;
|
|
506
538
|
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
507
|
-
aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
|
|
539
|
+
aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month", "year"]>>;
|
|
508
540
|
dataType: z.ZodOptional<z.ZodString>;
|
|
509
541
|
}, "strip", z.ZodTypeAny, {
|
|
510
542
|
data?: Record<string, unknown> | undefined;
|
|
@@ -519,7 +551,7 @@ export declare const UnitsOverviewSchema: z.ZodObject<{
|
|
|
519
551
|
} | undefined;
|
|
520
552
|
intervalStartDate?: string | undefined;
|
|
521
553
|
intervalEndDate?: string | undefined;
|
|
522
|
-
aggregationType?: "day" | "week" | "month" | undefined;
|
|
554
|
+
aggregationType?: "day" | "week" | "month" | "year" | undefined;
|
|
523
555
|
dataType?: string | undefined;
|
|
524
556
|
walletTypeCode?: string | undefined;
|
|
525
557
|
}, {
|
|
@@ -535,7 +567,7 @@ export declare const UnitsOverviewSchema: z.ZodObject<{
|
|
|
535
567
|
} | undefined;
|
|
536
568
|
intervalStartDate?: string | undefined;
|
|
537
569
|
intervalEndDate?: string | undefined;
|
|
538
|
-
aggregationType?: "day" | "week" | "month" | undefined;
|
|
570
|
+
aggregationType?: "day" | "week" | "month" | "year" | undefined;
|
|
539
571
|
dataType?: string | undefined;
|
|
540
572
|
walletTypeCode?: string | undefined;
|
|
541
573
|
}>;
|
|
@@ -97,13 +97,17 @@ export const DashboardHeaderSchema = z.object({
|
|
|
97
97
|
transactions: z.number().optional().describe("Total transactions."),
|
|
98
98
|
avgTransactionValue: z.number().optional().describe("Average transaction value."),
|
|
99
99
|
avgNumberOfTransactions: z.number().optional().describe("Average number of transactions per member."),
|
|
100
|
+
returnTransactions: z.number().optional().describe("Total return transactions."),
|
|
101
|
+
totalReturns: z.number().optional().describe("Total returned value."),
|
|
102
|
+
avgReturnValue: z.number().optional().describe("Average return value."),
|
|
103
|
+
avgNumberOfReturnTransactions: z.number().optional().describe("Average number of return transactions per member."),
|
|
100
104
|
});
|
|
101
105
|
export const DashboardOverviewSchema = z.object({
|
|
102
106
|
intervalStartDate: z.string().optional().describe("Start date of data interval."),
|
|
103
107
|
intervalEndDate: z.string().optional().describe("End date of data interval."),
|
|
104
108
|
header: DashboardHeaderSchema.optional().describe("Summary header metrics."),
|
|
105
109
|
data: z.record(z.string(), z.unknown()).optional().describe("Time-series data points."),
|
|
106
|
-
aggregationType: z.enum(["day", "week", "month"]).optional().describe("Aggregation granularity."),
|
|
110
|
+
aggregationType: z.enum(["day", "week", "month", "year"]).optional().describe("Aggregation granularity."),
|
|
107
111
|
dataType: z.string().optional().describe("Type of data returned."),
|
|
108
112
|
});
|
|
109
113
|
/**
|
|
@@ -125,6 +129,6 @@ export const UnitsOverviewSchema = z.object({
|
|
|
125
129
|
walletTypeCode: z.string().optional().describe("Wallet type code."),
|
|
126
130
|
header: UnitsOverviewHeaderSchema.optional().describe("Summary header metrics."),
|
|
127
131
|
data: z.record(z.string(), z.unknown()).optional().describe("Time-series data points."),
|
|
128
|
-
aggregationType: z.enum(["day", "week", "month"]).optional().describe("Aggregation granularity."),
|
|
132
|
+
aggregationType: z.enum(["day", "week", "month", "year"]).optional().describe("Aggregation granularity."),
|
|
129
133
|
dataType: z.string().optional().describe("Type of data returned."),
|
|
130
134
|
});
|