Configurer le serveur MCP pour Craft CMS.
Ce guide va d'une installation Craft vide à un client IA connecté. Il explique aussi chaque réglage qui limite le client.
1. Installer
Pas encore installable. La fiche du Craft Plugin Store est en préparation, et tant qu'elle n'est pas en ligne, le paquet est introuvable — les deux commandes ci-dessous ne le trouveront pas. Elles sont là pour vous montrer à quoi ressemblera l'installation.
composer require alphabridge/mcp php craft plugin/install alphabridge-mcp
La migration crée deux tables, alphabridge_tokens et alphabridge_audit. La désinstallation les supprime et ne laisse rien derrière elle :
php craft plugin/uninstall alphabridge-mcp
Prérequis : Craft CMS 5.9+, PHP 8.2+, MySQL 8.0.17+ / MariaDB 10.4.6+ ou PostgreSQL 13+.
2. Créer un jeton
Dans le panneau de contrôle, ouvrez AlphaBridge MCP dans la barre latérale. La page est réservée aux administrateurs. Choisissez l'utilisateur Craft auquel appartient le jeton, une portée, un libellé pour le reconnaître plus tard et une durée de vie facultative en jours.
Le jeton en clair n'est affiché qu'une seule fois, juste après sa création. Seul son hachage SHA-256 est stocké, il ne peut donc plus être affiché. Copiez-le avant de quitter la page ; si vous le perdez, révoquez-le et créez-en un nouveau.
La même chose fonctionne depuis la console, pratique pour les installations scriptées :
php craft alphabridge-mcp/tokens/create --user=admin --scope=read --label="Claude Desktop" php craft alphabridge-mcp/tokens/list php craft alphabridge-mcp/tokens/revoke 1
--expires-in-days=30 limite la durée de vie d'un jeton ; 0, la valeur par défaut, signifie sans expiration.
Ce que signifie une portée
Un jeton est associé à exactement un utilisateur Craft et fonctionne avec ses permissions. La portée restreint encore ; elle n'élargit jamais.
| Portée | Autorise |
|---|---|
read | Les outils de lecture, sans les outils d'administration. Ne modifie rien. |
content | Les outils de lecture, plus l'écriture des entrées, brouillons, catégories et globales. Toujours sans les outils d'administration. |
full | Tout ce que l'utilisateur associé peut faire, y compris les outils d'administration : champs du schéma, informations système, journal d'audit, base de données, journaux, caches, routes, file d'attente, plugins, groupes d'utilisateurs. |
3. Connecter un client
Le point d'accès est POST https://your-site.example/alphabridge/mcp — JSON-RPC 2.0 en Streamable HTTP, versions du protocole 2025-03-26 et 2025-06-18. Le jeton voyage dans un en-tête :
X-Api-Key: abmcp_… fonctionne aussi. Tout client MCP qui parle le Streamable HTTP et peut envoyer un en-tête personnalisé peut se connecter.
Claude Code
Une seule commande :
claude mcp add --transport http craft https://your-site.example/alphabridge/mcp \ --header "Authorization: Bearer abmcp_…"
Claude Desktop · Cursor
Ajoutez ceci à la configuration MCP du client. Le jeton se trouve dans une variable d'environnement, pour ne pas finir dans le fichier qui est partagé :
{ "mcpServers": { "craft": {
"command": "npx",
"args": ["mcp-remote", "https://your-site.example/alphabridge/mcp",
"--header", "Authorization:${AUTH}"],
"env": { "AUTH": "Bearer abmcp_YOUR_TOKEN" }
}}}
Clients qui ne peuvent placer le jeton que dans l'URL
Certains clients acceptent une URL de connecteur, mais pas d'en-tête personnalisé. Pour eux, il existe un second point d'accès qui transporte le jeton dans le chemin — désactivé par défaut. Activez d'abord Allow the token in the URL path dans les paramètres, en connaissance de cause : un jeton dans un chemin atterrit bien plus facilement dans les journaux du serveur, ceux des proxys et les en-têtes Referer qu'un jeton dans un en-tête.
4. Paramètres
Dans le panneau de contrôle, sous Settings → Plugins → AlphaBridge MCP.
- Read-only mode — tant qu'il est activé, aucun outil qui modifie quoi que ce soit ne s'exécute. Il domine tous les autres interrupteurs.
- Tools — chaque outil est Default (on), Default (off), On ou Off. Les outils qui modifient un état sont désactivés par défaut. Default est un état à part entière, pas un synonyme de « on » ou « off » : une version ultérieure peut reclasser un outil, et un site qui a choisi Default suit ce reclassement au lieu de figer une ancienne décision.
- Calls per minute and token — un frein contre un modèle qui tourne en boucle. Ce n'est pas une défense contre un appelant déterminé qui détient un jeton valide.
- Allow the token in the URL path — désactivé par défaut, voir ci-dessus.
- Additional allowed origins — pour les clients qui tournent dans le navigateur, voir ci-dessous.
Les mêmes paramètres peuvent être définis dans config/alphabridge-mcp.php. Une valeur définie dans le fichier l'emporte sur le panneau de contrôle, et la page des paramètres signale chaque champ concerné et indique d'où vient sa valeur.
return [
'readOnly' => false,
'rateLimit' => 120,
'connectorUrlAuthEnabled' => false,
'allowedOrigins' => ['https://client.example', '$MCP_ALLOWED_ORIGINS'],
'toolState' => ['craft_create_entry' => true],
];
Les jetons ne font volontairement pas partie des paramètres : ce sont des secrets, et les paramètres des plugins vivent dans la configuration du projet, qui est versionnée dans Git. Les jetons ont donc leur propre page.
Origines et DNS rebinding
Si un client envoie un en-tête Origin, celui-ci doit figurer sur la liste d'autorisation, sinon le point d'accès répond HTTP 403. La liste d'autorisation comprend les allowedOrigins configurées plus l'URL du site — mais seulement là où elles peuvent être déterminées statiquement : une URL fixe avec schéma et hôte, éventuellement contenue dans une variable d'environnement qui renferme une telle URL. Un seul niveau est résolu.
Une URL de site construite à partir d'un alias Craft comme @web ne compte pas, même à l'intérieur d'une variable d'environnement. Craft construit @web à partir de l'en-tête Host de la requête entrante : un attaquant serait donc comparé à lui-même. Dans ces installations, allowedOrigins est la seule source ; si elle est vide, toute requête portant un Origin est refusée. Les clients de serveur à serveur n'envoient pas d'Origin et ne sont pas concernés.
5. Licence et essai
Le plugin est vendu via le Craft Plugin Store sous la Craft License : une licence par environnement de production. La fiche du store est en préparation ; tant qu'elle n'est pas en ligne, le plugin n'y est pas achetable. Les environnements de développement et de préproduction sont gratuits à l'essai — cela fait partie de la Craft License, ce n'est pas un essai que nous accordons.
6. Quand quelque chose ne fonctionne pas
| Ce que vous voyez | Ce que cela signifie |
|---|---|
| 401 | Le jeton est absent, inconnu, expiré ou révoqué. Vérifiez que l'en-tête arrive vraiment — certains proxys suppriment Authorization. Créez un nouveau jeton pour exclure une faute de frappe ; le texte en clair n'est affiché qu'une fois, une copie partielle est donc une cause fréquente. |
| 403 | Un en-tête Origin a été envoyé qui ne figure pas sur la liste d'autorisation. Voir Origines. Les clients de serveur à serveur n'envoient aucun Origin. |
| Unknown tool (outil inconnu) | Soit le nom n'existe pas, soit la portée du jeton ne le couvre pas. Les deux cas reçoivent volontairement la même réponse : la différence révélerait à un appelant ce qui existe d'autre. |
| Un refus qui indique sa raison | Le mode lecture seule est activé, l'outil est désactivé dans les paramètres, ou c'est un outil d'administration et l'utilisateur associé n'est pas administrateur. Ici, la réponse dit lequel, pour que vous ne cherchiez pas l'erreur de votre côté. Ces outils sont aussi absents de la liste des outils. |
| Limite de débit | Plus d'appels par minute que le réglage ne l'autorise, comptés par jeton. Relevez la limite ou ralentissez le client. |
| Liste vide | Ce n'est pas une erreur. L'utilisateur associé n'a pas le droit de voir cette section ou ce groupe de catégories — une section inconnue ou interdite donne une liste vide plutôt qu'une erreur qui révélerait son existence. Un handle de site inexistant est en revanche signalé comme une erreur. |
Le journal d'audit enregistre chaque appel avec son résultat. Lisez-le avec l'outil craft_audit_log (portée administrateur) pour voir ce qu'un client a réellement fait.
Ensuite : la référence complète des outils, générée à partir du registre du plugin lui-même, et comment fonctionne la chaîne de sécurité.