lotux-mcp 0.21.0 → 0.23.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 +2 -1
- package/package.json +1 -1
- package/tools.mjs +29 -6
package/README.md
CHANGED
|
@@ -61,10 +61,11 @@ Restart Claude, then try: *"list my LOTUX brands"*.
|
|
|
61
61
|
| `set_beats` / `set_beat_translations` | **Compatibility** for older prompts: a beat list is stored as the script document. Prefer `save_script` |
|
|
62
62
|
| `list_copy` / `create_copy` / `update_copy` / `delete_copy` / `link_copy` / `unlink_copy` / `add_copy_translation` | Ad copy library + concept links. `update_copy` edits in place; `delete_copy` removes it everywhere (status stays app-only) |
|
|
63
63
|
| `list_landing_pages` / `create_landing_page` | A brand's landing pages + the agency pool; link them with `set_concept_fields` |
|
|
64
|
+
| `list_concept_stages` / `move_concept` | The pipeline's stages in board order; move a concept to any of them (copy-check gate applies, Dropbox folder follows) |
|
|
64
65
|
| `iterate_concept` | Spawn a variation ({root}_Var{n}), the same as the app's Iterate button |
|
|
65
66
|
| `list_kb_*` / `get_kb_doc` / `create_kb_doc` / `update_kb_doc` | Kennisbank pages |
|
|
66
67
|
| `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 → ready_for_post → post_production → to_review → revisions → approved → live → testing → scaling → turned_off. Content you write lands in `to_review`;
|
|
68
|
+
| `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 → testing → scaling → turned_off. Content you write lands in `to_review`; `set_asset_status` moves a piece to any status (new pieces start in the early ones); 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
69
|
| `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 |
|
|
69
70
|
| `list_team` / `get_team_member` / `update_team_member` | HR (agency-only, needs HR access): the team — role, lead, status, dates, KPIs, archive/restore. No pay, no delete, no invites (app only) |
|
|
70
71
|
| `list_job_roles` / `get_job_role` / `update_job_role` / `create_job_role` | HR → Responsibilities: role templates (responsibilities, KPIs, capacity, owned columns). Lists are replaced whole |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lotux-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.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": {
|
package/tools.mjs
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
|
|
9
|
-
export const SERVER_INFO = { name: "lotux", version: "0.
|
|
9
|
+
export const SERVER_INFO = { name: "lotux", version: "0.22.0" };
|
|
10
10
|
|
|
11
11
|
export function registerTools(server, rpc) {
|
|
12
12
|
const ok = (result) => ({
|
|
@@ -317,6 +317,23 @@ export function registerTools(server, rpc) {
|
|
|
317
317
|
async ({ account_id }) => ok(await rpc("list_concepts", { account_id }))
|
|
318
318
|
);
|
|
319
319
|
|
|
320
|
+
server.tool(
|
|
321
|
+
"list_concept_stages",
|
|
322
|
+
"The stages of a brand's concept pipeline in board order (key + name), from Archive and Idea all the way to Testing, Scaling and Turned off. needs_approve = moving there needs approve rights. Use the key or name with move_concept.",
|
|
323
|
+
{ account_id: z.string().describe("Brand id from list_brands") },
|
|
324
|
+
async ({ account_id }) => ok(await rpc("list_concept_stages", { account_id }))
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
server.tool(
|
|
328
|
+
"move_concept",
|
|
329
|
+
"Move a concept to any stage of the pipeline (forward or back, all the way to the end), like dragging its card on the board: stage key or name from list_concept_stages. The copy-check gate still applies (missing fields are listed), the Dropbox folder moves with it and the team gets the usual Slack update.",
|
|
330
|
+
{
|
|
331
|
+
concept_id: z.string(),
|
|
332
|
+
stage: z.string().describe('Stage key ("ready_for_post") or name ("Ready for post")'),
|
|
333
|
+
},
|
|
334
|
+
async (args) => ok(await rpc("move_concept", args))
|
|
335
|
+
);
|
|
336
|
+
|
|
320
337
|
server.tool(
|
|
321
338
|
"get_concept",
|
|
322
339
|
"Read the full state of one concept by id: fields, linked products/personas/angles/use-cases, scripts (markdown per language + shotlist), and linked copy. Use to confirm what was written.",
|
|
@@ -353,7 +370,7 @@ export function registerTools(server, rpc) {
|
|
|
353
370
|
|
|
354
371
|
server.tool(
|
|
355
372
|
"create_concept",
|
|
356
|
-
"Create a new concept in the brand's first (Idea) stage, optionally linking products/personas/angles/offers/use-cases (a concept needs ≥1 product, persona, angle and offer before it can enter Copy check). Returns { id, script_id } — the concept id plus the id of its pre-seeded script (starter template). Write the script with save_script(script_id, body); do NOT add_script for the first script.
|
|
373
|
+
"Create a new concept in the brand's first (Idea) stage, optionally linking products/personas/angles/offers/use-cases (a concept needs ≥1 product, persona, angle and offer before it can enter Copy check). Returns { id, script_id } — the concept id plus the id of its pre-seeded script (starter template). Write the script with save_script(script_id, body); do NOT add_script for the first script. Move it on later with move_concept.",
|
|
357
374
|
{
|
|
358
375
|
account_id: z.string().describe("Brand id from list_brands"),
|
|
359
376
|
title: z.string(),
|
|
@@ -385,6 +402,12 @@ export function registerTools(server, rpc) {
|
|
|
385
402
|
country: z.string().optional(),
|
|
386
403
|
promotion: z.string().optional(),
|
|
387
404
|
brief: z.string().optional().describe("Concept brief (markdown)"),
|
|
405
|
+
delivered_date: z
|
|
406
|
+
.string()
|
|
407
|
+
.optional()
|
|
408
|
+
.describe(
|
|
409
|
+
"YYYY-MM-DD, today or earlier — the day the work was delivered to the client (the drawer's Delivered date; the client delivery dashboard counts by it). The first forward move from before Client approval into it or a later stage stamps today when the date is empty; set this when the work was delivered on another day."
|
|
410
|
+
),
|
|
388
411
|
base_language: z.string().optional(),
|
|
389
412
|
sub_buckets: z.array(z.string()).optional(),
|
|
390
413
|
bucket: z.string().optional().describe("Main bucket option key (see list_options.fields)"),
|
|
@@ -707,8 +730,8 @@ export function registerTools(server, rpc) {
|
|
|
707
730
|
// (defaults to your agency). Call content_options first for the allowed values.
|
|
708
731
|
|
|
709
732
|
const PLATFORMS = ["youtube", "youtube_shorts", "instagram", "tiktok", "linkedin", "x", "email", "meta_ads", "opt_in_page", "google_doc", "internal"];
|
|
710
|
-
// Statuses follow production.
|
|
711
|
-
//
|
|
733
|
+
// Statuses follow production. set_asset_status moves to any of them; new
|
|
734
|
+
// assets (push / update fields) start in the first five only.
|
|
712
735
|
const STATUSES = ["scripting", "production", "ready_for_post", "post_production", "to_review", "revisions", "approved", "to_launch", "live", "testing", "scaling", "turned_off", "archived"];
|
|
713
736
|
const CLAUDE_STATUSES = ["scripting", "production", "ready_for_post", "post_production", "to_review"];
|
|
714
737
|
// video = "To long form".
|
|
@@ -893,10 +916,10 @@ export function registerTools(server, rpc) {
|
|
|
893
916
|
|
|
894
917
|
server.tool(
|
|
895
918
|
"set_asset_status",
|
|
896
|
-
"Move an asset
|
|
919
|
+
"Move an asset to any status, all the way to the end: scripting, production, ready_for_post, post_production, to_review (hands it to a human), revisions, approved, to_launch, live, testing, scaling, turned_off, archived. The Dropbox folder follows; approving a lead-magnet page publishes it.",
|
|
897
920
|
{
|
|
898
921
|
...assetRef,
|
|
899
|
-
status: z.enum(
|
|
922
|
+
status: z.enum(STATUSES),
|
|
900
923
|
comment: z.string().optional().describe("Shown in the asset's activity"),
|
|
901
924
|
account_id: z.string().optional(),
|
|
902
925
|
},
|