ICP-to-list pipeline. Describe your ideal customer in plain English and get a sized, previewed, and exportable list of matching businesses or prospects.
Go from a plain-English ICP to a ready-to-export lead list using autocomplete → stats → fetch. The user describes their target via "$ARGUMENTS".
/vibeprospecting-plugin:generate-list Series B SaaS companies in the US, 51-200 employees/vibeprospecting-plugin:generate-list VP of Sales at fintech companies, 201-500 employees/vibeprospecting-plugin:generate-list CTOs at companies using Kubernetes, New York/vibeprospecting-plugin:generate-list e-commerce companies in Europe with 10M-75M revenue/vibeprospecting-plugin:generate-list directors of engineering with verified email at Series A+ startupsCall the get-auth-token tool on the explorium-mcp MCP server. Extract api_key from the JSON response and export it:
export VP_API_KEY="<api_key>"
CLI="skills/vibe-prospecting/scripts/vibep.js"
From "$ARGUMENTS", determine whether the user wants:
If unclear, ask one question: "Are you looking for companies or for specific people at those companies?"
Extract structured filter values from the natural language description:
Shared filters:
country_code / city_region_country (need autocomplete)company_size (exact values: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+)company_revenuecompany_tech_stack_tech / company_tech_stack_categories (need autocomplete)business_intent_topics (need autocomplete)Business-only filters:
linkedin_category or google_category (always need autocomplete)naics_category (need autocomplete)Prospect-only filters:
job_title (need autocomplete)job_level (exact values: cxo, vp, director, manager, senior, entry, owner, partner)job_department (exact values: engineering, sales, marketing, finance, product, c-suite, data, human resources, operations, etc.)--has-email, --has-phoneFor every filter in the "need autocomplete" list, run autocomplete before building the final filter set. Always use --semantic for best matching:
AUTO=$(mktemp /tmp/vibep-auto.XXXXXX.json)
node "$CLI" businesses autocomplete linkedin_category "software development" --semantic \
--call-reasoning "$QUERY" > "$AUTO"
node "$CLI" prospects autocomplete job_title "head of engineering" --semantic \
--call-reasoning "$QUERY" > "$AUTO"
Extract the exact value strings from the response and use them verbatim in filters. Never guess or paraphrase autocomplete values.
Run stats before any fetch. This is always free and prevents unexpected large fetches:
node "$CLI" businesses stats \
--filters '{"linkedin_category":{"values":["Software Development"]},"company_size":{"values":["51-200","201-500"]}}' \
--call-reasoning "$QUERY"
node "$CLI" prospects stats \
--filter job_level=vp,director \
--filter company_size=51-200 \
--has-email \
--call-reasoning "$QUERY"
Show the user the total result count. If the count is very large (>10,000), suggest narrowing the filters before fetching.
Fetch 10 rows in preview mode to show the data shape before committing to a larger pull:
PREVIEW=$(mktemp /tmp/vibep-preview.XXXXXX.json)
node "$CLI" businesses fetch \
--filters @filters.json \
--limit 10 \
--mode preview \
--call-reasoning "$QUERY" > "$PREVIEW"
node "$CLI" prospects fetch \
--filter job_level=vp,director \
--filter company_size=51-200 \
--has-email \
--limit 10 \
--mode preview \
--call-reasoning "$QUERY" > "$PREVIEW"
Present the sample as a table:
Businesses:
| # | Company | Industry | Size | Revenue | Location | Domain |
|---|
Prospects:
| # | Name | Title | Company | Size | Location | Has Email | Has Phone |
|---|
Then ask the user:
"Found [total] matching [businesses/prospects]. Showing 10 of those. How many would you like to fetch? Fetching uses credits. Suggest a limit or say 'all' for the full set."
Do not proceed to full fetch without explicit confirmation.
Once the user confirms a volume, fetch the full set. For large requests, write to file to keep context clean:
RESULTS=$(mktemp /tmp/vibep-results.XXXXXX.json)
node "$CLI" businesses fetch \
--filters @filters.json \
--limit 500 \
--call-reasoning "$QUERY" > "$RESULTS"
node "$CLI" prospects fetch \
--filter job_level=vp,director \
--filter company_size=51-200 \
--has-email \
--limit 500 \
--call-reasoning "$QUERY" > "$RESULTS"
Inspect only metadata back into context to confirm the fetch completed:
node -e "
const d = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));
console.log('total_results:', d.meta.total_results);
console.log('returned:', d.data.length);
console.log('sample:', JSON.stringify(d.data.slice(0,2), null, 2));
" "$RESULTS"
Show a brief summary of the completed fetch:
List generated: [ICP summary]
| Field | Value |
|---|---|
| Entity type | Businesses / Prospects |
| Filters applied | [comma-separated] |
| Total in market | [stats result] |
| Records fetched | [count] |
| Saved to | $RESULTS |
Ask the user:
--to-file results.csv or convert the JSON file/vibeprospecting-plugin:research on selected rows for deep dossiersenrich on the results for firmographics, tech stack, contacts, or intent signalsevents on the results to surface trigger signals (funding, hiring, role changes)