Serp analyzer skill

Analyze Google search results (SERP) for any keyword.

by OpenClaudia·MIT license·★ 705 Stars on the repo·GitHub ↗

Use now

Files of Serp analyzer

OpenClaudia/main1 file shown
SKILL.md
Show the full text353 lines

SERP Analyzer Skill

You are an expert SERP analyst. Given a target keyword, analyze what currently ranks in Google, identify content patterns, and produce an actionable content brief for outranking the competition.

Prerequisites

Optional API keys for enriched data (the skill can work without any of them using web search):

  • SEMRUSH_API_KEY - for keyword and organic results data
  • SERPAPI_API_KEY - for real-time Google SERP data including SERP features
  • DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD - for advanced SERP data
  • SERPINGAPI_API_KEY - for real-time Google SERP data (free tier available)

Analysis Process

Step 1: Collect SERP Data

Use multiple data sources to build a complete SERP picture:

Method A: SemRush API (if available)

# Get organic results for keyword
https://api.semrush.com/?type=phrase_organic&key={KEY}&phrase={keyword}&database=us&export_columns=Dn,Ur,Fk,Fp&display_limit=20

Columns: Dn=Domain, Ur=URL, Fk=SERP Features, Fp=Position

Method B: Web Search (always do this) Use the WebSearch tool to search for the exact keyword. This gives you real-time SERP data.

Method C: Fetch top results Use WebFetch on the top 5-10 ranking URLs to analyze actual content.

Method D: SerpAPI (if SERPAPI_API_KEY available)

Real-time Google SERP data with structured SERP features:

# Real-time Google SERP data via SerpAPI
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en"

The JSON response includes:

  • organic_results - Array of organic listings with position, title, link, snippet, displayed_link
  • related_questions - People Also Ask questions with question, snippet, title, link
  • knowledge_graph - Knowledge panel data with title, description, entity_type, and attributes
  • shopping_results - Product listings (if present) with title, price, link, source
  • local_results - Local Pack listings (if present) with title, address, rating, reviews
  • inline_images - Image pack results
  • answer_box - Featured snippet content with type (paragraph, list, table), snippet, title
  • related_searches - Related search queries

Parse example:

# Extract organic results
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
  jq '.organic_results[] | {position, title, link, snippet}'

# Extract People Also Ask questions
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
  jq '.related_questions[] | {question, snippet}'

# Check for knowledge graph
curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
  jq '.knowledge_graph | {title, description, entity_type}'

SerpAPI is especially useful for mapping SERP features in Step 2, as it returns structured data for every feature type.

Method E: DataForSEO (if DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD available)

Advanced SERP data with detailed item types and ranking metrics:

# DataForSEO SERP API
curl -s -X POST "https://api.dataforseo.com/v3/serp/google/organic/live/advanced" \
  -H "Authorization: Basic $(echo -n '${DATAFORSEO_LOGIN}:${DATAFORSEO_PASSWORD}' | base64)" \
  -H "Content-Type: application/json" \
  -d '[{"keyword": "{keyword}", "location_code": 2840, "language_code": "en"}]'

The response provides:

  • result[0].items - Array of all SERP items, each with a type field:
    • "organic" - Standard organic results with url, title, description, rank_group, rank_absolute
    • "featured_snippet" - Featured snippet with description, url, type (paragraph/list/table)
    • "people_also_ask" - PAA questions with items[].title (the questions)
    • "knowledge_graph" - Knowledge panel data
    • "local_pack" - Local results
    • "shopping" - Shopping results
    • "video" - Video carousel items
    • "images" - Image pack
    • "related_searches" - Related search suggestions
  • result[0].item_types - Array listing which SERP feature types are present (useful for Step 2 feature mapping)
  • result[0].se_results_count - Total search results count

Location codes: 2840 = US, 2826 = UK, 2124 = Canada, 2036 = Australia. Change location_code for geo-targeted analysis.

Method F: Serping API (if SERPINGAPI_API_KEY available)

Real-time Google SERP data as Serper-style JSON from a single endpoint. Get a key at https://serpingapi.com (free tier available) and set SERPINGAPI_API_KEY.

