SEO & Content Marketing Skills Suite
Skill by ara.so — Marketing Skills collection.
This skill provides 10 specialized SEO and content marketing commands and 5 multi-step workflows adapted from shanraisshan/claude-code-best-practice. It delivers keyword research, content audits, SERP analysis, technical SEO diagnostics, and content strategy automation with structured output and progress tracking.
What This Project Does
- Keyword Research: Deep clustering, opportunity scoring, SERP intent mapping
- Content Audits: Quality scoring, duplication detection, cannibalization reports
- Technical SEO: Crawl budget, Core Web Vitals, schema markup, indexability
- Competitor Analysis: Backlink gaps, topic gaps, featured snippet opportunities
- Content Strategy: AI-generated briefs, editorial calendars, refresh workflows
- Automation: Multi-step workflows orchestrating end-to-end SEO processes
All commands use consistent structured output with progress panels, findings tables, action checklists, and summary cards.
Installation
Clone the Skill
# Install to Claude Code skills directory
mkdir -p ~/.claude/skills
cp -r . ~/.claude/skills/seo-content-marketing-skill-suite/
# Or install from GitHub
git clone https://github.com/MagicStarfishBoost/r15-shanraisshan-claude-code-best-practice-seo.git \
~/.claude/skills/seo-content-marketing-skill-suite/
Register in Claude Code
In a Claude Code session:
/read ~/.claude/skills/seo-content-marketing-skill-suite/SKILL.md
Or add to your Claude Code config:
{
"skills": [
"~/.claude/skills/seo-content-marketing-skill-suite"
]
}
Core Commands
1. Keyword Research
Command: /keyword-research
Deep keyword clustering with opportunity scoring and SERP intent mapping.
# Basic usage
/keyword-research "saas analytics tools"
# Advanced options
/keyword-research "email marketing" --cluster-by intent --min-volume 1000 --output json
# With geographic targeting
/keyword-research "lawyer near me" --country US --language en --location "New York"
Output Structure:
╔══════════════════════════════════════════════════╗
║ Keyword Research — saas analytics tools ║
╠══════════════════════════════════════════════════╣
║ Fetching keywords … [██████████] 100% ✓ ║
║ Clustering … [██████████] 100% ✓ ║
║ Scoring intent … [██████████] 100% ✓ ║
╚══════════════════════════════════════════════════╝
┌────────────────────────┬────────┬──────┬──────────┬──────────┐
│ Keyword │ Volume │ KD │ Intent │ Score │
├────────────────────────┼────────┼──────┼──────────┼──────────┤
│ saas analytics tools │ 12 100 │ 45 │ Commercial │ 🟢 92 │
│ best saas analytics │ 8 300 │ 38 │ Commercial │ 🟢 88 │
│ saas metrics dashboard │ 4 500 │ 32 │ Informational │ 🟡 76 │
│ free analytics tools │ 22 400 │ 67 │ Commercial │ 🟠 54 │
└────────────────────────┴────────┴──────┴──────────┴──────────┘
2. Content Audit
Command: /content-audit
Full-site content quality scoring, duplication check, and cannibalization report.
# Full site audit
/content-audit --scope full --output md
# Specific section
/content-audit --scope /blog/ --check-duplicates --check-cannibalization
# With custom thresholds
/content-audit --min-words 500 --max-duplicate-percent 15
Example Implementation:
// Simulated content audit logic
async function auditContent(scope, options = {}) {
const pages = await crawlPages(scope);
const results = {
total: pages.length,
issues: [],
scores: {}
};
for (const page of pages) {
const score = {
url: page.url,
wordCount: page.content.split(/\s+/).length,
hasTitle: !!page.title && page.title.length > 0,
hasMetaDesc: !!page.metaDescription,
hasH1: !!page.h1,
readability: calculateReadability(page.content),
duplicatePercent: await checkDuplicateContent(page.content)
};
// Quality scoring
let quality = 100;
if (!score.hasTitle) quality -= 20;
if (!score.hasMetaDesc) quality -= 15;
if (!score.hasH1) quality -= 10;
if (score.wordCount < 300) quality -= 25;
if (score.readability < 60) quality -= 10;
if (score.duplicatePercent > 20) quality -= 30;
score.quality = Math.max(0, quality);
results.scores[page.url] = score;
if (quality < 70) {
results.issues.push({
severity: quality < 40 ? '🔴' : quality < 60 ? '🟠' : '🟡',
url: page.url,
issue: generateIssueDescription(score)
});
}
}
return results;
}
3. Technical SEO Audit
Command: /technical-seo
Crawl budget, Core Web Vitals, schema markup, and indexability diagnostics.
# Full technical audit
/technical-seo example.com
# Specific checks
/technical-seo example.com --checks vitals,schema,robots
# With depth limit
/technical-seo example.com --max-depth 3 --follow-external false
Check Categories:
- Crawlability: robots.txt, XML sitemaps, internal linking
- Indexability: canonical tags, noindex directives, pagination
- Performance: Core Web Vitals (LCP, FID, CLS), render-blocking resources
- Schema: Structured data validation, rich snippet eligibility
- Mobile: Mobile-friendliness, responsive design, tap targets
- Security: HTTPS, mixed content, security headers
4. Content Brief Generation
Command: /content-brief
AI-generated SEO content brief with outline, NLP terms, and word count targets.
# Generate brief
/content-brief "how to reduce customer churn" --format markdown
# With custom parameters
/content-brief "saas pricing strategies" \
--target-words 2500 \
--competitors 5 \
--include-outline \
--include-questions
Brief Structure:
# Content Brief: How to Reduce Customer Churn
## Target Keyword
Primary: `reduce customer churn`
Secondary: `customer retention strategies`, `churn rate reduction`
## Search Intent
Informational → Commercial (conversion-focused)
## Target Word Count
2,200-2,500 words
## Content Outline
1. What is Customer Churn? (H2)
- Definition and calculation (H3)
- Industry benchmarks (H3)
2. Root Causes of Churn (H2)
- Poor onboarding experience (H3)
- Lack of product value realization (H3)
- Customer service issues (H3)
3. Proven Strategies to Reduce Churn (H2)
- Improve customer onboarding (H3)
- Implement proactive support (H3)
- Build customer success programs (H3)
## NLP Terms to Include
- customer lifetime value
- retention rate
- proactive outreach
- customer feedback loop
- usage analytics
- at-risk customers
## Competitor Analysis
Top 5 ranking pages: 1,800-3,200 words, average 2,400
Common elements: case studies, statistics, actionable frameworks
## Recommended Media
- Infographic: churn calculation formula
- Chart: churn rate benchmarks by industry
- Checklist: 10-point churn prevention audit
5. SERP Monitoring
Command: /serp-monitor
Daily rank tracking with volatility alerts and CTR optimization tips.
# Monitor keywords
/serp-monitor --keywords "keyword-list.txt" --output dashboard
# With alerts
/serp-monitor --keywords "brand terms" --alert-threshold 3 --notify-email "$NOTIFY_EMAIL"
# Historical comparison
/serp-monitor --compare-date 2026-04-01 --show-volatility
6. Competitor Gap Analysis
Command: /competitor-gap
Backlink gap, topic gap, and featured snippet opportunities.
# Full competitor analysis
/competitor-gap example.com --competitors competitor1.com,competitor2.com
# Specific gap types
/competitor-gap example.com --gap-type backlinks --min-dr 40
# Featured snippet opportunities
/competitor-gap example.com --gap-type snippets --serp-features all
7. Link Prospecting
Command: /link-prospecting
Quality backlink prospect lists with DA/DR filters and outreach templates.
# Find prospects
/link-prospecting "digital marketing" --min-da 30 --max-results 100
# With filtering
/link-prospecting "tech blogs" \
--country US \
--language en \
--exclude-domains "spam-site.com" \
--require-contact-email
# Generate outreach
/link-prospecting "saas reviews" --generate-outreach --template guest-post
8. Page Speed SEO
Command: /page-speed-seo
Render-blocking, LCP, CLS, FID diagnosis mapped to ranking impact.
# Audit page speed
/page-speed-seo https://example.com/page
# Batch audit
/page-speed-seo --urls urls.txt --device mobile
# With recommendations
/page-speed-seo https://example.com --prioritize-fixes --show-code-examples
Example Diagnostic:
# Simulated page speed diagnostic
def diagnose_page_speed(url, device='desktop'):
metrics = {
'lcp': measure_lcp(url, device), # Largest Contentful Paint
'fid': measure_fid(url, device), # First Input Delay
'cls': measure_cls(url, device), # Cumulative Layout Shift
'ttfb': measure_ttfb(url), # Time to First Byte
'fcp': measure_fcp(url, device) # First Contentful Paint
}
issues = []
if metrics['lcp'] > 2500:
issues.append({
'severity': '🔴' if metrics['lcp'] > 4000 else '🟠',
'metric': 'LCP',
'value': f"{metrics['lcp']}ms",
'fix': 'Optimize largest image, use CDN, enable lazy loading'
})
if metrics['cls'] > 0.1:
issues.append({
'severity': '🔴' if metrics['cls'] > 0.25 else '🟠',
'metric': 'CLS',
'value': f"{metrics['cls']:.3f}",
'fix': 'Add explicit dimensions to images/embeds, avoid layout shifts'
})
if metrics['fid'] > 100:
issues.append({
'severity': '🟠',
'metric': 'FID',
'value': f"{metrics['fid']}ms",
'fix': 'Reduce JavaScript execution time, split code bundles'
})
return {
'metrics': metrics,
'issues': issues,
'score': calculate_performance_score(metrics)
}
9. Local SEO
Command: /local-seo
NAP consistency, Google Business Profile optimization, local citation audit.
# Local SEO audit
/local-seo "Business Name" --location "New York, NY"
# NAP consistency check
/local-seo "Business Name" --check-nap --sources 50
# Citation opportunities
/local-seo "Law Firm" --find-citations --country US --category legal
10. Content Calendar
Command: /content-calendar
Data-driven editorial calendar from search demand and seasonality.
# Generate calendar
/content-calendar --topics topics.txt --months 6 --output google-sheets
# With seasonality
/content-calendar --seed-keyword "fitness" --include-seasonal --country US
# Export formats
/content-calendar --topics topics.txt --format csv --include-briefs
Multi-Step Workflows
Full SEO Sprint
Workflow: full-seo-sprint
12-step SEO sprint: audit → keyword map → content plan → technical fixes.
# Run full sprint
/workflows:full-seo-sprint example.com --scope full --duration 2-weeks
# Custom sprint
/workflows:full-seo-sprint example.com \
--focus technical,content \
--skip-backlinks \
--output project-board
Sprint Steps:
- ✓ Technical audit (crawlability, indexability, performance)
- ✓ Content audit (quality, duplication, gaps)
- ✓ Keyword research (clustering, intent, opportunities)
- ✓ Competitor analysis (gaps, backlinks, topics)
- → Keyword mapping (assign keywords to pages)
- → Content plan (briefs for new/updated content)
- → Technical fixes (prioritized action list)
- → Schema implementation (structured data markup)
- → Internal linking optimization
- → Page speed optimization
- → Content production (if --include-content)
- → Monitoring setup (rank tracking, alerts)
Launch SEO
Workflow: launch-seo
Pre-launch SEO checklist with canonical, hreflang, sitemap validation.
# Pre-launch audit
/workflows:launch-seo staging.example.com --production example.com
# With migration
/workflows:launch-seo new-site.com \
--migrating-from old-site.com \
--check-redirects \
--preserve-equity
Content Refresh
Workflow: content-refresh
Identify and refresh underperforming pages to recover lost rankings.
# Find refresh opportunities
/workflows:content-refresh example.com --min-drop 5-positions --timeframe 90-days
# With automated updates
/workflows:content-refresh example.com \
--auto-update \
--update-stats \
--add-sections \
--improve-readability
Authority Building
Workflow: authority-building
End-to-end digital PR and link-building campaign.
# Start campaign
/workflows:authority-building example.com \
--strategy guest-posts,digital-pr,broken-link \
--target-links 50 \
--timeframe 3-months
AI Content Pipeline
Workflow: ai-content-pipeline
Keyword → brief → draft → optimize → publish automation.
# Full pipeline
/workflows:ai-content-pipeline \
--keywords keywords.txt \
--auto-brief \
--auto-draft \
--review-step \
--publish-to wordpress
# With API integration
/workflows:ai-content-pipeline \
--source ahrefs \
--cms-api "$CMS_API_KEY" \
--ai-model gpt-4 \
--openai-key "$OPENAI_API_KEY"
Configuration
Environment Variables
# API credentials (store in .env)
export AHREFS_API_KEY="your-ahrefs-key"
export SEMRUSH_API_KEY="your-semrush-key"
export GOOGLE_API_KEY="your-google-api-key"
export OPENAI_API_KEY="your-openai-key"
# Notification settings
export NOTIFY_EMAIL="team@example.com"
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
# Default settings
export SEO_DEFAULT_COUNTRY="US"
export SEO_DEFAULT_LANGUAGE="en"
export SEO_OUTPUT_FORMAT="markdown"
Config File
Create ~/.seo-skills/config.yml:
defaults:
country: US
language: en
output_format: markdown
api_keys:
ahrefs: ${AHREFS_API_KEY}
semrush: ${SEMRUSH_API_KEY}
google: ${GOOGLE_API_KEY}
openai: ${OPENAI_API_KEY}
thresholds:
keyword_difficulty_max: 50
min_search_volume: 100
content_quality_min: 70
page_speed_lcp_max: 2500
core_web_vitals_fid_max: 100
notifications:
email: ${NOTIFY_EMAIL}
slack_webhook: ${SLACK_WEBHOOK_URL}
alert_on_rank_drop: 3
alert_on_crawl_errors: true
Common Patterns
Pattern 1: Audit → Prioritize → Fix
# Step 1: Run comprehensive audit
/technical-seo example.com --scope full > technical-audit.md
/content-audit --scope full > content-audit.md
# Step 2: Prioritize issues (automatic in command output)
# Review 🔴 critical issues first, then 🟠 high-priority, then 🟡 medium
# Step 3: Execute fixes
# Follow action checklists in each audit report
Pattern 2: Keyword Research → Content Strategy
# Step 1: Keyword discovery
/keyword-research "main topic" --cluster-by intent --min-volume 500
# Step 2: Generate briefs for top opportunities
/content-brief "keyword 1" --format markdown > briefs/keyword-1.md
/content-brief "keyword 2" --format markdown > briefs/keyword-2.md
# Step 3: Build editorial calendar
/content-calendar --topics briefs/ --months 6 --include-briefs
Pattern 3: Competitor Intelligence → Gap Closure
# Step 1: Identify gaps
/competitor-gap example.com --competitors competitor1.com,competitor2.com
# Step 2: Backlink prospecting for missed opportunities
/link-prospecting --from-gap-analysis --min-da 30
# Step 3: Content gap filling
# Use output from competitor-gap to create content briefs
/content-brief "gap topic" --competitors competitor1.com --match-depth
Pattern 4: Monitoring → Alert → Response
# Step 1: Set up monitoring
/serp-monitor --keywords critical-keywords.txt --alert-threshold 3
# Step 2: Receive alerts (automatic via email/Slack)
# Step 3: Diagnose drop
/content-audit --scope /affected-page/ --check-cannibalization
/technical-seo example.com/affected-page --checks all
# Step 4: Execute refresh workflow
/workflows:content-refresh example.com/affected-page --auto-update
Troubleshooting
Issue: API Rate Limits
# Symptom: "Rate limit exceeded" errors
# Solution: Add delays between requests
# Use --rate-limit flag
/keyword-research "topic" --rate-limit 5 # 5 requests per second max
# Or configure in config.yml
rate_limits:
ahrefs: 5
semrush: 10
google: 100
Issue: Incomplete Crawls
# Symptom: Technical audit missing pages
# Solution: Check robots.txt and crawl depth
# Increase depth
/technical-seo example.com --max-depth 5
# Ignore robots.txt (testing only)
/technical-seo example.com --ignore-robots
# Check crawl log
/technical-seo example.com --verbose --log crawl.log
Issue: Inaccurate Keyword Data
# Symptom: Missing or inconsistent search volume
# Solution: Use multiple data sources
# Aggregate from multiple APIs
/keyword-research "topic" --sources ahrefs,semrush,google --aggregate mean
# Specify geographic precision
/keyword-research "topic" --country US --location "New York, NY" --radius 25mi
Issue: Content Brief Too Generic
# Symptom: Generated briefs lack specificity
# Solution: Provide more context and competitor analysis
# Enhanced brief generation
/content-brief "topic" \
--competitors 10 \
--analyze-top-10 \
--include-questions \
--include-nlp-terms \
--target-words 2500 \
--context "B2B SaaS audience, technical depth required"
Issue: Slow Performance
# Symptom: Commands taking too long
# Solution: Optimize scope and use caching
# Limit scope
/content-audit --scope /blog/ --max-pages 500
# Enable caching
/technical-seo example.com --cache --cache-ttl 3600 # 1 hour
# Parallel processing
/content-audit --parallel 10 # 10 concurrent workers
Integration Examples
WordPress Integration
<?php
// wp-content/plugins/seo-skills-integration/seo-skills.php
// Trigger content audit via WP-CLI
add_action('seo_skills_daily_audit', function() {
$output = shell_exec('cd ~/.claude/skills/seo-content-marketing-skill-suite && /content-audit --scope full --output json');
$results = json_decode($output, true);
// Store results
update_option('seo_audit_results', $results);
// Send alerts for critical issues
$critical = array_filter($results['issues'], fn($i) => $i['severity'] === '🔴');
if (!empty($critical)) {
wp_mail(
get_option('admin_email'),
'Critical SEO Issues Detected',
'Found ' . count($critical) . ' critical SEO issues. Check dashboard.'
);
}
});
// Schedule daily
if (!wp_next_scheduled('seo_skills_daily_audit')) {
wp_schedule_event(time(), 'daily', 'seo_skills_daily_audit');
}
Google Sheets Export
// export-to-sheets.js
const { google } = require('googleapis');
const { execSync } = require('child_process');
async function exportKeywordResearch(topic) {
// Run keyword research
const output = execSync(
`/keyword-research "${topic}" --output json`,
{ cwd: '~/.claude/skills/seo-content-marketing-skill-suite' }
);
const data = JSON.parse(output);
// Authenticate with Google Sheets
const auth = new google.auth.GoogleAuth({
keyFile: process.env.GOOGLE_CREDENTIALS_PATH,
scopes: ['https://www.googleapis.com/auth/spreadsheets']
});
const sheets = google.sheets({ version: 'v4', auth });
// Format data
const rows = [
['Keyword', 'Volume', 'Difficulty', 'Intent', 'Score'],
...data.keywords.map(k => [
k.keyword,
k.volume,
k.difficulty,
k.intent,
k.score
])
];
// Write to sheet
await sheets.spreadsheets.values.update({
spreadsheetId: process.env.SHEET_ID,
range: 'Keywords!A1',
valueInputOption: 'RAW',
resource: { values: rows }
});
}
exportKeywordResearch(process.argv[2]);
Slack Notifications
# slack-notifier.py
import os
import json
import subprocess
import requests
def send_slack_alert(title, issues):
webhook_url = os.environ['SLACK_WEBHOOK_URL']
blocks = [
{
"type": "header",
"text": {"type": "plain_text", "text": title}
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": f"*Critical:* {len([i for i in issues if i['severity'] == '🔴'])}"},
{"type": "mrkdwn", "text": f"*High:* {len([i for i in issues if i['severity'] == '🟠'])}"}
]
}
]
for issue in issues[:5]: # Top 5 issues
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"{issue['severity']} *{issue['url']}*\n{issue['issue']}"
}
})
requests.post(webhook_url, json={"blocks": blocks})
# Run audit and send results
result = subprocess.run(
['/technical-seo', 'example.com', '--output', 'json'],
cwd=os.path.expanduser('~/.claude/skills/seo-content-marketing-skill-suite'),
capture_output=True,
text=True
)
data = json.loads(result.stdout)
if data['issues']:
send_slack_alert('🔍 Technical SEO Issues Detected', data['issues'])
Advanced Usage
Custom Scoring Models
# custom-scoring.py
# Override default quality scoring with custom model
def custom_content_score(page):
"""Custom scoring emphasizing user engagement signals"""
score = 100
# Core SEO (40%)
if not page.get('title'): score -= 10
if not page.get('meta_description'): score -= 8
if not page.get('h1'): score -= 7
if page.get('word_count', 0) < 500: score -= 15
# User engagement (30%)
if page.get('avg_time_on_page', 0) < 60: score -= 15
if page.get('bounce_rate', 100) > 70: score -= 10
if page.get('pages_per_session', 0) < 1.5: score -= 5
# Technical (30%)
if page.get('load_time', 10) > 3: score -= 10
if not page.get('mobile_friendly'): score -= 10
if page.get('cls', 1) > 0.1: score -= 5
if page.get('lcp', 10000) > 2500: score -= 5
return max(0, score)
# Use in audit
/content-audit --scoring-function custom_content_score --config custom-scoring.py
Automated Reporting
#!/bin/bash
# weekly-seo-report.sh
DOMAIN="example.com"
REPORT_DIR="./reports/$(date +%Y-%m-%d)"
mkdir -p "$REPORT_DIR"
# Run all audits
/technical-seo "$DOMAIN" --output markdown > "$REPORT_DIR/technical.md"
/content-audit --scope full --output markdown > "$REPORT_DIR/content.md"
/serp-monitor --compare-date "$(date -d '7 days ago' +%Y-%m-%d)" > "$REPORT_DIR/rankings.md"
/competitor-gap "$DOMAIN" --output markdown > "$REPORT_DIR/competitors.md"
# Compile report
cat "$REPORT_DIR"/*.md > "$REPORT_DIR/weekly-report.md"
# Send via email
mail -s "Weekly SEO Report - $DOMAIN" \
-a "$REPORT_DIR/weekly-report.md" \
"$NOTIFY_EMAIL" < /dev/null
# Upload to cloud storage
aws s3 cp "$REPORT_DIR/weekly-report.md" \
"s3://seo-reports/$DOMAIN/$(date +%Y-%m-%d).md"
---
Source Attribution
Adapted from shanraisshan/claude-code-best-practice — best practices for AI agent teams, development workflows, and structured command patterns.
Enhancements in this adaptation:
- Domain-specific SEO & content marketing vocabulary
- Visual progress tracking and structured output
- Prioritized action plans with time estimates
- Multi-step workflow orchestration
- Consistent UI conventions across all commands
---
License: MIT

