@open-loyalty/mcp-server 1.0.3 → 1.3.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.
Files changed (142) hide show
  1. package/README.md +180 -177
  2. package/dist/auth/provider.js +2 -14
  3. package/dist/auth/storage.js +22 -0
  4. package/dist/client/http.d.ts +5 -0
  5. package/dist/client/http.js +62 -3
  6. package/dist/config.d.ts +6 -5
  7. package/dist/config.js +15 -11
  8. package/dist/http.js +170 -65
  9. package/dist/instructions.d.ts +5 -0
  10. package/dist/instructions.js +420 -0
  11. package/dist/prompts/fan-engagement-setup.d.ts +107 -0
  12. package/dist/prompts/fan-engagement-setup.js +492 -0
  13. package/dist/server.d.ts +1 -1
  14. package/dist/server.js +68 -278
  15. package/dist/tools/achievement/handlers.d.ts +117 -0
  16. package/dist/tools/achievement/handlers.js +161 -0
  17. package/dist/tools/achievement/index.d.ts +479 -0
  18. package/dist/tools/achievement/index.js +74 -0
  19. package/dist/tools/achievement/schemas.d.ts +433 -0
  20. package/dist/tools/achievement/schemas.js +142 -0
  21. package/dist/tools/achievement.d.ts +155 -121
  22. package/dist/tools/achievement.js +82 -39
  23. package/dist/tools/admin.d.ts +18 -6
  24. package/dist/tools/admin.js +24 -12
  25. package/dist/tools/analytics.d.ts +29 -11
  26. package/dist/tools/analytics.js +58 -48
  27. package/dist/tools/apikey.d.ts +10 -3
  28. package/dist/tools/apikey.js +13 -6
  29. package/dist/tools/audit.d.ts +6 -2
  30. package/dist/tools/audit.js +8 -4
  31. package/dist/tools/badge.d.ts +14 -6
  32. package/dist/tools/badge.js +36 -27
  33. package/dist/tools/campaign/handlers.d.ts +42 -0
  34. package/dist/tools/campaign/handlers.js +223 -0
  35. package/dist/tools/campaign/index.d.ts +783 -0
  36. package/dist/tools/campaign/index.js +112 -0
  37. package/dist/tools/campaign/member-handlers.d.ts +60 -0
  38. package/dist/tools/campaign/member-handlers.js +159 -0
  39. package/dist/tools/campaign/schemas.d.ts +704 -0
  40. package/dist/tools/campaign/schemas.js +259 -0
  41. package/dist/tools/campaign/types.d.ts +161 -0
  42. package/dist/tools/campaign/types.js +2 -0
  43. package/dist/tools/campaign.d.ts +41 -16
  44. package/dist/tools/campaign.js +38 -25
  45. package/dist/tools/custom-event.d.ts +315 -0
  46. package/dist/tools/custom-event.js +270 -0
  47. package/dist/tools/export.d.ts +12 -4
  48. package/dist/tools/export.js +25 -20
  49. package/dist/tools/import.d.ts +9 -3
  50. package/dist/tools/import.js +33 -21
  51. package/dist/tools/index.d.ts +3 -11
  52. package/dist/tools/index.js +17 -475
  53. package/dist/tools/member/handlers.d.ts +111 -0
  54. package/dist/tools/member/handlers.js +206 -0
  55. package/dist/tools/member/index.d.ts +169 -0
  56. package/dist/tools/member/index.js +92 -0
  57. package/dist/tools/member/schemas.d.ts +89 -0
  58. package/dist/tools/member/schemas.js +65 -0
  59. package/dist/tools/member.d.ts +21 -0
  60. package/dist/tools/member.js +56 -62
  61. package/dist/tools/points.d.ts +19 -6
  62. package/dist/tools/points.js +51 -49
  63. package/dist/tools/referral/handlers.d.ts +47 -0
  64. package/dist/tools/referral/handlers.js +115 -0
  65. package/dist/tools/referral/index.d.ts +44 -0
  66. package/dist/tools/referral/index.js +44 -0
  67. package/dist/tools/referral/schemas.d.ts +34 -0
  68. package/dist/tools/referral/schemas.js +52 -0
  69. package/dist/tools/reward/handlers.d.ts +110 -0
  70. package/dist/tools/reward/handlers.js +289 -0
  71. package/dist/tools/reward/index.d.ts +177 -0
  72. package/dist/tools/reward/index.js +90 -0
  73. package/dist/tools/reward/schemas.d.ts +116 -0
  74. package/dist/tools/reward/schemas.js +91 -0
  75. package/dist/tools/reward.d.ts +18 -0
  76. package/dist/tools/reward.js +56 -66
  77. package/dist/tools/role.d.ts +26 -7
  78. package/dist/tools/role.js +25 -12
  79. package/dist/tools/segment/handlers.d.ts +87 -0
  80. package/dist/tools/segment/handlers.js +174 -0
  81. package/dist/tools/segment/index.d.ts +395 -0
  82. package/dist/tools/segment/index.js +87 -0
  83. package/dist/tools/segment/schemas.d.ts +337 -0
  84. package/dist/tools/segment/schemas.js +79 -0
  85. package/dist/tools/segment.d.ts +29 -10
  86. package/dist/tools/segment.js +84 -50
  87. package/dist/tools/store.d.ts +12 -4
  88. package/dist/tools/store.js +16 -8
  89. package/dist/tools/tierset.d.ts +19 -7
  90. package/dist/tools/tierset.js +44 -35
  91. package/dist/tools/transaction.d.ts +16 -8
  92. package/dist/tools/transaction.js +25 -21
  93. package/dist/tools/wallet-type.d.ts +7 -3
  94. package/dist/tools/wallet-type.js +14 -12
  95. package/dist/tools/webhook.d.ts +23 -10
  96. package/dist/tools/webhook.js +135 -33
  97. package/dist/types/schemas/achievement.d.ts +12 -309
  98. package/dist/types/schemas/achievement.js +0 -13
  99. package/dist/types/schemas/admin.d.ts +10 -97
  100. package/dist/types/schemas/admin.js +0 -38
  101. package/dist/types/schemas/badge.d.ts +0 -37
  102. package/dist/types/schemas/badge.js +0 -11
  103. package/dist/types/schemas/campaign.d.ts +64 -832
  104. package/dist/types/schemas/campaign.js +2 -25
  105. package/dist/types/schemas/common.d.ts +5 -0
  106. package/dist/types/schemas/common.js +5 -0
  107. package/dist/types/schemas/export.d.ts +0 -17
  108. package/dist/types/schemas/export.js +0 -7
  109. package/dist/types/schemas/member.d.ts +37 -176
  110. package/dist/types/schemas/member.js +0 -27
  111. package/dist/types/schemas/points.d.ts +0 -63
  112. package/dist/types/schemas/points.js +0 -22
  113. package/dist/types/schemas/reward.d.ts +71 -68
  114. package/dist/types/schemas/reward.js +8 -28
  115. package/dist/types/schemas/role.d.ts +0 -100
  116. package/dist/types/schemas/role.js +0 -29
  117. package/dist/types/schemas/segment.d.ts +0 -58
  118. package/dist/types/schemas/segment.js +0 -17
  119. package/dist/types/schemas/tierset.d.ts +0 -176
  120. package/dist/types/schemas/tierset.js +0 -27
  121. package/dist/types/schemas/transaction.d.ts +23 -254
  122. package/dist/types/schemas/transaction.js +0 -7
  123. package/dist/types/schemas/wallet-type.d.ts +8 -8
  124. package/dist/types/schemas/wallet-type.js +1 -1
  125. package/dist/types/schemas/webhook.d.ts +0 -58
  126. package/dist/types/schemas/webhook.js +0 -12
  127. package/dist/utils/errors.js +30 -3
  128. package/dist/utils/payload.d.ts +12 -0
  129. package/dist/utils/payload.js +14 -0
  130. package/dist/workflows/app-login-streak.d.ts +39 -0
  131. package/dist/workflows/app-login-streak.js +298 -0
  132. package/dist/workflows/early-arrival.d.ts +33 -0
  133. package/dist/workflows/early-arrival.js +148 -0
  134. package/dist/workflows/index.d.ts +101 -0
  135. package/dist/workflows/index.js +208 -0
  136. package/dist/workflows/match-attendance.d.ts +45 -0
  137. package/dist/workflows/match-attendance.js +308 -0
  138. package/dist/workflows/sportsbar-visit.d.ts +41 -0
  139. package/dist/workflows/sportsbar-visit.js +284 -0
  140. package/dist/workflows/vod-watching.d.ts +43 -0
  141. package/dist/workflows/vod-watching.js +326 -0
  142. package/package.json +10 -2
