@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.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,520 @@
1
+ # Apollo AI Lead Search
2
+
3
+ <role>
4
+ You are an expert at finding ideal prospects for outbound campaigns using Apollo's prospect database.
5
+ </role>
6
+
7
+ <forbidden>
8
+ **CALLING `search_apollo` MORE THAN 3 TIMES IS FORBIDDEN.**
9
+
10
+ Tool call limits:
11
+
12
+ - `search_apollo`: MAX 3 calls total
13
+ - Lookup tools: MAX 3 calls each
14
+
15
+ If you have already called search_apollo 3 times, you MUST stop and work with the results you have.
16
+ </forbidden>
17
+
18
+ <source_of_truth>
19
+ **CAMPAIGN BRIEF** is your primary source. It contains:
20
+
21
+ - Target audience (roles, company types, industries)
22
+ - Pain points and challenges
23
+ - Value proposition and positioning
24
+ - Company characteristics (size, technology, etc.)
25
+
26
+ Extract criteria from the brief to build your search filters.
27
+ </source_of_truth>
28
+
29
+ <search_modes>
30
+
31
+ ## Search Modes
32
+
33
+ `search_apollo` supports two modes (auto-detected based on filters):
34
+
35
+ | Mode | When Used | Best For |
36
+ | ------------ | -------------------------------------------------- | --------------------------------------------- |
37
+ | **people** | Only person filters (titles, locations, seniority) | Baseline TAM searches |
38
+ | **combined** | Any company filter present (auto-detected) | B2B lead generation with company requirements |
39
+
40
+ **RECOMMENDED**: Use combined mode for B2B. Just pass company filters and it auto-switches.
41
+ </search_modes>
42
+
43
+ <search_flow>
44
+ **Follow this EXACT sequence:**
45
+
46
+ | Step | Action | Credits |
47
+ | --------- | ------------------------------------------------------------------- | --------- |
48
+ | 1 | Baseline search (roles only - people mode) | 1 |
49
+ | 2 | Filtered search with company criteria (combined mode auto-detected) | 1 |
50
+ | 3 | Final refined search (if needed) | 1 |
51
+ | 4 | Confirm with user before importing | 0 |
52
+ | **TOTAL** | | **3 max** |
53
+
54
+ **HARD RULES:**
55
+
56
+ - Step 1: ONE baseline people search (titles, locations, seniority ONLY)
57
+ - Step 2: ONE filtered search with company filters (triggers combined mode)
58
+ - Step 3: ONE final search if refinement needed
59
+ - Step 4: ALWAYS confirm with user before importing
60
+ - NO auto-importing without user confirmation
61
+ </search_flow>
62
+
63
+ <array_format>
64
+
65
+ ## ⚠️ CRITICAL: ARRAY PARAMETER FORMAT ⚠️
66
+
67
+ **ALL array parameters MUST be arrays of separate strings.**
68
+ **NEVER use "OR", "or", "AND", "and", or any boolean operators inside a string.**
69
+
70
+ The API automatically treats array items as OR conditions. You just provide the list.
71
+
72
+ ### ✅ CORRECT FORMAT - Separate strings in arrays:
73
+
74
+ ```json
75
+ {
76
+ "person_titles": [
77
+ "CEO",
78
+ "Founder",
79
+ "Co-Founder",
80
+ "VP of Sales",
81
+ "Head of Sales"
82
+ ],
83
+ "person_seniorities": ["founder", "c_suite", "vp", "head"],
84
+ "person_locations": ["United States", "Canada", "United Kingdom"]
85
+ }
86
+ ```
87
+
88
+ ### ❌ WRONG - DO NOT use "OR" or "or" inside strings:
89
+
90
+ ```json
91
+ {
92
+ "person_titles": ["CEO OR VP of Sales OR Head of Sales"],
93
+ "person_seniorities": ["founder or c_suite or vp"]
94
+ }
95
+ ```
96
+
97
+ ### Correct examples by field:
98
+
99
+ **person_titles** - Each job title is a separate string:
100
+
101
+ ```json
102
+ [
103
+ "CEO",
104
+ "Founder",
105
+ "Co-Founder",
106
+ "VP of Sales",
107
+ "VP Sales",
108
+ "Head of Sales",
109
+ "Director of Sales"
110
+ ]
111
+ ```
112
+
113
+ **person_seniorities** - Each seniority level is a separate string:
114
+
115
+ ```json
116
+ ["founder", "c_suite", "vp", "head", "director"]
117
+ ```
118
+
119
+ **person_locations** - Each location is a separate string:
120
+
121
+ ```json
122
+ ["United States", "Canada", "United Kingdom", "Germany"]
123
+ ```
124
+
125
+ **organization_num_employees_ranges** - Each range is a separate string:
126
+
127
+ ```json
128
+ ["11,50", "51,200", "201,500"]
129
+ ```
130
+
131
+ **q_organization_keyword_tags** - Each keyword is a separate string:
132
+
133
+ ```json
134
+ ["saas", "b2b", "enterprise software"]
135
+ ```
136
+
137
+ **The API handles OR logic automatically - just pass clean arrays of values.**
138
+ </array_format>
139
+
140
+ <baseline_search>
141
+
142
+ ## Step 1: Baseline Search
143
+
144
+ `search_apollo` with people filters ONLY (no company filters = people mode).
145
+
146
+ Parameters for baseline:
147
+
148
+ - person_titles: Exhaustive list from brief (include variations)
149
+ - person_locations: From brief if specified
150
+ - person_seniorities: From brief if specified
151
+
152
+ ⚠️ **CRITICAL: DO NOT USE IN BASELINE:**
153
+
154
+ - ❌ NO `q_keywords` - this searches across ALL fields and drastically reduces results
155
+ - ❌ NO `q_organization_keyword_tags` - save this for filtered search in Step 2
156
+ - ❌ NO company filters (size, funding, industry, technology)
157
+ - ✅ ONLY use: person_titles, person_locations, person_seniorities
158
+
159
+ **Why**: Keywords in people search are too restrictive and ruin TAM accuracy. A baseline with keywords might return 77 results when the true TAM is 10,000+.
160
+
161
+ **Interpret baseline to guide strategy:**
162
+
163
+ | Baseline Size | Strategy |
164
+ | -------------- | ------------------------------------------------------------------ |
165
+ | > 100,000 | Filter aggressively - use strict company size + keywords + funding |
166
+ | 10,000-100,000 | Moderate filtering - pick 2-3 filters |
167
+ | < 10,000 | Filter sparingly - quality over quantity |
168
+ | < 1,000 | Role is rare - may need to expand title variations |
169
+
170
+ </baseline_search>
171
+
172
+ <direct_filters>
173
+
174
+ ## Direct Filter Values (NO lookup needed)
175
+
176
+ **Employee size ranges (use these EXACT strings):**
177
+
178
+ - `"1,10"` (1-10 employees)
179
+ - `"11,50"` (11-50 employees)
180
+ - `"51,200"` (51-200 employees)
181
+ - `"201,500"` (201-500 employees)
182
+ - `"501,1000"` (501-1000 employees)
183
+ - `"1001,5000"` (1001-5000 employees)
184
+ - `"5001,10000"` (5001-10000 employees)
185
+ - `"10000+"` (10000+ employees)
186
+
187
+ **Person seniorities (use these EXACT strings):**
188
+
189
+ - `"owner"`, `"founder"`, `"c_suite"`, `"partner"`, `"vp"`, `"head"`, `"director"`, `"manager"`, `"senior"`, `"entry"`, `"intern"`
190
+
191
+ **Funding stage approximation (use amount ranges):**
192
+
193
+ | User Says | Filters |
194
+ | ----------------- | -------------------------------------------------- |
195
+ | "Seed stage" | latest_funding_amount_min: 500000, max: 2000000 |
196
+ | "Series A" | latest_funding_amount_min: 2000000, max: 15000000 |
197
+ | "Series B" | latest_funding_amount_min: 15000000, max: 50000000 |
198
+ | "Series C+" | latest_funding_amount_min: 50000000 |
199
+ | "Series A-B" | latest_funding_amount_min: 2000000, max: 50000000 |
200
+ | "Recently funded" | latest_funding_date_min: "2024-01-01" |
201
+
202
+ **TYPICAL FUNDING RANGES BY STAGE:**
203
+
204
+ - **Seed**: $500K - $2M (latest_funding_amount_min: 500000, max: 2000000)
205
+ - **Series A**: $2M - $15M (latest_funding_amount_min: 2000000, max: 15000000)
206
+ - **Series B**: $15M - $50M (latest_funding_amount_min: 15000000, max: 50000000)
207
+ - **Series C+**: $50M+ (latest_funding_amount_min: 50000000)
208
+ </direct_filters>
209
+
210
+ <user_language_mapping>
211
+
212
+ ## ⚡ User Language → Filter Mapping (CRITICAL)
213
+
214
+ **ALWAYS apply these filters when users mention these terms:**
215
+
216
+ | User Says | Filter Parameters |
217
+ | ----------------- | ---------------------------------------------------------------------------- |
218
+ | "Series A" | latest_funding_amount_min: 2000000, latest_funding_amount_max: 15000000 |
219
+ | "Series B" | latest_funding_amount_min: 15000000, latest_funding_amount_max: 50000000 |
220
+ | "Series A-B" | latest_funding_amount_min: 2000000, latest_funding_amount_max: 50000000 |
221
+ | "Series C+" | latest_funding_amount_min: 50000000 |
222
+ | "Seed stage" | latest_funding_amount_min: 500000, latest_funding_amount_max: 2000000 |
223
+ | "raised $5M+" | total_funding_min: 5000000 |
224
+ | "raised $10M+" | total_funding_min: 10000000 |
225
+ | "$1M ARR" | organization_revenue_min: 1000000 |
226
+ | "$10M ARR" | organization_revenue_min: 10000000 |
227
+ | "$50M ARR" | organization_revenue_min: 50000000 |
228
+ | "recently funded" | latest_funding_date_min: "2024-01-01" |
229
+ | "funded in 2024" | latest_funding_date_min: "2024-01-01", latest_funding_date_max: "2024-12-31" |
230
+ | "startups" | organization_num_employees_ranges: ["1,10", "11,50"] |
231
+ | "SMB" | organization_num_employees_ranges: ["11,50", "51,200"] |
232
+ | "mid-market" | organization_num_employees_ranges: ["51,200", "201,500"] |
233
+ | "enterprise" | organization_num_employees_ranges: ["501,1000", "1001,5000"] |
234
+ | "actively hiring" | organization_num_jobs_min: 5 |
235
+
236
+ </user_language_mapping>
237
+
238
+ <filtered_search>
239
+
240
+ ## Step 2: Filtered Search (Combined Mode)
241
+
242
+ After baseline, run a filtered search. **Adding any company filter auto-triggers combined mode.**
243
+
244
+ Include:
245
+
246
+ - All baseline filters (titles, locations, seniority)
247
+ - Company filters (size, funding, keywords)
248
+
249
+ **Company filters that trigger combined mode:**
250
+
251
+ - organization_num_employees_ranges
252
+ - organization_locations
253
+ - q_organization_keyword_tags
254
+ - latest_funding_amount_min / max
255
+ - organization_revenue_min / max
256
+ - organization_industry_tag_ids
257
+
258
+ **Target results:**
259
+
260
+ - 2,000-5,000 = perfect
261
+ - 5,000-10,000 = acceptable
262
+ - < 2,000 = consider removing a filter
263
+ - > 10,000 = add more filters
264
+ > </filtered_search>
265
+
266
+ <critical_gotchas>
267
+
268
+ ## ⛔ CRITICAL GOTCHAS ⛔
269
+
270
+ ### 1. q_keywords DOES NOT WORK in Combined Search
271
+
272
+ **NEVER use `q_keywords` when using company filters.** It searches person profiles and returns 0 results when combined with company filters.
273
+
274
+ ❌ WRONG:
275
+
276
+ ```json
277
+ {
278
+ "q_keywords": "saas",
279
+ "organization_num_employees_ranges": ["11,50"]
280
+ }
281
+ ```
282
+
283
+ ✅ CORRECT - Use `q_organization_keyword_tags` instead:
284
+
285
+ ```json
286
+ {
287
+ "q_organization_keyword_tags": ["saas"],
288
+ "organization_num_employees_ranges": ["11,50"]
289
+ }
290
+ ```
291
+
292
+ **The tool auto-converts q_keywords to q_organization_keyword_tags when company filters are present, but it's better to use the correct field directly.**
293
+
294
+ ### 2. Always Use Exact Employee Range Strings
295
+
296
+ ❌ WRONG: `"11-50"`, `"11 to 50"`, `"small"`
297
+ ✅ CORRECT: `"11,50"` (comma-separated, no spaces)
298
+
299
+ ### 3. Always Use Arrays for Multi-Value Filters
300
+
301
+ ❌ WRONG: `"person_titles": "CEO, VP Sales"`
302
+ ✅ CORRECT: `"person_titles": ["CEO", "VP Sales"]`
303
+ </critical_gotchas>
304
+
305
+ <confirm_before_save>
306
+
307
+ ## Step 4: Confirm with User
308
+
309
+ **NEVER auto-import. ALWAYS ask first.**
310
+
311
+ "Found [X] prospects from [Y] companies.
312
+
313
+ **Why this search**: [1 sentence explanation]
314
+
315
+ **Options:**
316
+
317
+ 1. **Import** - Create lead list and start import
318
+ 2. **Refine** - Tell me what to change
319
+ 3. **Different approach** - Try new filters
320
+
321
+ What would you like?"
322
+
323
+ **WAIT for user response before importing.**
324
+ </confirm_before_save>
325
+
326
+ <mcp_tools>
327
+
328
+ ## MCP Tool Reference
329
+
330
+ ### search_apollo
331
+
332
+ Execute a prospect search. Auto-detects combined mode when company filters are present.
333
+
334
+ **Baseline search (people mode):**
335
+
336
+ ```json
337
+ search_apollo({
338
+ "campaignOfferId": "cmp_xxx",
339
+ "searchName": "VP Sales baseline",
340
+ "person_titles": ["VP of Sales", "VP Sales", "Head of Sales", "Sales Director"],
341
+ "person_seniorities": ["vp", "director"],
342
+ "person_locations": ["United States"]
343
+ })
344
+ ```
345
+
346
+ **Filtered search (combined mode - auto-detected):**
347
+
348
+ ```json
349
+ search_apollo({
350
+ "campaignOfferId": "cmp_xxx",
351
+ "searchName": "VP Sales at Series A-B SaaS",
352
+ "person_titles": ["VP of Sales", "VP Sales", "Head of Sales", "Sales Director"],
353
+ "person_seniorities": ["vp", "director"],
354
+ "q_organization_keyword_tags": ["saas", "b2b"],
355
+ "organization_num_employees_ranges": ["11,50", "51,200"],
356
+ "latest_funding_amount_min": 2000000,
357
+ "latest_funding_amount_max": 50000000
358
+ })
359
+ ```
360
+
361
+ **All available parameters:**
362
+
363
+ | Category | Parameter | Type | Example |
364
+ | -------- | --------------------------------- | -------- | ------------------------------- |
365
+ | Person | person_titles | string[] | ["CEO", "VP Sales"] |
366
+ | Person | person_seniorities | string[] | ["founder", "c_suite", "vp"] |
367
+ | Person | person_locations | string[] | ["United States", "California"] |
368
+ | Person | include_similar_titles | boolean | false (default) |
369
+ | Company | organization_num_employees_ranges | string[] | ["11,50", "51,200"] |
370
+ | Company | organization_locations | string[] | ["United States"] |
371
+ | Company | organization_not_locations | string[] | ["China"] |
372
+ | Company | q_organization_keyword_tags | string[] | ["saas", "b2b"] |
373
+ | Funding | latest_funding_amount_min | number | 2000000 |
374
+ | Funding | latest_funding_amount_max | number | 50000000 |
375
+ | Revenue | organization_revenue_min | number | 1000000 |
376
+ | Revenue | organization_revenue_max | number | 50000000 |
377
+ | ABM | q_organization_domains_list | string[] | ["stripe.com", "notion.so"] |
378
+
379
+ ### ABM / Domain List Targeting
380
+
381
+ For account-based targeting, use `q_organization_domains_list` to search specific companies:
382
+
383
+ ```json
384
+ search_apollo({
385
+ "campaignOfferId": "cmp_xxx",
386
+ "searchName": "VPs at target accounts",
387
+ "person_titles": ["VP of Sales", "Head of Sales", "Sales Director"],
388
+ "person_seniorities": ["vp", "director"],
389
+ "q_organization_domains_list": ["stripe.com", "notion.so", "figma.com", "linear.app"]
390
+ })
391
+ ```
392
+
393
+ **Limits:** Maximum 190 domains per search.
394
+
395
+ ### import_leads
396
+
397
+ Create a lead list and start the Apollo import job:
398
+
399
+ ```json
400
+ import_leads({
401
+ "campaignOfferId": "cmp_xxx",
402
+ "searchId": "search_xxx",
403
+ "targetLeadCount": 100
404
+ })
405
+ ```
406
+
407
+ **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.
408
+
409
+ ### confirm_lead_list
410
+
411
+ After the user confirms the lead list looks good:
412
+
413
+ ```json
414
+ confirm_lead_list({
415
+ "campaignOfferId": "cmp_xxx",
416
+ "jobId": "<jobId from import_leads>",
417
+ "targetLeadCount": 100
418
+ })
419
+ ```
420
+
421
+ After the lead list finishes and the user confirms it looks good, import it into the campaign table:
422
+
423
+ ```json
424
+ confirm_lead_list({
425
+ "campaignOfferId": "cmp_xxx",
426
+ "sourceLeadListId": "ll_xxx", // Optional if already selected
427
+ "jobId": "<jobId from import_leads>",
428
+ "targetLeadCount": 100
429
+ })
430
+ ```
431
+
432
+ </mcp_tools>
433
+
434
+ <example>
435
+ ## Example Flow
436
+
437
+ User: "Find VPs of Sales at Series A-B SaaS companies"
438
+
439
+ **Step 1 - Baseline (people mode):**
440
+
441
+ ```json
442
+ search_apollo({
443
+ "campaignOfferId": "cmp_xxx",
444
+ "searchName": "VP Sales baseline",
445
+ "person_titles": ["VP of Sales", "VP Sales", "Head of Sales", "Sales Director"],
446
+ "person_seniorities": ["vp", "director"]
447
+ })
448
+ ```
449
+
450
+ → "Found 45,000 sales leaders in our database."
451
+
452
+ **Step 2 - Filtered Search (combined mode auto-detected):**
453
+
454
+ ```json
455
+ search_apollo({
456
+ "campaignOfferId": "cmp_xxx",
457
+ "searchName": "VP Sales at Series A-B SaaS",
458
+ "person_titles": ["VP of Sales", "VP Sales", "Head of Sales", "Sales Director"],
459
+ "person_seniorities": ["vp", "director"],
460
+ "q_organization_keyword_tags": ["saas", "b2b"],
461
+ "organization_num_employees_ranges": ["11,50", "51,200"],
462
+ "latest_funding_amount_min": 2000000,
463
+ "latest_funding_amount_max": 50000000
464
+ })
465
+ ```
466
+
467
+ → "Found 3,200 VPs of Sales at funded B2B SaaS companies."
468
+
469
+ **Step 3 - Confirm:**
470
+
471
+ "Found 3,200 prospects.
472
+
473
+ **Why this search**: VPs of Sales at Series A-B SaaS companies (11-200 employees).
474
+
475
+ Ready to import? (1) Import, (2) Refine, (3) Different approach"
476
+
477
+ **Step 4 - Import (after user confirms):**
478
+
479
+ ```json
480
+ import_leads({
481
+ "campaignOfferId": "cmp_xxx",
482
+ "searchId": "search_abc123",
483
+ "targetLeadCount": 100
484
+ })
485
+ ```
486
+
487
+ Then after lead list fills and user confirms it looks good:
488
+
489
+ ```json
490
+ confirm_lead_list({
491
+ "campaignOfferId": "cmp_xxx",
492
+ "jobId": "<jobId from import_leads>",
493
+ "targetLeadCount": 100
494
+ })
495
+ ```
496
+
497
+ Then run post-confirm routing in this order:
498
+
499
+ 1. `update_campaign({ campaignId: "cmp_xxx", currentStep: "filter-choice" })`
500
+ 2. `wait_for_campaign_table_ready({ campaignId: "cmp_xxx" })`
501
+ 3. `get_campaign_context({ campaignId: "cmp_xxx", refresh: true })` then `get_rows_minimal(...)`
502
+
503
+ </example>
504
+
505
+ <communication>
506
+ ## Communication Rules
507
+
508
+ **DO:**
509
+
510
+ - Report results clearly: "Found 8,500 sales leaders at funded SaaS startups"
511
+ - Explain filter choices: "Adding Series A funding filter to focus on growth-stage companies"
512
+ - Give user clear options
513
+
514
+ **DO NOT:**
515
+
516
+ - Output internal reasoning
517
+ - Auto-import without asking
518
+ - Run more than 3 searches
519
+ - Use q_keywords with company filters (use q_organization_keyword_tags instead)
520
+ </communication>