@open-loyalty/mcp-server 1.5.3 → 1.7.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 (132) hide show
  1. package/dist/config.d.ts +4 -0
  2. package/dist/config.js +11 -0
  3. package/dist/index.js +0 -8
  4. package/dist/server.js +13 -0
  5. package/dist/tools/achievement/handlers.js +47 -0
  6. package/dist/tools/achievement/index.d.ts +11 -4
  7. package/dist/tools/achievement/index.js +12 -1
  8. package/dist/tools/achievement/schemas.d.ts +4 -4
  9. package/dist/tools/achievement/schemas.js +13 -12
  10. package/dist/tools/admin/handlers.d.ts +48 -0
  11. package/dist/tools/admin/handlers.js +159 -0
  12. package/dist/tools/admin/index.d.ts +86 -0
  13. package/dist/tools/admin/index.js +64 -0
  14. package/dist/tools/admin/schemas.d.ts +40 -0
  15. package/dist/tools/admin/schemas.js +40 -0
  16. package/dist/tools/analytics/handlers.d.ts +42 -0
  17. package/dist/tools/analytics/handlers.js +282 -0
  18. package/dist/tools/analytics/index.d.ts +108 -0
  19. package/dist/tools/analytics/index.js +91 -0
  20. package/dist/tools/analytics/schemas.d.ts +42 -0
  21. package/dist/tools/analytics/schemas.js +47 -0
  22. package/dist/tools/apikey/handlers.d.ts +15 -0
  23. package/dist/tools/apikey/handlers.js +53 -0
  24. package/dist/tools/apikey/index.d.ts +41 -0
  25. package/dist/tools/apikey/index.js +38 -0
  26. package/dist/tools/apikey/schemas.d.ts +31 -0
  27. package/dist/tools/apikey/schemas.js +15 -0
  28. package/dist/tools/audit/handlers.d.ts +20 -0
  29. package/dist/tools/audit/handlers.js +82 -0
  30. package/dist/tools/audit/index.d.ts +36 -0
  31. package/dist/tools/audit/index.js +28 -0
  32. package/dist/tools/audit/schemas.d.ts +62 -0
  33. package/dist/tools/audit/schemas.js +18 -0
  34. package/dist/tools/badge/handlers.d.ts +45 -0
  35. package/dist/tools/badge/handlers.js +135 -0
  36. package/dist/tools/badge/index.d.ts +68 -0
  37. package/dist/tools/badge/index.js +47 -0
  38. package/dist/tools/badge/schemas.d.ts +37 -0
  39. package/dist/tools/badge/schemas.js +31 -0
  40. package/dist/tools/campaign/handlers.js +61 -0
  41. package/dist/tools/campaign/index.d.ts +12 -0
  42. package/dist/tools/campaign/index.js +20 -1
  43. package/dist/tools/campaign/member-handlers.js +37 -1
  44. package/dist/tools/campaign/schemas.js +16 -14
  45. package/dist/tools/custom-event/handlers.d.ts +98 -0
  46. package/dist/tools/custom-event/handlers.js +238 -0
  47. package/dist/tools/custom-event/index.d.ts +139 -0
  48. package/dist/tools/custom-event/index.js +78 -0
  49. package/dist/tools/custom-event/schemas.d.ts +87 -0
  50. package/dist/tools/custom-event/schemas.js +59 -0
  51. package/dist/tools/export/handlers.d.ts +29 -0
  52. package/dist/tools/export/handlers.js +128 -0
  53. package/dist/tools/export/index.d.ts +56 -0
  54. package/dist/tools/export/index.js +46 -0
  55. package/dist/tools/export/schemas.d.ts +42 -0
  56. package/dist/tools/export/schemas.js +41 -0
  57. package/dist/tools/import/handlers.d.ts +22 -0
  58. package/dist/tools/import/handlers.js +123 -0
  59. package/dist/tools/import/index.d.ts +45 -0
  60. package/dist/tools/import/index.js +41 -0
  61. package/dist/tools/import/schemas.d.ts +57 -0
  62. package/dist/tools/import/schemas.js +39 -0
  63. package/dist/tools/index.d.ts +1 -0
  64. package/dist/tools/index.js +11 -11
  65. package/dist/tools/member/handlers.js +30 -0
  66. package/dist/tools/member/index.d.ts +10 -0
  67. package/dist/tools/member/index.js +10 -0
  68. package/dist/tools/member/schemas.js +13 -13
  69. package/dist/tools/points/handlers.js +73 -0
  70. package/dist/tools/points/index.d.ts +6 -0
  71. package/dist/tools/points/index.js +6 -0
  72. package/dist/tools/points/schemas.js +1 -1
  73. package/dist/tools/referral/index.d.ts +3 -0
  74. package/dist/tools/referral/index.js +3 -0
  75. package/dist/tools/reward/handlers.js +21 -13
  76. package/dist/tools/reward/index.d.ts +9 -0
  77. package/dist/tools/reward/index.js +12 -1
  78. package/dist/tools/reward/schemas.js +2 -2
  79. package/dist/tools/role/handlers.d.ts +35 -0
  80. package/dist/tools/role/handlers.js +127 -0
  81. package/dist/tools/role/index.d.ts +99 -0
  82. package/dist/tools/role/index.js +65 -0
  83. package/dist/tools/role/schemas.d.ts +56 -0
  84. package/dist/tools/role/schemas.js +35 -0
  85. package/dist/tools/segment/handlers.js +68 -1
  86. package/dist/tools/segment/index.d.ts +9 -0
  87. package/dist/tools/segment/index.js +13 -0
  88. package/dist/tools/segment/schemas.js +8 -5
  89. package/dist/tools/store/handlers.d.ts +25 -0
  90. package/dist/tools/store/handlers.js +89 -0
  91. package/dist/tools/store/index.d.ts +55 -0
  92. package/dist/tools/store/index.js +46 -0
  93. package/dist/tools/store/schemas.d.ts +38 -0
  94. package/dist/tools/store/schemas.js +23 -0
  95. package/dist/tools/tierset/handlers.js +92 -1
  96. package/dist/tools/tierset/index.d.ts +6 -0
  97. package/dist/tools/tierset/index.js +8 -1
  98. package/dist/tools/transaction/handlers.js +40 -0
  99. package/dist/tools/transaction/index.d.ts +4 -0
  100. package/dist/tools/transaction/index.js +4 -0
  101. package/dist/tools/transaction/schemas.js +3 -3
  102. package/dist/tools/wallet-type/index.d.ts +4 -0
  103. package/dist/tools/wallet-type/index.js +5 -1
  104. package/dist/tools/webhook/handlers.d.ts +34 -0
  105. package/dist/tools/webhook/handlers.js +147 -0
  106. package/dist/tools/webhook/index.d.ts +97 -0
  107. package/dist/tools/webhook/index.js +65 -0
  108. package/dist/tools/webhook/schemas.d.ts +72 -0
  109. package/dist/tools/{webhook.js → webhook/schemas.js} +0 -140
  110. package/dist/types/schemas/tierset.js +3 -1
  111. package/package.json +1 -1
  112. package/dist/tools/admin.d.ts +0 -165
  113. package/dist/tools/admin.js +0 -205
  114. package/dist/tools/analytics.d.ts +0 -180
  115. package/dist/tools/analytics.js +0 -255
  116. package/dist/tools/apikey.d.ts +0 -79
  117. package/dist/tools/apikey.js +0 -85
  118. package/dist/tools/audit.d.ts +0 -111
  119. package/dist/tools/audit.js +0 -94
  120. package/dist/tools/badge.d.ts +0 -143
  121. package/dist/tools/badge.js +0 -174
  122. package/dist/tools/custom-event.d.ts +0 -315
  123. package/dist/tools/custom-event.js +0 -271
  124. package/dist/tools/export.d.ts +0 -118
  125. package/dist/tools/export.js +0 -152
  126. package/dist/tools/import.d.ts +0 -116
  127. package/dist/tools/import.js +0 -143
  128. package/dist/tools/role.d.ts +0 -180
  129. package/dist/tools/role.js +0 -173
  130. package/dist/tools/store.d.ts +0 -109
  131. package/dist/tools/store.js +0 -125
  132. package/dist/tools/webhook.d.ts +0 -192
