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.
Files changed (56) hide show
  1. package/dist/generated/meta.d.ts.map +1 -1
  2. package/dist/generated/meta.js +119 -5
  3. package/dist/generated/meta.js.map +1 -1
  4. package/dist/generated/schemas.d.ts +209 -13
  5. package/dist/generated/schemas.d.ts.map +1 -1
  6. package/dist/generated/schemas.js +24 -5
  7. package/dist/generated/schemas.js.map +1 -1
  8. package/dist/handlers/stripe-connect.d.ts +9 -0
  9. package/dist/handlers/stripe-connect.d.ts.map +1 -0
  10. package/dist/{tools/stripe.js → handlers/stripe-connect.js} +8 -4
  11. package/dist/handlers/stripe-connect.js.map +1 -0
  12. package/dist/handlers/upload-file.d.ts +7 -0
  13. package/dist/handlers/upload-file.d.ts.map +1 -0
  14. package/dist/handlers/upload-file.js +38 -0
  15. package/dist/handlers/upload-file.js.map +1 -0
  16. package/dist/handlers.d.ts +4 -0
  17. package/dist/handlers.d.ts.map +1 -0
  18. package/dist/handlers.js +41 -0
  19. package/dist/handlers.js.map +1 -0
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +31 -33
  22. package/dist/server.js.map +1 -1
  23. package/dist/transports/http.d.ts.map +1 -1
  24. package/dist/transports/http.js +25 -1
  25. package/dist/transports/http.js.map +1 -1
  26. package/dist/types.d.ts +1 -8
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js +18 -18
  29. package/dist/types.js.map +1 -1
  30. package/dist/{tools/shared.d.ts → utils.d.ts} +2 -2
  31. package/dist/utils.d.ts.map +1 -0
  32. package/dist/{tools/shared.js → utils.js} +1 -1
  33. package/dist/utils.js.map +1 -0
  34. package/mcp-tools.yaml +255 -1
  35. package/package.json +2 -1
  36. package/dist/client.d.ts +0 -18
  37. package/dist/client.d.ts.map +0 -1
  38. package/dist/client.js +0 -61
  39. package/dist/client.js.map +0 -1
  40. package/dist/tools/files.d.ts +0 -7
  41. package/dist/tools/files.d.ts.map +0 -1
  42. package/dist/tools/files.js +0 -34
  43. package/dist/tools/files.js.map +0 -1
  44. package/dist/tools/listings.d.ts +0 -44
  45. package/dist/tools/listings.d.ts.map +0 -1
  46. package/dist/tools/listings.js +0 -83
  47. package/dist/tools/listings.js.map +0 -1
  48. package/dist/tools/orders.d.ts +0 -16
  49. package/dist/tools/orders.d.ts.map +0 -1
  50. package/dist/tools/orders.js +0 -41
  51. package/dist/tools/orders.js.map +0 -1
  52. package/dist/tools/shared.d.ts.map +0 -1
  53. package/dist/tools/shared.js.map +0 -1
  54. package/dist/tools/stripe.d.ts +0 -4
  55. package/dist/tools/stripe.d.ts.map +0 -1
  56. 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 ListBeeApiError) {
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
- error: err.body,
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":"AAEA;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IACA;IAFlB,YACkB,MAAc,EACd,IAAa;QAE7B,MAAM,GAAG,GACP,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI,IAAI;YAC3D,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,MAAM,CAAC;YAClD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,CAAC,qBAAqB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;QAP7B,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAS;QAO7B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;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;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,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,KAAK,EAAE,GAAG,CAAC,IAAI;qBAChB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,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
+ {"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 "../manifest.js";
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=shared.d.ts.map
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"}
@@ -28,4 +28,4 @@ export function buildDescription(meta) {
28
28
  }
29
29
  return parts.join("\n\n");
30
30
  }
31
- //# sourceMappingURL=shared.js.map
31
+ //# sourceMappingURL=utils.js.map
@@ -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
- Fetches the file from the URL and uploads it to ListBee. Only use with URLs the user has provided or that you trust.
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.2.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
@@ -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
@@ -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"}
@@ -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"}
@@ -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
@@ -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"}
@@ -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"}