notifyme-csm-mcp 1.0.4 → 1.0.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/index.js +39 -8
  2. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@
14
14
  * list_companies — browse/filter companies
15
15
  * search_companies — search by name / domain / email
16
16
  * get_company — full profile + recent notes/reminders/meetings/emails
17
- * update_company — update priority / state / tags
17
+ * update_company — update priority / status / tags
18
18
  *
19
19
  * Per-company sub-resources
20
20
  * list_notes — all notes for a company
@@ -43,6 +43,9 @@
43
43
  * get_dashboard — at-risk merchants
44
44
  * get_stats — full dashboard stats
45
45
  *
46
+ * StoreLeads
47
+ * get_storeleads — popularity rank + store enrichment by domain
48
+ *
46
49
  * Kanban
47
50
  * list_kanban_columns — list pipeline columns
48
51
  * move_to_column — move a company to a pipeline column
@@ -79,7 +82,7 @@ const TOOLS = [
79
82
  // ── Companies ────────────────────────────────────────────────────────────
80
83
  {
81
84
  name: "list_companies",
82
- description: "Browse or filter all companies in the CSM. Supports filtering by type, stage, priority, tag, and whether any outreach has occurred. Use search_companies for name/domain lookups.",
85
+ description: "Browse or filter all companies in the CSM. Supports filtering by type, status, priority, tag, and whether any outreach has occurred. Use search_companies for name/domain lookups.",
83
86
  inputSchema: {
84
87
  type: "object",
85
88
  properties: {
@@ -88,7 +91,8 @@ const TOOLS = [
88
91
  enum: ["agency", "merchant", "app_partner", "technology_partner", "media", "investor", "other"],
89
92
  description: "Filter by company type (optional)",
90
93
  },
91
- stage: { type: "string", description: "Filter by state/stage (optional, e.g. 'active', 'churned')" },
94
+ status: { type: "string", enum: ["active", "inactive", "churned", "prospective", "archived"], description: "Filter by lifecycle status (optional, e.g. 'active', 'churned'). Replaces the older `stage` arg." },
95
+ stage: { type: "string", description: "[Deprecated] alias for `status` — kept for back-compat. Prefer `status`." },
92
96
  priority: { type: "string", enum: ["p1", "p2", "p3"], description: "Filter by priority tier (optional)" },
93
97
  tag: { type: "string", description: "Filter by a single tag label (optional, e.g. 'websummit')" },
94
98
  no_outreach: { type: "boolean", description: "If true, only return companies with zero emails, notes, or meetings logged — i.e. never contacted" },
@@ -151,13 +155,14 @@ const TOOLS = [
151
155
  },
152
156
  {
153
157
  name: "update_company",
154
- description: "Update a company's priority, state, or tags. All fields are optional — only pass what you want to change.",
158
+ description: "Update a company's priority, status, or tags. All fields are optional — only pass what you want to change.",
155
159
  inputSchema: {
156
160
  type: "object",
157
161
  properties: {
158
162
  id: { type: "number", description: "Company id" },
159
163
  priority: { type: "string", enum: ["p1", "p2", "p3"], description: "Priority tier" },
160
- state: { type: "string", description: "State/stage (e.g. 'active', 'churned')" },
164
+ status: { type: "string", enum: ["active", "inactive", "churned", "prospective", "archived"], description: "Lifecycle status (replaces the older `state` arg)." },
165
+ state: { type: "string", description: "[Deprecated] alias for `status` — kept for back-compat. Prefer `status`." },
161
166
  tags: { type: "array", items: { type: "string" }, description: "Tags array (replaces existing)" },
162
167
  },
163
168
  required: ["id"],
@@ -368,6 +373,21 @@ const TOOLS = [
368
373
  required: [],
369
374
  },
370
375
  },
376
+ // ── StoreLeads ──────────────────────────────────────────────────────────────
377
+ {
378
+ name: "get_storeleads",
379
+ description: "Look up a store's StoreLeads enrichment by domain: global popularity `rank` (lower = more popular; rank < 1000 means a top store), Shopify plan, estimated monthly revenue, category, country/city, product count, and contact email/phone. Use it to score how notable a merchant or a new app install is.",
380
+ inputSchema: {
381
+ type: "object",
382
+ properties: {
383
+ domain: {
384
+ type: "string",
385
+ description: "Store domain or myshopify domain (e.g. 'acme.com' or 'acme.myshopify.com'). Protocol/www/path are stripped automatically.",
386
+ },
387
+ },
388
+ required: ["domain"],
389
+ },
390
+ },
371
391
  // ── Kanban ────────────────────────────────────────────────────────────────
372
392
  {
373
393
  name: "list_kanban_columns",
@@ -412,12 +432,15 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
412
432
  break;
413
433
  }
414
434
  case "list_companies": {
415
- const { type, stage, priority, tag, no_outreach, limit } = args;
435
+ const { type, status, stage, priority, tag, no_outreach, limit } = args;
416
436
  const params = new URLSearchParams();
417
437
  if (type)
418
438
  params.set("type", type);
419
- if (stage)
420
- params.set("stage", stage);
439
+ // `status` is canonical; `stage` is a back-compat alias. The server
440
+ // accepts both and prefers `status`; pass whichever was provided.
441
+ const effectiveStatus = status ?? stage;
442
+ if (effectiveStatus)
443
+ params.set("status", effectiveStatus);
421
444
  if (priority)
422
445
  params.set("priority", priority);
423
446
  if (tag)
@@ -445,6 +468,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
445
468
  break;
446
469
  }
447
470
  case "update_company": {
471
+ // Accept `status` (canonical) and `state` (back-compat alias).
472
+ // Server resolves precedence (status wins) and writes to companies.status.
448
473
  const { id, ...updates } = args;
449
474
  data = await api("PATCH", `/companies/${id}`, updates);
450
475
  break;
@@ -548,6 +573,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
548
573
  data = await api("GET", "/stats");
549
574
  break;
550
575
  }
576
+ // ── StoreLeads ─────────────────────────────────────────────────────────
577
+ case "get_storeleads": {
578
+ const { domain } = args;
579
+ data = await api("GET", `/storeleads?${new URLSearchParams({ domain })}`);
580
+ break;
581
+ }
551
582
  // ── Kanban ─────────────────────────────────────────────────────────────
552
583
  case "list_kanban_columns": {
553
584
  data = await api("GET", "/kanban/columns");
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "notifyme-csm-mcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "NotifyMe CSM — MCP server for LLM integrations (Claude Code, Cursor, etc.)",
5
+ "_versionPolicy": "The version field above is a placeholder and is NEVER updated in git. The real published version lives only on npm — run `npm view notifyme-csm-mcp version` to check. To publish a new release, use the GitHub workflow `Publish MCP` (Actions tab → Publish notifyme-csm-mcp → Run workflow). This prevents recurring merge conflicts across feature/dev/main branches that used to plague every PR.",
5
6
  "type": "module",
6
7
  "main": "dist/index.js",
7
8
  "bin": {
@@ -17,7 +18,7 @@
17
18
  "build": "tsc",
18
19
  "dev": "tsx src/index.ts",
19
20
  "start": "node dist/index.js",
20
- "prepublishOnly": "npm run build"
21
+ "prepublishOnly": "node -e \"const v=require('./package.json').version; if(v==='0.0.0-managed'){console.error('\\n❌ Refusing to publish placeholder version 0.0.0-managed.\\n Use the GitHub workflow: Actions → Publish notifyme-csm-mcp → Run workflow.\\n It will set the real version automatically.\\n'); process.exit(1)}\" && npm run build"
21
22
  },
22
23
  "dependencies": {
23
24
  "@modelcontextprotocol/sdk": "^1.29.0",