listbee-mcp 0.1.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/LICENSE +184 -0
- package/README.md +202 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +61 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +22 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +26 -0
- package/dist/manifest.js.map +1 -0
- package/dist/schemas.d.ts +87 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +137 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/files.d.ts +7 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +34 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/listings.d.ts +44 -0
- package/dist/tools/listings.d.ts.map +1 -0
- package/dist/tools/listings.js +83 -0
- package/dist/tools/listings.js.map +1 -0
- package/dist/tools/orders.d.ts +15 -0
- package/dist/tools/orders.d.ts.map +1 -0
- package/dist/tools/orders.js +28 -0
- package/dist/tools/orders.js.map +1 -0
- package/dist/tools/shared.d.ts +18 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +31 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/stripe.d.ts +4 -0
- package/dist/tools/stripe.d.ts.map +1 -0
- package/dist/tools/stripe.js +21 -0
- package/dist/tools/stripe.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/mcp-tools.yaml +170 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,sBAAsB;AAEtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAqB,EACrB,IAAyC;IAEzC,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oBAAoB;AAEpB,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB,EACrB,IAA0B;IAE1B,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wBAAwB;AAExB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqB,EACrB,IAAuD;IAEvD,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,MAAM,EACN,cAAc,IAAI,CAAC,QAAQ,UAAU,EACrC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CACpC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ToolMeta } from "../manifest.js";
|
|
2
|
+
export interface Deliverable {
|
|
3
|
+
type: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
value?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Auto-generate a human-readable title from a snake_case tool name.
|
|
10
|
+
* e.g. "create_listing" → "Create Listing"
|
|
11
|
+
*/
|
|
12
|
+
export declare function autoTitle(name: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Build a structured description from manifest metadata.
|
|
15
|
+
* Complex tools get structured markdown; simple ones get a single sentence.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildDescription(meta: ToolMeta): string;
|
|
18
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,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,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generate a human-readable title from a snake_case tool name.
|
|
3
|
+
* e.g. "create_listing" → "Create Listing"
|
|
4
|
+
*/
|
|
5
|
+
export function autoTitle(name) {
|
|
6
|
+
return name
|
|
7
|
+
.split("_")
|
|
8
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
9
|
+
.join(" ");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build a structured description from manifest metadata.
|
|
13
|
+
* Complex tools get structured markdown; simple ones get a single sentence.
|
|
14
|
+
*/
|
|
15
|
+
export function buildDescription(meta) {
|
|
16
|
+
const parts = [];
|
|
17
|
+
if (meta.description) {
|
|
18
|
+
parts.push(meta.description.trim());
|
|
19
|
+
}
|
|
20
|
+
if (meta.when_to_use) {
|
|
21
|
+
parts.push(`**When to use:** ${meta.when_to_use}`);
|
|
22
|
+
}
|
|
23
|
+
if (meta.hints && meta.hints.length > 0) {
|
|
24
|
+
parts.push(`**Tips:**\n${meta.hints.map((h) => `- ${h}`).join("\n")}`);
|
|
25
|
+
}
|
|
26
|
+
if (meta.requires_human) {
|
|
27
|
+
parts.push("**Note:** This action requires human intervention. You cannot complete it yourself.");
|
|
28
|
+
}
|
|
29
|
+
return parts.join("\n\n");
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../src/tools/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { errorResult } from "../types.js";
|
|
2
|
+
// --- start_stripe_connect ---
|
|
3
|
+
export async function handleStartStripeConnect(client) {
|
|
4
|
+
try {
|
|
5
|
+
const data = await client.request("POST", "/v1/account/stripe/connect");
|
|
6
|
+
const url = data.url;
|
|
7
|
+
return {
|
|
8
|
+
content: [
|
|
9
|
+
{ type: "text", text: JSON.stringify(data, null, 2) },
|
|
10
|
+
{
|
|
11
|
+
type: "text",
|
|
12
|
+
text: `IMPORTANT: You cannot complete Stripe onboarding. Share this URL with the user so they can complete it in their browser: ${url}`,
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return errorResult(err);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=stripe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/tools/stripe.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,+BAA+B;AAE/B,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAqB;IAErB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,MAAM,EACN,4BAA4B,CAC7B,CAAC;QAEF,MAAM,GAAG,GAAI,IAAwB,CAAC,GAAG,CAAC;QAE1C,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBACrD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,4HAA4H,GAAG,EAAE;iBACxI;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown by ListBeeClient on non-2xx responses.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ListBeeApiError extends Error {
|
|
6
|
+
readonly status: number;
|
|
7
|
+
readonly body: unknown;
|
|
8
|
+
constructor(status: number, body: unknown);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Format a successful result as JSON text content.
|
|
12
|
+
*/
|
|
13
|
+
export declare function jsonResult(data: unknown): CallToolResult;
|
|
14
|
+
/**
|
|
15
|
+
* Format an error as an isError result so the LLM can reason about it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function errorResult(err: unknown): CallToolResult;
|
|
18
|
+
/**
|
|
19
|
+
* Wraps an async function so errors never propagate — they become { isError: true } results.
|
|
20
|
+
*/
|
|
21
|
+
export declare function safeTool<T>(fn: () => Promise<T>): Promise<CallToolResult>;
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,OAAO;gBADb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO;CAShC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAIxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAyBxD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAO/E"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format a successful result as JSON text content.
|
|
19
|
+
*/
|
|
20
|
+
export function jsonResult(data) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format an error as an isError result so the LLM can reason about it.
|
|
27
|
+
*/
|
|
28
|
+
export function errorResult(err) {
|
|
29
|
+
if (err instanceof ListBeeApiError) {
|
|
30
|
+
return {
|
|
31
|
+
isError: true,
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: "text",
|
|
35
|
+
text: JSON.stringify({
|
|
36
|
+
status: err.status,
|
|
37
|
+
error: err.body,
|
|
38
|
+
}, null, 2),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44
|
+
return {
|
|
45
|
+
isError: true,
|
|
46
|
+
content: [{ type: "text", text: message }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wraps an async function so errors never propagate — they become { isError: true } results.
|
|
51
|
+
*/
|
|
52
|
+
export async function safeTool(fn) {
|
|
53
|
+
try {
|
|
54
|
+
const result = await fn();
|
|
55
|
+
return jsonResult(result);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
return errorResult(err);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +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"}
|
package/mcp-tools.yaml
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
|
|
3
|
+
# Priority scale:
|
|
4
|
+
# 10 = golden-path / core workflow
|
|
5
|
+
# 7-9 = common operations
|
|
6
|
+
# 4-6 = situational
|
|
7
|
+
# 1-3 = rare / cleanup
|
|
8
|
+
|
|
9
|
+
tools:
|
|
10
|
+
# --- Listings ---
|
|
11
|
+
- type: operation
|
|
12
|
+
operation_id: create_listing
|
|
13
|
+
name: create_listing
|
|
14
|
+
category: listings
|
|
15
|
+
priority: 10
|
|
16
|
+
status: active
|
|
17
|
+
when_to_use: "Use when the user wants to sell something new."
|
|
18
|
+
description: >
|
|
19
|
+
Create a new listing for sale. Returns a checkout URL and readiness status.
|
|
20
|
+
hints:
|
|
21
|
+
- "Always check readiness.sellable in the response"
|
|
22
|
+
- "readiness.next tells you the highest-priority action to take"
|
|
23
|
+
input_example:
|
|
24
|
+
name: "50 Cold Outreach Templates"
|
|
25
|
+
price: 1900
|
|
26
|
+
|
|
27
|
+
- type: operation
|
|
28
|
+
operation_id: get_listing
|
|
29
|
+
name: get_listing
|
|
30
|
+
category: listings
|
|
31
|
+
priority: 9
|
|
32
|
+
status: active
|
|
33
|
+
when_to_use: "Use after any mutation (create, update, set_deliverables) to inspect readiness and determine what to do next."
|
|
34
|
+
description: >
|
|
35
|
+
Get a listing's full state including readiness. This is the readiness
|
|
36
|
+
inspection tool — call it after every change to check what's needed.
|
|
37
|
+
hints:
|
|
38
|
+
- "This is how you check readiness — call it after every create/update"
|
|
39
|
+
- "readiness.sellable tells you if the listing is live"
|
|
40
|
+
- "readiness.actions lists what's missing, with kind (api/human) and resolve details"
|
|
41
|
+
- "readiness.next points to the highest-priority action"
|
|
42
|
+
|
|
43
|
+
- type: operation
|
|
44
|
+
operation_id: update_listing
|
|
45
|
+
name: update_listing
|
|
46
|
+
category: listings
|
|
47
|
+
priority: 9
|
|
48
|
+
status: active
|
|
49
|
+
when_to_use: "Use when changing title, price, or other listing details."
|
|
50
|
+
input_example:
|
|
51
|
+
name: "100 Cold Outreach Templates (Updated)"
|
|
52
|
+
price: 2900
|
|
53
|
+
|
|
54
|
+
- type: operation
|
|
55
|
+
operation_id: list_listings
|
|
56
|
+
name: list_listings
|
|
57
|
+
category: listings
|
|
58
|
+
priority: 7
|
|
59
|
+
status: active
|
|
60
|
+
when_to_use: "Use to see all listings for the current account."
|
|
61
|
+
|
|
62
|
+
- type: operation
|
|
63
|
+
operation_id: publish_listing
|
|
64
|
+
name: publish_listing
|
|
65
|
+
category: listings
|
|
66
|
+
priority: 10
|
|
67
|
+
status: active
|
|
68
|
+
when_to_use: "Use when the user wants the listing to go live and readiness indicates it can be published."
|
|
69
|
+
description: >
|
|
70
|
+
Publish a listing so buyers can access the product page.
|
|
71
|
+
Only works when readiness.publishable is true.
|
|
72
|
+
hints:
|
|
73
|
+
- "Check readiness first — this fails if listing is not publishable"
|
|
74
|
+
|
|
75
|
+
- type: operation
|
|
76
|
+
operation_id: set_deliverables
|
|
77
|
+
name: set_deliverables
|
|
78
|
+
category: listings
|
|
79
|
+
priority: 9
|
|
80
|
+
status: active
|
|
81
|
+
when_to_use: "Use after creating a listing to attach digital content for automatic delivery."
|
|
82
|
+
description: >
|
|
83
|
+
Set digital deliverables (files, URLs, or text) on a listing.
|
|
84
|
+
Required for managed fulfillment mode.
|
|
85
|
+
input_example:
|
|
86
|
+
deliverables:
|
|
87
|
+
- type: "url"
|
|
88
|
+
value: "https://example.com/templates.zip"
|
|
89
|
+
label: "Download link"
|
|
90
|
+
|
|
91
|
+
- type: operation
|
|
92
|
+
operation_id: remove_deliverables
|
|
93
|
+
name: remove_deliverables
|
|
94
|
+
category: listings
|
|
95
|
+
priority: 3
|
|
96
|
+
status: active
|
|
97
|
+
when_to_use: "Use when switching a listing from managed to external fulfillment."
|
|
98
|
+
|
|
99
|
+
- type: operation
|
|
100
|
+
operation_id: delete_listing
|
|
101
|
+
name: delete_listing
|
|
102
|
+
category: listings
|
|
103
|
+
priority: 2
|
|
104
|
+
status: active
|
|
105
|
+
when_to_use: "Use when the user wants to permanently remove a listing."
|
|
106
|
+
|
|
107
|
+
# --- Files ---
|
|
108
|
+
- type: operation
|
|
109
|
+
operation_id: upload_file
|
|
110
|
+
name: upload_file
|
|
111
|
+
category: files
|
|
112
|
+
priority: 8
|
|
113
|
+
status: active
|
|
114
|
+
when_to_use: "Use when the user has a file to sell. Upload first, then use the returned token in set_deliverables."
|
|
115
|
+
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.
|
|
117
|
+
hints:
|
|
118
|
+
- "Returns a file token — pass it to set_deliverables to attach the file to a listing"
|
|
119
|
+
|
|
120
|
+
# --- Orders ---
|
|
121
|
+
- type: operation
|
|
122
|
+
operation_id: list_orders
|
|
123
|
+
name: list_orders
|
|
124
|
+
category: orders
|
|
125
|
+
priority: 7
|
|
126
|
+
status: active
|
|
127
|
+
when_to_use: "Use when the user wants to see their sales or check order status."
|
|
128
|
+
|
|
129
|
+
- type: operation
|
|
130
|
+
operation_id: get_order
|
|
131
|
+
name: get_order
|
|
132
|
+
category: orders
|
|
133
|
+
priority: 6
|
|
134
|
+
status: active
|
|
135
|
+
when_to_use: "Use to get full details of a specific order including buyer info and payment."
|
|
136
|
+
|
|
137
|
+
- type: operation
|
|
138
|
+
operation_id: deliver_order
|
|
139
|
+
name: deliver_order
|
|
140
|
+
category: orders
|
|
141
|
+
priority: 8
|
|
142
|
+
status: active
|
|
143
|
+
when_to_use: "Use only for external fulfillment orders when content must be sent after purchase by your app or workflow."
|
|
144
|
+
description: >
|
|
145
|
+
Push digital content to a buyer for an external fulfillment order.
|
|
146
|
+
Not needed for managed delivery — ListBee handles that automatically.
|
|
147
|
+
|
|
148
|
+
# --- Stripe ---
|
|
149
|
+
- type: operation
|
|
150
|
+
operation_id: start_stripe_connect
|
|
151
|
+
name: start_stripe_connect
|
|
152
|
+
category: stripe
|
|
153
|
+
priority: 10
|
|
154
|
+
status: active
|
|
155
|
+
requires_human: true
|
|
156
|
+
when_to_use: "Use when readiness says Stripe is not connected. Returns a URL the human must visit."
|
|
157
|
+
description: >
|
|
158
|
+
Start Stripe Connect onboarding. Returns a URL for the human to complete
|
|
159
|
+
in a browser. Required before selling through Stripe.
|
|
160
|
+
hints:
|
|
161
|
+
- "You cannot complete this — the human must open the URL"
|
|
162
|
+
- "After the human completes onboarding, check readiness again"
|
|
163
|
+
|
|
164
|
+
# --- Future composite tools (v2+) ---
|
|
165
|
+
# - type: composite
|
|
166
|
+
# name: create_and_publish
|
|
167
|
+
# category: workflows
|
|
168
|
+
# priority: 10
|
|
169
|
+
# steps: [create_listing, set_deliverables, publish_listing]
|
|
170
|
+
# when_to_use: "Use for one-shot listing creation when all details are ready."
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "listbee-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for ListBee — commerce API for AI agents",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"listbee-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"mcp-tools.yaml"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"lint": "tsc --noEmit",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
25
|
+
"yaml": "2.8.3",
|
|
26
|
+
"zod": "3.25.76"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "22.19.17",
|
|
30
|
+
"typescript": "5.9.3"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/listbee-dev/listbee-mcp.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://listbee.so",
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mcp",
|
|
39
|
+
"listbee",
|
|
40
|
+
"commerce",
|
|
41
|
+
"ai-agents",
|
|
42
|
+
"model-context-protocol"
|
|
43
|
+
]
|
|
44
|
+
}
|