OpenSEO Competitive Landscape
Answer with measured data: who is winning this SEO market, what content works for them, and where the openings are. Findings update brand/landscape.md (mktg's market memory) with an evidence tier mktg's landscape-scan cannot reach alone.
On Activation
- Catalog + binding:
mktg catalog info openseo --json --fields configured + .seo/openseo.json. No OpenSEO → fall back to landscape-scan (Exa qualitative) and label authority/metrics unknown.
- Brand grounding: read
brand/landscape.md + brand/competitors.md (tolerate templates) — known competitors seed the query set; positioning filters "SEO competitor" from "business competitor."
OpenSEO MCP Tools
research_keywords + get_keyword_metrics: build + validate a 5–10 query market set (mixed intent: informational, commercial, comparison, tool terms).
find_serp_competitors: recurring domains across the keyword set at scale — use before manual SERP counting.
get_serp_results: inspect live SERP composition/features (≤10 queries per call).
get_domain_overview: organic footprint for top 3–5 recurring domains.
get_ranked_keywords: exact ranking keywords/URLs/intents for leaders.
get_backlinks_overview: authority comparison where rankings look authority-driven (may be unavailable on some accounts — continue without it).
get_search_console_performance: when the user's own domain is compared and GSC is connected, anchor THEIR side with first-party data instead of third-party estimates.
Workflow
- Define the market query set (positioning-filtered, mixed intent).
find_serp_competitors for recurring domains; get_keyword_metrics to validate demand/difficulty.
- Group recurring domains by type: direct product competitors, publishers/media, marketplaces/directories, communities/forums, docs/resources.
get_domain_overview top 3–5; get_ranked_keywords for direct competitors + relevant publishers; get_backlinks_overview where authority explains wins.
- Synthesize: winning content types, SERP formats, authority advantages, underserved angles.
- Update
brand/landscape.md: leaders, winnable area, biggest barrier, query set used, content formats that work, keyword/theme gaps — dated, with the measured-vs-estimate caveat.
- Recommend next:
openseo-competitor-analysis (one domain), openseo-keyword-clustering (page mapping), or seo-content.
Output Format
| Domain |
Type |
Why they matter |
Organic footprint |
Winning themes |
Weakness/gap |
Anti-Patterns
- Treating business competitors as SEO competitors — because the company that competes for customers often isn't who competes for SERPs (publishers and directories win informational queries). Label domain types; never merge the lists.
- Quoting estimate numbers as exact traffic — because third-party organic estimates can be off by multiples, and a plan built on fake precision breaks on contact with reality. Say "estimate" or "directional."
- Small query sets presented as market truth — because 4 queries is a peek, not a map. Call small-set results directional and say what would confirm them.
- Stopping at "X is winning" without the why — because a leader list with no content-theme or authority explanation gives the user nothing to act on. Every leader gets a "why they win" and a "where they're weak."
- Abandoning the analysis when backlinks are unavailable — because SERP + domain evidence still answers "who and what." Degrade gracefully and name the missing tier.
Close the loop
After writing files, log completion so mktg plan / mktg status count the work (bare mktg run only logs loaded):
mktg run openseo-competitive-landscape --complete --writes <paths written> --result success --json
Adapted from every-app/open-seo .agents/skills/competitive-landscape (MIT). Workflow upstream; mktg brand-memory writes and fallback wiring added here.
1---2name: openseo-competitive-landscape3description: Map who is winning an SEO market with measured data — recurring SERP domains, organic footprints, winning content themes, backlink authority, and the gaps worth attacking. Use this skill for market-level questions ("who ranks for X", "how competitive is this space", "where are the SEO openings") before committing to keyword targets or content themes. For one named competitor, use openseo-competitor-analysis instead. Triggers: "competitive landscape seo", "who ranks for", "seo market map", "how competitive is", "serp competitors".4---56# OpenSEO Competitive Landscape78Answer with measured data: who is winning this SEO market, what content works for them, and where the openings are. Findings update `brand/landscape.md` (mktg's market memory) with an evidence tier mktg's `landscape-scan` cannot reach alone.910## On Activation11121. **Catalog + binding**: `mktg catalog info openseo --json --fields configured` + `.seo/openseo.json`. No OpenSEO → fall back to `landscape-scan` (Exa qualitative) and label authority/metrics `unknown`.132. **Brand grounding**: read `brand/landscape.md` + `brand/competitors.md` (tolerate templates) — known competitors seed the query set; positioning filters "SEO competitor" from "business competitor."1415## OpenSEO MCP Tools1617- `research_keywords` + `get_keyword_metrics`: build + validate a 5–10 query market set (mixed intent: informational, commercial, comparison, tool terms).18- `find_serp_competitors`: recurring domains across the keyword set at scale — use before manual SERP counting.19- `get_serp_results`: inspect live SERP composition/features (≤10 queries per call).20- `get_domain_overview`: organic footprint for top 3–5 recurring domains.21- `get_ranked_keywords`: exact ranking keywords/URLs/intents for leaders.22- `get_backlinks_overview`: authority comparison where rankings look authority-driven (may be unavailable on some accounts — continue without it).23- `get_search_console_performance`: when the user's own domain is compared and GSC is connected, anchor THEIR side with first-party data instead of third-party estimates.2425## Workflow26271. Define the market query set (positioning-filtered, mixed intent).282. `find_serp_competitors` for recurring domains; `get_keyword_metrics` to validate demand/difficulty.293. Group recurring domains by type: direct product competitors, publishers/media, marketplaces/directories, communities/forums, docs/resources.304. `get_domain_overview` top 3–5; `get_ranked_keywords` for direct competitors + relevant publishers; `get_backlinks_overview` where authority explains wins.315. Synthesize: winning content types, SERP formats, authority advantages, underserved angles.326. Update `brand/landscape.md`: leaders, winnable area, biggest barrier, query set used, content formats that work, keyword/theme gaps — dated, with the measured-vs-estimate caveat.337. Recommend next: `openseo-competitor-analysis` (one domain), `openseo-keyword-clustering` (page mapping), or `seo-content`.3435## Output Format3637| Domain | Type | Why they matter | Organic footprint | Winning themes | Weakness/gap |38| ------ | ---- | --------------- | ----------------- | -------------- | ------------ |3940## Anti-Patterns4142- **Treating business competitors as SEO competitors** — because the company that competes for customers often isn't who competes for SERPs (publishers and directories win informational queries). Label domain types; never merge the lists.43- **Quoting estimate numbers as exact traffic** — because third-party organic estimates can be off by multiples, and a plan built on fake precision breaks on contact with reality. Say "estimate" or "directional."44- **Small query sets presented as market truth** — because 4 queries is a peek, not a map. Call small-set results directional and say what would confirm them.45- **Stopping at "X is winning" without the why** — because a leader list with no content-theme or authority explanation gives the user nothing to act on. Every leader gets a "why they win" and a "where they're weak."46- **Abandoning the analysis when backlinks are unavailable** — because SERP + domain evidence still answers "who and what." Degrade gracefully and name the missing tier.4748## Close the loop4950After writing files, log completion so `mktg plan` / `mktg status` count the work (bare `mktg run` only logs `loaded`):5152```bash53mktg run openseo-competitive-landscape --complete --writes <paths written> --result success --json54```555657---5859*Adapted from [every-app/open-seo](https://github.com/every-app/open-seo) `.agents/skills/competitive-landscape` (MIT). Workflow upstream; mktg brand-memory writes and fallback wiring added here.*