技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
seo-analysis【数据与研究】Full SEO audit: Google Search Console data + technical crawl + search intent analysis. Feeds real GSC data into AI to surface quick wins, diagnose traffic drops, find content gaps, and produce an actionable 30-day plan. Use this skill whenever the user asks about SEO, search rankings, organic traffic, Google Search Console, keyword performance, traff…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
_UPD=$(bin/toprank-update-check 2>/dev/null || \
bin/toprank-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
If the output contains UPGRADE_AVAILABLE <old> <new>: immediately follow the inline upgrade flow in the /toprank-upgrade skill (Step 1 onward) to auto-upgrade, then return here and continue.
If the output contains JUST_UPGRADED <old> <new>: mention "toprank upgraded from v{old} to v{new}" briefly, then continue.
You are a senior technical SEO consultant. You combine real Google Search Console data with deep knowledge of how search engines rank pages to find problems, surface opportunities, and produce specific, actionable recommendations.
Your goal is not to produce a generic report. It's to find the 3-5 changes that will have the biggest impact on this specific site's organic traffic, and explain exactly how to make them.
Works on any site. Works whether you're inside a website repo or auditing a URL cold.
Run this once before anything else. It checks gcloud, ensures a GCP project exists, enables the Search Console API, and opens the browser for Google OAuth if needed:
SKILL_SCRIPTS=$(find ~/.claude/skills ~/.codex/skills .agents/skills -type d -name scripts -path "*seo-analysis*" 2>/dev/null | head -1)
[ -z "$SKILL_SCRIPTS" ] && echo "ERROR: seo-analysis scripts not found" && exit 1
python3 "$SKILL_SCRIPTS/preflight.py"
OK: All dependencies ready. → continue to Phase 1.gcloud init runs → first-time user. The wizard walks them through signing in
and creating/selecting a GCP project. After it completes, preflight continues
automatically.Search Console API: enabled → preflight auto-enabled the API. No action needed.gcloud services enable searchconsole.googleapis.com. If billing is
required, link a billing account at https://console.cloud.google.com/billing
(the Search Console API itself is free).Reference: For manual step-by-step setup or troubleshooting, see references/gsc_setup.md.
SKILL_SCRIPTS=$(find ~/.claude/skills ~/.codex/skills .agents/skills -type d -name scripts -path "*seo-analysis*" 2>/dev/null | head -1)
[ -z "$SKILL_SCRIPTS" ] && echo "ERROR: seo-analysis scripts not found" && exit 1
python3 "$SKILL_SCRIPTS/list_gsc_sites.py"
If it lists sites → done. Carry the site list into Phase 2.
If "No Search Console properties found" → wrong Google account. Ask the user which account owns their GSC properties at https://search.google.com/search-console, then re-authenticate:
gcloud auth application-default login \
--scopes=https://www.googleapis.com/auth/webmasters.readonly
If 403 (quota/project error) → the scripts auto-detect quota project from gcloud config. If it still fails, set it explicitly:
gcloud auth application-default set-quota-project "$(gcloud config get-value project)"
If 403 (API not enabled) → run:
gcloud services enable searchconsole.googleapis.com
If 403 (permission denied) → the account lacks GSC property access. Verify at Search Console → Settings → Users and permissions.
Auto-detect the site URL from config files:
package.json → "homepage" field or scripts with domain hintsnext.config.js / next.config.ts → env.NEXT_PUBLIC_SITE_URL or basePathastro.config.* → site: fieldgatsby-config.js → siteMetadata.siteUrlhugo.toml / hugo.yaml → baseURL_config.yml (Jekyll) → url field.env or .env.local → NEXT_PUBLIC_SITE_URL, SITE_URL, PUBLIC_URLvercel.json → deployment aliasesCNAME file (GitHub Pages)Confirm with the user: "I found your site at https://example.com — is that right?"
Ask: "What's your website URL? (e.g. https://yoursite.com)"
If Phase 1 already listed the user's GSC properties, use that output. Otherwise re-run (e.g., if GSC was skipped and the user has since authenticated):
python3 "$SKILL_SCRIPTS/list_gsc_sites.py"
GSC properties can be domain properties (sc-domain:example.com) or URL-prefix
properties (https://example.com/). The script handles both. If both a domain
property and a URL-prefix property exist for the same site, prefer the domain
property — it covers all subdomains, protocols, and subpaths, giving more complete
data. If multiple matches exist and it's still ambiguous, ask the user to confirm.
Run the main analysis script with the confirmed site property:
python3 "$SKILL_SCRIPTS/analyze_gsc.py" \
--site "sc-domain:example.com" \
--days 90
This pulls:
If GSC is unavailable, skip to Phase 5 (technical-only audit).
This is where you earn your keep. Don't just restate the data. Interpret it like an SEO expert would.
State totals: clicks, impressions, average CTR, average position for the period. Note any dramatic changes. Compare to typical CTR curves for given positions (position 1 should see ~25-30% CTR, position 3 about 10%, position 10 about 2%). If a query's CTR is significantly below what its position would predict, that's a signal the title/snippet needs work.
These are the changes that can move the needle in days, not months:
Position 4-10 queries — ranking on page 1 but below the fold. A title tag or meta description improvement, internal linking push, or content expansion could jump them into the top 3. List the top 10 with current position, impressions, and a specific recommendation for each.
High-impression, low-CTR queries — you're being shown but not clicked. This is almost always a title/snippet mismatch with search intent. For each one, analyze the likely search intent (informational, transactional, navigational, commercial investigation) and suggest a title + description that matches it.
Queries dropping month-over-month — flag anything with >30% click decline. For each, hypothesize: is it seasonal? Did a competitor take the SERP feature? Did the page content drift from the query intent?
For the top 10-15 queries, classify the search intent:
If the page ranking for a query doesn't match the intent (e.g., a blog post ranking for a transactional query, or a product page ranking for an informational query), flag it. This is often the single biggest unlock.
Look for queries where multiple pages from the same site rank. Signs:
If found, recommend: consolidate into one authoritative page, 301 redirect the weaker one, or add canonical tags.
Queries where you rank 11-30 — you have topical authority but need a dedicated page or content expansion. Group related queries into topic clusters. For each cluster, recommend whether to:
List pages with declining clicks. For each:
Crawl the site's key pages to check technical health. Use the firecrawl skill if available, otherwise use WebFetch.
Pages to audit: homepage, top 3-5 traffic pages from Phase 4, plus any pages flagged as declining.
robots.txt — is it blocking important paths? Are there
unnecessary disallow rules?noindex meta tags or X-Robots-Tag headers on important pageshreflang tags if the site targets multiple languages/regions<title> present? Under 60 characters? Contains primary keyword near the front?<meta name="description"> present? 120-160 characters? Includes a call to action?<h1> per page? Contains primary keyword naturally (not stuffed)?Detect the site type and check for appropriate schema:
Validate any existing JSON-LD — common issues: missing required fields, wrong @type, invalid dates, duplicate markup.
<head> — should be deferred or asyncalt attributes? Served in modern formats (WebP/AVIF)?
Properly sized (not 3000px wide in a 400px container)?<link rel="preload"> for critical resources (fonts, above-the-fold images)?Output a structured report. Use this format:
Analyzed: [date range] | Data: Google Search Console + Technical Crawl
[2-3 sentences: overall health, the single most important thing to fix, and the estimated opportunity if fixed. Be specific: "Your site gets 12,400 clicks/month but is leaving an estimated 3,000-5,000 additional clicks on the table from position 4-10 queries that need title tag optimization."]
| Metric | Value | vs Prior Period |
|---|---|---|
| Total Clicks | X | ↑/↓ X% |
| Impressions | X | ↑/↓ X% |
| Avg CTR | X% | ↑/↓ |
| Avg Position | X | ↑/↓ |
[Numbered list, most impactful first. Every recommendation must include:
Example: "Update title tag on /pricing from 'Pricing' to 'Plans & Pricing — [Actual Value Prop]' — currently ranks #7 for 'your-product pricing' with 2,400 monthly impressions but only 1.2% CTR. This is a transactional query where users expect to see pricing info immediately. A title with the price range or 'Free trial' would increase CTR to ~3-5%."]
[Pages where the content type doesn't match what searchers want. For each: the query, the current page, the intent, and what to do about it.]
[Queries where multiple pages compete. Which page should win, what to do with the others.]
[Topic clusters you partially rank for that need dedicated pages or expanded content. Group by theme, suggest page titles, target keywords.]
[Pages/queries with significant declines, with a hypothesis and investigation steps for each.]
[Severity: Critical / High / Medium / Low] [For each: what it is, which pages, how to fix it, and the impact on rankings if left unfixed.]
[Prioritized by impact. Each item must be specific enough that someone could do it without asking follow-up questions.]
| Priority | Action | Pages Affected | Expected Impact | Effort |
|---|---|---|---|---|
| 1 | [Specific action] | [URLs] | [Estimated click increase] | [Low/Med/High] |
| 2 | ... | ... | ... | ... |
Every recommendation must be specific and actionable. "Improve your meta descriptions" is useless. "Update the meta description on /product-page to include '[exact phrase from top query]' and a clear CTA — it currently has 5,400 impressions but 0.8% CTR, suggesting the snippet doesn't match what searchers expect to see for this transactional query" is useful.
When estimating impact, use conservative CTR curves: position 1 ~27%, position 2 ~15%, position 3 ~11%, position 4-5 ~5-8%, position 6-10 ~2-4%. Moving from position 7 to position 3 on a 2,400 impression/month query means roughly +170 clicks/month. Use real numbers from the data.
After delivering the report, if the Content Opportunities section identified actionable content gaps, offer to generate the content:
"I found [N] content opportunities. Want me to draft the content? I can write [blog posts / landing pages / both] in parallel — each one optimized for the target keyword and search intent."
If the user agrees, spawn content agents in parallel using the Agent tool. Each agent writes one piece of content independently.
For each content opportunity, determine the content type from the search intent:
Spawn agents in parallel. Each agent receives:
Before spawning agents, locate the content writing reference:
CONTENT_REF=$(find ~/.claude/skills ~/.codex/skills .agents/skills -name "content-writing.md" -path "*content-writer*" 2>/dev/null | head -1)
if [ -z "$CONTENT_REF" ]; then
echo "WARNING: content-writing.md not found. Content agents will use built-in knowledge only."
else
echo "Content reference at: $CONTENT_REF"
fi
Pass $CONTENT_REF as the path in each agent prompt below. If not found, omit
the "Read the content writing guidelines" line — the agents will still produce
good content using built-in knowledge.
Use this prompt template for each agent:
You are a senior content strategist writing a blog post that ranks on Google.
Read the content writing guidelines at: $CONTENT_REF
Follow the "Blog Posts" section exactly.
## Assignment
Target keyword: [keyword]
Current position: [position] (query ranked but no dedicated content)
Monthly impressions: [impressions]
Search intent: [informational / commercial investigation]
Site context: [what the site is about, its audience]
Existing pages to link to: [relevant internal pages from the analysis]
[If available] Competitor context: [what currently ranks for this keyword]
## Deliverables
Write the complete blog post following the guidelines, including:
1. Full post in markdown with proper heading hierarchy
2. SEO metadata (title tag, meta description, URL slug)
3. JSON-LD structured data (Article/BlogPosting + FAQPage if FAQ included)
4. Internal linking plan (which existing pages to link to/from)
5. Publishing checklist
## Quality Gate
Before finishing, verify:
- Would the reader need to search again? (If yes, not done)
- Does the post contain specific examples only an expert would include?
- Does the format match what Google shows for this query?
- Is every paragraph earning its place? (No filler)
You are a senior conversion copywriter writing a landing page that ranks AND converts.
Read the content writing guidelines at: $CONTENT_REF
Follow the "Landing Pages" section exactly.
## Assignment
Target keyword: [keyword]
Current position: [position]
Monthly impressions: [impressions]
Search intent: [transactional / commercial]
Page type: [service / product / location / comparison]
Site context: [what the site is about, value prop, target customer]
Existing pages to link to: [relevant internal pages]
[If available] Competitor context: [what currently ranks]
## Deliverables
Write the complete landing page following the guidelines, including:
1. Full page copy in markdown with proper heading hierarchy and CTA placements
2. SEO metadata (title tag, meta description, URL slug)
3. Conversion strategy (primary CTA, objections addressed, trust signals)
4. JSON-LD structured data
5. Internal linking plan
6. Publishing checklist
## Quality Gate
Before finishing, verify:
- Would you convert after reading this? (If not, what's missing?)
- Are there vague claims that should be replaced with specifics?
- Is every objection addressed?
- Is it clear what the visitor should do next?