SEO Workflow Automation

SEO Automation Framework — Apollo Lab
Apollo Lab · Framework v2.0

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é.

×5
Volume de production
−60%
Coût par article
< 4h
Time to publish
95%
Automation max (niveau 5)

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.

🎯
Détection
01
📦
Collection
02
⚙️
Génération
03
🔬
Qualité
04
🚀
Publication
05
📊
Monitoring
06
⚠️
Warning architecturalNe jamais coupler directement la sortie LLM au CMS. Toujours interposer une couche de validation + transformation. Les LLM produisent du HTML imprédictible. Le buffer de normalisation est non-négociable.

Stack technologique recommandé

CoucheRecommandationAlternativePriorité
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.

🔍
Brave Search MCP
Recherche web en temps réel dans Claude. Vérification factuelle, analyse SERP live, collecte concurrentielle sans infrastructure séparée.
npx @modelcontextprotocol/server-brave-search
SERP live Fact-checking Concurrents
📍 Trouver sur : modelcontextprotocol.io → Servers → brave-search
📁
Filesystem MCP
Lecture et écriture de fichiers locaux. Claude lit vos briefs JSON, templates markdown, style guides — et écrit les articles HTML directement.
npx @modelcontextprotocol/server-filesystem /chemin
Briefs JSON Templates Output HTML
📍 Trouver sur : modelcontextprotocol.io → Servers → filesystem
🐘
PostgreSQL MCP
Accès direct à votre base de données. Claude interroge le tracking d’articles, scores qualité, métriques — et alimente le feedback loop automatiquement.
npx @modelcontextprotocol/server-postgres postgresql://…
Tracking Analytics Feedback loop
📍 Trouver sur : modelcontextprotocol.io → Servers → postgres
🌐
Playwright MCP
Scraping avancé et automatisation navigateur. Claude scrape les top 10 SERP, extrait les H2/H3 concurrents, analyse les PAA — sans infra séparée.
npx @executeautomation/playwright-mcp-server
Scraping SERP analysis Extraction
📍 Trouver sur : npmjs.com → @executeautomation/playwright-mcp-server
💾
Memory MCP
Mémoire persistante entre sessions. Claude se souvient du brand voice, des décisions éditoriales, des articles déjà couverts. Essentiel pour l’anti-cannibalisation.
npx @modelcontextprotocol/server-memory
Brand voice Historique Anti-cannib.
📍 Trouver sur : modelcontextprotocol.io → Servers → memory
🔗
WordPress MCP
Publication directe sur WordPress depuis Claude. Créer des posts, uploader des médias, configurer les meta SEO, scheduler — sans passer par l’interface.
Configurer via WP REST API + Basic Auth
Publication Scheduling SEO meta
📍 Documentation : developer.wordpress.org/rest-api
💡
Installation des MCPsTous les MCPs officiels sont répertoriés sur modelcontextprotocol.io. Pour les configurer dans Claude Desktop, ouvrez le fichier claude_desktop_config.json et ajoutez chaque MCP dans la section mcpServers.

Outils SEO recommandés

OutilUsage principalPrix indicatifOù 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.

🔎 GSC → Brief automatisé
Récupère les opportunités depuis Google Search Console, filtre (impressions > 100, position > 10, CTR < 2%), score et génère les briefs JSON.
GSC API Claude API
📍 Nodes : Schedule Trigger → HTTP (GSC) → Code (filtrage) → HTTP (Claude) → PostgreSQL
✍️ Brief → Article complet
Lit le brief, lance la recherche web, génère l’outline, rédige section par section (chunked), optimise SEO, score la qualité via Claude Opus.
Claude API Brave Search
📍 Nodes : PostgreSQL → HTTP ×N (Claude) → Code (assemblage) → HTTP (Opus judge)
🚀 Article → Publication WP
Sanitise le HTML, upload les médias, crée le post en draft, configure Yoast, schedule, ping Google Indexing API. Jamais en publish direct.
WP REST API Google Indexing
📍 Nodes : PostgreSQL → Code (sanitize) → WP → HTTP (Yoast meta) → HTTP (Indexing ping)
📊 Monitoring & Feedback Loop
Check indexation J+7, ranking J+30, trafic J+60. Détecte les underperformers, génère un plan d’optimisation automatique.
GSC API GA4
📍 Nodes : Daily trigger → PostgreSQL → HTTP (GSC) → Code (détection) → HTTP (Claude plan)
📣 Distribution multicanal
Post-publication : génère variantes LinkedIn (1200 chars), X/Twitter (240 chars), résumé newsletter. Adaptation automatique du ton par canal.
Claude API LinkedIn API
📍 Nodes : Webhook (post publié) → HTTP (Claude ×3) → LinkedIn / Twitter / Mailchimp
🛡️ Anti-cannibalisation
Avant chaque production, vérifie la similarité cosine avec le corpus (Qdrant). Bloque si > 0,85, alerte si > 0,70.
Qdrant Embeddings
📍 Nodes : Webhook → HTTP (embeddings) → HTTP (Qdrant search) → Code (décision) → Respond
📚
Documentation n8nPour construire ces workflows : docs.n8n.io → Integrations. Les nodes HTTP Request, Code, et PostgreSQL couvrent 80% des cas. Pour les APIs sans node natif (GSC, Ahrefs), utiliser HTTP Request avec OAuth2 ou API Key.

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.

