Après la gestion des articles, des médias et des meta descriptions, voici l'étape suivante dans l'intégration de l'IA Claude avec Joomla via MCP : la gestion intelligente des tags. L'objectif est simple — dire à Claude "ajoute les tags MCP, IA Claude et Joomla à cet article" et qu'il s'occupe de tout : rechercher les tags existants, créer ceux qui manquent, et les associer à l'article. Sans jamais demander à l'utilisateur un seul ID.
→ Connecter Claude Desktop à Joomla 5 via MCP : le tutoriel complet
Si vous débutez, commencez par là — code source et installation pas à pas inclus.
Le problème des tags en langage naturel
Les tags Joomla sont identifiés par des IDs numériques dans l'API REST. Demander à un utilisateur de connaître ces IDs serait une mauvaise expérience. Mais il y a un autre piège, plus subtil : les variantes orthographiques.
"IA Claude", "Claude IA", "ia claude" et "claude IA" sont techniquement quatre tags différents dans Joomla — mais ils désignent la même chose. Sans normalisation, chaque variante créerait un doublon.
La solution mise en place repose sur une fonction de normalisation qui :
- Passe tout en minuscules
- Supprime les accents
- Trie les mots par ordre alphabétique
Ainsi "IA Claude", "Claude IA" et "claude ia" donnent tous claude ia après normalisation → même tag trouvé, aucun doublon.
function normalizeTag(str) {
return str
.toLowerCase()
.trim()
.normalize('NFD').replace(/[\u0300-\u036f]/g, '')
.split(/\s+/)
.sort()
.join(' ');
}
L'outil assigner_tags : zéro ID, zéro doublon
L'outil MCP assigner_tags fonctionne en quatre étapes automatiques :
- Récupération de tous les tags existants via l'API Joomla (
/tags?page[limit]=500) - Recherche normalisée — pour chaque tag demandé, on compare les formes normalisées
- Création automatique des tags absents avec un alias URL propre
- Association à l'article via un PATCH sur
/content/articles/{id}avec un tableau d'integers
server.tool('assigner_tags',
'Assigner des tags à un article par leur nom.',
{
article_id: z.number(),
tags: z.array(z.string()),
},
async ({ article_id, tags }) => {
const res = await joomla('/tags?page[limit]=500');
const existing = res.data ?? [];
const tagIds = [];
const matched = [];
const created = [];
for (const name of tags) {
const normName = normalizeTag(name);
const candidates = existing.filter(t =>
normalizeTag(t.attributes.title) === normName
);
if (candidates.length === 1) {
matched.push(candidates[0].attributes.title);
tagIds.push(parseInt(candidates[0].attributes.id)); // ✅ integer simple
} else {
const alias = normName.replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
const result = await joomla('/tags', 'POST', {
title: name.trim(),
alias: alias,
language: '*',
published: 1,
parent_id: 1, // ✅ obligatoire
description: '' // ✅ obligatoire
});
created.push(name.trim());
tagIds.push(parseInt(result.data.attributes.id)); // ✅ integer simple
}
}
// ✅ Format tableau d'integers — seul format accepté par l'API Joomla
if (tagIds.length > 0) {
await joomla(`/content/articles/${article_id}`, 'PATCH', { tags: tagIds });
}
return ok({ success: true, article_id, tags_matches: matched, tags_crees: created });
}
);
—
parent_id: 1 : obligatoire à la création d'un tag. Sans ce champ, Joomla renvoie "Invalid field: Parent".—
description: '' : champ requis en base même si vide. Sans lui : "Field 'description' doesn't have a default value".—
tags: [11, 12] : le PATCH Joomla n'accepte qu'un tableau d'integers simples, pas [{"id":11}]. Ce dernier format est accepté sans erreur mais ignoré silencieusement.Règle d'or : les tags toujours en dernier
Le PATCH Joomla sur un article efface les tags si le champ tags n'est pas réenvoyé. Il est donc impératif d'assigner les tags après toutes les autres modifications (contenu, image, meta description). L'API ne permet pas de lire les tags existants d'un article pour les préserver automatiquement.
En pratique : ce que vous dites à Claude
Une fois l'outil installé et Claude Desktop redémarré, la gestion des tags se fait en langage naturel :
"Ajoute les tags MCP Joomla, IA Claude et Développement Joomla à l'article 514"
Claude appelle automatiquement assigner_tags, recherche chaque tag, crée ceux qui n'existent pas encore, et confirme les associations réalisées avec un récapitulatif clair : tags trouvés, tags créés, éventuelles ambiguïtés.
Workflow complet : article, image, SEO et tags en une conversation
Voici le workflow complet tel qu'il est pratiqué chez web54 pour la création d'un article optimisé :
- "Crée un article sur [sujet] dans la catégorie 17, non publié"
- "Uploade cette image dans le dossier mcp, nom 'mon-image' : https://..."
- "Sur l'article X, image intro images/mcp/mon-image.jpg, meta description '...', mots-clés '...'"
- "Ajoute les tags MCP Joomla et IA Claude à l'article X" ← toujours en dernier
En moins de deux minutes, l'article est structuré, illustré, optimisé SEO et correctement tagué — sans jamais quitter Claude Desktop.
→ Connecter Claude Desktop à Joomla 5 via MCP : le tutoriel complet
Article rédigé par Serge Billon — web54.fr | Agence web Joomla en Lorraine
