@open-loyalty/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +654 -0
  3. package/dist/client/http.d.ts +8 -0
  4. package/dist/client/http.js +69 -0
  5. package/dist/config.d.ts +17 -0
  6. package/dist/config.js +40 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +20 -0
  9. package/dist/server.d.ts +4 -0
  10. package/dist/server.js +334 -0
  11. package/dist/tools/achievement.d.ts +983 -0
  12. package/dist/tools/achievement.js +311 -0
  13. package/dist/tools/admin.d.ts +153 -0
  14. package/dist/tools/admin.js +193 -0
  15. package/dist/tools/analytics.d.ts +162 -0
  16. package/dist/tools/analytics.js +245 -0
  17. package/dist/tools/apikey.d.ts +72 -0
  18. package/dist/tools/apikey.js +78 -0
  19. package/dist/tools/audit.d.ts +107 -0
  20. package/dist/tools/audit.js +90 -0
  21. package/dist/tools/badge.d.ts +135 -0
  22. package/dist/tools/badge.js +165 -0
  23. package/dist/tools/campaign.d.ts +1775 -0
  24. package/dist/tools/campaign.js +724 -0
  25. package/dist/tools/export.d.ts +110 -0
  26. package/dist/tools/export.js +147 -0
  27. package/dist/tools/import.d.ts +110 -0
  28. package/dist/tools/import.js +126 -0
  29. package/dist/tools/index.d.ts +22 -0
  30. package/dist/tools/index.js +527 -0
  31. package/dist/tools/member.d.ts +345 -0
  32. package/dist/tools/member.js +358 -0
  33. package/dist/tools/member.test.d.ts +1 -0
  34. package/dist/tools/member.test.js +213 -0
  35. package/dist/tools/points.d.ts +188 -0
  36. package/dist/tools/points.js +306 -0
  37. package/dist/tools/points.test.d.ts +1 -0
  38. package/dist/tools/points.test.js +292 -0
  39. package/dist/tools/reward.d.ts +261 -0
  40. package/dist/tools/reward.js +371 -0
  41. package/dist/tools/reward.test.d.ts +1 -0
  42. package/dist/tools/reward.test.js +240 -0
  43. package/dist/tools/role.d.ts +161 -0
  44. package/dist/tools/role.js +160 -0
  45. package/dist/tools/segment.d.ts +797 -0
  46. package/dist/tools/segment.js +299 -0
  47. package/dist/tools/store.d.ts +101 -0
  48. package/dist/tools/store.js +117 -0
  49. package/dist/tools/tierset.d.ts +288 -0
  50. package/dist/tools/tierset.js +244 -0
  51. package/dist/tools/transaction.d.ts +357 -0
  52. package/dist/tools/transaction.js +242 -0
  53. package/dist/tools/transaction.test.d.ts +1 -0
  54. package/dist/tools/transaction.test.js +235 -0
  55. package/dist/tools/wallet-type.d.ts +32 -0
  56. package/dist/tools/wallet-type.js +58 -0
  57. package/dist/tools/webhook.d.ts +179 -0
  58. package/dist/tools/webhook.js +171 -0
  59. package/dist/types/schemas/achievement.d.ts +1116 -0
  60. package/dist/types/schemas/achievement.js +172 -0
  61. package/dist/types/schemas/admin.d.ts +263 -0
  62. package/dist/types/schemas/admin.js +99 -0
  63. package/dist/types/schemas/analytics.d.ts +542 -0
  64. package/dist/types/schemas/analytics.js +130 -0
  65. package/dist/types/schemas/badge.d.ts +131 -0
  66. package/dist/types/schemas/badge.js +48 -0
  67. package/dist/types/schemas/campaign.d.ts +2005 -0
  68. package/dist/types/schemas/campaign.js +189 -0
  69. package/dist/types/schemas/common.d.ts +52 -0
  70. package/dist/types/schemas/common.js +26 -0
  71. package/dist/types/schemas/export.d.ts +127 -0
  72. package/dist/types/schemas/export.js +43 -0
  73. package/dist/types/schemas/import.d.ts +344 -0
  74. package/dist/types/schemas/import.js +68 -0
  75. package/dist/types/schemas/member.d.ts +443 -0
  76. package/dist/types/schemas/member.js +92 -0
  77. package/dist/types/schemas/points.d.ts +188 -0
  78. package/dist/types/schemas/points.js +54 -0
  79. package/dist/types/schemas/reward.d.ts +278 -0
  80. package/dist/types/schemas/reward.js +69 -0
  81. package/dist/types/schemas/role.d.ts +260 -0
  82. package/dist/types/schemas/role.js +75 -0
  83. package/dist/types/schemas/segment.d.ts +592 -0
  84. package/dist/types/schemas/segment.js +114 -0
  85. package/dist/types/schemas/tierset.d.ts +552 -0
  86. package/dist/types/schemas/tierset.js +87 -0
  87. package/dist/types/schemas/transaction.d.ts +1022 -0
  88. package/dist/types/schemas/transaction.js +63 -0
  89. package/dist/types/schemas/wallet-type.d.ts +99 -0
  90. package/dist/types/schemas/wallet-type.js +17 -0
  91. package/dist/types/schemas/webhook.d.ts +195 -0
  92. package/dist/types/schemas/webhook.js +39 -0
  93. package/dist/utils/cursor.d.ts +84 -0
  94. package/dist/utils/cursor.js +117 -0
  95. package/dist/utils/errors.d.ts +12 -0
  96. package/dist/utils/errors.js +69 -0
  97. package/dist/utils/pagination.d.ts +39 -0
  98. package/dist/utils/pagination.js +77 -0
  99. package/package.json +65 -0