1
Brief automatisé
⏱ 15-30 secondes
Généré à partir des données d’opportunité + analyse SERP. Il constitue le contrat éditorial de l’article. Tous les paramètres aval en dépendent.
JSON — Structure du brief
{
  "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"]
  }
}
2
Research & collecte de données
⏱ 30-90 secondes
Scraping SERP top 10, extraction PAA, sources officielles, recherche vectorielle interne. La qualité du contenu dépend directement de cette étape — pas du prompt.
Python — Collecte parallèle
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
    )
3
Génération de l’outline
⏱ 20-40 secondes
Point de contrôle critique. Les articles sans outline validé ont un taux de rejet qualité 3× supérieur. C’est l’étape la moins coûteuse à corriger — ne pas la sauter.
Python — Validation outline
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")
4
Rédaction chunked (section par section)
⏱ 90-180 secondes
1 prompt par section H2 — jamais un prompt unique pour tout l’article. La qualité est homogène sur tout l’article. Obligatoire au-delà de 1 500 mots.
Python — Génération itérative
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)
5
Optimisation SEO on-page
⏱ 30-60 secondes
Pass dédié post-rédaction. Keyword dans title/H1/premier paragraphe/un H2, meta 150-160 chars, Schema.org FAQ+Article, maillage interne, TF-IDF vs top 10.
6
Quality Gate — scoring multi-dimensionnel
⏱ 20-45 secondes
4 dimensions : structurelle (20%), sémantique (25%), éditoriale LLM-as-judge (30%), technique SEO (25%). Score ≥ 7/10 = publication. Voir section 06 pour la grille complète.
7
Package & déploiement
⏱ 15-30 secondes
Output final structuré — HTML sanitisé, meta complètes, schema JSON-LD, liens internes, variantes social. Prêt à injecter dans le CMS.
JSON — Package final
{
  "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.

Prompt — Rédaction section H2
// 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.
Prompt — Génération outline
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
}
Prompt — Meta title & description
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}
Prompt — LLM-as-Judge (à appeler avec Opus)
// 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}
Prompt — Rewrite chirurgical
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.
Limite fondamentaleAucun prompt, aussi sophistiqué soit-il, ne compense un manque de données factuelles. Si le LLM n’a pas de faits concrets dans son contexte, il inventera des statistiques avec une confiance totale. La collecte de données (étape 2) est le vrai facteur limitant — pas le prompt.

La gate critique avant publication

4 dimensions, 1 score composite. Score ≥ 7/10 = publication automatique. En dessous, le pipeline réécrit ou rejette.

Formule composite
score = (0,20 × structurel) + (0,25 × sémantique) + (0,30 × éditorial) + (0,25 × technique_seo)

≥ 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
Simulateur — calculez le score de votre article
📐 Structurel
Poids 20%
Longueur, H2 count, FAQ, meta
7,0/10
🔬 Sémantique
Poids 25%
TF-IDF vs top 10, entités
7,5/10
✍️ Éditorial
Poids 30%
Lisibilité, cohérence, originalité
8,0/10
⚙️ Technique SEO
Poids 25%
Keyword placement, schema, linking
8,5/10
7,7
🟡 Réécriture sections faibles
Score 7,0–8,4 — le pipeline réécrit automatiquement les sections sous les seuils, puis re-score avant publication.
⚠️
Biais LLM-as-JudgeLe LLM évalue plus favorablement du contenu qu’il a lui-même généré. Mitigation : utiliser Opus pour évaluer du contenu généré par Sonnet. Calibrer les seuils 15-20% plus haut que ce qu’un éditeur humain exigerait.

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.

