@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.
- package/README.md +124 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +49 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +113 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/types.d.ts +145 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +6 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/prompts.d.ts +11 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +236 -0
- package/dist/prompts.js.map +1 -0
- package/dist/tools/get-analytics-summary.d.ts +14 -0
- package/dist/tools/get-analytics-summary.d.ts.map +1 -0
- package/dist/tools/get-analytics-summary.js +35 -0
- package/dist/tools/get-analytics-summary.js.map +1 -0
- package/dist/tools/get-conversation-detail.d.ts +14 -0
- package/dist/tools/get-conversation-detail.d.ts.map +1 -0
- package/dist/tools/get-conversation-detail.js +103 -0
- package/dist/tools/get-conversation-detail.js.map +1 -0
- package/dist/tools/get-conversations.d.ts +23 -0
- package/dist/tools/get-conversations.d.ts.map +1 -0
- package/dist/tools/get-conversations.js +37 -0
- package/dist/tools/get-conversations.js.map +1 -0
- package/dist/tools/get-hot-leads.d.ts +17 -0
- package/dist/tools/get-hot-leads.d.ts.map +1 -0
- package/dist/tools/get-hot-leads.js +53 -0
- package/dist/tools/get-hot-leads.js.map +1 -0
- package/dist/tools/get-knowledge-gaps.d.ts +20 -0
- package/dist/tools/get-knowledge-gaps.d.ts.map +1 -0
- package/dist/tools/get-knowledge-gaps.js +35 -0
- package/dist/tools/get-knowledge-gaps.js.map +1 -0
- package/dist/tools/get-lead-enrichment.d.ts +17 -0
- package/dist/tools/get-lead-enrichment.d.ts.map +1 -0
- package/dist/tools/get-lead-enrichment.js +38 -0
- package/dist/tools/get-lead-enrichment.js.map +1 -0
- package/dist/tools/get-meddic-summary.d.ts +14 -0
- package/dist/tools/get-meddic-summary.d.ts.map +1 -0
- package/dist/tools/get-meddic-summary.js +46 -0
- package/dist/tools/get-meddic-summary.js.map +1 -0
- package/dist/tools/search-by-intent.d.ts +23 -0
- package/dist/tools/search-by-intent.d.ts.map +1 -0
- package/dist/tools/search-by-intent.js +50 -0
- package/dist/tools/search-by-intent.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const GetKnowledgeGapsSchema = z.object({
|
|
3
|
+
days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
|
|
4
|
+
topic: z.string().optional().describe("Filter by topic keyword"),
|
|
5
|
+
limit: z.number().min(1).max(50).default(20).describe("Maximum results to return"),
|
|
6
|
+
});
|
|
7
|
+
export function formatKnowledgeGaps(gaps) {
|
|
8
|
+
if (gaps.length === 0) {
|
|
9
|
+
return "No knowledge gaps found for the specified period. Your chatbot is answering everything!";
|
|
10
|
+
}
|
|
11
|
+
const lines = [`Found ${gaps.length} unanswered question(s):\n`];
|
|
12
|
+
// Group by topic
|
|
13
|
+
const byTopic = new Map();
|
|
14
|
+
for (const gap of gaps) {
|
|
15
|
+
const topicKey = gap.topics.length > 0 ? gap.topics[0] : "Uncategorised";
|
|
16
|
+
const existing = byTopic.get(topicKey) || [];
|
|
17
|
+
existing.push(gap);
|
|
18
|
+
byTopic.set(topicKey, existing);
|
|
19
|
+
}
|
|
20
|
+
for (const [topic, topicGaps] of byTopic) {
|
|
21
|
+
lines.push(`## ${topic}\n`);
|
|
22
|
+
for (const gap of topicGaps) {
|
|
23
|
+
const freq = gap.frequency > 1 ? ` (asked ${gap.frequency}x)` : "";
|
|
24
|
+
lines.push(`- "${gap.question}"${freq}`);
|
|
25
|
+
lines.push(` Last asked: ${gap.lastAsked}`);
|
|
26
|
+
}
|
|
27
|
+
lines.push("");
|
|
28
|
+
}
|
|
29
|
+
return lines.join("\n");
|
|
30
|
+
}
|
|
31
|
+
export async function executeGetKnowledgeGaps(client, params) {
|
|
32
|
+
const gaps = await client.getKnowledgeGaps(params);
|
|
33
|
+
return formatKnowledgeGaps(gaps);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=get-knowledge-gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-knowledge-gaps.js","sourceRoot":"","sources":["../../src/tools/get-knowledge-gaps.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,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChE,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,IAAoB;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,yFAAyF,CAAA;IAClG,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,SAAS,IAAI,CAAC,MAAM,4BAA4B,CAAC,CAAA;IAE1E,iBAAiB;IACjB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAA;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAA;QACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAA;QAC3B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;YAClE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAA;YACxC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,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,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAClD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ApiClient } from "../lib/api-client.js";
|
|
3
|
+
import type { EnrichmentRecord } from "../lib/types.js";
|
|
4
|
+
export declare const GetLeadEnrichmentSchema: z.ZodObject<{
|
|
5
|
+
days: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
has_company: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
days: number;
|
|
9
|
+
has_company: boolean;
|
|
10
|
+
}, {
|
|
11
|
+
days?: number | undefined;
|
|
12
|
+
has_company?: boolean | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type GetLeadEnrichmentParams = z.infer<typeof GetLeadEnrichmentSchema>;
|
|
15
|
+
export declare function formatLeadEnrichment(records: EnrichmentRecord[]): string;
|
|
16
|
+
export declare function executeGetLeadEnrichment(client: ApiClient, params: GetLeadEnrichmentParams): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=get-lead-enrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-lead-enrichment.d.ts","sourceRoot":"","sources":["../../src/tools/get-lead-enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,eAAO,MAAM,uBAAuB;;;;;;;;;EAMlC,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CA4BxE;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const GetLeadEnrichmentSchema = z.object({
|
|
3
|
+
days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
|
|
4
|
+
has_company: z
|
|
5
|
+
.boolean()
|
|
6
|
+
.default(false)
|
|
7
|
+
.describe("Only return conversations where a company was identified"),
|
|
8
|
+
});
|
|
9
|
+
export function formatLeadEnrichment(records) {
|
|
10
|
+
if (records.length === 0) {
|
|
11
|
+
return "No enrichment data found for the specified period.";
|
|
12
|
+
}
|
|
13
|
+
const lines = [`Found ${records.length} conversation(s) with enrichment data:\n`];
|
|
14
|
+
for (const record of records) {
|
|
15
|
+
const company = record.company || "Unknown company";
|
|
16
|
+
const quality = record.leadQuality.toUpperCase();
|
|
17
|
+
lines.push(`- **${company}** [${quality}]`);
|
|
18
|
+
const details = [];
|
|
19
|
+
if (record.role)
|
|
20
|
+
details.push(`Role: ${record.role}`);
|
|
21
|
+
if (record.timeline)
|
|
22
|
+
details.push(`Timeline: ${record.timeline}`);
|
|
23
|
+
if (record.budgetContext)
|
|
24
|
+
details.push(`Budget: ${record.budgetContext}`);
|
|
25
|
+
if (details.length > 0) {
|
|
26
|
+
lines.push(` ${details.join(" | ")}`);
|
|
27
|
+
}
|
|
28
|
+
lines.push(` Date: ${record.date} | Intent: ${record.intentSignal}`);
|
|
29
|
+
lines.push(` Conversation ID: ${record.conversationId}`);
|
|
30
|
+
lines.push("");
|
|
31
|
+
}
|
|
32
|
+
return lines.join("\n");
|
|
33
|
+
}
|
|
34
|
+
export async function executeGetLeadEnrichment(client, params) {
|
|
35
|
+
const records = await client.getLeadEnrichment(params);
|
|
36
|
+
return formatLeadEnrichment(records);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=get-lead-enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-lead-enrichment.js","sourceRoot":"","sources":["../../src/tools/get-lead-enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,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,WAAW,EAAE,CAAC;SACX,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAA;AAIF,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,oDAAoD,CAAA;IAC7D,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,SAAS,OAAO,CAAC,MAAM,0CAA0C,CAAC,CAAA;IAE3F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,iBAAiB,CAAA;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA;QAEhD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,GAAG,CAAC,CAAA;QAE3C,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACrD,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjE,IAAI,MAAM,CAAC,aAAa;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;QAEzE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACxC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,YAAY,EAAE,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;QACzD,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,wBAAwB,CAC5C,MAAiB,EACjB,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACtD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ApiClient } from "../lib/api-client.js";
|
|
3
|
+
import type { MEDDICSummaryResponse } from "../lib/types.js";
|
|
4
|
+
export declare const GetMeddicSummarySchema: z.ZodObject<{
|
|
5
|
+
days: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
days: number;
|
|
8
|
+
}, {
|
|
9
|
+
days?: number | undefined;
|
|
10
|
+
}>;
|
|
11
|
+
export type GetMeddicSummaryParams = z.infer<typeof GetMeddicSummarySchema>;
|
|
12
|
+
export declare function formatMeddicSummary(summary: MEDDICSummaryResponse): string;
|
|
13
|
+
export declare function executeGetMeddicSummary(client: ApiClient, params: GetMeddicSummaryParams): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=get-meddic-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-meddic-summary.d.ts","sourceRoot":"","sources":["../../src/tools/get-meddic-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,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAE5D,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAW3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAqC1E;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const GetMeddicSummarySchema = z.object({
|
|
3
|
+
days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
|
|
4
|
+
});
|
|
5
|
+
const SIGNAL_LABELS = {
|
|
6
|
+
metrics: "Metrics",
|
|
7
|
+
economic_buyer: "Economic Buyer",
|
|
8
|
+
decision_criteria: "Decision Criteria",
|
|
9
|
+
decision_process: "Decision Process",
|
|
10
|
+
identify_pain: "Identify Pain",
|
|
11
|
+
champion: "Champion",
|
|
12
|
+
};
|
|
13
|
+
export function formatMeddicSummary(summary) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
lines.push("# MEDDIC Signal Distribution\n");
|
|
16
|
+
lines.push(`**Period:** ${summary.period.start} to ${summary.period.end} (${summary.period.days} days)`);
|
|
17
|
+
lines.push(`**Total conversations:** ${summary.totalConversations}`);
|
|
18
|
+
lines.push(`**Qualified (2+ signals):** ${summary.qualifiedCount} (${summary.qualifiedPercentage}%)\n`);
|
|
19
|
+
// Signal breakdown
|
|
20
|
+
lines.push("## Per-Signal Breakdown\n");
|
|
21
|
+
lines.push("| Signal | Count | % of Conversations |");
|
|
22
|
+
lines.push("|--------|-------|--------------------|");
|
|
23
|
+
for (const signal of summary.signals) {
|
|
24
|
+
const label = SIGNAL_LABELS[signal.signal] || signal.signal;
|
|
25
|
+
lines.push(`| ${label} | ${signal.count} | ${signal.percentage}% |`);
|
|
26
|
+
}
|
|
27
|
+
lines.push("");
|
|
28
|
+
// Top combinations
|
|
29
|
+
if (summary.topCombinations.length > 0) {
|
|
30
|
+
lines.push("## Top Signal Combinations\n");
|
|
31
|
+
for (const combo of summary.topCombinations) {
|
|
32
|
+
const labels = combo.combination
|
|
33
|
+
.split(" + ")
|
|
34
|
+
.map((s) => SIGNAL_LABELS[s] || s)
|
|
35
|
+
.join(" + ");
|
|
36
|
+
lines.push(`- ${labels} (${combo.count}x)`);
|
|
37
|
+
}
|
|
38
|
+
lines.push("");
|
|
39
|
+
}
|
|
40
|
+
return lines.join("\n");
|
|
41
|
+
}
|
|
42
|
+
export async function executeGetMeddicSummary(client, params) {
|
|
43
|
+
const summary = await client.getMeddicSummary(params);
|
|
44
|
+
return formatMeddicSummary(summary);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=get-meddic-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-meddic-summary.js","sourceRoot":"","sources":["../../src/tools/get-meddic-summary.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;CACjF,CAAC,CAAA;AAIF,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,gBAAgB;IAChC,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,kBAAkB;IACpC,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,CACR,eAAe,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAC7F,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACpE,KAAK,CAAC,IAAI,CACR,+BAA+B,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,mBAAmB,MAAM,CAC5F,CAAA;IAED,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACvC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IACrD,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IAErD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;QAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,UAAU,KAAK,CAAC,CAAA;IACtE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,mBAAmB;IACnB,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW;iBAC7B,KAAK,CAAC,KAAK,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACjC,IAAI,CAAC,KAAK,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,CAAA;QAC7C,CAAC;QACD,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,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACrD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ApiClient } from "../lib/api-client.js";
|
|
3
|
+
import type { SearchResult } from "../lib/types.js";
|
|
4
|
+
export declare const SearchByIntentSchema: z.ZodObject<{
|
|
5
|
+
meddic_signals: z.ZodOptional<z.ZodArray<z.ZodEnum<["metrics", "economic_buyer", "decision_criteria", "decision_process", "identify_pain", "champion"]>, "many">>;
|
|
6
|
+
min_intent_score: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
topic: z.ZodOptional<z.ZodString>;
|
|
8
|
+
days: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
days: number;
|
|
11
|
+
min_intent_score?: number | undefined;
|
|
12
|
+
topic?: string | undefined;
|
|
13
|
+
meddic_signals?: ("metrics" | "economic_buyer" | "decision_criteria" | "decision_process" | "identify_pain" | "champion")[] | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
days?: number | undefined;
|
|
16
|
+
min_intent_score?: number | undefined;
|
|
17
|
+
topic?: string | undefined;
|
|
18
|
+
meddic_signals?: ("metrics" | "economic_buyer" | "decision_criteria" | "decision_process" | "identify_pain" | "champion")[] | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type SearchByIntentParams = z.infer<typeof SearchByIntentSchema>;
|
|
21
|
+
export declare function formatSearchResults(results: SearchResult[]): string;
|
|
22
|
+
export declare function executeSearchByIntent(client: ApiClient, params: SearchByIntentParams): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=search-by-intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-by-intent.d.ts","sourceRoot":"","sources":["../../src/tools/search-by-intent.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,oBAAoB;;;;;;;;;;;;;;;EAiB/B,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEvE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAuCnE;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SearchByIntentSchema = z.object({
|
|
3
|
+
meddic_signals: z
|
|
4
|
+
.array(z.enum([
|
|
5
|
+
"metrics",
|
|
6
|
+
"economic_buyer",
|
|
7
|
+
"decision_criteria",
|
|
8
|
+
"decision_process",
|
|
9
|
+
"identify_pain",
|
|
10
|
+
"champion",
|
|
11
|
+
]))
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("MEDDIC signal types to require, e.g. ['economic_buyer', 'identify_pain']"),
|
|
14
|
+
min_intent_score: z.number().min(1).max(5).optional().describe("Minimum intent score (1-5)"),
|
|
15
|
+
topic: z.string().optional().describe("Filter by topic keyword"),
|
|
16
|
+
days: z.number().min(1).max(365).default(30).describe("Lookback period in days"),
|
|
17
|
+
});
|
|
18
|
+
export function formatSearchResults(results) {
|
|
19
|
+
if (results.length === 0) {
|
|
20
|
+
return "No conversations match the specified intent criteria.";
|
|
21
|
+
}
|
|
22
|
+
const lines = [`Found ${results.length} matching conversation(s):\n`];
|
|
23
|
+
for (const result of results) {
|
|
24
|
+
const visitor = result.visitorName || "Anonymous";
|
|
25
|
+
const company = result.visitorCompany ? ` (${result.visitorCompany})` : "";
|
|
26
|
+
const quality = result.leadQuality.toUpperCase();
|
|
27
|
+
lines.push(`- **${visitor}${company}** [${quality}]`);
|
|
28
|
+
lines.push(` Date: ${result.date} | Intent: ${result.intentSignal} (score ${result.intentScore}/5)`);
|
|
29
|
+
lines.push(` Messages: ${result.messageCount} | Topics: ${result.topics.join(", ") || "general"}`);
|
|
30
|
+
if (result.matchedCriteria.length > 0) {
|
|
31
|
+
lines.push(` Matched: ${result.matchedCriteria.join("; ")}`);
|
|
32
|
+
}
|
|
33
|
+
if (result.meddicSignals.length > 0) {
|
|
34
|
+
const signalTypes = [...new Set(result.meddicSignals.map((s) => s.type))];
|
|
35
|
+
lines.push(` MEDDIC: ${signalTypes.join(", ")}`);
|
|
36
|
+
for (const signal of result.meddicSignals) {
|
|
37
|
+
const label = signal.type.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
38
|
+
lines.push(` - ${label}: "${signal.quote}"`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
lines.push(` ID: ${result.id}`);
|
|
42
|
+
lines.push("");
|
|
43
|
+
}
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
export async function executeSearchByIntent(client, params) {
|
|
47
|
+
const results = await client.searchByIntent(params);
|
|
48
|
+
return formatSearchResults(results);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=search-by-intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-by-intent.js","sourceRoot":"","sources":["../../src/tools/search-by-intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,cAAc,EAAE,CAAC;SACd,KAAK,CACJ,CAAC,CAAC,IAAI,CAAC;QACL,SAAS;QACT,gBAAgB;QAChB,mBAAmB;QACnB,kBAAkB;QAClB,eAAe;QACf,UAAU;KACX,CAAC,CACH;SACA,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC5F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChE,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,mBAAmB,CAAC,OAAuB;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,uDAAuD,CAAA;IAChE,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,SAAS,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAA;IAE/E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,WAAW,CAAA;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA;QAEhD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,GAAG,OAAO,OAAO,OAAO,GAAG,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CACR,WAAW,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,YAAY,WAAW,MAAM,CAAC,WAAW,KAAK,CAC1F,CAAA;QACD,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,YAAY,cAAc,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CACxF,CAAA;QAED,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACzE,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAEjD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;gBACrF,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QAChC,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,qBAAqB,CACzC,MAAiB,EACjB,MAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IACnD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tryparsley/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"mcpName": "io.github.peterjduffy/parsley",
|
|
5
|
+
"description": "Parsley MCP Server - buyer intent signals for AI assistants",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"parsley-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"parsley",
|
|
25
|
+
"buyer-intent",
|
|
26
|
+
"lead-intelligence",
|
|
27
|
+
"sales",
|
|
28
|
+
"meddic",
|
|
29
|
+
"ai-assistant",
|
|
30
|
+
"claude"
|
|
31
|
+
],
|
|
32
|
+
"author": "Parsley <hello@parsley.id>",
|
|
33
|
+
"homepage": "https://www.parsley.id/mcp",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/nicepeterduffy/parsley",
|
|
37
|
+
"directory": "mcp-server"
|
|
38
|
+
},
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
45
|
+
"zod": "^3.24.4"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^20.17.0",
|
|
49
|
+
"typescript": "^5.7.0"
|
|
50
|
+
}
|
|
51
|
+
}
|