listbee-mcp 0.1.0 → 0.2.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/README.md +24 -0
- package/dist/generated/meta.d.ts +8 -0
- package/dist/generated/meta.d.ts.map +1 -0
- package/dist/generated/meta.js +93 -0
- package/dist/generated/meta.js.map +1 -0
- package/dist/generated/schemas.d.ts +381 -0
- package/dist/generated/schemas.d.ts.map +1 -0
- package/dist/generated/schemas.js +25 -0
- package/dist/generated/schemas.js.map +1 -0
- package/dist/index.js +62 -65
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +49 -46
- package/dist/server.js.map +1 -1
- package/dist/tools/orders.d.ts +1 -0
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +13 -0
- package/dist/tools/orders.js.map +1 -1
- package/dist/transports/http.d.ts +7 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +96 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +7 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +18 -0
- package/dist/transports/stdio.js.map +1 -0
- package/mcp-tools.yaml +18 -0
- package/package.json +9 -4
- package/dist/schemas.d.ts +0 -87
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -137
- package/dist/schemas.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,98 +1,95 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { createServer } from "./server.js";
|
|
2
|
+
import { runStdio } from "./transports/stdio.js";
|
|
4
3
|
function parseArgs(argv) {
|
|
5
|
-
const result = { help: false };
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const result = { transport: "stdio", help: false };
|
|
5
|
+
for (let i = 0; i < argv.length; i++) {
|
|
6
|
+
const arg = argv[i];
|
|
7
|
+
if (arg === "--transport" && argv[i + 1]) {
|
|
8
|
+
const val = argv[++i];
|
|
9
|
+
if (val !== "stdio" && val !== "http") {
|
|
10
|
+
console.error(`Invalid transport: "${val}". Must be "stdio" or "http".`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
result.transport = val;
|
|
14
|
+
}
|
|
15
|
+
else if (arg === "--api-key" && argv[i + 1]) {
|
|
16
|
+
result.apiKey = argv[++i];
|
|
11
17
|
}
|
|
12
|
-
else if (arg === "--
|
|
13
|
-
result.
|
|
18
|
+
else if (arg === "--base-url" && argv[i + 1]) {
|
|
19
|
+
result.baseUrl = argv[++i];
|
|
14
20
|
}
|
|
15
|
-
else if (arg === "--
|
|
16
|
-
result.
|
|
21
|
+
else if (arg === "--port" && argv[i + 1]) {
|
|
22
|
+
result.port = parseInt(argv[++i], 10);
|
|
17
23
|
}
|
|
18
|
-
else if (arg === "--tools" && i + 1
|
|
19
|
-
result.tools =
|
|
24
|
+
else if (arg === "--tools" && argv[i + 1]) {
|
|
25
|
+
result.tools = argv[++i];
|
|
26
|
+
}
|
|
27
|
+
else if (arg === "--help" || arg === "-h") {
|
|
28
|
+
result.help = true;
|
|
20
29
|
}
|
|
21
30
|
}
|
|
22
31
|
return result;
|
|
23
32
|
}
|
|
24
|
-
function resolveConfig(parsed) {
|
|
25
|
-
const
|
|
33
|
+
function resolveConfig(parsed, env) {
|
|
34
|
+
const baseUrl = parsed.baseUrl || env.LISTBEE_BASE_URL || "https://api.listbee.so";
|
|
35
|
+
const toolFilter = parsed.tools
|
|
36
|
+
? new Set(parsed.tools.split(",").map((t) => t.trim()))
|
|
37
|
+
: undefined;
|
|
38
|
+
if (parsed.transport === "http") {
|
|
39
|
+
const port = parsed.port || parseInt(env.PORT || "8080", 10);
|
|
40
|
+
return { transport: "http", baseUrl, port, toolFilter };
|
|
41
|
+
}
|
|
42
|
+
const apiKey = parsed.apiKey || env.LISTBEE_API_KEY;
|
|
26
43
|
if (!apiKey) {
|
|
27
|
-
return
|
|
28
|
-
ok: false,
|
|
29
|
-
error: "API key required. Set LISTBEE_API_KEY environment variable or pass --api-key <key>.",
|
|
30
|
-
};
|
|
44
|
+
return "API key required. Use --api-key or set LISTBEE_API_KEY.";
|
|
31
45
|
}
|
|
32
|
-
|
|
33
|
-
const toolFilter = parsed.tools ? new Set(parsed.tools) : undefined;
|
|
34
|
-
return { ok: true, config: { apiKey, baseUrl, toolFilter } };
|
|
46
|
+
return { transport: "stdio", apiKey, baseUrl, toolFilter };
|
|
35
47
|
}
|
|
36
|
-
// --- Help text ---
|
|
37
48
|
const HELP_TEXT = `
|
|
38
49
|
listbee-mcp — MCP server for ListBee commerce API
|
|
39
50
|
|
|
40
51
|
Usage:
|
|
41
|
-
listbee-mcp [options]
|
|
52
|
+
npx listbee-mcp [options]
|
|
42
53
|
|
|
43
54
|
Options:
|
|
44
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
|
|
55
|
+
--transport <stdio|http> Transport mode (default: stdio)
|
|
56
|
+
--api-key <key> API key (required for stdio, or set LISTBEE_API_KEY)
|
|
57
|
+
--base-url <url> API base URL (default: https://api.listbee.so)
|
|
58
|
+
--port <number> HTTP port (default: 8080, http mode only)
|
|
59
|
+
--tools <list> Comma-separated tool names to expose
|
|
60
|
+
-h, --help Show this help
|
|
48
61
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
listbee-mcp --api-key lb_xxx --tools create_listing,get_listing,publish_listing
|
|
62
|
+
Transports:
|
|
63
|
+
stdio Local mode for Claude Desktop, Cursor, Cline (default)
|
|
64
|
+
http Streamable HTTP for ChatGPT Apps, Claude API Connector, remote agents
|
|
53
65
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"command": "npx",
|
|
59
|
-
"args": ["-y", "listbee-mcp"],
|
|
60
|
-
"env": { "LISTBEE_API_KEY": "lb_xxx" }
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
66
|
+
Examples:
|
|
67
|
+
npx listbee-mcp --api-key lb_xxx
|
|
68
|
+
npx listbee-mcp --transport http --port 3000
|
|
69
|
+
LISTBEE_API_KEY=lb_xxx npx listbee-mcp
|
|
64
70
|
`.trim();
|
|
65
|
-
// --- Main ---
|
|
66
71
|
async function main() {
|
|
67
|
-
|
|
68
|
-
process.on("SIGINT", () => process.exit(0));
|
|
69
|
-
process.on("SIGTERM", () => process.exit(0));
|
|
70
|
-
const parsed = parseArgs(process.argv);
|
|
72
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
71
73
|
if (parsed.help) {
|
|
72
|
-
console.
|
|
74
|
+
console.log(HELP_TEXT);
|
|
73
75
|
process.exit(0);
|
|
74
76
|
}
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
77
|
-
console.error(
|
|
77
|
+
const config = resolveConfig(parsed, process.env);
|
|
78
|
+
if (typeof config === "string") {
|
|
79
|
+
console.error(config);
|
|
80
|
+
console.error("Run with --help for usage.");
|
|
78
81
|
process.exit(1);
|
|
79
82
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
if (config.transport === "http") {
|
|
84
|
+
const { runHttp } = await import("./transports/http.js");
|
|
85
|
+
await runHttp(config);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
await runStdio(config);
|
|
84
89
|
}
|
|
85
|
-
const server = createServer({
|
|
86
|
-
apiKey: config.apiKey,
|
|
87
|
-
baseUrl: config.baseUrl,
|
|
88
|
-
toolFilter: config.toolFilter,
|
|
89
|
-
});
|
|
90
|
-
const transport = new StdioServerTransport();
|
|
91
|
-
await server.connect(transport);
|
|
92
|
-
console.error("ListBee MCP server running on stdio.");
|
|
93
90
|
}
|
|
94
91
|
main().catch((err) => {
|
|
95
|
-
console.error("Fatal
|
|
92
|
+
console.error("Fatal:", err);
|
|
96
93
|
process.exit(1);
|
|
97
94
|
});
|
|
98
95
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6CpE,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AA8FD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAqEpE"}
|
package/dist/server.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
2
3
|
import { ListBeeClient } from "./client.js";
|
|
3
4
|
import { loadManifest, indexManifest } from "./manifest.js";
|
|
4
5
|
import { autoTitle, buildDescription } from "./tools/shared.js";
|
|
5
|
-
import
|
|
6
|
+
import { schemas } from "./generated/schemas.js";
|
|
6
7
|
import { handleCreateListing, handleGetListing, handleUpdateListing, handleListListings, handlePublishListing, handleSetDeliverables, handleRemoveDeliverables, handleDeleteListing, } from "./tools/listings.js";
|
|
7
|
-
import { handleListOrders, handleGetOrder, handleDeliverOrder, } from "./tools/orders.js";
|
|
8
|
+
import { handleListOrders, handleGetOrder, handleDeliverOrder, handleShipOrder, } from "./tools/orders.js";
|
|
8
9
|
import { handleUploadFile } from "./tools/files.js";
|
|
9
10
|
import { handleStartStripeConnect } from "./tools/stripe.js";
|
|
10
11
|
// Read version from package.json
|
|
@@ -32,7 +33,7 @@ function annotationsFor(name) {
|
|
|
32
33
|
openWorldHint: false,
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
|
-
if (name.startsWith("update_") || name === "set_deliverables") {
|
|
36
|
+
if (name.startsWith("update_") || name === "set_deliverables" || name === "ship_order") {
|
|
36
37
|
return {
|
|
37
38
|
readOnlyHint: false,
|
|
38
39
|
destructiveHint: false,
|
|
@@ -54,51 +55,44 @@ function annotationsFor(name) {
|
|
|
54
55
|
openWorldHint: false,
|
|
55
56
|
};
|
|
56
57
|
}
|
|
58
|
+
// Manual override for upload_file: the API uses multipart upload but the MCP tool
|
|
59
|
+
// takes a URL + filename and handles the fetch-and-upload server-side.
|
|
60
|
+
const uploadFileSchema = z.object({
|
|
61
|
+
url: z.string().url().describe("Public URL of a file to upload. The server fetches this URL — only provide URLs from the user or trusted sources."),
|
|
62
|
+
filename: z.string().optional().describe("Filename for the uploaded file. If omitted, derived from the URL."),
|
|
63
|
+
});
|
|
57
64
|
/**
|
|
58
|
-
* Schema map — links tool names to their Zod input
|
|
65
|
+
* Schema map — links tool names to their Zod input schemas (or null for no-input tools).
|
|
66
|
+
* Derived from generated schemas with manual overrides where needed.
|
|
59
67
|
*/
|
|
60
68
|
const schemaMap = {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
update_listing: schemas.updateListingSchema,
|
|
64
|
-
list_listings: schemas.listListingsSchema,
|
|
65
|
-
publish_listing: schemas.publishListingSchema,
|
|
66
|
-
set_deliverables: schemas.setDeliverablesSchema,
|
|
67
|
-
remove_deliverables: schemas.removeDeliverablesSchema,
|
|
68
|
-
delete_listing: schemas.deleteListingSchema,
|
|
69
|
-
upload_file: schemas.uploadFileSchema,
|
|
70
|
-
list_orders: schemas.listOrdersSchema,
|
|
71
|
-
get_order: schemas.getOrderSchema,
|
|
72
|
-
deliver_order: schemas.deliverOrderSchema,
|
|
73
|
-
start_stripe_connect: undefined, // no input
|
|
69
|
+
...schemas,
|
|
70
|
+
upload_file: uploadFileSchema,
|
|
74
71
|
};
|
|
75
72
|
/**
|
|
76
73
|
* Handler map — links tool names to their handler functions.
|
|
77
74
|
*/
|
|
75
|
+
const handlers = {
|
|
76
|
+
create_listing: handleCreateListing,
|
|
77
|
+
get_listing: handleGetListing,
|
|
78
|
+
update_listing: handleUpdateListing,
|
|
79
|
+
list_listings: handleListListings,
|
|
80
|
+
publish_listing: handlePublishListing,
|
|
81
|
+
set_deliverables: handleSetDeliverables,
|
|
82
|
+
remove_deliverables: handleRemoveDeliverables,
|
|
83
|
+
delete_listing: handleDeleteListing,
|
|
84
|
+
upload_file: handleUploadFile,
|
|
85
|
+
list_orders: handleListOrders,
|
|
86
|
+
get_order: handleGetOrder,
|
|
87
|
+
deliver_order: handleDeliverOrder,
|
|
88
|
+
ship_order: (c, a) => handleShipOrder(c, a),
|
|
89
|
+
start_stripe_connect: (c) => handleStartStripeConnect(c),
|
|
90
|
+
};
|
|
78
91
|
function getHandler(name, client) {
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
-
const handlers = {
|
|
81
|
-
create_listing: handleCreateListing,
|
|
82
|
-
get_listing: handleGetListing,
|
|
83
|
-
update_listing: handleUpdateListing,
|
|
84
|
-
list_listings: handleListListings,
|
|
85
|
-
publish_listing: handlePublishListing,
|
|
86
|
-
set_deliverables: handleSetDeliverables,
|
|
87
|
-
remove_deliverables: handleRemoveDeliverables,
|
|
88
|
-
delete_listing: handleDeleteListing,
|
|
89
|
-
upload_file: handleUploadFile,
|
|
90
|
-
list_orders: handleListOrders,
|
|
91
|
-
get_order: handleGetOrder,
|
|
92
|
-
deliver_order: handleDeliverOrder,
|
|
93
|
-
};
|
|
94
92
|
const handler = handlers[name];
|
|
95
93
|
if (handler) {
|
|
96
94
|
return (args) => handler(client, args);
|
|
97
95
|
}
|
|
98
|
-
// Special case: start_stripe_connect takes no args
|
|
99
|
-
if (name === "start_stripe_connect") {
|
|
100
|
-
return () => handleStartStripeConnect(client);
|
|
101
|
-
}
|
|
102
96
|
return undefined;
|
|
103
97
|
}
|
|
104
98
|
/**
|
|
@@ -131,18 +125,27 @@ export function createServer(options) {
|
|
|
131
125
|
console.error(`Warning: no handler for tool "${toolName}", skipping.`);
|
|
132
126
|
continue;
|
|
133
127
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
})
|
|
128
|
+
server.registerTool(toolName, {
|
|
129
|
+
description,
|
|
130
|
+
annotations,
|
|
131
|
+
...(schema ? { inputSchema: schema } : {}),
|
|
132
|
+
},
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
|
+
async (args) => {
|
|
135
|
+
return await handler((args ?? {}));
|
|
136
|
+
});
|
|
137
|
+
console.error(` Registered tool: ${title} (${toolName})`);
|
|
138
|
+
}
|
|
139
|
+
// Startup validation: every manifest tool must be fully wired
|
|
140
|
+
for (const tool of allTools) {
|
|
141
|
+
const name = tool.name;
|
|
142
|
+
if (!handlers[name]) {
|
|
143
|
+
throw new Error(`Startup validation failed: tool "${name}" has no handler registered`);
|
|
138
144
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return await handler({});
|
|
143
|
-
});
|
|
145
|
+
const ann = annotationsFor(name);
|
|
146
|
+
if (ann.readOnlyHint === undefined) {
|
|
147
|
+
throw new Error(`Startup validation failed: tool "${name}" is missing readOnlyHint annotation`);
|
|
144
148
|
}
|
|
145
|
-
console.error(` Registered tool: ${title} (${toolName})`);
|
|
146
149
|
}
|
|
147
150
|
return server;
|
|
148
151
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CACzC,CAAC;AAEzB,MAAM,mBAAmB,GAAG;;;;wGAI4E,CAAC;AAQzG;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;QACjE,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QACvF,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,kCAAkC;IAClC,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,uEAAuE;AACvE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAC5B,mHAAmH,CACpH;IACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,mEAAmE,CACpE;CACF,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,SAAS,GAAqC;IAClD,GAAG,OAAO;IACV,WAAW,EAAE,gBAAgB;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,QAAQ,GAGV;IACF,cAAc,EAAE,mBAAmB;IACnC,WAAW,EAAE,gBAAgB;IAC7B,cAAc,EAAE,mBAAmB;IACnC,aAAa,EAAE,kBAAkB;IACjC,eAAe,EAAE,oBAAoB;IACrC,gBAAgB,EAAE,qBAAqB;IACvC,mBAAmB,EAAE,wBAAwB;IAC7C,cAAc,EAAE,mBAAmB;IACnC,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,gBAAgB;IAC7B,SAAS,EAAE,cAAc;IACzB,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAQ;CAChE,CAAC;AAEF,SAAS,UAAU,CACjB,IAAY,EACZ,MAAqB;IAErB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAC7C;QACE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3B,YAAY,EAAE,mBAAmB;KAClC,CACF,CAAC;IAEF,qBAAqB;IACrB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,4BAA4B;QAC5B,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,wCAAwC,QAAQ,cAAc,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,cAAc,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QAED,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;YACE,WAAW;YACX,WAAW;YACX,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3C;QACD,8DAA8D;QAC9D,KAAK,EAAE,IAAS,EAAE,EAAE;YAClB,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC;QAChE,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,KAAK,QAAQ,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,8DAA8D;IAC9D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,6BAA6B,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,sCAAsC,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/tools/orders.d.ts
CHANGED
|
@@ -12,4 +12,5 @@ export declare function handleDeliverOrder(client: ListBeeClient, args: {
|
|
|
12
12
|
order_id: string;
|
|
13
13
|
deliverables: Deliverable[];
|
|
14
14
|
}): Promise<CallToolResult>;
|
|
15
|
+
export declare function handleShipOrder(client: ListBeeClient, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
15
16
|
//# sourceMappingURL=orders.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.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,gBAAgB,CACpC,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,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,EAAE,CAAA;CAAE,GACtD,OAAO,CAAC,cAAc,CAAC,CASzB"}
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.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,gBAAgB,CACpC,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,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,EAAE,CAAA;CAAE,GACtD,OAAO,CAAC,cAAc,CAAC,CASzB;AAID,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC,CAWzB"}
|
package/dist/tools/orders.js
CHANGED
|
@@ -25,4 +25,17 @@ export async function handleDeliverOrder(client, args) {
|
|
|
25
25
|
return data;
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
+
// --- ship_order ---
|
|
29
|
+
export async function handleShipOrder(client, args) {
|
|
30
|
+
return safeTool(async () => {
|
|
31
|
+
const { order_id, ...rest } = args;
|
|
32
|
+
const body = {};
|
|
33
|
+
for (const [key, value] of Object.entries(rest)) {
|
|
34
|
+
if (value !== undefined) {
|
|
35
|
+
body[key] = value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return await client.request("POST", `/v1/orders/${order_id}/ship`, body);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
28
41
|
//# sourceMappingURL=orders.js.map
|
package/dist/tools/orders.js.map
CHANGED
|
@@ -1 +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"}
|
|
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;AAED,qBAAqB;AAErB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,IAA6B;IAE7B,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AA8BD,wBAAsB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF/D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { createServer } from "../server.js";
|
|
6
|
+
const transports = new Map();
|
|
7
|
+
const sessions = new Map();
|
|
8
|
+
const SESSION_TTL_MS = 30 * 60 * 1000;
|
|
9
|
+
const SWEEP_INTERVAL_MS = 5 * 60 * 1000;
|
|
10
|
+
function startTtlSweep() {
|
|
11
|
+
setInterval(() => {
|
|
12
|
+
const cutoff = Date.now() - SESSION_TTL_MS;
|
|
13
|
+
for (const [id, meta] of sessions) {
|
|
14
|
+
if (meta.lastSeenAt < cutoff) {
|
|
15
|
+
const transport = transports.get(id);
|
|
16
|
+
if (transport) {
|
|
17
|
+
transport.close();
|
|
18
|
+
transports.delete(id);
|
|
19
|
+
}
|
|
20
|
+
sessions.delete(id);
|
|
21
|
+
console.error(`[http] Evicted idle session ${id}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}, SWEEP_INTERVAL_MS);
|
|
25
|
+
}
|
|
26
|
+
export async function runHttp(config) {
|
|
27
|
+
// Bind to 0.0.0.0 for container/remote deployments — DNS rebinding protection
|
|
28
|
+
// is not applied for non-localhost hosts, which is correct for remote MCP.
|
|
29
|
+
const app = createMcpExpressApp({ host: "0.0.0.0" });
|
|
30
|
+
// Auth middleware — reject unauthenticated requests before MCP sees them
|
|
31
|
+
app.use("/mcp", (req, res, next) => {
|
|
32
|
+
const auth = req.headers.authorization;
|
|
33
|
+
if (!auth?.startsWith("Bearer ")) {
|
|
34
|
+
res.status(401).json({ error: "Missing Authorization: Bearer header" });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
next();
|
|
38
|
+
});
|
|
39
|
+
// MCP endpoint — handles all HTTP methods (GET for SSE, POST for requests, DELETE for close)
|
|
40
|
+
app.all("/mcp", async (req, res) => {
|
|
41
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
42
|
+
// Route to existing session
|
|
43
|
+
if (sessionId && transports.has(sessionId)) {
|
|
44
|
+
const transport = transports.get(sessionId);
|
|
45
|
+
const meta = sessions.get(sessionId);
|
|
46
|
+
if (meta)
|
|
47
|
+
meta.lastSeenAt = Date.now();
|
|
48
|
+
await transport.handleRequest(req, res, req.body);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// New session — must be an initialize request
|
|
52
|
+
if (req.method === "POST" && isInitializeRequest(req.body)) {
|
|
53
|
+
const apiKey = req.headers.authorization.replace("Bearer ", "");
|
|
54
|
+
const transport = new StreamableHTTPServerTransport({
|
|
55
|
+
sessionIdGenerator: () => randomUUID(),
|
|
56
|
+
onsessioninitialized: (sid) => {
|
|
57
|
+
transports.set(sid, transport);
|
|
58
|
+
sessions.set(sid, {
|
|
59
|
+
createdAt: Date.now(),
|
|
60
|
+
lastSeenAt: Date.now(),
|
|
61
|
+
});
|
|
62
|
+
transport.onclose = () => {
|
|
63
|
+
transports.delete(sid);
|
|
64
|
+
sessions.delete(sid);
|
|
65
|
+
console.error(`[http] Session closed: ${sid}`);
|
|
66
|
+
};
|
|
67
|
+
console.error(`[http] New session: ${sid}`);
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const server = createServer({
|
|
71
|
+
apiKey,
|
|
72
|
+
baseUrl: config.baseUrl,
|
|
73
|
+
toolFilter: config.toolFilter,
|
|
74
|
+
});
|
|
75
|
+
await server.connect(transport);
|
|
76
|
+
await transport.handleRequest(req, res, req.body);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
res.status(400).json({
|
|
80
|
+
error: "Bad request — missing Mcp-Session-Id or not an initialize request",
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// Health checks
|
|
84
|
+
app.get("/health", (_req, res) => {
|
|
85
|
+
res.json({ status: "ok" });
|
|
86
|
+
});
|
|
87
|
+
app.get("/ready", (_req, res) => {
|
|
88
|
+
res.json({ status: "ready", sessions: sessions.size });
|
|
89
|
+
});
|
|
90
|
+
startTtlSweep();
|
|
91
|
+
app.listen(config.port, "0.0.0.0", () => {
|
|
92
|
+
console.error(`ListBee MCP server (HTTP) listening on port ${config.port}`);
|
|
93
|
+
console.error(`Endpoint: http://localhost:${config.port}/mcp`);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { createServer } from "../server.js";
|
|
3
|
+
export async function runStdio(config) {
|
|
4
|
+
const server = createServer({
|
|
5
|
+
apiKey: config.apiKey,
|
|
6
|
+
baseUrl: config.baseUrl,
|
|
7
|
+
toolFilter: config.toolFilter,
|
|
8
|
+
});
|
|
9
|
+
const transport = new StdioServerTransport();
|
|
10
|
+
await server.connect(transport);
|
|
11
|
+
const shutdown = async () => {
|
|
12
|
+
await server.close();
|
|
13
|
+
process.exit(0);
|
|
14
|
+
};
|
|
15
|
+
process.on("SIGINT", shutdown);
|
|
16
|
+
process.on("SIGTERM", shutdown);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAmB;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
package/mcp-tools.yaml
CHANGED
|
@@ -145,6 +145,24 @@ tools:
|
|
|
145
145
|
Push digital content to a buyer for an external fulfillment order.
|
|
146
146
|
Not needed for managed delivery — ListBee handles that automatically.
|
|
147
147
|
|
|
148
|
+
- type: operation
|
|
149
|
+
operation_id: ship_order
|
|
150
|
+
name: ship_order
|
|
151
|
+
category: orders
|
|
152
|
+
priority: 7
|
|
153
|
+
status: active
|
|
154
|
+
when_to_use: "Use when a physical order needs shipping info recorded. Only for external fulfillment orders with physical goods."
|
|
155
|
+
description: >
|
|
156
|
+
Record shipping info (carrier + tracking code) and transition order to FULFILLED.
|
|
157
|
+
Only valid for external fulfillment orders. Idempotent with same tracking code.
|
|
158
|
+
hints:
|
|
159
|
+
- "Only works on orders in PAID state for EXTERNAL fulfillment listings"
|
|
160
|
+
- "Fires order.fulfilled webhook with shipping details"
|
|
161
|
+
input_example:
|
|
162
|
+
order_id: "ord_9xM4kP7nR2qT5wY1"
|
|
163
|
+
carrier: "USPS"
|
|
164
|
+
tracking_code: "9400111899223"
|
|
165
|
+
|
|
148
166
|
# --- Stripe ---
|
|
149
167
|
- type: operation
|
|
150
168
|
operation_id: start_stripe_connect
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "listbee-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP server for ListBee — commerce API for AI agents",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -15,9 +15,11 @@
|
|
|
15
15
|
"node": ">=20"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
18
|
+
"generate": "tsx scripts/generate.ts",
|
|
19
|
+
"generate:check": "tsx scripts/generate.ts --check",
|
|
20
|
+
"build": "npm run generate && tsc && chmod +x dist/index.js",
|
|
21
|
+
"dev": "tsx src/index.ts",
|
|
22
|
+
"lint": "npm run generate:check && tsc --noEmit",
|
|
21
23
|
"prepublishOnly": "npm run build"
|
|
22
24
|
},
|
|
23
25
|
"dependencies": {
|
|
@@ -26,7 +28,10 @@
|
|
|
26
28
|
"zod": "3.25.76"
|
|
27
29
|
},
|
|
28
30
|
"devDependencies": {
|
|
31
|
+
"@types/express": "^5.0.6",
|
|
29
32
|
"@types/node": "22.19.17",
|
|
33
|
+
"json-schema-to-zod": "^2.8.1",
|
|
34
|
+
"tsx": "^4.21.0",
|
|
30
35
|
"typescript": "5.9.3"
|
|
31
36
|
},
|
|
32
37
|
"repository": {
|