Anti-pattern #01
Content flooding sans stratégie
Dilution de l’autorité, crawl budget gaspillé, rankings qui chutent.
Toujours lier au clustering keyword + intent mapping avant de produire.
Anti-pattern #02
Zero human oversight
Hallucinations publiées, stats inventées, crédibilité détruite en 1 article.
Maintenir un review humain sur 20% minimum (échantillon aléatoire).
Anti-pattern #03
Prompt identique pour tout
Contenu homogène, voix monotone, le site « sonne robot ».
Varier les prompts par type de contenu, intent et vertical sémantique.
Anti-pattern #04
Ignorer le maillage interne
Articles orphelins, l’autorité SEO ne circule pas dans le site.
Maillage automatique basé sur le graphe de contenu (vector similarity).
Anti-pattern #05
Pas de feedback loop
Les mêmes erreurs se répètent, le pipeline ne s’améliore jamais.
Dashboard par article + injection des données de perf dans le scoring.
Anti-pattern #06
Over-optimization SEO
Contenu robotique, keyword stuffing, risque de pénalité algorithmique.
Plafonner la densité keyword — « 2-3 occurrences naturelles max » dans le prompt.
Anti-pattern #07
Ignorer l’E-E-A-T
Contenu sans auteur, sans expertise prouvée — invisible pour Google.
Attribuer à des auteurs réels, ajouter des signaux d’expertise visibles.
Anti-pattern #08
Single point of failure API
Pipeline 100% bloqué quand Claude est down ou rate-limité.
Circuit breaker + fallback model + file d’attente persistante.
Anti-pattern #09
Publier directement en « publish »
Un article cassé visuellement détruit la confiance et le crawl budget.
Toujours : draft → preview visuel → future (schedulé). Jamais publish direct.
Anti-pattern #10
Volume au détriment de la qualité
Score qualité moyen qui baisse en scalant — puis les rankings chutent tous ensemble.
Si le score moyen baisse en scalant : STOP. Réparer le pipeline avant de continuer.
L’anti-pattern ultimeCroire que « plus de contenu = meilleur SEO ». 50 articles excellents surpassent 500 articles moyens. L’automatisation doit augmenter la qualité ET le volume — jamais le volume au détriment de la qualité.

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.

Niveau
Caractéristiques
Volume / Auto
1
Manuel assisté
LLM comme aide à la rédaction. Pas de pipeline. Prompts ad hoc. Tout reste manuel.
5-15/mois
10-20%
2
Semi-automatisé
Pipeline basique. Prompts standardisés. Review humain sur chaque article. Scoring manuel.
15-50/mois
40-50%
3
Automatisé
Pipeline complet avec quality gates. Review humain sélectif (score < 8). Publication schedulée.
50-150/mois
70-80%
4
Industrialisé
Multi-pipelines par vertical. Feedback loop actif. Auto-optimisation. Model routing.
150-500/mois
85-90%
5
Autonome adaptatif
Détecte, priorise, produit, publie, optimise et itère de manière autonome. Humain sur la stratégie.
500+/mois
95%+

Roadmap 12 semaines (niveau 1 → 3)

SemainesPhaseLivrables
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.

🤖
Claude API — Anthropic
Documentation officielle, clés API, modèles disponibles (Haiku / Sonnet / Opus), pricing et rate limits.
  • Créer un compte sur console.anthropic.com
  • Documentation sur docs.anthropic.com
  • Modèles : Haiku (meta), Sonnet (volume), Opus (premium/judge)
console.anthropic.com · docs.anthropic.com
🔌
MCPs — Model Context Protocol
Répertoire officiel de tous les MCPs disponibles — officiels et communautaires. Filesystem, PostgreSQL, Brave Search, Memory et bien d’autres.
  • Catalogue officiel : modelcontextprotocol.io
  • GitHub repo : github.com/modelcontextprotocol/servers
  • Config Claude Desktop : fichier claude_desktop_config.json
modelcontextprotocol.io
⚙️
n8n — Workflow Automation
Orchestrateur recommandé pour équipes < 5 devs. Version self-hosted gratuite, version cloud disponible. Templates communautaires existants pour Claude et GSC.
  • Documentation : docs.n8n.io
  • Templates : n8n.io/templates — chercher « Claude » ou « SEO »
  • Self-hosted : Docker — hub.docker.com/r/n8nio/n8n
n8n.io · docs.n8n.io
🔍
Google Search Console API
Données propriétaires de votre site — impressions, CTR, positions. Point de départ de tout pipeline SEO. Accès via Google Cloud Console.
  • 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
developers.google.com/webmaster-tools
💾
Qdrant — Vector Store
Base de données vectorielle open source pour le RAG et l’anti-cannibalisation. Self-hosted ou cloud. Idéal pour la recherche de similarité sémantique sur votre corpus.
  • Site officiel : qdrant.tech
  • Docs : qdrant.tech/documentation
  • Cloud managed : cloud.qdrant.io (free tier disponible)
qdrant.tech
📊
Outils SEO tiers
Pour la détection d’opportunités (content gap, KD, volumes). Ahrefs et SEMrush proposent des APIs documentées pour l’automatisation.
  • Ahrefs API : docs.ahrefs.com/api
  • SEMrush API : developer.semrush.com
  • Alternative gratuite : Google Trends API (tendances émergentes)
docs.ahrefs.com/api · developer.semrush.com
💡
Coût réel d’un article automatiséUn article ~2 000 mots avec Claude Sonnet coûte environ 0,15–0,40 € en tokens API. Le coût dominant n’est pas le LLM — ce sont les APIs SEO tierces (Ahrefs ~99€/mois, SEMrush ~130€/mois) et l’infrastructure d’orchestration. Optimisez d’abord le nombre d’appels API SEO.