@open-loyalty/mcp-server 1.8.0 → 1.13.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.
- package/dist/config.d.ts +0 -9
- package/dist/config.js +0 -23
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +58 -22
- package/dist/tools/apps/rewards-catalog/handlers.js +2 -1
- package/dist/tools/campaign/index.d.ts +16 -3
- package/dist/tools/campaign/index.js +15 -4
- package/dist/tools/campaign/member-handlers.d.ts +12 -0
- package/dist/tools/campaign/member-handlers.js +33 -0
- package/dist/tools/campaign/schemas.d.ts +6 -0
- package/dist/tools/campaign/schemas.js +6 -0
- package/dist/tools/channel/handlers.d.ts +32 -0
- package/dist/tools/channel/handlers.js +130 -0
- package/dist/tools/channel/index.d.ts +68 -0
- package/dist/tools/channel/index.js +59 -0
- package/dist/tools/channel/schemas.d.ts +29 -0
- package/dist/tools/channel/schemas.js +30 -0
- package/dist/tools/context/handlers.d.ts +49 -0
- package/dist/tools/context/handlers.js +131 -0
- package/dist/tools/context/index.d.ts +15 -0
- package/dist/tools/context/index.js +20 -0
- package/dist/tools/context/schemas.d.ts +7 -0
- package/dist/tools/context/schemas.js +4 -0
- package/dist/tools/group-of-values/handlers.d.ts +39 -0
- package/dist/tools/group-of-values/handlers.js +133 -0
- package/dist/tools/group-of-values/index.d.ts +82 -0
- package/dist/tools/group-of-values/index.js +72 -0
- package/dist/tools/group-of-values/schemas.d.ts +36 -0
- package/dist/tools/group-of-values/schemas.js +39 -0
- package/dist/tools/index.js +12 -0
- package/dist/tools/language/handlers.d.ts +24 -0
- package/dist/tools/language/handlers.js +127 -0
- package/dist/tools/language/index.d.ts +64 -0
- package/dist/tools/language/index.js +60 -0
- package/dist/tools/language/schemas.d.ts +25 -0
- package/dist/tools/language/schemas.js +25 -0
- package/dist/tools/member/handlers.d.ts +4 -0
- package/dist/tools/member/handlers.js +27 -0
- package/dist/tools/member/index.d.ts +14 -2
- package/dist/tools/member/index.js +15 -2
- package/dist/tools/points/fraud-handlers.d.ts +21 -0
- package/dist/tools/points/fraud-handlers.js +96 -0
- package/dist/tools/points/index.d.ts +50 -1
- package/dist/tools/points/index.js +45 -2
- package/dist/tools/points/schemas.d.ts +11 -0
- package/dist/tools/points/schemas.js +11 -0
- package/dist/tools/reward/category-handlers.d.ts +27 -0
- package/dist/tools/reward/category-handlers.js +70 -0
- package/dist/tools/reward/handlers.d.ts +0 -12
- package/dist/tools/reward/handlers.js +0 -28
- package/dist/tools/reward/index.d.ts +76 -3
- package/dist/tools/reward/index.js +63 -4
- package/dist/tools/reward/photo-handlers.d.ts +10 -0
- package/dist/tools/reward/photo-handlers.js +97 -0
- package/dist/tools/reward/redemption-handlers.d.ts +23 -0
- package/dist/tools/reward/redemption-handlers.js +50 -0
- package/dist/tools/reward/schemas.d.ts +31 -0
- package/dist/tools/reward/schemas.js +33 -0
- package/dist/tools/segment/handlers.js +14 -10
- package/dist/tools/segment/index.js +1 -1
- package/dist/tools/segment/schemas.js +3 -3
- package/dist/tools/store/handlers.d.ts +24 -0
- package/dist/tools/store/handlers.js +29 -1
- package/dist/tools/store/index.d.ts +41 -3
- package/dist/tools/store/index.js +27 -4
- package/dist/tools/store/schemas.d.ts +24 -0
- package/dist/tools/store/schemas.js +24 -0
- package/package.json +2 -12
- package/dist/auth/provider.d.ts +0 -33
- package/dist/auth/provider.js +0 -383
- package/dist/auth/storage.d.ts +0 -16
- package/dist/auth/storage.js +0 -120
- package/dist/http.d.ts +0 -2
- package/dist/http.js +0 -319
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Re-export schemas
|
|
2
|
+
export { GroupOfValuesListInputSchema, GroupOfValuesCreateInputSchema, GroupOfValuesUpdateInputSchema, GroupValueAddInputSchema, GroupValueUpdateInputSchema, GroupValueDeleteInputSchema, } from "./schemas.js";
|
|
3
|
+
// Re-export handlers
|
|
4
|
+
export { groupOfValuesList, groupOfValuesCreate, groupOfValuesUpdate, groupValueAdd, groupValueUpdate, groupValueDelete, } from "./handlers.js";
|
|
5
|
+
// Imports for tool definitions
|
|
6
|
+
import { GroupOfValuesListInputSchema, GroupOfValuesCreateInputSchema, GroupOfValuesUpdateInputSchema, GroupValueAddInputSchema, GroupValueUpdateInputSchema, GroupValueDeleteInputSchema, } from "./schemas.js";
|
|
7
|
+
import { groupOfValuesList, groupOfValuesCreate, groupOfValuesUpdate, groupValueAdd, groupValueUpdate, groupValueDelete, } from "./handlers.js";
|
|
8
|
+
// Tool definitions
|
|
9
|
+
export const groupOfValuesToolDefinitions = [
|
|
10
|
+
{
|
|
11
|
+
name: "ol_group_of_values_list",
|
|
12
|
+
title: "List Groups of Values",
|
|
13
|
+
description: "List all groups of values. Each group contains configurable value lists (e.g. 'Product Categories' with values 'electronics', 'clothing'). " +
|
|
14
|
+
"Returns groupOfValuesId, name, active status, and embedded values array.",
|
|
15
|
+
readOnly: true,
|
|
16
|
+
idempotent: true,
|
|
17
|
+
inputSchema: GroupOfValuesListInputSchema,
|
|
18
|
+
handler: groupOfValuesList,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "ol_group_of_values_create",
|
|
22
|
+
title: "Create Group of Values",
|
|
23
|
+
description: "Create a new group of values container. REQUIRED: name. " +
|
|
24
|
+
"After creation, use ol_group_value_add to populate it with individual values. " +
|
|
25
|
+
"NOTE: No DELETE endpoint exists for groups — use ol_group_of_values_update(active: false) to disable.",
|
|
26
|
+
readOnly: false,
|
|
27
|
+
idempotent: false,
|
|
28
|
+
inputSchema: GroupOfValuesCreateInputSchema,
|
|
29
|
+
handler: groupOfValuesCreate,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "ol_group_of_values_update",
|
|
33
|
+
title: "Update Group of Values",
|
|
34
|
+
description: "Update a group's name, description, or active status. " +
|
|
35
|
+
"Use active: false to effectively hide/disable a group (no DELETE endpoint exists for groups).",
|
|
36
|
+
readOnly: false,
|
|
37
|
+
idempotent: true,
|
|
38
|
+
inputSchema: GroupOfValuesUpdateInputSchema,
|
|
39
|
+
handler: groupOfValuesUpdate,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "ol_group_value_add",
|
|
43
|
+
title: "Add Value to Group",
|
|
44
|
+
description: "Add an individual value to a group of values. REQUIRED: groupOfValuesId, value string. " +
|
|
45
|
+
"Returns valueId. Use ol_group_of_values_list to find the groupOfValuesId.",
|
|
46
|
+
readOnly: false,
|
|
47
|
+
idempotent: false,
|
|
48
|
+
inputSchema: GroupValueAddInputSchema,
|
|
49
|
+
handler: groupValueAdd,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "ol_group_value_update",
|
|
53
|
+
title: "Update Group Value",
|
|
54
|
+
description: "Update an individual value's string or description. REQUIRED: valueId, value. " +
|
|
55
|
+
"Use ol_group_of_values_list to find valueIds.",
|
|
56
|
+
readOnly: false,
|
|
57
|
+
idempotent: true,
|
|
58
|
+
inputSchema: GroupValueUpdateInputSchema,
|
|
59
|
+
handler: groupValueUpdate,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "ol_group_value_delete",
|
|
63
|
+
title: "Delete Group Value (Permanent)",
|
|
64
|
+
description: "Permanently delete an individual value from a group. " +
|
|
65
|
+
"Use ol_group_of_values_list to find the valueId.",
|
|
66
|
+
readOnly: false,
|
|
67
|
+
destructive: true,
|
|
68
|
+
idempotent: true,
|
|
69
|
+
inputSchema: GroupValueDeleteInputSchema,
|
|
70
|
+
handler: groupValueDelete,
|
|
71
|
+
},
|
|
72
|
+
];
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const GroupOfValuesListInputSchema: {
|
|
3
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
4
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
perPage: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
active: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
};
|
|
8
|
+
export declare const GroupOfValuesCreateInputSchema: {
|
|
9
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
description: z.ZodOptional<z.ZodString>;
|
|
12
|
+
active: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
};
|
|
14
|
+
export declare const GroupOfValuesUpdateInputSchema: {
|
|
15
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
16
|
+
groupOfValuesId: z.ZodString;
|
|
17
|
+
name: z.ZodOptional<z.ZodString>;
|
|
18
|
+
description: z.ZodOptional<z.ZodString>;
|
|
19
|
+
active: z.ZodOptional<z.ZodBoolean>;
|
|
20
|
+
};
|
|
21
|
+
export declare const GroupValueAddInputSchema: {
|
|
22
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
23
|
+
groupOfValuesId: z.ZodString;
|
|
24
|
+
value: z.ZodString;
|
|
25
|
+
description: z.ZodOptional<z.ZodString>;
|
|
26
|
+
};
|
|
27
|
+
export declare const GroupValueUpdateInputSchema: {
|
|
28
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
29
|
+
valueId: z.ZodString;
|
|
30
|
+
value: z.ZodString;
|
|
31
|
+
description: z.ZodOptional<z.ZodString>;
|
|
32
|
+
};
|
|
33
|
+
export declare const GroupValueDeleteInputSchema: {
|
|
34
|
+
storeCode: z.ZodOptional<z.ZodString>;
|
|
35
|
+
valueId: z.ZodString;
|
|
36
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const STORE_CODE = 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.");
|
|
3
|
+
// Group schemas
|
|
4
|
+
export const GroupOfValuesListInputSchema = {
|
|
5
|
+
storeCode: STORE_CODE,
|
|
6
|
+
page: z.number().optional().describe("Page number (default: 1)."),
|
|
7
|
+
perPage: z.number().optional().describe("Items per page (default: 25)."),
|
|
8
|
+
active: z.boolean().optional().describe("Filter by active status."),
|
|
9
|
+
};
|
|
10
|
+
export const GroupOfValuesCreateInputSchema = {
|
|
11
|
+
storeCode: STORE_CODE,
|
|
12
|
+
name: z.string().describe("Group name in English (required). E.g. 'Product Categories', 'Store Locations'."),
|
|
13
|
+
description: z.string().optional().describe("Group description in English."),
|
|
14
|
+
active: z.boolean().optional().describe("Whether the group is active (default: true)."),
|
|
15
|
+
};
|
|
16
|
+
export const GroupOfValuesUpdateInputSchema = {
|
|
17
|
+
storeCode: STORE_CODE,
|
|
18
|
+
groupOfValuesId: z.string().describe("Group of values ID (UUID) to update."),
|
|
19
|
+
name: z.string().optional().describe("Group name in English."),
|
|
20
|
+
description: z.string().optional().describe("Group description in English."),
|
|
21
|
+
active: z.boolean().optional().describe("Whether the group is active."),
|
|
22
|
+
};
|
|
23
|
+
// Value schemas (individual items within a group)
|
|
24
|
+
export const GroupValueAddInputSchema = {
|
|
25
|
+
storeCode: STORE_CODE,
|
|
26
|
+
groupOfValuesId: z.string().describe("The group ID (UUID) to add this value to. Use ol_group_of_values_list to find the ID."),
|
|
27
|
+
value: z.string().describe("The value string to add (required). E.g. 'electronics', 'warsaw', 'premium'."),
|
|
28
|
+
description: z.string().optional().describe("Optional description for this value."),
|
|
29
|
+
};
|
|
30
|
+
export const GroupValueUpdateInputSchema = {
|
|
31
|
+
storeCode: STORE_CODE,
|
|
32
|
+
valueId: z.string().describe("The value ID (UUID) to update. Use ol_group_of_values_list to find valueIds."),
|
|
33
|
+
value: z.string().describe("The updated value string (required)."),
|
|
34
|
+
description: z.string().optional().describe("Optional description for this value."),
|
|
35
|
+
};
|
|
36
|
+
export const GroupValueDeleteInputSchema = {
|
|
37
|
+
storeCode: STORE_CODE,
|
|
38
|
+
valueId: z.string().describe("The value ID (UUID) to delete. Use ol_group_of_values_list to find valueIds."),
|
|
39
|
+
};
|
package/dist/tools/index.js
CHANGED
|
@@ -24,6 +24,12 @@ import { exportToolDefinitions } from "./export/index.js";
|
|
|
24
24
|
import { customEventToolDefinitions } from "./custom-event/index.js";
|
|
25
25
|
// Referral tools (needed for referral tracking between members)
|
|
26
26
|
import { referralToolDefinitions } from "./referral/index.js";
|
|
27
|
+
// Context tool (session start discovery)
|
|
28
|
+
import { contextToolDefinitions } from "./context/index.js";
|
|
29
|
+
// Phase 5 lower-priority tools
|
|
30
|
+
import { channelToolDefinitions } from "./channel/index.js";
|
|
31
|
+
import { languageToolDefinitions } from "./language/index.js";
|
|
32
|
+
import { groupOfValuesToolDefinitions } from "./group-of-values/index.js";
|
|
27
33
|
// Collect all tool definitions
|
|
28
34
|
// Note: Single cast needed because tool handlers have specific input types
|
|
29
35
|
// (e.g., { memberId: string }) while ToolDefinition uses generic Record<string, unknown>.
|
|
@@ -56,6 +62,12 @@ const allTools = [
|
|
|
56
62
|
...customEventToolDefinitions,
|
|
57
63
|
// Referral tools
|
|
58
64
|
...referralToolDefinitions,
|
|
65
|
+
// Context tool
|
|
66
|
+
...contextToolDefinitions,
|
|
67
|
+
// Phase 5 lower-priority tools
|
|
68
|
+
...channelToolDefinitions,
|
|
69
|
+
...languageToolDefinitions,
|
|
70
|
+
...groupOfValuesToolDefinitions,
|
|
59
71
|
];
|
|
60
72
|
const toolHandlers = new Map();
|
|
61
73
|
for (const tool of allTools) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function languageList(input: {
|
|
2
|
+
page?: number;
|
|
3
|
+
perPage?: number;
|
|
4
|
+
}): Promise<Record<string, unknown>>;
|
|
5
|
+
export declare function languageCreate(input: {
|
|
6
|
+
code: string;
|
|
7
|
+
name: string;
|
|
8
|
+
order?: number;
|
|
9
|
+
apiDefault?: number;
|
|
10
|
+
adminDefault?: number;
|
|
11
|
+
}): Promise<Record<string, unknown>>;
|
|
12
|
+
export declare function languageGet(input: {
|
|
13
|
+
code: string;
|
|
14
|
+
}): Promise<Record<string, unknown>>;
|
|
15
|
+
export declare function languageUpdate(input: {
|
|
16
|
+
code: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
order?: number;
|
|
19
|
+
apiDefault?: number;
|
|
20
|
+
adminDefault?: number;
|
|
21
|
+
}): Promise<Record<string, unknown>>;
|
|
22
|
+
export declare function languageDelete(input: {
|
|
23
|
+
code: string;
|
|
24
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { apiGet, apiPost, apiPut, apiDelete } from "../../client/http.js";
|
|
2
|
+
import { formatApiError, OpenLoyaltyError } from "../../utils/errors.js";
|
|
3
|
+
import axios from "axios";
|
|
4
|
+
// NOTE: Language endpoints are GLOBAL — no storeCode in path
|
|
5
|
+
export async function languageList(input) {
|
|
6
|
+
const params = new URLSearchParams();
|
|
7
|
+
if (input.page)
|
|
8
|
+
params.append("_page", String(input.page));
|
|
9
|
+
if (input.perPage)
|
|
10
|
+
params.append("_itemsOnPage", String(input.perPage));
|
|
11
|
+
const queryString = params.toString();
|
|
12
|
+
const url = `/language${queryString ? `?${queryString}` : ""}`;
|
|
13
|
+
try {
|
|
14
|
+
const response = await apiGet(url);
|
|
15
|
+
return response;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
throw formatApiError(error, "ol_language_list");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function languageCreate(input) {
|
|
22
|
+
const payload = {
|
|
23
|
+
code: input.code,
|
|
24
|
+
name: input.name,
|
|
25
|
+
order: input.order ?? 0,
|
|
26
|
+
apiDefault: input.apiDefault ?? 0,
|
|
27
|
+
adminDefault: input.adminDefault ?? 0,
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
const response = await apiPost("/language", payload);
|
|
31
|
+
return response;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (axios.isAxiosError(error) && error.response?.status === 400) {
|
|
35
|
+
const allMessages = [
|
|
36
|
+
error.response?.data?.message || "",
|
|
37
|
+
...(error.response?.data?.errors || []).map((e) => e.message),
|
|
38
|
+
].join(" ").toLowerCase();
|
|
39
|
+
if (allMessages.includes("code") && (allMessages.includes("already") || allMessages.includes("unique") || allMessages.includes("exists"))) {
|
|
40
|
+
throw new OpenLoyaltyError({
|
|
41
|
+
code: "DUPLICATE_CODE",
|
|
42
|
+
message: `Language with code '${input.code}' already exists`,
|
|
43
|
+
hint: `Use ol_language_list() to see existing languages.`,
|
|
44
|
+
relatedTool: "ol_language_create",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (allMessages.includes("locale") || allMessages.includes("valid locale")) {
|
|
48
|
+
throw new OpenLoyaltyError({
|
|
49
|
+
code: "INVALID_LOCALE",
|
|
50
|
+
message: `'${input.code}' is not a valid locale code`,
|
|
51
|
+
hint: "Use standard locale codes like 'de', 'fr', 'pl', 'es', 'it', 'pt', 'nl'. No special characters or spaces.",
|
|
52
|
+
relatedTool: "ol_language_create",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw formatApiError(error, "ol_language_create");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function languageGet(input) {
|
|
60
|
+
try {
|
|
61
|
+
const response = await apiGet(`/language/${input.code}`);
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (axios.isAxiosError(error) && error.response?.status === 404) {
|
|
66
|
+
throw new OpenLoyaltyError({
|
|
67
|
+
code: "NOT_FOUND",
|
|
68
|
+
message: `Language '${input.code}' not found`,
|
|
69
|
+
hint: "Use ol_language_list() to see available language codes.",
|
|
70
|
+
relatedTool: "ol_language_get",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
throw formatApiError(error, "ol_language_get");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function languageUpdate(input) {
|
|
77
|
+
const payload = {};
|
|
78
|
+
if (input.name !== undefined)
|
|
79
|
+
payload.name = input.name;
|
|
80
|
+
if (input.order !== undefined)
|
|
81
|
+
payload.order = input.order;
|
|
82
|
+
if (input.apiDefault !== undefined)
|
|
83
|
+
payload.apiDefault = input.apiDefault;
|
|
84
|
+
if (input.adminDefault !== undefined)
|
|
85
|
+
payload.adminDefault = input.adminDefault;
|
|
86
|
+
try {
|
|
87
|
+
const response = await apiPut(`/language/${input.code}`, payload);
|
|
88
|
+
return response;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (axios.isAxiosError(error) && error.response?.status === 404) {
|
|
92
|
+
throw new OpenLoyaltyError({
|
|
93
|
+
code: "NOT_FOUND",
|
|
94
|
+
message: `Language '${input.code}' not found`,
|
|
95
|
+
hint: "Use ol_language_list() to see available language codes.",
|
|
96
|
+
relatedTool: "ol_language_update",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
throw formatApiError(error, "ol_language_update");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export async function languageDelete(input) {
|
|
103
|
+
try {
|
|
104
|
+
await apiDelete(`/language/${input.code}`);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (axios.isAxiosError(error)) {
|
|
108
|
+
if (error.response?.status === 404) {
|
|
109
|
+
throw new OpenLoyaltyError({
|
|
110
|
+
code: "NOT_FOUND",
|
|
111
|
+
message: `Language '${input.code}' not found`,
|
|
112
|
+
hint: "Use ol_language_list() to see available language codes.",
|
|
113
|
+
relatedTool: "ol_language_delete",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (error.response?.status === 400) {
|
|
117
|
+
throw new OpenLoyaltyError({
|
|
118
|
+
code: "CANNOT_DELETE_DEFAULT",
|
|
119
|
+
message: `Cannot delete language '${input.code}' — it is the default language`,
|
|
120
|
+
hint: "The default language cannot be deleted. To remove it, first set a different language as default using ol_language_update(adminDefault: 1).",
|
|
121
|
+
relatedTool: "ol_language_delete",
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
throw formatApiError(error, "ol_language_delete");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export { LanguageListInputSchema, LanguageCreateInputSchema, LanguageGetInputSchema, LanguageUpdateInputSchema, LanguageDeleteInputSchema, } from "./schemas.js";
|
|
2
|
+
export { languageList, languageCreate, languageGet, languageUpdate, languageDelete, } from "./handlers.js";
|
|
3
|
+
import { languageList, languageCreate, languageGet, languageUpdate, languageDelete } from "./handlers.js";
|
|
4
|
+
export declare const languageToolDefinitions: readonly [{
|
|
5
|
+
readonly name: "ol_language_list";
|
|
6
|
+
readonly title: "List Languages";
|
|
7
|
+
readonly description: string;
|
|
8
|
+
readonly readOnly: true;
|
|
9
|
+
readonly idempotent: true;
|
|
10
|
+
readonly inputSchema: {
|
|
11
|
+
page: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
12
|
+
perPage: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
13
|
+
};
|
|
14
|
+
readonly handler: typeof languageList;
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "ol_language_create";
|
|
17
|
+
readonly title: "Add Language";
|
|
18
|
+
readonly description: string;
|
|
19
|
+
readonly readOnly: false;
|
|
20
|
+
readonly idempotent: false;
|
|
21
|
+
readonly inputSchema: {
|
|
22
|
+
code: import("zod").ZodString;
|
|
23
|
+
name: import("zod").ZodString;
|
|
24
|
+
order: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
25
|
+
apiDefault: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
26
|
+
adminDefault: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
27
|
+
};
|
|
28
|
+
readonly handler: typeof languageCreate;
|
|
29
|
+
}, {
|
|
30
|
+
readonly name: "ol_language_get";
|
|
31
|
+
readonly title: "Get Language Details";
|
|
32
|
+
readonly description: "Get details of a specific language by its locale code (e.g. 'en', 'de').";
|
|
33
|
+
readonly readOnly: true;
|
|
34
|
+
readonly idempotent: true;
|
|
35
|
+
readonly inputSchema: {
|
|
36
|
+
code: import("zod").ZodString;
|
|
37
|
+
};
|
|
38
|
+
readonly handler: typeof languageGet;
|
|
39
|
+
}, {
|
|
40
|
+
readonly name: "ol_language_update";
|
|
41
|
+
readonly title: "Update Language";
|
|
42
|
+
readonly description: string;
|
|
43
|
+
readonly readOnly: false;
|
|
44
|
+
readonly idempotent: true;
|
|
45
|
+
readonly inputSchema: {
|
|
46
|
+
code: import("zod").ZodString;
|
|
47
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
48
|
+
order: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
49
|
+
apiDefault: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
50
|
+
adminDefault: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
51
|
+
};
|
|
52
|
+
readonly handler: typeof languageUpdate;
|
|
53
|
+
}, {
|
|
54
|
+
readonly name: "ol_language_delete";
|
|
55
|
+
readonly title: "Delete Language (Permanent)";
|
|
56
|
+
readonly description: string;
|
|
57
|
+
readonly readOnly: false;
|
|
58
|
+
readonly destructive: true;
|
|
59
|
+
readonly idempotent: true;
|
|
60
|
+
readonly inputSchema: {
|
|
61
|
+
code: import("zod").ZodString;
|
|
62
|
+
};
|
|
63
|
+
readonly handler: typeof languageDelete;
|
|
64
|
+
}];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Re-export schemas
|
|
2
|
+
export { LanguageListInputSchema, LanguageCreateInputSchema, LanguageGetInputSchema, LanguageUpdateInputSchema, LanguageDeleteInputSchema, } from "./schemas.js";
|
|
3
|
+
// Re-export handlers
|
|
4
|
+
export { languageList, languageCreate, languageGet, languageUpdate, languageDelete, } from "./handlers.js";
|
|
5
|
+
// Imports for tool definitions
|
|
6
|
+
import { LanguageListInputSchema, LanguageCreateInputSchema, LanguageGetInputSchema, LanguageUpdateInputSchema, LanguageDeleteInputSchema, } from "./schemas.js";
|
|
7
|
+
import { languageList, languageCreate, languageGet, languageUpdate, languageDelete, } from "./handlers.js";
|
|
8
|
+
// Tool definitions
|
|
9
|
+
export const languageToolDefinitions = [
|
|
10
|
+
{
|
|
11
|
+
name: "ol_language_list",
|
|
12
|
+
title: "List Languages",
|
|
13
|
+
description: "List all configured languages. Returns code, name, order, apiDefault, adminDefault. " +
|
|
14
|
+
"NOTE: Language is a GLOBAL setting — no storeCode required.",
|
|
15
|
+
readOnly: true,
|
|
16
|
+
idempotent: true,
|
|
17
|
+
inputSchema: LanguageListInputSchema,
|
|
18
|
+
handler: languageList,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "ol_language_create",
|
|
22
|
+
title: "Add Language",
|
|
23
|
+
description: "Add a new language to the platform. REQUIRED: code (locale, e.g. 'de') and name (e.g. 'German'). " +
|
|
24
|
+
"NOTE: Language is GLOBAL (no storeCode). Use standard locales: de, fr, pl, es, it, pt, nl.",
|
|
25
|
+
readOnly: false,
|
|
26
|
+
idempotent: false,
|
|
27
|
+
inputSchema: LanguageCreateInputSchema,
|
|
28
|
+
handler: languageCreate,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "ol_language_get",
|
|
32
|
+
title: "Get Language Details",
|
|
33
|
+
description: "Get details of a specific language by its locale code (e.g. 'en', 'de').",
|
|
34
|
+
readOnly: true,
|
|
35
|
+
idempotent: true,
|
|
36
|
+
inputSchema: LanguageGetInputSchema,
|
|
37
|
+
handler: languageGet,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "ol_language_update",
|
|
41
|
+
title: "Update Language",
|
|
42
|
+
description: "Update a language's name, sort order, or default status. " +
|
|
43
|
+
"Use apiDefault: 1 / adminDefault: 1 to change the default language.",
|
|
44
|
+
readOnly: false,
|
|
45
|
+
idempotent: true,
|
|
46
|
+
inputSchema: LanguageUpdateInputSchema,
|
|
47
|
+
handler: languageUpdate,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "ol_language_delete",
|
|
51
|
+
title: "Delete Language (Permanent)",
|
|
52
|
+
description: "Delete a language. Cannot delete the current default language. " +
|
|
53
|
+
"Returns CANNOT_DELETE_DEFAULT error if attempted.",
|
|
54
|
+
readOnly: false,
|
|
55
|
+
destructive: true,
|
|
56
|
+
idempotent: true,
|
|
57
|
+
inputSchema: LanguageDeleteInputSchema,
|
|
58
|
+
handler: languageDelete,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const LanguageListInputSchema: {
|
|
3
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
4
|
+
perPage: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
};
|
|
6
|
+
export declare const LanguageCreateInputSchema: {
|
|
7
|
+
code: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
apiDefault: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
adminDefault: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
};
|
|
13
|
+
export declare const LanguageGetInputSchema: {
|
|
14
|
+
code: z.ZodString;
|
|
15
|
+
};
|
|
16
|
+
export declare const LanguageUpdateInputSchema: {
|
|
17
|
+
code: z.ZodString;
|
|
18
|
+
name: z.ZodOptional<z.ZodString>;
|
|
19
|
+
order: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
apiDefault: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
adminDefault: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
};
|
|
23
|
+
export declare const LanguageDeleteInputSchema: {
|
|
24
|
+
code: z.ZodString;
|
|
25
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const LanguageListInputSchema = {
|
|
3
|
+
page: z.number().optional().describe("Page number (default: 1)."),
|
|
4
|
+
perPage: z.number().optional().describe("Items per page (default: 25)."),
|
|
5
|
+
};
|
|
6
|
+
export const LanguageCreateInputSchema = {
|
|
7
|
+
code: z.string().describe("Language locale code (required). E.g. 'de', 'fr', 'pl'. Must be a valid locale."),
|
|
8
|
+
name: z.string().describe("Language display name (required). E.g. 'German', 'French', 'Polish'."),
|
|
9
|
+
order: z.number().optional().describe("Display sort order (default: 0, lower = first)."),
|
|
10
|
+
apiDefault: z.number().optional().describe("Set as API default language (1 = yes, 0 = no). Default: 0."),
|
|
11
|
+
adminDefault: z.number().optional().describe("Set as admin panel default language (1 = yes, 0 = no). Default: 0."),
|
|
12
|
+
};
|
|
13
|
+
export const LanguageGetInputSchema = {
|
|
14
|
+
code: z.string().describe("Language locale code to retrieve. E.g. 'en', 'de'."),
|
|
15
|
+
};
|
|
16
|
+
export const LanguageUpdateInputSchema = {
|
|
17
|
+
code: z.string().describe("Language locale code to update. E.g. 'de', 'fr'."),
|
|
18
|
+
name: z.string().optional().describe("Language display name."),
|
|
19
|
+
order: z.number().optional().describe("Display sort order (lower = first)."),
|
|
20
|
+
apiDefault: z.number().optional().describe("Set as API default language (1 = yes, 0 = no)."),
|
|
21
|
+
adminDefault: z.number().optional().describe("Set as admin panel default language (1 = yes, 0 = no)."),
|
|
22
|
+
};
|
|
23
|
+
export const LanguageDeleteInputSchema = {
|
|
24
|
+
code: z.string().describe("Language locale code to delete. E.g. 'de', 'fr'. NOTE: Cannot delete the default language ('en')."),
|
|
25
|
+
};
|
|
@@ -281,3 +281,30 @@ export async function memberRemoveManualTier(input) {
|
|
|
281
281
|
throw formatApiError(error, "ol_member_remove_manual_tier");
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
|
+
export async function memberAnonymize(input) {
|
|
285
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
286
|
+
try {
|
|
287
|
+
await apiPost(`/${storeCode}/member/${input.memberId}/anonymize`);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const axiosError = error;
|
|
291
|
+
if (axiosError.response?.status === 404) {
|
|
292
|
+
throw new OpenLoyaltyError({
|
|
293
|
+
code: "NOT_FOUND",
|
|
294
|
+
message: `Member '${input.memberId}' not found`,
|
|
295
|
+
hint: "Use ol_member_list() to search for the member by email, name, or phone.",
|
|
296
|
+
relatedTool: "ol_member_anonymize",
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
const msg = (axiosError.response?.data?.message || "").toLowerCase();
|
|
300
|
+
if (msg.includes("already anonymized")) {
|
|
301
|
+
throw new OpenLoyaltyError({
|
|
302
|
+
code: "ALREADY_ANONYMIZED",
|
|
303
|
+
message: "Member has already been anonymized",
|
|
304
|
+
hint: "This member's PII has already been removed. No further action is needed.",
|
|
305
|
+
relatedTool: "ol_member_anonymize",
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
throw formatApiError(error, "ol_member_anonymize");
|
|
309
|
+
}
|
|
310
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
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";
|
|
2
|
+
export { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, memberAnonymize, } from "./handlers.js";
|
|
3
|
+
import { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, memberAnonymize } from "./handlers.js";
|
|
4
4
|
export declare const memberToolDefinitions: readonly [{
|
|
5
5
|
readonly name: "ol_member_create";
|
|
6
6
|
readonly title: "Register New Member";
|
|
@@ -176,4 +176,16 @@ export declare const memberToolDefinitions: readonly [{
|
|
|
176
176
|
memberId: import("zod").ZodString;
|
|
177
177
|
};
|
|
178
178
|
readonly handler: typeof memberRemoveManualTier;
|
|
179
|
+
}, {
|
|
180
|
+
readonly name: "ol_member_anonymize";
|
|
181
|
+
readonly title: "Anonymize Member (GDPR)";
|
|
182
|
+
readonly description: string;
|
|
183
|
+
readonly readOnly: false;
|
|
184
|
+
readonly destructive: true;
|
|
185
|
+
readonly idempotent: true;
|
|
186
|
+
readonly inputSchema: {
|
|
187
|
+
storeCode: import("zod").ZodOptional<import("zod").ZodString>;
|
|
188
|
+
memberId: import("zod").ZodString;
|
|
189
|
+
};
|
|
190
|
+
readonly handler: typeof memberAnonymize;
|
|
179
191
|
}];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Re-export schemas
|
|
2
2
|
export { MemberCreateInputSchema, MemberGetInputSchema, MemberListInputSchema, MemberUpdateInputSchema, MemberIdInputSchema, MemberAssignTierInputSchema, } from "./schemas.js";
|
|
3
3
|
// Re-export handlers
|
|
4
|
-
export { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, } from "./handlers.js";
|
|
4
|
+
export { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, memberAnonymize, } from "./handlers.js";
|
|
5
5
|
// Imports for tool definitions
|
|
6
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";
|
|
7
|
+
import { memberCreate, memberGet, memberList, memberUpdate, memberActivate, memberDeactivate, memberDelete, memberGetTierProgress, memberAssignTier, memberRemoveManualTier, memberAnonymize, } from "./handlers.js";
|
|
8
8
|
// Tool definitions
|
|
9
9
|
export const memberToolDefinitions = [
|
|
10
10
|
{
|
|
@@ -101,4 +101,17 @@ export const memberToolDefinitions = [
|
|
|
101
101
|
inputSchema: MemberIdInputSchema,
|
|
102
102
|
handler: memberRemoveManualTier,
|
|
103
103
|
},
|
|
104
|
+
{
|
|
105
|
+
name: "ol_member_anonymize",
|
|
106
|
+
title: "Anonymize Member (GDPR)",
|
|
107
|
+
description: "GDPR-compliant anonymization: replaces all PII (name, email, phone, address) with anonymous placeholder values. " +
|
|
108
|
+
"Unlike ol_member_delete (which hard-deletes all records), anonymization PRESERVES transaction history and program data — " +
|
|
109
|
+
"only personal identifiers are removed. Idempotent: safe to call multiple times. " +
|
|
110
|
+
"DISTINCT FROM delete: use anonymize for GDPR right-to-erasure requests; use delete only to fully purge all records.",
|
|
111
|
+
readOnly: false,
|
|
112
|
+
destructive: true,
|
|
113
|
+
idempotent: true,
|
|
114
|
+
inputSchema: MemberIdInputSchema,
|
|
115
|
+
handler: memberAnonymize,
|
|
116
|
+
},
|
|
104
117
|
];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function pointsBlock(input: {
|
|
2
|
+
storeCode?: string;
|
|
3
|
+
memberId: string;
|
|
4
|
+
points: number;
|
|
5
|
+
comment?: string;
|
|
6
|
+
walletCode?: string;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
transferId: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function pointsUnblock(input: {
|
|
11
|
+
storeCode?: string;
|
|
12
|
+
transferId: string;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function pointsCancelTransfer(input: {
|
|
15
|
+
storeCode?: string;
|
|
16
|
+
transferId: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
export declare function pointsExpireTransfer(input: {
|
|
19
|
+
storeCode?: string;
|
|
20
|
+
transferId: string;
|
|
21
|
+
}): Promise<void>;
|