Prospector
This skill should be used when the user wants to find leads, prospects, or contacts matching their ICP (Ideal Customer Profile). It searches for companies via Exa and enriches cont…
slempiam
@slempiam
What This Skill Does
Guided workflow that searches for companies matching an Ideal Customer Profile using Exa, enriches contact data via Apollo, and exports results to a CSV file with optional sync to Attio CRM.
Replaces manual lead research and spreadsheet building by automating company discovery, contact enrichment, and CRM export in a single interactive session.
When to Use It
- Generate a targeted lead list for a new sales territory
- Find decision-makers at SaaS companies in Series A stage
- Export enriched contacts for a cold email campaign
- Sync qualified prospects directly to Attio CRM
- Research companies in a specific industry and geography
- Build a CSV of contacts matching your ICP for manual review
Install
$ openclaw skills install @slempiam/prospectorProspector
Find leads matching your ICP via Exa company search + Apollo contact enrichment.
Prerequisites
Run /prospector:setup first to configure your API keys:
- Exa (required): https://exa.ai - company discovery
- Apollo (required): https://apollo.io - contact enrichment
- Attio (optional): https://attio.com - CRM sync
You can also set keys via environment variables:
PROSPECTOR_EXA_API_KEYPROSPECTOR_APOLLO_API_KEYPROSPECTOR_ATTIO_API_KEY(optional)
Usage
Setup (one-time)
/prospector:setup
Collects and validates API keys, stores securely in ~/.config/prospector/config.json.
Find Leads
/prospector
Asks ICP questions, searches Exa, enriches via Apollo, outputs CSV to Desktop.
Main Command: /prospector
When the user invokes /prospector, follow this workflow:
Step 1: Check Config or Env Vars
First, verify env vars or config exist:
python3 -c "
import json
import os
from pathlib import Path
config_path = Path.home() / '.config' / 'prospector' / 'config.json'
env_exa = bool(os.getenv('PROSPECTOR_EXA_API_KEY'))
env_apollo = bool(os.getenv('PROSPECTOR_APOLLO_API_KEY'))
env_attio = bool(os.getenv('PROSPECTOR_ATTIO_API_KEY'))
if not config_path.exists():
print('NOT_FOUND')
else:
with open(config_path) as f:
config = json.load(f)
print('FOUND')
print(f'exa: {bool(config.get(\"exa_api_key\"))}')
print(f'apollo: {bool(config.get(\"apollo_api_key\"))}')
print(f'attio: {bool(config.get(\"attio_api_key\"))}')
print(f'env_exa: {env_exa}')
print(f'env_apollo: {env_apollo}')
print(f'env_attio: {env_attio}')
"
If NOT_FOUND and env vars are not set, tell user to run /prospector:setup first.
Step 2: Ask ICP Questions
Use AskUserQuestion to collect ICP criteria in order:
Question 1: Industry
header: "Industry"
question: "What industry are you targeting?"
options:
- label: "SaaS"
description: "Software as a Service companies"
- label: "Fintech"
description: "Financial technology companies"
- label: "Healthcare"
description: "Healthcare and health tech"
- label: "E-commerce"
description: "Online retail and marketplaces"
- label: "AI/ML"
description: "Artificial intelligence and machine learning"
- label: "Any"
description: "No industry filter"
multiSelect: false
Question 2: Company Size
header: "Size"
question: "What company size are you targeting?"
options:
- label: "1-10"
description: "Early stage startups"
- label: "11-50"
description: "Seed to Series A"
- label: "51-200"
description: "Series A to B"
- label: "201-500"
description: "Growth stage"
- label: "500+"
description: "Enterprise"
- label: "Any"
description: "No size filter"
multiSelect: false
Question 3: Funding Stage
header: "Funding"
question: "What funding stage are you targeting?"
options:
- label: "Pre-seed"
description: "Pre-product market fit"
- label: "Seed"
description: "Building initial product"
- label: "Series A"
description: "Scaling product"
- label: "Series B+"
description: "Growth and expansion"
- label: "Any"
description: "No funding filter"
multiSelect: false
Question 4: Geography
header: "Geography"
question: "What geography are you targeting?"
options:
- label: "United States"
description: "US-based companies"
- label: "Europe"
description: "European companies"
- label: "Global"
description: "Worldwide"
- label: "Any"
description: "No geography filter"
multiSelect: false
Question 5: Keywords (optional)
header: "Keywords"
question: "Any specific keywords that should appear in company descriptions? (optional)"
options:
- label: "Skip"
description: "No keyword filter"
- label: "Enter keywords"
description: "I'll type specific keywords"
multiSelect: false
If "Enter keywords", ask for the text input.
Question 6: Contact Count
header: "Count"
question: "How many contacts do you want to find?"
options:
- label: "25"
description: "Quick search, lower API usage"
- label: "50"
description: "Balanced (recommended)"
- label: "100"
description: "Larger batch, more API usage"
multiSelect: false
Step 3: Run Search
Execute the Python script with the collected ICP:
cd [skill_directory]/scripts
python3 -c "
from prospector import run_search, export_csv, Config
icp = {
'industry': '[INDUSTRY]',
'company_size': '[SIZE]',
'funding_stage': '[FUNDING]',
'geography': '[GEOGRAPHY]',
'keywords': '[KEYWORDS or empty string]'
}
leads = run_search(icp, num_contacts=[COUNT])
if leads:
path = export_csv(leads)
print(f'SUCCESS: {len(leads)} leads saved to {path}')
else:
print('NO_RESULTS: No leads found matching criteria')
"
Replace placeholders with actual values from questions.
Step 4: Attio Sync (if configured)
If Attio is configured and leads were found, ask:
header: "Attio"
question: "Sync leads to Attio CRM?"
options:
- label: "Yes"
description: "Sync companies and contacts to Attio"
- label: "No"
description: "Just keep the CSV"
multiSelect: false
If yes:
cd [skill_directory]/scripts
python3 -c "
from prospector import sync_to_attio, Config, Lead
import json
# Load leads from the CSV we just created (or pass them directly)
# For simplicity, re-run with sync
leads = [...] # Pass leads from previous step
companies, people = sync_to_attio(leads)
print(f'SYNCED: {companies} companies, {people} contacts')
"
Step 5: Report Results
Tell the user:
- How many leads were found
- Where the CSV was saved
- If Attio sync was done, how many records were synced
Error Handling
- Config not found: Tell user to run
/prospector:setup - Invalid API key: Tell user which key failed, suggest re-running setup
- No results: Suggest broadening ICP criteria
- Partial failures: Report what succeeded, warn about failures
Top skills in this category
API Gateway
@byungkyuCall third-party APIs through the Maton gateway, which injects the credential for an app the user has already connected. Use this skill when the user names a connected app and a concrete action in it - read a mailbox, query a CRM, file an issue, update a spreadsheet, run a query through a connected
Marketing Mode
@thesethroseMarketing Mode combines 23 comprehensive marketing skills covering strategy, psychology, content, SEO, conversion optimization, and paid growth. Use when users need marketing strategy, copywriting, SEO help, conversion optimization, paid advertising, or any marketing tactic.
Blogwatcher
@steipeteMonitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.
Marketing Skills
@jchopard69Access 23 marketing modules offering checklists, frameworks, and ready-to-use deliverables for CRO, SEO, copywriting, analytics, launches, ads, and social me...
diagram-generator
@matthewyinGenerate and edit diagrams with the mcp-diagram-generator MCP server. Use this skill for new diagrams, existing .drawio/.mmd/.excalidraw edits, network topology, architecture, flowchart, swimlane, sequence, class, ER, and Excalidraw whiteboard work. Always use this skill when the user asks to draw,