SEO MCP Tools Expert
This skill teaches how to use seo-mcp MCP tools effectively. It does NOT teach SEO concepts — see the other skills for that.
Tool Categories
A. Page Analysis (10 tools — always available, no API key needed)
| Tool | Purpose | Speed |
|------|---------|-------|
| analyze_page | Comprehensive on-page SEO analysis (includes Flesch-Kincaid readability, text-to-HTML ratio, thin content detection when includeContent=true) | 2-5s |
| analyze_headings | Heading structure validation | 1-3s |
| analyze_images | Image alt text, size, format audit | 2-10s |
| analyze_internal_links | Link mapping, anchor text, broken links | 2-15s |
| extract_schema | Structured data extraction + validation | 2-5s |
| analyze_robots_txt | robots.txt parsing and analysis | 1-2s |
| analyze_sitemap | XML sitemap validation | 2-10s |
| audit_security_headers | HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, mixed content | 2-5s |
| analyze_url_structure | URL length, depth, HTTPS, uppercase, underscores, parameters, file extensions | <1s |
| validate_hreflang | Hreflang language codes, x-default, self-referencing, return link verification | 5-30s |
B. Performance (2 tools — free, optional API key for higher limits)
| Tool | Purpose | Speed |
|------|---------|-------|
| check_core_web_vitals | LCP, INP, CLS + Lighthouse scores | 10-30s |
| check_mobile_friendly | Mobile usability evaluation | 10-20s |
C. Research (4 tools — require DataForSEO or Moz API key)
| Tool | Purpose | Speed |
|------|---------|-------|
| research_keywords | Search volume, difficulty, related keywords | 3-10s |
| analyze_serp | SERP features, top results | 3-10s |
| analyze_backlinks | Backlink profile, referring domains | 3-10s |
| analyze_domain_authority | DA/DR metrics | 2-5s |
D. Google Search Console (3 tools — require OAuth2 setup)
| Tool | Purpose | Speed |
|------|---------|-------|
| gsc_performance | Clicks, impressions, CTR, position | 2-5s |
| gsc_index_coverage | Index status, errors, warnings | 2-5s |
| gsc_sitemaps | Submitted sitemap status | 1-3s |
E. Generation (3 tools — always available)
| Tool | Purpose | Speed |
|------|---------|-------|
| generate_schema | Create JSON-LD markup | <1s |
| generate_robots_txt | Create robots.txt file | <1s |
| generate_meta_suggestions | Suggest improved meta tags | 2-5s |
F. Site Crawler (3 tools — always available, no API key needed)
| Tool | Purpose | Speed |
|------|---------|-------|
| crawl_site | Start BFS site crawl, returns crawl ID (async job pattern) | <1s (returns immediately) |
| crawl_status | Check crawl progress (pages crawled/queued/errored) | <1s |
| crawl_results | Aggregated issues, duplicates, redirect chains, per-page details | <1s |
System (1 tool)
| Tool | Purpose |
|------|---------|
| seo_tools_documentation | Tool docs, quick reference |
Common Workflows
Workflow 1: Full Page Audit
Use when: User says "audit this page", "check my SEO", or provides a URL for analysis.
Step 1: analyze_page(url, { includeContent: true, followRedirects: true })
→ Get overall score and identify major issues
Step 2: analyze_headings(url, { targetKeyword: "..." })
→ Validate heading structure (only if Step 1 shows heading issues)
Step 3: analyze_images(url, { checkFileSize: true })
→ Check image optimization (only if Step 1 shows image issues)
Step 4: check_core_web_vitals(url, { strategy: "mobile" })
→ Get performance metrics
Step 5: extract_schema(url, { validateGoogle: true })
→ Check structured data
Step 6: generate_meta_suggestions(url, { targetKeyword: "..." })
→ Suggest improvements
Key: Start with analyze_page — it's the broadest tool. Only drill down with specific tools if issues are found.
Workflow 2: Full Site Crawl
Use when: User wants to audit the entire site, find all issues, or detect duplicates/redirect chains.
Step 1: crawl_site(url, { maxPages: 100, maxDepth: 10 })
→ Returns crawl ID immediately. Crawl runs in background.
Step 2: crawl_status(crawlId)
→ Poll progress. Repeat until state is "completed".
Step 3: crawl_results(crawlId, { filter: "summary" })
→ Get aggregated issues by type/severity, status code distribution
Step 4: crawl_results(crawlId, { filter: "issues", severity: "high" })
→ Get high/critical issues with page URLs
Step 5: crawl_results(crawlId, { filter: "duplicates" })
→ Find duplicate titles, descriptions, H1s, exact content duplicates
Step 6: crawl_results(crawlId, { filter: "redirects" })
→ Find redirect chains (>2 hops) and loops
Key: The crawler analyzes each page for SEO issues automatically. Use crawl_results with different filters to focus on specific problem areas.
Workflow 3: Technical Site Audit
Use when: User wants to audit the entire site's technical health (without full crawl).
Step 1: analyze_robots_txt(domain)
→ Check crawlability rules
Step 2: analyze_sitemap(domain)
→ Validate sitemap structure
Step 3: analyze_page(homepage, { followRedirects: true })
→ Check homepage technical elements
Step 4: audit_security_headers(homepage)
→ Check HSTS, CSP, mixed content
Step 5: check_core_web_vitals(url, { strategy: "mobile", categories: ["performance", "seo"] })
→ Get Core Web Vitals for key pages
Step 5: check_mobile_friendly(url)
→ Verify mobile usability
Step 6 (if GSC available): gsc_index_coverage(siteUrl)
→ Check real indexing data
Workflow 3: Content Optimization
Use when: User wants to optimize content for a keyword.
Step 1: analyze_page(url, { includeContent: true })
→ Analyze current on-page elements
Step 2: analyze_headings(url, { targetKeyword: "keyword" })
→ Check keyword in headings
Step 3: generate_meta_suggestions(url, { targetKeyword: "keyword", secondaryKeywords: [...] })
→ Get improved meta tags
Step 4 (if API available): research_keywords(["keyword"])
→ Get search volume and related keywords
Step 5 (if API available): analyze_serp("keyword")
→ Understand what Google shows for this query
Workflow 4: Competitive Analysis
Use when: User wants to compare their site against competitors.
Step 1: analyze_page(competitorUrl) — for each competitor
→ Compare on-page elements
Step 2 (if API available): analyze_domain_authority([userDomain, ...competitorDomains])
→ Compare authority metrics
Step 3 (if API available): analyze_backlinks(competitorDomain)
→ Analyze competitor backlink profile
Step 4 (if API available): analyze_serp("target keyword")
→ See who ranks and what features they trigger
Workflow 5: Schema Implementation
Use when: User wants to add or fix structured data.
Step 1: extract_schema(url, { validateGoogle: true })
→ Check existing schema (if any)
Step 2: generate_schema({ type: "Article", data: {...} })
→ Generate correct JSON-LD
Step 3: extract_schema(url) (after implementation)
→ Validate the new schema
Tool Parameter Reference
analyze_page
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL with https:// |
| includeContent | boolean | false | Adds word count, readability analysis |
| followRedirects | boolean | true | Reports redirect chain |
| userAgent | string | "SEO-MCP-Bot/1.0" | Custom user agent |
| renderJs | boolean | false | Use puppeteer (slower but handles SPAs) |
analyze_headings
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| targetKeyword | string | optional | Checks keyword presence in headings |
analyze_images
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| checkFileSize | boolean | true | HEAD request per image (slower) |
| maxImages | number | 100 | Limit for large pages |
analyze_internal_links
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| checkBrokenLinks | boolean | false | HEAD request per link (slower) |
| maxLinks | number | 500 | Limit for link-heavy pages |
check_core_web_vitals
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| strategy | "mobile"/"desktop" | "mobile" | Always test mobile first |
| categories | string[] | ["performance","seo"] | Lighthouse categories |
research_keywords
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| keywords | string[] | required | Max 100 keywords |
| location | string | "United States" | Target location |
| language | string | "en" | Language code |
| includeRelated | boolean | true | Get related suggestions |
generate_schema
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| type | string | required | Schema.org type name |
| data | object | required | Property values |
| validate | boolean | true | Check Google requirements |
audit_security_headers
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| checkMixedContent | boolean | true | Scan for HTTP resources on HTTPS pages |
analyze_url_structure
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | URL to analyze |
validate_hreflang
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL |
| checkReturnLinks | boolean | true | Fetch targets and verify bidirectional links |
| maxReturnChecks | number | 10 | Limit return link checks (each is a fetch) |
crawl_site
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Seed URL to start crawling |
| maxPages | number | 100 | Maximum pages to crawl |
| maxDepth | number | 10 | Maximum link depth |
| concurrency | number | 5 | Parallel fetch requests |
| respectRobotsTxt | boolean | true | Obey robots.txt rules |
| includePatterns | string[] | [] | Regex — only matching URLs are crawled |
| excludePatterns | string[] | [] | Regex — matching URLs are skipped |
crawl_status
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| crawlId | string | required | Crawl ID from crawl_site |
crawl_results
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| crawlId | string | required | Crawl ID from crawl_site |
| filter | string | "summary" | "all", "issues", "duplicates", "near-duplicates", "redirects", "orphans", "pages", "summary" |
| severity | string | optional | Filter issues: "critical", "high", "medium", "low" |
| limit | number | 50 | Max items per category |
detect_orphan_pages
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| crawlId | string | required | Crawl ID from crawl_site |
| sitemapUrl | string | required | URL of the XML sitemap to cross-reference |
compare_crawls
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| crawlId1 | string | required | Older crawl ID (baseline) |
| crawlId2 | string | required | Newer crawl ID to compare against |
list_crawls
No parameters. Returns all crawl sessions (in-memory + saved to disk).
audit_accessibility
| Parameter | Type | Default | Notes |
|-----------|------|---------|-------|
| url | string | required | Full URL to audit for accessibility |
Common Mistakes
1. Not starting with analyze_page
Always start with analyze_page — it's the broadest tool and helps you decide which specific tools to use next. Don't jump straight to analyze_images or analyze_headings without context.
2. Using research tools without API keys
research_keywords, analyze_serp, analyze_backlinks, and analyze_domain_authority require DataForSEO or Moz API keys. If the user hasn't configured these, the tools will return an error with setup instructions.
How to check: Try the tool — if it fails with an API key error, inform the user and suggest alternatives (manual research, free tools like Google Keyword Planner).
3. Forgetting to specify strategy for Core Web Vitals
check_core_web_vitals defaults to mobile. Always run mobile first (Google uses mobile-first indexing), then optionally run desktop for comparison.
4. Not using targetKeyword with analyze_headings
The keyword check is optional but very useful. Always ask the user for their target keyword before running heading analysis.
5. Using renderJs unnecessarily
renderJs: true requires puppeteer and is much slower. Only use it for single-page applications (React, Vue, Angular) where content is rendered client-side. For most sites, the default cheerio parsing is sufficient and faster.
API Key Configuration
Always available (no keys needed)
All 11 analysis tools, 2 performance tools, 3 generation tools, 6 crawler tools, 1 documentation tool = 23 tools
Optional: PageSpeed API key
Increases rate limits from 25 to 400 requests per 100 seconds.
Set: PAGESPEED_API_KEY in environment.
Optional: DataForSEO
Enables keyword research, SERP analysis, backlink analysis, domain authority.
Set: DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD in environment.
Optional: Moz
Alternative for backlinks and domain authority.
Set: MOZ_ACCESS_ID and MOZ_SECRET_KEY in environment.
Optional: Google Search Console
Enables GSC performance, index coverage, and sitemap tools.
Set: GSC_CLIENT_ID, GSC_CLIENT_SECRET, GSC_REFRESH_TOKEN in environment.
Related Skills
- seo-on-page-optimization — what on-page elements to check
- seo-technical-audit — technical audit methodology
- seo-content-strategy — keyword research interpretation
- seo-schema-structured-data — schema generation details
- seo-off-page-backlinks — backlink analysis interpretation
- seo-local-seo — local SEO optimization
See ANALYSIS_GUIDE.md for detailed analysis tool usage. See PERFORMANCE_GUIDE.md for performance tool details. See GENERATION_GUIDE.md for generation tool details. See AUDIT_WORKFLOW_GUIDE.md for complete audit workflow.
Scan to join WeChat group