@@ -0,0 +1,162 @@
1
+ import { z } from "zod";
2
+ import { TierAnalytics, MemberAnalytics, PointsAnalytics, TransactionAnalytics, ReferralAnalytics, CampaignAnalytics, DashboardOverview, UnitsOverview } from "../types/schemas/analytics.js";
3
+ export declare const AnalyticsTiersInputSchema: {
4
+ storeCode: z.ZodOptional<z.ZodString>;
5
+ };
6
+ export declare const AnalyticsMembersInputSchema: {
7
+ storeCode: z.ZodOptional<z.ZodString>;
8
+ withTransaction: z.ZodOptional<z.ZodBoolean>;
9
+ };
10
+ export declare const AnalyticsPointsInputSchema: {
11
+ storeCode: z.ZodOptional<z.ZodString>;
12
+ };
13
+ export declare const AnalyticsTransactionsInputSchema: {
14
+ storeCode: z.ZodOptional<z.ZodString>;
15
+ };
16
+ export declare const AnalyticsReferralsInputSchema: {
17
+ storeCode: z.ZodOptional<z.ZodString>;
18
+ };
19
+ export declare const AnalyticsCampaignsInputSchema: {
20
+ storeCode: z.ZodOptional<z.ZodString>;
21
+ page: z.ZodOptional<z.ZodNumber>;
22
+ perPage: z.ZodOptional<z.ZodNumber>;
23
+ executedAt: z.ZodOptional<z.ZodString>;
24
+ };
25
+ export declare const AnalyticsDashboardInputSchema: {
26
+ storeCode: z.ZodOptional<z.ZodString>;
27
+ dataType: z.ZodOptional<z.ZodEnum<["registeredMembers", "activeMembers", "revenue", "avgSpending", "transactions", "avgTransactionValue", "avgNumberOfTransactions"]>>;
28
+ aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
29
+ intervalStartDate: z.ZodOptional<z.ZodString>;
30
+ intervalEndDate: z.ZodOptional<z.ZodString>;
31
+ };
32
+ export declare const AnalyticsUnitsInputSchema: {
33
+ storeCode: z.ZodOptional<z.ZodString>;
34
+ walletTypeCode: z.ZodString;
35
+ dataType: z.ZodOptional<z.ZodEnum<["unitsIssued", "unitsSpent", "unitsExpired", "unitsPending", "unitsActive"]>>;
36
+ aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
37
+ intervalStartDate: z.ZodOptional<z.ZodString>;
38
+ intervalEndDate: z.ZodOptional<z.ZodString>;
39
+ };
40
+ export declare const AnalyticsCampaignDetailInputSchema: {
41
+ storeCode: z.ZodOptional<z.ZodString>;
42
+ campaignId: z.ZodString;
43
+ };
44
+ export declare function analyticsTiers(input: {
45
+ storeCode?: string;
46
+ }): Promise<TierAnalytics>;
47
+ export declare function analyticsMembers(input: {
48
+ storeCode?: string;
49
+ withTransaction?: boolean;
50
+ }): Promise<MemberAnalytics>;
51
+ export declare function analyticsPoints(input: {
52
+ storeCode?: string;
53
+ }): Promise<PointsAnalytics>;
54
+ export declare function analyticsTransactions(input: {
55
+ storeCode?: string;
56
+ }): Promise<TransactionAnalytics>;
57
+ export declare function analyticsReferrals(input: {
58
+ storeCode?: string;
59
+ }): Promise<ReferralAnalytics>;
60
+ export declare function analyticsCampaigns(input: {
61
+ storeCode?: string;
62
+ page?: number;
63
+ perPage?: number;
64
+ executedAt?: string;
65
+ }): Promise<CampaignAnalytics>;
66
+ export declare function analyticsDashboard(input: {
67
+ storeCode?: string;
68
+ dataType?: string;
69
+ aggregationType?: string;
70
+ intervalStartDate?: string;
71
+ intervalEndDate?: string;
72
+ }): Promise<DashboardOverview>;
73
+ export declare function analyticsUnits(input: {
74
+ storeCode?: string;
75
+ walletTypeCode: string;
76
+ dataType?: string;
77
+ aggregationType?: string;
78
+ intervalStartDate?: string;
79
+ intervalEndDate?: string;
80
+ }): Promise<UnitsOverview>;
81
+ export declare function analyticsCampaignDetail(input: {
82
+ storeCode?: string;
83
+ campaignId: string;
84
+ }): Promise<Record<string, unknown>>;
85
+ export declare const analyticsToolDefinitions: readonly [{
86
+ readonly name: "openloyalty_analytics_tiers";
87
+ readonly description: "Get tier (level) analytics showing member distribution across tiers. Returns tier IDs, names, and member counts for each tier level.";
88
+ readonly inputSchema: {
89
+ storeCode: z.ZodOptional<z.ZodString>;
90
+ };
91
+ readonly handler: typeof analyticsTiers;
92
+ }, {
93
+ readonly name: "openloyalty_analytics_members";
94
+ readonly description: "Get member analytics showing registration trends. Returns member counts by time intervals (1 day, 7 days, 30 days, 365 days). Filter by transaction status to see engaged vs unengaged members.";
95
+ readonly inputSchema: {
96
+ storeCode: z.ZodOptional<z.ZodString>;
97
+ withTransaction: z.ZodOptional<z.ZodBoolean>;
98
+ };
99
+ readonly handler: typeof analyticsMembers;
100
+ }, {
101
+ readonly name: "openloyalty_analytics_points";
102
+ readonly description: "Get points analytics showing program health. Returns total active points, points spent, points issued, expired points, and pending points. Use to monitor points economy.";
103
+ readonly inputSchema: {
104
+ storeCode: z.ZodOptional<z.ZodString>;
105
+ };
106
+ readonly handler: typeof analyticsPoints;
107
+ }, {
108
+ readonly name: "openloyalty_analytics_transactions";
109
+ readonly description: "Get transaction analytics showing purchase trends. Returns transaction counts by intervals, total count, total amount, and average values. Use to monitor sales performance.";
110
+ readonly inputSchema: {
111
+ storeCode: z.ZodOptional<z.ZodString>;
112
+ };
113
+ readonly handler: typeof analyticsTransactions;
114
+ }, {
115
+ readonly name: "openloyalty_analytics_referrals";
116
+ readonly description: "Get referral program analytics showing referral activity. Returns total referral count. Use to monitor referral program performance.";
117
+ readonly inputSchema: {
118
+ storeCode: z.ZodOptional<z.ZodString>;
119
+ };
120
+ readonly handler: typeof analyticsReferrals;
121
+ }, {
122
+ readonly name: "openloyalty_analytics_campaigns";
123
+ readonly description: "Get campaign analytics showing execution counts per campaign. Returns list of campaigns with their execution counts. Use to identify most successful campaigns.";
124
+ readonly inputSchema: {
125
+ storeCode: z.ZodOptional<z.ZodString>;
126
+ page: z.ZodOptional<z.ZodNumber>;
127
+ perPage: z.ZodOptional<z.ZodNumber>;
128
+ executedAt: z.ZodOptional<z.ZodString>;
129
+ };
130
+ readonly handler: typeof analyticsCampaigns;
131
+ }, {
132
+ readonly name: "openloyalty_analytics_dashboard";
133
+ readonly description: "Get dashboard overview metrics with time-series data. Returns key metrics (registered members, active members, revenue, avg spending, transactions) with optional date range and aggregation. Use for high-level program dashboards.";
134
+ readonly inputSchema: {
135
+ storeCode: z.ZodOptional<z.ZodString>;
136
+ dataType: z.ZodOptional<z.ZodEnum<["registeredMembers", "activeMembers", "revenue", "avgSpending", "transactions", "avgTransactionValue", "avgNumberOfTransactions"]>>;
137
+ aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
138
+ intervalStartDate: z.ZodOptional<z.ZodString>;
139
+ intervalEndDate: z.ZodOptional<z.ZodString>;
140
+ };
141
+ readonly handler: typeof analyticsDashboard;
142
+ }, {
143
+ readonly name: "openloyalty_analytics_units";
144
+ readonly description: "Get wallet-specific analytics (units overview). Returns units issued, spent, expired, pending, active, plus redemption and breakage rates. Requires walletTypeCode parameter. Use for detailed points economy analysis.";
145
+ readonly inputSchema: {
146
+ storeCode: z.ZodOptional<z.ZodString>;
147
+ walletTypeCode: z.ZodString;
148
+ dataType: z.ZodOptional<z.ZodEnum<["unitsIssued", "unitsSpent", "unitsExpired", "unitsPending", "unitsActive"]>>;
149
+ aggregationType: z.ZodOptional<z.ZodEnum<["day", "week", "month"]>>;
150
+ intervalStartDate: z.ZodOptional<z.ZodString>;
151
+ intervalEndDate: z.ZodOptional<z.ZodString>;
152
+ };
153
+ readonly handler: typeof analyticsUnits;
154
+ }, {
155
+ readonly name: "openloyalty_analytics_campaign_detail";
156
+ readonly description: "Get detailed analytics for a specific campaign. Returns campaign-specific performance metrics. Use after analytics_campaigns to drill into individual campaign performance.";
157
+ readonly inputSchema: {
158
+ storeCode: z.ZodOptional<z.ZodString>;
159
+ campaignId: z.ZodString;
160
+ };
161
+ readonly handler: typeof analyticsCampaignDetail;
162
+ }];
@@ -0,0 +1,245 @@
1
+ import { z } from "zod";
2
+ import { apiGet } from "../client/http.js";
3
+ import { formatApiError } from "../utils/errors.js";
4
+ import { getConfig } from "../config.js";
5
+ // Input Schemas
6
+ export const AnalyticsTiersInputSchema = {
7
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
8
+ };
9
+ export const AnalyticsMembersInputSchema = {
10
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
11
+ withTransaction: z.boolean().optional().describe("Filter: true for members with transactions, false for members without, omit for all."),
12
+ };
13
+ export const AnalyticsPointsInputSchema = {
14
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
15
+ };
16
+ export const AnalyticsTransactionsInputSchema = {
17
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
18
+ };
19
+ export const AnalyticsReferralsInputSchema = {
20
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
21
+ };
22
+ export const AnalyticsCampaignsInputSchema = {
23
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
24
+ page: z.number().optional().describe("Page number (default: 1)."),
25
+ perPage: z.number().optional().describe("Items per page (default: 25)."),
26
+ executedAt: z.string().optional().describe("Filter by execution date (ISO format)."),
27
+ };
28
+ export const AnalyticsDashboardInputSchema = {
29
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
30
+ dataType: z.enum([
31
+ "registeredMembers", "activeMembers", "revenue", "avgSpending",
32
+ "transactions", "avgTransactionValue", "avgNumberOfTransactions"
33
+ ]).optional().describe("Type of data to retrieve."),
34
+ aggregationType: z.enum(["day", "week", "month"]).optional().describe("Aggregation granularity."),
35
+ intervalStartDate: z.string().optional().describe("Start date (YYYY-MM-DD format)."),
36
+ intervalEndDate: z.string().optional().describe("End date (YYYY-MM-DD format)."),
37
+ };
38
+ export const AnalyticsUnitsInputSchema = {
39
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
40
+ walletTypeCode: z.string().describe("Wallet type code (e.g., 'default' or 'points')."),
41
+ dataType: z.enum([
42
+ "unitsIssued", "unitsSpent", "unitsExpired", "unitsPending", "unitsActive"
43
+ ]).optional().describe("Type of data to retrieve."),
44
+ aggregationType: z.enum(["day", "week", "month"]).optional().describe("Aggregation granularity."),
45
+ intervalStartDate: z.string().optional().describe("Start date (YYYY-MM-DD format)."),
46
+ intervalEndDate: z.string().optional().describe("End date (YYYY-MM-DD format)."),
47
+ };
48
+ export const AnalyticsCampaignDetailInputSchema = {
49
+ storeCode: z.string().optional().describe("Store code. If not provided, uses the default store code from configuration."),
50
+ campaignId: z.string().describe("The campaign ID to get analytics for."),
51
+ };
52
+ // Handler functions
53
+ export async function analyticsTiers(input) {
54
+ const config = getConfig();
55
+ const storeCode = input.storeCode || config.defaultStoreCode;
56
+ try {
57
+ const response = await apiGet(`/${storeCode}/analytics/levels`);
58
+ return response;
59
+ }
60
+ catch (error) {
61
+ throw formatApiError(error, "openloyalty_analytics_tiers");
62
+ }
63
+ }
64
+ export async function analyticsMembers(input) {
65
+ const config = getConfig();
66
+ const storeCode = input.storeCode || config.defaultStoreCode;
67
+ const params = new URLSearchParams();
68
+ if (input.withTransaction !== undefined) {
69
+ params.append("withTransaction", String(input.withTransaction));
70
+ }
71
+ const queryString = params.toString();
72
+ const url = `/${storeCode}/analytics/members${queryString ? `?${queryString}` : ""}`;
73
+ try {
74
+ const response = await apiGet(url);
75
+ return response;
76
+ }
77
+ catch (error) {
78
+ throw formatApiError(error, "openloyalty_analytics_members");
79
+ }
80
+ }
81
+ export async function analyticsPoints(input) {
82
+ const config = getConfig();
83
+ const storeCode = input.storeCode || config.defaultStoreCode;
84
+ try {
85
+ const response = await apiGet(`/${storeCode}/analytics/points`);
86
+ return response;
87
+ }
88
+ catch (error) {
89
+ throw formatApiError(error, "openloyalty_analytics_points");
90
+ }
91
+ }
92
+ export async function analyticsTransactions(input) {
93
+ const config = getConfig();
94
+ const storeCode = input.storeCode || config.defaultStoreCode;
95
+ try {
96
+ const response = await apiGet(`/${storeCode}/analytics/transactions`);
97
+ return response;
98
+ }
99
+ catch (error) {
100
+ throw formatApiError(error, "openloyalty_analytics_transactions");
101
+ }
102
+ }
103
+ export async function analyticsReferrals(input) {
104
+ const config = getConfig();
105
+ const storeCode = input.storeCode || config.defaultStoreCode;
106
+ try {
107
+ const response = await apiGet(`/${storeCode}/analytics/referrals`);
108
+ return response;
109
+ }
110
+ catch (error) {
111
+ throw formatApiError(error, "openloyalty_analytics_referrals");
112
+ }
113
+ }
114
+ export async function analyticsCampaigns(input) {
115
+ const config = getConfig();
116
+ const storeCode = input.storeCode || config.defaultStoreCode;
117
+ const params = new URLSearchParams();
118
+ if (input.page)
119
+ params.append("_page", String(input.page));
120
+ if (input.perPage)
121
+ params.append("_itemsOnPage", String(input.perPage));
122
+ if (input.executedAt)
123
+ params.append("executedAt", input.executedAt);
124
+ const queryString = params.toString();
125
+ const url = `/${storeCode}/analytics/campaigns${queryString ? `?${queryString}` : ""}`;
126
+ try {
127
+ const response = await apiGet(url);
128
+ return response;
129
+ }
130
+ catch (error) {
131
+ throw formatApiError(error, "openloyalty_analytics_campaigns");
132
+ }
133
+ }
134
+ export async function analyticsDashboard(input) {
135
+ const config = getConfig();
136
+ const storeCode = input.storeCode || config.defaultStoreCode;
137
+ const params = new URLSearchParams();
138
+ if (input.dataType)
139
+ params.append("dataType", input.dataType);
140
+ if (input.aggregationType)
141
+ params.append("aggregationType", input.aggregationType);
142
+ if (input.intervalStartDate)
143
+ params.append("intervalStartDate", input.intervalStartDate);
144
+ if (input.intervalEndDate)
145
+ params.append("intervalEndDate", input.intervalEndDate);
146
+ const queryString = params.toString();
147
+ const url = `/${storeCode}/analytics/dashboard/general-overview${queryString ? `?${queryString}` : ""}`;
148
+ try {
149
+ const response = await apiGet(url);
150
+ return response;
151
+ }
152
+ catch (error) {
153
+ throw formatApiError(error, "openloyalty_analytics_dashboard");
154
+ }
155
+ }
156
+ export async function analyticsUnits(input) {
157
+ const config = getConfig();
158
+ const storeCode = input.storeCode || config.defaultStoreCode;
159
+ const params = new URLSearchParams();
160
+ if (input.dataType)
161
+ params.append("dataType", input.dataType);
162
+ if (input.aggregationType)
163
+ params.append("aggregationType", input.aggregationType);
164
+ if (input.intervalStartDate)
165
+ params.append("intervalStartDate", input.intervalStartDate);
166
+ if (input.intervalEndDate)
167
+ params.append("intervalEndDate", input.intervalEndDate);
168
+ const queryString = params.toString();
169
+ const url = `/${storeCode}/analytics/units-overview/${input.walletTypeCode}${queryString ? `?${queryString}` : ""}`;
170
+ try {
171
+ const response = await apiGet(url);
172
+ return response;
173
+ }
174
+ catch (error) {
175
+ throw formatApiError(error, "openloyalty_analytics_units");
176
+ }
177
+ }
178
+ export async function analyticsCampaignDetail(input) {
179
+ const config = getConfig();
180
+ const storeCode = input.storeCode || config.defaultStoreCode;
181
+ try {
182
+ const response = await apiGet(`/${storeCode}/analytics/campaign/${input.campaignId}`);
183
+ return response;
184
+ }
185
+ catch (error) {
186
+ throw formatApiError(error, "openloyalty_analytics_campaign_detail");
187
+ }
188
+ }
189
+ // Tool definitions
190
+ export const analyticsToolDefinitions = [
191
+ {
192
+ name: "openloyalty_analytics_tiers",
193
+ description: "Get tier (level) analytics showing member distribution across tiers. Returns tier IDs, names, and member counts for each tier level.",
194
+ inputSchema: AnalyticsTiersInputSchema,
195
+ handler: analyticsTiers,
196
+ },
197
+ {
198
+ name: "openloyalty_analytics_members",
199
+ description: "Get member analytics showing registration trends. Returns member counts by time intervals (1 day, 7 days, 30 days, 365 days). Filter by transaction status to see engaged vs unengaged members.",
200
+ inputSchema: AnalyticsMembersInputSchema,
201
+ handler: analyticsMembers,
202
+ },
203
+ {
204
+ name: "openloyalty_analytics_points",
205
+ description: "Get points analytics showing program health. Returns total active points, points spent, points issued, expired points, and pending points. Use to monitor points economy.",
206
+ inputSchema: AnalyticsPointsInputSchema,
207
+ handler: analyticsPoints,
208
+ },
209
+ {
210
+ name: "openloyalty_analytics_transactions",
211
+ description: "Get transaction analytics showing purchase trends. Returns transaction counts by intervals, total count, total amount, and average values. Use to monitor sales performance.",
212
+ inputSchema: AnalyticsTransactionsInputSchema,
213
+ handler: analyticsTransactions,
214
+ },
215
+ {
216
+ name: "openloyalty_analytics_referrals",
217
+ description: "Get referral program analytics showing referral activity. Returns total referral count. Use to monitor referral program performance.",
218
+ inputSchema: AnalyticsReferralsInputSchema,
219
+ handler: analyticsReferrals,
220
+ },
221
+ {
222
+ name: "openloyalty_analytics_campaigns",
223
+ description: "Get campaign analytics showing execution counts per campaign. Returns list of campaigns with their execution counts. Use to identify most successful campaigns.",
224
+ inputSchema: AnalyticsCampaignsInputSchema,
225
+ handler: analyticsCampaigns,
226
+ },
227
+ {
228
+ name: "openloyalty_analytics_dashboard",
229
+ description: "Get dashboard overview metrics with time-series data. Returns key metrics (registered members, active members, revenue, avg spending, transactions) with optional date range and aggregation. Use for high-level program dashboards.",
230
+ inputSchema: AnalyticsDashboardInputSchema,
231
+ handler: analyticsDashboard,
232
+ },
233
+ {
234
+ name: "openloyalty_analytics_units",
235
+ description: "Get wallet-specific analytics (units overview). Returns units issued, spent, expired, pending, active, plus redemption and breakage rates. Requires walletTypeCode parameter. Use for detailed points economy analysis.",
236
+ inputSchema: AnalyticsUnitsInputSchema,
237
+ handler: analyticsUnits,
238
+ },
239
+ {
240
+ name: "openloyalty_analytics_campaign_detail",
241
+ description: "Get detailed analytics for a specific campaign. Returns campaign-specific performance metrics. Use after analytics_campaigns to drill into individual campaign performance.",
242
+ inputSchema: AnalyticsCampaignDetailInputSchema,
243
+ handler: analyticsCampaignDetail,
244
+ },
245
+ ];
@@ -0,0 +1,72 @@
1
+ import { z } from "zod";
2
+ export interface ApiKey {
3
+ apiKeyId: string;
4
+ token?: string;
5
+ adminId: string;
6
+ name: string;
7
+ legacy?: boolean;
8
+ expirationDate?: string;
9
+ }
10
+ export interface ApiKeyListResponse {
11
+ items: ApiKey[];
12
+ total?: {
13
+ all?: number | string;
14
+ filtered?: number | string;
15
+ estimated?: boolean;
16
+ };
17
+ }
18
+ export declare const ApiKeyCreateInputSchema: {
19
+ adminId: z.ZodString;
20
+ name: z.ZodOptional<z.ZodString>;
21
+ expirationDate: z.ZodOptional<z.ZodString>;
22
+ };
23
+ export declare const ApiKeyListInputSchema: {
24
+ adminId: z.ZodString;
25
+ page: z.ZodOptional<z.ZodNumber>;
26
+ perPage: z.ZodOptional<z.ZodNumber>;
27
+ };
28
+ export declare const ApiKeyDeleteInputSchema: {
29
+ adminId: z.ZodString;
30
+ apiKeyId: z.ZodString;
31
+ };
32
+ export declare function apiKeyCreate(input: {
33
+ adminId: string;
34
+ name?: string;
35
+ expirationDate?: string;
36
+ }): Promise<ApiKey>;
37
+ export declare function apiKeyList(input: {
38
+ adminId: string;
39
+ page?: number;
40
+ perPage?: number;
41
+ }): Promise<ApiKeyListResponse>;
42
+ export declare function apiKeyDelete(input: {
43
+ adminId: string;
44
+ apiKeyId: string;
45
+ }): Promise<void>;
46
+ export declare const apiKeyToolDefinitions: readonly [{
47
+ readonly name: "openloyalty_apikey_create";
48
+ readonly description: "Create a new API key for an admin user. CRITICAL: The API token is ONLY returned at creation time. Store it securely immediately - it cannot be retrieved later. Returns apiKeyId, token, adminId, name, and expirationDate.";
49
+ readonly inputSchema: {
50
+ adminId: z.ZodString;
51
+ name: z.ZodOptional<z.ZodString>;
52
+ expirationDate: z.ZodOptional<z.ZodString>;
53
+ };
54
+ readonly handler: typeof apiKeyCreate;
55
+ }, {
56
+ readonly name: "openloyalty_apikey_list";
57
+ readonly description: "List API keys for an admin user. Returns list of API keys with apiKeyId, adminId, name, and expirationDate. Note: tokens are not returned in list responses for security.";
58
+ readonly inputSchema: {
59
+ adminId: z.ZodString;
60
+ page: z.ZodOptional<z.ZodNumber>;
61
+ perPage: z.ZodOptional<z.ZodNumber>;
62
+ };
63
+ readonly handler: typeof apiKeyList;
64
+ }, {
65
+ readonly name: "openloyalty_apikey_delete";
66
+ readonly description: "Delete an API key. Returns void on success (204 No Content). The API key will be immediately invalidated.";
67
+ readonly inputSchema: {
68
+ adminId: z.ZodString;
69
+ apiKeyId: z.ZodString;
70
+ };
71
+ readonly handler: typeof apiKeyDelete;
72
+ }];
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import { apiGet, apiPost, apiDelete } from "../client/http.js";
3
+ import { formatApiError } from "../utils/errors.js";
4
+ // Input Schemas
5
+ export const ApiKeyCreateInputSchema = {
6
+ adminId: z.string().describe("The admin ID (UUID) to create API key for."),
7
+ name: z.string().optional().describe("Name/description for the API key."),
8
+ expirationDate: z.string().optional().describe("Expiration date (ISO format: YYYY-MM-DD)."),
9
+ };
10
+ export const ApiKeyListInputSchema = {
11
+ adminId: z.string().describe("The admin ID (UUID) to list API keys for."),
12
+ page: z.number().optional().describe("Page number (default: 1)."),
13
+ perPage: z.number().optional().describe("Items per page (default: 25)."),
14
+ };
15
+ export const ApiKeyDeleteInputSchema = {
16
+ adminId: z.string().describe("The admin ID (UUID) that owns the API key."),
17
+ apiKeyId: z.string().describe("The API key ID to delete."),
18
+ };
19
+ // Handler functions
20
+ export async function apiKeyCreate(input) {
21
+ const payload = {};
22
+ if (input.name)
23
+ payload.name = input.name;
24
+ if (input.expirationDate)
25
+ payload.expirationDate = input.expirationDate;
26
+ try {
27
+ const response = await apiPost(`/admin/${input.adminId}/api-key`, { apiKey: payload });
28
+ return response;
29
+ }
30
+ catch (error) {
31
+ throw formatApiError(error, "openloyalty_apikey_create");
32
+ }
33
+ }
34
+ export async function apiKeyList(input) {
35
+ const params = new URLSearchParams();
36
+ if (input.page)
37
+ params.append("_page", String(input.page));
38
+ if (input.perPage)
39
+ params.append("_itemsOnPage", String(input.perPage));
40
+ const queryString = params.toString();
41
+ const url = `/admin/${input.adminId}/api-key${queryString ? `?${queryString}` : ""}`;
42
+ try {
43
+ const response = await apiGet(url);
44
+ return response;
45
+ }
46
+ catch (error) {
47
+ throw formatApiError(error, "openloyalty_apikey_list");
48
+ }
49
+ }
50
+ export async function apiKeyDelete(input) {
51
+ try {
52
+ await apiDelete(`/admin/${input.adminId}/api-key/${input.apiKeyId}`);
53
+ }
54
+ catch (error) {
55
+ throw formatApiError(error, "openloyalty_apikey_delete");
56
+ }
57
+ }
58
+ // Tool definitions
59
+ export const apiKeyToolDefinitions = [
60
+ {
61
+ name: "openloyalty_apikey_create",
62
+ description: "Create a new API key for an admin user. CRITICAL: The API token is ONLY returned at creation time. Store it securely immediately - it cannot be retrieved later. Returns apiKeyId, token, adminId, name, and expirationDate.",
63
+ inputSchema: ApiKeyCreateInputSchema,
64
+ handler: apiKeyCreate,
65
+ },
66
+ {
67
+ name: "openloyalty_apikey_list",
68
+ description: "List API keys for an admin user. Returns list of API keys with apiKeyId, adminId, name, and expirationDate. Note: tokens are not returned in list responses for security.",
69
+ inputSchema: ApiKeyListInputSchema,
70
+ handler: apiKeyList,
71
+ },
72
+ {
73
+ name: "openloyalty_apikey_delete",
74
+ description: "Delete an API key. Returns void on success (204 No Content). The API key will be immediately invalidated.",
75
+ inputSchema: ApiKeyDeleteInputSchema,
76
+ handler: apiKeyDelete,
77
+ },
78
+ ];
@@ -0,0 +1,107 @@
1
+ import { z } from "zod";
2
+ export interface AuditLogStore {
3
+ storeId: string;
4
+ code: string;
5
+ currency?: string;
6
+ name: string;
7
+ active?: boolean;
8
+ createdAt?: string;
9
+ updatedAt?: string;
10
+ createdBy?: string;
11
+ updatedBy?: string;
12
+ }
13
+ export interface AuditLogEntry {
14
+ auditLogId: string;
15
+ store?: AuditLogStore;
16
+ eventType: string;
17
+ entityType: string;
18
+ entityId: string;
19
+ username: string;
20
+ userId?: string;
21
+ userType?: string;
22
+ ip?: string;
23
+ createdAt: string;
24
+ }
25
+ export interface AuditLogListResponse {
26
+ items: AuditLogEntry[];
27
+ total?: Record<string, unknown>;
28
+ }
29
+ export interface AuditExport {
30
+ exportId: string;
31
+ status: string;
32
+ createdAt: string;
33
+ finishedAt?: string;
34
+ criteria?: string;
35
+ exportedRows?: number;
36
+ message?: string;
37
+ }
38
+ export interface AuditExportListResponse {
39
+ items: AuditExport[];
40
+ total?: {
41
+ all?: number;
42
+ filtered?: number;
43
+ estimated?: boolean;
44
+ };
45
+ }
46
+ export declare const AuditListInputSchema: {
47
+ page: z.ZodOptional<z.ZodNumber>;
48
+ perPage: z.ZodOptional<z.ZodNumber>;
49
+ eventType: z.ZodOptional<z.ZodString>;
50
+ entityId: z.ZodOptional<z.ZodString>;
51
+ entityType: z.ZodOptional<z.ZodString>;
52
+ username: z.ZodOptional<z.ZodString>;
53
+ dateFrom: z.ZodOptional<z.ZodString>;
54
+ dateTo: z.ZodOptional<z.ZodString>;
55
+ store: z.ZodOptional<z.ZodString>;
56
+ };
57
+ export declare const AuditExportInputSchema: {
58
+ dateFrom: z.ZodOptional<z.ZodString>;
59
+ dateTo: z.ZodOptional<z.ZodString>;
60
+ page: z.ZodOptional<z.ZodNumber>;
61
+ perPage: z.ZodOptional<z.ZodNumber>;
62
+ };
63
+ export declare function auditList(input: {
64
+ page?: number;
65
+ perPage?: number;
66
+ eventType?: string;
67
+ entityId?: string;
68
+ entityType?: string;
69
+ username?: string;
70
+ dateFrom?: string;
71
+ dateTo?: string;
72
+ store?: string;
73
+ }): Promise<AuditLogListResponse>;
74
+ export declare function auditExport(input: {
75
+ dateFrom?: string;
76
+ dateTo?: string;
77
+ page?: number;
78
+ perPage?: number;
79
+ }): Promise<{
80
+ exportId: string;
81
+ }>;
82
+ export declare const auditToolDefinitions: readonly [{
83
+ readonly name: "openloyalty_audit_list";
84
+ readonly description: "List audit log entries with optional filtering. Returns paginated list of audit entries with auditLogId, eventType, entityType, entityId, username, timestamp, and details. Audit logs track all administrative actions. Use for compliance and troubleshooting.";
85
+ readonly inputSchema: {
86
+ page: z.ZodOptional<z.ZodNumber>;
87
+ perPage: z.ZodOptional<z.ZodNumber>;
88
+ eventType: z.ZodOptional<z.ZodString>;
89
+ entityId: z.ZodOptional<z.ZodString>;
90
+ entityType: z.ZodOptional<z.ZodString>;
91
+ username: z.ZodOptional<z.ZodString>;
92
+ dateFrom: z.ZodOptional<z.ZodString>;
93
+ dateTo: z.ZodOptional<z.ZodString>;
94
+ store: z.ZodOptional<z.ZodString>;
95
+ };
96
+ readonly handler: typeof auditList;
97
+ }, {
98
+ readonly name: "openloyalty_audit_export";
99
+ readonly description: "Create an export of system logs. Returns exportId that can be used to track export status. The export will be processed asynchronously. Use date filters to scope the export range.";
100
+ readonly inputSchema: {
101
+ dateFrom: z.ZodOptional<z.ZodString>;
102
+ dateTo: z.ZodOptional<z.ZodString>;
103
+ page: z.ZodOptional<z.ZodNumber>;
104
+ perPage: z.ZodOptional<z.ZodNumber>;
105
+ };
106
+ readonly handler: typeof auditExport;
107
+ }];