Company Research
BrowserbaseOfficialCreated by browserbase
- Skill
- Workflow
- Business and productivity
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Company Research is a workflow-based skill that automates the identification and analysis of target companies. It uses a structured Plan-Research-Synthesize methodology to evaluate companies against a user-defined Ideal Customer Profile (ICP). The process involves discovering prospects via search, performing deep enrichment on each, and scoring their fit. The output includes a compiled research report and a CSV file containing scored data, providing a structured approach to building prospect lists.
What it does
- Researches the user's own company to establish a foundational profile.
- Discovers potential target companies using search queries based on industry, tech stack, and buyer persona.
- Performs deep research on identified companies using a multi-step enrichment process.
- Scores companies based on their fit against a specific ICP.
- Compiles findings into individual markdown files, an HTML report, and a summary CSV.
- Supports variable research depth modes to balance the volume of results with the level of intelligence.
When to use it
- When you need to build a list of target companies for sales outreach.
- When you want to research potential customers to determine their suitability for your product.
- When you need to perform market research on specific prospect segments.
- When you want to identify companies that match a specific ICP.
Advantages
- Automates the repetitive process of searching for and vetting potential leads.
- Provides a consistent scoring mechanism to prioritize prospects.
- Generates structured, exportable data for use in CRM or spreadsheet tools.
- Allows for adjustable research depth to suit different project requirements.
- Reduces manual effort by batching search and extraction tasks.
Usage examples
- “Find companies to sell to that are Series A fintech startups in the Bay Area.”
- The agent will research your company, generate search queries, discover matching startups, perform deep research on each, and provide a scored list of prospects.
- “Who should we sell to? Our product is an AI inventory management tool for mid-market e-commerce.”
- The agent will analyze your product, identify relevant e-commerce companies, and produce a report scoring them based on their fit for your inventory solution.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/browserbase/company-research/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip company-research.zip -d .agents/skills
Documentation by browserbase
Company Research
Discover and deeply research companies to sell to. Uses Browserbase Search API for discovery and a Plan→Research→Synthesize pattern for deep enrichment — outputting a scored research report and CSV.
Required: BROWSERBASE_API_KEY env var and browse CLI installed.
First-run setup: On the first run you'll be prompted to approve browse cloud fetch, browse cloud search, cat, mkdir, sed, etc. Select "Yes, and don't ask again for: browse cloud fetch:*" (or equivalent) for each to auto-approve for the session. To permanently approve, add these to your ~/.claude/settings.json under permissions.allow:
"Bash(browse:*)", "Bash(bunx:*)", "Bash(bun:*)", "Bash(node:*)",
"Bash(cat:*)", "Bash(mkdir:*)", "Bash(sed:*)", "Bash(head:*)", "Bash(tr:*)", "Bash(rm:*)"Path rules: Always use the full literal path in all Bash commands — NOT ~ or $HOME (both trigger "shell expansion syntax" approval prompts). Resolve the home directory once and use it everywhere. When constructing subagent prompts, replace {SKILL_DIR} with the full literal path.
Output directory: All research output goes to ~/Desktop/{company_slug}_research_{YYYY-MM-DD}/. This directory contains one .md file per researched company plus a final .csv. The user gets both the scored spreadsheet and the full research files on their Desktop.
CRITICAL — Tool restrictions (applies to main agent AND all subagents):
All web searches: use
browse cloud search. NEVER use WebSearch.All page content extraction: use
node {SKILL_DIR}/scripts/extract_page.mjs "<url>". This script fetches viabrowse cloud fetch --output, parses title + meta tags + visible body text, and automatically falls back tobrowse get markdownwhen fetch fails or returns thin JS-rendered content. NEVER hand-roll abrowse cloud fetch | sedpipeline — it strips meta tags and doesn't parse the stdout JSON envelope. NEVER use WebFetch.All research output: subagents write one markdown file per company to
{OUTPUT_DIR}/{company-slug}.mdusing bash heredoc. NEVER use the Write tool orpython3 -c. Seereferences/example-research.mdfor the file format.Report + CSV compilation: use
node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open— generates HTML report and CSV in one step, opens overview in browser.URL deduplication: use
node {SKILL_DIR}/scripts/list_urls.mjs /tmpafter discovery.Subagents must use ONLY the Bash tool. No other tools allowed.
Main agent NEVER reads raw discovery JSON batch files. Use
list_urls.mjsfor dedup.
CRITICAL — Anti-hallucination rules (applies to main agent AND all subagents):
NEVER infer
product_description,industry, ortarget_audiencefrom a site's fonts, framework (Framer/Next.js/React), design system, or typography. These are cosmetic and say nothing about what the company sells.NEVER let the user's own ICP leak into a target's description. If you don't know what the target does, write
Unknown— do not pattern-match them onto the ICP.product_descriptionMUST quote or paraphrase a specific phrase fromextract_page.mjsoutput (TITLE, META_DESCRIPTION, OG_DESCRIPTION, HEADINGS, or BODY). If none of those fields yield a recognizable product statement, writeUnknown — homepage content not accessible.If
product_descriptionisUnknown, capicp_fit_scoreat 3 and seticp_fit_reasoningtoInsufficient evidence — homepage returned no readable content.
CRITICAL — Minimize permission prompts:
Subagents MUST batch ALL file writes into a SINGLE Bash call using chained heredocs. One Bash call = one permission prompt.
Batch ALL searches and ALL fetches into single Bash calls using
&&chaining.
Pipeline Overview
Follow these 5 steps in order. Do not skip steps or reorder.
Company Research — Deeply understand the user's company, product, and who they sell to
Depth Mode Selection — Choose research depth based on how many targets they want
Discovery — Find target companies using diverse search queries
Deep Research & Scoring — Research each company, score ICP fit
Report & CSV — Present findings, compile scored CSV
Step 0: Setup Output Directory
Before starting, create the output directory on the user's Desktop:
OUTPUT_DIR=~/Desktop/{company_slug}_research_{YYYY-MM-DD}
mkdir -p "$OUTPUT_DIR"Replace {company_slug} with the user's company name (lowercase, hyphenated) and {YYYY-MM-DD} with today's date. Pass {OUTPUT_DIR} (as a full literal path, not with ~) to all subagent prompts so they write research files there.
Also clean up discovery batch files from prior runs:
rm -f /tmp/company_discovery_batch_*.jsonStep 1: Deep Company Research
This is the most important step. The quality of everything downstream depends on deeply understanding the user's company.
Ask the user for their company name or URL
Check for an existing profile:
List files in
{SKILL_DIR}/profiles/(ignoreexample.json)If a matching profile exists → load it, present to user: "I have your profile from {researched_at}. Still accurate?" If yes → skip to Step 2.
If no profile exists → proceed with deep research below.
Run a full deep research on the user's company using the Plan→Research→Synthesize pattern. See
references/research-patterns.mdfor sub-question templates and research methodology.Key research steps:
Search:
browse cloud search "{company name}" --num-results 10Fetch homepage:
node {SKILL_DIR}/scripts/extract_page.mjs "{company website}"Discover site pages via sitemap (do NOT hardcode paths like
/aboutor/customers):browse cloud fetch --allow-redirects "{company website}/sitemap.xml"— sitemap is small, rawbrowse cloud fetchis fineScan for URLs with keywords:
customer,case-stud,pricing,about,use-case,industry,solutionOptionally also fetch
/llms.txtfor page descriptionsPick 3-5 most relevant URLs and extract with
extract_page.mjs(NOT rawbrowse cloud fetch)
Search for external context and competitors
Accumulate findings with confidence levels
Synthesize into a profile: Company, Product, Existing Customers, Competitors, Use Cases. Do NOT include ICP or sub-verticals — those are per-run decisions.
Present the profile to the user for confirmation. Do not proceed until confirmed.
Save the confirmed profile to
{SKILL_DIR}/profiles/{company-slug}.jsonAsk clarifying questions using
AskUserQuestionwith checkboxes:"Which segments are you targeting?" with options derived from the company research
"Company stage?" — Startups, Mid-market, Enterprise, All
"How many companies / depth?" — Quick (~100), Deep (~50), Deeper (~25)
This is the ONLY user interaction. After this, execute silently until results are ready.
Step 2: Depth Mode Selection
| Mode | Research per company | Best for |
|---|---|---|
quick | Homepage + 1-2 searches | ~100 companies, broad scan |
deep | 2-3 sub-questions, 5-8 tool calls | ~50 companies, solid research |
deeper | 4-5 sub-questions, 10-15 tool calls | ~25 companies, full intelligence |
Step 3: Discovery
Formula: ceil(requested_companies / 35) search queries needed. Over-discover by ~2-3x because filtering typically drops 50-70%.
Generate search queries with these patterns:
Industry + company stage + geography ("fintech startups series A Bay Area")
Technology stack + use case ("companies using Selenium for web scraping")
Competitor adjacency ("alternatives to {known company in ICP}")
Buyer persona + pain point ("engineering teams struggling with browser automation")
Process:
Launch ALL discovery subagents at once (up to ~6 per message). Each runs its queries in a SINGLE Bash call:
browse cloud search "{query}" --num-results 25 --output /tmp/company_discovery_batch_{N}.jsonAfter all waves complete, deduplicate:
node {SKILL_DIR}/scripts/list_urls.mjs /tmpFilter the URL list — remove:
Blog posts, news articles (globenewswire.com, techcrunch.com, etc.)
Directories/aggregators (tracxn.com, crunchbase.com, g2.com)
The user's own competitors and existing customers (from profile) Keep only company homepages.
See references/workflow.md for subagent prompt templates and wave management.
Step 4: Deep Research & Scoring
Launch subagents to research companies in parallel. See references/workflow.md for the enrichment subagent prompt template. See references/research-patterns.md for the full research methodology.
Process:
Split filtered URLs into groups per subagent (quick: ~10, deep: ~5, deeper: ~2-3)
Launch ALL enrichment subagents at once (up to ~6 per message)
Each subagent uses ONLY Bash — for each company:
Phase A — Plan (skip in quick mode): Decompose into 2-5 sub-questions based on ICP and enrichment fields.
Phase B — Research Loop: Search and fetch pages, extract findings. Respect step budget (quick: 2-3, deep: 5-8, deeper: 10-15).
Phase C — Synthesize: Score ICP fit 1-10 with evidence. Fill enrichment fields from findings.
Subagents write ALL markdown files in a SINGLE Bash call using chained heredocs to
{OUTPUT_DIR}/After ALL subagents complete, proceed to Step 5
Critical: Include the confirmed ICP description verbatim in every subagent prompt. Pass the full literal {OUTPUT_DIR} path to every subagent.
Step 5: Report & CSV
Generate HTML report + CSV (opens overview in browser automatically):
node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --openThis generates:
{OUTPUT_DIR}/index.html— overview page with scored table (opens in browser){OUTPUT_DIR}/companies/*.html— individual company pages (linked from overview){OUTPUT_DIR}/results.csv— scored spreadsheet for import into sheets/CRM
Present a summary in chat too:
## Company Research Complete
- **Total companies researched**: {count}
- **Depth mode**: {mode}
- **Score distribution**:
- Strong fit (8-10): {count}
- Partial fit (5-7): {count}
- Weak fit (1-4): {count}
- **Report opened in browser**: ~/Desktop/{company_slug}_research_{date}/index.htmlShow the top companies sorted by ICP score in a table:
| Company | Score | Product | Industry | Fit Reasoning |
|---------|-------|---------|----------|---------------|
| Acme | 9 | AI inventory management | E-commerce SaaS | Series A, uses Selenium, expanding to EU |For the top 3-5 companies, show a brief research summary — key findings, why they're a good fit, and what specific angle to approach them with.
Offer to dig deeper into specific companies, adjust scoring criteria, or re-run discovery with different queries.
Files
- .gitignore39 B
- ATTRIBUTION.mdAdded by AutoGineer961 B
- LICENSE.txt1.0 KiB
- SKILL.md11.8 KiB
- profiles/example.json170 B
- references/example-research.md2.6 KiB
- references/report-template.html7.9 KiB
- references/research-patterns.md10.1 KiB
- references/workflow.md11.1 KiB
- scripts/compile_report.mjsScript13.6 KiB
- scripts/extract_page.mjsScript5.4 KiB
- scripts/list_urls.mjsScript2.4 KiB
- scripts/package.json102 B
references/workflow.md
Company Research — Workflow Reference
Discovery Batch JSON Schema
File: /tmp/company_discovery_batch_{N}.json
browse cloud search --output writes a JSON object (NOT a flat array):
{
"requestId": "abc123",
"query": "AI data extraction startups",
"results": [
{ "url": "https://example.com", "title": "Example Corp", "author": null, "publishedDate": null },
...
]
}The list_urls.mjs script handles both formats (flat array and { results: [...] }).
Company Research Markdown Format
File: {OUTPUT_DIR}/{company-slug}.md
Where {OUTPUT_DIR} is the per-run directory on the user's Desktop (e.g., ~/Desktop/acme_research_2026-04-23/). The main agent sets this up in Step 0 and passes the full literal path to every subagent.
Each research subagent writes one markdown file per company. See references/example-research.md for the full template.
YAML frontmatter fields (used for report + CSV compilation):
company_name(required)website(required)product_descriptionindustrytarget_audiencekey_features(pipe-separated:feature1 | feature2 | feature3)icp_fit_score(integer 1-10, required)icp_fit_reasoningemployee_estimatefunding_infoheadquarters
Body sections:
## Product— what they do## Research Findings— evidence with confidence levels and sources
CRITICAL: Use consistent field names across all files. The compile_report.mjs script reads these fields.
Extracting Page Content
Use extract_page.mjs for all homepage/product-page content extraction. It fetches via browse cloud fetch --output, parses title + meta + visible body text, and falls back to browse get markdown automatically when fetch fails or returns thin JS-rendered content:
node {SKILL_DIR}/scripts/extract_page.mjs "https://example.com" --max-chars 3000Output is a structured block:
URL: https://example.com
FETCH_OK: true|false
FALLBACK_TO_BROWSE: true|false
TITLE: ...
META_DESCRIPTION: ...
OG_TITLE: ...
OG_DESCRIPTION: ...
HEADINGS: h1/h2/h3 joined by " | "
BODY_CHARS: N
BODY:
<cleaned visible text, max N chars>Why not a raw browse cloud fetch | sed pipeline? Without --output, browse cloud fetch returns a JSON envelope with the HTML embedded as an escaped string. A naive sed pipeline strips <> from the wrapper and content, and it removes <meta> tags, which on Framer/Next.js SPAs are often the only readable content. extract_page.mjs uses --output to parse raw HTML directly.
When to use raw browse cloud fetch: Only for small structured files where you want the JSON envelope intact — e.g. sitemap.xml, robots.txt, llms.txt. For any HTML page you'd feed to a model, use extract_page.mjs.
Verifying content is real (not hallucinated)
Before writing product_description, industry, or target_audience into a company file, confirm the claim is grounded in extract_page.mjs output. Quote or closely paraphrase from TITLE, META_DESCRIPTION, OG_DESCRIPTION, HEADINGS, or BODY.
If extract_page.mjs returns FETCH_OK: false AND FALLBACK_TO_BROWSE: false (or BODY_CHARS < 50), the homepage is inaccessible. Do not fabricate. Write:
product_description: Unknown — homepage content not accessibleicp_fit_score: 3(or lower)icp_fit_reasoning: Insufficient evidence — homepage returned no readable content
A classic failure mode this prevents: a Framer/Next.js landing page with no server-rendered copy, where the subagent pattern-matches visual cues ("design-forward", "Geist Mono", "Framer-built") onto the user's own ICP. Typography is not a product.
Discovery Subagent Prompt Template
You are a company discovery subagent. Run search queries and save results.
TOOL RULES — CRITICAL, FOLLOW EXACTLY:
1. You may ONLY use the Bash tool. No exceptions.
2. Run ALL searches in a SINGLE Bash call using && chaining.
3. BANNED TOOLS: WebFetch, WebSearch, Write, Read, Glob, Grep — ALL BANNED.
If you use ANY banned tool, the entire run fails. Use ONLY Bash.
4. NEVER use ~ or $HOME in paths — use full literal paths.
TASK:
Run ALL of the following searches in ONE Bash command:
browse cloud search "{query1}" --num-results 25 --output /tmp/company_discovery_batch_{N1}.json && \
browse cloud search "{query2}" --num-results 25 --output /tmp/company_discovery_batch_{N2}.json && \
browse cloud search "{query3}" --num-results 25 --output /tmp/company_discovery_batch_{N3}.json && \
echo "Discovery complete"
After the command completes, report back ONLY the count of results found per batch.
Do NOT analyze, summarize, or return the actual results.Research Subagent Prompt Template
You are a company research subagent. For each company URL, research the company and score ICP fit.
CONTEXT:
- User's company: {user_company}
- User's product: {user_product}
- ICP description: {icp_description}
- Depth mode: {depth_mode}
- Output directory: {OUTPUT_DIR} ← write research files HERE, as a full literal path
URLS TO PROCESS:
{url_list}
TOOL RULES — CRITICAL, FOLLOW EXACTLY:
1. You may ONLY use the Bash tool. No exceptions.
2. All searches: Bash → browse cloud search "..." --num-results 10
3. All homepage/product-page content extraction:
Bash → node {SKILL_DIR}/scripts/extract_page.mjs "URL" --max-chars 3000
This returns structured TITLE / META_DESCRIPTION / OG_DESCRIPTION / HEADINGS / BODY and auto-falls back to browse get markdown when fetch fails or returns thin JS-rendered content.
DO NOT hand-roll a `browse cloud fetch | sed` pipeline — it strips meta tags and doesn't parse the stdout JSON envelope. Use `browse cloud fetch` raw only for sitemap.xml, robots.txt, llms.txt.
4. BATCH all file writes: Write ALL markdown files in a SINGLE Bash call using chained heredocs (one permission prompt, not one per file).
5. BANNED TOOLS: WebFetch, WebSearch, Write, Read, Glob, Grep — ALL BANNED.
If you use ANY banned tool, the entire run fails. Use ONLY Bash.
6. NEVER use ~ or $HOME in paths — use full literal paths.
ANTI-HALLUCINATION RULES — CRITICAL:
- NEVER infer product_description, industry, or target_audience from fonts, framework (Framer/Next.js/React), design system, or visual style. Typography is not a product.
- NEVER let the sender's ICP leak into a target's description. If you don't know what the target does, write "Unknown" — do not pattern-match them onto the ICP.
- product_description MUST quote or closely paraphrase a phrase from extract_page.mjs output. If none of TITLE/META/OG/HEADINGS/BODY yield a recognizable product statement, write "Unknown — homepage content not accessible" and cap icp_fit_score at 3.
RESEARCH PATTERN (per company):
Phase A — Plan (skip in quick mode):
Decompose what you need to know into sub-questions based on ICP and enrichment fields.
Phase B — Research Loop:
For each sub-question (or just the homepage in quick mode):
1. Run browse cloud search with relevant query
2. Pick 1-2 most relevant URLs from results
3. Extract page content: node {SKILL_DIR}/scripts/extract_page.mjs "URL" --max-chars 3000
(uses `--output` to avoid the stdout JSON envelope, preserves meta tags, and falls back to browse get markdown when needed)
4. Smart page discovery: use `browse cloud fetch --allow-redirects` on /sitemap.xml or /llms.txt to find relevant URLs — these are small XML/text files where the raw JSON envelope is fine. For the actual HTML pages you discover, use extract_page.mjs.
5. Extract findings: factual statements with source, confidence level
6. Accumulate findings, move to next sub-question
7. Respect step budget: quick=2-3 calls, deep=5-8, deeper=10-15
Phase C — Synthesize:
From accumulated findings:
1. Score ICP fit 1-10 (see rubric below)
2. Fill enrichment fields from findings
3. Reference specific findings in icp_fit_reasoning
ICP SCORING RUBRIC:
- 8-10: Strong match. Multiple high-confidence findings confirm fit.
- 5-7: Partial match. Some findings suggest relevance but key signals missing.
- 1-4: Weak match. Wrong segment or no apparent connection.
OUTPUT — write ALL company files in a SINGLE Bash call using chained heredocs directly to {OUTPUT_DIR}:
cat << 'COMPANY_MD' > {OUTPUT_DIR}/{slug1}.md
---
company_name: {name}
website: {url}
product_description: {description}
industry: {industry}
target_audience: {audience}
key_features: {feature1} | {feature2} | {feature3}
icp_fit_score: {score}
icp_fit_reasoning: {reasoning}
employee_estimate: {estimate}
funding_info: {funding}
headquarters: {location}
---
## Product
{product description paragraph}
## Research Findings
- **[{confidence}]** {finding} (source: {url})
COMPANY_MD
cat << 'COMPANY_MD' > {OUTPUT_DIR}/{slug2}.md
---
...
---
...
COMPANY_MD
Use 'COMPANY_MD' (quoted) as the heredoc delimiter to prevent shell variable expansion.
Report back ONLY: "Batch {batch_id}: {succeeded}/{total} researched, {findings_count} total findings."
Do NOT return raw data to the main conversation.Wave Management
Key Principle: Maximize Parallelism, Minimize Prompts
Launch as many subagents as possible in a single message (up to ~6 Agent tool calls per message). Each subagent MUST batch all its Bash operations to minimize permission prompts.
Discovery Phase
Launch up to 6 discovery subagents in a single message
Each subagent runs ALL its queries in a SINGLE Bash call using
&&chainingAfter all waves complete, run
node {SKILL_DIR}/scripts/list_urls.mjs /tmpFilter URLs: Remove blog posts, news articles, directories, competitors, and existing customers. Keep only company homepages.
Research Phase
Companies per subagent varies by depth:
quick: ~10 companies per subagentdeep: ~5 companies per subagentdeeper: ~2-3 companies per subagent
Each subagent writes ALL its markdown files in a SINGLE Bash call (chained heredocs) directly to
{OUTPUT_DIR}
Sizing Formula
search_queries = ceil(requested_companies / 35)
discovery_subagents = search_queries
expected_urls = search_queries * 20
quick: research_subagents = ceil(expected_urls / 10)
deep: research_subagents = ceil(expected_urls / 5)
deeper: research_subagents = ceil(expected_urls / 3)Error Handling
If a subagent fails, log the error and continue with remaining batches
If >50% of subagents fail in a wave, pause and inform the user
extract_page.mjsalready handles the browse cloud fetch → browse get markdown fallback internally. If it still returns FETCH_OK: false with empty BODY, skip the company and mark product_description as Unknown (do not guess).
Report + CSV Compilation
After all research subagents complete, compile the HTML report and CSV in one command:
node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --openThe script:
Reads all
.mdfiles in{OUTPUT_DIR}Parses YAML frontmatter + body sections
Deduplicates by normalized company name (keeps highest ICP score)
Generates
{OUTPUT_DIR}/index.html— scored overview pageGenerates
{OUTPUT_DIR}/companies/{slug}.html— one page per companyGenerates
{OUTPUT_DIR}/results.csv— spreadsheet for sheets/CRMOpens
index.htmlin the default browser (--openflag)Prints a JSON summary to stderr
Requirements and compatibility
Written for: Claude Code
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Names Claude Code tools, Needs an API key, Needs Python, Needs Node.js
The author says: Requires browse CLI (`npm install -g browse`) and BROWSERBASE_API_KEY env var
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- browserbase
- Publisher
- Browserbase (Official)
- Source
- browserbase/skills · skills/company-research · commit 6811ca3
- Licence
- MIT License (redistribution allowed)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by browserbase or Browserbase.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download company-research.zip