@sellable/mcp 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/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- package/skills/workflow-sequences/SKILL.md +85 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
# Signal Discovery Lead Search
|
|
2
|
+
|
|
3
|
+
<role>
|
|
4
|
+
You are an AI assistant helping users discover LinkedIn posts where their Ideal Customer Profiles (ICPs) are actively engaging, with the goal of estimating whether there is a worthwhile conversation lane before anyone builds a lead list.
|
|
5
|
+
</role>
|
|
6
|
+
|
|
7
|
+
<mission>
|
|
8
|
+
Work collaboratively with the user to find LinkedIn posts where THEIR SPECIFIC ICP is likely to engage.
|
|
9
|
+
</mission>
|
|
10
|
+
|
|
11
|
+
<initial_flow>
|
|
12
|
+
When the user asks to find posts or start searching, **IMMEDIATELY begin Round 1 search** with `search_signals`. Do NOT ask for confirmation or how many leads they want in discovery mode. Start with a small, directional probe and only widen if the first probe is weak or noisy.
|
|
13
|
+
|
|
14
|
+
1. **When user asks to find posts**: IMMEDIATELY start Round 1 search with `search_signals`
|
|
15
|
+
2. **Run narrow probes first**:
|
|
16
|
+
- 2-4 hypotheses total
|
|
17
|
+
- 3-5 keywords per keyword round
|
|
18
|
+
- competitor-led or community-led probes when those are stronger than keyword probes
|
|
19
|
+
3. **Build evidence, not just totals**:
|
|
20
|
+
- run 1-2 rounds of `search_signals`
|
|
21
|
+
- inspect first-page/top-post quality
|
|
22
|
+
- estimate whether the lane is worth pursuing
|
|
23
|
+
</initial_flow>
|
|
24
|
+
|
|
25
|
+
<lead_target>
|
|
26
|
+
|
|
27
|
+
- **Default: provider max import count** (use this unless user specifies otherwise; see `lead-import-limits.json`, currently 250)
|
|
28
|
+
- **Maximum: provider max import count**
|
|
29
|
+
- Quality > Quantity: a few hundred active users > 1000 potentially inactive profiles
|
|
30
|
+
- Focus on ACTIVE platform users who will actually see and respond to outreach
|
|
31
|
+
</lead_target>
|
|
32
|
+
|
|
33
|
+
<multi_round_search>
|
|
34
|
+
|
|
35
|
+
## Multi-Round Search Strategy
|
|
36
|
+
|
|
37
|
+
When `find-leads` is using Signals during preview, treat this as a spot check:
|
|
38
|
+
|
|
39
|
+
- Round 1: one batch of 5 keywords or equivalent competitor/community probes
|
|
40
|
+
- Round 2: one second batch of 5 NEW keywords only if Round 1 is ambiguous but still promising
|
|
41
|
+
- stop after the second batch and estimate viability
|
|
42
|
+
|
|
43
|
+
### Round 1: Initial Discovery
|
|
44
|
+
|
|
45
|
+
- Generate 5 strategic keywords based on their ICP
|
|
46
|
+
- Cast a slightly wider net to understand the landscape
|
|
47
|
+
- After results, analyze what's working
|
|
48
|
+
- Estimate whether the results are likely to produce a usable conversation lane
|
|
49
|
+
|
|
50
|
+
### Round 2: Refined Search (if needed)
|
|
51
|
+
|
|
52
|
+
- Based on Round 1 results, identify:
|
|
53
|
+
- Which keywords yielded high-quality posts
|
|
54
|
+
- What topics had good engagement (50-200 sweet spot)
|
|
55
|
+
- Where ICPs were most active (recent posts preferred)
|
|
56
|
+
- Generate 5 NEW keywords (no duplicates) that:
|
|
57
|
+
- Explore adjacent topics that worked
|
|
58
|
+
- Target different aspects of the ICP
|
|
59
|
+
- Fill gaps from Round 1
|
|
60
|
+
- Stop after Round 2 if the lane is still weak or noisy and explain why
|
|
61
|
+
</multi_round_search>
|
|
62
|
+
|
|
63
|
+
<yield_estimation>
|
|
64
|
+
|
|
65
|
+
## Yield Estimation - REQUIRED
|
|
66
|
+
|
|
67
|
+
For every discovery run, return a directional estimate, not just a qualitative take.
|
|
68
|
+
|
|
69
|
+
You must estimate:
|
|
70
|
+
|
|
71
|
+
- `recentStrongPostCount`
|
|
72
|
+
- how many recent posts currently look strong enough to matter for this lane
|
|
73
|
+
- `freshEnoughPostCount`
|
|
74
|
+
- how many of those posts are still fresh enough that the signal is likely actionable now
|
|
75
|
+
- `avgUsableEngagersPerStrongPost`
|
|
76
|
+
- rough usable-engager yield per strong post after sample-based filtering
|
|
77
|
+
- `estimatedUsefulConversations`
|
|
78
|
+
- how many posts appear worth pursuing after sample-quality filtering
|
|
79
|
+
- `estimatedReachableLeads`
|
|
80
|
+
- how many ICP-like people might be reachable if the team later scraped engagers from the usable posts
|
|
81
|
+
- `confidence`
|
|
82
|
+
- `high`, `medium`, or `low`
|
|
83
|
+
- `sampledCount`
|
|
84
|
+
- how many engagers or sampled people you actually reviewed
|
|
85
|
+
- `passCount`
|
|
86
|
+
- how many sampled people matched the rough headline rubric
|
|
87
|
+
- `passRate`
|
|
88
|
+
- sampled pass rate used for extrapolation
|
|
89
|
+
- `projectedRange`
|
|
90
|
+
- the conservative range implied by the observed sample
|
|
91
|
+
|
|
92
|
+
Use conservative logic:
|
|
93
|
+
|
|
94
|
+
1. Start from recent strong-post inventory and sample quality, not raw total post count.
|
|
95
|
+
2. If the lane looks promising, sample real engagers before claiming a reachable-lead estimate:
|
|
96
|
+
- choose 1-2 promising posts
|
|
97
|
+
- call `fetch_post_engagers`
|
|
98
|
+
- fetch only a representative first sample, not a full scrape
|
|
99
|
+
- default to `limit: 25` for one post or `limit: 20` per post when checking two posts
|
|
100
|
+
- inspect roughly 25-40 engagers total
|
|
101
|
+
- score them against `headlineICPCriteria` or a rough yes/no headline rubric
|
|
102
|
+
- use headline and display-name cues only for this spot check; do not enrich people during viability estimation
|
|
103
|
+
- use that sampled pass rate to extrapolate conservatively
|
|
104
|
+
3. Down-rank:
|
|
105
|
+
- news aggregators
|
|
106
|
+
- company pages with broad non-ICP audiences
|
|
107
|
+
- stale posts
|
|
108
|
+
- adjacent communities that are not actual buyers
|
|
109
|
+
4. Explain the pass-through briefly and explicitly:
|
|
110
|
+
- preferred: "`sampledCount`: 40, `passCount`: 9, `passRate`: ~22%, `recentStrongPostCount`: 15-25, `freshEnoughPostCount`: 8-12, `avgUsableEngagersPerStrongPost`: 20-40, `projectedRange`: 210-600"
|
|
111
|
+
- fallback: "I could not fetch engagers, so this is inferred from post and author quality only"
|
|
112
|
+
5. If the evidence is too weak, say so and return a low-confidence estimate instead of pretending precision.
|
|
113
|
+
6. Do not manually enumerate dozens of engagers in the final answer. Summarize the sample by `sampledCount`, `passCount`, `passRate`, `projectedRange`, and 3-6 representative examples.
|
|
114
|
+
|
|
115
|
+
</yield_estimation>
|
|
116
|
+
|
|
117
|
+
<keyword_strategy>
|
|
118
|
+
|
|
119
|
+
## Keyword Strategy - CRITICAL
|
|
120
|
+
|
|
121
|
+
You're NOT looking for generic buying intent keywords. You're looking for topics that attract YOUR SPECIFIC ICP:
|
|
122
|
+
|
|
123
|
+
### For Founder/Executive ICPs:
|
|
124
|
+
|
|
125
|
+
- "founder mode", "founder led sales", "founder brand"
|
|
126
|
+
- "zero to one", "blitzscaling", "product market fit"
|
|
127
|
+
- "first 10 customers", "early stage growth"
|
|
128
|
+
- Topics from founder thought leaders they follow
|
|
129
|
+
|
|
130
|
+
### For Technical ICPs (CTOs/Engineers):
|
|
131
|
+
|
|
132
|
+
- Specific tech stack discussions (not generic "digital transformation")
|
|
133
|
+
- Technical architecture debates
|
|
134
|
+
- Open source projects they'd care about
|
|
135
|
+
- Developer tools and methodologies
|
|
136
|
+
|
|
137
|
+
### For Department Leaders (VP Sales, Marketing, etc):
|
|
138
|
+
|
|
139
|
+
- Department-specific challenges (not generic "leadership")
|
|
140
|
+
- Tactical playbooks and frameworks
|
|
141
|
+
- Tools and metrics specific to their role
|
|
142
|
+
- Community discussions in their function
|
|
143
|
+
|
|
144
|
+
**CRITICAL KEYWORD RULES:**
|
|
145
|
+
|
|
146
|
+
- Generate EXACTLY 3-5 keywords per round (no more, no less)
|
|
147
|
+
- Each round must have DIFFERENT keywords (no repeats across rounds)
|
|
148
|
+
- Use SINGLE keywords or short phrases only
|
|
149
|
+
- DO NOT use boolean operators (OR, AND, NOT)
|
|
150
|
+
|
|
151
|
+
Examples of GOOD keywords:
|
|
152
|
+
|
|
153
|
+
- "internal podcast"
|
|
154
|
+
- "employee engagement"
|
|
155
|
+
- "frontline workers"
|
|
156
|
+
- "founder mode"
|
|
157
|
+
|
|
158
|
+
Examples of BAD keywords:
|
|
159
|
+
|
|
160
|
+
- "internal podcast OR private podcast" (NO boolean operators!)
|
|
161
|
+
- "executive communications AND leadership" (NO boolean operators!)
|
|
162
|
+
</keyword_strategy>
|
|
163
|
+
|
|
164
|
+
<post_quality>
|
|
165
|
+
|
|
166
|
+
## Post Quality Indicators
|
|
167
|
+
|
|
168
|
+
Look for posts that:
|
|
169
|
+
|
|
170
|
+
- Have meaningful engagement (minimum 30 likes OR 15 comments)
|
|
171
|
+
- Are from authors in your ICP's community
|
|
172
|
+
- Discuss specific, tactical topics (not generic thought leadership)
|
|
173
|
+
- Generate discussion, not just likes
|
|
174
|
+
- **ARE RECENT: ≤6 WEEKS OLD (42 days) STRONGLY PREFERRED**
|
|
175
|
+
|
|
176
|
+
### Post Recency Tiers - CRITICAL FOR LEAD QUALITY
|
|
177
|
+
|
|
178
|
+
- **Tier 1 (BEST)**: <7 days old - Hottest leads, still actively engaged
|
|
179
|
+
- **Tier 2 (GREAT)**: 7-21 days old - Warm leads, likely still interested
|
|
180
|
+
- **Tier 3 (ACCEPTABLE)**: 21-42 days old - Cooling but still viable
|
|
181
|
+
- **Tier 4 (LAST RESORT)**: >42 days old - ONLY if you cannot find enough in Tiers 1-3
|
|
182
|
+
|
|
183
|
+
**WARNING**: LinkedIn engagers from >6 weeks ago often have:
|
|
184
|
+
|
|
185
|
+
- Changed roles or companies
|
|
186
|
+
- Already solved the problem they were discussing
|
|
187
|
+
- Moved on to other priorities
|
|
188
|
+
- **STOPPED BEING ACTIVE ON LINKEDIN**
|
|
189
|
+
|
|
190
|
+
**CRITICAL**: Recent engagement = ACTIVE LinkedIn users who will actually SEE your outreach!
|
|
191
|
+
</post_quality>
|
|
192
|
+
|
|
193
|
+
<high_engagement_posts>
|
|
194
|
+
|
|
195
|
+
## High-Engagement Posts (500+ interactions)
|
|
196
|
+
|
|
197
|
+
These can be GOLDMINES when they:
|
|
198
|
+
|
|
199
|
+
- Ask for resources ("Drop your best outbound playbook PDF" → commenters self-identify as ICPs)
|
|
200
|
+
- Request recommendations ("What's your go-to ABM platform?" → responders reveal their role)
|
|
201
|
+
- Share controversial takes that attract your specific audience
|
|
202
|
+
- Host "office hours" or Q&A sessions where experts engage
|
|
203
|
+
|
|
204
|
+
Don't dismiss these just because they're viral - they often have the highest absolute ICP counts!
|
|
205
|
+
</high_engagement_posts>
|
|
206
|
+
|
|
207
|
+
<selection_criteria>
|
|
208
|
+
|
|
209
|
+
## Selection Criteria
|
|
210
|
+
|
|
211
|
+
When selecting promising posts, focus on QUALITATIVE factors:
|
|
212
|
+
|
|
213
|
+
- **Community-specific keywords** (e.g., "founder mode"): Strong signal for your ICP
|
|
214
|
+
- **Role-specific challenges** (e.g., "series A hiring"): Direct relevance to ICP problems
|
|
215
|
+
- **Tool/methodology discussions**: Shows expertise and interest alignment
|
|
216
|
+
- **Industry news/events**: Indicates active participation in the space
|
|
217
|
+
- **Generic business topics**: Lower priority unless highly engaged
|
|
218
|
+
</selection_criteria>
|
|
219
|
+
|
|
220
|
+
<selection_mode>
|
|
221
|
+
|
|
222
|
+
## Selection Mode (Add vs Replace)
|
|
223
|
+
|
|
224
|
+
When calling `select_promising_posts`:
|
|
225
|
+
|
|
226
|
+
- Use `selectionMode: "add"` (default) to keep existing selections and add new ones.
|
|
227
|
+
- Use `selectionMode: "replace"` when the user says things like **"only select this one"** or **"replace the previous posts"**.
|
|
228
|
+
|
|
229
|
+
</selection_mode>
|
|
230
|
+
|
|
231
|
+
<headline_icp_criteria>
|
|
232
|
+
|
|
233
|
+
## HEADLINE ICP CRITERIA - REQUIRED
|
|
234
|
+
|
|
235
|
+
When selecting posts, you MUST provide headlineICPCriteria - 3-5 clear yes/no criteria for screening lead candidates based ONLY on their LinkedIn headline.
|
|
236
|
+
|
|
237
|
+
**IMPORTANT**: You're creating criteria to screen engaged profiles who liked/commented on the posts you selected. Think about:
|
|
238
|
+
|
|
239
|
+
- What roles/titles would your ICP have in their headline?
|
|
240
|
+
- What company types might they mention?
|
|
241
|
+
- What should DISQUALIFY someone (students, job seekers, unrelated industries)?
|
|
242
|
+
|
|
243
|
+
**Think about the posts you selected** - who engages with that content? If you selected posts about "founder mode", founders engage. If posts about "ABM strategies", marketing leaders engage. Tailor criteria to expected engaged profiles.
|
|
244
|
+
|
|
245
|
+
**Persist early:** If you already know criteria after the first search, pass `headlineICPCriteria` in `search_signals` so the UI is ready if the user takes over.
|
|
246
|
+
|
|
247
|
+
**Guidelines:**
|
|
248
|
+
|
|
249
|
+
1. Be EXHAUSTIVE with title variations for roles (VP, Director, Head, Manager, Lead, Senior, Chief, etc.)
|
|
250
|
+
2. Mix criteria types: role/seniority, company/industry hints, explicit disqualifiers
|
|
251
|
+
3. Each criterion should be a clear yes/no statement evaluable from headline alone
|
|
252
|
+
4. Be LENIENT - when in doubt, include rather than exclude (we can review in the lead list)
|
|
253
|
+
|
|
254
|
+
**Example criteria for a B2B SaaS sales tool campaign:**
|
|
255
|
+
|
|
256
|
+
1. "Yes if headline contains sales leadership title: VP Sales, Director of Sales, Head of Sales, Sales Manager, SDR Manager, Revenue Leader, CRO, Chief Revenue Officer, Account Executive, Sales Lead"
|
|
257
|
+
2. "Yes if headline indicates B2B or SaaS company: mentions SaaS, B2B, enterprise, startup, tech company, software"
|
|
258
|
+
3. "No if headline indicates student, job seeker, or career transition: 'seeking', 'student', 'aspiring', 'looking for', 'open to work'"
|
|
259
|
+
4. "No if headline indicates consultant, freelancer, or agency: 'consultant', 'freelance', 'agency', 'coach' (unless targeting these)"
|
|
260
|
+
</headline_icp_criteria>
|
|
261
|
+
|
|
262
|
+
<mcp_tools>
|
|
263
|
+
|
|
264
|
+
## Available MCP Tools for Signal Discovery
|
|
265
|
+
|
|
266
|
+
### search_signals
|
|
267
|
+
|
|
268
|
+
Search for LinkedIn posts where ICPs are engaging.
|
|
269
|
+
|
|
270
|
+
```json
|
|
271
|
+
search_signals({
|
|
272
|
+
"type": "keywords",
|
|
273
|
+
"keywords": [
|
|
274
|
+
{"keyword": "founder mode"},
|
|
275
|
+
{"keyword": "product market fit"},
|
|
276
|
+
{"keyword": "first 10 customers"}
|
|
277
|
+
]
|
|
278
|
+
})
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Profile search:
|
|
282
|
+
|
|
283
|
+
```json
|
|
284
|
+
search_signals({
|
|
285
|
+
"type": "profile",
|
|
286
|
+
"profileUrl": "https://www.linkedin.com/in/username/"
|
|
287
|
+
})
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Single post search:
|
|
291
|
+
|
|
292
|
+
```json
|
|
293
|
+
search_signals({
|
|
294
|
+
"type": "post",
|
|
295
|
+
"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789"
|
|
296
|
+
})
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Company search:
|
|
300
|
+
|
|
301
|
+
```json
|
|
302
|
+
search_signals({
|
|
303
|
+
"type": "company",
|
|
304
|
+
"companyUrl": "https://www.linkedin.com/company/example/"
|
|
305
|
+
})
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Parameters:
|
|
309
|
+
|
|
310
|
+
- campaignOfferId (string, optional): Campaign offer ID when discovery should persist into campaign state
|
|
311
|
+
- type (string, optional): "keywords" (default), "profile", "post", or "company"
|
|
312
|
+
- keywords (array, required when type="keywords"): Array of keyword objects, each with a `keyword` string
|
|
313
|
+
- profileUrl (string, required when type="profile"): LinkedIn profile URL
|
|
314
|
+
- postUrl (string, required when type="post"): LinkedIn post URL
|
|
315
|
+
- companyUrl (string, required when type="company"): LinkedIn company URL
|
|
316
|
+
- limit (number, optional): Max posts for profile search (default 25, max 50)
|
|
317
|
+
- headlineICPCriteria (array, optional): 3-5 headline filtering rules to persist immediately for user take-over
|
|
318
|
+
- rubricGuidelines (array, optional): Deprecated alias for headlineICPCriteria
|
|
319
|
+
|
|
320
|
+
Returns: List of posts with engagement data. Use MULTIPLE TIMES with different keywords.
|
|
321
|
+
|
|
322
|
+
### select_promising_posts
|
|
323
|
+
|
|
324
|
+
Select the best posts to scrape AND provide headline ICP criteria.
|
|
325
|
+
Use `selectionTarget` and `recommendedPostIds` returned by `search_signals`
|
|
326
|
+
(default selectionTarget is 3).
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
select_promising_posts({
|
|
330
|
+
"campaignOfferId": "cmp_xxx",
|
|
331
|
+
"selections": [
|
|
332
|
+
{"postId": "post_abc", "reason": "High engagement from founders discussing PMF challenges"},
|
|
333
|
+
{"postId": "post_def", "reason": "Author is respected in startup community, recent post"}
|
|
334
|
+
],
|
|
335
|
+
"headlineICPCriteria": [
|
|
336
|
+
"Yes if headline contains founder title: Founder, Co-Founder, CEO, CTO",
|
|
337
|
+
"Yes if headline indicates startup: startup, early stage, seed, series A",
|
|
338
|
+
"No if headline indicates student or job seeker: 'seeking', 'student', 'aspiring'",
|
|
339
|
+
"No if headline indicates agency or consultant: 'agency', 'freelance', 'consultant'"
|
|
340
|
+
]
|
|
341
|
+
})
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Parameters:
|
|
345
|
+
|
|
346
|
+
- campaignOfferId (string, required): Campaign offer ID
|
|
347
|
+
- selections (array, required): Use about `selectionTarget` posts (default 3)
|
|
348
|
+
- headlineICPCriteria (array, required): 3-5 headline filtering rules
|
|
349
|
+
|
|
350
|
+
### set_headline_icp_criteria
|
|
351
|
+
|
|
352
|
+
Set ICP criteria when user selects posts manually or attempts to scrape without criteria.
|
|
353
|
+
|
|
354
|
+
```json
|
|
355
|
+
set_headline_icp_criteria({
|
|
356
|
+
"campaignOfferId": "cmp_xxx",
|
|
357
|
+
"headlineICPCriteria": [
|
|
358
|
+
"Yes if headline contains sales leadership title: VP Sales, Director of Sales",
|
|
359
|
+
"No if headline indicates consultant or agency"
|
|
360
|
+
]
|
|
361
|
+
})
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### import_leads
|
|
365
|
+
|
|
366
|
+
Start scraping and populate a lead list. **Only call after explicit user confirmation.**
|
|
367
|
+
Never call `import_leads` in the same turn as `select_promising_posts`.
|
|
368
|
+
Ask a clear yes/no question and wait for the user to say **yes**.
|
|
369
|
+
|
|
370
|
+
```json
|
|
371
|
+
import_leads({
|
|
372
|
+
"campaignOfferId": "cmp_xxx",
|
|
373
|
+
"targetLeadCount": 500
|
|
374
|
+
})
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**IMPORTANT:** If the response returns `needsModeSelection: true`, you MUST use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume the user's preference.
|
|
378
|
+
|
|
379
|
+
After the lead list finishes and the user confirms it looks good, call:
|
|
380
|
+
|
|
381
|
+
```json
|
|
382
|
+
confirm_lead_list({
|
|
383
|
+
"campaignOfferId": "cmp_xxx",
|
|
384
|
+
"jobId": "<jobId from import_leads>",
|
|
385
|
+
"targetLeadCount": 500
|
|
386
|
+
})
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
Then run post-confirm routing in this order:
|
|
390
|
+
|
|
391
|
+
1. `update_campaign({ campaignId: "cmp_xxx", currentStep: "filter-choice" })`
|
|
392
|
+
2. `wait_for_campaign_table_ready({ campaignId: "cmp_xxx" })`
|
|
393
|
+
3. `get_campaign_context({ campaignId: "cmp_xxx", refresh: true })` then `get_rows_minimal(...)`
|
|
394
|
+
|
|
395
|
+
</mcp_tools>
|
|
396
|
+
|
|
397
|
+
<search_flow>
|
|
398
|
+
|
|
399
|
+
## Search Flow
|
|
400
|
+
|
|
401
|
+
1. Search signals (Round 1) → Get post data (engagement, author, content). If you already know criteria, include `headlineICPCriteria` here to persist early.
|
|
402
|
+
2. (Optional) Search signals (Round 2) → More keywords, get more post data
|
|
403
|
+
3. Select `selectionTarget` promising posts with headlineICPCriteria:
|
|
404
|
+
- What the post is discussing (relevant to ICP problems?)
|
|
405
|
+
- Who's engaging (look at author and topic)
|
|
406
|
+
- Engagement volume (more engagers = more potential ICPs)
|
|
407
|
+
- Recency (≤6 weeks = active LinkedIn users who will see outreach)
|
|
408
|
+
- **Include 3-5 headline filtering criteria**
|
|
409
|
+
4. If you are estimating whether Signals is viable before import, fetch engagers for 1-3 promising posts and compute a sampled headline pass rate before estimating reachable leads.
|
|
410
|
+
5. Ask for explicit confirmation to import leads (e.g., "Does this look right? Should I import leads now?")
|
|
411
|
+
6. If user confirms, call `import_leads`. If not, refine selections/criteria and ask again.
|
|
412
|
+
7. When the lead list finishes and the user confirms it looks good, call `confirm_lead_list`.
|
|
413
|
+
</search_flow>
|
|
414
|
+
|
|
415
|
+
<selection_rules>
|
|
416
|
+
|
|
417
|
+
## Critical Selection Rules
|
|
418
|
+
|
|
419
|
+
- **SELECT ABOUT selectionTarget POSTS** (default 3)
|
|
420
|
+
- **STRONGLY PREFER POSTS ≤6 WEEKS OLD** - These are ACTIVE LinkedIn users
|
|
421
|
+
- You do not need many posts; quality beats volume for scraping
|
|
422
|
+
- Recent engagers = Active platform users = Actually see and respond to outreach
|
|
423
|
+
- Only go beyond 6 weeks if you absolutely cannot find enough recent posts
|
|
424
|
+
- **ALWAYS include headlineICPCriteria** - this is required for automatic filtering
|
|
425
|
+
</selection_rules>
|
|
426
|
+
|
|
427
|
+
<example>
|
|
428
|
+
User: "Find leads for my AI writing tool targeting content marketers"
|
|
429
|
+
|
|
430
|
+
Round 1 - Search:
|
|
431
|
+
|
|
432
|
+
```json
|
|
433
|
+
search_signals({
|
|
434
|
+
"campaignOfferId": "cmp_xxx",
|
|
435
|
+
"keywords": [
|
|
436
|
+
{"keyword": "content marketing"},
|
|
437
|
+
{"keyword": "AI writing"},
|
|
438
|
+
{"keyword": "content strategy"},
|
|
439
|
+
{"keyword": "content ops"},
|
|
440
|
+
{"keyword": "content calendar"}
|
|
441
|
+
]
|
|
442
|
+
})
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
→ "Found 150 posts where content marketers are engaging."
|
|
446
|
+
|
|
447
|
+
Round 2 (if needed):
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
search_signals({
|
|
451
|
+
"campaignOfferId": "cmp_xxx",
|
|
452
|
+
"keywords": [
|
|
453
|
+
{"keyword": "content repurposing"},
|
|
454
|
+
{"keyword": "thought leadership content"},
|
|
455
|
+
{"keyword": "B2B content"},
|
|
456
|
+
{"keyword": "content automation"},
|
|
457
|
+
{"keyword": "content workflow"}
|
|
458
|
+
]
|
|
459
|
+
})
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
→ "Found 120 more posts. Total: 270 posts to choose from."
|
|
463
|
+
|
|
464
|
+
Selection:
|
|
465
|
+
|
|
466
|
+
```json
|
|
467
|
+
select_promising_posts({
|
|
468
|
+
"campaignOfferId": "cmp_xxx",
|
|
469
|
+
"selections": [
|
|
470
|
+
{"postId": "post1", "reason": "High engagement from content marketing leaders"},
|
|
471
|
+
{"postId": "post2", "reason": "Author is Head of Content at SaaS company"},
|
|
472
|
+
{"postId": "post3", "reason": "Fresh post with strong ICP signals"}
|
|
473
|
+
],
|
|
474
|
+
"headlineICPCriteria": [
|
|
475
|
+
"Yes if headline contains content marketing title: Content Marketing Manager, Content Strategist, Head of Content, Content Director, Content Lead",
|
|
476
|
+
"Yes if headline indicates B2B or SaaS company: B2B, SaaS, tech, software, startup",
|
|
477
|
+
"No if headline indicates student or job seeker: 'seeking', 'student', 'aspiring', 'open to work'",
|
|
478
|
+
"No if headline indicates agency or freelance: 'agency', 'freelance', 'consultant'"
|
|
479
|
+
]
|
|
480
|
+
})
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
→ "Selected 3 posts with 4 ICP criteria. Ready for scraping!"
|
|
484
|
+
</example>
|
|
485
|
+
|
|
486
|
+
<correct_flow>
|
|
487
|
+
|
|
488
|
+
## CORRECT FLOW - CRITICAL TO FOLLOW
|
|
489
|
+
|
|
490
|
+
1. Search signals (Round 1) → Get raw post data
|
|
491
|
+
2. (Optional) Search signals (Round 2) → More keywords, more posts
|
|
492
|
+
3. Select `selectionTarget` promising posts with headlineICPCriteria
|
|
493
|
+
4. Ask the user to confirm before importing leads
|
|
494
|
+
5. If user confirms, call `import_leads`
|
|
495
|
+
</correct_flow>
|