# Real-time Google SERP data via Serping API (POST, JSON body)
curl -s -X POST "https://api.serpingapi.com/v1/search" \
  -H "X-API-Key: ${SERPINGAPI_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}'

The JSON response includes (sections appear only when Google returns them):

  • organic - Array of organic listings with position, title, link, snippet (sometimes sitelinks, date, rating)
  • peopleAlsoAsk - People Also Ask questions with question, snippet, title, link
  • answerBox - Featured snippet / direct answer
  • knowledgeGraph - Knowledge panel data with title, type, description, attributes
  • relatedSearches - Related search queries as { "query": ... }
  • searchParameters - Echo of the parameters the search ran with

Parse example:

# Extract organic results
curl -s -X POST "https://api.serpingapi.com/v1/search" \
  -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
  -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
  jq '.organic[] | {position, title, link, snippet}'

# Extract People Also Ask questions
curl -s -X POST "https://api.serpingapi.com/v1/search" \
  -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
  -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
  jq '.peopleAlsoAsk[] | {question, snippet}'

# Check for featured snippet / knowledge graph
curl -s -X POST "https://api.serpingapi.com/v1/search" \
  -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
  -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
  jq '{answerBox, knowledgeGraph: (.knowledgeGraph | {title, type, description})}'

Optional parameters: location (e.g. "Seattle, Washington, United States"), page (starting at 1), tbs for a time filter (qdr:d day, qdr:w week, qdr:m month, qdr:y year). Web search only — no ads, shopping, or local pack sections.

Errors come back as {"error": {"code": "...", "message": "..."}}: 401 invalid_api_key means the key is wrong or revoked; 429 quota_exceeded means the monthly quota is used up (resets on the 1st, UTC). In either case tell the user the specific error and fall back to Method B.

Step 2: Map SERP Features

Document every SERP feature present for this keyword:

Feature Present? Who owns it? Can you win it?
Featured Snippet Yes/No {domain} {assessment}
People Also Ask Yes/No {list questions} -
Knowledge Panel Yes/No {entity} -
Image Pack Yes/No {position in SERP} {assessment}
Video Carousel Yes/No {platforms} {assessment}
Local Pack Yes/No - {assessment}
Shopping Results Yes/No - {assessment}
News Results Yes/No {sources} {assessment}
Sitelinks Yes/No {domain} -
Reviews/Stars Yes/No {domains} {assessment}
FAQ Rich Results Yes/No {domains} {assessment}
Breadcrumbs Yes/No {domains} -

SERP Intent Signal Analysis:

  • Mostly blog posts/guides = Informational intent
  • Mostly product/service pages = Transactional intent
  • Mix of reviews + product pages = Commercial investigation
  • Brand homepage + login pages = Navigational intent
  • Featured snippet present = Strong informational component
Step 3: Analyze Top 10 Results

For each of the top 10 organic results, fetch and analyze:

Factor What to measure
URL Full URL
Domain Domain authority/reputation
Title tag Exact title, length, keyword placement
Meta description Exact description, length, call-to-action
Content type Blog post, landing page, tool, directory, video, etc.
Word count Total content length
Heading structure H1, number of H2s/H3s, heading keywords
Content format Listicle, how-to, comparison, guide, definition, etc.
Visuals Number of images, videos, infographics, tables
Date Published date, last updated date
Author Named author, credentials shown
Unique angle What differentiates this from others
Internal links Number of internal links
External links Number of outbound links, sources cited
Schema markup Types of structured data used
Reading level Approximate Flesch-Kincaid grade level
Step 4: Identify Patterns

After analyzing all top 10 results, find commonalities:

Content Pattern Analysis:

## Content Patterns for "{keyword}"

### Dominant Content Type: {type}
{X} of 10 results are {blog posts/landing pages/tools/etc.}

### Average Metrics:
- Word count: {average} (range: {min}-{max})
- Number of headings: {average}
- Number of images: {average}
- Number of links (internal): {average}
- Number of links (external): {average}

### Common Topics Covered:
1. {topic} - covered by {X}/10 results
2. {topic} - covered by {X}/10 results
3. {topic} - covered by {X}/10 results
...

### Common H2 Headings:
1. "{heading}" or similar - used by {X}/10
2. "{heading}" or similar - used by {X}/10
...

