SEO Automation
par Claude Code
De la détection d’opportunité à la publication industrielle. MCPs, n8n, Claude API — l’architecture complète pour passer de 10 à 200 articles/mois sans sacrifier la qualité.
Architecture système globale
6 couches découplées, testables et remplaçables indépendamment. Le principe fondamental : ne jamais coupler directement la sortie LLM au CMS.
Stack technologique recommandé
| Couche | Recommandation | Alternative | Priorité |
|---|---|---|---|
| Orchestration | Temporal.io | Airflow / n8n / Prefect | Critique |
| Détection SEO | Google Search Console API | Ahrefs API / SEMrush | Critique |
| LLM | Claude Sonnet (volume) | Claude Opus (premium) | Critique |
| Vector Store | Qdrant | Pinecone / Weaviate | Recommandé |
| CMS | WordPress REST API | Strapi / Ghost / Headless | Flexible |
| Storage | PostgreSQL + Redis + S3 | Supabase | Recommandé |
MCPs essentiels pour l’automation SEO
Les Model Context Protocols permettent à Claude d’orchestrer directement votre pipeline : appels SEO, scraping, écriture de fichiers, déploiement CMS — en une seule session.
claude_desktop_config.json et ajoutez chaque MCP dans la section mcpServers.Outils SEO recommandés
| Outil | Usage principal | Prix indicatif | Où trouver |
|---|---|---|---|
| n8n | Orchestration workflows — self-hosted ou cloud | Gratuit (self-hosted) | n8n.io |
| Claude API | LLM principal — Sonnet pour volume, Opus premium | ~0,15-0,40€/article | console.anthropic.com |
| Ahrefs | Content gap, KD, volume, analyse concurrents | ~99€/mois | ahrefs.com |
| Qdrant | Vector store — RAG et anti-cannibalisation | Gratuit (open source) | qdrant.tech |
| Temporal.io | Orchestration avancée — équipes > 5 devs | Open source | temporal.io |
| Playwright | Scraping SERP, extraction contenu concurrent | Gratuit | playwright.dev |
6 workflows prêts à construire
n8n est l’orchestrateur idéal pour les équipes < 5 devs. Voici les 6 workflows à construire — avec la logique complète pour les reproduire.
Les 7 étapes séquentielles
Chaque étape produit un artefact intermédiaire versionné. Le pipeline tourne en 3 à 8 minutes par article selon la complexité. Cliquez sur chaque étape pour voir le détail.
{
"keyword_principal": "assurance habitation comparatif",
"search_intent": "commercial_investigation",
"longueur_cible": 2200,
"serp_analysis": {
"top_10_avg_word_count": 2450,
"featured_snippet_type": "table",
"paa_questions": ["Quelle est la meilleure assurance ?"]
},
"contraintes": {
"ton": "expert_accessible",
"mentions_obligatoires": ["loi Hamon"]
}
}
async def collect_research(brief): tasks = [ scrape_serp_top10(brief.keyword), fetch_paa_questions(brief.keyword), search_vector_store(brief.keyword), # RAG interne fetch_official_sources(brief.keywords) ] results = await asyncio.gather(*tasks) # Déduplique, structure les faits vérifiés return ResearchData( facts=extract_key_facts(results), stats=extract_verifiable_stats(results), serp_structure=results[0].h2_patterns )
def validate_outline(outline, brief): assert 4 <= outline.h2_count <= 10 assert outline.contains_keyword_in_h2(brief.keyword) assert outline.has_faq_section() assert outline.estimated_words >= brief.longueur * 0.9 if not all_assertions: raise OutlineError("Rejeté — re-génération")
sections = [] previous_summaries = [] for h2 in outline.sections: prompt = build_section_prompt( h2=h2, research=research, # Contexte des 2 sections précédentes previous=previous_summaries[-2:] ) section = await claude.complete(prompt) sections.append(section) previous_summaries.append(summarize(section)) article = assemble_article(sections)
{
"html_body": "<article>...</article>",
"meta": { "title": "...", "description": "...", "slug": "..." },
"schema_json_ld": { "@type": "Article" },
"internal_links": [{ "anchor": "...", "url": "..." }],
"social": { "og_title": "...", "twitter_text": "..." },
"quality_scores": { "composite": 8.4, "decision": "PUBLIER" }
}
Architecture de prompt multi-couches
5 couches empilées dans l’ordre : Rôle → Style → Données → Contraintes SEO → Format. L’ordre compte — les contraintes en dernier sont mieux respectées par le modèle.
// COUCHE 1 : Rôle Tu es un rédacteur expert en {domaine} avec 10 ans d'expérience. Tu rédiges pour un public {persona_cible}. // COUCHE 2 : Style éditorial Ton : {brand_voice_excerpt} - Phrases de 15-25 mots maximum - Paragraphes de 3-4 phrases maximum - Voix active obligatoire - Aucun jargon non défini // COUCHE 3 : Données (injecter les faits — jamais halluciner) Faits vérifiés à utiliser : {research_data_structured} Sections précédentes (contexte) : {previous_sections_summary} // COUCHE 4 : Contraintes SEO Keyword principal : "{kw_principal}" (1-2 occurrences naturelles) Lien interne vers : {internal_link_target} // COUCHE 5 : Format de sortie — TOUJOURS EN DERNIER Rédige la section "{h2_title}". Longueur : {target_word_count} mots (± 10%). Format : Markdown avec H3 si nécessaire. NE PAS inclure le H2 lui-même. NE PAS conclure — l'article continue.
Tu es architecte éditorial SEO. Construis le plan d'un article
qui doit surclasser la page 1 Google pour : "{keyword_principal}"
Données SERP actuelles :
- H2 communs dans le top 10 : {common_h2_patterns}
- Featured snippet type : {featured_snippet_type}
- PAA questions : {paa_questions}
- Word count moyen top 10 : {avg_word_count}
Gaps vs concurrents : {gap_topics}
Contraintes OBLIGATOIRES :
- Entre 5 et 8 sections H2 (ni plus, ni moins)
- Le keyword principal dans au moins 1 H2
- 1 section FAQ en fin (3-5 questions PAA)
- Longueur estimée : {target_words} mots
Output JSON strict :
{
"h1": "...",
"sections": [{"h2": "...", "h3s": ["..."], "target_words": 300}],
"faq": [{"q": "...", "a_hint": "..."}],
"estimated_total": 2200
}
Génère le title et la meta description pour cet article.
Keyword : {keyword}
Exemples de BONS titles (few-shot) :
✓ "Assurance Habitation 2025 : Comparatif des 12 Meilleures Offres"
✓ "Comment Choisir son Assurance Maison : Guide Expert + Simulateur"
Exemples MAUVAIS :
✗ "Assurance habitation" (trop court)
✗ "Guide complet sur les assurances" (vague)
Contraintes STRICTES :
- Title : entre 50 et 60 caractères EXACTEMENT
- Description : entre 150 et 160 caractères EXACTEMENT
- Keyword dans les 30 premiers caractères du title
- Description : bénéfice concret + call-to-action implicite
Output : {"title": "...", "description": "...", "chars_title": N, "chars_desc": N}
// Utiliser Claude Opus pour évaluer du contenu généré par Sonnet // Évite le biais d'auto-complaisance. Calibrer seuils +15-20%. Tu es un éditeur senior exigeant. Évalue l'article suivant. Score de 1 à 10 par critère + justification 1 phrase. CALIBRAGE : - 9-10 : Meilleur article du top 10 SERP - 7-8 : Publiable, compétitif - 5-6 : Réécriture partielle - <5 : Rejet complet CRITÈRES : 1. LISIBILITÉ — Fluide, clair, sans jargon non défini ? 2. COHÉRENCE — Sections enchaînées logiquement ? 3. FACTUALITÉ — Affirmations sourcées ou vérifiables ? 4. ORIGINALITÉ — Perspective unique vs top 10 ? 5. ENGAGEMENT — Le lecteur continue sa lecture ? Output JSON strict : { "lisibilite": {"score": N, "justification": "..."}, "coherence": {"score": N, "justification": "..."}, "factualite": {"score": N, "justification": "..."}, "originalite": {"score": N, "justification": "..."}, "engagement": {"score": N, "justification": "..."}, "score_global": N, "sections_faibles": ["H2 title 1"], "recommandation": "PUBLIER | RÉÉCRIRE | REJETER" } ARTICLE : {article_content}
Réécris UNIQUEMENT la section "{section_title}".
Critique reçue : "{critique_specifique}"
Score actuel : {score}/10 → Objectif : ≥ 8/10
Section originale :
---
{section_originale}
---
Contexte (NE PAS modifier) :
- Keyword : {keyword}
- Style global : {style_summary}
Consignes :
1. Remplacer les affirmations vagues par des données concrètes
2. Améliorer les transitions entre paragraphes
3. Maintenir la cohérence de ton avec le reste de l'article
Output : section réécrite uniquement, sans commentaire.
La gate critique avant publication
4 dimensions, 1 score composite. Score ≥ 7/10 = publication automatique. En dessous, le pipeline réécrit ou rejette.
≥ 8,5 → Publication directe automatique
7,0 – 8,4 → Réécriture sections faibles + re-check
5,0 – 6,9 → Review humain obligatoire
< 5,0 → Rejet + re-brief
Les 10 erreurs observées en production
Ces erreurs ne sont pas théoriques — elles coûtent des mois à corriger une fois en production. À lire avant de commencer.
5 niveaux — où en êtes-vous ?
Ne jamais sauter un niveau. Chaque palier construit les fondations du suivant. Identifier son niveau actuel est la première étape.
10-20%
40-50%
70-80%
85-90%
95%+
Roadmap 12 semaines (niveau 1 → 3)
| Semaines | Phase | Livrables |
|---|---|---|
| S1–S2 | Fondations | Audit corpus, mapping keywords, setup API Claude + GSC, premiers prompts testés |
| S3–S4 | Pipeline v1 | Brief → outline → draft fonctionnel, templates prompts, scoring structurel |
| S5–S6 | Qualité | Grille scoring 4 dimensions, LLM-as-judge, quality gates, process review humain |
| S7–S8 | Publication | Intégration CMS auto, meta + schema, scheduling, index ping. Premier batch 20 articles. |
| S9–S10 | Distribution | Pipeline multicanal, newsletter auto, syndication avec canonicals |
| S11–S12 | Monitoring | Dashboard performance, feedback loop, première boucle auto-optimisation |
Où aller pour aller plus loin
Pas de liens cassés — juste les adresses exactes où trouver chaque ressource. À bookmarker.
- Créer un compte sur console.anthropic.com
- Documentation sur docs.anthropic.com
- Modèles : Haiku (meta), Sonnet (volume), Opus (premium/judge)
- Catalogue officiel : modelcontextprotocol.io
- GitHub repo : github.com/modelcontextprotocol/servers
- Config Claude Desktop : fichier claude_desktop_config.json
- Documentation : docs.n8n.io
- Templates : n8n.io/templates — chercher « Claude » ou « SEO »
- Self-hosted : Docker — hub.docker.com/r/n8nio/n8n
- Activer l’API : console.cloud.google.com → APIs → Search Console
- Doc de référence : developers.google.com/webmaster-tools
- Authentification OAuth2 recommandée pour les appels automatisés
- Site officiel : qdrant.tech
- Docs : qdrant.tech/documentation
- Cloud managed : cloud.qdrant.io (free tier disponible)
- Ahrefs API : docs.ahrefs.com/api
- SEMrush API : developer.semrush.com
- Alternative gratuite : Google Trends API (tendances émergentes)