| name | competitor-research |
| description | Research 3–5 competitors for any product or feature. Returns positioning, pricing, key differentiators, gaps, and an unclaimed angle. Use when the user asks about competitors, market landscape, or competitive analysis. |
Competitor Research
You research competitors yourself for the light, fast tasks (search and
homepage fetches), and you delegate the heavy work to specialist subagents:
pricing-fetcher — pricing extraction with WebFetch-first, Playwright-fallback
review-miner — distilling user sentiment from 10+ review pages
Workshop note: the split between "skill does it" and "subagent does it"
follows one rule: delegate work that is heavy, parallelizable, and returns
clean structured output. Light fetches stay in the skill. Heavy or
potentially-heavy work (Playwright at ~114K tokens, review-mining across
dozens of pages) gets its own context window.
Step 1 — Scope
Ask the user once:
"What product or feature are you researching? Who is it for?"
Skip if they already gave both. Cap at 2 clarifying questions max
(geography, segment, direct vs. adjacent). Don't run an interview.
Step 2 — Identify competitors
Use WebSearch by default. Look for:
- "best [category] tools 2025/2026"
- G2 / Capterra / Gartner category pages
- Reddit "alternatives to [known leader]" threads
Use mcp__brave-search__brave_web_search instead only when you need
strictly the last 12 months of results (e.g., a fast-moving category where
2-year-old listicles would be misleading). Brave's freshness parameter is
deterministic; WebSearch's recency is a soft preference. For most categories
the soft preference is fine.
Pick direct competitors (same buyer, same job-to-be-done). List them back
to the user briefly so they can correct the set before you go deep.
Step 3 — Per competitor (parallel work)
For each competitor, dispatch the following in a single message with multiple
tool calls so they run concurrently:
3a. Homepage — you do this yourself (WebFetch)
Fetch the homepage and extract:
- Hero headline (verbatim)
- Subhead (verbatim)
- Top 3 features in homepage order
- Stated differentiators (translated to plain English, not paraphrased into
marketing-speak)
This stays inline because homepage HTML is server-rendered for ~95% of
competitor sites — fast, light, and pollutes nothing.
3b. Pricing — delegate to pricing-fetcher subagent
Spawn one pricing-fetcher per competitor. It tries WebFetch first; falls
back to Playwright browser automation only if the page is JS-rendered.
Why this is delegated: Playwright sessions cost ~114K tokens each. Even
when only 1 in 3 competitors needs it, isolating that work in subagents keeps
the orchestrator's context lean and lets fetches run in parallel.
The subagent returns a structured pricing table plus a Method used field
(WebFetch / Playwright) — audit this field. If 4 of 5 competitors all used
Playwright, something's wrong with WebFetch and you should investigate before
trusting the data.
3c. Reviews — delegate to review-miner subagent
Spawn one review-miner per competitor. It searches across G2/Capterra/Reddit/
HN/ProductHunt/Trustpilot, distills patterns (≥3 confirming voices across ≥2
platforms = signal), and returns recurring strengths + weaknesses.
Why this is delegated: review pages are dense user-voice text — 10+ pages
per competitor. Doing it inline pollutes the orchestrator's context with raw
review snippets.
If a subagent returns "insufficient data," don't retry with the same prompt —
either accept the gap (and surface it in the final report) or hand the next
attempt a sharper, narrower question.
Step 4 — Synthesize per-competitor cards
Combine your homepage research with the two subagents' findings into exactly
6 bullets per competitor:
### [Competitor Name]
- **Positioning**: one sentence (their words, plain English)
- **Target customer**: who they're built for
- **Pricing**: tiers and price points, or "Not public"
- **Differentiators**: 2–3 things they do well
- **Weaknesses**: 1–2 recurring complaints from reviews/forums
- **Source date**: most recent source pulled (YYYY-MM)
Hard rules:
- 6 bullets exactly. If a bullet is empty, write "—" but keep the line.
- Pricing must cite a source URL inline if public.
- No marketing language in your translation.
Step 5 — Gap Analysis
Add this section verbatim:
### Gap Analysis
- **What no competitor does well**: [specific capability gap]
- **Where pricing is underserved**: [a tier or model nobody offers]
- **Unclaimed positioning angle**: [a frame nobody owns]
Each gap must be falsifiable — grounded in something a reader can verify.
"Better UX" is not a gap. "No competitor offers per-seat pricing under $10/mo
for teams under 5" is.
Step 6 — Close
End the report with exactly one line:
Based on this, which gap are you trying to own?
No summary. No "let me know if you want more." Just the question.
Tool selection cheat sheet
| Task | Default tool | Reach for MCP when... |
|---|
| Identify competitors | WebSearch | You need strict 12-month recency → brave_web_search |
| Fetch a homepage | WebFetch | (never — homepage is light) |
| Fetch a pricing page | pricing-fetcher subagent | (subagent decides internally whether Playwright is needed) |
| Mine reviews | review-miner subagent | (subagent decides internally — uses Brave's news/summarizer for specific cases) |
Default principle: built-in tools first, MCPs only when they offer
something built-ins can't.
Anti-patterns (do not do)
- ❌ Doing your own deep web searches once you've identified competitors —
delegate pricing and review work to the subagents
- ❌ Calling subagents sequentially per competitor instead of in parallel
- ❌ Reaching for
brave_web_search when WebSearch would have been fine
(this wastes Brave's free-tier budget)
- ❌ Invoking Playwright tools directly from the orchestrator — those calls
belong in the
pricing-fetcher subagent so the heavy context is isolated
- ❌ Accepting a
pricing-fetcher report where 4 of 5 competitors used
Playwright — investigate WebFetch first
- ❌ Adding a 7th bullet "for completeness"
- ❌ Inventing pricing because the public site is vague
- ❌ Listing every G2 complaint — only recurring patterns
- ❌ Writing a closing paragraph after the sharp question