### Featured Snippet Format:
Type: {paragraph/list/table/video}
Content: {what the snippet shows}
How to win it: {specific advice}
Step 5: Find Content Gaps

Identify what the top results are MISSING:

  • Topics mentioned by only 1-2 results (opportunity to be comprehensive)
  • Outdated information (opportunity for freshness)
  • Missing media types (no videos, no infographics, no interactive tools)
  • Missing perspectives (no expert quotes, no data, no case studies)
  • Unanswered "People Also Ask" questions
  • Missing schema markup types
  • Poor user experience (slow, no mobile optimization, intrusive ads)
Step 6: Analyze Competitive Positioning

For each top 5 competitor, create a positioning map:

Competitor 1 ({domain}): {Positioning summary - e.g., "Beginner-friendly, surface-level guide"}
  Strengths: {what they do well}
  Weaknesses: {what they miss or do poorly}

Competitor 2 ({domain}): {Positioning summary}
  Strengths: ...
  Weaknesses: ...

Find your differentiation angle:

  • Can you be more comprehensive? (10x content)
  • Can you be more actionable? (templates, tools, checklists)
  • Can you be more current? (latest data, 2025 updates)
  • Can you be more authoritative? (expert interviews, original research)
  • Can you serve a different sub-audience? (beginners vs. advanced)
  • Can you provide a unique format? (interactive tool vs. blog post)
Step 7: Generate Content Brief

Produce a complete content brief based on the analysis:

# Content Brief: {Target Keyword}

## Target Keyword
- **Primary:** {keyword} (Volume: {vol}, KD: {kd})
- **Secondary:** {keyword2}, {keyword3}, {keyword4}
- **Long-tail:** {keyword5}, {keyword6}

## Search Intent
**Primary intent:** {Informational/Commercial/Transactional}
**User goal:** {What the searcher wants to accomplish}
**Stage in funnel:** {Awareness/Consideration/Decision}

## Content Specifications

| Spec | Recommendation | Reasoning |
|------|---------------|-----------|
| Content type | {blog/landing/tool} | {X}/10 results are this type |
| Word count | {target} words | Top 3 average {avg}, aim for {target} |
| Format | {listicle/how-to/guide} | Dominant format in SERP |
| Reading level | Grade {X} | Match audience expectation |
| Visuals | {X} images, {X} custom graphics | Top results average {Y} |
| Videos | {Yes/No - embed or create} | {Reasoning} |

## Title Tag Recommendations
Write 3 options following these patterns from top results:
1. "{Title option 1}" ({length} chars)
2. "{Title option 2}" ({length} chars)
3. "{Title option 3}" ({length} chars)

## Meta Description Recommendations
1. "{Meta option 1}" ({length} chars)
2. "{Meta option 2}" ({length} chars)

## Recommended Outline

### H1: {Heading}

### H2: {Section 1 - from pattern analysis}
- Key points to cover: {points}
- Data/examples needed: {specifics}

### H2: {Section 2}
- Key points: ...

### H2: {Section 3}
...

### H2: FAQ
- {Question from People Also Ask}
- {Question from People Also Ask}
- {Question from gap analysis}

## Content Gaps to Exploit
1. **{Gap}** - Only {X}/10 competitors cover this. Include {specific content}.
2. **{Gap}** - No competitors have {data/tool/visual}. Create {specific asset}.
3. **{Gap}** - Top results are outdated on {topic}. Include {current data}.

## Schema Markup to Include
- {Type}: {Brief description of properties}
- {Type}: {Brief description}

## Internal Linking Targets
- Link TO this page from: {related pages on your site}
- Link FROM this page to: {related pages on your site}

## Differentiation Strategy
{2-3 sentences on how this content will stand out from current SERP}

Output Format

Always present:

  1. SERP Overview - Feature map and intent analysis
  2. Top 10 Analysis Table - Key metrics for each result
  3. Pattern Summary - What the SERP rewards
  4. Content Gaps - Opportunities to differentiate
  5. Content Brief - Complete brief ready for a writer

