@cmo-so/mcp 0.7.1 → 0.7.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 +70 -2
  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.1",
7202
+ version: "0.7.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",
@@ -8146,6 +8146,18 @@ function domainApi(api2, domain) {
8146
8146
  body: JSON.stringify(r)
8147
8147
  }
8148
8148
  ),
8149
+ /** Competitors Maggie found with Google Search, waiting for the user to add or dismiss (docs/25). */
8150
+ competitorSuggestions: () => api2.request(
8151
+ `${base}/competitors/suggestions`
8152
+ ),
8153
+ /** Put a suggestion in the business profile's competitors. */
8154
+ addCompetitorSuggestion: (id) => post(
8155
+ `${base}/competitors/suggestions/${encodeURIComponent(id)}/add`
8156
+ ),
8157
+ /** Not a competitor: never suggested or read for ideas again. */
8158
+ dismissCompetitorSuggestion: (id) => post(`${base}/competitors/suggestions/${encodeURIComponent(id)}/dismiss`),
8159
+ /** Look for new competitors now (once a day; subscribed websites only, else 402). */
8160
+ refreshCompetitorSuggestions: () => post(`${base}/competitors/suggestions/refresh`),
8149
8161
  /** The last time posts delivered by API pull were found in the website's sitemap (gives them their address). */
8150
8162
  sitemapMatch: () => api2.request(`${base}/rewrites/sitemap-match`),
8151
8163
  /** Read the sitemap (found on its own when blank) and match API-pull posts to their live address. */
@@ -9701,6 +9713,60 @@ var brandTools = [
9701
9713
  return { competitors: out.competitors?.map((x) => x.name) };
9702
9714
  }
9703
9715
  }),
9716
+ tool({
9717
+ name: "competitor_suggestions_list",
9718
+ description: "Competitors Maggie found on the web (each website checked) that the user hasn't added to the profile or dismissed yet: name, website, one line, and how many ideas came from their site. Their sitemaps are already used for blog ideas while they wait.",
9719
+ parameters: none,
9720
+ group: "brand",
9721
+ need: { resource: "overview", level: "read" },
9722
+ risk: "R0",
9723
+ run: async (ctx) => {
9724
+ const out = await ws(ctx).competitorSuggestions();
9725
+ return {
9726
+ searched_at: out.searched_at,
9727
+ suggestions: out.items.map(({ id, name, website, description: description2, ideas_found }) => ({
9728
+ id,
9729
+ name,
9730
+ website,
9731
+ description: description2,
9732
+ ideas_found
9733
+ }))
9734
+ };
9735
+ }
9736
+ }),
9737
+ tool({
9738
+ name: "competitor_suggestion_add",
9739
+ description: "Add one of Maggie's competitor suggestions (id from competitor_suggestions_list) to the business profile.",
9740
+ parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
9741
+ group: "brand",
9742
+ need: write2,
9743
+ risk: "W1",
9744
+ run: async (ctx, { id }) => {
9745
+ const out = await ws(ctx).addCompetitorSuggestion(id);
9746
+ return { competitors: out.competitors.map((c) => c.name) };
9747
+ }
9748
+ }),
9749
+ tool({
9750
+ name: "competitor_suggestion_dismiss",
9751
+ description: "Not a competitor after all: the suggestion is never made again and its site is no longer read for ideas.",
9752
+ parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
9753
+ group: "brand",
9754
+ need: write2,
9755
+ risk: "W1",
9756
+ run: async (ctx, { id }) => ws(ctx).dismissCompetitorSuggestion(id)
9757
+ }),
9758
+ tool({
9759
+ name: "competitor_suggestions_find",
9760
+ description: "Look for new competitors on the web now (once a day per website, subscribed websites only; Maggie also looks on her own about monthly). New ones come back as suggestions; nothing is added to the profile.",
9761
+ parameters: none,
9762
+ group: "brand",
9763
+ need: write2,
9764
+ risk: "W1",
9765
+ run: async (ctx) => {
9766
+ const out = await ws(ctx).refreshCompetitorSuggestions();
9767
+ return { found: out.found, suggestions: out.items.map(({ id, name, website }) => ({ id, name, website })) };
9768
+ }
9769
+ }),
9704
9770
  tool({
9705
9771
  name: "brand_research_update",
9706
9772
  description: "Change the profile's market notes: market_research (text), additional_information (anything else Maggie should know) or the SWOT list (each {name: Strengths|Weaknesses|Opportunities|Threats, description}). A list replaces the whole list.",
@@ -22086,12 +22152,14 @@ var OPEN_WORLD = /* @__PURE__ */ new Set([
22086
22152
  "social_video_add",
22087
22153
  "seo_audit_run",
22088
22154
  "ai_visibility_prompt_check",
22089
- "idea_add"
22155
+ "idea_add",
22156
+ "competitor_suggestions_find"
22090
22157
  ]);
22091
22158
  var OVERWRITES = /* @__PURE__ */ new Set([
22092
22159
  "ai_visibility_keywords_set",
22093
22160
  "brand_research_update",
22094
22161
  "brand_update",
22162
+ "competitor_suggestion_dismiss",
22095
22163
  "draft_rewrite",
22096
22164
  "draft_rewrite_save",
22097
22165
  "draft_update",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.7.1",
3
+ "version": "0.7.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",