@tryparsley/mcp-server 0.1.0

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 (50) hide show
  1. package/README.md +124 -0
  2. package/dist/index.d.ts +12 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +94 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/api-client.d.ts +49 -0
  7. package/dist/lib/api-client.d.ts.map +1 -0
  8. package/dist/lib/api-client.js +113 -0
  9. package/dist/lib/api-client.js.map +1 -0
  10. package/dist/lib/types.d.ts +145 -0
  11. package/dist/lib/types.d.ts.map +1 -0
  12. package/dist/lib/types.js +6 -0
  13. package/dist/lib/types.js.map +1 -0
  14. package/dist/prompts.d.ts +11 -0
  15. package/dist/prompts.d.ts.map +1 -0
  16. package/dist/prompts.js +236 -0
  17. package/dist/prompts.js.map +1 -0
  18. package/dist/tools/get-analytics-summary.d.ts +14 -0
  19. package/dist/tools/get-analytics-summary.d.ts.map +1 -0
  20. package/dist/tools/get-analytics-summary.js +35 -0
  21. package/dist/tools/get-analytics-summary.js.map +1 -0
  22. package/dist/tools/get-conversation-detail.d.ts +14 -0
  23. package/dist/tools/get-conversation-detail.d.ts.map +1 -0
  24. package/dist/tools/get-conversation-detail.js +103 -0
  25. package/dist/tools/get-conversation-detail.js.map +1 -0
  26. package/dist/tools/get-conversations.d.ts +23 -0
  27. package/dist/tools/get-conversations.d.ts.map +1 -0
  28. package/dist/tools/get-conversations.js +37 -0
  29. package/dist/tools/get-conversations.js.map +1 -0
  30. package/dist/tools/get-hot-leads.d.ts +17 -0
  31. package/dist/tools/get-hot-leads.d.ts.map +1 -0
  32. package/dist/tools/get-hot-leads.js +53 -0
  33. package/dist/tools/get-hot-leads.js.map +1 -0
  34. package/dist/tools/get-knowledge-gaps.d.ts +20 -0
  35. package/dist/tools/get-knowledge-gaps.d.ts.map +1 -0
  36. package/dist/tools/get-knowledge-gaps.js +35 -0
  37. package/dist/tools/get-knowledge-gaps.js.map +1 -0
  38. package/dist/tools/get-lead-enrichment.d.ts +17 -0
  39. package/dist/tools/get-lead-enrichment.d.ts.map +1 -0
  40. package/dist/tools/get-lead-enrichment.js +38 -0
  41. package/dist/tools/get-lead-enrichment.js.map +1 -0
  42. package/dist/tools/get-meddic-summary.d.ts +14 -0
  43. package/dist/tools/get-meddic-summary.d.ts.map +1 -0
  44. package/dist/tools/get-meddic-summary.js +46 -0
  45. package/dist/tools/get-meddic-summary.js.map +1 -0
  46. package/dist/tools/search-by-intent.d.ts +23 -0
  47. package/dist/tools/search-by-intent.d.ts.map +1 -0
  48. package/dist/tools/search-by-intent.js +50 -0
  49. package/dist/tools/search-by-intent.js.map +1 -0
  50. package/package.json +51 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * MCP Prompts - predefined workflow templates that appear in Claude's prompt picker.
