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.
- package/dist/index.js +26 -0
- 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.
|
|
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",
|