EmDash inclut un serveur Model Context Protocol (MCP) intégré à /_emdash/api/mcp qui expose les opérations de gestion de contenu comme outils pour les assistants IA.
Cette page couvre les détails du protocole : authentification, transport, spécifications des outils, découverte OAuth et gestion des erreurs.
Authentification
Le serveur MCP prend en charge trois méthodes d’authentification :
| Méthode | Fonctionnement |
|---|---|
| OAuth 2.1 Authorization Code + PKCE | Flux standard pour les clients MCP. L’utilisateur approuve les scopes dans le navigateur. |
| Personal Access Token (PAT) | Tokens ec_pat_* de longue durée créés dans le panneau d’administration. |
| Device Flow | Flux de type CLI où vous approuvez un code dans le navigateur. Utilisé par emdash login. |
Les cookies de session (de l’interface d’administration) fonctionnent également mais ne sont pas pratiques pour les clients MCP externes.
Scopes
Les tokens sont limités à des scopes pour restreindre les opérations qu’un client peut effectuer. Les scopes sont demandés lors de l’autorisation OAuth et appliqués à chaque appel d’outil.
| Scope | Donne accès à |
|---|---|
content:read | Lister, obtenir, comparer et rechercher du contenu. Lister les taxonomies, les termes de taxonomie et les menus. |
content:write | Créer, mettre à jour, supprimer, publier, dépublier, planifier, déplanifier, dupliquer et restaurer du contenu. Accorde implicitement taxonomies:manage et menus:manage pour la rétrocompatibilité avec les tokens émis avant l’existence de ces scopes. |
media:read | Lister et obtenir des éléments multimédias. |
media:write | Enregistrer (créer), mettre à jour et supprimer des métadonnées multimédias. |
schema:read | Lister les collections et obtenir les schémas de collections. |
schema:write | Créer et supprimer des collections et des champs. |
taxonomies:manage | Créer, mettre à jour et supprimer des termes de taxonomie. |
menus:manage | Créer, mettre à jour et supprimer des menus de navigation et leurs éléments. |
settings:read | Lire les paramètres du site. |
settings:manage | Mettre à jour les paramètres du site. |
admin | Accès complet à toutes les opérations. |
Le scope admin donne accès à tout. L’authentification basée sur la session (sans token) a également un accès complet basé sur le rôle de l’utilisateur.
content:write accorde implicitement taxonomies:manage et menus:manage afin que les tokens d’accès personnel émis avant la séparation de ces scopes continuent de fonctionner sans réémission. Les nouveaux tokens doivent demander les scopes granulaires.
Exigences de Rôle
En plus des scopes, certains outils nécessitent un rôle RBAC minimum. Les deux doivent être satisfaits — un token avec le bon scope échoue quand même si le rôle de l’utilisateur appelant est trop bas.
| Opération | Rôle minimum |
|---|---|
| Lecture de contenu | Subscriber (10) pour les éléments publiés ; Contributor (20) pour les brouillons, planifiés, corbeille et révisions |
| Création de contenu | Contributor (20) |
| Modifier ses propres / supprimer ses propres | Author (30) |
| Publier du contenu | Author (30) pour ses propres éléments ; Editor (40) pour agir sur les éléments des autres |
| Lecture de schéma | Editor (40) |
| Écriture de schéma | Admin (50) |
| Gestion des taxonomies | Editor (40) |
| Gestion des menus | Editor (40) |
| Lecture des paramètres | Editor (40) |
| Gestion des paramètres | Admin (50) |
Téléchargement de médias (media_create) | Author (30) |
Consultez le guide d’Authentification pour les définitions de rôles.
Transport
Le serveur utilise le transport HTTP diffusable en mode sans état. Chaque requête est indépendante — il n’y a pas de sessions ni de connexions de longue durée.
POST /_emdash/api/mcp— Envoyer des appels d’outils JSON-RPCGET /_emdash/api/mcp— Renvoie 405 (pas de SSE en mode sans état)DELETE /_emdash/api/mcp— Renvoie 405 (pas de session à fermer)
Les réponses suivent le format JSON-RPC 2.0. Les erreurs utilisent des codes d’erreur JSON-RPC standard, avec des codes spécifiques MCP pour les échecs de scope et de permissions.
Outils
Le serveur expose 45 outils répartis sur huit domaines : contenu, schéma, médias, recherche, taxonomies, menus, révisions et paramètres. Chaque outil renvoie des résultats sous forme de contenu texte JSON, ou un message d’erreur avec isError: true en cas d’échec.
Outils de Contenu
content_list
Lister les éléments de contenu dans une collection avec filtrage et pagination optionnels.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection (ex. posts, pages) |
status | string | Non | Filtre : draft, published ou scheduled |
limit | integer | Non | Max. d’éléments à renvoyer (1-100, par défaut 50) |
cursor | string | Non | Curseur de pagination d’une réponse précédente |
orderBy | string | Non | Champ de tri (ex. created_at, updated_at) |
order | string | Non | Direction de tri : asc ou desc (par défaut desc) |
locale | string | Non | Filtrer par locale (ex. en, fr). Pertinent uniquement avec i18n. |
Scope : content:read | Lecture seule : Oui
content_get
Obtenir un seul élément de contenu par ID ou slug. Renvoie toutes les valeurs de champ, les métadonnées et un token _rev pour la concurrence optimiste.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu (ULID) ou slug |
locale | string | Non | Locale pour la recherche de slug. Les IDs sont globalement uniques. |
Scope : content:read | Lecture seule : Oui
content_create
Créer un nouvel élément de contenu. L’objet data doit contenir des valeurs de champ correspondant au schéma de la collection — utilisez schema_get_collection pour vérifier quels champs sont disponibles. Les éléments sont créés comme draft par défaut.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
data | object | Oui | Valeurs de champ comme paires clé-valeur |
slug | string | Non | Slug d’URL (auto-généré à partir du titre si omis) |
status | string | Non | Statut initial : draft ou published (par défaut draft) |
locale | string | Non | Locale pour ce contenu (par défaut celle du site) |
translationOf | string | Non | ID de l’élément dont ceci est une traduction |
Scope : content:write
content_update
Mettre à jour un élément de contenu existant. N’incluez que les champs que vous souhaitez modifier — les champs non spécifiés restent inchangés.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
data | object | Non | Valeurs de champ à mettre à jour |
slug | string | Non | Nouveau slug d’URL |
status | string | Non | Nouveau statut : draft ou published |
_rev | string | Non | Token de révision de content_get pour la détection de conflits |
Scope : content:write
content_delete
Supprimer doucement un élément de contenu en le déplaçant dans la corbeille. Utilisez content_restore pour annuler, ou content_permanent_delete pour le supprimer définitivement.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write | Destructif : Oui
content_restore
Restaurer un élément de contenu supprimé doucement depuis la corbeille.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write
content_permanent_delete
Supprimer définitivement et irréversiblement un élément de contenu dans la corbeille. L’élément doit d’abord être dans la corbeille.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write | Destructif : Oui
content_publish
Publier un élément de contenu, le rendant visible sur le site. Crée une révision publiée à partir du brouillon actuel. Les modifications ultérieures créent un nouveau brouillon sans affecter la version en ligne jusqu’à republication.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write
content_unpublish
Rétablir un élément publié au statut de brouillon. Il ne sera plus visible sur le site en ligne mais son contenu est préservé.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write
content_schedule
Planifier un élément de contenu pour publication future. Il sera automatiquement publié à la date/heure spécifiée.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
scheduledAt | string | Oui | Date/heure ISO 8601 (ex. 2026-06-01T09:00:00Z) |
Scope : content:write
content_unschedule
Annuler une publication précédemment planifiée. L’élément conserve son statut actuel ; seul le timestamp scheduledAt est effacé. Idempotent — appeler sur un élément non planifié est un no-op.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write
content_compare
Comparer la version publiée (en ligne) d’un élément de contenu avec son brouillon actuel. Renvoie les deux versions et un drapeau indiquant s’il y a des changements.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:read | Lecture seule : Oui
content_discard_draft
Rejeter le brouillon actuel et revenir à la dernière version publiée. Ne fonctionne que sur les éléments qui ont été publiés au moins une fois.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:write | Destructif : Oui
content_list_trashed
Lister les éléments de contenu supprimés doucement dans la corbeille d’une collection.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
limit | integer | Non | Max. d’éléments (1-100, par défaut 50) |
cursor | string | Non | Curseur de pagination |
Scope : content:read | Lecture seule : Oui
content_duplicate
Créer une copie d’un élément de contenu existant. Le duplicata est créé comme brouillon avec “(Copy)” ajouté au titre et un slug auto-généré.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug à dupliquer |
Scope : content:write
content_translations
Obtenir toutes les variantes de locale d’un élément de contenu. Renvoie le groupe de traduction et un résumé de chaque version de locale. Pertinent uniquement lorsque i18n est activé.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
Scope : content:read | Lecture seule : Oui
Outils de Schéma
schema_list_collections
Lister toutes les collections de contenu définies dans le CMS. Renvoie le slug, le label, les fonctionnalités prises en charge et les timestamps.
Aucun paramètre.
Scope : schema:read | Rôle minimum : Editor | Lecture seule : Oui
schema_get_collection
Obtenir des informations détaillées sur une collection incluant toutes les définitions de champ. Les champs décrivent le modèle de données : nom, type, contraintes et règles de validation. Utilisez ceci pour comprendre ce que content_create et content_update attendent.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
slug | string | Oui | Slug de collection (ex. posts) |
Scope : schema:read | Rôle minimum : Editor | Lecture seule : Oui
schema_create_collection
Créer une nouvelle collection de contenu. Cela crée une table de base de données et une définition de schéma. Le slug doit être alphanumérique en minuscules avec des underscores, commençant par une lettre.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
slug | string | Oui | Identifiant unique (/^[a-z][a-z0-9_]*$/) |
label | string | Oui | Nom d’affichage (pluriel, ex. “Articles de Blog”) |
labelSingular | string | Non | Nom d’affichage singulier |
description | string | Non | Description de cette collection |
icon | string | Non | Nom d’icône pour l’interface d’administration |
supports | string[] | Non | Fonctionnalités : drafts, revisions, preview, scheduling, search (par défaut : ['drafts', 'revisions']) |
Scope : schema:write | Rôle minimum : Admin
schema_delete_collection
Supprimer une collection et sa table de base de données. C’est irréversible et supprime tout le contenu de la collection.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
slug | string | Oui | Slug de collection à supprimer |
force | boolean | Non | Forcer la suppression même si la collection a du contenu |
Scope : schema:write | Rôle minimum : Admin | Destructif : Oui
schema_create_field
Ajouter un nouveau champ au schéma d’une collection. Cela ajoute une colonne à la table de base de données.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
slug | string | Oui | Identifiant de champ (/^[a-z][a-z0-9_]*$/) |
label | string | Oui | Nom d’affichage |
type | string | Oui | Type de données (voir ci-dessous) |
required | boolean | Non | Si le champ est requis |
unique | boolean | Non | Si les valeurs doivent être uniques |
defaultValue | any | Non | Valeur par défaut pour les nouveaux éléments |
validation | object | Non | Contraintes : min, max, minLength, maxLength, pattern, options |
options | object | Non | Configuration du widget : collection (pour les références), rows (pour textarea) |
searchable | boolean | Non | Inclure dans l’index de recherche plein texte |
translatable | boolean | Non | Si ce champ est traduisible (par défaut true) |
Types de champ : string, text, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug.
Pour les types select et multiSelect, fournissez les valeurs autorisées dans validation.options.
Scope : schema:write | Rôle minimum : Admin
schema_delete_field
Supprimer un champ d’une collection. Cela supprime la colonne et toutes les données dans ce champ. Irréversible.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
fieldSlug | string | Oui | Slug de champ à supprimer |
Scope : schema:write | Rôle minimum : Admin | Destructif : Oui
Outils Multimédias
media_list
Lister les fichiers multimédias téléchargés avec filtrage optionnel par type MIME et pagination.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
mimeType | string | Non | Filtrer par préfixe de type MIME (ex. image/, application/pdf) |
limit | integer | Non | Max. d’éléments (1-100, par défaut 50) |
cursor | string | Non | Curseur de pagination |
Scope : media:read | Lecture seule : Oui
media_create
Enregistrer un fichier multimédia qui a déjà été téléchargé vers le stockage. L’appelant est responsable de placer le fichier à storageKey (typiquement en utilisant une URL de téléchargement signée de l’interface d’administration ou d’une API séparée). Cet outil persiste l’enregistrement de métadonnées pour que le fichier soit découvrable via media_list / media_get et puisse être référencé par du contenu.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
filename | string | Oui | Nom de fichier original (ex. logo.png) |
mimeType | string | Oui | Type MIME (ex. image/png) |
storageKey | string | Oui | Chemin/clé de stockage où le fichier a été téléchargé |
size | integer | Non | Taille du fichier en octets |
width | integer | Non | Largeur de l’image en pixels |
height | integer | Non | Hauteur de l’image en pixels |
contentHash | string | Non | Hash du contenu du fichier (pour la déduplication) |
blurhash | string | Non | Blurhash pour les espaces réservés d’image |
dominantColor | string | Non | Chaîne de couleur hexadécimale pour la couleur dominante de l’image |
Scope : media:write | Rôle minimum : Author
media_get
Obtenir les détails d’un seul fichier multimédia par ID. Renvoie les métadonnées incluant le nom de fichier, le type MIME, la taille, les dimensions, le texte alt et l’URL.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | string | Oui | ID d’élément multimédia |
Scope : media:read | Lecture seule : Oui
media_update
Mettre à jour les métadonnées d’un fichier multimédia téléchargé. Le fichier lui-même ne peut pas être modifié.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | string | Oui | ID d’élément multimédia |
alt | string | Non | Texte alternatif pour l’accessibilité |
caption | string | Non | Texte de légende |
width | integer | Non | Largeur de l’image en pixels |
height | integer | Non | Hauteur de l’image en pixels |
Scope : media:write
media_delete
Supprimer définitivement un fichier multimédia. Supprime l’enregistrement de base de données et le fichier du stockage. Le contenu référençant ce média aura des références brisées.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | string | Oui | ID d’élément multimédia |
Scope : media:write | Destructif : Oui
Outil de Recherche
search
Recherche plein texte à travers les collections de contenu. Les collections doivent avoir search dans leur liste supports et les champs doivent être marqués comme searchable.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
query | string | Oui | Texte de requête de recherche |
collections | string[] | Non | Limiter la recherche à des slugs de collection spécifiques |
locale | string | Non | Filtrer les résultats par locale |
limit | integer | Non | Max. de résultats (1-50, par défaut 20) |
Scope : content:read | Lecture seule : Oui
Outils de Taxonomie
taxonomy_list
Lister toutes les définitions de taxonomie (ex. catégories, étiquettes). Renvoie le nom, le label, si hiérarchique et les collections associées.
Aucun paramètre.
Scope : content:read | Lecture seule : Oui
taxonomy_list_terms
Lister les termes dans une taxonomie avec pagination.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
taxonomy | string | Oui | Nom de taxonomie (ex. categories, tags) |
limit | integer | Non | Max. d’éléments (1-100, par défaut 50) |
cursor | string | Non | Curseur de pagination |
Scope : content:read | Lecture seule : Oui
taxonomy_create_term
Créer un nouveau terme dans une taxonomie. Pour les taxonomies hiérarchiques, spécifiez un parentId pour créer un terme enfant. La chaîne d’ancêtres du parent ne doit pas dépasser 100 niveaux.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
taxonomy | string | Oui | Nom de taxonomie |
slug | string | Oui | Identifiant sécurisé pour URL |
label | string | Oui | Nom d’affichage |
parentId | string | Non | ID de terme parent (pour taxonomies hiérarchiques) |
description | string | Non | Description du terme |
Scope : taxonomies:manage | Rôle minimum : Editor
taxonomy_update_term
Mettre à jour un terme existant dans une taxonomie. Tout champ peut être omis pour le laisser inchangé. Renommer un slug ne doit pas entrer en collision avec un autre terme dans la même taxonomie. Définir parentId à null pour détacher d’un parent. Le nouveau parent doit exister, appartenir à la même taxonomie et ne pas introduire de cycle.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
taxonomy | string | Oui | Nom de taxonomie |
termSlug | string | Oui | Slug actuel du terme à mettre à jour |
slug | string | Non | Nouveau slug (doit être unique dans la taxonomie) |
label | string | Non | Nouveau nom d’affichage |
parentId | string | null | Non | Nouvel ID de terme parent ; null pour détacher |
description | string | Non | Nouvelle description |
Scope : taxonomies:manage | Rôle minimum : Editor
taxonomy_delete_term
Supprimer définitivement un terme d’une taxonomie. Tout contenu étiqueté avec le terme perd l’association. Ne peut pas supprimer un terme qui a des enfants — supprimez d’abord les enfants.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
taxonomy | string | Oui | Nom de taxonomie |
termSlug | string | Oui | Slug du terme à supprimer |
Scope : taxonomies:manage | Rôle minimum : Editor | Destructif : Oui
Outils de Menu
menu_list
Lister les menus de navigation. Les menus sont par locale : passez locale pour ne renvoyer que les lignes d’une locale, ou omettez-le pour lister chaque variante de locale.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
locale | string | Non | Filtrer par locale (omettre pour toutes les variantes de locale) |
Scope : content:read | Lecture seule : Oui
menu_get
Obtenir un menu par nom incluant tous ses éléments dans l’ordre. Les éléments ont un label, une URL, un type et un parent optionnel pour l’imbrication. Lorsque le même nom de menu existe dans plusieurs locales, passez locale pour résoudre la traduction prévue.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom de menu (ex. main, footer) |
locale | string | Non | Locale pour résoudre le menu |
Scope : content:read | Lecture seule : Oui
menu_create
Créer un nouveau menu de navigation. Le name est l’identifiant stable utilisé par les modèles de site ; label est le nom lisible par l’humain affiché dans l’admin. Les menus sont par locale, donc passez locale lorsque le même nom de menu existe dans plusieurs traductions. Ajoutez des éléments après avec menu_set_items. Si translationOf est défini, locale doit aussi être défini.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Identifiant stable (/^[a-z][a-z0-9_]*$/) |
label | string | Oui | Nom d’affichage pour l’admin |
locale | string | Non | Locale pour ce menu (ex. fr-fr) |
translationOf | string | Non | ID de menu existant à partir duquel créer cette variante de locale |
Scope : menus:manage | Rôle minimum : Editor
menu_update
Mettre à jour le label d’un menu. Le name (identifiant stable) ne peut pas être changé. Sur les installations multi-locales, passez locale pour que la bonne traduction soit mise à jour.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom de menu à mettre à jour |
label | string | Oui | Nouveau label d’affichage |
locale | string | Non | Locale du menu à mettre à jour |
Scope : menus:manage | Rôle minimum : Editor
menu_delete
Supprimer un menu et tous ses éléments. Ne peut pas être annulé. Sur les installations multi-locales, passez locale pour que seule la traduction prévue soit supprimée.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom de menu à supprimer |
locale | string | Non | Locale du menu à supprimer |
Scope : menus:manage | Rôle minimum : Editor | Destructif : Oui
menu_set_items
Remplacer la liste complète des éléments d’un menu en un seul appel. Atomique : les éléments existants sont supprimés et la nouvelle liste est insérée dans l’ordre fourni. Utilisez ceci plutôt que des opérations d’ajout/suppression par élément pour que l’ordre résultant et les liens parent soient sans ambiguïté. Sur les installations multi-locales, passez locale pour que seule la traduction prévue soit réécrite.
Les éléments sont positionnés par index de tableau. L’imbrication est exprimée via parentIndex — un élément avec parentIndex: 0 est imbriqué sous l’élément à l’index 0. Le parent doit apparaître plus tôt dans la liste. Les éléments sans parentIndex sont de premier niveau.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom de menu à mettre à jour |
locale | string | Non | Locale du menu à réécrire |
items | MenuItem[] | Oui | Liste ordonnée d’éléments de menu (voir ci-dessous) |
Chaque MenuItem a :
| Champ | Type | Requis | Description |
|---|---|---|---|
label | string | Oui | Texte d’affichage de l’élément |
type | string | Oui | Un de custom, page, post, taxonomy, collection |
customUrl | string | Non | URL pour les éléments type: "custom" (ignoré sinon) |
referenceCollection | string | Non | Slug de collection cible pour les références de contenu |
referenceId | string | Non | ID de contenu / terme cible pour les références |
titleAttr | string | Non | Attribut HTML title |
target | string | Non | Attribut HTML target (ex. _blank) |
cssClasses | string | Non | Classes CSS séparées par des espaces |
parentIndex | integer | Non | Index de tableau de l’élément parent. Omettre pour les éléments de premier niveau. |
Scope : menus:manage | Rôle minimum : Editor
Outils de Révision
revision_list
Lister l’historique de révision pour un élément de contenu, le plus récent en premier. Nécessite que la collection prenne en charge revisions.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
collection | string | Oui | Slug de collection |
id | string | Oui | ID d’élément de contenu ou slug |
limit | integer | Non | Max. de révisions (1-50, par défaut 20) |
Scope : content:read | Lecture seule : Oui
revision_restore
Restaurer un élément de contenu à une révision antérieure. Remplace le brouillon actuel par les données de la révision spécifiée. Non publié automatiquement — utilisez content_publish après si nécessaire.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
revisionId | string | Oui | ID de révision à restaurer |
Scope : content:write
Outils de Paramètres
Paramètres du site — titre, slogan, logo, favicon, URL canonique, taille de page par défaut, formatage de date et heure, identifiants sociaux et valeurs par défaut SEO.
settings_get
Obtenir tous les paramètres du site. Les références multimédias (logo, favicon, seo.defaultOgImage) incluent des URLs résolues à côté de la mediaId sous-jacente. Les valeurs non définies sont omises de la réponse.
Aucun paramètre.
Scope : settings:read | Rôle minimum : Editor | Lecture seule : Oui
settings_update
Mettre à jour un ou plusieurs paramètres du site. Mise à jour partielle : seuls les champs fournis sont modifiés ; les champs omis sont laissés tels quels. Renvoie l’objet de paramètres complet après la mise à jour.
Pour définir une référence multimédia (logo, favicon, seo.defaultOgImage), passez un objet avec mediaId (et alt optionnel). L’élément multimédia doit déjà exister — utilisez d’abord media_create.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
title | string | Non | Titre du site |
tagline | string | Non | Brève description affichée à côté du titre |
logo | MediaRef | Non | Référence multimédia de logo ({ mediaId, alt? }) |
favicon | MediaRef | Non | Référence multimédia de favicon |
url | string | Non | URL canonique du site (http ou https). Chaîne vide l’efface. |
postsPerPage | integer | Non | Taille de page par défaut pour les listes de contenu (1-100) |
dateFormat | string | Non | Chaîne de token de format de date |
timezone | string | Non | Identifiant de fuseau horaire IANA |
social | object | Non | Identifiants sociaux — twitter, github, facebook, instagram, linkedin, youtube |
seo | object | Non | Valeurs par défaut SEO (voir ci-dessous) |
L’objet seo accepte :
| Champ | Type | Description |
|---|---|---|
titleSeparator | string | Séparateur entre le titre de page et le titre du site (ex. " | " pour une barre verticale) |
defaultOgImage | MediaRef | Image Open Graph par défaut quand le contenu n’en a pas |
robotsTxt | string | Corps personnalisé de robots.txt. Omettre pour utiliser le défaut EmDash. |
googleVerification | string | Token de vérification Google Search Console |
bingVerification | string | Token de vérification Bing Webmaster Tools |
Scope : settings:manage | Rôle minimum : Admin
Découverte OAuth
La plupart des clients MCP gèrent cela pour vous ; cette section est pour construire un client MCP contre EmDash directement. Les clients qui prennent en charge OAuth 2.1 découvrent comment s’authentifier à partir de deux documents de métadonnées que le serveur publie :
Métadonnées de Ressource Protégée
Demandez les métadonnées de ressource protégée au point de terminaison suivant :
GET /.well-known/oauth-protected-resource
Le serveur répond avec l’identifiant de ressource, son serveur d’autorisation et les scopes pris en charge :
{
"resource": "https://example.com/_emdash/api/mcp",
"authorization_servers": ["https://example.com/_emdash"],
"scopes_supported": [
"content:read", "content:write",
"media:read", "media:write",
"schema:read", "schema:write",
"taxonomies:manage", "menus:manage",
"settings:read", "settings:manage",
"admin"
],
"bearer_methods_supported": ["header"]
}
Métadonnées du Serveur d’Autorisation
Demandez les métadonnées du serveur d’autorisation au point de terminaison suivant :
GET /.well-known/oauth-authorization-server/_emdash
Le serveur répond avec les points de terminaison, les scopes et les types de grant qu’il prend en charge :
{
"issuer": "https://example.com/_emdash",
"authorization_endpoint": "https://example.com/_emdash/oauth/authorize",
"token_endpoint": "https://example.com/_emdash/api/oauth/token",
"scopes_supported": ["content:read", "content:write", "..."],
"response_types_supported": ["code"],
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:device_code"
],
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["none"],
"device_authorization_endpoint": "https://example.com/_emdash/api/oauth/device/code"
}
Lorsqu’une requête non authentifiée atteint le point de terminaison MCP, le serveur renvoie :
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource"
Cela déclenche le flux de découverte standard du client MCP.
Gestion des Erreurs
Les erreurs d’outil sont renvoyées sous forme de contenu texte avec isError: true. Le message est préfixé avec un [CODE] stable, et le même code est répété dans _meta.code :
{
"content": [{ "type": "text", "text": "[NOT_FOUND] Collection 'nonexistent' not found" }],
"isError": true,
"_meta": { "code": "NOT_FOUND" }
}
Les erreurs de scope et de permissions utilisent la même enveloppe d’erreur d’outil :
{
"content": [
{ "type": "text", "text": "[INSUFFICIENT_SCOPE] Insufficient scope: requires content:write" }
],
"isError": true,
"_meta": { "code": "INSUFFICIENT_SCOPE" }
}
Les erreurs au niveau transport (mauvaise configuration du serveur, exceptions non gérées) renvoient le code d’erreur JSON-RPC -32603 (Internal error) sans divulguer les détails d’implémentation.