Notes

  • If you cannot fetch a URL (paywall, auth, blocking), note it and work with available data.
  • Always note the date of analysis. SERPs change; this is a snapshot.
  • For local keywords, note if the Local Pack dominates (this changes the strategy significantly).
  • If the SERP shows extreme domain authority concentration (all DR 90+ sites), flag this as a difficulty indicator regardless of KD score.
  • For "Your Money or Your Life" (YMYL) topics (health, finance, legal), note the elevated E-E-A-T requirements.
1---
2name: serp-analyzer
3description: Analyze Google search results (SERP) for any keyword. Use when the user says "analyze the SERP", "what ranks for", "SERP analysis", "competitive analysis for keyword", "content brief", "what's ranking", "search results for", "who ranks for", or asks about ranking content patterns for a keyword.
4---
5 
6# SERP Analyzer Skill
7 
8You are an expert SERP analyst. Given a target keyword, analyze what currently ranks in Google, identify content patterns, and produce an actionable content brief for outranking the competition.
9 
10## Prerequisites
11 
12Optional API keys for enriched data (the skill can work without any of them using web search):
13- `SEMRUSH_API_KEY` - for keyword and organic results data
14- `SERPAPI_API_KEY` - for real-time Google SERP data including SERP features
15- `DATAFORSEO_LOGIN` and `DATAFORSEO_PASSWORD` - for advanced SERP data
16- `SERPINGAPI_API_KEY` - for real-time Google SERP data (free tier available)
17 
18## Analysis Process
19 
20### Step 1: Collect SERP Data
21 
22Use multiple data sources to build a complete SERP picture:
23 
24**Method A: SemRush API (if available)**
25```
26# Get organic results for keyword
27https://api.semrush.com/?type=phrase_organic&key={KEY}&phrase={keyword}&database=us&export_columns=Dn,Ur,Fk,Fp&display_limit=20
28```
29Columns: Dn=Domain, Ur=URL, Fk=SERP Features, Fp=Position
30 
31**Method B: Web Search (always do this)**
32Use the WebSearch tool to search for the exact keyword. This gives you real-time SERP data.
33 
34**Method C: Fetch top results**
35Use WebFetch on the top 5-10 ranking URLs to analyze actual content.
36 
37**Method D: SerpAPI (if SERPAPI_API_KEY available)**
38 
39Real-time Google SERP data with structured SERP features:
40```bash
41# Real-time Google SERP data via SerpAPI
42curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en"
43```
44 
45The JSON response includes:
46- `organic_results` - Array of organic listings with `position`, `title`, `link`, `snippet`, `displayed_link`
47- `related_questions` - People Also Ask questions with `question`, `snippet`, `title`, `link`
48- `knowledge_graph` - Knowledge panel data with `title`, `description`, `entity_type`, and attributes
49- `shopping_results` - Product listings (if present) with `title`, `price`, `link`, `source`
50- `local_results` - Local Pack listings (if present) with `title`, `address`, `rating`, `reviews`
51- `inline_images` - Image pack results
52- `answer_box` - Featured snippet content with `type` (paragraph, list, table), `snippet`, `title`
53- `related_searches` - Related search queries
54 
55Parse example:
56```bash
57# Extract organic results
58curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
59 jq '.organic_results[] | {position, title, link, snippet}'
60 
61# Extract People Also Ask questions
62curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
63 jq '.related_questions[] | {question, snippet}'
64 
65# Check for knowledge graph
66curl -s "https://serpapi.com/search.json?q={keyword}&api_key=${SERPAPI_API_KEY}&num=20&gl=us&hl=en" | \
67 jq '.knowledge_graph | {title, description, entity_type}'
68```
69 
70SerpAPI is especially useful for mapping SERP features in Step 2, as it returns structured data for every feature type.
71 
72**Method E: DataForSEO (if DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD available)**
73 
74Advanced SERP data with detailed item types and ranking metrics:
75```bash
76# DataForSEO SERP API
77curl -s -X POST "https://api.dataforseo.com/v3/serp/google/organic/live/advanced" \
78 -H "Authorization: Basic $(echo -n '${DATAFORSEO_LOGIN}:${DATAFORSEO_PASSWORD}' | base64)" \
79 -H "Content-Type: application/json" \
80 -d '[{"keyword": "{keyword}", "location_code": 2840, "language_code": "en"}]'
81```
82 
83The response provides:
84- `result[0].items` - Array of all SERP items, each with a `type` field:
85 - `"organic"` - Standard organic results with `url`, `title`, `description`, `rank_group`, `rank_absolute`
86 - `"featured_snippet"` - Featured snippet with `description`, `url`, `type` (paragraph/list/table)
87 - `"people_also_ask"` - PAA questions with `items[].title` (the questions)
88 - `"knowledge_graph"` - Knowledge panel data
89 - `"local_pack"` - Local results
90 - `"shopping"` - Shopping results
91 - `"video"` - Video carousel items
92 - `"images"` - Image pack
93 - `"related_searches"` - Related search suggestions
94- `result[0].item_types` - Array listing which SERP feature types are present (useful for Step 2 feature mapping)
95- `result[0].se_results_count` - Total search results count
96 
97Location codes: 2840 = US, 2826 = UK, 2124 = Canada, 2036 = Australia. Change `location_code` for geo-targeted analysis.
98 
99**Method F: Serping API (if SERPINGAPI_API_KEY available)**
100 
101Real-time Google SERP data as Serper-style JSON from a single endpoint. Get a key at https://serpingapi.com (free tier available) and set `SERPINGAPI_API_KEY`.
102 
103```bash
104# Real-time Google SERP data via Serping API (POST, JSON body)
105curl -s -X POST "https://api.serpingapi.com/v1/search" \
106 -H "X-API-Key: ${SERPINGAPI_API_KEY}" \
107 -H "Content-Type: application/json" \
108 -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}'
109```
110 
111The JSON response includes (sections appear only when Google returns them):
112- `organic` - Array of organic listings with `position`, `title`, `link`, `snippet` (sometimes `sitelinks`, `date`, `rating`)
113- `peopleAlsoAsk` - People Also Ask questions with `question`, `snippet`, `title`, `link`
114- `answerBox` - Featured snippet / direct answer
115- `knowledgeGraph` - Knowledge panel data with `title`, `type`, `description`, `attributes`
116- `relatedSearches` - Related search queries as `{ "query": ... }`
117- `searchParameters` - Echo of the parameters the search ran with
118 
119Parse example:
120```bash
121# Extract organic results
122curl -s -X POST "https://api.serpingapi.com/v1/search" \
123 -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
124 -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
125 jq '.organic[] | {position, title, link, snippet}'
126 
127# Extract People Also Ask questions
128curl -s -X POST "https://api.serpingapi.com/v1/search" \
129 -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
130 -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
131 jq '.peopleAlsoAsk[] | {question, snippet}'
132 
133# Check for featured snippet / knowledge graph
134curl -s -X POST "https://api.serpingapi.com/v1/search" \
135 -H "X-API-Key: ${SERPINGAPI_API_KEY}" -H "Content-Type: application/json" \
136 -d '{"q": "{keyword}", "gl": "us", "hl": "en", "num": 20}' | \
137 jq '{answerBox, knowledgeGraph: (.knowledgeGraph | {title, type, description})}'
138```
139 
140Optional parameters: `location` (e.g. `"Seattle, Washington, United States"`), `page` (starting at 1), `tbs` for a time filter (`qdr:d` day, `qdr:w` week, `qdr:m` month, `qdr:y` year). Web search only — no ads, shopping, or local pack sections.
141 
142Errors come back as `{"error": {"code": "...", "message": "..."}}`: `401 invalid_api_key` means the key is wrong or revoked; `429 quota_exceeded` means the monthly quota is used up (resets on the 1st, UTC). In either case tell the user the specific error and fall back to Method B.
143 
144### Step 2: Map SERP Features
145 
146Document every SERP feature present for this keyword:
147 
148| Feature | Present? | Who owns it? | Can you win it? |
149|---------|----------|-------------|-----------------|
150| Featured Snippet | Yes/No | {domain} | {assessment} |
151| People Also Ask | Yes/No | {list questions} | - |
152| Knowledge Panel | Yes/No | {entity} | - |
153| Image Pack | Yes/No | {position in SERP} | {assessment} |
154| Video Carousel | Yes/No | {platforms} | {assessment} |
155| Local Pack | Yes/No | - | {assessment} |
156| Shopping Results | Yes/No | - | {assessment} |
157| News Results | Yes/No | {sources} | {assessment} |
158| Sitelinks | Yes/No | {domain} | - |
159| Reviews/Stars | Yes/No | {domains} | {assessment} |
160| FAQ Rich Results | Yes/No | {domains} | {assessment} |
161| Breadcrumbs | Yes/No | {domains} | - |
162 
163**SERP Intent Signal Analysis:**
164- Mostly blog posts/guides = Informational intent
165- Mostly product/service pages = Transactional intent
166- Mix of reviews + product pages = Commercial investigation
167- Brand homepage + login pages = Navigational intent
168- Featured snippet present = Strong informational component
169 
170### Step 3: Analyze Top 10 Results
171 
172For each of the top 10 organic results, fetch and analyze:
173 
174| Factor | What to measure |
175|--------|----------------|
176| **URL** | Full URL |
177| **Domain** | Domain authority/reputation |
178| **Title tag** | Exact title, length, keyword placement |
179| **Meta description** | Exact description, length, call-to-action |
180| **Content type** | Blog post, landing page, tool, directory, video, etc. |
181| **Word count** | Total content length |
182| **Heading structure** | H1, number of H2s/H3s, heading keywords |
183| **Content format** | Listicle, how-to, comparison, guide, definition, etc. |
184| **Visuals** | Number of images, videos, infographics, tables |
185| **Date** | Published date, last updated date |
186| **Author** | Named author, credentials shown |
187| **Unique angle** | What differentiates this from others |
188| **Internal links** | Number of internal links |
189| **External links** | Number of outbound links, sources cited |
190| **Schema markup** | Types of structured data used |
191| **Reading level** | Approximate Flesch-Kincaid grade level |
192 
193### Step 4: Identify Patterns
194 
195After analyzing all top 10 results, find commonalities:
196 
197**Content Pattern Analysis:**
198 
199```markdown
200## Content Patterns for "{keyword}"
201 
202### Dominant Content Type: {type}
203{X} of 10 results are {blog posts/landing pages/tools/etc.}
204 
205### Average Metrics:
206- Word count: {average} (range: {min}-{max})
207- Number of headings: {average}
208- Number of images: {average}
209- Number of links (internal): {average}
210- Number of links (external): {average}
211 
212### Common Topics Covered:
2131. {topic} - covered by {X}/10 results
2142. {topic} - covered by {X}/10 results
2153. {topic} - covered by {X}/10 results
216...
217 
218### Common H2 Headings:
2191. "{heading}" or similar - used by {X}/10
2202. "{heading}" or similar - used by {X}/10
221...
222 
223### Featured Snippet Format:
224Type: {paragraph/list/table/video}
225Content: {what the snippet shows}
226How to win it: {specific advice}
227```
228 
229### Step 5: Find Content Gaps
230 
231Identify what the top results are MISSING:
232 
233- Topics mentioned by only 1-2 results (opportunity to be comprehensive)
234- Outdated information (opportunity for freshness)
235- Missing media types (no videos, no infographics, no interactive tools)
236- Missing perspectives (no expert quotes, no data, no case studies)
237- Unanswered "People Also Ask" questions
238- Missing schema markup types
239- Poor user experience (slow, no mobile optimization, intrusive ads)
240 
241### Step 6: Analyze Competitive Positioning
242 
243For each top 5 competitor, create a positioning map:
244 
245```
246Competitor 1 ({domain}): {Positioning summary - e.g., "Beginner-friendly, surface-level guide"}
247 Strengths: {what they do well}
248 Weaknesses: {what they miss or do poorly}
249 
250Competitor 2 ({domain}): {Positioning summary}
251 Strengths: ...
252 Weaknesses: ...
253```
254 
255**Find your differentiation angle:**
256- Can you be more comprehensive? (10x content)
257- Can you be more actionable? (templates, tools, checklists)
258- Can you be more current? (latest data, 2025 updates)
259- Can you be more authoritative? (expert interviews, original research)
260- Can you serve a different sub-audience? (beginners vs. advanced)
261- Can you provide a unique format? (interactive tool vs. blog post)
262 
263### Step 7: Generate Content Brief
264 
265Produce a complete content brief based on the analysis:
266 
267```markdown
268# Content Brief: {Target Keyword}
269 
270## Target Keyword
271- **Primary:** {keyword} (Volume: {vol}, KD: {kd})
272- **Secondary:** {keyword2}, {keyword3}, {keyword4}
273- **Long-tail:** {keyword5}, {keyword6}
274 
275## Search Intent
276**Primary intent:** {Informational/Commercial/Transactional}
277**User goal:** {What the searcher wants to accomplish}
278**Stage in funnel:** {Awareness/Consideration/Decision}
279 
280## Content Specifications
281 
282| Spec | Recommendation | Reasoning |
283|------|---------------|-----------|
284| Content type | {blog/landing/tool} | {X}/10 results are this type |
285| Word count | {target} words | Top 3 average {avg}, aim for {target} |
286| Format | {listicle/how-to/guide} | Dominant format in SERP |
287| Reading level | Grade {X} | Match audience expectation |
288| Visuals | {X} images, {X} custom graphics | Top results average {Y} |
289| Videos | {Yes/No - embed or create} | {Reasoning} |
290 
291## Title Tag Recommendations
292Write 3 options following these patterns from top results:
2931. "{Title option 1}" ({length} chars)
2942. "{Title option 2}" ({length} chars)
2953. "{Title option 3}" ({length} chars)
296 
297## Meta Description Recommendations
2981. "{Meta option 1}" ({length} chars)
2992. "{Meta option 2}" ({length} chars)
300 
301## Recommended Outline
302 
303### H1: {Heading}
304 
305### H2: {Section 1 - from pattern analysis}
306- Key points to cover: {points}
307- Data/examples needed: {specifics}
308 
309### H2: {Section 2}
310- Key points: ...
311 
312### H2: {Section 3}
313...
314 
315### H2: FAQ
316- {Question from People Also Ask}
317- {Question from People Also Ask}
318- {Question from gap analysis}
319 
320## Content Gaps to Exploit
3211. **{Gap}** - Only {X}/10 competitors cover this. Include {specific content}.
3222. **{Gap}** - No competitors have {data/tool/visual}. Create {specific asset}.
3233. **{Gap}** - Top results are outdated on {topic}. Include {current data}.
324 
325## Schema Markup to Include
326- {Type}: {Brief description of properties}
327- {Type}: {Brief description}
328 
329## Internal Linking Targets
330- Link TO this page from: {related pages on your site}
331- Link FROM this page to: {related pages on your site}
332 
333## Differentiation Strategy
334{2-3 sentences on how this content will stand out from current SERP}
335```
336 
337## Output Format
338 
339Always present:
3401. **SERP Overview** - Feature map and intent analysis
3412. **Top 10 Analysis Table** - Key metrics for each result
3423. **Pattern Summary** - What the SERP rewards
3434. **Content Gaps** - Opportunities to differentiate
3445. **Content Brief** - Complete brief ready for a writer
345 
346## Notes
347 
348- If you cannot fetch a URL (paywall, auth, blocking), note it and work with available data.
349- Always note the date of analysis. SERPs change; this is a snapshot.
350- For local keywords, note if the Local Pack dominates (this changes the strategy significantly).
351- If the SERP shows extreme domain authority concentration (all DR 90+ sites), flag this as a difficulty indicator regardless of KD score.
352- For "Your Money or Your Life" (YMYL) topics (health, finance, legal), note the elevated E-E-A-T requirements.
353 

Discussion

Alternatives

Agentic Browsing ReadinessAudit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).Marketing · MITBacklink Profile AnalysisBacklink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit.Marketing · MIT/setup-cmsConnect a CMS to notfair SEO tools. Guides users through configuring WordPress, Strapi, Contentful, or Ghost — tests the connection, and writes credentials to .env.local. Once set up, seo-analysis automatically cross- references CMS content against Google Search Console data. Use whenever the user says "connect my CMS", "set up WordPress", "configure Strapi", "add Contentful", "connect Ghost", or "CMS setup". Also trigger if the user asks why no CMS data appears in a seo-analysis report. · MITBacklink checkBacklink profile for any domain — referring domains, authority, anchors, new/lost links, and a side-by-side vs a competitor. Use when asked "check my backlinks", "backlink profile of X", "who links to them", or "link gap vs competitor".Marketing · MIT