# Serveur MCP Izibrick

Serveur [MCP](https://modelcontextprotocol.io) (stdio) qui permet à un agent IA
(Claude Code, Claude Desktop, etc.) de créer et gérer des sites Izibrick via
l'API REST `/api/mcp` du backend Symfony.

## Tools exposés

| Tool | Description |
|---|---|
| `list_sites` / `get_site` | Lister les sites, détail d'un site et de ses pages |
| `create_site` | Création directe d'un site vide (Accueil + Contact, abonnement) |
| `create_site_from_brief` | Création d'un site complet généré par IA (long) |
| `update_branding` | Couleurs du site |
| `upload_media` | Upload d'image (URL ou base64) → URL publique |
| `get_page` / `create_page` / `update_page_sections` / `delete_page` | CRUD pages avec structure `sectionsData` validée côté serveur |
| `generate_page_ai` / `modify_page_ai` | Génération/modification de page par IA (long) |
| `list_blog_posts` / `create_blog_post` / `update_blog_post` / `delete_blog_post` | Articles de blog |
| `list_blog_categories` / `create_blog_category` | Catégories de blog |

## Installation

```bash
cd mcp-server
npm install
```

## Authentification

1. Créer un token API pour votre utilisateur Izibrick :

```bash
php bin/console app:api-token:create votre@email.com --name "MCP" 
# → affiche un token izb_... (montré une seule fois)
```

(La table `fir_api_token` doit exister : `php bin/console doctrine:migrations:migrate`.)

2. Le serveur MCP envoie ce token en header `Authorization: Bearer izb_...`.

En **dev uniquement**, on peut se passer de token avec la variable
`IZIBRICK_USER_ID` (header `X-Izibrick-User-Id`).

## Configuration dans Claude Code / Claude Desktop

`.mcp.json` à la racine du projet (ou config Claude Desktop) :

```json
{
  "mcpServers": {
    "izibrick": {
      "command": "node",
      "args": ["c:/wamp64/www/izibrick/mcp-server/index.js"],
      "env": {
        "IZIBRICK_BASE_URL": "http://www.izibrick.test:9000",
        "IZIBRICK_API_TOKEN": "izb_votre_token_ici"
      }
    }
  }
}
```

Le serveur PHP doit tourner (`php -S 0.0.0.0:9000 -t public`).

## Exemple de session

> « Crée-moi un site pour une boulangerie à Bordeaux avec une page tarifs »

L'agent enchaînera typiquement :
1. `create_site_from_brief` (businessName: "Boulangerie...", location: "Bordeaux") — ou `create_site` pour un site vide ;
2. `get_site` pour récupérer les pages ;
3. `create_page` (title: "Tarifs", sections avec un widget `pricing`) ;
4. `update_branding` pour ajuster les couleurs.

## Structure `sections` attendue par create_page / update_page_sections

```json
{
  "containers": [
    {
      "config": {},
      "columns": [
        {
          "widgets": [
            { "type": "hero", "config": { "title": "Bienvenue" } },
            { "type": "wysiwyg", "config": { "content": "<p>Texte...</p>" } }
          ]
        }
      ]
    }
  ]
}
```

Types de widgets valides : `header`, `footer`, `wysiwyg`, `image`, `hero`,
`two-columns`, `cta`, `video`, `team-members`, `cards`, `info-box`, `list`,
`pricing`, `contact-form`, `faq`, `timeline`, `counters`, `icon-boxes`,
`testimonials`, `trust-badges`, `google-reviews`, `blog`, `shop`,
`shop-catalog`, `gallery`, `map`.

La structure est validée par `App\Service\SectionsDataValidator` ; en cas
d'erreur, l'API renvoie la liste précise des problèmes (`validationErrors`).
