lotux-mcp 0.8.1 → 0.10.2
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 +2 -1
- package/index.mjs +31 -6
- 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 → ready_for_post → 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.
|
|
55
|
+
const server = new McpServer({ name: "lotux", version: "0.10.2" });
|
|
56
56
|
|
|
57
57
|
// ── Reads ─────────────────────────────────────────────────────────────────────
|
|
58
58
|
|
|
@@ -464,10 +464,10 @@ server.tool(
|
|
|
464
464
|
// (defaults to your agency). Call content_options first for the allowed values.
|
|
465
465
|
|
|
466
466
|
const PLATFORMS = ["youtube", "youtube_shorts", "instagram", "tiktok", "linkedin", "x", "email", "meta_ads", "opt_in_page", "google_doc", "internal"];
|
|
467
|
-
// Statuses follow production. You may set the first
|
|
467
|
+
// Statuses follow production. You may set the first five; revisions,
|
|
468
468
|
// approved and live are a human's call.
|
|
469
|
-
const STATUSES = ["scripting", "production", "post_production", "to_review", "revisions", "approved", "live"];
|
|
470
|
-
const CLAUDE_STATUSES = ["scripting", "production", "post_production", "to_review"];
|
|
469
|
+
const STATUSES = ["scripting", "production", "ready_for_post", "post_production", "to_review", "revisions", "approved", "live"];
|
|
470
|
+
const CLAUDE_STATUSES = ["scripting", "production", "ready_for_post", "post_production", "to_review"];
|
|
471
471
|
// video = "To long form".
|
|
472
472
|
const CTAS = ["none", "video", "lead_magnet", "dm_keyword", "booking", "follow"];
|
|
473
473
|
// long_form carries the YouTube pieces: title = YouTube title, body =
|
|
@@ -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>, 4 emails for sign-ups); its setup check ticks once the flow is live"),
|
|
555
|
+
klaviyo_campaign_id: z.string().optional().describe("The Klaviyo announcement campaign (one \"new video\" email to the list); its setup check ticks once it is scheduled"),
|
|
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"),
|
|
@@ -644,7 +649,7 @@ server.tool(
|
|
|
644
649
|
|
|
645
650
|
server.tool(
|
|
646
651
|
"set_asset_status",
|
|
647
|
-
"Move an asset through scripting, production, post_production or to_review (to_review hands it to a human). Revisions, approved and live are a human's call in LOTUX.",
|
|
652
|
+
"Move an asset through scripting, production, ready_for_post, post_production or to_review (to_review hands it to a human). Revisions, approved and live are a human's call in LOTUX.",
|
|
648
653
|
{
|
|
649
654
|
...assetRef,
|
|
650
655
|
status: z.enum(CLAUDE_STATUSES),
|
|
@@ -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, 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-*, lead-magnet-page) 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.
|
|
3
|
+
"version": "0.10.2",
|
|
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": {
|