lotux-mcp 0.26.0 → 0.28.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 (2) hide show
  1. package/package.json +1 -1
  2. package/tools.mjs +18 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lotux-mcp",
3
- "version": "0.26.0",
3
+ "version": "0.28.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
@@ -75,7 +75,7 @@ export function registerTools(server, rpc) {
75
75
 
76
76
  server.tool(
77
77
  "plan_items",
78
- "Plan 1–60 items on ONE person's calendar on a date. With start_time they run back to back, each as long as that person's HR output allows (40 h ÷ weekly output; tasks 1 h); without start_time they land all-day. The person becomes the maker (post: video editor on video concepts, static designer on statics) or media buyer (go_live); on a task they are added to the assignees. Planning concept blocks needs Creative edit rights. More than 10 items → returns a PREVIEW only and changes nothing: show the list, ask for a yes, then call apply_planning_preview. Never deletes anything.",
78
+ "Plan 1–60 items on ONE person's calendar from a date. Concepts (post) without start_time go into that person's day blocks, in the blocks the planner baseline keeps for the concept's client (the client's goal for the week, max clients a day, block changes, meetings and planned work respected), starting on the date and continuing on the next working days up to the planning horizon. Concepts that don't fit (goal covered, person not on the client's team, not ready, someone else's) stay in the Unplanned Log and come back in not_planned with the reason: tell the user. With start_time they run back to back from that time instead, each as long as that person's HR output allows (40 h ÷ weekly output; tasks 1 h); all_day: true = all-day. go_live and tasks without start_time land all-day. The person becomes the maker (post: video editor on video concepts, static designer on statics) or media buyer (go_live); on a task they are added to the assignees. Planning concept blocks needs Creative edit rights. More than 10 items → returns a PREVIEW only and changes nothing: show the list, ask for a yes, then call apply_planning_preview. Never deletes anything.",
79
79
  {
80
80
  person: z.string().describe("id, name or 'me'"),
81
81
  items: PLAN_ITEMS,
@@ -702,6 +702,15 @@ export function registerTools(server, rpc) {
702
702
 
703
703
  // ── Kennisbank (knowledge base) ─────────────────────────────────────────────────
704
704
 
705
+ // How a Second Brain page's markdown is laid out — the app renders these.
706
+ const KB_FORMAT =
707
+ " Page markdown supports, besides normal markdown (headings, lists, tables, --- dividers, images): " +
708
+ "fenced blocks the app renders as page blocks — ```cards (one card per line: Label | Title | Text), " +
709
+ "```stats (Value | Label | Note), ```steps (Title | Text), ```callout (first line = title, the rest = body), " +
710
+ "```buttons (Label | link), ```mermaid (a Mermaid diagram). Any of those may start with a line " +
711
+ "`tone: gray|yellow|blue|green|red|purple|ink` for its colour. Link to another page with a normal markdown link " +
712
+ "to /brain/second-brain?ws=<workspace id>&doc=<page id>.";
713
+
705
714
  server.tool(
706
715
  "list_kb_workspaces",
707
716
  "List the Kennisbank (knowledge base) workspaces you can access — markdown docs the team and AI share. Returns id, name, visibility. Use a workspace id with list_kb_docs / create_kb_doc. Only each workspace's \"Exposed to MCP\" section is visible to the MCP; the rest is the team's own notes.",
@@ -711,37 +720,41 @@ export function registerTools(server, rpc) {
711
720
 
712
721
  server.tool(
713
722
  "list_kb_docs",
714
- "List the pages in a Kennisbank workspace's \"Exposed to MCP\" section (id, title, folder path inside the section; \"\" = its top level). Pages outside the section are not listed. Use a doc id with get_kb_doc.",
723
+ "List the pages in a Kennisbank workspace's \"Exposed to MCP\" section (id, title, folder path inside the section; \"\" = its top level; tags; date). Pages outside the section are not listed. Use a doc id with get_kb_doc.",
715
724
  { workspace_id: z.string().describe("Workspace id from list_kb_workspaces") },
716
725
  async ({ workspace_id }) => ok(await rpc("list_kb_docs", { workspace_id }))
717
726
  );
718
727
 
719
728
  server.tool(
720
729
  "get_kb_doc",
721
- "Read one Kennisbank page's full markdown content by id. Only pages in the \"Exposed to MCP\" section can be read.",
730
+ "Read one Kennisbank page by id: title, author, date, tags, full markdown content and linked_pages (the pages it links to; a linked page outside an \"Exposed to MCP\" section shows only its id with exposed: false). Only pages in the \"Exposed to MCP\" section can be read." + KB_FORMAT,
722
731
  { doc_id: z.string() },
723
732
  async ({ doc_id }) => ok(await rpc("get_kb_doc", { doc_id }))
724
733
  );
725
734
 
726
735
  server.tool(
727
736
  "create_kb_doc",
728
- "Create a new markdown page in a Kennisbank workspace's \"Exposed to MCP\" section. Returns the new doc id. content is markdown; folder_id is optional (top of the section if omitted) and must be a folder from list_kb_folders.",
737
+ "Create a new markdown page in a Kennisbank workspace's \"Exposed to MCP\" section. Returns the new doc id. content is markdown; folder_id is optional (top of the section if omitted) and must be a folder from list_kb_folders. You become the page's author." + KB_FORMAT,
729
738
  {
730
739
  workspace_id: z.string().describe("Workspace id from list_kb_workspaces"),
731
740
  title: z.string(),
732
741
  content: z.string().optional().describe("Markdown body"),
733
742
  folder_id: z.string().optional(),
743
+ tags: z.array(z.string()).optional().describe("Page tags"),
744
+ date: z.string().optional().describe("Page date, YYYY-MM-DD (default: today)"),
734
745
  },
735
746
  async (args) => ok(await rpc("create_kb_doc", args))
736
747
  );
737
748
 
738
749
  server.tool(
739
750
  "update_kb_doc",
740
- "Update a Kennisbank page's title and/or markdown content (pages in the \"Exposed to MCP\" section only). Omitted fields are left unchanged.",
751
+ "Update a Kennisbank page's title, markdown content, tags and/or date (pages in the \"Exposed to MCP\" section only). Omitted fields are left unchanged." + KB_FORMAT,
741
752
  {
742
753
  doc_id: z.string(),
743
754
  title: z.string().optional(),
744
755
  content: z.string().optional().describe("Markdown body (replaces the page content)"),
756
+ tags: z.array(z.string()).optional().describe("Replaces the page's tags"),
757
+ date: z.string().nullable().optional().describe("Page date YYYY-MM-DD; null = back to the created date"),
745
758
  },
746
759
  async (args) => ok(await rpc("update_kb_doc", args))
747
760
  );