@cmo-so/mcp 0.7.5 → 0.7.6

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 +45 -16
  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.7.5",
7202
+ version: "0.7.6",
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",
@@ -7526,11 +7526,12 @@ function createApi({ baseUrl, session: session2, fetch: fetchImpl = globalThis.f
7526
7526
  return request(`/v1/skills?${qs}`);
7527
7527
  },
7528
7528
  get: (id) => request(`/v1/skills/${encodeURIComponent(id)}`),
7529
- /** Like or save a skill (on: false undoes it). */
7530
- react: (id, kind, on2 = true) => request(
7531
- `/v1/skills/${encodeURIComponent(id)}/react`,
7532
- { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ kind, on: on2 }) }
7533
- ),
7529
+ /** Vote on or save a skill (on: false undoes it). "like" is an upvote. */
7530
+ react: (id, kind, on2 = true) => request(`/v1/skills/${encodeURIComponent(id)}/react`, {
7531
+ method: "POST",
7532
+ headers: { "Content-Type": "application/json" },
7533
+ body: JSON.stringify({ kind, on: on2 })
7534
+ }),
7534
7535
  saved: () => request("/v1/skills/saved"),
7535
7536
  /** Suggest an open-source GitHub repo; Maggie researches it (3 a day). */
7536
7537
  submit: (repoUrl, note) => request("/v1/skills/submissions", {
@@ -8391,6 +8392,10 @@ var confirmCopy = {
8391
8392
  en: (a) => `Remove the call-to-action for ${q(a.target_keyword)}.`,
8392
8393
  "zh-Hant": (a) => `\u522A\u9664 ${q(a.target_keyword)} \u7684\u884C\u52D5\u547C\u7C72\u3002`
8393
8394
  },
8395
+ internal_links_set: {
8396
+ en: (a) => Number(a.count) ? `Link each new post to ${a.count} of your latest articles.` : "Stop linking new posts to your other articles.",
8397
+ "zh-Hant": (a) => Number(a.count) ? `\u6BCF\u7BC7\u65B0\u6587\u7AE0\u9023\u7D50\u5230\u4F60\u6700\u65B0\u7684 ${a.count} \u7BC7\u6587\u7AE0\u3002` : "\u65B0\u6587\u7AE0\u4E0D\u518D\u9023\u7D50\u5230\u4F60\u7684\u5176\u4ED6\u6587\u7AE0\u3002"
8398
+ },
8394
8399
  testimonial_upsert: {
8395
8400
  en: (a) => `Save the testimonial from ${a.name}${a.use_in_posts ? " and use testimonials in posts" : ""}.`,
8396
8401
  "zh-Hant": (a) => `\u5132\u5B58 ${a.name} \u7684\u5BA2\u6236\u8A55\u50F9${a.use_in_posts ? "\uFF0C\u4E26\u5728\u6587\u7AE0\u88E1\u4F7F\u7528\u8A55\u50F9" : ""}\u3002`
@@ -8639,8 +8644,8 @@ var confirmCopy = {
8639
8644
  },
8640
8645
  // ---------------------------------------------------------- Marketing skills (docs/26)
8641
8646
  skill_like: {
8642
- en: (a) => `${a.undo ? "Take back your like on" : "Like"} the skill ${q(a.skill_id)} on cmo.so.`,
8643
- "zh-Hant": (a) => `${a.undo ? "\u53D6\u6D88\u5C0D" : "\u5728 cmo.so \u8B9A"}\u6280\u80FD ${q(a.skill_id)}${a.undo ? " \u7684\u8B9A" : ""}\u3002`
8647
+ en: (a) => `${a.undo ? "Take back your upvote on" : "Upvote"} the skill ${q(a.skill_id)} on cmo.so.`,
8648
+ "zh-Hant": (a) => `${a.undo ? "\u6536\u56DE\u5C0D" : "\u5728 cmo.so \u6295\u7968\u652F\u6301"}\u6280\u80FD ${q(a.skill_id)}${a.undo ? " \u7684\u652F\u6301\u7968" : ""}\u3002`
8644
8649
  },
8645
8650
  skill_save: {
8646
8651
  en: (a) => `${a.undo ? "Remove" : "Save"} the skill ${q(a.skill_id)} ${a.undo ? "from" : "to"} your saved skills.`,
@@ -9668,6 +9673,24 @@ var brandTools = [
9668
9673
  return { ctas: out.ctas?.map((c) => c.target_keyword) };
9669
9674
  }
9670
9675
  }),
9676
+ tool({
9677
+ name: "internal_links_set",
9678
+ description: "Set how many of the website's own latest articles each new post links to (internal cross-links, picked for the topic; separate from CTAs). 0 turns it off, max 10, default 3.",
9679
+ parameters: {
9680
+ type: "object",
9681
+ properties: { count: { type: "integer", minimum: 0, maximum: 10 } },
9682
+ required: ["count"]
9683
+ },
9684
+ group: "brand",
9685
+ need: write2,
9686
+ risk: "W1",
9687
+ run: async (ctx, { count }) => {
9688
+ const n = Math.round(Number(count));
9689
+ if (!Number.isFinite(n) || n < 0 || n > 10) throw new Error("count must be 0 to 10.");
9690
+ const out = await ws(ctx).updateBrand({ internal_links: { count: n } });
9691
+ return { internal_links: out.internal_links ?? { count: n } };
9692
+ }
9693
+ }),
9671
9694
  tool({
9672
9695
  name: "testimonial_upsert",
9673
9696
  description: "Add a customer testimonial, or change the one from the same person. Only real quotes the user gives (or examples they asked for). use_in_posts turns testimonials on in posts.",
@@ -10746,7 +10769,7 @@ var ID = { type: "string", description: "The skill id, like cmo-ad-creative" };
10746
10769
  var skillTools = [
10747
10770
  tool({
10748
10771
  name: "skills_search",
10749
- description: "Search cmo.so's open library of marketing skills (step-by-step methods an AI agent follows, free and MIT licensed): returns matching skills with their summary, likes and page. Use it when the user asks how to do a marketing job, wants a playbook or template, or asks which skills exist. Empty query: the most useful ones and the categories.",
10772
+ description: "Search cmo.so's open library of marketing skills (step-by-step methods an AI agent follows, free and MIT licensed): returns matching skills with their summary, vote score and page. Use it when the user asks how to do a marketing job, wants a playbook or template, or asks which skills exist. Empty query: the most useful ones and the categories.",
10750
10773
  parameters: {
10751
10774
  type: "object",
10752
10775
  properties: {
@@ -10770,7 +10793,13 @@ var skillTools = [
10770
10793
  return {
10771
10794
  total_in_library: r.total,
10772
10795
  ...a.query ? {} : { categories: r.categories.map((c) => `${c.id} (${c.count})`) },
10773
- skills: r.skills.map((s) => ({ id: s.id, name: s.name, summary: s.summary, likes: s.likes, page: s.url }))
10796
+ skills: r.skills.map((s) => ({
10797
+ id: s.id,
10798
+ name: s.name,
10799
+ summary: s.summary,
10800
+ score: s.score ?? s.likes,
10801
+ page: s.url
10802
+ }))
10774
10803
  };
10775
10804
  }
10776
10805
  }),
@@ -10789,7 +10818,7 @@ var skillTools = [
10789
10818
  name: s.name,
10790
10819
  summary: s.summary,
10791
10820
  page: s.url,
10792
- likes: s.likes,
10821
+ score: s.score ?? s.likes,
10793
10822
  saves: s.saves,
10794
10823
  uses_tools: s.mcp_tools,
10795
10824
  pairs_with: s.pairs_with,
@@ -10801,10 +10830,10 @@ var skillTools = [
10801
10830
  }),
10802
10831
  tool({
10803
10832
  name: "skill_like",
10804
- description: "Like a skill in the cmo.so library for the user (or take the like back with undo). Likes help the library decide what to keep improving. Only when the user asks.",
10833
+ description: "Upvote a skill in the cmo.so library for the user (or take the upvote back with undo). Votes help the library decide what to keep improving. Only when the user asks.",
10805
10834
  parameters: {
10806
10835
  type: "object",
10807
- properties: { skill_id: ID, undo: { type: "boolean", description: "true takes the like back" } },
10836
+ properties: { skill_id: ID, undo: { type: "boolean", description: "true takes the upvote back" } },
10808
10837
  required: ["skill_id"]
10809
10838
  },
10810
10839
  group: "account",
@@ -10813,12 +10842,12 @@ var skillTools = [
10813
10842
  idempotent: true,
10814
10843
  run: async (ctx, a) => {
10815
10844
  const r = await ctx.api.skills.react(String(a.skill_id), "like", !a.undo);
10816
- return { skill_id: r.item, liked: r.liked, likes: r.counts.likes };
10845
+ return { skill_id: r.item, upvoted: r.liked, score: r.counts.score ?? r.counts.likes };
10817
10846
  }
10818
10847
  }),
10819
10848
  tool({
10820
10849
  name: "skill_save",
10821
- description: "Save a skill to the user's saved skills on cmo.so (or remove it with undo), to find it again at cmo.so/skills/saved or with skills_saved_list.",
10850
+ description: "Save a skill to the user's saved skills on cmo.so (or remove it with undo), to find it again under Saved at cmo.so/skills or with skills_saved_list.",
10822
10851
  parameters: {
10823
10852
  type: "object",
10824
10853
  properties: { skill_id: ID, undo: { type: "boolean", description: "true removes it from saved" } },
@@ -10851,7 +10880,7 @@ var skillTools = [
10851
10880
  }),
10852
10881
  tool({
10853
10882
  name: "skill_submit",
10854
- description: "Suggest a public open-source GitHub repo for cmo.so's skill library. Maggie researches it within minutes and decides: add a new skill, improve an existing one, keep it as a candidate that needs 10 likes in 30 days, or decline (licence first: permissive licences can be adapted, copyleft only inspires, no licence is declined). 3 suggestions a day. Follow up with skill_submissions_list.",
10883
+ description: "Suggest a public open-source GitHub repo for cmo.so's skill library. Maggie researches it within minutes and decides: add a new skill, improve an existing one, keep it as a candidate that needs a vote score of 10 in 30 days, or decline (licence first: permissive licences can be adapted, copyleft only inspires, no licence is declined). 3 suggestions a day. Follow up with skill_submissions_list.",
10855
10884
  parameters: {
10856
10885
  type: "object",
10857
10886
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.7.5",
3
+ "version": "0.7.6",
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",