@stithy/pod 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/dist/server.js ADDED
@@ -0,0 +1,353 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { verifyLicense } from "@mcp_marketplace/license";
5
+ import { z } from "zod";
6
+ import { homedir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { openDb, PROVIDER_IDS } from "./db.js";
9
+ import { resolveMasterKey, mask } from "./crypto.js";
10
+ import { ProviderRegistry } from "./providers/registry.js";
11
+ const SLUG = "stithy-pod";
12
+ const SKIP_LICENSE = process.env.STITHY_SKIP_LICENSE === "1";
13
+ if (!SKIP_LICENSE) {
14
+ const result = await verifyLicense({ slug: SLUG });
15
+ if (!result.valid) {
16
+ console.error(`Stithy POD: license check failed (${result.reason ?? "unknown"}).\n` +
17
+ `Set MCP_LICENSE_KEY in your environment.\n` +
18
+ `Get a key: https://mcp-marketplace.io/${SLUG}`);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ const root = process.env.STITHY_POD_DIR ?? join(homedir(), ".stithy");
23
+ const dbPath = process.env.STITHY_POD_DB ?? join(root, "pod.db");
24
+ const keyPath = join(root, ".pod_master");
25
+ const masterKey = resolveMasterKey(keyPath);
26
+ const db = openDb(dbPath);
27
+ const registry = new ProviderRegistry(db, masterKey);
28
+ const server = new McpServer({ name: "stithy-pod", version: "0.1.0" }, {
29
+ instructions: "Print-on-demand multi-platform manager. Use configure_provider once per platform (Printify/Printful/Gelato) to encrypt and store API keys, then list_products / list_orders / update_product_pricing / pause_listing across all configured platforms in a single prompt. v0.1 ships full Printify support; Printful and Gelato are read-only.",
30
+ });
31
+ const providerEnum = z.enum(PROVIDER_IDS);
32
+ function err(e) {
33
+ return e instanceof Error ? e.message : String(e);
34
+ }
35
+ function ok(text) {
36
+ return { content: [{ type: "text", text }] };
37
+ }
38
+ function fail(text) {
39
+ return { content: [{ type: "text", text }], isError: true };
40
+ }
41
+ server.registerTool("configure_provider", {
42
+ title: "Configure POD Provider",
43
+ description: "Encrypt and store an API key for a POD provider. shop_id is required for printify and gelato (store id). API keys are AES-256-GCM encrypted at rest with a per-machine master key. Re-running this tool overwrites the existing credential.",
44
+ inputSchema: {
45
+ provider: providerEnum,
46
+ api_key: z.string().min(10),
47
+ shop_id: z.string().optional(),
48
+ },
49
+ }, async ({ provider, api_key, shop_id }) => {
50
+ try {
51
+ const cfg = registry.configure({ id: provider, api_key, shop_id });
52
+ const probe = await registry.load(cfg.id).ping();
53
+ const probeText = probe.ok ? "credentials accepted" : `WARNING: ping failed — ${probe.reason}`;
54
+ return ok(`Configured ${cfg.id} (shop_id: ${cfg.shop_id ?? "n/a"}, ${probeText})`);
55
+ }
56
+ catch (e) {
57
+ return fail(err(e));
58
+ }
59
+ });
60
+ server.registerTool("list_providers", {
61
+ title: "List Configured Providers",
62
+ description: "Status of each provider — enabled, shop_id, capabilities. API keys are masked.",
63
+ inputSchema: {},
64
+ }, async () => {
65
+ try {
66
+ const cfgs = registry.list();
67
+ if (cfgs.length === 0)
68
+ return ok("No providers configured. Run configure_provider first.");
69
+ const lines = cfgs.map((c) => {
70
+ let caps = "(unknown)";
71
+ try {
72
+ const p = registry.load(c.id);
73
+ const cs = Object.entries(p.capabilities)
74
+ .filter(([, v]) => v)
75
+ .map(([k]) => k)
76
+ .join(", ");
77
+ caps = cs || "(none)";
78
+ }
79
+ catch {
80
+ // load failed
81
+ }
82
+ return `- ${c.id} | ${c.enabled ? "enabled" : "disabled"} | shop: ${c.shop_id ?? "n/a"} | caps: ${caps}`;
83
+ });
84
+ return ok(lines.join("\n"));
85
+ }
86
+ catch (e) {
87
+ return fail(err(e));
88
+ }
89
+ });
90
+ server.registerTool("remove_provider", {
91
+ title: "Remove Provider",
92
+ description: "Delete a provider's encrypted credentials and configuration.",
93
+ inputSchema: { provider: providerEnum },
94
+ }, async ({ provider }) => {
95
+ try {
96
+ const okRm = registry.remove(provider);
97
+ return okRm ? ok(`Removed ${provider}.`) : fail("Not configured.");
98
+ }
99
+ catch (e) {
100
+ return fail(err(e));
101
+ }
102
+ });
103
+ server.registerTool("list_products", {
104
+ title: "List Products",
105
+ description: "List products across one provider, or all configured providers. Caches results to product_cache. Per-provider failures are reported but do not abort the call.",
106
+ inputSchema: {
107
+ provider: providerEnum.optional(),
108
+ limit_per_provider: z.number().int().min(1).max(100).optional(),
109
+ },
110
+ }, async ({ provider, limit_per_provider }) => {
111
+ try {
112
+ const targets = provider ? [registry.load(provider)] : registry.loadAll();
113
+ if (targets.length === 0)
114
+ return fail("No providers loaded.");
115
+ const lines = [];
116
+ const now = Date.now();
117
+ for (const p of targets) {
118
+ try {
119
+ const items = await p.listProducts({ limit: limit_per_provider ?? 50 });
120
+ const stmt = db.prepare(`INSERT OR REPLACE INTO product_cache (provider, external_id, title, price_cents, cost_cents, stock, status, raw, synced_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
121
+ for (const it of items) {
122
+ stmt.run(p.id, it.external_id, it.title, it.price_cents, it.cost_cents, it.stock, it.status, JSON.stringify(it), now);
123
+ }
124
+ lines.push(`# ${p.displayName} (${items.length})`);
125
+ for (const it of items) {
126
+ const price = it.price_cents !== null ? `$${(it.price_cents / 100).toFixed(2)}` : "?";
127
+ lines.push(`- ${it.external_id} | ${price} | ${it.title} | ${it.status ?? ""}`);
128
+ }
129
+ }
130
+ catch (e) {
131
+ lines.push(`# ${p.displayName} — ERROR: ${err(e)}`);
132
+ }
133
+ }
134
+ return ok(lines.join("\n"));
135
+ }
136
+ catch (e) {
137
+ return fail(err(e));
138
+ }
139
+ });
140
+ server.registerTool("update_product_pricing", {
141
+ title: "Update Product Pricing",
142
+ description: "Set the price (in cents) on a product for a single provider. Provider must support update_pricing (currently: printify).",
143
+ inputSchema: {
144
+ provider: providerEnum,
145
+ external_id: z.string(),
146
+ price_cents: z.number().int().min(1),
147
+ },
148
+ }, async ({ provider, external_id, price_cents }) => {
149
+ try {
150
+ const p = registry.load(provider);
151
+ if (!p.capabilities.update_pricing) {
152
+ return fail(`${p.displayName} does not support pricing updates in this version.`);
153
+ }
154
+ await p.updatePricing(external_id, price_cents);
155
+ return ok(`Updated ${provider}/${external_id} to $${(price_cents / 100).toFixed(2)}.`);
156
+ }
157
+ catch (e) {
158
+ return fail(err(e));
159
+ }
160
+ });
161
+ server.registerTool("pause_listing", {
162
+ title: "Pause Listing",
163
+ description: "Unpublish a product on a provider. Currently supported on: printify.",
164
+ inputSchema: {
165
+ provider: providerEnum,
166
+ external_id: z.string(),
167
+ },
168
+ }, async ({ provider, external_id }) => {
169
+ try {
170
+ const p = registry.load(provider);
171
+ if (!p.capabilities.pause_listing) {
172
+ return fail(`${p.displayName} does not support pause/unpause in this version.`);
173
+ }
174
+ await p.pauseListing(external_id);
175
+ return ok(`Paused ${provider}/${external_id}.`);
176
+ }
177
+ catch (e) {
178
+ return fail(err(e));
179
+ }
180
+ });
181
+ server.registerTool("unpause_listing", {
182
+ title: "Unpause Listing",
183
+ description: "Re-publish a paused product. Currently supported on: printify.",
184
+ inputSchema: {
185
+ provider: providerEnum,
186
+ external_id: z.string(),
187
+ },
188
+ }, async ({ provider, external_id }) => {
189
+ try {
190
+ const p = registry.load(provider);
191
+ if (!p.capabilities.pause_listing) {
192
+ return fail(`${p.displayName} does not support pause/unpause in this version.`);
193
+ }
194
+ await p.unpauseListing(external_id);
195
+ return ok(`Unpaused ${provider}/${external_id}.`);
196
+ }
197
+ catch (e) {
198
+ return fail(err(e));
199
+ }
200
+ });
201
+ server.registerTool("list_orders", {
202
+ title: "List Orders",
203
+ description: "Unified order view across one provider or all configured. Caches to order_cache.",
204
+ inputSchema: {
205
+ provider: providerEnum.optional(),
206
+ limit_per_provider: z.number().int().min(1).max(100).optional(),
207
+ },
208
+ }, async ({ provider, limit_per_provider }) => {
209
+ try {
210
+ const targets = provider ? [registry.load(provider)] : registry.loadAll();
211
+ if (targets.length === 0)
212
+ return fail("No providers loaded.");
213
+ const lines = [];
214
+ const now = Date.now();
215
+ for (const p of targets) {
216
+ try {
217
+ const items = await p.listOrders({ limit: limit_per_provider ?? 50 });
218
+ const stmt = db.prepare(`INSERT OR REPLACE INTO order_cache (provider, external_id, status, total_cents, currency, placed_at, raw, synced_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
219
+ for (const o of items) {
220
+ stmt.run(p.id, o.external_id, o.status, o.total_cents, o.currency, o.placed_at, JSON.stringify(o), now);
221
+ }
222
+ lines.push(`# ${p.displayName} (${items.length})`);
223
+ for (const o of items) {
224
+ const total = o.total_cents !== null
225
+ ? `$${(o.total_cents / 100).toFixed(2)} ${o.currency ?? ""}`
226
+ : "?";
227
+ lines.push(`- ${o.external_id} | ${o.status ?? "?"} | ${total}` +
228
+ (o.placed_at ? ` | ${new Date(o.placed_at).toISOString()}` : ""));
229
+ }
230
+ }
231
+ catch (e) {
232
+ lines.push(`# ${p.displayName} — ERROR: ${err(e)}`);
233
+ }
234
+ }
235
+ return ok(lines.join("\n"));
236
+ }
237
+ catch (e) {
238
+ return fail(err(e));
239
+ }
240
+ });
241
+ server.registerTool("calculate_margins", {
242
+ title: "Calculate Margins",
243
+ description: "Compute margin per cached product (price - cost) / price. Run list_products first to populate the cache.",
244
+ inputSchema: { provider: providerEnum.optional() },
245
+ }, async ({ provider }) => {
246
+ try {
247
+ const rows = provider
248
+ ? db
249
+ .prepare(`SELECT provider, external_id, title, price_cents, cost_cents FROM product_cache WHERE provider = ? AND price_cents IS NOT NULL AND cost_cents IS NOT NULL`)
250
+ .all(provider)
251
+ : db
252
+ .prepare(`SELECT provider, external_id, title, price_cents, cost_cents FROM product_cache WHERE price_cents IS NOT NULL AND cost_cents IS NOT NULL`)
253
+ .all();
254
+ if (rows.length === 0)
255
+ return ok("No products with both price and cost cached.");
256
+ const items = rows
257
+ .map((r) => {
258
+ const price = r.price_cents;
259
+ const cost = r.cost_cents;
260
+ const margin = price === 0 ? 0 : (price - cost) / price;
261
+ return { ...r, margin };
262
+ })
263
+ .sort((a, b) => a.margin - b.margin);
264
+ const lines = items.map((i) => `- ${i.provider}/${i.external_id} | $${(i.price_cents / 100).toFixed(2)} | cost $${(i.cost_cents / 100).toFixed(2)} | margin ${(i.margin * 100).toFixed(1)}% | ${i.title}`);
265
+ return ok(lines.join("\n"));
266
+ }
267
+ catch (e) {
268
+ return fail(err(e));
269
+ }
270
+ });
271
+ server.registerTool("low_stock_alert", {
272
+ title: "Low Stock Alert",
273
+ description: "Cached products with stock at or below threshold (default 5). Currently meaningful for Printify only.",
274
+ inputSchema: { threshold: z.number().int().min(0).optional() },
275
+ }, async ({ threshold }) => {
276
+ try {
277
+ const t = threshold ?? 5;
278
+ const rows = db
279
+ .prepare(`SELECT provider, external_id, title, stock FROM product_cache WHERE stock IS NOT NULL AND stock <= ? ORDER BY stock ASC`)
280
+ .all(t);
281
+ if (rows.length === 0)
282
+ return ok(`No products at or below ${t} units.`);
283
+ return ok(rows.map((r) => `- ${r.provider}/${r.external_id} | stock ${r.stock} | ${r.title}`).join("\n"));
284
+ }
285
+ catch (e) {
286
+ return fail(err(e));
287
+ }
288
+ });
289
+ server.registerTool("revenue_summary", {
290
+ title: "Revenue Summary",
291
+ description: "Sum cached order revenue grouped by provider, currency, and lookback window in days.",
292
+ inputSchema: { lookback_days: z.number().int().min(1).max(365).optional() },
293
+ }, async ({ lookback_days }) => {
294
+ try {
295
+ const days = lookback_days ?? 30;
296
+ const since = Date.now() - days * 86400_000;
297
+ const rows = db
298
+ .prepare(`SELECT provider, currency, SUM(total_cents) as total, COUNT(*) as n FROM order_cache WHERE placed_at IS NOT NULL AND placed_at >= ? GROUP BY provider, currency`)
299
+ .all(since);
300
+ if (rows.length === 0)
301
+ return ok(`No cached orders in last ${days} days. Run list_orders first.`);
302
+ const lines = rows.map((r) => {
303
+ const total = r.total !== null ? `$${(r.total / 100).toFixed(2)} ${r.currency ?? ""}` : "?";
304
+ return `- ${r.provider} | ${r.n} order${r.n === 1 ? "" : "s"} | ${total}`;
305
+ });
306
+ return ok(`Last ${days} days:\n${lines.join("\n")}`);
307
+ }
308
+ catch (e) {
309
+ return fail(err(e));
310
+ }
311
+ });
312
+ server.registerTool("platform_health", {
313
+ title: "Platform Health",
314
+ description: "Ping each configured provider and report whether the API is reachable + credentials accepted.",
315
+ inputSchema: {},
316
+ }, async () => {
317
+ try {
318
+ const cfgs = registry.list();
319
+ if (cfgs.length === 0)
320
+ return ok("No providers configured.");
321
+ const lines = [];
322
+ for (const c of cfgs) {
323
+ try {
324
+ const p = registry.load(c.id);
325
+ const r = await p.ping();
326
+ lines.push(`- ${p.displayName}: ${r.ok ? "ok" : `FAIL — ${r.reason}`}`);
327
+ }
328
+ catch (e) {
329
+ lines.push(`- ${c.id}: load failed — ${err(e)}`);
330
+ }
331
+ }
332
+ return ok(lines.join("\n"));
333
+ }
334
+ catch (e) {
335
+ return fail(err(e));
336
+ }
337
+ });
338
+ // Suppress unused import warning if mask is reserved for future tools (e.g. show partial keys).
339
+ void mask;
340
+ const shutdown = (sig) => {
341
+ console.error(`stithy-pod: ${sig}, closing db`);
342
+ try {
343
+ db.close();
344
+ }
345
+ catch { }
346
+ process.exit(0);
347
+ };
348
+ process.on("SIGINT", () => shutdown("SIGINT"));
349
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
350
+ const transport = new StdioServerTransport();
351
+ await server.connect(transport);
352
+ console.error(`stithy-pod v0.1.0 ready (db: ${dbPath})`);
353
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@stithy/pod",
3
+ "version": "0.1.0",
4
+ "description": "Print-on-demand multi-platform MCP server — manage Printify, Printful, and Gelato from one prompt",
5
+ "type": "module",
6
+ "bin": {
7
+ "stithy-pod": "dist/cli.js"
8
+ },
9
+ "main": "./dist/server.js",
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/resolceo-ai/stithy-mcp.git",
18
+ "directory": "servers/pod"
19
+ },
20
+ "homepage": "https://github.com/resolceo-ai/stithy-mcp/tree/main/servers/pod",
21
+ "bugs": "https://github.com/resolceo-ai/stithy-mcp/issues",
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsx src/server.ts",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "model-context-protocol",
32
+ "printify",
33
+ "printful",
34
+ "gelato",
35
+ "print-on-demand"
36
+ ],
37
+ "author": "Stithy",
38
+ "license": "BUSL-1.1",
39
+ "engines": {
40
+ "node": ">=20"
41
+ },
42
+ "dependencies": {
43
+ "@mcp_marketplace/license": "^1.1.0",
44
+ "@modelcontextprotocol/sdk": "^1.0.4",
45
+ "better-sqlite3": "^11.5.0",
46
+ "zod": "^3.23.8"
47
+ },
48
+ "devDependencies": {
49
+ "@types/better-sqlite3": "^7.6.11",
50
+ "@types/node": "^22.10.0",
51
+ "tsx": "^4.19.2",
52
+ "typescript": "^5.7.2",
53
+ "vitest": "^2.1.8"
54
+ }
55
+ }