Ceci est la référence du protocole. Si vous souhaitez simplement pointer Claude ou ChatGPT vers votre moteur et commencer à l'utiliser, connecter votre agent est la page qu'il vous faut — elle couvre le côté client. Celle-ci couvre ce qui se passe en dessous.

Le point de terminaison

POST https://your-host/mcp

Une seule URL, sur la même origine que le tableau de bord et l'API REST. Le transport est HTTP streamable avec JSON-RPC 2.0 via POST ; il n'y a pas de point de terminaison SSE séparé à configurer.

Version du protocole2025-06-18
Nom du serveurfastsite
Capacitéstools
Méthodesinitialize, ping, tools/list, tools/call

Tout le reste renvoie -32601. Les notifications répondent 202 sans corps. Les lots sont acceptés jusqu'à 20 messages.

Les échecs d'outil sont des résultats, pas des erreurs de protocole

Lorsqu'un outil échoue — un site manquant, un fichier shell rejeté, une erreur de validation — vous obtenez un résultat normal avec isError: true et un message lisible par un humain, et non une erreur JSON-RPC. C'est délibéré : un modèle peut lire le message et se corriger, ce qu'il ne peut pas faire avec un échec au niveau du transport.

Authentification

OAuth 2.1, client public, PKCE requis. Un client qui n'a jamais vu votre moteur auparavant peut découvrir et compléter l'ensemble du flux par lui-même — rien n'est pré-enregistré manuellement.

  1. Le client envoie un POST à /mcp sans jeton et reçoit 401 ainsi qu'un en-tête WWW-Authenticate indiquant l'URL des métadonnées de la ressource.
  2. Il récupère /.well-known/oauth-protected-resource, qui pointe vers le serveur d'autorisation.
  3. Il récupère /.well-known/oauth-authorization-server pour les points de terminaison et les portées prises en charge.
  4. Il s'enregistre à POST /oauth/register et reçoit un client_id. Aucun secret n'est émis.
  5. Il ouvre /oauth/authorize dans un navigateur. Vous vous connectez avec votre compte moteur habituel et approuvez les portées demandées.
  6. Il échange le code à /oauth/token contre un jeton d'accès et un jeton de rafraîchissement.
  7. Il appelle /mcp avec Authorization: Bearer ….
Code d'autorisation60 secondes, usage unique
Jeton d'accès1 heure
Jeton de rafraîchissement30 jours, renouvelé à chaque utilisation
PKCES256 uniquement — plain est rejeté

Les jetons de rafraîchissement sont renouvelés, et la réutilisation d'un jeton déjà renouvelé est traitée comme un vol : toute la famille de jetons est révoquée et le client doit s'autoriser à nouveau. Les codes et jetons sont stockés sous forme hachée, jamais en clair.

Les clients doivent demander les portées explicitement

Il n'y a pas de portée définie par défaut. Une demande d'autorisation qui omet entièrement scope est rejetée avec invalid_scope plutôt que de se voir accorder un minimum sûr. Si vous écrivez un client, demandez exactement ce dont vous avez besoin — l'écran de consentement affiche à l'utilisateur une description en langage courant de chacune.

Ce à quoi un jeton peut accéder

Les portées décident quel type d'opération est autorisé. Votre compte décide à quels sites cela s'applique.

Un jeton porte les portées que vous avez approuvées. Chaque outil limité aux sites vérifie ensuite l'accès de l'utilisateur connecté à ce site — appartenance directe, appartenance à l'équipe du site, ou rôle d'administrateur. Un agent connecté à votre compte peut accéder aux sites auxquels vous pouvez accéder, et rien d'autre. L'octroi de content:write n'élargit pas cela ; il détermine seulement ce que l'agent peut faire sur les sites que vous possédez déjà.

Le vocabulaire des portées est partagé avec les clés API, de sorte qu'un outil et un point de terminaison appliquent la même chose. La liste complète se trouve sur la page de l'API REST.

Outils

Plus de cinquante, couvrant tout ce que fait le tableau de bord. tools/list est le catalogue de référence pour votre version — voici sa structure.

Contenu

list_posts, get_post, create_post, create_page, update_post, delete_content, restore_content, purge_content, list_trash, fact_check

Médias

list_media, upload_media_from_url, delete_media, restore_media, purge_media

Shell et design

shell_list_files, shell_get_file, shell_put_file, shell_snapshot, shell_restore, list_components, upsert_component, delete_component

Localisation

add_language, remove_language, translate_site

Publication

publish_site, preview_site, get_build_status, list_jobs

Sites et routage

list_sites, create_site, update_site, list_redirects, upsert_redirect, delete_redirect, list_scripts, upsert_script, delete_script

Webhooks et sauvegardes

list_webhooks, create_webhook, webhook_deliveries, backup_site, list_backups, restore_backup

Équipes et identifiants

list_teams, create_team, invite_member, accept_invite, et les outils d'identifiants GitHub utilisés pour la publication

La restauration du moteur est délibérément absente. La reprise après sinistre est une commande que vous exécutez sur la machine avec les workers arrêtés, et non quelque chose qu'un agent peut déclencher.

Commencer par le guide

get_authoring_guide est l'outil à appeler en premier, avant de concevoir un shell ou d'écrire un corps. Passez un identifiant de site et il intègre les locales et la syntaxe d'intégration de ce site.

{
  "method": "tools/call",
  "params": {
    "name": "get_authoring_guide",
    "arguments": { "site": "blog" }
  }
}

Il retourne les règles que l'audit de construction applique réellement : HTML corps uniquement, dimensions d'image et texte alternatif requis, la contrainte zéro JavaScript, et la syntaxe d'intégration pour les médias et les composants. Un agent qui le lit d'abord produit du balisage qui se publie ; celui qui devine produit du balisage qui est rejeté.

Création de contenu

{
  "method": "tools/call",
  "params": {
    "name": "create_post",
    "arguments": {
      "site": "blog",
      "title": "Hello, world",
      "body_html": "<p>Shipped by an agent.</p>",
      "status": "published"
    }
  }
}

Les images sont référencées par identifiant de média, jamais par URL externe — upload_media_from_url en importe une et retourne le snippet d'intégration à coller dans le corps. Le texte alternatif est obligatoire.

Si un client ne se connecte pas

  • La découverte renvoie localhost. Le moteur annonce sa propre URL dans les métadonnées OAuth. Si APP_URL est encore la valeur par défaut, un client distant est invité à s'autoriser auprès de localhost et échoue à l'enregistrement. Définissez APP_URL sur l'URL publique réelle.
  • Le point de terminaison doit être accessible et HTTPS. Les clients distants ne lanceront pas un flux OAuth en HTTP simple vers un hôte non-loopback.
  • Vérifiez d'abord le 401. Un POST /mcp non authentifié correct renvoie 401 avec un en-tête WWW-Authenticate. S'il renvoie autre chose, le problème est en amont du moteur, pas dans le client.
  • Les clients stdio uniquement ont besoin d'un pont. Pointez-les vers npx mcp-remote https://your-host/mcp.

Vous préférez les appels HTTP simples ? L'API REST couvre les mêmes opérations avec une clé API au lieu d'un jeton.