# Outils MCP Body Expert / Esteworld

## Outils de lecture

```
list_pages()
  → Liste toutes les pages Esteworld disponibles (121 pages)

get_page(slug)
  → Contenu Markdown complet d'une page

get_page_json(slug)
  → RÉSUMÉ LÉGER : liste des sections avec type, titres, taille
  → NE retourne PAS le contenu complet (trop gros)
  → Utiliser ensuite get_section_content() pour lire section par section

get_section_content(slug, section_index)
  → Contenu COMPLET (fields) d'une section spécifique
  → Appeler après get_page_json(), une section à la fois

get_blocks_library()
  → Liste des 27 types de blocs avec leur fréquence

search_content(query)
  → Recherche dans le contenu des pages
  → Utile pour trouver une page quand le slug est incertain
```

## Outils de mapping

```
find_esteworld_page(body_expert_url)
  → Trouve l'équivalent Esteworld d'une URL Body Expert
  → Retourne: {found, local_slug, esteworld_slug, esteworld_path, type}
  → ⚠️ Vérifier cohérence : esteworld_slug doit correspondre à esteworld_path
  → Si incohérent : ignorer le slug et utiliser search_content() ou esteworld_path

list_pages_to_create()
  → Pages Body Expert à créer (status="New")

list_pages_to_rewrite()
  → Pages Body Expert à reformuler (status="Oui")

list_pages_without_esteworld()
  → Pages sans équivalent Esteworld

list_pages_with_esteworld()
  → Pages avec équivalent Esteworld

list_pages_by_type(type)
  → Filtre par type : "turquie" | "istanbul" | "guide" | "blog"

list_pages_by_thematique(thematique)
  → Filtre par thématique
```

## Outils de maillage interne

```
get_internal_links(slug)
  → Liens recommandés pour une page spécifique

get_breadcrumb(slug, type, thematique, titre)
  → Génère le breadcrumb JSON automatiquement

search_links_by_keyword(keyword)
  → Trouve les URLs correspondant à un mot-clé (liens contextuels)

get_thematique_pages(thematique_id)
  → Liste toutes les pages d'une thématique

get_redirections()
  → Liste les redirections 301 actives (URLs à NE PAS utiliser)

get_maillage_rules()
  → Règles de maillage par type de page
```

## Outil de vérification (OBLIGATOIRE avant toute modification)

```
get_page_status(slug)
  → Retourne:
  {
    "found": true,
    "slug": "greffe-de-cheveux",
    "title": "Greffe de cheveux",
    "status": "draft",
    "status_label": "Brouillon",
    "source": "bodyexpert",
    "needs_confirmation": true,
    "message": "Cette page est en statut 'Brouillon'. Demandez confirmation..."
  }
```

## Outils de gestion de blocs

```
update_block(page_slug, block_order, fields?, is_global?, block_type?)
  → Met à jour un bloc existant
  → Tous les paramètres sont optionnels sauf slug et order
  → Exemples:
    update_block("slug", 5, block_type="section__long_text")           # changer le type seulement
    update_block("slug", 3, is_global=False)                           # passer en non-global
    update_block("slug", 8, is_global=False, fields={"h2": [...]})     # les deux

get_block(page_slug, block_order)
  → Récupère un bloc spécifique avec ses fields parsés

delete_block(page_slug, block_order)
  → Supprime un bloc (les orders sont auto-recompactés)

reorder_blocks(page_slug, new_order)
  → Réordonne les blocs
  → new_order = liste des positions actuelles dans le nouvel ordre
  → Ex: [0, 2, 1, 3] pour inverser les blocs 1 et 2

preview_global_fixes()
  → Scanner les faux globaux (preview sans modifier)

fix_global_blocks("ma-page")
  → Corriger automatiquement les faux globaux d'une page

fix_global_blocks()
  → Corriger tous les faux globaux de toutes les pages
```

## Outils d'écriture

