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 protocole | 2025-06-18 |
|---|---|
| Nom du serveur | fastsite |
| Capacités | tools |
| Méthodes | initialize, 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.
- Le client envoie un
POSTà/mcpsans jeton et reçoit401ainsi qu'un en-têteWWW-Authenticateindiquant l'URL des métadonnées de la ressource. - Il récupère
/.well-known/oauth-protected-resource, qui pointe vers le serveur d'autorisation. - Il récupère
/.well-known/oauth-authorization-serverpour les points de terminaison et les portées prises en charge. - Il s'enregistre à
POST /oauth/registeret reçoit unclient_id. Aucun secret n'est émis. - Il ouvre
/oauth/authorizedans un navigateur. Vous vous connectez avec votre compte moteur habituel et approuvez les portées demandées. - Il échange le code à
/oauth/tokencontre un jeton d'accès et un jeton de rafraîchissement. - Il appelle
/mcpavecAuthorization: Bearer ….
| Code d'autorisation | 60 secondes, usage unique |
|---|---|
| Jeton d'accès | 1 heure |
| Jeton de rafraîchissement | 30 jours, renouvelé à chaque utilisation |
| PKCE | S256 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_URLest encore la valeur par défaut, un client distant est invité à s'autoriser auprès delocalhostet échoue à l'enregistrement. DéfinissezAPP_URLsur 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 /mcpnon authentifié correct renvoie401avec un en-têteWWW-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.