@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
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # Parsley MCP Server
2
+
3
+ A [Model Context Protocol](https://modelcontextprotocol.io/) server that exposes buyer intent signals, MEDDIC qualification data, and lead intelligence from your [Parsley](https://www.parsley.id) account to AI assistants like Claude Desktop and Cursor.
4
+
5
+ ## What it does
6
+
7
+ Ask your AI assistant natural questions about your leads:
8
+
9
+ - "Which leads went hot this week?"
10
+ - "Show me the MEDDIC gaps for recent conversations"
11
+ - "Any high-intent visitors that nobody's followed up on?"
12
+ - "What are people asking that my chatbot can't answer?"
13
+
14
+ If you also have a CRM MCP connected (Attio, HubSpot, Salesforce, etc.), Claude can cross-reference automatically - finding hot leads with no CRM follow-up, prepping you for calls with full context from both systems.
15
+
16
+ ## Setup
17
+
18
+ ### 1. Get your API key
19
+
20
+ Generate an API key at [parsley.id/hub/api-keys](https://www.parsley.id/hub/api-keys). You need a Parsley account with the chatbot enabled.
21
+
22
+ ### 2. Configure Claude Desktop
23
+
24
+ Add to your Claude Desktop config file:
25
+
26
+ **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
27
+ **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "parsley": {
33
+ "command": "npx",
34
+ "args": ["-y", "@parsley/mcp-server"],
35
+ "env": {
36
+ "PARSLEY_API_KEY": "pk_live_your_key_here"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ### 3. Configure Cursor
44
+
45
+ Add to your Cursor MCP settings (`.cursor/mcp.json`):
46
+
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "parsley": {
51
+ "command": "npx",
52
+ "args": ["-y", "@parsley/mcp-server"],
53
+ "env": {
54
+ "PARSLEY_API_KEY": "pk_live_your_key_here"
55
+ }
56
+ }
57
+ }
58
+ }
59
+ ```
60
+
61
+ ### Environment variables
62
+
63
+ | Variable | Required | Description |
64
+ | ------------------ | -------- | --------------------------------------------------- |
65
+ | `PARSLEY_API_KEY` | Yes | Your Parsley API key (`pk_live_...`) |
66
+ | `PARSLEY_BASE_URL` | No | API base URL (defaults to `https://www.parsley.id`) |
67
+
68
+ ## Tools (8)
69
+
70
+ ### Free tier
71
+
72
+ | Tool | Description |
73
+ | ----------------------- | ------------------------------------------------------------------------------------------------------ |
74
+ | `get_analytics_summary` | Dashboard overview - profile views, conversations, lead quality breakdown, top topics, conversion rate |
75
+
76
+ ### Business tier
77
+
78
+ | Tool | Description |
79
+ | ------------------------- | -------------------------------------------------------------------------------------- |
80
+ | `get_conversations` | List recent conversations with filtering by lead quality, intent signal, date range |
81
+ | `get_conversation_detail` | Full conversation detail - MEDDIC signals with evidence quotes, engagement, enrichment |
82
+ | `get_hot_leads` | Hot and warm leads with MEDDIC evidence - the morning briefing tool |
83
+ | `search_by_intent` | Find conversations by MEDDIC signals, intent score, or topic |
84
+ | `get_knowledge_gaps` | Unanswered chatbot questions grouped by topic and frequency |
85
+ | `get_lead_enrichment` | Extracted company, role, timeline, and budget context from conversations |
86
+ | `get_meddic_summary` | Aggregate MEDDIC signal distribution - per-signal counts, top combinations |
87
+
88
+ ## Prompts (5)
89
+
90
+ Predefined workflow templates that appear in Claude's prompt picker.
91
+
92
+ | Prompt | Cross-MCP | Description |
93
+ | ----------------------- | --------- | ------------------------------------------------------------------------------- |
94
+ | `morning_briefing` | Yes | Hot leads summary with follow-up priorities. Cross-references CRM if connected. |
95
+ | `stale_leads_check` | Yes | Qualified leads with no recent CRM activity. Requires a CRM MCP. |
96
+ | `coaching_gaps` | No | MEDDIC gaps with suggested follow-up questions for each lead. |
97
+ | `content_opportunities` | No | Knowledge gaps turned into blog post, chatbot doc, and FAQ suggestions. |
98
+ | `deal_prep` | Optional | Pre-call briefing on a company/person. Pulls CRM context if available. |
99
+
100
+ ### Cross-MCP workflows
101
+
102
+ Prompts marked "Cross-MCP" work with any CRM that has an MCP server. Connect both Parsley and your CRM's MCP to Claude, and the prompts will orchestrate across both automatically. No extra configuration needed.
103
+
104
+ Tested with: Attio, HubSpot, Salesforce, Copper, Pipedrive.
105
+
106
+ ## Tier gating
107
+
108
+ - **Free plan:** `get_analytics_summary` tool only
109
+ - **Business plan:** All 8 tools + all 5 prompts
110
+
111
+ Upgrade at [parsley.id/pricing](https://www.parsley.id/pricing).
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ cd mcp-server
117
+ npm install
118
+ npm run build
119
+ PARSLEY_API_KEY=pk_live_xxx node dist/index.js
120
+ ```
121
+
122
+ ## License
123
+
124
+ MIT
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Parsley MCP Server
4
+ *
5
+ * Exposes buyer intent signals, MEDDIC qualification data, and lead
6
+ * intelligence from Parsley to AI assistants via the Model Context Protocol.
7
+ *
8
+ * Architecture: Option B - calls Parsley API routes over HTTPS.
9
+ * Auth: API key passed via PARSLEY_API_KEY env var.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/index.js ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Parsley MCP Server
4
+ *
5
+ * Exposes buyer intent signals, MEDDIC qualification data, and lead
6
+ * intelligence from Parsley to AI assistants via the Model Context Protocol.
7
+ *
8
+ * Architecture: Option B - calls Parsley API routes over HTTPS.
9
+ * Auth: API key passed via PARSLEY_API_KEY env var.
10
+ */
11
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { ApiClient, ApiError } from "./lib/api-client.js";
14
+ import { GetConversationsSchema, executeGetConversations } from "./tools/get-conversations.js";
15
+ import { GetConversationDetailSchema, executeGetConversationDetail, } from "./tools/get-conversation-detail.js";
16
+ import { GetHotLeadsSchema, executeGetHotLeads } from "./tools/get-hot-leads.js";
17
+ import { GetAnalyticsSummarySchema, executeGetAnalyticsSummary, } from "./tools/get-analytics-summary.js";
18
+ import { SearchByIntentSchema, executeSearchByIntent } from "./tools/search-by-intent.js";
19
+ import { GetKnowledgeGapsSchema, executeGetKnowledgeGaps } from "./tools/get-knowledge-gaps.js";
20
+ import { GetLeadEnrichmentSchema, executeGetLeadEnrichment } from "./tools/get-lead-enrichment.js";
21
+ import { GetMeddicSummarySchema, executeGetMeddicSummary } from "./tools/get-meddic-summary.js";
22
+ import { registerPrompts } from "./prompts.js";
23
+ // Read config from environment
24
+ const apiKey = process.env.PARSLEY_API_KEY;
25
+ const baseUrl = process.env.PARSLEY_BASE_URL; // Optional, defaults to https://www.parsley.id
26
+ if (!apiKey) {
27
+ console.error("Error: PARSLEY_API_KEY environment variable is required.\n" +
28
+ "Generate one at https://www.parsley.id/hub/api-keys");
29
+ process.exit(1);
30
+ }
31
+ const client = new ApiClient(apiKey, baseUrl);
32
+ // Validate the API key on startup by calling /api/v1/me
33
+ let hasBusiness = false;
34
+ try {
35
+ const meResponse = await fetch(`${(baseUrl || "https://www.parsley.id").replace(/\/$/, "")}/api/v1/me`, {
36
+ headers: { "X-API-Key": apiKey, Accept: "application/json" },
37
+ });
38
+ if (!meResponse.ok) {
39
+ console.error("Error: Invalid or revoked API key.");
40
+ process.exit(1);
41
+ }
42
+ const me = (await meResponse.json());
43
+ hasBusiness = me.tier === "business" || me.tier === "enterprise";
44
+ }
45
+ catch (err) {
46
+ console.error("Error: Could not connect to Parsley API.", err);
47
+ process.exit(1);
48
+ }
49
+ // Create MCP server
50
+ const server = new McpServer({
51
+ name: "parsley",
52
+ version: "0.1.0",
53
+ });
54
+ // Helper: wrap tool execution with error handling
55
+ function wrapTool(fn, requiresBusiness) {
56
+ return async (params) => {
57
+ if (requiresBusiness && !hasBusiness) {
58
+ return {
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: "This tool requires a Parsley Business plan. Upgrade at https://www.parsley.id/pricing",
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ try {
68
+ const text = await fn(client, params);
69
+ return { content: [{ type: "text", text }] };
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof ApiError
73
+ ? `API error (${err.status}): ${err.message}`
74
+ : `Error: ${err instanceof Error ? err.message : String(err)}`;
75
+ return { content: [{ type: "text", text: message }] };
76
+ }
77
+ };
78
+ }
79
+ // Register tools
80
+ server.tool("get_conversations", "List recent chatbot conversations with filtering by lead quality, intent signal, and date range. Returns visitor info, lead quality, intent signals, MEDDIC signal count, and topics.", GetConversationsSchema.shape, wrapTool(executeGetConversations, true));
81
+ server.tool("get_conversation_detail", "Get full details of a single conversation including all MEDDIC signals with evidence quotes, engagement metrics, lead enrichment data, and unanswered questions.", GetConversationDetailSchema.shape, wrapTool(executeGetConversationDetail, true));
82
+ server.tool("get_hot_leads", "Get all hot and warm leads with MEDDIC evidence. The morning briefing tool - shows who is showing buying intent and what they asked about.", GetHotLeadsSchema.shape, wrapTool(executeGetHotLeads, true));
83
+ server.tool("get_analytics_summary", "Dashboard-level overview: profile views, conversation counts, lead quality breakdown, top topics, conversion rate, and knowledge gap rate.", GetAnalyticsSummarySchema.shape, wrapTool(executeGetAnalyticsSummary, false) // Free tier has access
84
+ );
85
+ server.tool("search_by_intent", "Find conversations matching specific intent criteria: MEDDIC signals, minimum intent score, and topic. Returns matching conversations with relevance context.", SearchByIntentSchema.shape, wrapTool(executeSearchByIntent, true));
86
+ server.tool("get_knowledge_gaps", "Surface unanswered questions from chatbot conversations, grouped by topic and sorted by frequency. Content strategy gold - shows what visitors are asking that you can't answer yet.", GetKnowledgeGapsSchema.shape, wrapTool(executeGetKnowledgeGaps, true));
87
+ server.tool("get_lead_enrichment", "Get extracted company, role, timeline, and budget context from conversations. Filter to conversations with identified companies.", GetLeadEnrichmentSchema.shape, wrapTool(executeGetLeadEnrichment, true));
88
+ server.tool("get_meddic_summary", "Aggregate MEDDIC signal distribution across all conversations. Shows per-signal counts, percentages, top signal combinations, and total qualified leads (2+ signals).", GetMeddicSummarySchema.shape, wrapTool(executeGetMeddicSummary, true));
89
+ // Register prompts
90
+ registerPrompts(server, hasBusiness);
91
+ // Start server
92
+ const transport = new StdioServerTransport();
93
+ await server.connect(transport);
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * HTTP client for Parsley API routes.
3
+ * The MCP server calls these endpoints over HTTPS rather than
4
+ * accessing Firestore directly (Option B architecture).
5
+ */
6
+ import type { ConversationSummary, ConversationDetail, HotLead, AnalyticsSummaryResponse, SearchResult, KnowledgeGap, EnrichmentRecord, MEDDICSummaryResponse } from "./types.js";
7
+ export declare class ApiClient {
8
+ private baseUrl;
9
+ private apiKey;
10
+ constructor(apiKey: string, baseUrl?: string);
11
+ private request;
12
+ getConversations(params: {
13
+ days?: number;
14
+ lead_quality?: string;
15
+ intent_signal?: string;
16
+ limit?: number;
17
+ }): Promise<ConversationSummary[]>;
18
+ getConversationDetail(conversationId: string): Promise<ConversationDetail>;
19
+ getHotLeads(params: {
20
+ days?: number;
21
+ include_warm?: boolean;
22
+ }): Promise<HotLead[]>;
23
+ getAnalyticsSummary(params: {
24
+ days?: number;
25
+ }): Promise<AnalyticsSummaryResponse>;
26
+ searchByIntent(params: {
27
+ meddic_signals?: string[];
28
+ min_intent_score?: number;
29
+ topic?: string;
30
+ days?: number;
31
+ }): Promise<SearchResult[]>;
32
+ getKnowledgeGaps(params: {
33
+ days?: number;
34
+ topic?: string;
35
+ limit?: number;
36
+ }): Promise<KnowledgeGap[]>;
37
+ getLeadEnrichment(params: {
38
+ days?: number;
39
+ has_company?: boolean;
40
+ }): Promise<EnrichmentRecord[]>;
41
+ getMeddicSummary(params: {
42
+ days?: number;
43
+ }): Promise<MEDDICSummaryResponse>;
44
+ }
45
+ export declare class ApiError extends Error {
46
+ status: number;
47
+ constructor(status: number, message: string);
48
+ }
49
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,OAAO,EACP,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EAEtB,MAAM,YAAY,CAAA;AAInB,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;YAK9B,OAAO;IA4Bf,gBAAgB,CAAC,MAAM,EAAE;QAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAU5B,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAM1E,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQlF,mBAAmB,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAOjF,cAAc,CAAC,MAAM,EAAE;QAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAYrB,gBAAgB,CAAC,MAAM,EAAE;QAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASrB,iBAAiB,CAAC,MAAM,EAAE;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQzB,gBAAgB,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAMlF;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,CAAA;gBAEF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * HTTP client for Parsley API routes.
3
+ * The MCP server calls these endpoints over HTTPS rather than
4
+ * accessing Firestore directly (Option B architecture).
5
+ */
6
+ const DEFAULT_BASE_URL = "https://www.parsley.id";
7
+ export class ApiClient {
8
+ baseUrl;
9
+ apiKey;
10
+ constructor(apiKey, baseUrl) {
11
+ this.apiKey = apiKey;
12
+ this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\/$/, "");
13
+ }
14
+ async request(path, params) {
15
+ const url = new URL(`${this.baseUrl}${path}`);
16
+ if (params) {
17
+ for (const [key, value] of Object.entries(params)) {
18
+ if (value !== undefined && value !== "") {
19
+ url.searchParams.set(key, value);
20
+ }
21
+ }
22
+ }
23
+ const response = await fetch(url.toString(), {
24
+ method: "GET",
25
+ headers: {
26
+ "X-API-Key": this.apiKey,
27
+ Accept: "application/json",
28
+ },
29
+ });
30
+ if (!response.ok) {
31
+ const body = (await response.json().catch(() => ({
32
+ error: `HTTP ${response.status}`,
33
+ })));
34
+ throw new ApiError(response.status, body.error || `HTTP ${response.status}`);
35
+ }
36
+ return response.json();
37
+ }
38
+ async getConversations(params) {
39
+ const queryParams = {};
40
+ if (params.days)
41
+ queryParams.days = String(params.days);
42
+ if (params.lead_quality)
43
+ queryParams.lead_quality = params.lead_quality;
44
+ if (params.intent_signal)
45
+ queryParams.intent_signal = params.intent_signal;
46
+ if (params.limit)
47
+ queryParams.limit = String(params.limit);
48
+ return this.request("/api/v1/mcp/conversations", queryParams);
49
+ }
50
+ async getConversationDetail(conversationId) {
51
+ return this.request(`/api/v1/mcp/conversations/${encodeURIComponent(conversationId)}`);
52
+ }
53
+ async getHotLeads(params) {
54
+ const queryParams = {};
55
+ if (params.days)
56
+ queryParams.days = String(params.days);
57
+ if (params.include_warm !== undefined)
58
+ queryParams.include_warm = String(params.include_warm);
59
+ return this.request("/api/v1/mcp/hot-leads", queryParams);
60
+ }
61
+ async getAnalyticsSummary(params) {
62
+ const queryParams = {};
63
+ if (params.days)
64
+ queryParams.days = String(params.days);
65
+ return this.request("/api/v1/mcp/analytics", queryParams);
66
+ }
67
+ async searchByIntent(params) {
68
+ const queryParams = {};
69
+ if (params.days)
70
+ queryParams.days = String(params.days);
71
+ if (params.min_intent_score)
72
+ queryParams.min_intent_score = String(params.min_intent_score);
73
+ if (params.topic)
74
+ queryParams.topic = params.topic;
75
+ if (params.meddic_signals && params.meddic_signals.length > 0) {
76
+ queryParams.meddic_signals = params.meddic_signals.join(",");
77
+ }
78
+ return this.request("/api/v1/mcp/search", queryParams);
79
+ }
80
+ async getKnowledgeGaps(params) {
81
+ const queryParams = {};
82
+ if (params.days)
83
+ queryParams.days = String(params.days);
84
+ if (params.topic)
85
+ queryParams.topic = params.topic;
86
+ if (params.limit)
87
+ queryParams.limit = String(params.limit);
88
+ return this.request("/api/v1/mcp/knowledge-gaps", queryParams);
89
+ }
90
+ async getLeadEnrichment(params) {
91
+ const queryParams = {};
92
+ if (params.days)
93
+ queryParams.days = String(params.days);
94
+ if (params.has_company !== undefined)
95
+ queryParams.has_company = String(params.has_company);
96
+ return this.request("/api/v1/mcp/enrichment", queryParams);
97
+ }
98
+ async getMeddicSummary(params) {
99
+ const queryParams = {};
100
+ if (params.days)
101
+ queryParams.days = String(params.days);
102
+ return this.request("/api/v1/mcp/meddic-summary", queryParams);
103
+ }
104
+ }
105
+ export class ApiError extends Error {
106
+ status;
107
+ constructor(status, message) {
108
+ super(message);
109
+ this.name = "ApiError";
110
+ this.status = status;
111
+ }
112
+ }
113
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * MCP Server types - mirrors main app types for MCP responses.
3
+ * Kept minimal: only what the MCP tools need to return.
4
+ */
5
+ export type LeadQuality = "hot" | "warm" | "cold";
6
+ export type ConversationIntentSignal = "high_intent" | "evaluation" | "research" | "support";
7
+ export type MEDDICSignalType = "metrics" | "economic_buyer" | "decision_criteria" | "decision_process" | "identify_pain" | "champion";
8
+ export interface MEDDICSignalDetail {
9
+ type: MEDDICSignalType;
10
+ quote: string;
11
+ messageIndex: number;
12
+ confidence: "high" | "medium";
13
+ }
14
+ export interface ConversationSummary {
15
+ id: string;
16
+ visitorName: string | null;
17
+ visitorCompany: string | null;
18
+ leadQuality: LeadQuality;
19
+ intentSignal: ConversationIntentSignal;
20
+ meddicSignalCount: number;
21
+ messageCount: number;
22
+ date: string;
23
+ topics: string[];
24
+ }
25
+ export interface ConversationDetail {
26
+ id: string;
27
+ visitorName: string | null;
28
+ visitorCompany: string | null;
29
+ visitorEmail: string | null;
30
+ leadQuality: LeadQuality;
31
+ intentSignal: ConversationIntentSignal;
32
+ intentScore: number;
33
+ meddicSignals: MEDDICSignalDetail[];
34
+ meddicSummary: {
35
+ metrics: boolean;
36
+ economicBuyer: boolean;
37
+ decisionCriteria: boolean;
38
+ decisionProcess: boolean;
39
+ identifyPain: boolean;
40
+ champion: boolean;
41
+ };
42
+ topics: string[];
43
+ messageCount: number;
44
+ engagement: {
45
+ visitorMessageCount: number;
46
+ sessionDuration: number;
47
+ isReturnVisitor: boolean;
48
+ } | null;
49
+ enrichment: {
50
+ company: string | null;
51
+ role: string | null;
52
+ timeline: string | null;
53
+ budgetContext: string | null;
54
+ } | null;
55
+ knowledgeGaps: string[];
56
+ date: string;
57
+ }
58
+ export interface HotLead {
59
+ id: string;
60
+ visitorName: string | null;
61
+ visitorCompany: string | null;
62
+ visitorEmail: string | null;
63
+ leadQuality: LeadQuality;
64
+ intentSignal: ConversationIntentSignal;
65
+ meddicSignals: MEDDICSignalDetail[];
66
+ topics: string[];
67
+ date: string;
68
+ }
69
+ export interface AnalyticsSummaryResponse {
70
+ profileViews: number;
71
+ totalConversations: number;
72
+ hotLeads: number;
73
+ warmLeads: number;
74
+ coldLeads: number;
75
+ topTopics: Array<{
76
+ topic: string;
77
+ count: number;
78
+ percentage: number;
79
+ }>;
80
+ leadsCaptured: number;
81
+ conversionRate: number;
82
+ knowledgeGapRate: number;
83
+ period: {
84
+ days: number;
85
+ start: string;
86
+ end: string;
87
+ };
88
+ }
89
+ export interface AuthContext {
90
+ userId: string;
91
+ organisationId: string | null;
92
+ hasBusiness: boolean;
93
+ }
94
+ export interface SearchResult {
95
+ id: string;
96
+ visitorName: string | null;
97
+ visitorCompany: string | null;
98
+ leadQuality: LeadQuality;
99
+ intentSignal: ConversationIntentSignal;
100
+ intentScore: number;
101
+ meddicSignals: MEDDICSignalDetail[];
102
+ topics: string[];
103
+ messageCount: number;
104
+ date: string;
105
+ matchedCriteria: string[];
106
+ }
107
+ export interface KnowledgeGap {
108
+ question: string;
109
+ frequency: number;
110
+ topics: string[];
111
+ lastAsked: string;
112
+ }
113
+ export interface EnrichmentRecord {
114
+ conversationId: string;
115
+ company: string | null;
116
+ role: string | null;
117
+ timeline: string | null;
118
+ budgetContext: string | null;
119
+ leadQuality: LeadQuality;
120
+ intentSignal: ConversationIntentSignal;
121
+ date: string;
122
+ }
123
+ export interface MEDDICSummaryResponse {
124
+ totalConversations: number;
125
+ qualifiedCount: number;
126
+ qualifiedPercentage: number;
127
+ signals: Array<{
128
+ signal: string;
129
+ count: number;
130
+ percentage: number;
131
+ }>;
132
+ topCombinations: Array<{
133
+ combination: string;
134
+ count: number;
135
+ }>;
136
+ period: {
137
+ days: number;
138
+ start: string;
139
+ end: string;
140
+ };
141
+ }
142
+ export interface ApiErrorResponse {
143
+ error: string;
144
+ }
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Server types - mirrors main app types for MCP responses.
3
+ * Kept minimal: only what the MCP tools need to return.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,11 @@
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 type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ export declare function registerPrompts(server: McpServer, hasBusiness: boolean): void;
11
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,QAwQtE"}