```
submit_page_light(slug, title, source_url, target_url, page_type, thematique, seo_title, seo_description)
  → Crée la page SANS blocs
  → Recommandé comme première étape du workflow progressif

add_block(page_slug, block_type, title, fields, is_global, position)
  → Ajoute UN bloc à la page
  → Utiliser après submit_page_light()

submit_page(slug, title, source_url, target_url, page_type, thematique, seo_title, seo_description, blocks, breadcrumb)
  → Envoie la page COMPLÈTE avec tous les blocs
  → Préférer cette méthode (évite les doublons de blocs)
```

## Format submit_page complet

```python
submit_page(
  slug="rhinoplastie-turquie",
  title="Rhinoplastie en Turquie",
  source_url="https://greffe-template.69dev.io/rhinoplastie/",
  target_url="https://www.bodyexpert.online/rhinoplastie-turquie",
  page_type="turquie",
  thematique="Chirurgie du visage",
  seo_title="Rhinoplastie Turquie: Cliniques & Expertise | Body Expert",
  seo_description="Rhinoplastie en Turquie. Chirurgiens certifiés, hôpitaux JCI. Séjour tout inclus. Devis gratuit en 24h.",
  blocks=[
    {
      "blockType": "section__header_2_grey",
      "title": "Header",
      "fields": {
        "h1": [{"text": "Rhinoplastie en Turquie"}],
        "breadcrumb": [
          {"label": "Body Expert", "url": "/"},
          {"label": "Rhinoplastie", "url": "/rhinoplastie"},
          {"label": "Rhinoplastie en Turquie"}
        ],
        "paragraphs": [
          {"text": "Chirurgiens certifiés"},
          {"text": "Jusqu'à 70% d'économies"},
          {"text": "Séjour tout compris"}
        ]
      },
      "isGlobal": false
    },
    {
      "blockType": "section__3_cards_price",
      "title": "Tarifs",
      "fields": {},
      "isGlobal": true
    },
    {
      "blockType": "section__team_info",
      "title": "Validation médicale",
      "fields": {
        "doctor_name": "Dr. Mehmet Celik",
        "specialty": "Chirurgie plastique et esthétique",
        "description": "Spécialiste en rhinoplastie avec 15 ans d'expérience."
      },
      "isGlobal": false
    },
    {
      "blockType": "section__long_text",
      "title": "Contenu SEO",
      "fields": {
        "h2": [{"text": "La rhinoplastie en Turquie"}],
        "wysiwyg_markdown": "## La rhinoplastie en Turquie\n\nContenu détaillé...\n\n---\n\n### Sources\n\n1. [Auteur (Année). Titre. *Journal*.](url)"
      },
      "isGlobal": false
    },
    {
      "blockType": "section__mcq",
      "title": "FAQ",
      "fields": {
        "h2": [{"text": "Questions fréquentes"}],
        "faq_items": [
          {"question": "Question?", "answer": "Réponse avec **gras** et [lien](/page)."}
        ]
      },
      "isGlobal": false
    },
    {
      "blockType": "section__list_links",
      "title": "Sujets connexes",
      "fields": {
        "h2": [{"text": "Sujets connexes"}],
        "links": [
          {"text": "Rhinoplastie ethnique en Turquie", "href": "/rhinoplastie-ethnique"},
          {"text": "Guide de la rhinoplastie", "href": "/guide/rhinoplastie"}
        ]
      },
      "isGlobal": false
    }
  ]
)
```

## Gestion des erreurs courantes

### Mapping Esteworld incohérent
```
Résultat: {esteworld_slug: "greffe-de-barbe-a-cannes", esteworld_path: "/turquie/greffe-de-cheveux-avec-stylo-choi"}
→ Le slug ne correspond pas au path
→ IGNORER le local_slug
→ Chercher: get_page_json("greffe-de-cheveux-avec-stylo-choi-turquie") ou variantes
→ En dernier recours: search_content("stylo choi")
```

### Bloc faux global à corriger
```python
# Bloc marqué global à tort
update_block("ma-page", 8, is_global=False)

# Changer le type d'un bloc qui bug
update_block("ma-page", 5, block_type="section__long_text")

# Les deux à la fois
update_block("ma-page", 8, is_global=False, block_type="section__3_columns_card_slider")
```