@@ -0,0 +1,78 @@
1
+ // Re-export schemas
2
+ export { CustomEventSchemaListInputSchema, CustomEventSchemaGetInputSchema, CustomEventSchemaCreateInputSchema, CustomEventSchemaUpdateInputSchema, CustomEventSchemaActivateInputSchema, CustomEventSendInputSchema, CustomEventListInputSchema, } from "./schemas.js";
3
+ // Re-export handlers
4
+ export { customEventSchemaList, customEventSchemaGet, customEventSchemaCreate, customEventSchemaUpdate, customEventSchemaActivate, customEventSend, customEventList, } from "./handlers.js";
5
+ // Imports for tool definitions
6
+ import { CustomEventSchemaListInputSchema, CustomEventSchemaGetInputSchema, CustomEventSchemaCreateInputSchema, CustomEventSchemaUpdateInputSchema, CustomEventSchemaActivateInputSchema, CustomEventSendInputSchema, CustomEventListInputSchema, } from "./schemas.js";
7
+ import { customEventSchemaList, customEventSchemaGet, customEventSchemaCreate, customEventSchemaUpdate, customEventSchemaActivate, customEventSend, customEventList, } from "./handlers.js";
8
+ // Tool definitions
9
+ export const customEventToolDefinitions = [
10
+ {
11
+ name: "ol_custom_event_schema_list",
12
+ title: "List Custom Event Schemas",
13
+ description: "List available custom event schemas. Custom event schemas define event types that can trigger campaigns and achievements. " +
14
+ "Use this to discover existing event types before creating campaigns/achievements with trigger='custom_event'.",
15
+ readOnly: true,
16
+ idempotent: true,
17
+ inputSchema: CustomEventSchemaListInputSchema,
18
+ handler: customEventSchemaList,
19
+ },
20
+ {
21
+ name: "ol_custom_event_schema_get",
22
+ title: "Get Custom Event Schema",
23
+ description: "Get details of a specific custom event schema including its fields.",
24
+ readOnly: true,
25
+ idempotent: true,
26
+ inputSchema: CustomEventSchemaGetInputSchema,
27
+ handler: customEventSchemaGet,
28
+ },
29
+ {
30
+ name: "ol_custom_event_schema_create",
31
+ title: "Create Custom Event Schema",
32
+ description: "Create a new custom event schema. REQUIRED before using a custom event in campaigns or achievements. " +
33
+ "Example: To track location visits, create schema with eventType='location_visit' and fields like [{name: 'location_id', type: 'text'}]. " +
34
+ "Valid field types: 'text' (strings), 'number' (integers/decimals), 'boolean', 'datetime'. " +
35
+ "Then use campaign_create with trigger='custom_event', event='location_visit'.",
36
+ readOnly: false,
37
+ idempotent: false,
38
+ inputSchema: CustomEventSchemaCreateInputSchema,
39
+ handler: customEventSchemaCreate,
40
+ },
41
+ {
42
+ name: "ol_custom_event_schema_update",
43
+ title: "Update Custom Event Schema",
44
+ description: "Update an existing custom event schema (name, fields, active status).",
45
+ readOnly: false,
46
+ idempotent: true,
47
+ inputSchema: CustomEventSchemaUpdateInputSchema,
48
+ handler: customEventSchemaUpdate,
49
+ },
50
+ {
51
+ name: "ol_custom_event_schema_activate",
52
+ title: "Activate/Deactivate Custom Event Schema",
53
+ description: "Activate or deactivate a custom event schema. Inactive schemas won't trigger campaigns/achievements.",
54
+ readOnly: false,
55
+ idempotent: true,
56
+ inputSchema: CustomEventSchemaActivateInputSchema,
57
+ handler: customEventSchemaActivate,
58
+ },
59
+ {
60
+ name: "ol_custom_event_send",
61
+ title: "Send Custom Event",
62
+ description: "Send a custom event for a member. Triggers any campaigns/achievements that match the event type. " +
63
+ "The event schema must exist. Identify member by customerId, email, phone, or loyaltyCardNumber.",
64
+ readOnly: false,
65
+ idempotent: false,
66
+ inputSchema: CustomEventSendInputSchema,
67
+ handler: customEventSend,
68
+ },
69
+ {
70
+ name: "ol_custom_event_list",
71
+ title: "List Custom Events",
72
+ description: "List custom events that have been sent. Filter by event type or member to see event history.",
73
+ readOnly: true,
74
+ idempotent: true,
75
+ inputSchema: CustomEventListInputSchema,
76
+ handler: customEventList,
77
+ },
78
+ ];
@@ -0,0 +1,87 @@
1
+ import { z } from "zod";
2
+ export declare const CustomEventSchemaListInputSchema: {
3
+ storeCode: z.ZodOptional<z.ZodString>;
4
+ page: z.ZodOptional<z.ZodNumber>;
5
+ perPage: z.ZodOptional<z.ZodNumber>;
6
+ eventType: z.ZodOptional<z.ZodString>;
7
+ name: z.ZodOptional<z.ZodString>;
8
+ active: z.ZodOptional<z.ZodBoolean>;
9
+ };
10
+ export declare const CustomEventSchemaGetInputSchema: {
11
+ storeCode: z.ZodOptional<z.ZodString>;
12
+ eventType: z.ZodString;
13
+ };
14
+ export declare const CustomEventSchemaCreateInputSchema: {
15
+ storeCode: z.ZodOptional<z.ZodString>;
16
+ eventType: z.ZodString;
17
+ name: z.ZodString;
18
+ fields: z.ZodArray<z.ZodObject<{
19
+ name: z.ZodString;
20
+ type: z.ZodEnum<["text", "number", "boolean", "datetime"]>;
21
+ description: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ type: "number" | "boolean" | "text" | "datetime";
24
+ name: string;
25
+ description?: string | undefined;
26
+ }, {
27
+ type: "number" | "boolean" | "text" | "datetime";
28
+ name: string;
29
+ description?: string | undefined;
30
+ }>, "many">;
31
+ active: z.ZodOptional<z.ZodBoolean>;
32
+ };
33
+ export declare const CustomEventSchemaUpdateInputSchema: {
34
+ storeCode: z.ZodOptional<z.ZodString>;
35
+ eventType: z.ZodString;
36
+ name: z.ZodString;
37
+ fields: z.ZodArray<z.ZodObject<{
38
+ name: z.ZodString;
39
+ type: z.ZodEnum<["text", "number", "boolean", "datetime"]>;
40
+ description: z.ZodOptional<z.ZodString>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ type: "number" | "boolean" | "text" | "datetime";
43
+ name: string;
44
+ description?: string | undefined;
45
+ }, {
46
+ type: "number" | "boolean" | "text" | "datetime";
47
+ name: string;
48
+ description?: string | undefined;
49
+ }>, "many">;
50
+ active: z.ZodOptional<z.ZodBoolean>;
51
+ };
52
+ export declare const CustomEventSchemaActivateInputSchema: {
53
+ storeCode: z.ZodOptional<z.ZodString>;
54
+ eventType: z.ZodString;
55
+ active: z.ZodBoolean;
56
+ };
57
+ export declare const CustomEventSendInputSchema: {
58
+ storeCode: z.ZodOptional<z.ZodString>;
59
+ eventType: z.ZodString;
60
+ customerData: z.ZodObject<{
61
+ customerId: z.ZodOptional<z.ZodString>;
62
+ email: z.ZodOptional<z.ZodString>;
63
+ phone: z.ZodOptional<z.ZodString>;
64
+ loyaltyCardNumber: z.ZodOptional<z.ZodString>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ email?: string | undefined;
67
+ phone?: string | undefined;
68
+ loyaltyCardNumber?: string | undefined;
69
+ customerId?: string | undefined;
70
+ }, {
71
+ email?: string | undefined;
72
+ phone?: string | undefined;
73
+ loyaltyCardNumber?: string | undefined;
74
+ customerId?: string | undefined;
75
+ }>;
76
+ eventDate: z.ZodString;
77
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
78
+ eventId: z.ZodOptional<z.ZodString>;
79
+ };
80
+ export declare const CustomEventListInputSchema: {
81
+ storeCode: z.ZodOptional<z.ZodString>;
82
+ page: z.ZodOptional<z.ZodNumber>;
83
+ perPage: z.ZodOptional<z.ZodNumber>;
84
+ type: z.ZodOptional<z.ZodString>;
85
+ customerId: z.ZodOptional<z.ZodString>;
86
+ email: z.ZodOptional<z.ZodString>;
87
+ };
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ export const CustomEventSchemaListInputSchema = {
3
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
4
+ page: z.number().optional().describe("Page number (default: 1)."),
5
+ perPage: z.number().optional().describe("Items per page (default: 25)."),
6
+ eventType: z.string().optional().describe("Filter by event type code."),
7
+ name: z.string().optional().describe("Filter by event schema name."),
8
+ active: z.boolean().optional().describe("Filter by active status."),
9
+ };
10
+ export const CustomEventSchemaGetInputSchema = {
11
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
12
+ eventType: z.string().describe("The custom event type code to retrieve."),
13
+ };
14
+ const CustomEventSchemaFieldSchema = z.object({
15
+ name: z.string().describe("Field name (e.g., 'minutes_watched', 'location_id')."),
16
+ type: z.enum(["text", "number", "boolean", "datetime"]).describe("Field data type: 'text' (strings), 'number' (integers/decimals), 'boolean' (true/false), 'datetime' (ISO 8601 format)."),
17
+ description: z.string().optional().describe("Field description."),
18
+ });
19
+ export const CustomEventSchemaCreateInputSchema = {
20
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
21
+ eventType: z.string().describe("Unique event type code (e.g., 'location_visit', 'app_login', 'video_watch'). " +
22
+ "Use snake_case. This is referenced in campaigns and achievements."),
23
+ name: z.string().describe("Human-readable name for the event schema."),
24
+ fields: z.array(CustomEventSchemaFieldSchema).describe("Array of fields. Example: [{name: 'minutes_watched', type: 'number'}, {name: 'location', type: 'text'}]. Valid types: text, number, boolean, datetime."),
25
+ active: z.boolean().optional().describe("Whether the schema is active (default: true)."),
26
+ };
27
+ export const CustomEventSchemaUpdateInputSchema = {
28
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
29
+ eventType: z.string().describe("The custom event type code to update."),
30
+ name: z.string().describe("Human-readable name for the event schema."),
31
+ fields: z.array(CustomEventSchemaFieldSchema).describe("Array of fields the event can contain."),
32
+ active: z.boolean().optional().describe("Whether the schema is active."),
33
+ };
34
+ export const CustomEventSchemaActivateInputSchema = {
35
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
36
+ eventType: z.string().describe("The custom event type code to activate/deactivate."),
37
+ active: z.boolean().describe("Set to true to activate, false to deactivate."),
38
+ };
39
+ export const CustomEventSendInputSchema = {
40
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
41
+ eventType: z.string().describe("The custom event type code (must match an existing schema). Use ol_custom_event_schema_list to find valid event codes."),
42
+ customerData: z.object({
43
+ customerId: z.string().optional().describe("Member ID (UUID) for identification."),
44
+ email: z.string().optional().describe("Member email for identification."),
45
+ phone: z.string().optional().describe("Member phone for identification."),
46
+ loyaltyCardNumber: z.string().optional().describe("Member loyalty card number for identification."),
47
+ }).describe("Customer identification (provide at least one field)."),
48
+ eventDate: z.string().describe("Event date/time in ISO format (e.g., '2025-01-15T14:30:00+00:00')."),
49
+ body: z.record(z.unknown()).optional().describe("Event-specific data matching the schema fields. Use ol_custom_event_schema_get(eventType) to see expected field names and types."),
50
+ eventId: z.string().optional().describe("Unique event identifier for deduplication (optional, max 255 chars)."),
51
+ };
52
+ export const CustomEventListInputSchema = {
53
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
54
+ page: z.number().optional().describe("Page number (default: 1)."),
55
+ perPage: z.number().optional().describe("Items per page (default: 25)."),
56
+ type: z.string().optional().describe("Filter by event type."),
57
+ customerId: z.string().optional().describe("Filter by member ID."),
58
+ email: z.string().optional().describe("Filter by member email."),
59
+ };
@@ -0,0 +1,29 @@
1
+ import type { Export, ExportListResponse } from "./schemas.js";
2
+ export declare function exportCreate(input: {
3
+ storeCode?: string;
4
+ type: string;
5
+ filters?: Record<string, unknown>;
6
+ page?: number;
7
+ perPage?: number;
8
+ }): Promise<{
9
+ exportId: string;
10
+ }>;
11
+ export declare function exportList(input: {
12
+ storeCode?: string;
13
+ page?: number;
14
+ perPage?: number;
15
+ exportId?: string;
16
+ type?: string;
17
+ status?: string;
18
+ }): Promise<ExportListResponse>;
19
+ export declare function exportGet(input: {
20
+ storeCode?: string;
21
+ exportId: string;
22
+ }): Promise<Export>;
23
+ export declare function exportDownload(input: {
24
+ storeCode?: string;
25
+ exportId: string;
26
+ }): Promise<{
27
+ content: string;
28
+ contentType: string;
29
+ }>;
@@ -0,0 +1,128 @@
1
+ import { apiGet, apiPost } from "../../client/http.js";
2
+ import { formatApiError, OpenLoyaltyError } from "../../utils/errors.js";
3
+ import { getConfig, getStoreCode } from "../../config.js";
4
+ import axios from "axios";
5
+ export async function exportCreate(input) {
6
+ const storeCode = getStoreCode(input.storeCode);
7
+ // Build the payload with type-specific wrapper
8
+ // The API expects { [type]: { ...filters, _page?, _itemsOnPage? } }
9
+ const innerPayload = {
10
+ ...(input.filters || {}),
11
+ };
12
+ if (input.page)
13
+ innerPayload._page = input.page;
14
+ if (input.perPage)
15
+ innerPayload._itemsOnPage = input.perPage;
16
+ const payload = {
17
+ [input.type]: innerPayload,
18
+ };
19
+ try {
20
+ const response = await apiPost(`/${storeCode}/export/${input.type}`, payload);
21
+ return response;
22
+ }
23
+ catch (error) {
24
+ if (axios.isAxiosError(error) && error.response?.status === 400) {
25
+ const allMessages = [error.response?.data?.message || "", ...(error.response?.data?.errors || []).map((e) => e.message)].join(" ").toLowerCase();
26
+ if (allMessages.includes("filter") || allMessages.includes("campaign") || allMessages.includes("segment")) {
27
+ throw new OpenLoyaltyError({
28
+ code: "INVALID_EXPORT_FILTERS",
29
+ message: `Invalid filters for '${input.type}' export`,
30
+ hint: "Each export type accepts specific filters. For campaignCode: { campaignId, code, status }. For member: { email, firstName, lastName, active }. For memberTier: { tierSetId, levelId }. For memberSegment: { segmentId }. For rewardFulfillment: { rewardId, memberId, status }.",
31
+ relatedTool: "ol_export_create",
32
+ });
33
+ }
34
+ }
35
+ if (axios.isAxiosError(error) && error.response?.status === 404) {
36
+ throw new OpenLoyaltyError({
37
+ code: "FILTER_RESOURCE_NOT_FOUND",
38
+ message: "A resource referenced in the export filters was not found",
39
+ hint: "Verify that IDs in your filters exist: for campaignCode exports use ol_campaign_list(), for memberSegment use ol_segment_list(), for memberTier use ol_tierset_list(), for rewardFulfillment use ol_reward_list().",
40
+ relatedTool: "ol_export_create",
41
+ });
42
+ }
43
+ if (axios.isAxiosError(error) && error.response?.status === 403) {
44
+ throw new OpenLoyaltyError({
45
+ code: "EXPORT_PERMISSION_DENIED",
46
+ message: "You don't have permission to create exports",
47
+ hint: "Data exports require the EXPORT:MODIFY permission. Use ol_admin_get_permissions() to check your access.",
48
+ relatedTool: "ol_export_create",
49
+ });
50
+ }
51
+ throw formatApiError(error, "ol_export_create");
52
+ }
53
+ }
54
+ export async function exportList(input) {
55
+ const storeCode = getStoreCode(input.storeCode);
56
+ const params = new URLSearchParams();
57
+ if (input.page)
58
+ params.append("_page", String(input.page));
59
+ if (input.perPage)
60
+ params.append("_itemsOnPage", String(input.perPage));
61
+ if (input.exportId)
62
+ params.append("exportId", input.exportId);
63
+ if (input.type)
64
+ params.append("type", input.type);
65
+ if (input.status)
66
+ params.append("status", input.status);
67
+ const queryString = params.toString();
68
+ const url = `/${storeCode}/export${queryString ? `?${queryString}` : ""}`;
69
+ try {
70
+ const response = await apiGet(url);
71
+ return response;
72
+ }
73
+ catch (error) {
74
+ if (axios.isAxiosError(error) && error.response?.status === 403) {
75
+ throw new OpenLoyaltyError({
76
+ code: "EXPORT_PERMISSION_DENIED",
77
+ message: "You don't have permission to list exports",
78
+ hint: "Data exports require the EXPORT:VIEW permission. Use ol_admin_get_permissions() to check your access.",
79
+ relatedTool: "ol_export_list",
80
+ });
81
+ }
82
+ throw formatApiError(error, "ol_export_list");
83
+ }
84
+ }
85
+ export async function exportGet(input) {
86
+ const storeCode = getStoreCode(input.storeCode);
87
+ try {
88
+ const response = await apiGet(`/${storeCode}/export/${input.exportId}`);
89
+ return response;
90
+ }
91
+ catch (error) {
92
+ if (axios.isAxiosError(error) && error.response?.status === 404) {
93
+ throw new OpenLoyaltyError({ code: "NOT_FOUND", message: `Export '${input.exportId}' not found`,
94
+ hint: "Use ol_export_list() to find existing exports and their IDs.", relatedTool: "ol_export_get" });
95
+ }
96
+ throw formatApiError(error, "ol_export_get");
97
+ }
98
+ }
99
+ export async function exportDownload(input) {
100
+ const config = getConfig();
101
+ const storeCode = getStoreCode(input.storeCode);
102
+ try {
103
+ const response = await axios.get(`${config.apiUrl}/${storeCode}/export/${input.exportId}/download`, {
104
+ headers: {
105
+ "X-AUTH-TOKEN": config.apiToken,
106
+ "Accept": "text/csv",
107
+ },
108
+ responseType: "text",
109
+ });
110
+ return {
111
+ content: response.data,
112
+ contentType: response.headers["content-type"] || "text/csv",
113
+ };
114
+ }
115
+ catch (error) {
116
+ if (axios.isAxiosError(error)) {
117
+ if (error.response?.status === 404) {
118
+ throw new OpenLoyaltyError({ code: "NOT_FOUND", message: `Export '${input.exportId}' not found`,
119
+ hint: "Use ol_export_list() to find existing exports and their IDs.", relatedTool: "ol_export_download" });
120
+ }
121
+ if (error.response?.status === 400 || error.response?.status === 409) {
122
+ throw new OpenLoyaltyError({ code: "EXPORT_NOT_READY", message: "Export is not ready for download yet",
123
+ hint: `Use ol_export_get(exportId: "${input.exportId}") to check export status. Download is only available when status is 'done'.`, relatedTool: "ol_export_download" });
124
+ }
125
+ }
126
+ throw formatApiError(error, "ol_export_download");
127
+ }
128
+ }
@@ -0,0 +1,56 @@
1
+ export { ExportCreateInputSchema, ExportListInputSchema, ExportGetInputSchema, ExportDownloadInputSchema, } from "./schemas.js";
2
+ export type { Export, ExportListResponse } from "./schemas.js";
3
+ export { exportCreate, exportList, exportGet, exportDownload, } from "./handlers.js";
4
+ import { exportCreate, exportList, exportGet, exportDownload } from "./handlers.js";
5
+ export declare const exportToolDefinitions: readonly [{
6
+ readonly name: "ol_export_create";
7
+ readonly title: "Create Data Export";
8
+ readonly description: "Create a new data export. Returns exportId for async tracking. Export types: campaignCode (campaign redemption codes), member (member data), memberTier (member tier assignments), memberSegment (member segment membership), rewardFulfillment (reward fulfillment records). The export runs asynchronously - use export_get to check status and export_download when status is 'done'.";
9
+ readonly readOnly: false;
10
+ readonly idempotent: false;
11
+ readonly inputSchema: {
12
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
13
+ type: import("zod").ZodEnum<["campaignCode", "member", "memberTier", "memberSegment", "rewardFulfillment"]>;
14
+ filters: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
15
+ page: import("zod").ZodOptional<import("zod").ZodNumber>;
16
+ perPage: import("zod").ZodOptional<import("zod").ZodNumber>;
17
+ };
18
+ readonly handler: typeof exportCreate;
19
+ }, {
20
+ readonly name: "ol_export_list";
21
+ readonly title: "List Exports";
22
+ readonly description: "List exports with optional filtering. Returns paginated list of exports with exportId, type, status, createdAt, and finishedAt. Status values: pending, done, failed, error.";
23
+ readonly readOnly: true;
24
+ readonly idempotent: true;
25
+ readonly inputSchema: {
26
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
27
+ page: import("zod").ZodOptional<import("zod").ZodNumber>;
28
+ perPage: import("zod").ZodOptional<import("zod").ZodNumber>;
29
+ exportId: import("zod").ZodOptional<import("zod").ZodString>;
30
+ type: import("zod").ZodOptional<import("zod").ZodEnum<["campaignCode", "member", "memberTier", "memberSegment", "rewardFulfillment"]>>;
31
+ status: import("zod").ZodOptional<import("zod").ZodEnum<["pending", "done", "failed", "error"]>>;
32
+ };
33
+ readonly handler: typeof exportList;
34
+ }, {
35
+ readonly name: "ol_export_get";
36
+ readonly title: "Get Export Details";
37
+ readonly description: "Get export details and status. Returns exportId, type, status, createdAt, finishedAt, exportedRows, and message. Check status before downloading - export must have status 'done'.";
38
+ readonly readOnly: true;
39
+ readonly idempotent: true;
40
+ readonly inputSchema: {
41
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
42
+ exportId: import("zod").ZodString;
43
+ };
44
+ readonly handler: typeof exportGet;
45
+ }, {
46
+ readonly name: "ol_export_download";
47
+ readonly title: "Download Export File";
48
+ readonly description: "Download export file content. Returns CSV content. IMPORTANT: Only available when export status is 'done'. Check status with export_get first.";
49
+ readonly readOnly: true;
50
+ readonly idempotent: true;
51
+ readonly inputSchema: {
52
+ storeCode: import("zod").ZodOptional<import("zod").ZodString>;
53
+ exportId: import("zod").ZodString;
54
+ };
55
+ readonly handler: typeof exportDownload;
56
+ }];
@@ -0,0 +1,46 @@
1
+ // Re-export schemas and types
2
+ export { ExportCreateInputSchema, ExportListInputSchema, ExportGetInputSchema, ExportDownloadInputSchema, } from "./schemas.js";
3
+ // Re-export handlers
4
+ export { exportCreate, exportList, exportGet, exportDownload, } from "./handlers.js";
5
+ // Imports for tool definitions
6
+ import { ExportCreateInputSchema, ExportListInputSchema, ExportGetInputSchema, ExportDownloadInputSchema, } from "./schemas.js";
7
+ import { exportCreate, exportList, exportGet, exportDownload, } from "./handlers.js";
8
+ // Tool definitions
9
+ export const exportToolDefinitions = [
10
+ {
11
+ name: "ol_export_create",
12
+ title: "Create Data Export",
13
+ description: "Create a new data export. Returns exportId for async tracking. Export types: campaignCode (campaign redemption codes), member (member data), memberTier (member tier assignments), memberSegment (member segment membership), rewardFulfillment (reward fulfillment records). The export runs asynchronously - use export_get to check status and export_download when status is 'done'.",
14
+ readOnly: false,
15
+ idempotent: false,
16
+ inputSchema: ExportCreateInputSchema,
17
+ handler: exportCreate,
18
+ },
19
+ {
20
+ name: "ol_export_list",
21
+ title: "List Exports",
22
+ description: "List exports with optional filtering. Returns paginated list of exports with exportId, type, status, createdAt, and finishedAt. Status values: pending, done, failed, error.",
23
+ readOnly: true,
24
+ idempotent: true,
25
+ inputSchema: ExportListInputSchema,
26
+ handler: exportList,
27
+ },
28
+ {
29
+ name: "ol_export_get",
30
+ title: "Get Export Details",
31
+ description: "Get export details and status. Returns exportId, type, status, createdAt, finishedAt, exportedRows, and message. Check status before downloading - export must have status 'done'.",
32
+ readOnly: true,
33
+ idempotent: true,
34
+ inputSchema: ExportGetInputSchema,
35
+ handler: exportGet,
36
+ },
37
+ {
38
+ name: "ol_export_download",
39
+ title: "Download Export File",
40
+ description: "Download export file content. Returns CSV content. IMPORTANT: Only available when export status is 'done'. Check status with export_get first.",
41
+ readOnly: true,
42
+ idempotent: true,
43
+ inputSchema: ExportDownloadInputSchema,
44
+ handler: exportDownload,
45
+ },
46
+ ];
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ export interface Export {
3
+ exportId: string;
4
+ type?: string;
5
+ status?: string;
6
+ createdAt?: string;
7
+ finishedAt?: string;
8
+ criteria?: string;
9
+ exportedRows?: number;
10
+ message?: string;
11
+ }
12
+ export interface ExportListResponse {
13
+ items: Export[];
14
+ total?: {
15
+ all?: number | string;
16
+ filtered?: number | string;
17
+ estimated?: boolean;
18
+ };
19
+ }
20
+ export declare const ExportCreateInputSchema: {
21
+ storeCode: z.ZodOptional<z.ZodString>;
22
+ type: z.ZodEnum<["campaignCode", "member", "memberTier", "memberSegment", "rewardFulfillment"]>;
23
+ filters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
24
+ page: z.ZodOptional<z.ZodNumber>;
25
+ perPage: z.ZodOptional<z.ZodNumber>;
26
+ };
27
+ export declare const ExportListInputSchema: {
28
+ storeCode: z.ZodOptional<z.ZodString>;
29
+ page: z.ZodOptional<z.ZodNumber>;
30
+ perPage: z.ZodOptional<z.ZodNumber>;
31
+ exportId: z.ZodOptional<z.ZodString>;
32
+ type: z.ZodOptional<z.ZodEnum<["campaignCode", "member", "memberTier", "memberSegment", "rewardFulfillment"]>>;
33
+ status: z.ZodOptional<z.ZodEnum<["pending", "done", "failed", "error"]>>;
34
+ };
35
+ export declare const ExportGetInputSchema: {
36
+ storeCode: z.ZodOptional<z.ZodString>;
37
+ exportId: z.ZodString;
38
+ };
39
+ export declare const ExportDownloadInputSchema: {
40
+ storeCode: z.ZodOptional<z.ZodString>;
41
+ exportId: z.ZodString;
42
+ };
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ export const ExportCreateInputSchema = {
3
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
4
+ type: z.enum([
5
+ "campaignCode",
6
+ "member",
7
+ "memberTier",
8
+ "memberSegment",
9
+ "rewardFulfillment",
10
+ ]).describe("Export type. Options: campaignCode, member, memberTier, memberSegment, rewardFulfillment."),
11
+ filters: z.record(z.unknown()).optional().describe("Type-specific filters. " +
12
+ "For campaignCode: { campaignId?, code?, status?, codeId?, usedByMemberId?, createdAt?, usedAt? }. " +
13
+ "For member: { email?, firstName?, lastName?, active?, loyaltyCardNumber? }. " +
14
+ "For memberTier: { tierSetId?, levelId? }. " +
15
+ "For memberSegment: { segmentId? }. " +
16
+ "For rewardFulfillment: { rewardId?, memberId?, status? }."),
17
+ page: z.number().optional().describe("Page number for export (included in export criteria)."),
18
+ perPage: z.number().optional().describe("Items per page for export."),
19
+ };
20
+ export const ExportListInputSchema = {
21
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
22
+ page: z.number().optional().describe("Page number (default: 1)."),
23
+ perPage: z.number().optional().describe("Items per page (default: 25)."),
24
+ exportId: z.string().optional().describe("Filter by export ID."),
25
+ type: z.enum([
26
+ "campaignCode",
27
+ "member",
28
+ "memberTier",
29
+ "memberSegment",
30
+ "rewardFulfillment",
31
+ ]).optional().describe("Filter by export type."),
32
+ status: z.enum(["pending", "done", "failed", "error"]).optional().describe("Filter by export status."),
33
+ };
34
+ export const ExportGetInputSchema = {
35
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
36
+ exportId: z.string().describe("The export ID (UUID) to retrieve."),
37
+ };
38
+ export const ExportDownloadInputSchema = {
39
+ storeCode: z.string().optional().describe("INTERNAL: Auto-configured from server settings. NEVER ask the user for this value. Only set if the user explicitly requests a different store."),
40
+ exportId: z.string().describe("The export ID (UUID) to download. Export must have status 'done'."),
41
+ };
@@ -0,0 +1,22 @@
1
+ import type { ImportListResponse, ImportDetailsResponse } from "./schemas.js";
2
+ export declare function importCreate(input: {
3
+ storeCode?: string;
4
+ type: string;
5
+ fileContent: string;
6
+ fileName?: string;
7
+ }): Promise<{
8
+ importId: string;
9
+ }>;
10
+ export declare function importList(input: {
11
+ storeCode?: string;
12
+ page?: number;
13
+ perPage?: number;
14
+ importId?: string;
15
+ type?: string;
16
+ }): Promise<ImportListResponse>;
17
+ export declare function importGet(input: {
18
+ storeCode?: string;
19
+ importId: string;
20
+ page?: number;
21
+ perPage?: number;
22
+ }): Promise<ImportDetailsResponse>;