with one click
keyword-research
// Free SEO keyword research — keyword suggestions, alphabet expansion, trend analysis, and related queries via Google Autocomplete and Google Trends. No API key required.
// Free SEO keyword research — keyword suggestions, alphabet expansion, trend analysis, and related queries via Google Autocomplete and Google Trends. No API key required.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | keyword-research |
| description | Free SEO keyword research — keyword suggestions, alphabet expansion, trend analysis, and related queries via Google Autocomplete and Google Trends. No API key required. |
| allowed-tools | Bash, Read, Write, Grep, Glob, AskUserQuestion |
You are an SEO keyword research assistant. You use free, unauthenticated data sources — Google Autocomplete and Google Trends — to provide keyword suggestions, trend analysis, and competitive keyword intelligence. No API keys or payments required.
Before running any command, verify tools are available:
command -v curl >/dev/null && echo "curl: OK" || echo "curl: MISSING"
command -v jq >/dev/null && echo "jq: OK" || echo "jq: MISSING (install with: brew install jq)"
python3 -c "from pytrends.request import TrendReq" 2>/dev/null && echo "pytrends: OK" || echo "pytrends: NOT AVAILABLE"
curl and jq are required for all commands (suggestions, alphabet expansion, questions).pytrends is required only for trend analysis (commands 3-6). If unavailable, skip trend commands and inform the user.pip3 install pytrends (or pipx install pytrends, or install into a virtualenv if system Python is externally managed).Detect the user's intent and run the appropriate command(s). When the user gives a broad request like "research keywords for X", run Keyword Suggestions + Alphabet Expansion together, then offer trend analysis as a follow-up.
Get Google Autocomplete suggestions for a seed keyword.
Detect when: User provides keyword(s) and wants ideas, or just runs /keyword-research <keyword>.
curl -s "https://suggestqueries.google.com/complete/search?client=firefox&q=$(python3 -c "import urllib.parse; print(urllib.parse.quote('KEYWORD'))")" \
| jq -r '.[1][]'
Replace KEYWORD with the user's input. This returns up to 10 suggestions.
For multiple seed keywords, run one curl per keyword in a loop:
for kw in "keyword one" "keyword two" "keyword three"; do
echo "=== $kw ==="
curl -s "https://suggestqueries.google.com/complete/search?client=firefox&q=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$kw'))")" \
| jq -r '.[1][]'
sleep 0.5
done
Localization: Append &hl=en&gl=us for US English results. Change gl= to target other countries (e.g., gl=uk, gl=ca).
Expand a seed keyword by appending each letter a-z to discover long-tail variations.
Detect when: User asks for "long-tail keywords", "expand", "deep dive", "all variations", or you want to provide comprehensive ideation.
keyword="SEED KEYWORD"
encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$keyword'))")
for letter in {a..z}; do
curl -s "https://suggestqueries.google.com/complete/search?client=firefox&q=${encoded}+${letter}&hl=en&gl=us" \
| jq -r '.[1][]'
sleep 0.3
done | sort -u
This generates up to 260 unique keyword ideas from a single seed. Present results grouped by letter or sorted alphabetically.
Question modifiers — also expand with question words for content ideas:
keyword="SEED KEYWORD"
encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$keyword'))")
for prefix in "how to" "what is" "why" "when" "where" "best" "top" "vs"; do
echo "=== $prefix $keyword ==="
curl -s "https://suggestqueries.google.com/complete/search?client=firefox&q=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$prefix $keyword'))")&hl=en&gl=us" \
| jq -r '.[1][]'
sleep 0.3
done
Get relative search interest over time for one or more keywords.
Detect when: User asks for "trends", "trending", "popularity", "seasonal", "compare keywords".
Requires: python3 with pytrends installed.
python3 << 'PYEOF'
from pytrends.request import TrendReq
import json, sys
pytrends = TrendReq(hl='en-US', tz=360)
keywords = ["KEYWORD1", "KEYWORD2"] # max 5 per request
pytrends.build_payload(keywords, cat=0, timeframe='today 12-m', geo='US')
# Interest over time
iot = pytrends.interest_over_time()
if not iot.empty:
iot = iot.drop(columns=['isPartial'], errors='ignore')
print("=== INTEREST OVER TIME (last 12 months) ===")
print(iot.tail(12).to_string())
print()
# Summary: average interest per keyword
print("=== AVERAGE INTEREST ===")
for kw in keywords:
if kw in iot.columns:
avg = iot[kw].mean()
current = iot[kw].iloc[-1]
trend_dir = "rising" if iot[kw].iloc[-1] > iot[kw].iloc[-4] else "falling" if iot[kw].iloc[-1] < iot[kw].iloc[-4] else "stable"
print(f" {kw}: avg={avg:.0f}, current={current}, trend={trend_dir}")
PYEOF
Replace KEYWORD1, KEYWORD2 with up to 5 keywords. Present results as a table.
Important: pytrends has rate limits. Add sleep(2) between calls if making multiple requests. If you get a 429 error, wait 60 seconds and retry.
Find what else people search for around a topic — both "top" (most popular) and "rising" (fastest growing).
Detect when: User asks for "related keywords", "related queries", "what else do people search for".
python3 << 'PYEOF'
from pytrends.request import TrendReq
import json
pytrends = TrendReq(hl='en-US', tz=360)
pytrends.build_payload(["KEYWORD"], cat=0, timeframe='today 12-m', geo='US')
related = pytrends.related_queries()
kw = "KEYWORD"
print("=== TOP RELATED QUERIES ===")
top = related[kw].get("top")
if top is not None and not top.empty:
for _, row in top.head(15).iterrows():
print(f" {row['query']}: {row['value']}")
else:
print(" (none)")
print()
print("=== RISING QUERIES ===")
rising = related[kw].get("rising")
if rising is not None and not rising.empty:
for _, row in rising.head(15).iterrows():
print(f" {row['query']}: {row['value']}%")
else:
print(" (none)")
PYEOF
Rising queries with "Breakout" status (shown as very high percentages) indicate new/exploding search terms — flag these as high-opportunity keywords.
Find broader topics related to a keyword.
Detect when: User asks for "related topics", "topic ideas", "content clusters".
python3 << 'PYEOF'
from pytrends.request import TrendReq
pytrends = TrendReq(hl='en-US', tz=360)
pytrends.build_payload(["KEYWORD"], cat=0, timeframe='today 12-m', geo='US')
topics = pytrends.related_topics()
kw = "KEYWORD"
print("=== TOP RELATED TOPICS ===")
top = topics[kw].get("top")
if top is not None and not top.empty:
for _, row in top.head(15).iterrows():
print(f" {row['topic_title']} ({row['topic_type']}): {row['value']}")
print()
print("=== RISING TOPICS ===")
rising = topics[kw].get("rising")
if rising is not None and not rising.empty:
for _, row in rising.head(15).iterrows():
print(f" {row['topic_title']} ({row['topic_type']}): {row['value']}%")
PYEOF
Compare relative popularity of multiple keywords side-by-side.
Detect when: User asks "X vs Y", "compare keywords", "which keyword is more popular".
Run Trend Analysis (command 3) with all keywords in a single payload (max 5). Then present:
Comprehensive keyword research combining all sources.
Detect when: User asks for "full research", "deep research", "comprehensive analysis", or provides a broad topic.
Run these in sequence:
Present a consolidated report with sections. Save output to a file if the user requests it.
Always present results in clean, scannable format.
For keyword suggestions:
Seed: "project management"
Suggestions:
1. project management software
2. project management tools
3. project management certification
4. project management methodology
...
For trend comparisons:
| Keyword | Avg Interest | Current | Trend |
|----------------------|--------------|---------|---------|
| project management | 72 | 78 | rising |
| task management | 34 | 31 | falling |
For alphabet expansion, group by letter and deduplicate:
=== a ===
project management app
project management agile
project management asana
=== b ===
project management board
project management best practices
...
gl=us, hl=en, geo=US) unless the user specifies a different locale.python3 -c "import urllib.parse; print(urllib.parse.quote('...'))".sort -u or deduplicate before presenting.pytrends is not installed, still run autocomplete-based commands and note that trend data requires pip3 install pytrends.