@cmo-so/mcp 0.9.1 → 0.9.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.
Files changed (2) hide show
  1. package/dist/cmo-mcp.mjs +74 -3
  2. package/package.json +1 -1
package/dist/cmo-mcp.mjs CHANGED
@@ -7199,7 +7199,7 @@ var require_dist = __commonJS({
7199
7199
  // package.json
7200
7200
  var package_default = {
7201
7201
  name: "@cmo-so/cli",
7202
- version: "0.9.1",
7202
+ version: "0.9.2",
7203
7203
  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.",
7204
7204
  type: "module",
7205
7205
  license: "MIT",
@@ -7784,8 +7784,14 @@ function domainApi(api2, domain) {
7784
7784
  /** How a posted Instagram post is doing (read from Instagram, kept 15 minutes; `refresh` reads again). */
7785
7785
  socialInsights: (id, refresh = false) => api2.request(`${base}/social/${id}/insights${refresh ? "?refresh=true" : ""}`),
7786
7786
  deletePostedSocial: (id) => api2.request(`${base}/social/${id}/published`, { method: "DELETE" }),
7787
- /** Change a posted LinkedIn post and put it up again: the old one comes down, the new text goes out now. */
7788
- republishSocial: (id, socialCopy) => post(`${base}/social/${id}/republish`, socialCopy ? { social_copy: socialCopy } : {}),
7787
+ /**
7788
+ * Change a posted post. LinkedIn changes its text in place (likes and comments stay); with `repost`, and on
7789
+ * the other channels, the old one comes down and the new text goes out now.
7790
+ */
7791
+ republishSocial: (id, socialCopy, repost = false) => post(`${base}/social/${id}/republish`, {
7792
+ ...socialCopy ? { social_copy: socialCopy } : {},
7793
+ ...repost ? { repost: true } : {}
7794
+ }),
7789
7795
  restoreSocial: (id) => post(`${base}/social/${id}/restore`),
7790
7796
  pauseSocial: () => post(`${base}/social/pause`),
7791
7797
  /**
@@ -8785,6 +8791,18 @@ var confirmCopy = {
8785
8791
  return n.length > 1 ? `\u6279\u51C6 ${n.length} \u7BC7\u8CBC\u6587\uFF1A${n.map((i) => `#${i}`).join("\u3001")}\u3002\u6BCF\u7BC7\u5728\u63A5\u4E0B\u4F86\u7684\u767C\u6587\u6642\u9593\u767C\u51FA\uFF0C\u4F60\u7684\u4EBA\u8108\u90FD\u770B\u5F97\u5230\u3002` : `\u6279\u51C6\u8CBC\u6587 #${n[0]}\u3002\u5B83\u6703\u5728\u4E0B\u4E00\u500B\u767C\u6587\u6642\u9593\u767C\u51FA\uFF0C\u4F60\u7684\u4EBA\u8108\u90FD\u770B\u5F97\u5230\u3002`;
8786
8792
  }
8787
8793
  },
8794
+ social_publish_now: {
8795
+ en: (a) => `Post #${a.id} on its channel now, not at its posting time (even while posting is paused). Everyone who follows you can see it.`,
8796
+ "zh-Hant": (a) => `\u7ACB\u5373\u5728\u5B83\u7684\u983B\u9053\u767C\u51FA\u8CBC\u6587 #${a.id}\uFF0C\u4E0D\u7B49\u767C\u6587\u6642\u9593\uFF08\u66AB\u505C\u767C\u6587\u6642\u4E5F\u6703\u767C\uFF09\u3002\u767C\u51FA\u5F8C\u95DC\u6CE8\u4F60\u7684\u4EBA\u90FD\u770B\u5F97\u5230\u3002`
8797
+ },
8798
+ social_posted_update: {
8799
+ en: (a) => a.repost ? `Take post #${a.id} down (its likes and comments go) and put it up again${a.social_copy ? ` as ${q(a.social_copy)}` : ""}.` : `Change the text of the posted post #${a.id} to ${q(a.social_copy)}. On LinkedIn it stays up with its likes and comments; on other channels it comes down and goes out again.`,
8800
+ "zh-Hant": (a) => a.repost ? `\u64A4\u4E0B\u8CBC\u6587 #${a.id}\uFF08\u8B9A\u548C\u7559\u8A00\u6703\u6D88\u5931\uFF09\uFF0C\u518D\u91CD\u65B0\u767C\u51FA${a.social_copy ? `\uFF0C\u5167\u5BB9\u6539\u70BA ${q(a.social_copy)}` : ""}\u3002` : `\u628A\u5DF2\u767C\u51FA\u7684\u8CBC\u6587 #${a.id} \u6539\u70BA ${q(a.social_copy)}\u3002LinkedIn \u4E0A\u539F\u5730\u4FEE\u6539\uFF0C\u8B9A\u548C\u7559\u8A00\u4FDD\u7559\uFF1B\u5176\u4ED6\u983B\u9053\u6703\u64A4\u4E0B\u5F8C\u91CD\u767C\u3002`
8801
+ },
8802
+ social_posted_delete: {
8803
+ en: (a) => `Take post #${a.id} down from its channel, with its likes and comments. This can't be undone.`,
8804
+ "zh-Hant": (a) => `\u628A\u8CBC\u6587 #${a.id} \u5F9E\u5B83\u7684\u983B\u9053\u64A4\u4E0B\uFF0C\u8B9A\u548C\u7559\u8A00\u4E00\u8D77\u522A\u9664\uFF0C\u7121\u6CD5\u5FA9\u539F\u3002`
8805
+ },
8788
8806
  social_skip: { en: (a) => `Skip post #${a.id}.`, "zh-Hant": (a) => `\u8DF3\u904E\u8CBC\u6587 #${a.id}\u3002` },
8789
8807
  social_restore: {
8790
8808
  en: (a) => `Bring back post #${a.id}.`,
@@ -11747,6 +11765,59 @@ var socialTools = [
11747
11765
  return { approved: results.filter((r) => r.ok).length, results };
11748
11766
  }
11749
11767
  }),
11768
+ tool({
11769
+ name: "social_publish_now",
11770
+ description: "Post one social post on its channel now instead of at its posting time: a draft waiting for approval, a queued post, or one that didn't go out. It goes even while posting is paused. It goes out in the background: the answer says it is publishing; read social_post_get after a minute for its link (or why it couldn't go). Not while its picture is being made.",
11771
+ parameters: { type: "object", properties: { id: { type: "integer" } }, required: ["id"] },
11772
+ group: "social",
11773
+ need: write5,
11774
+ risk: "W3",
11775
+ gates: ["VER"],
11776
+ run: async (ctx, { id }) => {
11777
+ const n = Number(id);
11778
+ if (!Number.isInteger(n) || n <= 0) throw new Error("Which post?");
11779
+ const post = await ws(ctx).publishSocialNow(n, { background: true });
11780
+ return post.status === "published" ? post : { ...post, note: "Posting now. Check social_post_get in a minute for its link." };
11781
+ }
11782
+ }),
11783
+ tool({
11784
+ name: "social_posted_update",
11785
+ description: "Change a social post that has already gone out. On LinkedIn the new text replaces the old in place: the post keeps its likes and comments (its pictures can't change this way). With repost, and on Facebook, Instagram and Google, the old post comes down with its likes and comments and the new version goes out now. Without social_copy and with repost, it goes out again as it is (e.g. after new pictures).",
11786
+ parameters: {
11787
+ type: "object",
11788
+ properties: {
11789
+ id: { type: "integer" },
11790
+ social_copy: { type: "string", description: "The post's new text" },
11791
+ repost: { type: "boolean", description: "Take it down and put it up again instead of editing it" }
11792
+ },
11793
+ required: ["id"]
11794
+ },
11795
+ group: "social",
11796
+ need: write5,
11797
+ risk: "W3",
11798
+ gates: ["VER"],
11799
+ run: async (ctx, { id, social_copy, repost }) => {
11800
+ const n = Number(id);
11801
+ if (!Number.isInteger(n) || n <= 0) throw new Error("Which post?");
11802
+ const copy = typeof social_copy === "string" ? social_copy.trim() : "";
11803
+ if (!copy && repost !== true) throw new Error("Give the new text (social_copy), or repost: true.");
11804
+ return ws(ctx).republishSocial(n, copy || void 0, repost === true);
11805
+ }
11806
+ }),
11807
+ tool({
11808
+ name: "social_posted_delete",
11809
+ description: "Take a social post that has gone out down from its channel (LinkedIn, Facebook, Instagram, Google). Its likes and comments go with it; this can't be undone.",
11810
+ parameters: { type: "object", properties: { id: { type: "integer" } }, required: ["id"] },
11811
+ group: "social",
11812
+ need: write5,
11813
+ risk: "W3",
11814
+ gates: ["VER"],
11815
+ run: async (ctx, { id }) => {
11816
+ const n = Number(id);
11817
+ if (!Number.isInteger(n) || n <= 0) throw new Error("Which post?");
11818
+ return ws(ctx).deletePostedSocial(n);
11819
+ }
11820
+ }),
11750
11821
  tool({
11751
11822
  name: "social_skip",
11752
11823
  description: "Skip a LinkedIn post (it won't be posted; it can be restored).",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
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",