@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,398 @@
|
|
|
1
|
+
# Prospeo Enrichment Provider
|
|
2
|
+
|
|
3
|
+
Prospeo is a data enrichment API for finding verified emails and company data. Use it as an alternative to Apollo for lead enrichment.
|
|
4
|
+
|
|
5
|
+
## Search + Import (MCP)
|
|
6
|
+
|
|
7
|
+
Prospeo supports search + import in the campaign builder flow.
|
|
8
|
+
|
|
9
|
+
## Domain Filters (ABM / Account-Based Targeting)
|
|
10
|
+
|
|
11
|
+
When a user gives company domains:
|
|
12
|
+
|
|
13
|
+
1. If the domains already live in a CSV file on disk, call `load_csv_domains`.
|
|
14
|
+
2. If the user pasted raw domains into chat, call `save_domain_filters`.
|
|
15
|
+
3. Report validation feedback.
|
|
16
|
+
4. Pass the returned `domainFilterId` into `search_prospeo`.
|
|
17
|
+
|
|
18
|
+
**IMPORTANT:** NEVER pass raw domains to `search_prospeo`. ALWAYS create a `domainFilterId` first with `load_csv_domains` or `save_domain_filters`.
|
|
19
|
+
|
|
20
|
+
If a user gives company names instead of domains:
|
|
21
|
+
|
|
22
|
+
1. Resolve each company to its official website domain (use web search).
|
|
23
|
+
2. Build the include/exclude domain lists from those resolved domains.
|
|
24
|
+
3. If the domains are now in a CSV file, call `load_csv_domains`; otherwise call `save_domain_filters`.
|
|
25
|
+
4. Use returned `domainFilterId` in `search_prospeo`.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
load_csv_domains({
|
|
31
|
+
"filePath": "/absolute/path/to/accounts.csv"
|
|
32
|
+
})
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
load_csv_domains({
|
|
37
|
+
"filePath": "/absolute/path/to/accounts.csv",
|
|
38
|
+
"confirmed": true,
|
|
39
|
+
"confirmationToken": "preview-token"
|
|
40
|
+
})
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
save_domain_filters({
|
|
45
|
+
"include": ["stripe.com", "notion.so", "linear.app"],
|
|
46
|
+
"exclude": ["competitor.com"]
|
|
47
|
+
})
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
search_prospeo({
|
|
52
|
+
"campaignOfferId": "cmp_123",
|
|
53
|
+
"domainFilterId": "clx_abc123",
|
|
54
|
+
"filters": {
|
|
55
|
+
"person_seniority": { "include": ["Vice President"] }
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- Use `search_prospeo` with filters (and optional `domainFilterId`) to find leads.
|
|
61
|
+
- `search_prospeo` in MCP rejects raw domain inputs (`domains`) and nested company targeting (`filters.company.websites`, `filters.company.names`). Always use `load_csv_domains` for CSV-on-disk input or `save_domain_filters` for pasted/raw domain lists first.
|
|
62
|
+
- Pass `searchId` on subsequent pages to paginate.
|
|
63
|
+
- Use `import_leads` with `provider: \"prospeo\"` and the `searchId` to create a lead list and start import.
|
|
64
|
+
- **IMPORTANT:** If `import_leads` returns `needsModeSelection: true`, use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume.
|
|
65
|
+
- After the list finishes and the user confirms it looks good, call `confirm_lead_list` with the `jobId` and `targetLeadCount` from `import_leads` to import into the campaign table.
|
|
66
|
+
- Post-confirm routing order is required:
|
|
67
|
+
1. `update_campaign({ currentStep: "filter-choice" })`
|
|
68
|
+
2. `wait_for_campaign_table_ready({ campaignId })`
|
|
69
|
+
3. `get_campaign_context({ campaignId, refresh: true })` then `get_rows_minimal(...)` for recommendation
|
|
70
|
+
|
|
71
|
+
**Required:** Always include `campaignOfferId` on new `search_prospeo` calls so searches persist in watch mode.
|
|
72
|
+
|
|
73
|
+
## Prospeo Filters (search_prospeo)
|
|
74
|
+
|
|
75
|
+
Prospeo filters are split into person vs company. Most filters use `include` / `exclude` arrays, with a few special cases called out below.
|
|
76
|
+
|
|
77
|
+
### Filter Selection Strategy (recommended order)
|
|
78
|
+
|
|
79
|
+
1. Start with 2-3 anchors: role (`person_job_title` OR `person_department` + `person_seniority`) + company fit (`company_industry` or `domainFilterId`) + company size (`company_headcount_range`).
|
|
80
|
+
2. Add geography: prefer `person_location_search`; use `company_location_search` only when HQ is part of ICP.
|
|
81
|
+
3. Add precision filters last: `company_technology`, `company_funding`, `company_revenue`, `person_job_change`, `max_person_per_company`.
|
|
82
|
+
4. Iterate one filter at a time:
|
|
83
|
+
- Too broad: add one narrowing filter.
|
|
84
|
+
- Too narrow: remove one hard constraint (exact title, tech, location, or funding) first.
|
|
85
|
+
5. For function-specific lanes, prefer explicit function-title anchors before seniority widening:
|
|
86
|
+
- good: `Head of Security`, `Director of Security Operations`, `VP of Demand Gen`
|
|
87
|
+
- risky: bare `Head`, `Director`, `VP` plus a department guess
|
|
88
|
+
- if you widen with seniority, keep a matching department/function check and inspect the sample for `Head of X` leakage
|
|
89
|
+
|
|
90
|
+
Preference rules:
|
|
91
|
+
|
|
92
|
+
- For ABM lists, use `load_csv_domains` + `domainFilterId` when the accounts are already in a CSV file on disk.
|
|
93
|
+
- For pasted/raw domain lists, use `save_domain_filters` + `domainFilterId` instead of inline domains or `company.websites.include`.
|
|
94
|
+
- If user input starts as company names, resolve names to domains first, then use `save_domain_filters`.
|
|
95
|
+
- Prefer comprehensive `person_job_title.include` lists (synonyms + role variants) for role precision.
|
|
96
|
+
- Use `person_department + person_seniority` as supporting constraints when title variance is expected.
|
|
97
|
+
- In security, AppSec, SOC, RevOps, Demand Gen, and similar function-specific lanes, do not rely on bare `Head` / `Director` / `VP` widening by itself. Pair seniority with explicit function keywords in `person_job_title` and verify the sample for off-function titles like `Head of Social Media`.
|
|
98
|
+
- Prefer `company_headcount_range` for most sizing; use `company_headcount_custom` for precise numeric bounds.
|
|
99
|
+
- Prefer `company_industry` before `company_keywords`; use keywords for refinement, not first-pass targeting.
|
|
100
|
+
|
|
101
|
+
### Person Filters
|
|
102
|
+
|
|
103
|
+
- `person_name`: include/exclude names
|
|
104
|
+
- `person_name_or_job_title`: string quick search
|
|
105
|
+
- `person_job_title`: use include/exclude OR `boolean_search` (not both)
|
|
106
|
+
- `person_seniority`: include-only (do not mix include + exclude)
|
|
107
|
+
- `person_department`: include-only (do not mix include + exclude)
|
|
108
|
+
- `person_location_search`: include/exclude location strings from Search Suggestions (accept raw `name` or `name #ISO`)
|
|
109
|
+
- `person_year_of_experience`, `person_time_in_current_role`, `person_time_in_current_company`: `{ min, max }`
|
|
110
|
+
- `person_contact_details`: `{ email: [], mobile: [], operator: "OR" | "AND" }`
|
|
111
|
+
- `person_job_change`: `{ timeframe_days, only_promotion, only_new_company }`
|
|
112
|
+
- `max_person_per_company`
|
|
113
|
+
|
|
114
|
+
Job title boolean syntax for `person_job_title.boolean_search`:
|
|
115
|
+
`term`, `"term"`, `'term'`, `!term`, `AND`, `OR`, `()`. Do not mix AND/OR at the same level without parentheses.
|
|
116
|
+
|
|
117
|
+
### Company Filters (allowed inside /search-person)
|
|
118
|
+
|
|
119
|
+
- `company_industry`, `company_technology`, `company_email_provider`, `company_naics`, `company_sics`
|
|
120
|
+
- `company_headcount_range`: array of size strings (e.g., `["51-100", "101-200"]`)
|
|
121
|
+
- `company_headcount_custom`: `{ min, max }`
|
|
122
|
+
- `company_location_search`: include/exclude location strings from Search Suggestions
|
|
123
|
+
- `company_type`: single string (`"Private" | "Public" | "Non profit" | "Other"`)
|
|
124
|
+
- `company_funding`:
|
|
125
|
+
- `stage`: array of funding stages
|
|
126
|
+
- `funding_date`: days since last funding (`90`, `180`, `270`, `365`)
|
|
127
|
+
- `last_funding` / `total_funding`: `{ min, max }` string buckets (`"<100K"`, `"100K"`, `"500K"`, `"1M"`, `"5M"`, `"10M"`)
|
|
128
|
+
- `company_keywords`, `company_attributes`, `company_revenue`, `company_founded`, `company_headcount_growth`
|
|
129
|
+
- `company_job_posting_hiring_for`, `company_job_posting_quantity`, `company_headcount_by_department`
|
|
130
|
+
|
|
131
|
+
Domain note for MCP:
|
|
132
|
+
|
|
133
|
+
- Do NOT use `company.websites.include` or `company.names.include` in `search_prospeo`.
|
|
134
|
+
- Domain targeting in MCP must use `load_csv_domains` or `save_domain_filters` to create a `domainFilterId` first.
|
|
135
|
+
|
|
136
|
+
### Example
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
search_prospeo({
|
|
140
|
+
"campaignOfferId": "cmp_123",
|
|
141
|
+
"searchName": "VP Sales at SaaS 50-200",
|
|
142
|
+
"domainFilterId": "clx_abc123",
|
|
143
|
+
"filters": {
|
|
144
|
+
"person_seniority": { "include": ["Vice President"] },
|
|
145
|
+
"person_department": { "include": ["Sales"] },
|
|
146
|
+
"person_location_search": { "include": ["United States"] },
|
|
147
|
+
"company_headcount_range": ["51-100", "101-200"],
|
|
148
|
+
"company_industry": { "include": ["Software Development"] },
|
|
149
|
+
"company_funding": { "stage": ["Series A"], "funding_date": 180 }
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Archetype Starters (quick recipes)
|
|
155
|
+
|
|
156
|
+
1. Vertical SaaS (mid-market): Sales/Operations leaders, 51-500 employees, target vertical industry.
|
|
157
|
+
2. Devtools: Engineering leadership titles, 51-1000 employees, technology include/exclude for stack fit.
|
|
158
|
+
3. Recruiting/Staffing: TA/HR leadership titles, 201-5000 employees, people-location targeting for hiring market.
|
|
159
|
+
4. Fintech compliance/security: Risk/Compliance/Security leadership with stage/revenue constraints.
|
|
160
|
+
5. Agencies selling to growth teams: Marketing leadership in SMB/mid-market + industry fit.
|
|
161
|
+
|
|
162
|
+
## When to Use Prospeo
|
|
163
|
+
|
|
164
|
+
- **Email Finding**: Get verified work emails from LinkedIn URLs
|
|
165
|
+
- **Lead Enrichment**: Add company data, job history, and contact info to leads
|
|
166
|
+
- **Bulk Operations**: Enrich up to 100 leads at once
|
|
167
|
+
|
|
168
|
+
## Available Tools
|
|
169
|
+
|
|
170
|
+
### save_domain_filters
|
|
171
|
+
|
|
172
|
+
Save include/exclude domain lists for Prospeo search and return a `domainFilterId`.
|
|
173
|
+
|
|
174
|
+
Inputs:
|
|
175
|
+
|
|
176
|
+
- `include?: string[]` (max 1000)
|
|
177
|
+
- `exclude?: string[]` (max 1000)
|
|
178
|
+
|
|
179
|
+
### load_csv_domains
|
|
180
|
+
|
|
181
|
+
Preview and confirm a CSV file on disk, then return a `domainFilterId` for `search_prospeo`.
|
|
182
|
+
|
|
183
|
+
Use this when:
|
|
184
|
+
|
|
185
|
+
- the CSV already lives on the MCP host
|
|
186
|
+
- the user wants carryover columns preserved with the domain filter
|
|
187
|
+
- you need a bounded preview before upload
|
|
188
|
+
|
|
189
|
+
Important behavior:
|
|
190
|
+
|
|
191
|
+
- First call previews the file and returns a `confirmationToken`
|
|
192
|
+
- Confirm with the same file and token to create the `domainFilterId`
|
|
193
|
+
- Caps: `5 MB`, `7,500` rows, `1,000` unique candidate domains, `20` carryover columns
|
|
194
|
+
- Duplicate carryover rows are `last_wins`
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
|
|
198
|
+
- `id` (domain filter id)
|
|
199
|
+
- `includeDomains`, `excludeDomains` (validated)
|
|
200
|
+
- `validation` feedback (`includeValid`, `includeInvalid`, `excludeValid`, `excludeInvalid`, `dropped`)
|
|
201
|
+
|
|
202
|
+
### enrich_with_prospeo
|
|
203
|
+
|
|
204
|
+
Enrich a single person. Preferred input is LinkedIn URL.
|
|
205
|
+
|
|
206
|
+
**Inputs:**
|
|
207
|
+
|
|
208
|
+
- `linkedinUrl` (preferred) - LinkedIn profile URL
|
|
209
|
+
- OR: `firstName` + `lastName` + (`companyName` OR `companyWebsite`)
|
|
210
|
+
- `onlyVerifiedEmail` - Only return verified emails (default: true)
|
|
211
|
+
- `enrichMobile` - Include mobile number, costs 10 credits (default: false)
|
|
212
|
+
|
|
213
|
+
**Returns:**
|
|
214
|
+
|
|
215
|
+
- Person: name, title, headline, email, emailStatus, phone, location
|
|
216
|
+
- Company: name, domain, industry, employeeRange
|
|
217
|
+
|
|
218
|
+
**Cost:** 1 credit (10 if enrichMobile=true)
|
|
219
|
+
|
|
220
|
+
**Example:**
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
enrich_with_prospeo({
|
|
224
|
+
"linkedinUrl": "https://linkedin.com/in/johndoe"
|
|
225
|
+
})
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Response:**
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"success": true,
|
|
233
|
+
"creditsUsed": 1,
|
|
234
|
+
"person": {
|
|
235
|
+
"name": "John Doe",
|
|
236
|
+
"title": "VP of Sales",
|
|
237
|
+
"headline": "VP of Sales | B2B SaaS",
|
|
238
|
+
"email": "john.doe@company.com",
|
|
239
|
+
"emailStatus": "VERIFIED",
|
|
240
|
+
"linkedinUrl": "https://linkedin.com/in/johndoe",
|
|
241
|
+
"location": "San Francisco, CA, USA"
|
|
242
|
+
},
|
|
243
|
+
"company": {
|
|
244
|
+
"name": "Company Inc",
|
|
245
|
+
"domain": "company.com",
|
|
246
|
+
"industry": "Software",
|
|
247
|
+
"employeeRange": "51-200"
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### bulk_enrich_with_prospeo
|
|
253
|
+
|
|
254
|
+
Enrich multiple people at once. Each input needs a unique identifier.
|
|
255
|
+
|
|
256
|
+
**Inputs:**
|
|
257
|
+
|
|
258
|
+
- `inputs` - Array of objects with:
|
|
259
|
+
- `identifier` (required) - Unique ID for correlation
|
|
260
|
+
- `linkedin_url` OR name+company fields
|
|
261
|
+
- `onlyVerifiedEmail` (default: true)
|
|
262
|
+
|
|
263
|
+
**Returns:**
|
|
264
|
+
|
|
265
|
+
- `matched` - Array of successful enrichments
|
|
266
|
+
- `notMatched` - Array of identifiers that couldn't be found
|
|
267
|
+
- `summary` - Counts of requested/matched/notMatched
|
|
268
|
+
|
|
269
|
+
**Cost:** 1 credit per match (not per request)
|
|
270
|
+
|
|
271
|
+
**Example:**
|
|
272
|
+
|
|
273
|
+
```json
|
|
274
|
+
bulk_enrich_with_prospeo({
|
|
275
|
+
"inputs": [
|
|
276
|
+
{ "identifier": "lead-1", "linkedin_url": "https://linkedin.com/in/johndoe" },
|
|
277
|
+
{ "identifier": "lead-2", "first_name": "Jane", "last_name": "Smith", "company_name": "Acme Corp" }
|
|
278
|
+
]
|
|
279
|
+
})
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Response:**
|
|
283
|
+
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"success": true,
|
|
287
|
+
"totalCost": 2,
|
|
288
|
+
"summary": { "requested": 2, "matched": 2, "notMatched": 0, "invalid": 0 },
|
|
289
|
+
"matched": [
|
|
290
|
+
{
|
|
291
|
+
"identifier": "lead-1",
|
|
292
|
+
"name": "John Doe",
|
|
293
|
+
"email": "john@company.com",
|
|
294
|
+
"emailStatus": "VERIFIED",
|
|
295
|
+
"company": "Company Inc"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"identifier": "lead-2",
|
|
299
|
+
"name": "Jane Smith",
|
|
300
|
+
"email": "jane@acme.com",
|
|
301
|
+
"emailStatus": "VERIFIED",
|
|
302
|
+
"company": "Acme Corp"
|
|
303
|
+
}
|
|
304
|
+
],
|
|
305
|
+
"notMatched": [],
|
|
306
|
+
"invalidDatapoints": []
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### get_prospeo_credits
|
|
311
|
+
|
|
312
|
+
Check remaining credits before bulk operations.
|
|
313
|
+
|
|
314
|
+
**Returns:**
|
|
315
|
+
|
|
316
|
+
- `remainingCredits` - Credits available
|
|
317
|
+
- `plan` - Current subscription plan
|
|
318
|
+
- `renewsInDays` - Days until quota resets
|
|
319
|
+
|
|
320
|
+
**Example:**
|
|
321
|
+
|
|
322
|
+
```json
|
|
323
|
+
get_prospeo_credits({})
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Response:**
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
{
|
|
330
|
+
"plan": "Business",
|
|
331
|
+
"remainingCredits": 4500,
|
|
332
|
+
"usedCredits": 500,
|
|
333
|
+
"renewsInDays": 15
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Workflow Patterns
|
|
338
|
+
|
|
339
|
+
### Single Lead Enrichment
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
1. User provides LinkedIn URL
|
|
343
|
+
2. Call enrich_with_prospeo with linkedinUrl
|
|
344
|
+
3. If emailStatus is "VERIFIED", proceed with outreach
|
|
345
|
+
4. If emailStatus is "UNAVAILABLE" or null, note that no verified email exists
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Bulk Lead Enrichment
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
1. Check credits: get_prospeo_credits
|
|
352
|
+
2. Prepare inputs with unique identifiers (e.g., row IDs)
|
|
353
|
+
3. Call bulk_enrich_with_prospeo (max 100 per call)
|
|
354
|
+
4. Map matched results back using identifier
|
|
355
|
+
5. Handle notMatched entries (may need Apollo fallback)
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Email Status Values
|
|
359
|
+
|
|
360
|
+
| Status | Meaning | Action |
|
|
361
|
+
| ------------- | -------------------------------- | ------------------------ |
|
|
362
|
+
| `VERIFIED` | Email confirmed deliverable | Safe to use for outreach |
|
|
363
|
+
| `CATCH_ALL` | Domain accepts all emails | May work, higher risk |
|
|
364
|
+
| `UNAVAILABLE` | No email found | Try alternative methods |
|
|
365
|
+
| `INVALID` | Email exists but not deliverable | Do not use |
|
|
366
|
+
|
|
367
|
+
## Apollo vs Prospeo Comparison
|
|
368
|
+
|
|
369
|
+
| Feature | Apollo | Prospeo |
|
|
370
|
+
| ------------------ | --------------- | -------------------------- |
|
|
371
|
+
| Best for | Search + enrich | Direct LinkedIn enrichment |
|
|
372
|
+
| LinkedIn URL input | Via bulk_match | Native support |
|
|
373
|
+
| Email verification | Separate step | Included |
|
|
374
|
+
| Mobile numbers | Via enrichment | 10 credits extra |
|
|
375
|
+
| Max bulk size | 10 | 100 |
|
|
376
|
+
| Duplicate handling | Charged | FREE (same record twice) |
|
|
377
|
+
|
|
378
|
+
**Recommendation:** Use Prospeo when you have LinkedIn URLs. Use Apollo when you need to search by filters (titles, company size, industry, etc.).
|
|
379
|
+
|
|
380
|
+
## Credit Management
|
|
381
|
+
|
|
382
|
+
| Operation | Cost |
|
|
383
|
+
| -------------------- | ---------------------------------- |
|
|
384
|
+
| Single enrich | 1 credit |
|
|
385
|
+
| Bulk enrich | 1 credit per match (not per input) |
|
|
386
|
+
| Mobile number | +10 credits |
|
|
387
|
+
| Account info | FREE |
|
|
388
|
+
| Duplicate enrichment | FREE (same record twice) |
|
|
389
|
+
|
|
390
|
+
Always check `get_prospeo_credits` before large bulk operations.
|
|
391
|
+
|
|
392
|
+
## Best Practices
|
|
393
|
+
|
|
394
|
+
1. **Prefer LinkedIn URLs** - Higher match rate than name+company
|
|
395
|
+
2. **Check credits first** - Avoid failed bulk operations
|
|
396
|
+
3. **Use identifiers** - Map results back to your data source
|
|
397
|
+
4. **Handle failures gracefully** - Some leads won't match
|
|
398
|
+
5. **Batch efficiently** - Use bulk for 10+ leads to reduce API calls
|