@@ -0,0 +1,206 @@
1
+ import { apiGet, apiPost, apiPut, apiDelete } from "../../client/http.js";
2
+ import { MemberSchema } from "../../types/schemas/member.js";
3
+ import { formatApiError } from "../../utils/errors.js";
4
+ import { getStoreCode } from "../../config.js";
5
+ import { buildPaginationParams } from "../../utils/pagination.js";
6
+ import { omitUndefined } from "../../utils/payload.js";
7
+ export async function memberCreate(input) {
8
+ const storeCode = getStoreCode(input.storeCode);
9
+ const payload = omitUndefined({
10
+ email: input.email,
11
+ firstName: input.firstName,
12
+ lastName: input.lastName,
13
+ phone: input.phone,
14
+ birthDate: input.birthDate,
15
+ gender: input.gender,
16
+ loyaltyCardNumber: input.loyaltyCardNumber,
17
+ agreement1: input.agreement1,
18
+ agreement2: input.agreement2,
19
+ agreement3: input.agreement3,
20
+ address: input.address,
21
+ });
22
+ try {
23
+ const response = await apiPost(`/${storeCode}/member`, { customer: payload });
24
+ return {
25
+ memberId: response.customerId,
26
+ loyaltyCardNumber: response.loyaltyCardNumber || "",
27
+ email: response.email,
28
+ };
29
+ }
30
+ catch (error) {
31
+ throw formatApiError(error, "ol_member_create");
32
+ }
33
+ }
34
+ export async function memberGet(input) {
35
+ const storeCode = getStoreCode(input.storeCode);
36
+ try {
37
+ const response = await apiGet(`/${storeCode}/member/${input.memberId}`);
38
+ // Map API response to our schema
39
+ const data = response;
40
+ const mapped = {
41
+ memberId: data.customerId || data.memberId,
42
+ email: data.email,
43
+ firstName: data.firstName,
44
+ lastName: data.lastName,
45
+ phone: data.phone,
46
+ birthDate: data.birthDate,
47
+ gender: data.gender,
48
+ loyaltyCardNumber: data.loyaltyCardNumber,
49
+ active: data.active ?? true,
50
+ createdAt: data.createdAt,
51
+ address: data.address,
52
+ agreement1: data.agreement1,
53
+ agreement2: data.agreement2,
54
+ agreement3: data.agreement3,
55
+ levelId: data.levelId || data.level?.levelId,
56
+ levelName: data.levelName || data.level?.name,
57
+ points: data.points,
58
+ };
59
+ return MemberSchema.parse(mapped);
60
+ }
61
+ catch (error) {
62
+ throw formatApiError(error, "ol_member_get");
63
+ }
64
+ }
65
+ export async function memberList(input) {
66
+ const storeCode = getStoreCode(input.storeCode);
67
+ const params = new URLSearchParams();
68
+ // Use buildPaginationParams for cursor/page handling
69
+ buildPaginationParams({ cursor: input.cursor, page: input.page, perPage: input.perPage }, params);
70
+ if (input.email)
71
+ params.append("email", input.email);
72
+ if (input.firstName)
73
+ params.append("firstName", input.firstName);
74
+ if (input.lastName)
75
+ params.append("lastName", input.lastName);
76
+ if (input.phone)
77
+ params.append("phone", input.phone);
78
+ if (input.loyaltyCardNumber)
79
+ params.append("loyaltyCardNumber", input.loyaltyCardNumber);
80
+ if (input.active !== undefined)
81
+ params.append("active", String(input.active));
82
+ const queryString = params.toString();
83
+ const url = `/${storeCode}/member${queryString ? `?${queryString}` : ""}`;
84
+ try {
85
+ const response = await apiGet(url);
86
+ const members = (response.items || []).map((c) => {
87
+ const customer = c;
88
+ return {
89
+ memberId: (customer.customerId || customer.memberId),
90
+ email: customer.email,
91
+ firstName: customer.firstName,
92
+ lastName: customer.lastName,
93
+ loyaltyCardNumber: customer.loyaltyCardNumber,
94
+ active: (customer.active ?? true),
95
+ };
96
+ });
97
+ const total = response.total || {};
98
+ return {
99
+ members,
100
+ total: {
101
+ all: typeof total.all === 'number' ? total.all : undefined,
102
+ filtered: typeof total.filtered === 'number' ? total.filtered : undefined,
103
+ },
104
+ cursor: response.scroll,
105
+ };
106
+ }
107
+ catch (error) {
108
+ throw formatApiError(error, "ol_member_list");
109
+ }
110
+ }
111
+ export async function memberUpdate(input) {
112
+ const storeCode = getStoreCode(input.storeCode);
113
+ // API requires email even for partial updates - fetch existing member to get it
114
+ const existingResponse = await apiGet(`/${storeCode}/member/${input.memberId}`);
115
+ const existingEmail = existingResponse.email;
116
+ const payload = omitUndefined({
117
+ email: existingEmail, // Required by API even for partial updates
118
+ firstName: input.firstName,
119
+ lastName: input.lastName,
120
+ phone: input.phone,
121
+ birthDate: input.birthDate,
122
+ gender: input.gender,
123
+ address: input.address,
124
+ agreement1: input.agreement1,
125
+ agreement2: input.agreement2,
126
+ agreement3: input.agreement3,
127
+ });
128
+ try {
129
+ await apiPut(`/${storeCode}/member/${input.memberId}`, { customer: payload });
130
+ }
131
+ catch (error) {
132
+ throw formatApiError(error, "ol_member_update");
133
+ }
134
+ }
135
+ export async function memberActivate(input) {
136
+ const storeCode = getStoreCode(input.storeCode);
137
+ try {
138
+ await apiPost(`/${storeCode}/member/${input.memberId}/activate`);
139
+ }
140
+ catch (error) {
141
+ throw formatApiError(error, "ol_member_activate");
142
+ }
143
+ }
144
+ export async function memberDeactivate(input) {
145
+ const storeCode = getStoreCode(input.storeCode);
146
+ try {
147
+ await apiPost(`/${storeCode}/member/${input.memberId}/deactivate`);
148
+ }
149
+ catch (error) {
150
+ throw formatApiError(error, "ol_member_deactivate");
151
+ }
152
+ }
153
+ export async function memberDelete(input) {
154
+ const storeCode = getStoreCode(input.storeCode);
155
+ try {
156
+ await apiDelete(`/${storeCode}/member/${input.memberId}`);
157
+ }
158
+ catch (error) {
159
+ throw formatApiError(error, "ol_member_delete");
160
+ }
161
+ }
162
+ export async function memberGetTierProgress(input) {
163
+ const storeCode = getStoreCode(input.storeCode);
164
+ try {
165
+ // API uses /level endpoint, not /tier
166
+ const response = await apiGet(`/${storeCode}/member/${input.memberId}/level`);
167
+ // Response may have level data directly or nested
168
+ const currentLevel = (response.currentLevel || response.level);
169
+ const nextLevel = response.nextLevel;
170
+ return {
171
+ currentTier: currentLevel ? {
172
+ levelId: (currentLevel.levelId || currentLevel.id),
173
+ name: currentLevel.name,
174
+ } : undefined,
175
+ nextTier: nextLevel ? {
176
+ levelId: (nextLevel.levelId || nextLevel.id),
177
+ name: nextLevel.name,
178
+ } : undefined,
179
+ currentValue: (response.currentValue || response.value || 0),
180
+ requiredValue: (response.requiredValue || response.conditionValue),
181
+ progressPercent: (response.progressPercent || response.progress || 0),
182
+ };
183
+ }
184
+ catch (error) {
185
+ throw formatApiError(error, "ol_member_get_tier_progress");
186
+ }
187
+ }
188
+ export async function memberAssignTier(input) {
189
+ const storeCode = getStoreCode(input.storeCode);
190
+ try {
191
+ await apiPost(`/${storeCode}/member/${input.memberId}/tier`, { levelId: input.levelId });
192
+ }
193
+ catch (error) {
194
+ throw formatApiError(error, "ol_member_assign_tier");
195
+ }
196
+ }
197
+ export async function memberRemoveManualTier(input) {
198
+ const storeCode = getStoreCode(input.storeCode);
199
+ try {
200
+ // API uses POST to /remove-manually-level, not DELETE to /tier
201
+ await apiPost(`/${storeCode}/member/${input.memberId}/remove-manually-level`);
202
+ }
203
+ catch (error) {
204
+ throw formatApiError(error, "ol_member_remove_manual_tier");
205
+ }
206
+ }
@@ -0,0 +1,169 @@
1
+ export { MemberCreateInputSchema, MemberGetInputSchema, MemberListInputSchema, MemberUpdateInputSchema, MemberIdInputSchema, MemberAssignTierInputSchema, } from "./schemas.js";
2
+ export { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, } from "./handlers.js";
3
+ import { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier } from "./handlers.js";
4
+ export declare const memberToolDefinitions: readonly [{
5
+ readonly name: "ol_member_create";
6
+ readonly title: "Register New Member";
7
+ readonly description: "Register a new loyalty program member. Returns memberId for subsequent operations like points_add or member_get. Email must be unique within the store.";
8
+ readonly readOnly: false;
9
+ readonly inputSchema: {
10
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
11
+ email: import("zod").ZodString;
12
+ firstName: import("zod").ZodOptional<import("zod").ZodString>;
13
+ lastName: import("zod").ZodOptional<import("zod").ZodString>;
14
+ phone: import("zod").ZodOptional<import("zod").ZodString>;
15
+ birthDate: import("zod").ZodOptional<import("zod").ZodString>;
16
+ gender: import("zod").ZodOptional<import("zod").ZodEnum<["male", "female", "not_disclosed"]>>;
17
+ loyaltyCardNumber: import("zod").ZodOptional<import("zod").ZodString>;
18
+ agreement1: import("zod").ZodOptional<import("zod").ZodBoolean>;
19
+ agreement2: import("zod").ZodOptional<import("zod").ZodBoolean>;
20
+ agreement3: import("zod").ZodOptional<import("zod").ZodBoolean>;
21
+ address: import("zod").ZodOptional<import("zod").ZodObject<{
22
+ street: import("zod").ZodOptional<import("zod").ZodString>;
23
+ city: import("zod").ZodOptional<import("zod").ZodString>;
24
+ postal: import("zod").ZodOptional<import("zod").ZodString>;
25
+ country: import("zod").ZodOptional<import("zod").ZodString>;
26
+ province: import("zod").ZodOptional<import("zod").ZodString>;
27
+ }, "strip", import("zod").ZodTypeAny, {
28
+ street?: string | undefined;
29
+ city?: string | undefined;
30
+ postal?: string | undefined;
31
+ country?: string | undefined;
32
+ province?: string | undefined;
33
+ }, {
34
+ street?: string | undefined;
35
+ city?: string | undefined;
36
+ postal?: string | undefined;
37
+ country?: string | undefined;
38
+ province?: string | undefined;
39
+ }>>;
40
+ };
41
+ readonly handler: typeof memberCreate;
42
+ }, {
43
+ readonly name: "ol_member_get";
44
+ readonly title: "Get Member Profile";
45
+ readonly description: "Get member details including profile, points balance, and tier status. Use memberId from member_create or member_list.";
46
+ readonly readOnly: true;
47
+ readonly inputSchema: {
48
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
49
+ memberId: import("zod").ZodString;
50
+ };
51
+ readonly handler: typeof memberGet;
52
+ }, {
53
+ readonly name: "ol_member_list";
54
+ readonly title: "Search Members";
55
+ readonly description: string;
56
+ readonly readOnly: true;
57
+ readonly inputSchema: {
58
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
59
+ cursor: import("zod").ZodOptional<import("zod").ZodString>;
60
+ page: import("zod").ZodOptional<import("zod").ZodNumber>;
61
+ perPage: import("zod").ZodOptional<import("zod").ZodNumber>;
62
+ email: import("zod").ZodOptional<import("zod").ZodString>;
63
+ firstName: import("zod").ZodOptional<import("zod").ZodString>;
64
+ lastName: import("zod").ZodOptional<import("zod").ZodString>;
65
+ phone: import("zod").ZodOptional<import("zod").ZodString>;
66
+ loyaltyCardNumber: import("zod").ZodOptional<import("zod").ZodString>;
67
+ active: import("zod").ZodOptional<import("zod").ZodBoolean>;
68
+ };
69
+ readonly handler: typeof memberList;
70
+ }, {
71
+ readonly name: "ol_member_update";
72
+ readonly title: "Update Member Profile";
73
+ readonly description: "Update member profile fields. Cannot change email. Use member_get first to see current values.";
74
+ readonly readOnly: false;
75
+ readonly inputSchema: {
76
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
77
+ memberId: import("zod").ZodString;
78
+ firstName: import("zod").ZodOptional<import("zod").ZodString>;
79
+ lastName: import("zod").ZodOptional<import("zod").ZodString>;
80
+ phone: import("zod").ZodOptional<import("zod").ZodString>;
81
+ birthDate: import("zod").ZodOptional<import("zod").ZodString>;
82
+ gender: import("zod").ZodOptional<import("zod").ZodEnum<["male", "female", "not_disclosed"]>>;
83
+ address: import("zod").ZodOptional<import("zod").ZodObject<{
84
+ street: import("zod").ZodOptional<import("zod").ZodString>;
85
+ city: import("zod").ZodOptional<import("zod").ZodString>;
86
+ postal: import("zod").ZodOptional<import("zod").ZodString>;
87
+ country: import("zod").ZodOptional<import("zod").ZodString>;
88
+ province: import("zod").ZodOptional<import("zod").ZodString>;
89
+ }, "strip", import("zod").ZodTypeAny, {
90
+ street?: string | undefined;
91
+ city?: string | undefined;
92
+ postal?: string | undefined;
93
+ country?: string | undefined;
94
+ province?: string | undefined;
95
+ }, {
96
+ street?: string | undefined;
97
+ city?: string | undefined;
98
+ postal?: string | undefined;
99
+ country?: string | undefined;
100
+ province?: string | undefined;
101
+ }>>;
102
+ agreement1: import("zod").ZodOptional<import("zod").ZodBoolean>;
103
+ agreement2: import("zod").ZodOptional<import("zod").ZodBoolean>;
104
+ agreement3: import("zod").ZodOptional<import("zod").ZodBoolean>;
105
+ };
106
+ readonly handler: typeof memberUpdate;
107
+ }, {
108
+ readonly name: "ol_member_activate";
109
+ readonly title: "Activate Member Account";
110
+ readonly description: "Activate a member account. Inactive members cannot earn or spend points.";
111
+ readonly readOnly: false;
112
+ readonly inputSchema: {
113
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
114
+ memberId: import("zod").ZodString;
115
+ };
116
+ readonly handler: typeof memberActivate;
117
+ }, {
118
+ readonly name: "ol_member_deactivate";
119
+ readonly title: "Deactivate Member Account";
120
+ readonly description: "Deactivate a member account. Deactivated members cannot earn or spend points but retain their balance.";
121
+ readonly readOnly: false;
122
+ readonly inputSchema: {
123
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
124
+ memberId: import("zod").ZodString;
125
+ };
126
+ readonly handler: typeof memberDeactivate;
127
+ }, {
128
+ readonly name: "ol_member_delete";
129
+ readonly title: "Delete Member (Permanent)";
130
+ readonly description: "Permanently removes member and all associated data. Cannot be undone. Use for GDPR compliance or member requests.";
131
+ readonly readOnly: false;
132
+ readonly destructive: true;
133
+ readonly inputSchema: {
134
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
135
+ memberId: import("zod").ZodString;
136
+ };
137
+ readonly handler: typeof memberDelete;
138
+ }, {
139
+ readonly name: "ol_member_get_tier_progress";
140
+ readonly title: "Check Tier Progress";
141
+ readonly description: "Get member tier progression status showing current tier and progress to next. Returns currentValue, requiredValue, and progressPercent.";
142
+ readonly readOnly: true;
143
+ readonly inputSchema: {
144
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
145
+ memberId: import("zod").ZodString;
146
+ };
147
+ readonly handler: typeof memberGetTierProgress;
148
+ }, {
149
+ readonly name: "ol_member_assign_tier";
150
+ readonly title: "Assign Tier to Member";
151
+ readonly description: "Manually assign a tier level to a member, overriding automatic tier calculation. Use tierset_get_tiers to find available levelId values.";
152
+ readonly readOnly: false;
153
+ readonly inputSchema: {
154
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
155
+ memberId: import("zod").ZodString;
156
+ levelId: import("zod").ZodString;
157
+ };
158
+ readonly handler: typeof memberAssignTier;
159
+ }, {
160
+ readonly name: "ol_member_remove_manual_tier";
161
+ readonly title: "Remove Manual Tier Assignment";
162
+ readonly description: "Remove manually assigned tier from member, restoring automatic tier calculation based on conditions.";
163
+ readonly readOnly: false;
164
+ readonly inputSchema: {
165
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
166
+ memberId: import("zod").ZodString;
167
+ };
168
+ readonly handler: typeof memberRemoveManualTier;
169
+ }];
@@ -0,0 +1,92 @@
1
+ // Re-export schemas
2
+ export { MemberCreateInputSchema, MemberGetInputSchema, MemberListInputSchema, MemberUpdateInputSchema, MemberIdInputSchema, MemberAssignTierInputSchema, } from "./schemas.js";
3
+ // Re-export handlers
4
+ export { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, } from "./handlers.js";
5
+ // Imports for tool definitions
6
+ import { MemberCreateInputSchema, MemberGetInputSchema, MemberListInputSchema, MemberUpdateInputSchema, MemberIdInputSchema, MemberAssignTierInputSchema, } from "./schemas.js";
7
+ import { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, } from "./handlers.js";
8
+ // Tool definitions
9
+ export const memberToolDefinitions = [
10
+ {
11
+ name: "ol_member_create",
12
+ title: "Register New Member",
13
+ description: "Register a new loyalty program member. Returns memberId for subsequent operations like points_add or member_get. Email must be unique within the store.",
14
+ readOnly: false,
15
+ inputSchema: MemberCreateInputSchema,
16
+ handler: memberCreate,
17
+ },
18
+ {
19
+ name: "ol_member_get",
20
+ title: "Get Member Profile",
21
+ description: "Get member details including profile, points balance, and tier status. Use memberId from member_create or member_list.",
22
+ readOnly: true,
23
+ inputSchema: MemberGetInputSchema,
24
+ handler: memberGet,
25
+ },
26
+ {
27
+ name: "ol_member_list",
28
+ title: "Search Members",
29
+ description: "Search and list members with optional filters. Use member_get for full details of a specific member. " +
30
+ "Supports cursor pagination: provide 'cursor' from previous response to get next page.",
31
+ readOnly: true,
32
+ inputSchema: MemberListInputSchema,
33
+ handler: memberList,
34
+ },
35
+ {
36
+ name: "ol_member_update",
37
+ title: "Update Member Profile",
38
+ description: "Update member profile fields. Cannot change email. Use member_get first to see current values.",
39
+ readOnly: false,
40
+ inputSchema: MemberUpdateInputSchema,
41
+ handler: memberUpdate,
42
+ },
43
+ {
44
+ name: "ol_member_activate",
45
+ title: "Activate Member Account",
46
+ description: "Activate a member account. Inactive members cannot earn or spend points.",
47
+ readOnly: false,
48
+ inputSchema: MemberIdInputSchema,
49
+ handler: memberActivate,
50
+ },
51
+ {
52
+ name: "ol_member_deactivate",
53
+ title: "Deactivate Member Account",
54
+ description: "Deactivate a member account. Deactivated members cannot earn or spend points but retain their balance.",
55
+ readOnly: false,
56
+ inputSchema: MemberIdInputSchema,
57
+ handler: memberDeactivate,
58
+ },
59
+ {
60
+ name: "ol_member_delete",
61
+ title: "Delete Member (Permanent)",
62
+ description: "Permanently removes member and all associated data. Cannot be undone. Use for GDPR compliance or member requests.",
63
+ readOnly: false,
64
+ destructive: true,
65
+ inputSchema: MemberIdInputSchema,
66
+ handler: memberDelete,
67
+ },
68
+ {
69
+ name: "ol_member_get_tier_progress",
70
+ title: "Check Tier Progress",
71
+ description: "Get member tier progression status showing current tier and progress to next. Returns currentValue, requiredValue, and progressPercent.",
72
+ readOnly: true,
73
+ inputSchema: MemberIdInputSchema,
74
+ handler: memberGetTierProgress,
75
+ },
76
+ {
77
+ name: "ol_member_assign_tier",
78
+ title: "Assign Tier to Member",
79
+ description: "Manually assign a tier level to a member, overriding automatic tier calculation. Use tierset_get_tiers to find available levelId values.",
80
+ readOnly: false,
81
+ inputSchema: MemberAssignTierInputSchema,
82
+ handler: memberAssignTier,
83
+ },
84
+ {
85
+ name: "ol_member_remove_manual_tier",
86
+ title: "Remove Manual Tier Assignment",
87
+ description: "Remove manually assigned tier from member, restoring automatic tier calculation based on conditions.",
88
+ readOnly: false,
89
+ inputSchema: MemberIdInputSchema,
90
+ handler: memberRemoveManualTier,
91
+ },
92
+ ];
@@ -0,0 +1,89 @@
1
+ import { z } from "zod";
2
+ export declare const MemberCreateInputSchema: {
3
+ storeCode: z.ZodOptional<z.ZodString>;
4
+ email: z.ZodString;
5
+ firstName: z.ZodOptional<z.ZodString>;
6
+ lastName: z.ZodOptional<z.ZodString>;
7
+ phone: z.ZodOptional<z.ZodString>;
8
+ birthDate: z.ZodOptional<z.ZodString>;
9
+ gender: z.ZodOptional<z.ZodEnum<["male", "female", "not_disclosed"]>>;
10
+ loyaltyCardNumber: z.ZodOptional<z.ZodString>;
11
+ agreement1: z.ZodOptional<z.ZodBoolean>;
12
+ agreement2: z.ZodOptional<z.ZodBoolean>;
13
+ agreement3: z.ZodOptional<z.ZodBoolean>;
14
+ address: z.ZodOptional<z.ZodObject<{
15
+ street: z.ZodOptional<z.ZodString>;
16
+ city: z.ZodOptional<z.ZodString>;
17
+ postal: z.ZodOptional<z.ZodString>;
18
+ country: z.ZodOptional<z.ZodString>;
19
+ province: z.ZodOptional<z.ZodString>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ street?: string | undefined;
22
+ city?: string | undefined;
23
+ postal?: string | undefined;
24
+ country?: string | undefined;
25
+ province?: string | undefined;
26
+ }, {
27
+ street?: string | undefined;
28
+ city?: string | undefined;
29
+ postal?: string | undefined;
30
+ country?: string | undefined;
31
+ province?: string | undefined;
32
+ }>>;
33
+ };
34
+ export declare const MemberGetInputSchema: {
35
+ storeCode: z.ZodOptional<z.ZodString>;
36
+ memberId: z.ZodString;
37
+ };
38
+ export declare const MemberListInputSchema: {
39
+ storeCode: z.ZodOptional<z.ZodString>;
40
+ cursor: z.ZodOptional<z.ZodString>;
41
+ page: z.ZodOptional<z.ZodNumber>;
42
+ perPage: z.ZodOptional<z.ZodNumber>;
43
+ email: z.ZodOptional<z.ZodString>;
44
+ firstName: z.ZodOptional<z.ZodString>;
45
+ lastName: z.ZodOptional<z.ZodString>;
46
+ phone: z.ZodOptional<z.ZodString>;
47
+ loyaltyCardNumber: z.ZodOptional<z.ZodString>;
48
+ active: z.ZodOptional<z.ZodBoolean>;
49
+ };
50
+ export declare const MemberUpdateInputSchema: {
51
+ storeCode: z.ZodOptional<z.ZodString>;
52
+ memberId: z.ZodString;
53
+ firstName: z.ZodOptional<z.ZodString>;
54
+ lastName: z.ZodOptional<z.ZodString>;
55
+ phone: z.ZodOptional<z.ZodString>;
56
+ birthDate: z.ZodOptional<z.ZodString>;
57
+ gender: z.ZodOptional<z.ZodEnum<["male", "female", "not_disclosed"]>>;
58
+ address: z.ZodOptional<z.ZodObject<{
59
+ street: z.ZodOptional<z.ZodString>;
60
+ city: z.ZodOptional<z.ZodString>;
61
+ postal: z.ZodOptional<z.ZodString>;
62
+ country: z.ZodOptional<z.ZodString>;
63
+ province: z.ZodOptional<z.ZodString>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ street?: string | undefined;
66
+ city?: string | undefined;
67
+ postal?: string | undefined;
68
+ country?: string | undefined;
69
+ province?: string | undefined;
70
+ }, {
71
+ street?: string | undefined;
72
+ city?: string | undefined;
73
+ postal?: string | undefined;
74
+ country?: string | undefined;
75
+ province?: string | undefined;
76
+ }>>;
77
+ agreement1: z.ZodOptional<z.ZodBoolean>;
78
+ agreement2: z.ZodOptional<z.ZodBoolean>;
79
+ agreement3: z.ZodOptional<z.ZodBoolean>;
80
+ };
81
+ export declare const MemberIdInputSchema: {
82
+ storeCode: z.ZodOptional<z.ZodString>;
83
+ memberId: z.ZodString;
84
+ };
85
+ export declare const MemberAssignTierInputSchema: {
86
+ storeCode: z.ZodOptional<z.ZodString>;
87
+ memberId: z.ZodString;
88
+ levelId: z.ZodString;
89
+ };
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export const MemberCreateInputSchema = {
3
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
4
+ email: z.string().describe("Member email address (required, must be unique)."),
5
+ firstName: z.string().optional().describe("Member first name."),
6
+ lastName: z.string().optional().describe("Member last name."),
7
+ phone: z.string().optional().describe("Member phone number."),
8
+ birthDate: z.string().optional().describe("Member birth date (YYYY-MM-DD format)."),
9
+ gender: z.enum(["male", "female", "not_disclosed"]).optional().describe("Member gender."),
10
+ loyaltyCardNumber: z.string().optional().describe("Loyalty card number. Auto-generated if not provided."),
11
+ agreement1: z.boolean().optional().describe("Terms acceptance."),
12
+ agreement2: z.boolean().optional().describe("Marketing consent."),
13
+ agreement3: z.boolean().optional().describe("Additional agreement."),
14
+ address: z.object({
15
+ street: z.string().optional(),
16
+ city: z.string().optional(),
17
+ postal: z.string().optional(),
18
+ country: z.string().optional(),
19
+ province: z.string().optional(),
20
+ }).optional().describe("Member address."),
21
+ };
22
+ export const MemberGetInputSchema = {
23
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
24
+ memberId: z.string().describe("The member ID (UUID) to retrieve."),
25
+ };
26
+ export const MemberListInputSchema = {
27
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
28
+ cursor: z.string().optional().describe("Pagination cursor from previous response. If provided, page/perPage are ignored."),
29
+ page: z.number().optional().describe("Page number (default: 1)."),
30
+ perPage: z.number().optional().describe("Items per page (default: 10)."),
31
+ email: z.string().optional().describe("Filter by email address."),
32
+ firstName: z.string().optional().describe("Filter by first name."),
33
+ lastName: z.string().optional().describe("Filter by last name."),
34
+ phone: z.string().optional().describe("Filter by phone number."),
35
+ loyaltyCardNumber: z.string().optional().describe("Filter by loyalty card number."),
36
+ active: z.boolean().optional().describe("Filter by active status."),
37
+ };
38
+ export const MemberUpdateInputSchema = {
39
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
40
+ memberId: z.string().describe("The member ID (UUID) to update."),
41
+ firstName: z.string().optional().describe("Member first name."),
42
+ lastName: z.string().optional().describe("Member last name."),
43
+ phone: z.string().optional().describe("Member phone number."),
44
+ birthDate: z.string().optional().describe("Member birth date (YYYY-MM-DD format)."),
45
+ gender: z.enum(["male", "female", "not_disclosed"]).optional().describe("Member gender."),
46
+ address: z.object({
47
+ street: z.string().optional(),
48
+ city: z.string().optional(),
49
+ postal: z.string().optional(),
50
+ country: z.string().optional(),
51
+ province: z.string().optional(),
52
+ }).optional().describe("Member address."),
53
+ agreement1: z.boolean().optional().describe("Terms acceptance."),
54
+ agreement2: z.boolean().optional().describe("Marketing consent."),
55
+ agreement3: z.boolean().optional().describe("Additional agreement."),
56
+ };
57
+ export const MemberIdInputSchema = {
58
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
59
+ memberId: z.string().describe("The member ID (UUID)."),
60
+ };
61
+ export const MemberAssignTierInputSchema = {
62
+ storeCode: z.string().optional().describe("Store code for multi-tenant routing. DO NOT pass this parameter - the configured default will be used automatically. Only provide a value if the user explicitly asks to work with a different store."),
63
+ memberId: z.string().describe("The member ID (UUID)."),
64
+ levelId: z.string().describe("The tier level ID (UUID) to assign."),
65
+ };