listbee-mcp 0.1.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 (69) hide show
  1. package/README.md +24 -0
  2. package/dist/generated/meta.d.ts +8 -0
  3. package/dist/generated/meta.d.ts.map +1 -0
  4. package/dist/generated/meta.js +207 -0
  5. package/dist/generated/meta.js.map +1 -0
  6. package/dist/generated/schemas.d.ts +577 -0
  7. package/dist/generated/schemas.d.ts.map +1 -0
  8. package/dist/generated/schemas.js +44 -0
  9. package/dist/generated/schemas.js.map +1 -0
  10. package/dist/handlers/stripe-connect.d.ts +9 -0
  11. package/dist/handlers/stripe-connect.d.ts.map +1 -0
  12. package/dist/{tools/stripe.js → handlers/stripe-connect.js} +8 -4
  13. package/dist/handlers/stripe-connect.js.map +1 -0
  14. package/dist/handlers/upload-file.d.ts +7 -0
  15. package/dist/handlers/upload-file.d.ts.map +1 -0
  16. package/dist/handlers/upload-file.js +38 -0
  17. package/dist/handlers/upload-file.js.map +1 -0
  18. package/dist/handlers.d.ts +4 -0
  19. package/dist/handlers.d.ts.map +1 -0
  20. package/dist/handlers.js +41 -0
  21. package/dist/handlers.js.map +1 -0
  22. package/dist/index.js +62 -65
  23. package/dist/index.js.map +1 -1
  24. package/dist/server.d.ts.map +1 -1
  25. package/dist/server.js +63 -62
  26. package/dist/server.js.map +1 -1
  27. package/dist/transports/http.d.ts +7 -0
  28. package/dist/transports/http.d.ts.map +1 -0
  29. package/dist/transports/http.js +120 -0
  30. package/dist/transports/http.js.map +1 -0
  31. package/dist/transports/stdio.d.ts +7 -0
  32. package/dist/transports/stdio.d.ts.map +1 -0
  33. package/dist/transports/stdio.js +18 -0
  34. package/dist/transports/stdio.js.map +1 -0
  35. package/dist/types.d.ts +1 -8
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/types.js +18 -18
  38. package/dist/types.js.map +1 -1
  39. package/dist/{tools/shared.d.ts → utils.d.ts} +2 -2
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/{tools/shared.js → utils.js} +1 -1
  42. package/dist/utils.js.map +1 -0
  43. package/mcp-tools.yaml +273 -1
  44. package/package.json +10 -4
  45. package/dist/client.d.ts +0 -18
  46. package/dist/client.d.ts.map +0 -1
  47. package/dist/client.js +0 -61
  48. package/dist/client.js.map +0 -1
  49. package/dist/schemas.d.ts +0 -87
  50. package/dist/schemas.d.ts.map +0 -1
  51. package/dist/schemas.js +0 -137
  52. package/dist/schemas.js.map +0 -1
  53. package/dist/tools/files.d.ts +0 -7
  54. package/dist/tools/files.d.ts.map +0 -1
  55. package/dist/tools/files.js +0 -34
  56. package/dist/tools/files.js.map +0 -1
  57. package/dist/tools/listings.d.ts +0 -44
  58. package/dist/tools/listings.d.ts.map +0 -1
  59. package/dist/tools/listings.js +0 -83
  60. package/dist/tools/listings.js.map +0 -1
  61. package/dist/tools/orders.d.ts +0 -15
  62. package/dist/tools/orders.d.ts.map +0 -1
  63. package/dist/tools/orders.js +0 -28
  64. package/dist/tools/orders.js.map +0 -1
  65. package/dist/tools/shared.d.ts.map +0 -1
  66. package/dist/tools/shared.js.map +0 -1
  67. package/dist/tools/stripe.d.ts +0 -4
  68. package/dist/tools/stripe.d.ts.map +0 -1
  69. package/dist/tools/stripe.js.map +0 -1
