listbee-mcp 0.2.0 → 0.4.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/generated/meta.d.ts.map +1 -1
- package/dist/generated/meta.js +119 -5
- package/dist/generated/meta.js.map +1 -1
- package/dist/generated/schemas.d.ts +209 -13
- package/dist/generated/schemas.d.ts.map +1 -1
- package/dist/generated/schemas.js +24 -5
- package/dist/generated/schemas.js.map +1 -1
- package/dist/handlers/stripe-connect.d.ts +9 -0
- package/dist/handlers/stripe-connect.d.ts.map +1 -0
- package/dist/{tools/stripe.js → handlers/stripe-connect.js} +8 -4
- package/dist/handlers/stripe-connect.js.map +1 -0
- package/dist/handlers/upload-file.d.ts +7 -0
- package/dist/handlers/upload-file.d.ts.map +1 -0
- package/dist/handlers/upload-file.js +38 -0
- package/dist/handlers/upload-file.js.map +1 -0
- package/dist/handlers.d.ts +4 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +41 -0
- package/dist/handlers.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +31 -33
- package/dist/server.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +25 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/types.d.ts +1 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -18
- package/dist/types.js.map +1 -1
- package/dist/{tools/shared.d.ts → utils.d.ts} +2 -2
- package/dist/utils.d.ts.map +1 -0
- package/dist/{tools/shared.js → utils.js} +1 -1
- package/dist/utils.js.map +1 -0
- package/mcp-tools.yaml +255 -1
- package/package.json +2 -1
- package/dist/client.d.ts +0 -18
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -61
- package/dist/client.js.map +0 -1
- package/dist/tools/files.d.ts +0 -7
- package/dist/tools/files.d.ts.map +0 -1
- package/dist/tools/files.js +0 -34
- package/dist/tools/files.js.map +0 -1
- package/dist/tools/listings.d.ts +0 -44
- package/dist/tools/listings.d.ts.map +0 -1
- package/dist/tools/listings.js +0 -83
- package/dist/tools/listings.js.map +0 -1
- package/dist/tools/orders.d.ts +0 -16
- package/dist/tools/orders.d.ts.map +0 -1
- package/dist/tools/orders.js +0 -41
- package/dist/tools/orders.js.map +0 -1
- package/dist/tools/shared.d.ts.map +0 -1
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/stripe.d.ts +0 -4
- package/dist/tools/stripe.d.ts.map +0 -1
- package/dist/tools/stripe.js.map +0 -1
package/dist/types.js
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Error thrown by ListBeeClient on non-2xx responses.
|
|
3
|
-
*/
|
|
4
|
-
export class ListBeeApiError extends Error {
|
|
5
|
-
status;
|
|
6
|
-
body;
|
|
7
|
-
constructor(status, body) {
|
|
8
|
-
const msg = typeof body === "object" && body !== null && "detail" in body
|
|
9
|
-
? String(body.detail)
|
|
10
|
-
: JSON.stringify(body);
|
|
11
|
-
super(`ListBee API error ${status}: ${msg}`);
|
|
12
|
-
this.status = status;
|
|
13
|
-
this.body = body;
|
|
14
|
-
this.name = "ListBeeApiError";
|
|
15
|
-
}
|
|
16
|
-
}
|
|
1
|
+
import { APIStatusError, APIConnectionError, APITimeoutError } from "listbee";
|
|
17
2
|
/**
|
|
18
3
|
* Format a successful result as JSON text content.
|
|
19
4
|
*/
|
|
@@ -24,9 +9,10 @@ export function jsonResult(data) {
|
|
|
24
9
|
}
|
|
25
10
|
/**
|
|
26
11
|
* Format an error as an isError result so the LLM can reason about it.
|
|
12
|
+
* Handles SDK's typed error hierarchy for structured output.
|
|
27
13
|
*/
|
|
28
14
|
export function errorResult(err) {
|
|
29
|
-
if (err instanceof
|
|
15
|
+
if (err instanceof APIStatusError) {
|
|
30
16
|
return {
|
|
31
17
|
isError: true,
|
|
32
18
|
content: [
|
|
@@ -34,12 +20,26 @@ export function errorResult(err) {
|
|
|
34
20
|
type: "text",
|
|
35
21
|
text: JSON.stringify({
|
|
36
22
|
status: err.status,
|
|
37
|
-
|
|
23
|
+
code: err.code,
|
|
24
|
+
detail: err.detail,
|
|
25
|
+
...(err.param ? { param: err.param } : {}),
|
|
38
26
|
}, null, 2),
|
|
39
27
|
},
|
|
40
28
|
],
|
|
41
29
|
};
|
|
42
30
|
}
|
|
31
|
+
if (err instanceof APIConnectionError) {
|
|
32
|
+
return {
|
|
33
|
+
isError: true,
|
|
34
|
+
content: [{ type: "text", text: `Connection error: ${err.message}` }],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (err instanceof APITimeoutError) {
|
|
38
|
+
return {
|
|
39
|
+
isError: true,
|
|
40
|
+
content: [{ type: "text", text: `Request timed out: ${err.message}` }],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
43
|
const message = err instanceof Error ? err.message : String(err);
|
|
44
44
|
return {
|
|
45
45
|
isError: true,
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE9E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC3C,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,EAAoB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolMeta } from "
|
|
1
|
+
import type { ToolMeta } from "./manifest.js";
|
|
2
2
|
export interface Deliverable {
|
|
3
3
|
type: string;
|
|
4
4
|
token?: string;
|
|
@@ -15,4 +15,4 @@ export declare function autoTitle(name: string): string;
|
|
|
15
15
|
* Complex tools get structured markdown; simple ones get a single sentence.
|
|
16
16
|
*/
|
|
17
17
|
export declare function buildDescription(meta: ToolMeta): string;
|
|
18
|
-
//# sourceMappingURL=
|
|
18
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAsBvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
package/mcp-tools.yaml
CHANGED
|
@@ -17,12 +17,26 @@ tools:
|
|
|
17
17
|
when_to_use: "Use when the user wants to sell something new."
|
|
18
18
|
description: >
|
|
19
19
|
Create a new listing for sale. Returns a checkout URL and readiness status.
|
|
20
|
+
Only name and price are required — but listings with rich content convert
|
|
21
|
+
significantly better. Fill in as many fields as you can: description, tagline,
|
|
22
|
+
highlights, badges, reviews, faqs, cta, cover_url. Write salesy, compelling
|
|
23
|
+
copy. The product page buyers see is built entirely from these fields.
|
|
20
24
|
hints:
|
|
21
25
|
- "Always check readiness.sellable in the response"
|
|
22
26
|
- "readiness.next tells you the highest-priority action to take"
|
|
27
|
+
- "Only name + price are required, but fill in description, tagline, highlights, badges, reviews, faqs, cta for better conversions"
|
|
28
|
+
- "Write compelling, benefit-focused copy — this IS the product page buyers see"
|
|
29
|
+
- "checkout_schema and metadata are the only fields that don't appear on the product page"
|
|
23
30
|
input_example:
|
|
24
31
|
name: "50 Cold Outreach Templates"
|
|
25
32
|
price: 1900
|
|
33
|
+
tagline: "Battle-tested templates that book meetings"
|
|
34
|
+
description: "50 proven cold outreach templates used by 500+ SDRs. Each template includes subject line, body, and follow-up sequence. Average 45% open rate."
|
|
35
|
+
highlights:
|
|
36
|
+
- "50 ready-to-send templates"
|
|
37
|
+
- "45% average open rate"
|
|
38
|
+
- "Follow-up sequences included"
|
|
39
|
+
cta: "Get the Templates"
|
|
26
40
|
|
|
27
41
|
- type: operation
|
|
28
42
|
operation_id: get_listing
|
|
@@ -113,7 +127,7 @@ tools:
|
|
|
113
127
|
status: active
|
|
114
128
|
when_to_use: "Use when the user has a file to sell. Upload first, then use the returned token in set_deliverables."
|
|
115
129
|
description: >
|
|
116
|
-
|
|
130
|
+
Upload a file and receive a token for use in deliverables.
|
|
117
131
|
hints:
|
|
118
132
|
- "Returns a file token — pass it to set_deliverables to attach the file to a listing"
|
|
119
133
|
|
|
@@ -163,6 +177,156 @@ tools:
|
|
|
163
177
|
carrier: "USPS"
|
|
164
178
|
tracking_code: "9400111899223"
|
|
165
179
|
|
|
180
|
+
- type: operation
|
|
181
|
+
operation_id: refund_order
|
|
182
|
+
name: refund_order
|
|
183
|
+
category: orders
|
|
184
|
+
priority: 6
|
|
185
|
+
status: active
|
|
186
|
+
when_to_use: "When a buyer requests a refund or the seller needs to reverse a charge. Only works on paid or fulfilled orders."
|
|
187
|
+
description: >
|
|
188
|
+
Issue a full refund for an order. Refund is processed through Stripe on the
|
|
189
|
+
seller's connected account. Idempotent — already-refunded orders return as-is.
|
|
190
|
+
Order state (refund_amount, refunded_at) updates asynchronously via Stripe webhook.
|
|
191
|
+
hints:
|
|
192
|
+
- "Only works on orders in PAID or FULFILLED status"
|
|
193
|
+
- "Already-refunded orders return 200 with no action (idempotent)"
|
|
194
|
+
- "Fires order.refunded webhook after Stripe processes the refund"
|
|
195
|
+
input_example:
|
|
196
|
+
order_id: "ord_9xM4kP7nR2qT5wY1"
|
|
197
|
+
|
|
198
|
+
# --- Customers ---
|
|
199
|
+
- type: operation
|
|
200
|
+
operation_id: list_customers
|
|
201
|
+
name: list_customers
|
|
202
|
+
category: customers
|
|
203
|
+
priority: 7
|
|
204
|
+
status: active
|
|
205
|
+
when_to_use: "When the agent needs buyer email addresses for marketing, wants to analyze purchasing patterns, or needs to identify repeat customers."
|
|
206
|
+
description: >
|
|
207
|
+
List all customers (buyers) who have purchased from the seller. Auto-populated
|
|
208
|
+
from orders — no manual creation needed. Sorted by most recent purchase first.
|
|
209
|
+
Filter by email for exact match lookup.
|
|
210
|
+
hints:
|
|
211
|
+
- "Customers are auto-created on first order — read-only, no create/delete"
|
|
212
|
+
- "Use email filter to look up a specific buyer"
|
|
213
|
+
- "total_spent is in cents (smallest currency unit)"
|
|
214
|
+
|
|
215
|
+
- type: operation
|
|
216
|
+
operation_id: get_customer
|
|
217
|
+
name: get_customer
|
|
218
|
+
category: customers
|
|
219
|
+
priority: 6
|
|
220
|
+
status: active
|
|
221
|
+
when_to_use: "When the agent needs purchase history details for a specific buyer."
|
|
222
|
+
description: >
|
|
223
|
+
Get a customer by ID. Shows total orders, total spent, currency, and purchase dates.
|
|
224
|
+
Customers represent unique buyer emails that have purchased from the seller.
|
|
225
|
+
hints:
|
|
226
|
+
- "Use list_customers with email filter if you have the email but not the ID"
|
|
227
|
+
|
|
228
|
+
# --- Account ---
|
|
229
|
+
- type: operation
|
|
230
|
+
operation_id: get_account
|
|
231
|
+
name: get_account
|
|
232
|
+
category: account
|
|
233
|
+
priority: 8
|
|
234
|
+
status: active
|
|
235
|
+
when_to_use: "Use to check account status, readiness, billing, Stripe connection, and profile details."
|
|
236
|
+
description: >
|
|
237
|
+
Get the authenticated account's full state including readiness and billing status.
|
|
238
|
+
This is the first call an agent should make to understand what's set up.
|
|
239
|
+
hints:
|
|
240
|
+
- "Call this first to understand account state"
|
|
241
|
+
- "readiness.operational tells you if the account can sell"
|
|
242
|
+
- "Check payment_config to see if Stripe is connected"
|
|
243
|
+
|
|
244
|
+
- type: operation
|
|
245
|
+
operation_id: update_account
|
|
246
|
+
name: update_account
|
|
247
|
+
category: account
|
|
248
|
+
priority: 5
|
|
249
|
+
status: active
|
|
250
|
+
when_to_use: "Use to update account profile — display name, bio, avatar."
|
|
251
|
+
description: >
|
|
252
|
+
Update the account's display name, bio, or avatar. These appear on product pages
|
|
253
|
+
as the seller identity.
|
|
254
|
+
|
|
255
|
+
- type: operation
|
|
256
|
+
operation_id: delete_account
|
|
257
|
+
name: delete_account
|
|
258
|
+
category: account
|
|
259
|
+
priority: 1
|
|
260
|
+
status: active
|
|
261
|
+
when_to_use: "Use only when the user explicitly wants to permanently delete their account."
|
|
262
|
+
description: >
|
|
263
|
+
Permanently delete the account and all associated data. This is irreversible.
|
|
264
|
+
hints:
|
|
265
|
+
- "This is destructive and irreversible — confirm with the user first"
|
|
266
|
+
|
|
267
|
+
- type: operation
|
|
268
|
+
operation_id: create_account
|
|
269
|
+
name: create_account
|
|
270
|
+
category: account
|
|
271
|
+
priority: 10
|
|
272
|
+
status: active
|
|
273
|
+
when_to_use: "Use when a new user wants to sign up. First step in the onboarding flow."
|
|
274
|
+
description: >
|
|
275
|
+
Create a new ListBee account with an email address. Sends an OTP code to the email
|
|
276
|
+
for verification. Follow up with verify_otp to complete signup and get an API key.
|
|
277
|
+
hints:
|
|
278
|
+
- "This sends an OTP email — the user must provide the code"
|
|
279
|
+
- "After create_account, call verify_otp with the code"
|
|
280
|
+
|
|
281
|
+
- type: operation
|
|
282
|
+
operation_id: verify_otp
|
|
283
|
+
name: verify_otp
|
|
284
|
+
category: account
|
|
285
|
+
priority: 10
|
|
286
|
+
status: active
|
|
287
|
+
when_to_use: "Use after create_account to verify the email OTP code and complete signup."
|
|
288
|
+
description: >
|
|
289
|
+
Verify the OTP code sent to the user's email during account creation.
|
|
290
|
+
Returns an API key on success — store it securely for all future API calls.
|
|
291
|
+
hints:
|
|
292
|
+
- "The user must provide the OTP code from their email"
|
|
293
|
+
- "On success, returns an API key (lb_ prefixed) — this is the only time it's shown"
|
|
294
|
+
|
|
295
|
+
# --- API Keys ---
|
|
296
|
+
- type: operation
|
|
297
|
+
operation_id: list_api_keys
|
|
298
|
+
name: list_api_keys
|
|
299
|
+
category: api_keys
|
|
300
|
+
priority: 4
|
|
301
|
+
status: active
|
|
302
|
+
when_to_use: "Use to see all API keys for the account."
|
|
303
|
+
description: >
|
|
304
|
+
List all API keys. Shows key prefixes and names but not full key values
|
|
305
|
+
(those are only shown at creation time).
|
|
306
|
+
|
|
307
|
+
- type: operation
|
|
308
|
+
operation_id: create_api_key
|
|
309
|
+
name: create_api_key
|
|
310
|
+
category: api_keys
|
|
311
|
+
priority: 4
|
|
312
|
+
status: active
|
|
313
|
+
when_to_use: "Use when the user needs a new API key, e.g. for a separate agent or integration."
|
|
314
|
+
description: >
|
|
315
|
+
Create a new API key. The full key value (lb_ prefixed) is returned only once —
|
|
316
|
+
store it securely. Each key can have a name for identification.
|
|
317
|
+
hints:
|
|
318
|
+
- "The full key is only shown once at creation — store it immediately"
|
|
319
|
+
|
|
320
|
+
- type: operation
|
|
321
|
+
operation_id: delete_api_key
|
|
322
|
+
name: delete_api_key
|
|
323
|
+
category: api_keys
|
|
324
|
+
priority: 2
|
|
325
|
+
status: active
|
|
326
|
+
when_to_use: "Use to revoke an API key that is no longer needed or compromised."
|
|
327
|
+
description: >
|
|
328
|
+
Delete an API key. The key is immediately revoked and cannot be used again.
|
|
329
|
+
|
|
166
330
|
# --- Stripe ---
|
|
167
331
|
- type: operation
|
|
168
332
|
operation_id: start_stripe_connect
|
|
@@ -179,6 +343,96 @@ tools:
|
|
|
179
343
|
- "You cannot complete this — the human must open the URL"
|
|
180
344
|
- "After the human completes onboarding, check readiness again"
|
|
181
345
|
|
|
346
|
+
- type: operation
|
|
347
|
+
operation_id: disconnect_stripe
|
|
348
|
+
name: disconnect_stripe
|
|
349
|
+
category: stripe
|
|
350
|
+
priority: 2
|
|
351
|
+
status: active
|
|
352
|
+
when_to_use: "Use when the user wants to disconnect their Stripe account."
|
|
353
|
+
description: >
|
|
354
|
+
Disconnect the Stripe account from ListBee. Existing listings retain their
|
|
355
|
+
payment snapshot but new checkouts will fail.
|
|
356
|
+
hints:
|
|
357
|
+
- "This doesn't delete the Stripe account — just disconnects it from ListBee"
|
|
358
|
+
|
|
359
|
+
# --- Webhooks ---
|
|
360
|
+
- type: operation
|
|
361
|
+
operation_id: list_webhooks
|
|
362
|
+
name: list_webhooks
|
|
363
|
+
category: webhooks
|
|
364
|
+
priority: 7
|
|
365
|
+
status: active
|
|
366
|
+
when_to_use: "Use to see configured webhooks and their delivery status."
|
|
367
|
+
description: >
|
|
368
|
+
List all webhooks for the account. Shows URL, events filter, and enabled status.
|
|
369
|
+
|
|
370
|
+
- type: operation
|
|
371
|
+
operation_id: create_webhook
|
|
372
|
+
name: create_webhook
|
|
373
|
+
category: webhooks
|
|
374
|
+
priority: 8
|
|
375
|
+
status: active
|
|
376
|
+
when_to_use: "Use when the user needs to receive order notifications at a URL. Required for external fulfillment."
|
|
377
|
+
description: >
|
|
378
|
+
Create a webhook endpoint. Specify the URL and which events to receive.
|
|
379
|
+
The webhook secret (whsec_ prefixed) is returned for signature verification.
|
|
380
|
+
hints:
|
|
381
|
+
- "Required for external fulfillment listings — readiness checks for this"
|
|
382
|
+
- "Common events: order.paid, order.fulfilled, order.refunded"
|
|
383
|
+
- "The secret is only shown once at creation"
|
|
384
|
+
input_example:
|
|
385
|
+
url: "https://your-server.com/webhooks"
|
|
386
|
+
events: ["order.paid", "order.fulfilled"]
|
|
387
|
+
|
|
388
|
+
- type: operation
|
|
389
|
+
operation_id: update_webhook
|
|
390
|
+
name: update_webhook
|
|
391
|
+
category: webhooks
|
|
392
|
+
priority: 5
|
|
393
|
+
status: active
|
|
394
|
+
when_to_use: "Use to change a webhook's URL, events filter, or enabled status."
|
|
395
|
+
|
|
396
|
+
- type: operation
|
|
397
|
+
operation_id: delete_webhook
|
|
398
|
+
name: delete_webhook
|
|
399
|
+
category: webhooks
|
|
400
|
+
priority: 3
|
|
401
|
+
status: active
|
|
402
|
+
when_to_use: "Use to remove a webhook endpoint."
|
|
403
|
+
|
|
404
|
+
- type: operation
|
|
405
|
+
operation_id: list_webhook_events
|
|
406
|
+
name: list_webhook_events
|
|
407
|
+
category: webhooks
|
|
408
|
+
priority: 5
|
|
409
|
+
status: active
|
|
410
|
+
when_to_use: "Use to check webhook delivery history — see which events were sent and whether they succeeded."
|
|
411
|
+
description: >
|
|
412
|
+
List recent events for a webhook. Shows delivery status, attempts, and errors.
|
|
413
|
+
Useful for debugging failed deliveries.
|
|
414
|
+
|
|
415
|
+
- type: operation
|
|
416
|
+
operation_id: retry_webhook_event
|
|
417
|
+
name: retry_webhook_event
|
|
418
|
+
category: webhooks
|
|
419
|
+
priority: 4
|
|
420
|
+
status: active
|
|
421
|
+
when_to_use: "Use when a webhook delivery failed and needs to be retried."
|
|
422
|
+
description: >
|
|
423
|
+
Retry delivery of a failed webhook event. Resets attempt counter.
|
|
424
|
+
|
|
425
|
+
- type: operation
|
|
426
|
+
operation_id: test_webhook
|
|
427
|
+
name: test_webhook
|
|
428
|
+
category: webhooks
|
|
429
|
+
priority: 5
|
|
430
|
+
status: active
|
|
431
|
+
when_to_use: "Use to send a test event to a webhook URL to verify it's working."
|
|
432
|
+
description: >
|
|
433
|
+
Send a test event to the webhook URL. Returns the delivery result.
|
|
434
|
+
Use this to verify webhook configuration before going live.
|
|
435
|
+
|
|
182
436
|
# --- Future composite tools (v2+) ---
|
|
183
437
|
# - type: composite
|
|
184
438
|
# name: create_and_publish
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "listbee-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "MCP server for ListBee — commerce API for AI agents",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
27
|
+
"listbee": "^0.6.1",
|
|
27
28
|
"yaml": "2.8.3",
|
|
28
29
|
"zod": "3.25.76"
|
|
29
30
|
},
|
package/dist/client.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thin fetch wrapper for the ListBee REST API.
|
|
3
|
-
* All requests include Authorization header. Non-2xx throws ListBeeApiError.
|
|
4
|
-
*/
|
|
5
|
-
export declare class ListBeeClient {
|
|
6
|
-
private readonly apiKey;
|
|
7
|
-
private readonly baseUrl;
|
|
8
|
-
constructor(apiKey: string, baseUrl?: string);
|
|
9
|
-
/**
|
|
10
|
-
* Make an authenticated JSON request. Returns parsed response body.
|
|
11
|
-
*/
|
|
12
|
-
request<T = unknown>(method: string, path: string, body?: unknown): Promise<T>;
|
|
13
|
-
/**
|
|
14
|
-
* Upload a file via multipart form data to /v1/files.
|
|
15
|
-
*/
|
|
16
|
-
uploadFile(fileBuffer: Uint8Array, filename: string): Promise<unknown>;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,SAA2B;IAM9D;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsB7E"}
|
package/dist/client.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { ListBeeApiError } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Thin fetch wrapper for the ListBee REST API.
|
|
4
|
-
* All requests include Authorization header. Non-2xx throws ListBeeApiError.
|
|
5
|
-
*/
|
|
6
|
-
export class ListBeeClient {
|
|
7
|
-
apiKey;
|
|
8
|
-
baseUrl;
|
|
9
|
-
constructor(apiKey, baseUrl = "https://api.listbee.so") {
|
|
10
|
-
this.apiKey = apiKey;
|
|
11
|
-
// Strip trailing slash
|
|
12
|
-
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Make an authenticated JSON request. Returns parsed response body.
|
|
16
|
-
*/
|
|
17
|
-
async request(method, path, body) {
|
|
18
|
-
const url = `${this.baseUrl}${path}`;
|
|
19
|
-
const headers = {
|
|
20
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
21
|
-
Accept: "application/json",
|
|
22
|
-
};
|
|
23
|
-
const init = { method, headers };
|
|
24
|
-
if (body !== undefined) {
|
|
25
|
-
headers["Content-Type"] = "application/json";
|
|
26
|
-
init.body = JSON.stringify(body);
|
|
27
|
-
}
|
|
28
|
-
const res = await fetch(url, init);
|
|
29
|
-
// Handle 204 No Content
|
|
30
|
-
if (res.status === 204) {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
const json = await res.json();
|
|
34
|
-
if (!res.ok) {
|
|
35
|
-
throw new ListBeeApiError(res.status, json);
|
|
36
|
-
}
|
|
37
|
-
return json;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Upload a file via multipart form data to /v1/files.
|
|
41
|
-
*/
|
|
42
|
-
async uploadFile(fileBuffer, filename) {
|
|
43
|
-
const url = `${this.baseUrl}/v1/files`;
|
|
44
|
-
const form = new FormData();
|
|
45
|
-
const blob = new Blob([fileBuffer]);
|
|
46
|
-
form.append("file", blob, filename);
|
|
47
|
-
const res = await fetch(url, {
|
|
48
|
-
method: "POST",
|
|
49
|
-
headers: {
|
|
50
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
51
|
-
},
|
|
52
|
-
body: form,
|
|
53
|
-
});
|
|
54
|
-
const json = await res.json();
|
|
55
|
-
if (!res.ok) {
|
|
56
|
-
throw new ListBeeApiError(res.status, json);
|
|
57
|
-
}
|
|
58
|
-
return json;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,MAAM,OAAO,aAAa;IACP,MAAM,CAAS;IACf,OAAO,CAAS;IAEjC,YAAY,MAAc,EAAE,OAAO,GAAG,wBAAwB;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,uBAAuB;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAE9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEnC,wBAAwB;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,SAAc,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAsB,EAAE,QAAgB;QACvD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAsB,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
package/dist/tools/files.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import type { ListBeeClient } from "../client.js";
|
|
3
|
-
export declare function handleUploadFile(client: ListBeeClient, args: {
|
|
4
|
-
url: string;
|
|
5
|
-
filename?: string;
|
|
6
|
-
}): Promise<CallToolResult>;
|
|
7
|
-
//# sourceMappingURL=files.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
package/dist/tools/files.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { safeTool } from "../types.js";
|
|
2
|
-
// --- upload_file ---
|
|
3
|
-
export async function handleUploadFile(client, args) {
|
|
4
|
-
return safeTool(async () => {
|
|
5
|
-
// Fetch the file from the provided URL
|
|
6
|
-
const res = await fetch(args.url);
|
|
7
|
-
if (!res.ok) {
|
|
8
|
-
throw new Error(`Failed to fetch file from ${args.url}: ${res.status} ${res.statusText}`);
|
|
9
|
-
}
|
|
10
|
-
const buffer = new Uint8Array(await res.arrayBuffer());
|
|
11
|
-
// Derive filename from URL if not provided
|
|
12
|
-
const filename = args.filename ?? deriveFilename(args.url) ?? "uploaded-file";
|
|
13
|
-
const data = await client.uploadFile(buffer, filename);
|
|
14
|
-
return data;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Extract a reasonable filename from a URL path.
|
|
19
|
-
*/
|
|
20
|
-
function deriveFilename(url) {
|
|
21
|
-
try {
|
|
22
|
-
const pathname = new URL(url).pathname;
|
|
23
|
-
const segments = pathname.split("/").filter(Boolean);
|
|
24
|
-
const last = segments[segments.length - 1];
|
|
25
|
-
if (last && last.includes(".")) {
|
|
26
|
-
return decodeURIComponent(last);
|
|
27
|
-
}
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=files.js.map
|
package/dist/tools/files.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,sBAAsB;AAEtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAqB,EACrB,IAAwC;IAExC,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,uCAAuC;QACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvD,2CAA2C;QAC3C,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;QAE/D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/tools/listings.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import type { ListBeeClient } from "../client.js";
|
|
3
|
-
import type { Deliverable } from "./shared.js";
|
|
4
|
-
export declare function handleCreateListing(client: ListBeeClient, args: {
|
|
5
|
-
name: string;
|
|
6
|
-
price: number;
|
|
7
|
-
description?: string;
|
|
8
|
-
tagline?: string;
|
|
9
|
-
stock?: number;
|
|
10
|
-
cover?: string;
|
|
11
|
-
metadata?: Record<string, unknown>;
|
|
12
|
-
}): Promise<CallToolResult>;
|
|
13
|
-
export declare function handleGetListing(client: ListBeeClient, args: {
|
|
14
|
-
listing_id: string;
|
|
15
|
-
}): Promise<CallToolResult>;
|
|
16
|
-
export declare function handleUpdateListing(client: ListBeeClient, args: {
|
|
17
|
-
listing_id: string;
|
|
18
|
-
name?: string;
|
|
19
|
-
slug?: string;
|
|
20
|
-
price?: number;
|
|
21
|
-
description?: string;
|
|
22
|
-
tagline?: string;
|
|
23
|
-
stock?: number;
|
|
24
|
-
cover?: string;
|
|
25
|
-
metadata?: Record<string, unknown>;
|
|
26
|
-
}): Promise<CallToolResult>;
|
|
27
|
-
export declare function handleListListings(client: ListBeeClient, args: {
|
|
28
|
-
cursor?: string;
|
|
29
|
-
limit?: number;
|
|
30
|
-
}): Promise<CallToolResult>;
|
|
31
|
-
export declare function handlePublishListing(client: ListBeeClient, args: {
|
|
32
|
-
listing_id: string;
|
|
33
|
-
}): Promise<CallToolResult>;
|
|
34
|
-
export declare function handleSetDeliverables(client: ListBeeClient, args: {
|
|
35
|
-
listing_id: string;
|
|
36
|
-
deliverables: Deliverable[];
|
|
37
|
-
}): Promise<CallToolResult>;
|
|
38
|
-
export declare function handleRemoveDeliverables(client: ListBeeClient, args: {
|
|
39
|
-
listing_id: string;
|
|
40
|
-
}): Promise<CallToolResult>;
|
|
41
|
-
export declare function handleDeleteListing(client: ListBeeClient, args: {
|
|
42
|
-
listing_id: string;
|
|
43
|
-
}): Promise<CallToolResult>;
|
|
44
|
-
//# sourceMappingURL=listings.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"listings.d.ts","sourceRoot":"","sources":["../../src/tools/listings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAezB;AAID,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,cAAc,CAAC,CAIzB;AAID,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,cAAc,CAAC,CAYzB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,cAAc,CAAC,CASzB;AAID,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,cAAc,CAAC,CAQzB;AAID,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,EAAE,CAAA;CAAE,GACxD,OAAO,CAAC,cAAc,CAAC,CAQzB;AAID,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,cAAc,CAAC,CAQzB;AAID,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,cAAc,CAAC,CAKzB"}
|