3
+ *
4
+ * Prompts instruct Claude which Parsley tools to call (and optionally which CRM
5
+ * MCP tools to cross-reference), then how to synthesise results into actionable output.
6
+ *
7
+ * Cross-MCP prompts are CRM-agnostic - they work with any CRM that has an MCP server.
8
+ */
9
+ import { z } from "zod";
10
+ export function registerPrompts(server, hasBusiness) {
11
+ // 1. Morning Briefing (cross-MCP)
12
+ server.prompt("morning_briefing", "Start your day with a summary of hot leads, intent signals, and follow-up priorities.", { days: z.string().default("7").describe("Lookback period in days") }, (args) => {
13
+ if (!hasBusiness) {
14
+ return {
15
+ messages: [
16
+ {
17
+ role: "user",
18
+ content: {
19
+ type: "text",
20
+ text: "This prompt requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
21
+ },
22
+ },
23
+ ],
24
+ };
25
+ }
26
+ const days = args.days || "7";
27
+ return {
28
+ description: "Morning briefing - hot leads and follow-up priorities",
29
+ messages: [
30
+ {
31
+ role: "user",
32
+ content: {
33
+ type: "text",
34
+ text: `Use the Parsley \`get_hot_leads\` tool to fetch hot and warm leads from the last ${days} days.
35
+
36
+ For each lead, summarise:
37
+ - Who they are (name, company if known)
38
+ - What they asked about (topics)
39
+ - Which MEDDIC signals were detected and the evidence quotes
40
+ - Their lead quality (hot/warm) and intent signal
41
+
42
+ If a CRM MCP is also connected (e.g. Attio, HubSpot, Salesforce, Copper, Pipedrive), check whether each lead has been contacted or has a recent activity in the CRM. Flag any hot or warm leads that haven't been contacted.
43
+
44
+ End with a prioritised action list: who to contact first and why, based on lead quality, MEDDIC qualification strength, and recency.`,
45
+ },
46
+ },
47
+ ],
48
+ };
49
+ });
50
+ // 2. Stale Leads Check (cross-MCP)
51
+ server.prompt("stale_leads_check", "Find hot leads that haven't been followed up in your CRM.", {
52
+ days: z
53
+ .string()
54
+ .default("3")
55
+ .describe("Leads older than this many days without CRM activity are flagged"),
56
+ }, (args) => {
57
+ if (!hasBusiness) {
58
+ return {
59
+ messages: [
60
+ {
61
+ role: "user",
62
+ content: {
63
+ type: "text",
64
+ text: "This prompt requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
65
+ },
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ const days = args.days || "3";
71
+ return {
72
+ description: "Find qualified leads with no CRM follow-up",
73
+ messages: [
74
+ {
75
+ role: "user",
76
+ content: {
77
+ type: "text",
78
+ text: `Use Parsley \`get_hot_leads\` with include_warm=true to fetch qualified leads from the last 14 days.
79
+
80
+ For each lead, use the connected CRM MCP to check the contact's last activity or last contacted date.
81
+
82
+ Flag any lead where:
83
+ (a) the lead quality is hot or warm, AND
84
+ (b) the CRM shows no activity in the last ${days} days, OR the contact doesn't exist in the CRM yet.
85
+
86
+ Present results as an urgent follow-up list. For each stale lead, include:
87
+ - Their name/company and lead quality
88
+ - What they asked about on Parsley (topics and key MEDDIC signals)
89
+ - How many days since their Parsley conversation
90
+ - CRM status (no record found, or last activity date)
91
+
92
+ If no CRM MCP is connected, explain that this prompt requires both Parsley and a CRM MCP to be connected, and suggest they check their MCP configuration.`,
93
+ },
94
+ },
95
+ ],
96
+ };
97
+ });
98
+ // 3. Coaching Gaps (Parsley only)
99
+ server.prompt("coaching_gaps", "Identify leads with MEDDIC gaps and suggest questions to fill them.", { days: z.string().default("30").describe("Lookback period in days") }, (args) => {
100
+ if (!hasBusiness) {
101
+ return {
102
+ messages: [
103
+ {
104
+ role: "user",
105
+ content: {
106
+ type: "text",
107
+ text: "This prompt requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
108
+ },
109
+ },
110
+ ],
111
+ };
112
+ }
113
+ const days = args.days || "30";
114
+ return {
115
+ description: "MEDDIC coaching brief - gaps and suggested questions",
116
+ messages: [
117
+ {
118
+ role: "user",
119
+ content: {
120
+ type: "text",
121
+ text: `Use Parsley \`get_conversations\` filtered to hot and warm leads from the last ${days} days.
122
+
123
+ For each conversation found, use \`get_conversation_detail\` to check which MEDDIC signals are detected and which are missing.
124
+
125
+ For each missing MEDDIC signal, suggest a natural follow-up question the sales rep could ask to uncover that signal. The questions should feel conversational, not interrogative.
126
+
127
+ MEDDIC signal types and what to ask:
128
+ - **Metrics**: "What does success look like for you? How would you measure the ROI?"
129
+ - **Economic Buyer**: "Who else would need to sign off on this decision?"
130
+ - **Decision Criteria**: "What are the must-haves vs nice-to-haves for your team?"
131
+ - **Decision Process**: "Walk me through your typical evaluation process - what are the steps?"
132
+ - **Identify Pain**: "What's the biggest challenge you're facing with your current setup?"
133
+ - **Champion**: "Is there someone on your team who's championing this internally?"
134
+
135
+ Format as a coaching brief:
136
+ - Lead name and company
137
+ - Current signals detected (with evidence quotes)
138
+ - Missing signals
139
+ - Suggested follow-up questions for each gap`,
140
+ },
141
+ },
142
+ ],
143
+ };
144
+ });
145
+ // 4. Content Opportunities (Parsley only)
146
+ server.prompt("content_opportunities", "What are visitors asking that you can't answer? Surface content gaps.", {
147
+ days: z.string().default("30").describe("Lookback period in days"),
148
+ limit: z.string().default("10").describe("Maximum number of gaps to analyse"),
149
+ }, (args) => {
150
+ if (!hasBusiness) {
151
+ return {
152
+ messages: [
153
+ {
154
+ role: "user",
155
+ content: {
156
+ type: "text",
157
+ text: "This prompt requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
158
+ },
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ const days = args.days || "30";
164
+ const limit = args.limit || "10";
165
+ return {
166
+ description: "Content gap analysis from unanswered chatbot questions",
167
+ messages: [
168
+ {
169
+ role: "user",
170
+ content: {
171
+ type: "text",
172
+ text: `Use Parsley \`get_knowledge_gaps\` to fetch the top ${limit} unanswered questions from the last ${days} days.
173
+
174
+ Group the results by topic. For each cluster of related questions, suggest:
175
+
176
+ 1. **Blog post title** - a blog post that would answer these questions and drive organic traffic
177
+ 2. **Chatbot knowledge doc** - a document to upload to the Parsley chatbot so it can answer these questions in future
178
+ 3. **FAQ entry** - a concise FAQ entry for the marketing site
179
+
180
+ Prioritise by frequency - the most-asked unanswered questions first. For each suggestion, explain why this content would be valuable based on the visitor questions.`,
181
+ },
182
+ },
183
+ ],
184
+ };
185
+ });
186
+ // 5. Deal Prep (optional cross-MCP)
187
+ server.prompt("deal_prep", "Brief me before a call - what has this person or company asked about?", {
188
+ company_or_name: z.string().describe("Company name or person's name to search for"),
189
+ }, (args) => {
190
+ if (!hasBusiness) {
191
+ return {
192
+ messages: [
193
+ {
194
+ role: "user",
195
+ content: {
196
+ type: "text",
197
+ text: "This prompt requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
198
+ },
199
+ },
200
+ ],
201
+ };
202
+ }
203
+ const target = args.company_or_name;
204
+ return {
205
+ description: `Pre-call briefing for ${target}`,
206
+ messages: [
207
+ {
208
+ role: "user",
209
+ content: {
210
+ type: "text",
211
+ text: `I have an upcoming call with "${target}". Help me prepare.
212
+
213
+ Use Parsley \`search_by_intent\` with topic="${target}" to find related conversations. Also use \`get_lead_enrichment\` with has_company=true to check for company matches.
214
+
215
+ For each matching conversation, use \`get_conversation_detail\` to pull the full context.
216
+
217
+ Summarise:
218
+ - **What they asked about** - topics and specific questions
219
+ - **MEDDIC signals detected** - with evidence quotes showing what they said
220
+ - **Pain points or objections** - anything that suggests concerns or blockers
221
+ - **Qualification level** - overall lead quality and intent score
222
+ - **Enrichment data** - company, role, timeline, budget context if available
223
+
224
+ If a CRM MCP is also connected, pull the deal stage, recent activity, and any notes from the CRM record.
225
+
226
+ End with:
227
+ 1. **Key talking points** for the call
228
+ 2. **Potential objections** to prepare for
229
+ 3. **Suggested next steps** based on their qualification level and gaps`,
230
+ },
231
+ },
232
+ ],
233
+ };
234
+ });
235
+ }
236
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../lib/api-client.js";
3
+ import type { AnalyticsSummaryResponse } from "../lib/types.js";
4
+ export declare const GetAnalyticsSummarySchema: z.ZodObject<{
5
+ days: z.ZodDefault<z.ZodNumber>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ days: number;
8
+ }, {
9
+ days?: number | undefined;
10
+ }>;
11
+ export type GetAnalyticsSummaryParams = z.infer<typeof GetAnalyticsSummarySchema>;
12
+ export declare function formatAnalyticsSummary(summary: AnalyticsSummaryResponse): string;
13
+ export declare function executeGetAnalyticsSummary(client: ApiClient, params: GetAnalyticsSummaryParams): Promise<string>;
14
+ //# sourceMappingURL=get-analytics-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-analytics-summary.d.ts","sourceRoot":"","sources":["../../src/tools/get-analytics-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAE/D,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAA;AAEF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAEjF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CA2BhF;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ export const GetAnalyticsSummarySchema = z.object({
3
+ days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
4
+ });
5
+ export function formatAnalyticsSummary(summary) {
6
+ const lines = [
7
+ `# Analytics Summary (${summary.period.days} days)`,
8
+ `Period: ${summary.period.start} to ${summary.period.end}`,
9
+ "",
10
+ "## Overview",
11
+ `- Profile views: ${summary.profileViews}`,
12
+ `- Total conversations: ${summary.totalConversations}`,
13
+ `- Leads captured: ${summary.leadsCaptured}`,
14
+ `- Conversion rate: ${summary.conversionRate.toFixed(1)}%`,
15
+ `- Knowledge gap rate: ${summary.knowledgeGapRate.toFixed(1)}%`,
16
+ "",
17
+ "## Lead Quality Breakdown",
18
+ `- Hot: ${summary.hotLeads}`,
19
+ `- Warm: ${summary.warmLeads}`,
20
+ `- Cold: ${summary.coldLeads}`,
21
+ ];
22
+ if (summary.topTopics.length > 0) {
23
+ lines.push("");
24
+ lines.push("## Top Topics");
25
+ for (const topic of summary.topTopics) {
26
+ lines.push(`- ${topic.topic}: ${topic.count} (${topic.percentage.toFixed(0)}%)`);
27
+ }
28
+ }
29
+ return lines.join("\n");
30
+ }
31
+ export async function executeGetAnalyticsSummary(client, params) {
32
+ const summary = await client.getAnalyticsSummary(params);
33
+ return formatAnalyticsSummary(summary);
34
+ }
35
+ //# sourceMappingURL=get-analytics-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-analytics-summary.js","sourceRoot":"","sources":["../../src/tools/get-analytics-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACjF,CAAC,CAAA;AAIF,MAAM,UAAU,sBAAsB,CAAC,OAAiC;IACtE,MAAM,KAAK,GAAa;QACtB,wBAAwB,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ;QACnD,WAAW,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAC1D,EAAE;QACF,aAAa;QACb,oBAAoB,OAAO,CAAC,YAAY,EAAE;QAC1C,0BAA0B,OAAO,CAAC,kBAAkB,EAAE;QACtD,qBAAqB,OAAO,CAAC,aAAa,EAAE;QAC5C,sBAAsB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC1D,yBAAyB,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC/D,EAAE;QACF,2BAA2B;QAC3B,UAAU,OAAO,CAAC,QAAQ,EAAE;QAC5B,WAAW,OAAO,CAAC,SAAS,EAAE;QAC9B,WAAW,OAAO,CAAC,SAAS,EAAE;KAC/B,CAAA;IAED,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAiB,EACjB,MAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACxD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../lib/api-client.js";
3
+ import type { ConversationDetail } from "../lib/types.js";
4
+ export declare const GetConversationDetailSchema: z.ZodObject<{
5
+ conversation_id: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ conversation_id: string;
8
+ }, {
9
+ conversation_id: string;
10
+ }>;
11
+ export type GetConversationDetailParams = z.infer<typeof GetConversationDetailSchema>;
12
+ export declare function formatConversationDetail(detail: ConversationDetail): string;
13
+ export declare function executeGetConversationDetail(client: ApiClient, params: GetConversationDetailParams): Promise<string>;
14
+ //# sourceMappingURL=get-conversation-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversation-detail.d.ts","sourceRoot":"","sources":["../../src/tools/get-conversation-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,eAAO,MAAM,2BAA2B;;;;;;EAEtC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAErF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAqG3E;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ export const GetConversationDetailSchema = z.object({
3
+ conversation_id: z.string().describe("The conversation ID to retrieve"),
4
+ });
5
+ export function formatConversationDetail(detail) {
6
+ const lines = [];
7
+ // Header
8
+ const visitor = detail.visitorName || "Anonymous";
9
+ const company = detail.visitorCompany ? ` (${detail.visitorCompany})` : "";
10
+ lines.push(`# ${visitor}${company}`);
11
+ lines.push("");
12
+ // Contact info
13
+ if (detail.visitorEmail) {
14
+ lines.push(`**Email:** ${detail.visitorEmail}`);
15
+ }
16
+ lines.push(`**Date:** ${detail.date}`);
17
+ lines.push(`**Lead Quality:** ${detail.leadQuality.toUpperCase()}`);
18
+ lines.push(`**Intent:** ${detail.intentSignal} (score ${detail.intentScore}/5)`);
19
+ lines.push("");
20
+ // MEDDIC signals
21
+ const meddicLabels = {
22
+ metrics: "Metrics",
23
+ economicBuyer: "Economic Buyer",
24
+ decisionCriteria: "Decision Criteria",
25
+ decisionProcess: "Decision Process",
26
+ identifyPain: "Identify Pain",
27
+ champion: "Champion",
28
+ };
29
+ const detected = [];
30
+ const missing = [];
31
+ for (const [key, label] of Object.entries(meddicLabels)) {
32
+ const has = detail.meddicSummary[key];
33
+ if (has) {
34
+ detected.push(label);
35
+ }
36
+ else {
37
+ missing.push(label);
38
+ }
39
+ }
40
+ lines.push("## MEDDIC Qualification");
41
+ if (detected.length > 0) {
42
+ lines.push(`**Detected:** ${detected.join(", ")}`);
43
+ }
44
+ if (missing.length > 0) {
45
+ lines.push(`**Missing:** ${missing.join(", ")}`);
46
+ }
47
+ lines.push("");
48
+ // Signal evidence
49
+ if (detail.meddicSignals.length > 0) {
50
+ lines.push("### Signal Evidence");
51
+ for (const signal of detail.meddicSignals) {
52
+ const label = signal.type.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
53
+ lines.push(`- **${label}** (${signal.confidence}): "${signal.quote}"`);
54
+ }
55
+ lines.push("");
56
+ }
57
+ // Topics
58
+ if (detail.topics.length > 0) {
59
+ lines.push(`**Topics:** ${detail.topics.join(", ")}`);
60
+ lines.push("");
61
+ }
62
+ // Engagement
63
+ if (detail.engagement) {
64
+ lines.push("## Engagement");
65
+ lines.push(`- Messages: ${detail.messageCount} (${detail.engagement.visitorMessageCount} from visitor)`);
66
+ const mins = Math.round(detail.engagement.sessionDuration / 60);
67
+ lines.push(`- Duration: ${mins > 0 ? `${mins} min` : `${detail.engagement.sessionDuration}s`}`);
68
+ lines.push(`- Return visitor: ${detail.engagement.isReturnVisitor ? "Yes" : "No"}`);
69
+ lines.push("");
70
+ }
71
+ // Enrichment
72
+ if (detail.enrichment) {
73
+ const parts = [];
74
+ if (detail.enrichment.company)
75
+ parts.push(`Company: ${detail.enrichment.company}`);
76
+ if (detail.enrichment.role)
77
+ parts.push(`Role: ${detail.enrichment.role}`);
78
+ if (detail.enrichment.timeline)
79
+ parts.push(`Timeline: ${detail.enrichment.timeline}`);
80
+ if (detail.enrichment.budgetContext)
81
+ parts.push(`Budget: ${detail.enrichment.budgetContext}`);
82
+ if (parts.length > 0) {
83
+ lines.push("## Lead Enrichment");
84
+ for (const part of parts)
85
+ lines.push(`- ${part}`);
86
+ lines.push("");
87
+ }
88
+ }
89
+ // Knowledge gaps
90
+ if (detail.knowledgeGaps.length > 0) {
91
+ lines.push("## Unanswered Questions");
92
+ for (const gap of detail.knowledgeGaps) {
93
+ lines.push(`- ${gap}`);
94
+ }
95
+ lines.push("");
96
+ }
97
+ return lines.join("\n");
98
+ }
99
+ export async function executeGetConversationDetail(client, params) {
100
+ const detail = await client.getConversationDetail(params.conversation_id);
101
+ return formatConversationDetail(detail);
102
+ }
103
+ //# sourceMappingURL=get-conversation-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversation-detail.js","sourceRoot":"","sources":["../../src/tools/get-conversation-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../lib/api-client.js";
3
+ import type { ConversationSummary } from "../lib/types.js";
4
+ export declare const GetConversationsSchema: z.ZodObject<{
5
+ days: z.ZodDefault<z.ZodNumber>;
6
+ lead_quality: z.ZodOptional<z.ZodEnum<["hot", "warm", "cold"]>>;
7
+ intent_signal: z.ZodOptional<z.ZodEnum<["high_intent", "evaluation", "research", "support"]>>;
8
+ limit: z.ZodDefault<z.ZodNumber>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ days: number;
11
+ limit: number;
12
+ lead_quality?: "hot" | "warm" | "cold" | undefined;
13
+ intent_signal?: "high_intent" | "evaluation" | "research" | "support" | undefined;
14
+ }, {
15
+ days?: number | undefined;
16
+ lead_quality?: "hot" | "warm" | "cold" | undefined;
17
+ intent_signal?: "high_intent" | "evaluation" | "research" | "support" | undefined;
18
+ limit?: number | undefined;
19
+ }>;
20
+ export type GetConversationsParams = z.infer<typeof GetConversationsSchema>;
21
+ export declare function formatConversations(conversations: ConversationSummary[]): string;
22
+ export declare function executeGetConversations(client: ApiClient, params: GetConversationsParams): Promise<string>;
23
+ //# sourceMappingURL=get-conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversations.d.ts","sourceRoot":"","sources":["../../src/tools/get-conversations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAWjC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAuBhF;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ export const GetConversationsSchema = z.object({
3
+ days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
4
+ lead_quality: z
5
+ .enum(["hot", "warm", "cold"])
6
+ .optional()
7
+ .describe("Filter by lead quality: hot, warm, or cold"),
8
+ intent_signal: z
9
+ .enum(["high_intent", "evaluation", "research", "support"])
10
+ .optional()
11
+ .describe("Filter by intent signal"),
12
+ limit: z.number().min(1).max(50).default(20).describe("Maximum results to return"),
13
+ });
14
+ export function formatConversations(conversations) {
15
+ if (conversations.length === 0) {
16
+ return "No conversations found for the specified filters.";
17
+ }
18
+ const lines = [`Found ${conversations.length} conversation(s):\n`];
19
+ for (const conv of conversations) {
20
+ const visitor = conv.visitorName || "Anonymous";
21
+ const company = conv.visitorCompany ? ` (${conv.visitorCompany})` : "";
22
+ const quality = conv.leadQuality.toUpperCase();
23
+ const signals = conv.meddicSignalCount > 0 ? `${conv.meddicSignalCount} MEDDIC signals` : "no MEDDIC signals";
24
+ const topics = conv.topics.length > 0 ? conv.topics.join(", ") : "general";
25
+ lines.push(`- **${visitor}${company}** [${quality}]`);
26
+ lines.push(` Date: ${conv.date} | Intent: ${conv.intentSignal} | ${signals}`);
27
+ lines.push(` Messages: ${conv.messageCount} | Topics: ${topics}`);
28
+ lines.push(` ID: ${conv.id}`);
29
+ lines.push("");
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ export async function executeGetConversations(client, params) {
34
+ const conversations = await client.getConversations(params);
35
+ return formatConversations(conversations);
36
+ }
37
+ //# sourceMappingURL=get-conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversations.js","sourceRoot":"","sources":["../../src/tools/get-conversations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChF,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAC7B,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;SAC1D,QAAQ,EAAE;SACV,QAAQ,CAAC,yBAAyB,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACnF,CAAC,CAAA;AAIF,MAAM,UAAU,mBAAmB,CAAC,aAAoC;IACtE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,mDAAmD,CAAA;IAC5D,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,SAAS,aAAa,CAAC,MAAM,qBAAqB,CAAC,CAAA;IAE5E,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA;QAC9C,MAAM,OAAO,GACX,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAA;QAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE1E,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,GAAG,OAAO,OAAO,OAAO,GAAG,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,YAAY,MAAM,OAAO,EAAE,CAAC,CAAA;QAC9E,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,cAAc,MAAM,EAAE,CAAC,CAAA;QAClE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAiB,EACjB,MAA8B;IAE9B,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC3D,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../lib/api-client.js";
3
+ import type { HotLead } from "../lib/types.js";
4
+ export declare const GetHotLeadsSchema: z.ZodObject<{
5
+ days: z.ZodDefault<z.ZodNumber>;
6
+ include_warm: z.ZodDefault<z.ZodBoolean>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ days: number;
9
+ include_warm: boolean;
10
+ }, {
11
+ days?: number | undefined;
12
+ include_warm?: boolean | undefined;
13
+ }>;
14
+ export type GetHotLeadsParams = z.infer<typeof GetHotLeadsSchema>;
15
+ export declare function formatHotLeads(leads: HotLead[]): string;
16
+ export declare function executeGetHotLeads(client: ApiClient, params: GetHotLeadsParams): Promise<string>;
17
+ //# sourceMappingURL=get-hot-leads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-hot-leads.d.ts","sourceRoot":"","sources":["../../src/tools/get-hot-leads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAE9C,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAyBvD;AA8BD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ export const GetHotLeadsSchema = z.object({
3
+ days: z.number().min(1).max(90).default(7).describe("Lookback period in days"),
4
+ include_warm: z.boolean().default(true).describe("Include warm leads alongside hot leads"),
5
+ });
6
+ export function formatHotLeads(leads) {
7
+ if (leads.length === 0) {
8
+ return "No hot or warm leads found for the specified period.";
9
+ }
10
+ const hot = leads.filter((l) => l.leadQuality === "hot");
11
+ const warm = leads.filter((l) => l.leadQuality === "warm");
12
+ const lines = [];
13
+ if (hot.length > 0) {
14
+ lines.push(`## Hot Leads (${hot.length})\n`);
15
+ for (const lead of hot) {
16
+ lines.push(formatLead(lead));
17
+ }
18
+ }
19
+ if (warm.length > 0) {
20
+ lines.push(`## Warm Leads (${warm.length})\n`);
21
+ for (const lead of warm) {
22
+ lines.push(formatLead(lead));
23
+ }
24
+ }
25
+ return lines.join("\n");
26
+ }
27
+ function formatLead(lead) {
28
+ const visitor = lead.visitorName || "Anonymous";
29
+ const company = lead.visitorCompany ? ` (${lead.visitorCompany})` : "";
30
+ const email = lead.visitorEmail ? ` - ${lead.visitorEmail}` : "";
31
+ const topics = lead.topics.length > 0 ? lead.topics.join(", ") : "general";
32
+ const parts = [
33
+ `- **${visitor}${company}**${email}`,
34
+ ` Date: ${lead.date} | Intent: ${lead.intentSignal}`,
35
+ ` Topics: ${topics}`,
36
+ ];
37
+ if (lead.meddicSignals.length > 0) {
38
+ const signalTypes = [...new Set(lead.meddicSignals.map((s) => s.type))];
39
+ parts.push(` MEDDIC: ${signalTypes.join(", ")}`);
40
+ for (const signal of lead.meddicSignals) {
41
+ const label = signal.type.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
42
+ parts.push(` - ${label}: "${signal.quote}"`);
43
+ }
44
+ }
45
+ parts.push(` ID: ${lead.id}`);
46
+ parts.push("");
47
+ return parts.join("\n");
48
+ }
49
+ export async function executeGetHotLeads(client, params) {
50
+ const leads = await client.getHotLeads(params);
51
+ return formatHotLeads(leads);
52
+ }
53
+ //# sourceMappingURL=get-hot-leads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-hot-leads.js","sourceRoot":"","sources":["../../src/tools/get-hot-leads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ import type { ApiClient } from "../lib/api-client.js";
3
+ import type { KnowledgeGap } from "../lib/types.js";
4
+ export declare const GetKnowledgeGapsSchema: z.ZodObject<{
5
+ days: z.ZodDefault<z.ZodNumber>;
6
+ topic: z.ZodOptional<z.ZodString>;
7
+ limit: z.ZodDefault<z.ZodNumber>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ days: number;
10
+ limit: number;
11
+ topic?: string | undefined;
12
+ }, {
13
+ days?: number | undefined;
14
+ limit?: number | undefined;
15
+ topic?: string | undefined;
16
+ }>;
17
+ export type GetKnowledgeGapsParams = z.infer<typeof GetKnowledgeGapsSchema>;
18
+ export declare function formatKnowledgeGaps(gaps: KnowledgeGap[]): string;
19
+ export declare function executeGetKnowledgeGaps(client: ApiClient, params: GetKnowledgeGapsParams): Promise<string>;
20
+ //# sourceMappingURL=get-knowledge-gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-knowledge-gaps.d.ts","sourceRoot":"","sources":["../../src/tools/get-knowledge-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CA2BhE;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAGjB"}