ClawSkills logoClawSkills

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 E

Introduction

# Prospector

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_KEY` - `PROSPECTOR_APOLLO_API_KEY` - `PROSPECTOR_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:

```bash 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:

```bash 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:

```bash 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

More Products