@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.
@@ -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). Must be a STRING. " +
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(["all", "tier", "segment"]).describe("Who can see the campaign: all, tier (specific tiers), or segment (specific segments)."),
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: z.enum(["calendarDays", "calendarWeeks", "calendarMonths", "calendarYears"])
80
- .describe("Interval type. Use 'calendarDays' for daily, 'calendarWeeks' for weekly, etc. Omit interval entirely for lifetime limit."),
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: CampaignLimitValueInputSchema.optional().describe("Total points limit for the campaign."),
87
- pointsPerMember: CampaignLimitValueInputSchema.optional().describe("Points limit per member."),
88
- executionsPerMember: CampaignLimitValueInputSchema.optional().describe("Execution limit per member."),
89
- }).optional();
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(["all", "tier", "segment"]).describe("Who can see the campaign: all, tier (specific tiers), or segment (specific segments)."),
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: z.enum(["calendarDays", "calendarWeeks", "calendarMonths", "calendarYears"])
206
- .describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears. Omit interval for lifetime limit."),
207
- value: z.number().optional().describe("Interval value (e.g., 1 for every 1 day)."),
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: z.enum(["calendarDays", "calendarWeeks", "calendarMonths", "calendarYears"])
214
- .describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears."),
215
- value: z.number().optional().describe("Interval value."),
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: z.enum(["calendarDays", "calendarWeeks", "calendarMonths", "calendarYears"])
222
- .describe("Interval type: calendarDays, calendarWeeks, calendarMonths, calendarYears."),
223
- value: z.number().optional().describe("Interval value."),
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
- "Omit interval for lifetime limit, or use { type: 'calendarDays', value: 1 } for daily reset."),
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?: number;
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?: number;
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?: number;
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
  });