package/README.md CHANGED
@@ -91,6 +91,30 @@ npx listbee-mcp --api-key lb_...
91
91
 
92
92
  ---
93
93
 
94
+ ## Remote / HTTP Transport
95
+
96
+ For hosted deployments (ChatGPT Apps, Claude API Connector, remote agents):
97
+
98
+ ```bash
99
+ npx listbee-mcp --transport http --port 3000
100
+ ```
101
+
102
+ Each connecting agent provides their API key via `Authorization: Bearer` header.
103
+
104
+ ### Docker
105
+
106
+ ```bash
107
+ docker build -t listbee-mcp .
108
+ docker run -p 8080:8080 listbee-mcp
109
+ ```
110
+
111
+ ### Health Checks
112
+
113
+ - `GET /health` — basic liveness
114
+ - `GET /ready` — confirms tools are loaded
115
+
116
+ ---
117
+
94
118
  ## Options
95
119
 
96
120
  | Flag | Env var | Default | Description |
@@ -0,0 +1,8 @@
1
+ export interface ToolMeta {
2
+ operationId: string;
3
+ method: string;
4
+ path: string;
5
+ description: string;
6
+ }
7
+ export declare const meta: Record<string, ToolMeta>;
8
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/generated/meta.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAuMzC,CAAC"}
@@ -0,0 +1,207 @@
1
+ // GENERATED FILE — DO NOT EDIT
2
+ // source: openapi.json + mcp-tools.yaml
3
+ // Regenerate with: npm run generate
4
+ // openapi_version: 1.0.0
5
+ // generated_at: 2026-04-05T13:40:19.654Z
6
+ // sha256: c8b0d9640ed32ea12e64304dc6799ff00452ce0d57e332cd3eb4bd37042a3254
7
+ export const meta = {
8
+ create_account: {
9
+ operationId: "create_account",
10
+ method: "POST",
11
+ path: "/v1/account",
12
+ description: "Create a new ListBee account with an email address. Sends an OTP code to the email for verification. Follow up with verify_otp to complete signup and get an API key.",
13
+ },
14
+ create_api_key: {
15
+ operationId: "create_api_key",
16
+ method: "POST",
17
+ path: "/v1/api-keys",
18
+ description: "Create a new API key. The full key value (lb_ prefixed) is returned only once — store it securely. Each key can have a name for identification.",
19
+ },
20
+ create_listing: {
21
+ operationId: "create_listing",
22
+ method: "POST",
23
+ path: "/v1/listings",
24
+ description: "Create a new listing for sale. Returns a checkout URL and readiness status. Only name and price are required — but listings with rich content convert significantly better. Fill in as many fields as you can: description, tagline, highlights, badges, reviews, faqs, cta, cover_url. Write salesy, compelling copy. The product page buyers see is built entirely from these fields.",
25
+ },
26
+ create_webhook: {
27
+ operationId: "create_webhook",
28
+ method: "POST",
29
+ path: "/v1/webhooks",
30
+ description: "Create a webhook endpoint. Specify the URL and which events to receive. The webhook secret (whsec_ prefixed) is returned for signature verification.",
31
+ },
32
+ delete_account: {
33
+ operationId: "delete_account",
34
+ method: "DELETE",
35
+ path: "/v1/account",
36
+ description: "Permanently delete the account and all associated data. This is irreversible.",
37
+ },
38
+ delete_api_key: {
39
+ operationId: "delete_api_key",
40
+ method: "DELETE",
41
+ path: "/v1/api-keys/{key_id}",
42
+ description: "Delete an API key. The key is immediately revoked and cannot be used again.",
43
+ },
44
+ delete_listing: {
45
+ operationId: "delete_listing",
46
+ method: "DELETE",
47
+ path: "/v1/listings/{listing_id}",
48
+ description: "Delete a listing by ID and its stored content. Irreversible.",
49
+ },
50
+ delete_webhook: {
51
+ operationId: "delete_webhook",
52
+ method: "DELETE",
53
+ path: "/v1/webhooks/{webhook_id}",
54
+ description: "Delete a webhook endpoint. Irreversible.",
55
+ },
56
+ deliver_order: {
57
+ operationId: "deliver_order",
58
+ method: "POST",
59
+ path: "/v1/orders/{order_id}/deliver",
60
+ description: "Push digital content to a buyer for an external fulfillment order. Not needed for managed delivery — ListBee handles that automatically.",
61
+ },
62
+ disconnect_stripe: {
63
+ operationId: "disconnect_stripe",
64
+ method: "DELETE",
65
+ path: "/v1/account/stripe",
66
+ description: "Disconnect the Stripe account from ListBee. Existing listings retain their payment snapshot but new checkouts will fail.",
67
+ },
68
+ get_account: {
69
+ operationId: "get_account",
70
+ method: "GET",
71
+ path: "/v1/account",
72
+ description: "Get the authenticated account's full state including readiness and billing status. This is the first call an agent should make to understand what's set up.",
73
+ },
74
+ get_customer: {
75
+ operationId: "get_customer",
76
+ method: "GET",
77
+ path: "/v1/customers/{customer_id}",
78
+ description: "Get a customer by ID. Shows total orders, total spent, currency, and purchase dates. Customers represent unique buyer emails that have purchased from the seller.",
79
+ },
80
+ get_listing: {
81
+ operationId: "get_listing",
82
+ method: "GET",
83
+ path: "/v1/listings/{listing_id}",
84
+ description: "Get a listing's full state including readiness. This is the readiness inspection tool — call it after every change to check what's needed.",
85
+ },
86
+ get_order: {
87
+ operationId: "get_order",
88
+ method: "GET",
89
+ path: "/v1/orders/{order_id}",
90
+ description: "Get a single order by ID. Order lifecycle: PENDING → PAID → FULFILLED. Managed listings auto-fulfill. External listings require fulfill() or ship() after payment.",
91
+ },
92
+ list_api_keys: {
93
+ operationId: "list_api_keys",
94
+ method: "GET",
95
+ path: "/v1/api-keys",
96
+ description: "List all API keys. Shows key prefixes and names but not full key values (those are only shown at creation time).",
97
+ },
98
+ list_customers: {
99
+ operationId: "list_customers",
100
+ method: "GET",
101
+ path: "/v1/customers",
102
+ description: "List all customers (buyers) who have purchased from the seller. Auto-populated from orders — no manual creation needed. Sorted by most recent purchase first. Filter by email for exact match lookup.",
103
+ },
104
+ list_listings: {
105
+ operationId: "list_listings",
106
+ method: "GET",
107
+ path: "/v1/listings",
108
+ description: "List all listings for the authenticated account. Filter by status. Cursor-paginated. Each listing includes readiness — check readiness.sellable to see if it can accept orders.",
109
+ },
110
+ list_orders: {
111
+ operationId: "list_orders",
112
+ method: "GET",
113
+ path: "/v1/orders",
114
+ description: "List orders for the authenticated account. Filter by status, listing, and date range. Paginated. Order lifecycle: PENDING (checkout started, buyer data captured) → PAID (payment confirmed, order.paid webhook fires) → FULFILLED (content delivered or goods shipped). Terminal states: CANCELED (payment failed or abandoned), FAILED (system error). Managed listings auto-fulfill on payment. External listings stay in PAID until the seller calls fulfill() or ship().",
115
+ },
116
+ list_webhook_events: {
117
+ operationId: "list_webhook_events",
118
+ method: "GET",
119
+ path: "/v1/webhooks/{webhook_id}/events",
120
+ description: "List recent events for a webhook. Shows delivery status, attempts, and errors. Useful for debugging failed deliveries.",
121
+ },
122
+ list_webhooks: {
123
+ operationId: "list_webhooks",
124
+ method: "GET",
125
+ path: "/v1/webhooks",
126
+ description: "List all webhooks for the account. Shows URL, events filter, and enabled status.",
127
+ },
128
+ publish_listing: {
129
+ operationId: "publish_listing",
130
+ method: "POST",
131
+ path: "/v1/listings/{listing_id}/publish",
132
+ description: "Publish a listing so buyers can access the product page. Only works when readiness.publishable is true.",
133
+ },
134
+ refund_order: {
135
+ operationId: "refund_order",
136
+ method: "POST",
137
+ path: "/v1/orders/{order_id}/refund",
138
+ description: "Issue a full refund for an order. Refund is processed through Stripe on the seller's connected account. Idempotent — already-refunded orders return as-is. Order state (refund_amount, refunded_at) updates asynchronously via Stripe webhook.",
139
+ },
140
+ remove_deliverables: {
141
+ operationId: "remove_deliverables",
142
+ method: "DELETE",
143
+ path: "/v1/listings/{listing_id}/deliverables",
144
+ description: "Remove all deliverables from a draft listing. Demotes the listing to external fulfillment. Draft only — returns 409 if the listing is published.",
145
+ },
146
+ retry_webhook_event: {
147
+ operationId: "retry_webhook_event",
148
+ method: "POST",
149
+ path: "/v1/webhooks/{webhook_id}/events/{event_id}/retry",
150
+ description: "Retry delivery of a failed webhook event. Resets attempt counter.",
151
+ },
152
+ set_deliverables: {
153
+ operationId: "set_deliverables",
154
+ method: "PUT",
155
+ path: "/v1/listings/{listing_id}/deliverables",
156
+ description: "Set digital deliverables (files, URLs, or text) on a listing. Required for managed fulfillment mode.",
157
+ },
158
+ ship_order: {
159
+ operationId: "ship_order",
160
+ method: "POST",
161
+ path: "/v1/orders/{order_id}/ship",
162
+ description: "Record shipping info (carrier + tracking code) and transition order to FULFILLED. Only valid for external fulfillment orders. Idempotent with same tracking code.",
163
+ },
164
+ start_stripe_connect: {
165
+ operationId: "start_stripe_connect",
166
+ method: "POST",
167
+ path: "/v1/account/stripe/connect",
168
+ description: "Start Stripe Connect onboarding. Returns a URL for the human to complete in a browser. Required before selling through Stripe.",
169
+ },
170
+ test_webhook: {
171
+ operationId: "test_webhook",
172
+ method: "POST",
173
+ path: "/v1/webhooks/{webhook_id}/test",
174
+ description: "Send a test event to the webhook URL. Returns the delivery result. Use this to verify webhook configuration before going live.",
175
+ },
176
+ update_account: {
177
+ operationId: "update_account",
178
+ method: "PUT",
179
+ path: "/v1/account",
180
+ description: "Update the account's display name, bio, or avatar. These appear on product pages as the seller identity.",
181
+ },
182
+ update_listing: {
183
+ operationId: "update_listing",
184
+ method: "PUT",
185
+ path: "/v1/listings/{listing_id}",
186
+ description: "Update listing fields. Slug can be changed while in draft status — input is slugified, conflicts get a random suffix. Returns updated listing with readiness.",
187
+ },
188
+ update_webhook: {
189
+ operationId: "update_webhook",
190
+ method: "PUT",
191
+ path: "/v1/webhooks/{webhook_id}",
192
+ description: "Update a webhook endpoint. Only provided fields are changed.",
193
+ },
194
+ upload_file: {
195
+ operationId: "upload_file",
196
+ method: "POST",
197
+ path: "/v1/files",
198
+ description: "Upload a file and receive a token for use in deliverables.",
199
+ },
200
+ verify_otp: {
201
+ operationId: "verify_otp",
202
+ method: "POST",
203
+ path: "/v1/account/verify/otp",
204
+ description: "Verify the OTP code sent to the user's email during account creation. Returns an API key on success — store it securely for all future API calls.",
205
+ },
206
+ };
207
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/generated/meta.ts"],"names":[],"mappings":"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"}