skills/anysite-vc-analyst/SKILL.md
Universal VC investor analysis and outreach agent. Analyzes any startup project, understands fundraising stage, identifies ideal investor profile, scores investors, detects portfolio conflicts, generates personalized outreach. Starts with discovery questions to understand the project. Triggers: "analyze investors", "find investors", "investor research", "fundraising help", "score investor", "/vc-analyst".
npx skillsauth add anysiteio/agent-skills anysite-vc-analystInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Universal agent for startup investor research and outreach.
Before analyzing investors, gather project context. Use AskUserQuestion tool.
Ask user to provide:
AskUserQuestion:
- "What's your company website?"
- "Do you have a pitch deck I can review? (path or link)"
- "In one sentence, what does your company do?"
Website: Use execute("webparser", "parse", "parse", {"url": website}) to understand:
Pitch deck: Use Read tool if local file, or WebFetch if link
Extract key info:
Ask with AskUserQuestion:
questions:
- question: "What stage are you raising?"
header: "Stage"
options:
- label: "Pre-Seed ($250K-$1M)"
description: "First institutional round, idea to early product"
- label: "Seed ($1M-$3M)"
description: "Product-market fit exploration"
- label: "Series A ($5M-$15M)"
description: "Scaling proven model"
- label: "Other"
description: "Specify your round"
- question: "How much are you raising?"
header: "Amount"
options:
- label: "$500K or less"
- label: "$500K - $1M"
- label: "$1M - $2M"
- label: "$2M+"
- question: "What's your current traction?"
header: "Traction"
options:
- label: "Pre-revenue"
description: "Building product, no revenue yet"
- label: "Early revenue (<$10K MRR)"
description: "First paying customers"
- label: "$10K-$50K MRR"
description: "Growing customer base"
- label: "$50K+ MRR"
description: "Strong traction"
Ask with AskUserQuestion:
questions:
- question: "What type of investors are you targeting?"
header: "Investor Type"
multiSelect: true
options:
- label: "Angel investors"
description: "Individual investors, $25K-$250K checks"
- label: "Micro VCs"
description: "Small funds, $100K-$500K checks"
- label: "Seed VCs"
description: "Institutional seed funds, $500K-$2M"
- label: "Strategic angels"
description: "Industry experts for advice + capital"
- question: "Geographic preference?"
header: "Location"
options:
- label: "US only"
- label: "US + Europe"
- label: "Global"
- label: "Specific region"
- question: "Any specific industries or themes they should focus on?"
header: "Thesis"
multiSelect: true
options:
- label: "B2B SaaS"
- label: "AI/ML"
- label: "Developer Tools"
- label: "Other (specify)"
After gathering info, create investor_criteria.json:
{
"company": {
"name": "...",
"website": "...",
"one_liner": "...",
"stage": "Pre-Seed",
"raising": "$1M",
"traction": "...",
"thesis_keywords": ["B2B SaaS", "AI", "..."]
},
"ideal_investor": {
"types": ["Angel", "Micro VC"],
"check_size": "$50K-$500K",
"stage_focus": ["Pre-Seed", "Seed"],
"thesis_match": ["B2B SaaS", "AI", "Developer Tools"],
"geography": "US + Europe"
},
"competitors": ["competitor1", "competitor2"],
"outreach": {
"pitch_deck_link": "...",
"calendar_link": "...",
"sender_name": "...",
"sender_title": "..."
}
}
Save to data/investor_criteria.json for reference.
After onboarding, analyze investors from CSV or list.
execute("linkedin", "user", "get", {"user": "linkedin-url-or-username"})
CSV data has ~20% error rate. Always verify actual role before scoring.
v2 tip: The
execute()call returns acache_key. Usequery_cache(cache_key, ...)to filter/sort results without re-fetching. Useget_page(cache_key, offset, limit)if paginated results exist. Useexport_data(cache_key, "csv")to save batch results as a downloadable file.
| Factor | Weight | Check | |--------|--------|-------| | Is Actually Investor | GATE | Role: Partner, GP, Angel, EIR (NOT: Director, Manager, Engineer) | | Stage Fit | 25% | Matches company's raising stage | | Thesis Match | 25% | Matches company's thesis keywords | | Portfolio Relevance | 30% | Similar companies in portfolio | | Activity Level | 10% | Investments in last 12-18 months | | Network Value | 10% | Accelerator ties, fund network |
Disqualifiers (Score = 0):
Search for investments in company's competitors:
WebSearch("[Fund name] portfolio companies")
WebSearch("[Investor name] investments [competitor name]")
If conflict found: -20 points + flag "PORTFOLIO CONFLICT"
For Score > 70, create personalized message using company's outreach config:
Hi [Name],
[Hook from verified portfolio/achievement relevant to THIS company]
[1-2 sentences about company - from one_liner]
[Traction from company profile]
[Question based on their expertise]
Here's our pitch deck: [pitch_deck_link]
If you'd like to chat: [calendar_link]
If no slots work, send your availability.
Best,
[sender_name]
[sender_title]
{
"investor": "Name",
"linkedin": "url",
"score": 85,
"current_role": "Partner @ Fund",
"stage_fit": "Pre-seed focus - MATCH",
"thesis_match": ["AI", "B2B SaaS"],
"portfolio_relevant": ["Company1", "Company2"],
"conflicts": [],
"risk_factors": [],
"outreach_hook": "Your investment in X...",
"message": "Full outreach text"
}
{
"batch": 1,
"total_analyzed": 20,
"strong_fit": 4,
"good_fit": 3,
"not_fit": 13,
"top_candidates": ["Name1", "Name2"]
}
execute() returns next_offset, use get_page(cache_key, offset, limit) to fetch additional results without re-running the query.query_cache(cache_key, conditions=[{"field": "score", "op": ">", "value": 70}], sort_by=[{"field": "score", "order": "desc"}]) to filter high-scoring investors from cached results.query_cache(cache_key, aggregate=[{"op": "avg", "field": "score"}]) to compute batch statistics.export_data(cache_key, "csv") to generate a downloadable CSV of all analyzed investors.execute() returns an error with llm_hint, follow the hint to fix params. Common issues: invalid LinkedIn URL format, rate limiting (retry after delay).| Command | Action |
|---------|--------|
| /vc-analyst | Start full onboarding flow |
| /vc-analyst analyze [linkedin] | Analyze single investor (requires prior onboarding) |
| /vc-analyst batch [csv-path] | Analyze batch from CSV |
| /vc-analyst update-criteria | Update investor criteria |
See references/scoring.md for detailed criteria and examples.
tools
Read-only static security audit of Claude Code skills, commands, and plugins. Analyzes SKILL.md frontmatter, body content, supporting scripts, and hooks for security risks. Use this skill when the user asks to "audit a skill", "review skill security", "check SKILL.md for risks", "scan a plugin for dangerous patterns", "verify skill safety", "check skill permissions", "analyze skill hooks", "audit a skill from GitHub", "review a remote skill", "check a skill by URL", or needs a security assessment of any Claude Code skill, command, or plugin before enabling it.
tools
Build a positioning map for 3–5 competitors and identify the empty quadrant the founder could own. Use when a founder asks "where's the positioning gap?", "how do I position against X?", "what's the competitive landscape look like on hero / pricing / hiring / customers?", or needs a structured comparison before a launch, repositioning, or fundraise. Combines Anysite MCP (LinkedIn company entity + post search + jobs search; SEC for late-stage) with Exa MCP (fetch JS-heavy SaaS marketing pages, find case studies and changelogs). Returns a comparison table across 5 axes (hero / pricing / specialities / recent shipping / hiring), 3 candidate positioning moves with explicit choice criteria, and a one-sentence positioning statement. Requires customer pain themes as input — positioning without pain context is just rearranging marketing copy. Run competitor-discovery and customer-pain-mining first if you don't have a curated competitor list + pain themes.
tools
Extract verbatim customer complaints about competitors — the exact wording the founder's product copy should steal, in customers' own words. Use when a founder asks "what do users hate about X?", "what's broken about [category]?", "what's the white space?", or needs raw customer language for landing-page copy, custdev prep, ad copy, or product strategy. Combines Anysite MCP (Reddit broad sweeps, LinkedIn issue-level pain search, YouTube comments under review videos, Twitter for viral pain quotes) with Exa MCP (semantic search for review blog posts, comparison articles, "why I left X" Medium posts). Returns 3–5 pain clusters with 2–3 verbatim quotes each plus a white-space section listing features customers ask for that no competitor ships. Run competitor-discovery first if there's no validated competitor list.
tools
--- name: competitor-discovery description: Find a startup's REAL competitors — the alternatives customers actually compare them to, not just the names on the pitch deck. Use when a founder asks "who are my real competitors?", asks "what does the choice landscape look like for X?", wants to validate or expand a pitch-deck competitor slide, or needs to map alternatives before pain mining or positioning work. Combines Anysite MCP (LinkedIn company/search, LinkedIn posts `mentioned[]` extraction +