@loopops/mcp-server 3.53.0 → 3.55.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/dist/index.js CHANGED
@@ -21,6 +21,7 @@ import { registerAccountCurateTools } from "./tools/account-curate.js";
21
21
  import { registerCpqTools } from "./tools/cpq.js";
22
22
  import { registerDealPrepTools } from "./tools/deal-prep.js";
23
23
  import { registerPlanTools } from "./tools/plan.js";
24
+ import { registerProspectingTools } from "./tools/prospecting.js";
24
25
  import { registerSfdcSyncTools } from "./tools/sfdc-sync.js";
25
26
  import { registerTalTools } from "./tools/tal.js";
26
27
  import { parseSkillModesResponse } from "./skills/loader.js";
@@ -77,6 +78,7 @@ registerCpqTools(server, allowedSkills);
77
78
  registerDealPrepTools(server, allowedSkills);
78
79
  registerPlanTools(server, allowedSkills);
79
80
  registerAccountCurateTools(server, allowedSkills);
81
+ registerProspectingTools(server, allowedSkills);
80
82
  // Skills framework — fetch role-visible skills from the Loop API and
81
83
  // register each as a server-provided MCP prompt. Surfaces in the
82
84
  // client's `/` menu and bundles (system prompt + tool emphasis +
@@ -0,0 +1,19 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Prospecting tools — surface for the `/prospecting` skill.
4
+ *
5
+ * The skill bundles two new context/read tools with existing Engage
6
+ * review tools (my_sequences, review_sequence, approve_sequence,
7
+ * reject_sequence) + AM context tools (account_show,
8
+ * walk_account_hierarchy, score_explain).
9
+ *
10
+ * NOT YET BUILT: generate_sequence_for_account — manual sequence
11
+ * generation. The skill's playbook describes how to handle the gap
12
+ * (defer to Signal Scanner, or ask ops to add account to the
13
+ * signal_scanner_targets TAL). Lands in a follow-on PR.
14
+ *
15
+ * NOT YET BUILT: Gong Engage activation. approve_sequence today
16
+ * writes to Postgres only; Gong push lands in a separate infra PR
17
+ * with no UX change required.
18
+ */
19
+ export declare function registerProspectingTools(server: McpServer, allowed: Set<string>): void;
@@ -0,0 +1,70 @@
1
+ import { z } from "zod";
2
+ import { trpcMutation, trpcQuery } from "../api-client.js";
3
+ import { safeTool } from "./_helpers.js";
4
+ /**
5
+ * Prospecting tools — surface for the `/prospecting` skill.
6
+ *
7
+ * The skill bundles two new context/read tools with existing Engage
8
+ * review tools (my_sequences, review_sequence, approve_sequence,
9
+ * reject_sequence) + AM context tools (account_show,
10
+ * walk_account_hierarchy, score_explain).
11
+ *
12
+ * NOT YET BUILT: generate_sequence_for_account — manual sequence
13
+ * generation. The skill's playbook describes how to handle the gap
14
+ * (defer to Signal Scanner, or ask ops to add account to the
15
+ * signal_scanner_targets TAL). Lands in a follow-on PR.
16
+ *
17
+ * NOT YET BUILT: Gong Engage activation. approve_sequence today
18
+ * writes to Postgres only; Gong push lands in a separate infra PR
19
+ * with no UX change required.
20
+ */
21
+ export function registerProspectingTools(server, allowed) {
22
+ if (allowed.has("prospecting_context")) {
23
+ server.tool("prospecting_context", "Loads Loop's prospecting playbook: four-phase workflow (prioritize → understand → generate → review → activate), prioritization heuristics (ICP weight 0.7 + freshness 0.3 − open-opp/open-sequence penalties), generation guardrails, approval voice, conversation patterns, handoffs to /deal_prep + /cpq_coach + /account_curate. Call ONCE per prospecting conversation. The /prospecting skill auto-loads this on entry.", {}, safeTool(async () => trpcQuery("mcp.prospectingContext")));
24
+ }
25
+ if (allowed.has("generate_sequence_for_account")) {
26
+ server.tool("generate_sequence_for_account", "Generate a draft prospecting email sequence for an account that doesn't have one. Single Sonnet 4.6 call grounded in AM firmographics + rep-provided context. Inserts into engage_sequences with status='draft'; rep reviews via my_sequences / review_sequence / approve_sequence. REFUSES if the account has an open opportunity (use /deal_prep instead) or an existing draft/approved sequence. ~$0.02/call. Always confirm with rep before firing — don't auto-generate on first mention of an account.", {
27
+ accountIdentifier: z
28
+ .string()
29
+ .min(2)
30
+ .max(200)
31
+ .describe("Account UUID, primary domain, SF Account Id (001…), or partial name. Must resolve to exactly one account."),
32
+ context: z
33
+ .string()
34
+ .max(2000)
35
+ .optional()
36
+ .describe("Optional rep-provided grounding: recent press release, champion mention, observed buying signal, specific use case. Strongly recommended — generic firmographic-only sequences perform poorly."),
37
+ playId: z
38
+ .enum(["enterprise_intro", "mid_market_outbound", "fallback_nurture"])
39
+ .optional()
40
+ .describe("Override the auto-selected play (default: enterprise_intro if employees ≥500, mid_market_outbound 100-500, else fallback_nurture)."),
41
+ }, safeTool(async (args) => trpcMutation("mcp.generateSequenceForAccount", args)));
42
+ }
43
+ if (allowed.has("prospecting_priorities")) {
44
+ server.tool("prospecting_priorities", "Rank target accounts in caller's territory for outbound prospecting. Hybrid CH query joining am.account_profile + salesforce.opportunity (excludes open opps) + engage_sequences (flags pending). Scope defaults to caller's own territory; managers can pass 'subtree' or {repId}. Returns top-N markdown table with ICP score + band, owner, why (reason line), and suggested action (Generate or Review existing sequence).", {
45
+ scope: z
46
+ .union([
47
+ z.literal("me"),
48
+ z.literal("my_team"),
49
+ z.literal("subtree"),
50
+ z.object({ repId: z.string().min(1) }),
51
+ z.object({ managerId: z.string().min(1) }),
52
+ ])
53
+ .optional()
54
+ .describe("Scope: 'me' (default for rep), 'my_team' / 'subtree' (manager+), or explicit {repId}/{managerId}."),
55
+ limit: z
56
+ .number()
57
+ .int()
58
+ .min(1)
59
+ .max(50)
60
+ .optional()
61
+ .describe("Top-N to return. Default 10."),
62
+ min_icp_score: z
63
+ .number()
64
+ .min(0)
65
+ .max(100)
66
+ .optional()
67
+ .describe("Minimum ICP score (0-100). Default 0."),
68
+ }, safeTool(async (args) => trpcQuery("mcp.prospectingPriorities", args)));
69
+ }
70
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loopops/mcp-server",
3
- "version": "3.53.0",
3
+ "version": "3.55.0",
4
4
  "description": "Loop Operations MCP Server — AI skills for RevOps",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",