notifyme-csm-mcp 1.0.6 → 1.0.8

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 +85 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -120,7 +120,11 @@ const TOOLS = [
120
120
  leadSource: { type: "string", description: "How we found them, e.g. \"WS Vancouver 2026\"" },
121
121
  locationCity: { type: "string", description: "City" },
122
122
  locationCountry: { type: "string", description: "Country" },
123
- linkedInCompanyUrl: { type: "string", description: "LinkedIn company page URL" },
123
+ linkedInCompanyUrl: { type: "string", description: "LinkedIn COMPANY page URL" },
124
+ contactTitle: { type: "string", description: "Primary contact's job title, e.g. \"VP, E-Commerce\"" },
125
+ contactLinkedInUrl: { type: "string", description: "Primary contact's PERSONAL LinkedIn profile URL (distinct from the company page)" },
126
+ contactSource: { type: "string", description: "Where/how the contact was found, e.g. \"LinkedIn search 2026-06-10\"" },
127
+ contactVerified: { type: "boolean", description: "Whether the title/profile match was confirmed (false = unverified)" },
124
128
  },
125
129
  required: ["name", "type"],
126
130
  },
@@ -155,7 +159,7 @@ const TOOLS = [
155
159
  },
156
160
  {
157
161
  name: "update_company",
158
- description: "Update a company's priority, status, or tags. All fields are optional — only pass what you want to change.",
162
+ description: "Update any company field — identity (name, domain, website, description), pipeline (priority, status, tags, leadSource), location, LinkedIn company page, and the primary contact incl. person-level enrichment (name, email, phone, title, personal LinkedIn URL, source, verified). All fields optional — only pass what you want to change.",
159
163
  inputSchema: {
160
164
  type: "object",
161
165
  properties: {
@@ -164,6 +168,21 @@ const TOOLS = [
164
168
  status: { type: "string", enum: ["active", "inactive", "churned", "prospective", "archived"], description: "Lifecycle status (replaces the older `state` arg)." },
165
169
  state: { type: "string", description: "[Deprecated] alias for `status` — kept for back-compat. Prefer `status`." },
166
170
  tags: { type: "array", items: { type: "string" }, description: "Tags array (replaces existing)" },
171
+ name: { type: "string", description: "Company name" },
172
+ domain: { type: "string", description: "Primary domain, e.g. acme.com" },
173
+ website: { type: "string", description: "Full website URL" },
174
+ description: { type: "string", description: "Short description of the company" },
175
+ leadSource: { type: "string", description: "How we found them, e.g. \"WS Vancouver 2026\"" },
176
+ locationCity: { type: "string", description: "City" },
177
+ locationCountry: { type: "string", description: "Country" },
178
+ linkedInCompanyUrl: { type: "string", description: "LinkedIn COMPANY page URL" },
179
+ contactName: { type: "string", description: "Primary contact full name" },
180
+ contactEmail: { type: "string", description: "Primary contact email" },
181
+ contactPhone: { type: "string", description: "Primary contact phone" },
182
+ contactTitle: { type: "string", description: "Primary contact's job title, e.g. \"VP, E-Commerce\"" },
183
+ contactLinkedInUrl: { type: "string", description: "Primary contact's PERSONAL LinkedIn profile URL (distinct from the company page)" },
184
+ contactSource: { type: "string", description: "Where/how the contact was found, e.g. \"LinkedIn search 2026-06-10\"" },
185
+ contactVerified: { type: "boolean", description: "Whether the title/profile match was confirmed (false = unverified)" },
167
186
  },
168
187
  required: ["id"],
169
188
  },
@@ -388,6 +407,47 @@ const TOOLS = [
388
407
  required: ["domain"],
389
408
  },
390
409
  },
410
+ {
411
+ name: "get_funnel_entities",
412
+ 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).",
413
+ inputSchema: {
414
+ type: "object",
415
+ properties: {
416
+ entityType: {
417
+ type: "string",
418
+ enum: ["agency", "merchant", "both"],
419
+ description: "Which entities to include (default: agency).",
420
+ },
421
+ timeframe: {
422
+ type: "string",
423
+ enum: ["last7days", "last30days", "last90days", "mtd", "qtd", "ytd"],
424
+ description: "Reporting window (default: last7days).",
425
+ },
426
+ stage: {
427
+ type: "string",
428
+ description: "Funnel stage / pipeline column name (default: 'approached'). e.g. 'approached', 'meeting scheduled', 'meeting attended', 'qualified', 'won'.",
429
+ },
430
+ },
431
+ },
432
+ },
433
+ {
434
+ name: "link_merchant_to_agency",
435
+ 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.",
436
+ inputSchema: {
437
+ type: "object",
438
+ properties: {
439
+ agencyCompanyId: {
440
+ type: "number",
441
+ description: "companies.id of the agency (its type must be 'agency').",
442
+ },
443
+ merchantCompanyId: {
444
+ type: "number",
445
+ description: "companies.id of the merchant (its type must be 'merchant').",
446
+ },
447
+ },
448
+ required: ["agencyCompanyId", "merchantCompanyId"],
449
+ },
450
+ },
391
451
  // ── Kanban ────────────────────────────────────────────────────────────────
392
452
  {
393
453
  name: "list_kanban_columns",
@@ -468,8 +528,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
468
528
  break;
469
529
  }
470
530
  case "update_company": {
471
- // Accept `status` (canonical) and `state` (back-compat alias).
472
- // Server resolves precedence (status wins) and writes to companies.status.
531
+ // Full pass-through: every field create_company accepts (plus the
532
+ // person-level contact enrichment fields) is updatable. `status` is
533
+ // canonical, `state` a back-compat alias — server resolves precedence.
473
534
  const { id, ...updates } = args;
474
535
  data = await api("PATCH", `/companies/${id}`, updates);
475
536
  break;
@@ -579,6 +640,26 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
579
640
  data = await api("GET", `/storeleads?${new URLSearchParams({ domain })}`);
580
641
  break;
581
642
  }
643
+ case "get_funnel_entities": {
644
+ const a = args;
645
+ const qs = new URLSearchParams();
646
+ if (a.entityType)
647
+ qs.set("entityType", String(a.entityType));
648
+ if (a.timeframe)
649
+ qs.set("timeframe", String(a.timeframe));
650
+ if (a.stage)
651
+ qs.set("stage", String(a.stage));
652
+ data = await api("GET", `/funnel-entities?${qs.toString()}`);
653
+ break;
654
+ }
655
+ case "link_merchant_to_agency": {
656
+ const a = args;
657
+ data = await api("POST", "/agencies/link-merchant", {
658
+ agencyCompanyId: a.agencyCompanyId,
659
+ merchantCompanyId: a.merchantCompanyId,
660
+ });
661
+ break;
662
+ }
582
663
  // ── Kanban ─────────────────────────────────────────────────────────────
583
664
  case "list_kanban_columns": {
584
665
  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.6",
3
+ "version": "1.0.8",
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",