@cmo-so/mcp 0.7.2 → 0.7.4

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 +56 -4
  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.2",
7202
+ version: "0.7.4",
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",
@@ -7410,6 +7410,14 @@ function createApi({ baseUrl, session: session2, fetch: fetchImpl = globalThis.f
7410
7410
  apps: () => request("/v1/me/apps"),
7411
7411
  revokeApp: (grantId) => request(`/v1/me/apps/${encodeURIComponent(grantId)}`, { method: "DELETE" }),
7412
7412
  invoices: () => request("/v1/me/invoices"),
7413
+ /**
7414
+ * Take a website off your own list (archives your claim; reversible on ai.cmo.so). Nothing changes for
7415
+ * anyone else; a team member also leaves the team.
7416
+ */
7417
+ removeWebsite: (domain) => request(
7418
+ `/v1/me/websites/${encodeURIComponent(domain)}/remove`,
7419
+ { method: "POST" }
7420
+ ),
7413
7421
  /** Delete the account (only from the person's own sign-in). Websites stay, unclaimed; plans stop renewing. */
7414
7422
  delete: () => request("/v1/me/delete", {
7415
7423
  method: "POST",
@@ -7589,7 +7597,9 @@ function domainApi(api2, domain) {
7589
7597
  });
7590
7598
  return {
7591
7599
  summary: () => api2.request(base),
7592
- posts: (status, limit = 50) => api2.request(`${base}/posts?status=${status}&limit=${limit}`),
7600
+ posts: (status, limit = 50) => api2.request(
7601
+ `${base}/posts?status=${status}&limit=${limit}`
7602
+ ),
7593
7603
  post: (id) => api2.request(`${base}/posts/${encodeURIComponent(id)}`),
7594
7604
  updatePost: (id, changes) => api2.request(`${base}/posts/${encodeURIComponent(id)}`, {
7595
7605
  method: "PATCH",
@@ -7697,6 +7707,11 @@ function domainApi(api2, domain) {
7697
7707
  wordpressPlugin: () => api2.request(`${base}/wordpress-plugin`),
7698
7708
  // Writes (need autopilot write on the domain).
7699
7709
  addIdea: (input) => post(`${base}/ideas`, input),
7710
+ /**
7711
+ * Up to 100 ideas exactly as given (no AI, no generation used): they wait in the pool, not the plan, and count
7712
+ * toward the 100 waiting ideas a person may add. Duplicates (title or page) are skipped and listed.
7713
+ */
7714
+ addIdeas: (ideas) => post(`${base}/ideas/bulk`, { ideas }),
7700
7715
  /** Ideas built on up to 10 photos (base64 JPEG). The server keeps no copy. */
7701
7716
  ideasFromPhotos: (photos, count, brief2 = "") => post(`${base}/ideas/from-photos`, { photos, count, brief: brief2 }),
7702
7717
  generateIdeas: (count, brief2 = "") => post(`${base}/ideas/generate`, { count, brief: brief2 }),
@@ -9313,8 +9328,10 @@ var blogTools = [
9313
9328
  const r = await ws(ctx).ideas(int(page, 1, 100, 1), 15, status === "discarded" ? "discarded" : "pending");
9314
9329
  return {
9315
9330
  total: r.total,
9331
+ // The real limits: the user's own waiting ideas (cap) and the plan (plan_max).
9316
9332
  cap: r.cap,
9317
9333
  added_by_you: r.added_by_you,
9334
+ plan_max: r.plan_max,
9318
9335
  items: r.items.map((i) => ({
9319
9336
  id: i.id,
9320
9337
  priority: i.priority,
@@ -9351,6 +9368,41 @@ var blogTools = [
9351
9368
  return ws(ctx).addIdea(url ? { url } : { text: text3 });
9352
9369
  }
9353
9370
  }),
9371
+ tool({
9372
+ name: "ideas_add_list",
9373
+ description: "Add up to 100 ideas exactly as given (a researched list): title, description, primary keyword, up to 5 more keywords, a benchmark URL (read as research, never linked), priority 1-10 and optionally one of the website's topics. No AI rewrites them and no generation is used; they wait in the idea pool, not the plan. Duplicates are skipped and listed; a person's own waiting ideas have a limit (ideas_list cap, 200 today).",
9374
+ parameters: {
9375
+ type: "object",
9376
+ properties: {
9377
+ ideas: {
9378
+ type: "array",
9379
+ items: {
9380
+ type: "object",
9381
+ properties: {
9382
+ title: { type: "string" },
9383
+ description: { type: "string" },
9384
+ keyword: { type: "string", description: "The primary keyword" },
9385
+ keywords: { type: "array", items: { type: "string" } },
9386
+ url: { type: "string", description: "A benchmark page" },
9387
+ priority: { type: "integer", minimum: 1, maximum: 10 },
9388
+ topic: { type: "string", description: "One of topics_list, if it fits" }
9389
+ },
9390
+ required: ["title"]
9391
+ }
9392
+ }
9393
+ },
9394
+ required: ["ideas"]
9395
+ },
9396
+ group: "blog",
9397
+ need: write,
9398
+ risk: "W1",
9399
+ run: async (ctx, { ideas }) => {
9400
+ if (!ideas?.length) throw new Error("Give at least one idea.");
9401
+ if (ideas.length > 100) throw new Error("Up to 100 ideas at a time.");
9402
+ const out = await ws(ctx).addIdeas(ideas);
9403
+ return { added: out.added, skipped: out.skipped, room_left: out.room_left };
9404
+ }
9405
+ }),
9354
9406
  tool({
9355
9407
  name: "ideas_generate",
9356
9408
  description: "Let Maggie come up with new ideas (1\u201310) with AI, optionally about a theme.",
@@ -9422,7 +9474,7 @@ var blogTools = [
9422
9474
  }),
9423
9475
  tool({
9424
9476
  name: "idea_plan",
9425
- description: "Add a waiting idea to the end of the plan (the plan holds at most 10).",
9477
+ description: "Add a waiting idea to the end of the plan (the plan holds up to 100).",
9426
9478
  parameters: {
9427
9479
  type: "object",
9428
9480
  properties: {
@@ -9757,7 +9809,7 @@ var brandTools = [
9757
9809
  }),
9758
9810
  tool({
9759
9811
  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.",
9812
+ description: "Look for new competitors on the web now (once a day per website, subscribed websites only; Maggie also looks on her own once the website and its known competitors have no new pages left). New ones come back as suggestions; nothing is added to the profile.",
9761
9813
  parameters: none,
9762
9814
  group: "brand",
9763
9815
  need: write2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
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",