notifyme-csm-mcp 1.0.13 → 1.0.15

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 +26 -0
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -465,6 +465,7 @@ const TOOLS = [
465
465
  endDate: { type: "string", description: "YYYY-MM-DD inclusive; passing dates implies timeframe=custom (server-TZ)." },
466
466
  channel: { type: "string", enum: ["email", "linkedin", "call", "whatsapp", "other"], description: "Narrow approached+replied to one channel." },
467
467
  tags: { type: "array", items: { type: "string" }, description: "Only companies carrying ALL of these tags." },
468
+ targetUniverseSize: { type: "number", description: "Optional: size of the addressable target universe (e.g. Shopify Plus stores). When provided, totalCoverage.generationCoveragePct = totalLeadsGenerated / targetUniverseSize." },
468
469
  },
469
470
  },
470
471
  },
@@ -527,6 +528,25 @@ const TOOLS = [
527
528
  required: ["companyId", "channel"],
528
529
  },
529
530
  },
531
+ {
532
+ name: "record_outreach_send",
533
+ description: "Log an outreach send as ONE write-through: resolve the recipient email to a company — creating a PROVISIONAL company (needsVerification=true) if the recipient is unknown — log the first-message body, ADD the campaign reason (does NOT replace existing reasons), and advance the company's pipeline stage Backlog → Approached. Use this when an outreach email is drafted/sent so the CRM reflects it without manual create_company/log_outreach/move_to_column steps. Idempotent per recipient: a repeat send resolves to the same company and won't duplicate the reason or create a second company.",
534
+ inputSchema: {
535
+ type: "object",
536
+ properties: {
537
+ recipientEmail: { type: "string", description: "Recipient's email address — the dedup key (resolves an existing company or mints a provisional one)" },
538
+ recipientDomain: { type: "string", description: "Recipient domain, used when minting a provisional company (defaults to the email's domain)" },
539
+ subject: { type: "string", description: "Email subject — the first message" },
540
+ body: { type: "string", description: "Email body — the first message. Stored in the CRM, NOT sent." },
541
+ reasonKey: { type: "string", description: "Why this company is in the CRM, e.g. \"customer_success\" or \"case_study\". Must be an active reason key." },
542
+ defaultType: { type: "string", enum: ["agency", "merchant", "app_partner", "technology_partner", "media", "investor", "other"], description: "Company type to use IF a provisional company is created (default: merchant)" },
543
+ companyName: { type: "string", description: "Best-known name for a provisional company. Never stored blank; derived from the domain if omitted." },
544
+ channel: { type: "string", enum: ["email_sent", "phone_call", "linkedin_outreach"], description: "Outreach channel (default: email_sent)" },
545
+ actorId: { type: "number", description: "Who/what sent it. Omit to attribute to the CSM Automation service account (keeps the teammate digest quiet on batch runs)." },
546
+ },
547
+ required: ["recipientEmail", "subject", "body", "reasonKey"],
548
+ },
549
+ },
530
550
  {
531
551
  name: "list_outreach",
532
552
  description: "List a company's logged outreach touches (calls, WhatsApp, etc.), most recent first.",
@@ -768,6 +788,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
768
788
  qs.set("channel", String(a.channel));
769
789
  if (a.tags?.length)
770
790
  qs.set("tags", a.tags.join(","));
791
+ if (a.targetUniverseSize)
792
+ qs.set("targetUniverseSize", String(a.targetUniverseSize));
771
793
  data = await api("GET", `/funnel-rates?${qs.toString()}`);
772
794
  break;
773
795
  }
@@ -794,6 +816,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
794
816
  data = await api("POST", "/outreach", a);
795
817
  break;
796
818
  }
819
+ case "record_outreach_send": {
820
+ data = await api("POST", "/outreach/record", args);
821
+ break;
822
+ }
797
823
  case "list_outreach": {
798
824
  const { companyId, limit } = args;
799
825
  const qs = new URLSearchParams();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "notifyme-csm-mcp",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
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",