$npx -y skills add Varnan-Tech/opendirectory --skill vc-finderTakes a startup product URL or description, detects the industry and funding stage, identifies 5 comparable funded companies, searches who invested in those companies (Track A), finds VCs who publish investment theses about this space (Track B), and returns a ranked sourced list
| 1 | # VC Finder |
| 2 | |
| 3 | Take a product URL or description. Detect industry and stage. Find 5 comparable funded companies. Run two research tracks: who invested in those comparables (Track A), and which VCs publish theses about this space (Track B). Return a sourced, ranked investor list with outreach hooks. |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | **Zero-hallucination policy:** Every fact in the output must be traceable to a specific Tavily search result or the fetched product page. This applies to: |
| 8 | - Comparable company names: must appear in Tavily search results, not AI training knowledge |
| 9 | - VC fund names: must appear verbatim in Tavily search results |
| 10 | - Check sizes, stage focus, portfolio companies: must come from search snippets, not AI knowledge |
| 11 | - Fund overviews and thesis summaries: extracted from search snippets only. If a detail is not in the search data, write "not found in search data" -- do not fill from training knowledge. |
| 12 | |
| 13 | --- |
| 14 | |
| 15 | ## Common Mistakes |
| 16 | |
| 17 | | The agent will want to... | Why that's wrong | |
| 18 | |---|---| |
| 19 | | Add a16z or Sequoia because they are famous | A famous VC without evidence is noise. Only include VCs that appear in Tavily search results for this specific product. Name-dropping wastes the founder's time. | |
| 20 | | Generate comparable companies from training knowledge | Comparables must come from Tavily search results (Step 6). AI knowledge of companies is not evidence -- a company suggested from memory may have wrong funding status or may not be a true comparable. | |
| 21 | | Continue when all 5 Track A searches return 0 results | Zero Track A results means the comparables were wrong or too obscure. Stop, re-run Step 6 with broader search queries, and retry. | |
| 22 | | Include a Track B VC without citing the article or post | Thesis without a source is indistinguishable from hallucination. The founder cannot verify it and the list loses all credibility. | |
| 23 | | Fill in fund overview from training knowledge | Fund overviews must come from Tavily snippet text only. If the snippets don't describe the fund, write "not found in search data". | |
| 24 | | Detect stage from website aesthetics | Stage must come from the specific CTA signals detected in Step 4. | |
| 25 | | Write generic outreach hooks | Every outreach hook must name this specific product's differentiator and a specific VC portfolio signal or thesis quote from the search data. | |
| 26 | | Skip the URL fetch when the user also provides a description | Always fetch the URL. The live page often reveals stage signals that the user's description omits. | |
| 27 | |
| 28 | --- |
| 29 | |
| 30 | ## Step 1: Setup Check |
| 31 | |
| 32 | ```bash |
| 33 | echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}" |
| 34 | echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-not set, Tavily extract will be used as fallback}" |
| 35 | ``` |
| 36 | |
| 37 | **If TAVILY_API_KEY is missing:** Stop. Tell the user: "TAVILY_API_KEY is required to research VC investments and theses. There is no fallback for this. Get it at app.tavily.com -- free tier: 1000 credits/month (about 125 full runs). Add it to your .env file." |
| 38 | |
| 39 | **If only FIRECRAWL_API_KEY is missing:** Continue silently. Tavily extract will be used for the URL fetch. |
| 40 | |
| 41 | --- |
| 42 | |
| 43 | ## Step 2: Gather Input |
| 44 | |
| 45 | You need: |
| 46 | - Product URL (required, unless user pastes a product description directly) |
| 47 | - Optional: target stage hint (pre-seed, seed, series-a, series-b) -- if provided, use it and skip stage detection |
| 48 | - Optional: geography preference (US, Europe, global) -- defaults to US if not specified |
| 49 | |
| 50 | **If the user provides only a pasted description (no URL):** Skip Steps 3-4. Go directly to Step 5 with the pasted text as `product_content`. Set `stage_source` to `user_description`. |
| 51 | |
| 52 | **If neither URL nor description is provided:** Ask: "What is the URL of your product or startup? Or paste a short description: what it does, who it is for, and what stage you are at (pre-seed, seed, Series A)." |
| 53 | |
| 54 | Derive product slug from URL for the output filename: |
| 55 | |
| 56 | ```bash |
| 57 | PRODUCT_SLUG=$(python3 -c " |
| 58 | from urllib.parse import urlparse |
| 59 | url = 'URL_HERE' |
| 60 | host = urlparse(url).netloc.replace('www.', '') |
| 61 | print(host.split('.')[0]) |
| 62 | ") |
| 63 | ``` |
| 64 | |
| 65 | --- |
| 66 | |
| 67 | ## Step 3: Fetch Product Page |
| 68 | |
| 69 | **Primary: Firecrawl (if FIRECRAWL_API_KEY is set)** |
| 70 | |
| 71 | ```bash |
| 72 | curl -s -X POST https://api.firecrawl.dev/v1/scrape \ |
| 73 | -H "Authorization: Bearer $FIRECRAWL_API_KEY" \ |
| 74 | -H "Content-Type: application/json" \ |
| 75 | -d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \ |
| 76 | | python3 -c " |
| 77 | import sys, json |
| 78 | d = json.load(sys.stdin) |
| 79 | content = d.get('data', |