seo-keyword-research
Skill0 starsChanged 3 months agoMITView on GitHub
Run a full SEO competitor + keyword research pass for the CURRENT React/Next.js project — first ASKS the user where the site's real content lives (CMS, MDX/content directory, hardcoded in components, headless CMS API, etc.), then reads that content to figure out what the business does, services, products, and audience, finds real competitors via web search, analyzes what competitors rank for and write about, then researches keywords and estimates which ones are high-volume / low-difficulty opportunities, and finally proposes specific blog posts and landing pages to target them — with App Router/Pages Router-aware suggestions (route paths, MDX files, metadata). Trigger this whenever the user asks for "keyword research", "SEO research", "competitor analysis", "what should we blog about", "what keywords can we rank for", or wants content/page suggestions for organic search on a React/Next.js site — even if they don't use the words "SEO" or "keyword" explicitly (e.g. "what should our next blog post be about", "who are our competitors online"). Always use this skill instead of doing an ad-hoc web search when the request is about ranking, organic traffic, or content strategy for a specific site/project.
10 other projects use a version of this.
Adopted by
Most recently taken up by
- brainbytes-dev/everything-claude-marketingtheir own version, first seen Nov 1, 2026
- DoddleHQ/doddle-seo-geo-skillstheir own version, first seen Oct 20, 2026
- Thibaultbm/claude-seo-geotheir own version, first seen Oct 13, 2026
- datacas/seo-agent-toolkittheir own version, first seen Oct 11, 2026
- agentbody/skillstheir own version, first seen Oct 11, 2026
- AISA-skills/marketing-skillstheir own version, first seen Jul 27, 2026
Used with
Projects with it also use seo-internal-linking.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
Teapot-AgencySkillseo-internal-linking
AI-powered internal linking recommendations z brief + site map. Reads brief.json (z $seo-content-brief) + site_map.json (z $seo-site-crawler), AI-skóruje candidate URLs by semantic relevance to brief topic + secondary KWs, outputs ranked top 5-10 s anchor suggestions a reasoning. Auto-fired počas $seo-content-brief Section 7. Triggers - "navrhni internal linky pre brief XYZ", "internal linking pre <slug>", "linking suggestions pre brief". Pre site URL discovery (zdroj data) use $seo-site-crawler. Pre brief generation use $seo-content-brief.
Also in 3 projects that use this
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 10
- Thibaultbm/claude-seo-geo★ 18same name
- yoyothesheep/claude-skills★ 16same name
- brainbytes-dev/everything-claude-marketing★ 9same name
- AISA-skills/marketing-skills★ 6same name
- Muvon/octomind-tap★ 6same name
- 01clauding/claude-seo-skill★ 4same name
- agentbody/skills★ 1same name
- datacas/seo-agent-toolkit★ 1same name
- baofeng-tech/agent-skills-so★ 0same name
- DoddleHQ/doddle-seo-geo-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository2 other files it gives its agents.
- content-research-writerSkill
- ui-redesignSkill
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 8 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 43
If what you're given is still too thin (e.g.
- Very specific: line 47
Use web_search (and web_fetch on promising results) to find actual competitors:
- Distinctive: line 48
Search for the core services/products + location (if local) or + industry (if not)
- Distinctive: line 49
Search for the site's own name/domain + "vs" or "alternatives" if it's an established brand
- Distinctive: line 50
Prefer competitors that are genuinely comparable in size/scope — skip huge national players if this is a small local business, they're not …
- Distinctive: line 73
Only old, thin, or zero dedicated content exists on this exact phrase → likely low volume (flag as long-tail, not "high volume")
- Distinctive: line 123
Always ground Step 1 in the actual project content before searching anything — generic SEO advice without project context is not the point …
- Distinctive: line 125
If the user has Google Search Console, Google Analytics, or an SEO tool connected via MCP, prefer that real data over estimation for any …
- Distinctive: line 126
Keep the keyword table to a focused, actionable set (roughly 15-30 keywords) rather than an exhaustive dump.
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
SEO Keyword Research & Content Suggestions (React/Next.js)
Produces a markdown SEO report for the current React/Next.js project: ask where content lives → business summary → competitors → keyword opportunities → content suggestions with route-aware placement.
Hard constraint: no paid SEO API/tool is connected. There is no Ahrefs/SEMrush/Ubersuggest/DataForSEO data source. Every volume and difficulty (KD) figure in the output is an estimate derived from web search signals and reasoning, not a real metric. Never present estimates as if they came from a tool. Every report must carry the disclaimer in Step 5's template, and every keyword table must use a "Confidence" column, not a fake precise number.
Step 0 — Ask where the content actually lives (mandatory, do this first)
Do not read files or search the web yet. In a React/Next.js project the real business content can live in wildly different places depending on the setup, and guessing wrong wastes a pass. Ask the user directly, before doing anything else:
"Where does this site's actual content live? For example:
- Hardcoded in components/pages (e.g.
app/,pages/,components/)- MDX/Markdown files in a content directory (e.g.
content/,posts/)- A headless CMS (Sanity, Contentful, Strapi, Payload, etc.) — and if so, can I query it, or should I read from exported/cached data in the repo?
- A
data/folder of JSON/TS objects (services, products, locations, etc.)- Something else?
Also — is there an existing
README.mdor project doc that already describes the business (services, products, location, audience)?"
Wait for the answer. Only proceed to Step 1 once you know where to look. If the user says "just figure it out," fall back to scanning in this order and say what you found before continuing: README.md → content//posts//blog/ (MDX/MD) → app/ or pages/ route files and their metadata exports → data//lib/ constants → CMS client/config files (e.g. sanity.config.ts, contentful.ts) — but flag that you're guessing and confirm with the user before moving to Step 2.
Step 1 — Understand the project
Now read whatever the user pointed you to (or what you found in the fallback scan). Depending on the setup, that might mean:
- MDX/Markdown files: read the frontmatter and body of posts/pages for real topics already covered and the tone/voice used
- App/Pages Router files: check route structure (
app/**/page.tsx,pages/**/*.tsx) for what pages already exist, and readgenerateMetadata/next-seo/<Head>config for current titles, descriptions, and target keywords already in use - Headless CMS: if you have API/MCP access, query it; otherwise ask the user for a content export, or a few representative pages' worth of pasted content
data//lib/constants: read service/product/location arrays or objects directly — these are often the cleanest source of truthpackage.json/README.md: stack, project name, and often a description of what the business does
Extract and hold onto:
- What the business/site actually is (industry, one-liner)
- Concrete services or products offered (the actual names used on-site, not paraphrases)
- Location/service area, if it's a local business — this changes keyword strategy a lot (local modifiers matter more than volume)
- Target audience (residents, businesses, a specific demographic, etc.)
- Existing blog/content already published (route paths or MDX slugs), so you don't suggest what's already covered
If what you're given is still too thin (e.g. a bare scaffold with no real content anywhere), say so explicitly and ask the user for a one-paragraph description rather than inventing a business.
Step 2 — Find real competitors
Use web_search (and web_fetch on promising results) to find actual competitors:
- Search for the core services/products + location (if local) or + industry (if not)
- Search for the site's own name/domain + "vs" or "alternatives" if it's an established brand
- Prefer competitors that are genuinely comparable in size/scope — skip huge national players if this is a small local business, they're not real competitors for ranking purposes
For each of 3–6 competitors found, note:
- Domain and a one-line description of what they offer
- Their apparent content strategy: do they have a blog? What topics? (fetch their blog/sitemap index page if reachable)
- Anything they rank for or emphasize that the project's own site doesn't cover yet — this is the gap you're hunting for
Step 3 — Build a keyword candidate list
Generate seed keywords from three sources, not just one:
- The project's own services/products (from Step 1) — direct "service + modifier" terms
- Competitor content gaps (from Step 2) — topics competitors cover that this project doesn't
- Question-based / long-tail terms — search Google-style queries and note "People also ask" style questions, forum threads (Reddit, Quora) discussing the topic, and autocomplete-style suggestions that surface in search results
For each candidate keyword, do a real web_search for that exact phrase and read the SERP signals, don't just guess from the term alone.
Step 4 — Estimate volume & difficulty from SERP signals
Since there's no keyword tool, infer volume and difficulty from what the search results actually show:
Volume signals (higher → lower):
- Term appears as an autocomplete suggestion or "People also ask" entry → decent volume
- Multiple recent, well-produced articles target the exact phrase → decent volume
- Only old, thin, or zero dedicated content exists on this exact phrase → likely low volume (flag as long-tail, not "high volume")
- Very generic single/two-word terms are almost always high volume but also high difficulty — call this out
Difficulty (KD) signals (lower → easier):
- Top 10 results are mostly forums, local business pages, small blogs, or "listicle" aggregators, not major brands/publishers → likely low difficulty
- Top 10 dominated by major national brands, .gov/.edu, or big publishers → likely high difficulty
- The exact phrase has no dedicated page in the top 10 (only broader pages loosely matching) → content gap, often easier to win
- Local/service-area modifiers ("in [city]", "near me", "[neighborhood]") almost always lower difficulty than the bare term — always generate local variants for local businesses
Label every keyword's volume and difficulty as Low / Medium / High, never a fabricated number, and add a one-line "why" citing what you saw in the SERP.
Step 5 — Write the report
Save as markdown to the project (e.g. seo/keyword-research-<YYYY-MM-DD>.md or docs/seo/... — check for an existing docs/ or seo/ folder first, otherwise ask the user where to put it). Structure:
# SEO Keyword Research — [Project Name]
_Generated [date]. Estimates are based on web search signals, not a paid SEO tool — treat Volume/KD as directional, not exact._
## 1. Business Summary
[2-4 sentences: what this site/business does, services/products, audience, location if local]
## 2. Competitors
| Competitor | What they offer | Content gap they expose |
|---|---|---|
| ... | ... | ... |
## 3. Keyword Opportunities
| Keyword | Intent | Est. Volume | Est. Difficulty | Why (SERP signal) |
|---|---|---|---|---|
| ... | informational/commercial/local | Low/Med/High | Low/Med/High | ... |
Focus the table on the **High-volume + Low/Medium-difficulty** rows — that's the target set. Include a handful of Medium-volume/Low-difficulty long-tail ones too; those are often the fastest wins.
## 4. Content Suggestions
For each priority keyword or cluster:
- **Type:** Blog post / Service page / Landing page
- **Working title**
- **Target keyword** + 2-3 secondary keywords to naturally include
- **Angle:** why this angle, what makes it different from what competitors have
- **Suggested route/file:** match the project's actual convention found in Step 1 — e.g. `app/blog/[slug]/page.tsx` → `app/blog/service-in-city/page.tsx`, or a new MDX file in `content/blog/service-in-city.mdx`, or a new entry in the CMS
- **Metadata:** suggested `title` and `description` for `generateMetadata`/`next-seo`/frontmatter, sized correctly (title ~50-60 chars, description ~150-160 chars)
## 5. Notes / Next Steps
[Anything that needs the user's input — e.g. "no volume data available, confirm with Search Console/GSC data if you have it" or gaps in project context]Notes for running this well
- Never skip Step 0. Don't scan the filesystem or search the web before the user has told you (or you've confirmed a fallback guess with them) where the content actually lives — guessing wrong in a React/Next.js project (CMS vs. MDX vs. hardcoded) wastes the whole pass.
- Always ground Step 1 in the actual project content before searching anything — generic SEO advice without project context is not the point of this skill.
- Be honest in the report when confidence is low (thin project context, sparse SERP signal, etc.) rather than padding it out.
- If the user has Google Search Console, Google Analytics, or an SEO tool connected via MCP, prefer that real data over estimation for any keyword it covers — check available tools before starting Step 4.
- Keep the keyword table to a focused, actionable set (roughly 15-30 keywords) rather than an exhaustive dump.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

