@cmo-so/mcp 0.12.19 → 0.12.20

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/dist/cmo-mcp.mjs +115 -2
  2. package/package.json +1 -1
package/dist/cmo-mcp.mjs CHANGED
@@ -24489,7 +24489,7 @@ var require_dist3 = __commonJS({
24489
24489
  // package.json
24490
24490
  var package_default = {
24491
24491
  name: "@cmo-so/cli",
24492
- version: "0.12.19",
24492
+ version: "0.12.20",
24493
24493
  description: "CMO.so on the command line: your websites, ideas, blog posts, LinkedIn queue and results, plus a local MCP server for Claude Desktop, Cursor and other MCP clients.",
24494
24494
  type: "module",
24495
24495
  license: "MIT",
@@ -46065,7 +46065,23 @@ var MB_RESOURCES = {
46065
46065
  write: false,
46066
46066
  what: "booking rules, location, languages (change with wp_booking_settings_set)"
46067
46067
  },
46068
- imports: { path: "/import", write: false, what: "import history (undo with wp_booking_import undo_id)" }
46068
+ imports: { path: "/import", write: false, what: "import history (undo with wp_booking_import undo_id)" },
46069
+ products: { path: "/products", write: true, what: "retail products with price, tax, stock and low-stock level" },
46070
+ sales: { path: "/sales", write: false, what: "till sales (items, payments, refunds); search, id \u2192 one sale" },
46071
+ plans: { path: "/plans", write: true, what: "prepaid packages and membership plans for sale" },
46072
+ memberships: {
46073
+ path: "/memberships",
46074
+ write: false,
46075
+ what: "customers' memberships (pause, cancel\u2026 with wp_booking_membership)"
46076
+ },
46077
+ loyalty: { path: "/loyalty", write: false, what: "loyalty programme settings and points" },
46078
+ campaigns: {
46079
+ path: "/campaigns",
46080
+ write: true,
46081
+ what: "email campaigns (subject, body, button, segment) \u2014 send with wp_booking_campaign_send"
46082
+ },
46083
+ automations: { path: "/automations", write: false, what: "automated emails: we miss you, time to rebook, birthday" },
46084
+ messages: { path: "/messages", write: false, what: "conversations with customers; id = customer id \u2192 the thread" }
46069
46085
  };
46070
46086
  var bookingTools = [
46071
46087
  tool({
@@ -46493,6 +46509,103 @@ var bookingTools = [
46493
46509
  }
46494
46510
  }
46495
46511
  }),
46512
+ tool({
46513
+ name: "wp_booking_reports",
46514
+ description: "Business reports for a date range (from/to Y-m-d, venue time; group day | week | month): revenue (bookings and till sales), bookings by status, no-show rate, by treatment, by team member, by channel, new vs returning customers, gift cards sold vs redeemed. team_pay true: each team member's pay (commission on treatments, products and tips plus hourly pay). Read-only.",
46515
+ parameters: {
46516
+ type: "object",
46517
+ properties: {
46518
+ from: str2("From (Y-m-d)."),
46519
+ to: str2("To (Y-m-d)."),
46520
+ group: str2("day | week | month"),
46521
+ team_pay: bool("Team pay instead.")
46522
+ }
46523
+ },
46524
+ group: "site",
46525
+ need: READ,
46526
+ risk: "R0",
46527
+ gates: ["WP"],
46528
+ run: (ctx, a3) => mb(ctx, "GET", a3.team_pay ? "/reports/team-pay" : "/reports", void 0, {
46529
+ from: a3.from,
46530
+ to: a3.to,
46531
+ group: a3.group
46532
+ })
46533
+ }),
46534
+ tool({
46535
+ name: "wp_booking_message",
46536
+ description: "Send a customer a message from the business (customer id from wp_booking_list resource customers): they get it by email (and text when SMS is on) with a link to reply; replies show in wp_booking_list resource messages id=<customer id>.",
46537
+ parameters: {
46538
+ type: "object",
46539
+ properties: {
46540
+ customer_id: int2("Customer id."),
46541
+ body: str2("The message (plain text)."),
46542
+ booking_id: int2("About this booking (optional).")
46543
+ },
46544
+ required: ["customer_id", "body"]
46545
+ },
46546
+ group: "site",
46547
+ need: WRITE,
46548
+ risk: "W2",
46549
+ gates: [...GATES],
46550
+ confirm: (a3, lang) => say(
46551
+ lang,
46552
+ `Send customer #${a3.customer_id} this message by email: ${q3(a3.body, "")}`,
46553
+ `\u4EE5\u96FB\u90F5\u767C\u9001\u6B64\u8A0A\u606F\u7D66\u5BA2\u6236 #${a3.customer_id}\uFF1A${q3(a3.body, "")}`
46554
+ ),
46555
+ run: (ctx, a3) => mb(ctx, "POST", `/messages/${Number(a3.customer_id)}`, { body: a3.body, booking_id: a3.booking_id })
46556
+ }),
46557
+ tool({
46558
+ name: "wp_booking_campaign_send",
46559
+ description: "Send (or schedule with at, ISO time) an email campaign saved with wp_booking_save resource campaigns. Only customers who agreed to marketing emails get it, each with an unsubscribe link. Check the audience first: wp_booking_list resource campaigns id=<id>.",
46560
+ parameters: {
46561
+ type: "object",
46562
+ properties: {
46563
+ id: int2("Campaign id."),
46564
+ at: str2("Send at (ISO time); default now."),
46565
+ cancel: bool("Cancel a scheduled or running send instead.")
46566
+ },
46567
+ required: ["id"]
46568
+ },
46569
+ group: "site",
46570
+ need: WRITE,
46571
+ risk: "W3",
46572
+ gates: [...GATES],
46573
+ confirm: (a3, lang) => a3.cancel ? say(lang, `Stop campaign #${a3.id}.`, `\u505C\u6B62\u63A8\u5EE3\u6D3B\u52D5 #${a3.id}\u3002`) : say(
46574
+ lang,
46575
+ `Email campaign #${a3.id} to every customer in its audience who agreed to marketing emails${a3.at ? ` at ${a3.at}` : " now"}.`,
46576
+ `\u628A\u63A8\u5EE3\u6D3B\u52D5 #${a3.id}${a3.at ? `\u65BC ${a3.at}` : "\u7ACB\u5373"}\u5BC4\u7D66\u53D7\u773E\u4E2D\u540C\u610F\u63A5\u6536\u884C\u92B7\u96FB\u90F5\u7684\u5BA2\u6236\u3002`
46577
+ ),
46578
+ run: (ctx, a3) => mb(ctx, "POST", `/campaigns/${Number(a3.id)}/${a3.cancel ? "cancel" : "send"}`, a3.cancel ? {} : { at: a3.at })
46579
+ }),
46580
+ tool({
46581
+ name: "wp_booking_membership",
46582
+ description: "Change a customer's membership (id from wp_booking_list resource memberships): pause, resume, cancel (at the end of the period), cancel_now, add_sessions (sessions), add_credit (amount_minor), mark_paid (a renewal paid at the desk) or charge (retry the renewal on the saved card).",
46583
+ parameters: {
46584
+ type: "object",
46585
+ properties: {
46586
+ id: int2("Membership id."),
46587
+ action: str2("pause | resume | cancel | cancel_now | add_sessions | add_credit | mark_paid | charge"),
46588
+ sessions: int2("For add_sessions."),
46589
+ amount_minor: int2("For add_credit."),
46590
+ note: str2("Note.")
46591
+ },
46592
+ required: ["id", "action"]
46593
+ },
46594
+ group: "site",
46595
+ need: WRITE,
46596
+ risk: "W3",
46597
+ gates: [...GATES],
46598
+ confirm: (a3, lang) => say(
46599
+ lang,
46600
+ `Membership #${a3.id}: ${a3.action}${a3.action === "charge" ? " (charges the saved card)" : ""}.`,
46601
+ `\u6703\u7C4D #${a3.id}\uFF1A${a3.action}${a3.action === "charge" ? "\uFF08\u5F9E\u5DF2\u5B58\u5361\u7247\u6263\u6B3E\uFF09" : ""}\u3002`
46602
+ ),
46603
+ run: (ctx, a3) => mb(ctx, "POST", `/memberships/${Number(a3.id)}/${String(a3.action)}`, {
46604
+ sessions: a3.sessions,
46605
+ amount_minor: a3.amount_minor,
46606
+ note: a3.note
46607
+ })
46608
+ }),
46496
46609
  tool({
46497
46610
  name: "wp_booking_translate",
46498
46611
  description: "Read or write the translations of booking content (type service | variant | category | staff | voucher, id, lang such as zh-hans or es; fields name, description). Without fields: read. The site's extra languages are set with wp_booking_settings_set settings.languages.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.12.19",
3
+ "version": "0.12.20",
4
4
  "description": "CMO.so's MCP server for Claude Desktop, Cursor, VS Code and other MCP clients: manage your websites, blog posts, LinkedIn queue and results with Maggie.",
5
5
  "type": "module",
6
6
  "license": "MIT",