lotux-mcp 0.8.1 → 0.10.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 (3) hide show
  1. package/README.md +2 -1
  2. package/index.mjs +27 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -64,7 +64,8 @@ Restart Claude, then try: *"list my LOTUX brands"*.
64
64
  | `iterate_concept` | Spawn a variation ({root}_Var{n}), the same as the app's Iterate button |
65
65
  | `list_kb_*` / `get_kb_doc` / `create_kb_doc` / `update_kb_doc` | Kennisbank pages |
66
66
  | `content_options` / `create_flywheel` / `update_flywheel` / `list_flywheels` / `get_flywheel` | Content flywheels (Marketing → Content, agency-only): one long-form video. Start with `content_options`; give flywheels a `key` so re-runs reuse them |
67
- | `push_assets` / `add_asset` / `get_asset` / `list_assets` / `update_asset` / `set_asset_status` / `add_comment` / `delete_asset` | Content assets, upserted on their `key`. Statuses: scripting → production → post_production → to_review → revisions → approved → live. Content you write lands in `to_review`; Claude can't set revisions, approve or mark live; deleting signed-off work needs `force`. Each asset carries `raw_footage_url` (raw files folder) and `final_asset_url` (the export — a change sends it to review) |
67
+ | `push_assets` / `add_asset` / `get_asset` / `list_assets` / `update_asset` / `set_asset_status` / `add_comment` / `delete_asset` | Content assets, upserted on their `key`. Statuses: scripting → production → post_production → to_review → revisions → approved → live. Content you write lands in `to_review`; Claude can't set revisions, approve or mark live; deleting signed-off work needs `force`. Each asset carries `raw_footage_url` (raw files folder) and `final_asset_url` (the export — a change sends it to review), plus its content ID (`code`) and `name` = `"<code> - <title>"`; pass `code` instead of `asset_id` anywhere |
68
+ | `get_setup_checks` / `set_setup_check` | A flywheel's setup checklist (Instagram auto-replies, setter replies, reel covers, YouTube, Klaviyo flow) — tick a step by `check_key` after doing it |
68
69
 
69
70
  Beats (`add_beat`, `update_beat`, `delete_beat`, `set_beat_translation`, `add_language`) were
70
71
  retired in Sep 2026 — scripts are documents now. Calling one returns a message pointing at the
package/index.mjs CHANGED
@@ -52,7 +52,7 @@ const ok = (result) => ({
52
52
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
53
53
  });
54
54
 
55
- const server = new McpServer({ name: "lotux", version: "0.8.1" });
55
+ const server = new McpServer({ name: "lotux", version: "0.10.0" });
56
56
 
57
57
  // ── Reads ─────────────────────────────────────────────────────────────────────
58
58
 
@@ -481,6 +481,7 @@ const flywheelRef = {
481
481
  };
482
482
  const assetRef = {
483
483
  asset_id: z.string().optional(),
484
+ code: z.union([z.string(), z.number()]).optional().describe('The content ID ("57") instead of asset_id'),
484
485
  key: z.string().optional().describe("The asset's key — with flywheel_id or flywheel_key — instead of asset_id"),
485
486
  ...flywheelRef,
486
487
  };
@@ -507,6 +508,7 @@ const assetFields = {
507
508
  final_asset_url: z.string().optional().describe("The exported deliverable (file or folder link). Signed off with the asset"),
508
509
  published_url: z.string().optional(),
509
510
  notes: z.string().optional(),
511
+ klaviyo_message_id: z.string().optional().describe("Email cards: the Klaviyo flow message id this card became (after the flow is built)"),
510
512
  };
511
513
 
512
514
  server.tool(
@@ -549,6 +551,8 @@ server.tool(
549
551
  transcript: z.string().optional(),
550
552
  notes: z.string().optional(),
551
553
  new_key: z.string().optional().describe("Give the flywheel a (new) key"),
554
+ klaviyo_flow_id: z.string().optional().describe("The Klaviyo flow built for this video (LM · <key>) — ticks the Klaviyo flow setup check"),
555
+ klaviyo_campaign_id: z.string().optional().describe("The Klaviyo keep-warm campaign — ticks the keep-warm setup check"),
552
556
  account_id: z.string().optional(),
553
557
  },
554
558
  async (args) => ok(await rpc("update_flywheel", args))
@@ -580,7 +584,7 @@ server.tool(
580
584
 
581
585
  server.tool(
582
586
  "push_assets",
583
- "Push many assets into a flywheel in one call (max 100). Each item is upserted on its `key`: new keys are created (asset_type + title required), existing keys are updated with only the fields you send. Content lands in to_review. Returns counts + per-item { key, id, created, status, link, warnings } or { key, error }.",
587
+ "Push many assets into a flywheel in one call (max 100). Each item is upserted on its `key`: new keys are created (asset_type + title required), existing keys are updated with only the fields you send. Content lands in to_review. Every piece gets a content ID; its name is \"<code> - <title>\" (use it for file names). Returns counts + per-item { key, id, code, name, created, status, link, warnings } or { key, error }.",
584
588
  {
585
589
  ...flywheelRef,
586
590
  assets: z.array(z.object({ key: z.string().optional(), ...assetFields })).max(100),
@@ -614,6 +618,7 @@ server.tool(
614
618
  {
615
619
  ...flywheelRef,
616
620
  key: z.string().optional(),
621
+ code: z.union([z.string(), z.number()]).optional().describe('A content ID ("57")'),
617
622
  asset_type: z.array(z.enum(ASSET_TYPES)).optional(),
618
623
  status: z.array(z.enum(STATUSES)).optional(),
619
624
  platform: z.array(z.enum(PLATFORMS)).optional().describe("Matches the main platform or a cross-post"),
@@ -668,6 +673,26 @@ server.tool(
668
673
  async (args) => ok(await rpc("delete_asset", args))
669
674
  );
670
675
 
676
+ server.tool(
677
+ "get_setup_checks",
678
+ "A flywheel's setup checklist: the steps outside LOTUX (Instagram auto-reply per lead-magnet DM keyword, setter saved reply per booking keyword, reel covers, YouTube scheduling, the Klaviyo flow + keep-warm campaign). Each with check_key, status (open / done / n_a), due date, owner, and whether LOTUX ticks it itself (auto).",
679
+ { ...flywheelRef, account_id: z.string().optional() },
680
+ async (args) => ok(await rpc("get_setup_checks", args))
681
+ );
682
+
683
+ server.tool(
684
+ "set_setup_check",
685
+ "Tick a setup step after you did it (e.g. check_key \"dm-keyword:EXIT\" once the Instagram auto-reply is set up AND tested). status done / open / n_a, plus an optional note. Auto checks (klaviyo-*) tick themselves. Logged as done by Claude.",
686
+ {
687
+ ...flywheelRef,
688
+ check_key: z.string().describe('From get_setup_checks, e.g. "dm-keyword:EXIT", "reel-covers", "youtube"'),
689
+ status: z.enum(["open", "done", "n_a"]).optional(),
690
+ note: z.string().optional(),
691
+ account_id: z.string().optional(),
692
+ },
693
+ async (args) => ok(await rpc("set_setup_check", args))
694
+ );
695
+
671
696
  async function main() {
672
697
  const transport = new StdioServerTransport();
673
698
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lotux-mcp",
3
- "version": "0.8.1",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "Local MCP server that lets Claude create LOTUX concepts (fetch brand-DB entities, create concepts, fill scripts + copy). Talks to the LOTUX app with a personal token; no business logic or secrets live here.",
6
6
  "bin": {