@echomate/mcp-server 0.0.0-stage → 1.0.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.
- package/LICENSE +21 -0
- package/README.md +61 -2
- package/SECURITY.md +21 -0
- package/dist/client.d.ts +83 -0
- package/dist/client.js +142 -0
- package/dist/client.js.map +1 -0
- package/dist/guide.d.ts +1 -0
- package/dist/guide.js +33 -0
- package/dist/guide.js.map +1 -0
- package/dist/http-server.d.ts +1 -0
- package/dist/http-server.js +115 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions.d.ts +1 -0
- package/dist/instructions.js +58 -0
- package/dist/instructions.js.map +1 -0
- package/dist/karten.d.ts +32 -0
- package/dist/karten.js +414 -0
- package/dist/karten.js.map +1 -0
- package/dist/server-info.d.ts +12 -0
- package/dist/server-info.js +12 -0
- package/dist/server-info.js.map +1 -0
- package/dist/tools.d.ts +14 -0
- package/dist/tools.js +611 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/werkzeug-referenz.d.ts +10 -0
- package/dist/werkzeug-referenz.js +35 -0
- package/dist/werkzeug-referenz.js.map +1 -0
- package/dist/werkzeuge-sammeln.d.ts +3 -0
- package/dist/werkzeuge-sammeln.js +39 -0
- package/dist/werkzeuge-sammeln.js.map +1 -0
- package/dist/zugang.d.ts +22 -0
- package/dist/zugang.js +42 -0
- package/dist/zugang.js.map +1 -0
- package/package.json +39 -4
package/dist/tools.js
ADDED
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { sanitizeForAI } from "./client.js";
|
|
3
|
+
import { ECHOMATE_GUIDE } from "./guide.js";
|
|
4
|
+
import { SERVER_ANLEITUNG } from "./instructions.js";
|
|
5
|
+
import { werkzeugReferenz } from "./werkzeug-referenz.js";
|
|
6
|
+
import { BILD_HOECHSTENS, BILD_SCHLUESSEL, KARTE_AENDERUNG, KARTE_QR, KARTE_TOP, adminAdresse, karteMeta, registriereKarten, } from "./karten.js";
|
|
7
|
+
const PRIVATE_HOST_PATTERNS = [
|
|
8
|
+
/^localhost$/i,
|
|
9
|
+
/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
|
|
10
|
+
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
|
|
11
|
+
/^192\.168\.\d{1,3}\.\d{1,3}$/,
|
|
12
|
+
/^169\.254\.\d{1,3}\.\d{1,3}$/,
|
|
13
|
+
/^0\.0\.0\.0$/,
|
|
14
|
+
/^172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}$/,
|
|
15
|
+
/^\[::1\]$/,
|
|
16
|
+
/^\[::\]$/,
|
|
17
|
+
/^\[fe80:/i,
|
|
18
|
+
/^\[fc00:/i,
|
|
19
|
+
/^\[fd[0-9a-f]{2}:/i,
|
|
20
|
+
];
|
|
21
|
+
function isPrivateOrReservedUrl(url) {
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = new URL(url);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
const hostname = parsed.hostname;
|
|
30
|
+
const host = parsed.host;
|
|
31
|
+
if (PRIVATE_HOST_PATTERNS.some((re) => re.test(hostname) || re.test(host))) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (/^[0-9]+$/.test(hostname))
|
|
35
|
+
return true;
|
|
36
|
+
if (/^0x[0-9a-f]+$/i.test(hostname))
|
|
37
|
+
return true;
|
|
38
|
+
if (/^0[0-7]+$/.test(hostname))
|
|
39
|
+
return true;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const HttpsUrlSchema = z
|
|
43
|
+
.string()
|
|
44
|
+
.url("Must be a valid URL")
|
|
45
|
+
.startsWith("https://", "Only HTTPS URLs are allowed")
|
|
46
|
+
.refine((url) => !isPrivateOrReservedUrl(url), {
|
|
47
|
+
message: "Private/reserved IP addresses are not allowed",
|
|
48
|
+
});
|
|
49
|
+
const SECURITY_NOTE = "Security: Authentication is handled automatically. Never display credentials in responses.";
|
|
50
|
+
const REDIRECT_ORDER_NOTE = "Redirect order for a visit: inactive/not started/expired pages first; then the first matching routing rule sets the target, and only if THAT rule runs its own A/B test does its variant B get its share of that rule's visitors. If no rule matches, the link's own target applies, and the link's A/B test covers only these visitors. A link's A/B test never overrides a routing rule.";
|
|
51
|
+
const PaginationShape = {
|
|
52
|
+
page: z.number().int().min(1).optional().describe("Page number (starts at 1)"),
|
|
53
|
+
pageSize: z.number().int().min(1).max(100).optional().describe("Items per page (max 100)"),
|
|
54
|
+
};
|
|
55
|
+
const CreateQRCodeShape = {
|
|
56
|
+
name: z
|
|
57
|
+
.string()
|
|
58
|
+
.max(100, "Name must be 100 characters or less")
|
|
59
|
+
.transform((v) => v.replace(/<[^>]*>/g, "").trim())
|
|
60
|
+
.describe("Display name for the QR code (max 100 chars, HTML stripped)"),
|
|
61
|
+
targetUrl: HttpsUrlSchema.describe("Destination URL the QR code points to (HTTPS only)"),
|
|
62
|
+
};
|
|
63
|
+
const GetQRImageShape = {
|
|
64
|
+
id: z.string().uuid("Must be a valid UUID").describe("QR code ID"),
|
|
65
|
+
format: z
|
|
66
|
+
.enum(["png", "svg"])
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Image format (png or svg, default: svg)"),
|
|
69
|
+
};
|
|
70
|
+
const CreateLinkShape = {
|
|
71
|
+
targetUrl: HttpsUrlSchema.describe("Destination URL the short link redirects to (HTTPS only)"),
|
|
72
|
+
customSlug: z
|
|
73
|
+
.string()
|
|
74
|
+
.regex(/^[a-z0-9-]{1,50}$/, "Slug must be 1-50 lowercase alphanumeric chars or hyphens")
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Custom short link slug (lowercase, hyphens, 1-50 chars)"),
|
|
77
|
+
utmSource: z
|
|
78
|
+
.string()
|
|
79
|
+
.max(200)
|
|
80
|
+
.optional()
|
|
81
|
+
.describe("UTM source parameter (max 200 chars)"),
|
|
82
|
+
utmMedium: z
|
|
83
|
+
.string()
|
|
84
|
+
.max(200)
|
|
85
|
+
.optional()
|
|
86
|
+
.describe("UTM medium parameter (max 200 chars)"),
|
|
87
|
+
utmCampaign: z
|
|
88
|
+
.string()
|
|
89
|
+
.max(200)
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("UTM campaign parameter (max 200 chars)"),
|
|
92
|
+
};
|
|
93
|
+
const GetAnalyticsShape = {
|
|
94
|
+
days: z
|
|
95
|
+
.number()
|
|
96
|
+
.int()
|
|
97
|
+
.min(1)
|
|
98
|
+
.max(365)
|
|
99
|
+
.optional()
|
|
100
|
+
.default(7)
|
|
101
|
+
.describe("Number of days to look back (1-365, default: 7)"),
|
|
102
|
+
};
|
|
103
|
+
const LinkIdShape = {
|
|
104
|
+
id: z.string().uuid("Must be a valid UUID").describe("Link ID"),
|
|
105
|
+
};
|
|
106
|
+
const TopPerformersShape = {
|
|
107
|
+
days: z
|
|
108
|
+
.number()
|
|
109
|
+
.int()
|
|
110
|
+
.min(1)
|
|
111
|
+
.max(365)
|
|
112
|
+
.optional()
|
|
113
|
+
.default(30)
|
|
114
|
+
.describe("Number of days to look back (1-365, default: 30)"),
|
|
115
|
+
};
|
|
116
|
+
const UpdateLinkShape = {
|
|
117
|
+
id: z.string().uuid().describe("Link ID"),
|
|
118
|
+
targetUrl: HttpsUrlSchema.optional().describe("New destination URL (HTTPS only)"),
|
|
119
|
+
utmSource: z.string().max(200).optional().describe("UTM source"),
|
|
120
|
+
utmMedium: z.string().max(200).optional().describe("UTM medium"),
|
|
121
|
+
utmCampaign: z.string().max(200).optional().describe("UTM campaign"),
|
|
122
|
+
isActive: z.boolean().optional().describe("Set link active (true) or paused (false)"),
|
|
123
|
+
};
|
|
124
|
+
const UpdateQRShape = {
|
|
125
|
+
id: z.string().uuid().describe("QR code ID"),
|
|
126
|
+
name: z.string().max(100).optional().describe("New display name"),
|
|
127
|
+
targetUrl: HttpsUrlSchema.optional().describe("New destination URL (HTTPS only)"),
|
|
128
|
+
isActive: z
|
|
129
|
+
.boolean()
|
|
130
|
+
.optional()
|
|
131
|
+
.describe("Set the QR code active (true) or inactive (false). Inactive codes stop forwarding scans; takes effect immediately."),
|
|
132
|
+
};
|
|
133
|
+
const UpdateSettingsShape = {
|
|
134
|
+
scanFrequency: z.enum(["manual", "daily", "weekly"]).optional().describe("Auto-scan frequency. 'manual' disables the cron-driven scan."),
|
|
135
|
+
alertEmail: z.string().email().optional().describe("Email for health alerts"),
|
|
136
|
+
qrDefaultFgColor: z.string().optional().describe("Default QR foreground color (hex)"),
|
|
137
|
+
qrDefaultBgColor: z.string().optional().describe("Default QR background color (hex)"),
|
|
138
|
+
ga4MeasurementId: z.string().optional().describe("Google Analytics 4 Measurement ID"),
|
|
139
|
+
fbPixelId: z.string().optional().describe("Facebook Pixel ID"),
|
|
140
|
+
};
|
|
141
|
+
const ManageBioShape = {
|
|
142
|
+
action: z.enum(["get", "update"]).describe("'get' to read config, 'update' to modify"),
|
|
143
|
+
enabled: z.boolean().optional().describe("Enable or disable the bio page"),
|
|
144
|
+
slug: z
|
|
145
|
+
.string()
|
|
146
|
+
.regex(/^[a-z0-9-]{1,50}$/)
|
|
147
|
+
.optional()
|
|
148
|
+
.describe("URL slug for the bio page"),
|
|
149
|
+
color: z.string().optional().describe("Brand color (hex)"),
|
|
150
|
+
linkOrder: z
|
|
151
|
+
.array(z.string().uuid())
|
|
152
|
+
.optional()
|
|
153
|
+
.describe("Ordered list of link IDs to show"),
|
|
154
|
+
};
|
|
155
|
+
function sanitizeObject(obj) {
|
|
156
|
+
if (typeof obj === "string")
|
|
157
|
+
return sanitizeForAI(obj);
|
|
158
|
+
if (Array.isArray(obj))
|
|
159
|
+
return obj.map(sanitizeObject);
|
|
160
|
+
if (obj !== null && typeof obj === "object") {
|
|
161
|
+
const result = {};
|
|
162
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
163
|
+
result[key] = sanitizeObject(value);
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
return obj;
|
|
168
|
+
}
|
|
169
|
+
function sanitizeErrorMessage(raw) {
|
|
170
|
+
if (!raw)
|
|
171
|
+
return "Operation failed";
|
|
172
|
+
if (raw.startsWith("Must be") ||
|
|
173
|
+
raw.startsWith("Only HTTPS") ||
|
|
174
|
+
raw.startsWith("Slug must") ||
|
|
175
|
+
raw.includes("Private/reserved") ||
|
|
176
|
+
raw.includes("characters or less")) {
|
|
177
|
+
return raw;
|
|
178
|
+
}
|
|
179
|
+
if (raw.includes("API_KEY_EXPIRED")) {
|
|
180
|
+
return "Your echomate API key has expired. Create a replacement in echomate under Settings → AI & Integrations → REST API, then put the new key into this AI app.";
|
|
181
|
+
}
|
|
182
|
+
if (raw.includes("KI_BESTAETIGUNG_FEHLT")) {
|
|
183
|
+
return ("echomate did not make this change: changes made through an AI assistant need to be confirmed " +
|
|
184
|
+
"in the echomate app, and that is not available for this store yet. Nothing was changed. " +
|
|
185
|
+
"Tell the merchant they can make this change themselves in the echomate admin — do not retry. " +
|
|
186
|
+
"Reading data works as usual.");
|
|
187
|
+
}
|
|
188
|
+
if (raw.includes("RIGHT_MISSING")) {
|
|
189
|
+
const recht = /missing right \\?"(\w+)\\?"/.exec(raw)?.[1] ?? "unknown";
|
|
190
|
+
const RECHT_NAME = {
|
|
191
|
+
lesen: "Read data",
|
|
192
|
+
schreiben: "Create and change",
|
|
193
|
+
loeschen: "Delete",
|
|
194
|
+
webhooks: "Manage webhooks",
|
|
195
|
+
};
|
|
196
|
+
const name = RECHT_NAME[recht] ?? recht;
|
|
197
|
+
return (`echomate refused this action: this connection does not have the right "${name}". ` +
|
|
198
|
+
`The store owner restricted or never granted this right. Tell the merchant — do not retry. ` +
|
|
199
|
+
`To allow it, the store owner reconnects echomate in this AI app and approves "${name}"; ` +
|
|
200
|
+
`the connection and its rights are shown in echomate under Settings → AI Integration → AI connections. ` +
|
|
201
|
+
`For an API key, the right is granted in echomate under Settings → REST API.`);
|
|
202
|
+
}
|
|
203
|
+
if (/uuid|not found|404|missing/i.test(raw))
|
|
204
|
+
return "Resource not found";
|
|
205
|
+
if (/auth|permission|forbidden|401|403|unauthorized/i.test(raw)) {
|
|
206
|
+
return "Permission denied or invalid API key";
|
|
207
|
+
}
|
|
208
|
+
if (/timeout|econnrefused|network|fetch failed/i.test(raw)) {
|
|
209
|
+
return "echomate API unreachable";
|
|
210
|
+
}
|
|
211
|
+
if (/limit|quota|429|too many/i.test(raw))
|
|
212
|
+
return "Rate limit reached";
|
|
213
|
+
return "Operation failed";
|
|
214
|
+
}
|
|
215
|
+
const UNWIDERRUFLICH = new Set(["delete_qr_code", "delete_link"]);
|
|
216
|
+
const MUTATING_TOOLS = new Set([
|
|
217
|
+
"create_qr_code",
|
|
218
|
+
"update_qr_code",
|
|
219
|
+
"delete_qr_code",
|
|
220
|
+
"create_link",
|
|
221
|
+
"update_link",
|
|
222
|
+
"delete_link",
|
|
223
|
+
"update_settings",
|
|
224
|
+
"manage_bio",
|
|
225
|
+
"trigger_health_scan",
|
|
226
|
+
]);
|
|
227
|
+
const ANNOTATIONEN = {
|
|
228
|
+
list_qr_codes: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
229
|
+
get_qr_image: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
230
|
+
list_links: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
231
|
+
get_link_details: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
232
|
+
get_analytics: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
233
|
+
get_store_health: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
234
|
+
get_top_performers: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
235
|
+
show_qr_code: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
236
|
+
show_top_qr_codes: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
237
|
+
get_settings: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
238
|
+
get_setup_guide: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
239
|
+
diagnose_setup: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
240
|
+
health_check: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
|
|
241
|
+
create_qr_code: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
242
|
+
create_link: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
243
|
+
trigger_health_scan: {
|
|
244
|
+
readOnlyHint: false,
|
|
245
|
+
destructiveHint: false,
|
|
246
|
+
idempotentHint: false,
|
|
247
|
+
},
|
|
248
|
+
update_qr_code: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
249
|
+
update_link: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
250
|
+
manage_bio: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
251
|
+
delete_qr_code: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
252
|
+
delete_link: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
253
|
+
update_settings: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
254
|
+
};
|
|
255
|
+
export function annotationenFuer(name) {
|
|
256
|
+
const a = ANNOTATIONEN[name];
|
|
257
|
+
if (!a) {
|
|
258
|
+
throw new Error(`[mcp] Werkzeug "${name}" hat keine Annotation. Trage sie in ANNOTATIONEN ein — ` +
|
|
259
|
+
`ein Standardwert würde dem Nutzer ein ungeprüftes Abzeichen zeigen.`);
|
|
260
|
+
}
|
|
261
|
+
return { ...a, openWorldHint: false };
|
|
262
|
+
}
|
|
263
|
+
export const KARTE_FUER_WERKZEUG = {
|
|
264
|
+
show_qr_code: KARTE_QR,
|
|
265
|
+
show_top_qr_codes: KARTE_TOP,
|
|
266
|
+
update_qr_code: KARTE_AENDERUNG,
|
|
267
|
+
};
|
|
268
|
+
export const ANNOTIERTE_WERKZEUGE = Object.keys(ANNOTATIONEN);
|
|
269
|
+
const AUSGABE_SCHEMA = {
|
|
270
|
+
ok: z.boolean().describe("true, wenn das Werkzeug durchgelaufen ist"),
|
|
271
|
+
daten: z
|
|
272
|
+
.unknown()
|
|
273
|
+
.optional()
|
|
274
|
+
.describe("Das Ergebnis. Bei ok=false nicht gesetzt."),
|
|
275
|
+
fehler: z
|
|
276
|
+
.string()
|
|
277
|
+
.optional()
|
|
278
|
+
.describe("Kurze Ursache, wenn ok=false. Nie interne Details."),
|
|
279
|
+
};
|
|
280
|
+
export function registerTools(server, { client, readOnly = process.env.ECHOMATE_MCP_READONLY === "true", }) {
|
|
281
|
+
const loeschenErlaubt = process.env.ECHOMATE_MCP_ALLOW_DELETE === "true";
|
|
282
|
+
const registriert = [];
|
|
283
|
+
const tool = ((name, ...rest) => {
|
|
284
|
+
if (readOnly && MUTATING_TOOLS.has(name))
|
|
285
|
+
return undefined;
|
|
286
|
+
if (!loeschenErlaubt && UNWIDERRUFLICH.has(name))
|
|
287
|
+
return undefined;
|
|
288
|
+
const annotations = annotationenFuer(name);
|
|
289
|
+
const [beschreibung, schema, handler] = rest;
|
|
290
|
+
const karte = KARTE_FUER_WERKZEUG[name];
|
|
291
|
+
registriert.push({
|
|
292
|
+
name,
|
|
293
|
+
description: String(beschreibung),
|
|
294
|
+
inputSchema: schema,
|
|
295
|
+
annotations,
|
|
296
|
+
});
|
|
297
|
+
return server
|
|
298
|
+
.registerTool(name, {
|
|
299
|
+
description: beschreibung,
|
|
300
|
+
inputSchema: schema,
|
|
301
|
+
outputSchema: AUSGABE_SCHEMA,
|
|
302
|
+
annotations: { ...annotations, title: name },
|
|
303
|
+
...(karte ? { _meta: karteMeta(karte) } : {}),
|
|
304
|
+
}, handler);
|
|
305
|
+
});
|
|
306
|
+
registriereKarten(server);
|
|
307
|
+
if (!loeschenErlaubt) {
|
|
308
|
+
console.error(`[mcp] ${UNWIDERRUFLICH.size} unwiderrufliche Werkzeuge nicht registriert ` +
|
|
309
|
+
"(delete_qr_code, delete_link). Ein geloeschter QR-Code nimmt den " +
|
|
310
|
+
"gedruckten Code mit. Zum Einschalten: ECHOMATE_MCP_ALLOW_DELETE=true");
|
|
311
|
+
}
|
|
312
|
+
if (readOnly) {
|
|
313
|
+
console.error(`[mcp] read-only mode: ${MUTATING_TOOLS.size} mutating tools not registered`);
|
|
314
|
+
}
|
|
315
|
+
const fmt = (nutzdaten, nurFuerDieKarte) => ({
|
|
316
|
+
content: [
|
|
317
|
+
{
|
|
318
|
+
type: "text",
|
|
319
|
+
text: JSON.stringify(nutzdaten, null, 2),
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
structuredContent: { ok: true, daten: nutzdaten },
|
|
323
|
+
...(nurFuerDieKarte ? { _meta: nurFuerDieKarte } : {}),
|
|
324
|
+
});
|
|
325
|
+
const fmtErr = (msg) => {
|
|
326
|
+
console.error("[mcp tool error]", msg);
|
|
327
|
+
const kurz = sanitizeErrorMessage(msg);
|
|
328
|
+
const recht = /missing right \\?"(lesen|schreiben|loeschen|webhooks)\\?"/.exec(msg ?? "")?.[1];
|
|
329
|
+
return {
|
|
330
|
+
content: [{ type: "text", text: `Error: ${kurz}` }],
|
|
331
|
+
structuredContent: { ok: false, fehler: kurz, ...(recht ? { recht } : {}) },
|
|
332
|
+
isError: true,
|
|
333
|
+
};
|
|
334
|
+
};
|
|
335
|
+
tool("list_qr_codes", `List all QR codes in the merchant's echomate account with pagination. ${REDIRECT_ORDER_NOTE} ${SECURITY_NOTE}`, PaginationShape, async (args) => {
|
|
336
|
+
try {
|
|
337
|
+
const result = await client.listQRCodes(args.page, args.pageSize);
|
|
338
|
+
return fmt(sanitizeObject(result));
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
return fmtErr(e.message);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
tool("create_qr_code", `Create a new QR code pointing to a destination URL. The name appears in the merchant dashboard. ${SECURITY_NOTE}`, CreateQRCodeShape, async (args) => {
|
|
345
|
+
try {
|
|
346
|
+
const result = await client.createQRCode(args.name, args.targetUrl);
|
|
347
|
+
return fmt(sanitizeObject(result));
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
return fmtErr(e.message);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
tool("get_qr_image", `Get the image URL for an existing QR code. Returns a URL that renders the QR code in the requested format. To SHOW the code to the merchant in the chat, use show_qr_code instead. ${SECURITY_NOTE}`, GetQRImageShape, async (args) => {
|
|
354
|
+
try {
|
|
355
|
+
const url = client.getQRImageUrl(args.id, args.format);
|
|
356
|
+
return fmt({ imageUrl: url });
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
return fmtErr(e.message);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
tool("list_links", `List all short links (dynamic links) in the merchant's echomate account with pagination. ${REDIRECT_ORDER_NOTE} ${SECURITY_NOTE}`, PaginationShape, async (args) => {
|
|
363
|
+
try {
|
|
364
|
+
const result = await client.listLinks(args.page, args.pageSize);
|
|
365
|
+
return fmt(sanitizeObject(result));
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
return fmtErr(e.message);
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
tool("create_link", `Create a new short link (dynamic link) pointing to a destination URL. Optionally set a custom slug and UTM parameters. ${SECURITY_NOTE}`, CreateLinkShape, async (args) => {
|
|
372
|
+
try {
|
|
373
|
+
const result = await client.createLink({
|
|
374
|
+
targetUrl: args.targetUrl,
|
|
375
|
+
customSlug: args.customSlug,
|
|
376
|
+
utmSource: args.utmSource,
|
|
377
|
+
utmMedium: args.utmMedium,
|
|
378
|
+
utmCampaign: args.utmCampaign,
|
|
379
|
+
});
|
|
380
|
+
return fmt(sanitizeObject(result));
|
|
381
|
+
}
|
|
382
|
+
catch (e) {
|
|
383
|
+
return fmtErr(e.message);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
tool("get_analytics", `Get analytics overview including scans, clicks, conversions, revenue, device/country/browser breakdown, and AI traffic data. ${SECURITY_NOTE}`, GetAnalyticsShape, async (args) => {
|
|
387
|
+
try {
|
|
388
|
+
const result = await client.getAnalytics(args.days);
|
|
389
|
+
return fmt(sanitizeObject(result));
|
|
390
|
+
}
|
|
391
|
+
catch (e) {
|
|
392
|
+
return fmtErr(e.message);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
tool("get_store_health", `Get Core Web Vitals, performance score, app impact analysis, and trend vs previous scan. ${SECURITY_NOTE}`, {}, async () => {
|
|
396
|
+
try {
|
|
397
|
+
const result = await client.getHealthScores();
|
|
398
|
+
return fmt(sanitizeObject(result));
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
return fmtErr(e.message);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
tool("get_link_details", `Deep-dive on a single link: click timeline, device/country split, A/B test results (the link's test and each routing rule's test, counted since that test started — not over the 30-day period), conversion rate. ${REDIRECT_ORDER_NOTE} ${SECURITY_NOTE}`, LinkIdShape, async (args) => {
|
|
405
|
+
try {
|
|
406
|
+
const result = await client.getLinkDetails(args.id);
|
|
407
|
+
return fmt(sanitizeObject(result));
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
return fmtErr(e.message);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
tool("get_top_performers", `Get top 5 QR codes and top 5 links ranked by scans/clicks, plus recent conversions. ${SECURITY_NOTE}`, TopPerformersShape, async (args) => {
|
|
414
|
+
try {
|
|
415
|
+
const result = await client.getTopPerformers(args.days);
|
|
416
|
+
return fmt(sanitizeObject(result));
|
|
417
|
+
}
|
|
418
|
+
catch (e) {
|
|
419
|
+
return fmtErr(e.message);
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
tool("show_qr_code", `Show one QR code to the merchant as a visual card in the chat: the QR image, total scans, destination and short link. The printed code contains the short link; it counts each scan and forwards to the destination, which can change without reprinting. Use this when the merchant wants to SEE a code; use list_qr_codes to look codes up. ${SECURITY_NOTE}`, { id: z.string().uuid().describe("QR code ID (from list_qr_codes)") }, async (args) => {
|
|
423
|
+
try {
|
|
424
|
+
const [qr, svg, me] = await Promise.all([
|
|
425
|
+
client.getQRCode(args.id).then((r) => r.data),
|
|
426
|
+
client.getQRImageSvg(args.id).catch(() => null),
|
|
427
|
+
client.getMe().catch(() => null),
|
|
428
|
+
]);
|
|
429
|
+
return fmt({
|
|
430
|
+
qr: sanitizeObject({
|
|
431
|
+
id: qr.id,
|
|
432
|
+
name: qr.name,
|
|
433
|
+
targetUrl: qr.targetUrl,
|
|
434
|
+
shortUrl: qr.shortUrl,
|
|
435
|
+
scansCount: qr.scansCount,
|
|
436
|
+
createdAt: qr.createdAt,
|
|
437
|
+
}),
|
|
438
|
+
adminUrl: adminAdresse(me?.shop_domain, `app/qr/${args.id}`),
|
|
439
|
+
}, {
|
|
440
|
+
[BILD_SCHLUESSEL]: svg && svg.length <= BILD_HOECHSTENS
|
|
441
|
+
? `data:image/svg+xml;base64,${Buffer.from(svg, "utf8").toString("base64")}`
|
|
442
|
+
: null,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
catch (e) {
|
|
446
|
+
return fmtErr(e.message);
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
tool("show_top_qr_codes", `Show the merchant's best QR codes of a period as a visual card in the chat (bars by scans). ${SECURITY_NOTE}`, TopPerformersShape, async (args) => {
|
|
450
|
+
try {
|
|
451
|
+
const [top, me] = await Promise.all([client.getTopPerformers(args.days), client.getMe().catch(() => null)]);
|
|
452
|
+
return fmt({
|
|
453
|
+
tage: top.data.period?.days ?? args.days ?? 30,
|
|
454
|
+
codes: sanitizeObject(top.data.topQRCodes.map((c) => ({ id: c.id, name: c.name, scansCount: c.scansCount }))),
|
|
455
|
+
adminUrl: adminAdresse(me?.shop_domain, "app/analytics"),
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
catch (e) {
|
|
459
|
+
return fmtErr(e.message);
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
tool("diagnose_setup", "Check API connection status, shop identity, plan, and feature availability. Call this first to verify everything is working.", {}, async () => {
|
|
463
|
+
try {
|
|
464
|
+
const [me, health] = await Promise.all([
|
|
465
|
+
client.getMe().catch(() => null),
|
|
466
|
+
client.healthCheck().catch(() => null),
|
|
467
|
+
]);
|
|
468
|
+
const diagnosis = {
|
|
469
|
+
apiReachable: health !== null,
|
|
470
|
+
apiStatus: health?.status ?? "unreachable",
|
|
471
|
+
authenticated: !!me,
|
|
472
|
+
shopDomain: me?.shop_domain || null,
|
|
473
|
+
plan: me?.plan || null,
|
|
474
|
+
features: me
|
|
475
|
+
? {
|
|
476
|
+
qrCodes: true,
|
|
477
|
+
shortLinks: true,
|
|
478
|
+
analytics: true,
|
|
479
|
+
storeHealth: true,
|
|
480
|
+
linkInBio: true,
|
|
481
|
+
apiAccess: me.plan === "Business",
|
|
482
|
+
}
|
|
483
|
+
: null,
|
|
484
|
+
recommendation: !health
|
|
485
|
+
? "API is not reachable. Check ECHOMATE_API_URL."
|
|
486
|
+
: !me
|
|
487
|
+
? "API key is invalid. Generate a new one in echomate Settings."
|
|
488
|
+
: "Everything is working! Try: list_qr_codes, get_analytics, or get_store_health",
|
|
489
|
+
};
|
|
490
|
+
return fmt(diagnosis);
|
|
491
|
+
}
|
|
492
|
+
catch (e) {
|
|
493
|
+
return fmtErr(e.message);
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
tool("get_setup_guide", "Use this when the merchant asks how echomate works, what it can do, or how a feature behaves — for example the redirect order when rules and an A/B test run on the same link, whether QR codes can be deleted, what a tool changes, or what a plan includes. Call it BEFORE answering such a question; do not answer echomate questions from memory. Returns the usage rules and every tool available in this connection with its parameters. Do not use it to fetch store data — use the list_ and get_ tools for that.", {}, async () => fmt([
|
|
497
|
+
SERVER_ANLEITUNG,
|
|
498
|
+
"## Every tool in this connection",
|
|
499
|
+
werkzeugReferenz(registriert),
|
|
500
|
+
ECHOMATE_GUIDE,
|
|
501
|
+
].join("\n\n")));
|
|
502
|
+
tool("health_check", "Check if the echomate API is reachable. No authentication required.", {}, async () => {
|
|
503
|
+
try {
|
|
504
|
+
const result = await client.healthCheck();
|
|
505
|
+
return fmt(result);
|
|
506
|
+
}
|
|
507
|
+
catch (e) {
|
|
508
|
+
return fmtErr(e.message);
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
tool("update_link", `Update a short link's destination URL, UTM parameters, or active status. ${REDIRECT_ORDER_NOTE} ${SECURITY_NOTE}`, UpdateLinkShape, async (args) => {
|
|
512
|
+
try {
|
|
513
|
+
const { id, ...input } = args;
|
|
514
|
+
const result = await client.updateLink(id, input);
|
|
515
|
+
return fmt(sanitizeObject(result));
|
|
516
|
+
}
|
|
517
|
+
catch (e) {
|
|
518
|
+
return fmtErr(e.message);
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
tool("delete_link", `Permanently delete a short link. Cannot be undone. ${SECURITY_NOTE}`, { id: z.string().uuid().describe("Link ID to delete") }, async (args) => {
|
|
522
|
+
try {
|
|
523
|
+
const result = await client.deleteLink(args.id);
|
|
524
|
+
return fmt(result);
|
|
525
|
+
}
|
|
526
|
+
catch (e) {
|
|
527
|
+
return fmtErr(e.message);
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
tool("update_qr_code", `Update a QR code's name, destination URL, or active status. ${SECURITY_NOTE}`, UpdateQRShape, async (args) => {
|
|
531
|
+
try {
|
|
532
|
+
const { id, ...input } = args;
|
|
533
|
+
const [vorher, me] = await Promise.all([
|
|
534
|
+
client.getQRCode(id).then((r) => r.data).catch(() => null),
|
|
535
|
+
client.getMe().catch(() => null),
|
|
536
|
+
]);
|
|
537
|
+
const result = await client.updateQRCode(id, input);
|
|
538
|
+
const angefragt = Object.entries(input).filter(([, w]) => w !== undefined);
|
|
539
|
+
const nothingChanged = !!vorher &&
|
|
540
|
+
angefragt.length > 0 &&
|
|
541
|
+
angefragt.every(([k, w]) => vorher[k] === w);
|
|
542
|
+
return fmt(sanitizeObject({
|
|
543
|
+
...result,
|
|
544
|
+
...(nothingChanged
|
|
545
|
+
? {
|
|
546
|
+
nothingChanged: true,
|
|
547
|
+
hinweis: "The QR code was already in the requested state. Nothing was changed — tell the merchant it already was, not that it is now.",
|
|
548
|
+
}
|
|
549
|
+
: {}),
|
|
550
|
+
vorher: vorher ? { name: vorher.name, targetUrl: vorher.targetUrl, isActive: vorher.isActive ?? null } : null,
|
|
551
|
+
adminUrl: adminAdresse(me?.shop_domain, `app/qr/${id}`),
|
|
552
|
+
}));
|
|
553
|
+
}
|
|
554
|
+
catch (e) {
|
|
555
|
+
return fmtErr(e.message);
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
tool("delete_qr_code", `Permanently delete a QR code and its linked short URL. Cannot be undone. ${SECURITY_NOTE}`, { id: z.string().uuid().describe("QR code ID to delete") }, async (args) => {
|
|
559
|
+
try {
|
|
560
|
+
const result = await client.deleteQRCode(args.id);
|
|
561
|
+
return fmt(result);
|
|
562
|
+
}
|
|
563
|
+
catch (e) {
|
|
564
|
+
return fmtErr(e.message);
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
tool("get_settings", `Read current shop settings: scan frequency, alert email, default QR colors, tracking IDs. ${SECURITY_NOTE}`, {}, async () => {
|
|
568
|
+
try {
|
|
569
|
+
const result = await client.getSettings();
|
|
570
|
+
return fmt(sanitizeObject(result));
|
|
571
|
+
}
|
|
572
|
+
catch (e) {
|
|
573
|
+
return fmtErr(e.message);
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
tool("update_settings", `Update shop settings like scan frequency, alert email, default QR colors, GA4/Facebook tracking IDs. ${SECURITY_NOTE}`, UpdateSettingsShape, async (args) => {
|
|
577
|
+
try {
|
|
578
|
+
const result = await client.updateSettings(args);
|
|
579
|
+
return fmt(sanitizeObject(result));
|
|
580
|
+
}
|
|
581
|
+
catch (e) {
|
|
582
|
+
return fmtErr(e.message);
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
tool("trigger_health_scan", `Run a fresh PageSpeed scan on the store right now. Rate limited to once per 5 minutes. ${SECURITY_NOTE}`, {}, async () => {
|
|
586
|
+
try {
|
|
587
|
+
const result = await client.triggerHealthScan();
|
|
588
|
+
return fmt(sanitizeObject(result));
|
|
589
|
+
}
|
|
590
|
+
catch (e) {
|
|
591
|
+
return fmtErr(e.message);
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
tool("manage_bio", `Read or update the Link-in-Bio page config. Use action='get' to read, action='update' to modify. ${SECURITY_NOTE}`, ManageBioShape, async (args) => {
|
|
595
|
+
try {
|
|
596
|
+
if (args.action === "get") {
|
|
597
|
+
const result = await client.getBio();
|
|
598
|
+
return fmt(sanitizeObject(result));
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
const { action, ...input } = args;
|
|
602
|
+
const result = await client.updateBio(input);
|
|
603
|
+
return fmt(result);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
catch (e) {
|
|
607
|
+
return fmtErr(e.message);
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|