notifyme-csm-mcp 1.0.5 → 1.0.7
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.
- package/dist/index.js +100 -8
- package/package.json +1 -1
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 /
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,62 @@ 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
|
+
},
|
|
391
|
+
{
|
|
392
|
+
name: "get_funnel_entities",
|
|
393
|
+
description: "List the actual companies behind a Reports funnel stage count — e.g. which agencies were 'Approached' in the last 7 days (the number you see on Reports → Funnel View). 'Approached' = received an email, LinkedIn outreach, Gmail thread, or note in the window. Returns each company's name, id, and type, and the total count (which matches the funnel).",
|
|
394
|
+
inputSchema: {
|
|
395
|
+
type: "object",
|
|
396
|
+
properties: {
|
|
397
|
+
entityType: {
|
|
398
|
+
type: "string",
|
|
399
|
+
enum: ["agency", "merchant", "both"],
|
|
400
|
+
description: "Which entities to include (default: agency).",
|
|
401
|
+
},
|
|
402
|
+
timeframe: {
|
|
403
|
+
type: "string",
|
|
404
|
+
enum: ["last7days", "last30days", "last90days", "mtd", "qtd", "ytd"],
|
|
405
|
+
description: "Reporting window (default: last7days).",
|
|
406
|
+
},
|
|
407
|
+
stage: {
|
|
408
|
+
type: "string",
|
|
409
|
+
description: "Funnel stage / pipeline column name (default: 'approached'). e.g. 'approached', 'meeting scheduled', 'meeting attended', 'qualified', 'won'.",
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
name: "link_merchant_to_agency",
|
|
416
|
+
description: "Link a merchant to an agency (create the agency→merchant 'manages' pair) so the merchant rolls up under that agency in Agency Analytics. Look up both ids first with search_companies / list_companies. Idempotent; a merchant's existing managing-agency link is replaced. An agency only appears in analytics once it manages at least one merchant.",
|
|
417
|
+
inputSchema: {
|
|
418
|
+
type: "object",
|
|
419
|
+
properties: {
|
|
420
|
+
agencyCompanyId: {
|
|
421
|
+
type: "number",
|
|
422
|
+
description: "companies.id of the agency (its type must be 'agency').",
|
|
423
|
+
},
|
|
424
|
+
merchantCompanyId: {
|
|
425
|
+
type: "number",
|
|
426
|
+
description: "companies.id of the merchant (its type must be 'merchant').",
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
required: ["agencyCompanyId", "merchantCompanyId"],
|
|
430
|
+
},
|
|
431
|
+
},
|
|
371
432
|
// ── Kanban ────────────────────────────────────────────────────────────────
|
|
372
433
|
{
|
|
373
434
|
name: "list_kanban_columns",
|
|
@@ -412,12 +473,15 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
412
473
|
break;
|
|
413
474
|
}
|
|
414
475
|
case "list_companies": {
|
|
415
|
-
const { type, stage, priority, tag, no_outreach, limit } = args;
|
|
476
|
+
const { type, status, stage, priority, tag, no_outreach, limit } = args;
|
|
416
477
|
const params = new URLSearchParams();
|
|
417
478
|
if (type)
|
|
418
479
|
params.set("type", type);
|
|
419
|
-
|
|
420
|
-
|
|
480
|
+
// `status` is canonical; `stage` is a back-compat alias. The server
|
|
481
|
+
// accepts both and prefers `status`; pass whichever was provided.
|
|
482
|
+
const effectiveStatus = status ?? stage;
|
|
483
|
+
if (effectiveStatus)
|
|
484
|
+
params.set("status", effectiveStatus);
|
|
421
485
|
if (priority)
|
|
422
486
|
params.set("priority", priority);
|
|
423
487
|
if (tag)
|
|
@@ -445,6 +509,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
445
509
|
break;
|
|
446
510
|
}
|
|
447
511
|
case "update_company": {
|
|
512
|
+
// Accept `status` (canonical) and `state` (back-compat alias).
|
|
513
|
+
// Server resolves precedence (status wins) and writes to companies.status.
|
|
448
514
|
const { id, ...updates } = args;
|
|
449
515
|
data = await api("PATCH", `/companies/${id}`, updates);
|
|
450
516
|
break;
|
|
@@ -548,6 +614,32 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
548
614
|
data = await api("GET", "/stats");
|
|
549
615
|
break;
|
|
550
616
|
}
|
|
617
|
+
// ── StoreLeads ─────────────────────────────────────────────────────────
|
|
618
|
+
case "get_storeleads": {
|
|
619
|
+
const { domain } = args;
|
|
620
|
+
data = await api("GET", `/storeleads?${new URLSearchParams({ domain })}`);
|
|
621
|
+
break;
|
|
622
|
+
}
|
|
623
|
+
case "get_funnel_entities": {
|
|
624
|
+
const a = args;
|
|
625
|
+
const qs = new URLSearchParams();
|
|
626
|
+
if (a.entityType)
|
|
627
|
+
qs.set("entityType", String(a.entityType));
|
|
628
|
+
if (a.timeframe)
|
|
629
|
+
qs.set("timeframe", String(a.timeframe));
|
|
630
|
+
if (a.stage)
|
|
631
|
+
qs.set("stage", String(a.stage));
|
|
632
|
+
data = await api("GET", `/funnel-entities?${qs.toString()}`);
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
case "link_merchant_to_agency": {
|
|
636
|
+
const a = args;
|
|
637
|
+
data = await api("POST", "/agencies/link-merchant", {
|
|
638
|
+
agencyCompanyId: a.agencyCompanyId,
|
|
639
|
+
merchantCompanyId: a.merchantCompanyId,
|
|
640
|
+
});
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
551
643
|
// ── Kanban ─────────────────────────────────────────────────────────────
|
|
552
644
|
case "list_kanban_columns": {
|
|
553
645
|
data = await api("GET", "/kanban/columns");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "notifyme-csm-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "NotifyMe CSM — MCP server for LLM integrations (Claude Code, Cursor, etc.)",
|
|
5
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.",
|
|
6
6
|
"type": "module",
|