Plan de contrôle
Accès MCP production et stdio local au plan de contrôle pour clients MCP et automatisations.
Vue D'Ensemble
Yayaw expose un plan de contrôle production via MCP. Codex est un client pris en charge, mais l'endpoint est conçu pour tout client MCP ou runner d'automatisation de confiance.
- La production et le staging utilisent Streamable HTTP sur
/api/mcp. - Le développement local peut utiliser stdio avec
bun --conditions react-server --env-file=.env src/lib/scripts/mcp/yayaw-mcp-server.ts. - Les requêtes production peuvent s'authentifier avec une clé API Better Auth ou un access token OAuth Better Auth. Les deux chemins utilisent des permissions explicites de plan de contrôle.
- Le réglage de site
control-plane-mcp-enabledest le kill switch serveur. - L'autorisation Yayaw sous-jacente passe toujours par
can(...)ou des checks équivalents de membership borné.
Permissions Du Plan De Contrôle
Les clés API utilisent les permissions Better Auth API key sous la ressource
control-plane:
read: statut, discovery, ressources, outils list/get.write: mutations brouillon/données/média/design-token.publish: outils de cycle de vie publish/archive.admin: administration d'audit et de feature flags.
admin ne contourne pas l'autorisation de ressource Yayaw. Il satisfait
seulement la porte de permission du plan de contrôle.
Connexion MCP Production
Créez une clé MCP production, stockez-la dans l'environnement du client comme
YAYAW_MCP_API_KEY, puis configurez le client MCP. Codex peut utiliser:
[mcp_servers.yayaw-prod]
url = "https://yayaw.app/api/mcp"
bearer_token_env_var = "YAYAW_MCP_API_KEY"Avant la connexion, activez le réglage de site:
bun run seedPuis passez control-plane-mcp-enabled à true depuis les réglages Admin ou
avec l'outil de flag du plan de contrôle en utilisant une clé admin existante.
Connexion MCP OAuth
Yayaw expose aussi une discovery OAuth 2.1 compatible MCP pour ChatGPT Apps et les autres clients qui suivent le flux d'autorisation MCP. OAuth supporte authorization code avec PKCE et refresh tokens; l'accès machine-to-machine doit continuer à utiliser les clés API MCP.
- Métadonnées de ressource protégée:
/.well-known/oauth-protected-resource/api/mcp - Métadonnées du serveur d'autorisation:
/.well-known/oauth-authorization-server/api/auth - Métadonnées OpenID:
/.well-known/openid-configuration/api/auth - Base du serveur d'autorisation:
/api/auth - Ressource/audience MCP:
/api/mcp
L'endpoint MCP renvoie un challenge WWW-Authenticate sur les requêtes OAuth
non authentifiées ou invalides afin que les clients découvrent les métadonnées
de ressource protégée. Les tokens OAuth sont vérifiés avec le JWKS Better Auth,
l'issuer, l'audience, l'expiration et les scopes de plan de contrôle avant
l'exécution d'un outil.
Le fournisseur OAuth annonce volontairement toute la surface de permissions MCP:
control-plane:read control-plane:write control-plane:publish control-plane:adminCela garde la surface d'outils MCP inchangée pour les clients liés de confiance. Les handlers appliquent toujours la permission de plan de contrôle requise et l'autorisation Yayaw sous-jacente pour chaque opération; les scopes OAuth ne remplacent donc jamais l'autorisation applicative.
Pour les ChatGPT Apps publiées, vérifiez que NEXT_PUBLIC_BASE_URL est
l'origine HTTPS publique avant de générer les métadonnées. ChatGPT redirige vers
https://chatgpt.com/connector/oauth/{callback_id}; le client OAuth enregistré
doit autoriser cette redirect URI.
Connexion MCP Locale
Le stdio local est utile en développement et ne nécessite pas d'ouvrir un endpoint public. Codex peut l'enregistrer avec:
codex mcp add yayaw-local -- bun --conditions react-server --env-file=.env src/lib/scripts/mcp/yayaw-mcp-server.tsPour le stdio local, définissez YAYAW_MCP_API_KEY pour tester une vérification
de clé API comme en production. Sans clé, le lanceur crée un acteur de
développement local avec YAYAW_MCP_LOCAL_USER_ID ou local-codex.
Gestion Des Clés
Pour une clé opérateur MCP totalement de confiance, utilisez l'ensemble complet de permissions:
control-plane:read,write,publish,adminLa page Developer settings du dashboard utilise le bloc de clé API custom Yayaw
plutôt que l'UI Better Auth générique, parce que Better Auth traite les
permissions de clés API comme des champs server-only. Utilisez ce bloc pour
créer des clés MCP avec scopes explicites ou réparer une clé existante avec le
preset Full MCP access. Le preset écrit:
control-plane:read,write,publish,adminL'UI peut mettre à jour les permissions d'une clé existante sans révéler ou faire tourner le secret. Utilisez cela seulement lorsque le secret actuel est déjà stocké en sécurité, parce que Better Auth n'affiche le secret qu'une fois.
Les clés détenues par l'organisation sont le choix par défaut pour les clients MCP qui opèrent sur un périmètre client/workspace. Elles sont émises pour l'organisation active, gérables par les propriétaires, admins et managers Better Auth, portent des métadonnées d'émetteur et sont limitées à leur organisation pour les opérations bornées sur pages, données CMS et médias.
Les clés personnelles sont superadmin-only et destinées à l'administration globale de Yayaw. Utilisez-les pour le contenu global, les feature flags ou les opérations inter-organisations uniquement lorsque c'est intentionnel.
Émettre une clé API MCP détenue par utilisateur:
bun run mcp:key -- issue --email admin@example.com --permissions read,write,publish,adminÉmettre une clé API MCP détenue par organisation:
bun run mcp:key -- issue --email owner@example.com --organization-slug acme --permissions read,write,publish,adminLister les clés d'un utilisateur et leurs permissions stockées:
bun run mcp:key -- list --email admin@example.comLister les clés d'une organisation et leurs permissions stockées:
bun run mcp:key -- list --organization-slug acmeInspecter une clé par id:
bun run mcp:key -- inspect --key-id <api-key-id>Inspecter le secret configuré pour un client MCP local:
YAYAW_MCP_API_KEY=<secret> bun run mcp:key -- inspect --token-env YAYAW_MCP_API_KEYRévoquer une clé:
bun run mcp:key -- revoke --key-id <api-key-id>La commande issue affiche le secret une seule fois. Stockez-le dans un
gestionnaire de secrets ou l'environnement du client MCP local; ne le commitez
pas.
Outils
Noyau:
yayaw_capabilitiesyayaw_statusyayaw_audit_listyayaw_deploy_status
CMS et pages:
yayaw_pages_list,yayaw_pages_get,yayaw_pages_validate,yayaw_pages_diffyayaw_pages_save_draft,yayaw_pages_publish,yayaw_pages_archiveyayaw_pages_create_draftyayaw_components_list,yayaw_component_get,yayaw_component_importyayaw_components_sync_registry,yayaw_component_recompileyayaw_component_publish,yayaw_component_deleteyayaw_sections_list,yayaw_sections_get,yayaw_sections_create_draftyayaw_sections_validate,yayaw_sections_save_draftyayaw_sections_publish,yayaw_sections_archiveyayaw_kibo_sections_generateyayaw_cms_page_designyayaw_data_models_list,yayaw_data_schema_get,yayaw_data_entry_getyayaw_data_entry_upsert,yayaw_data_entry_publishyayaw_email_templates_list,yayaw_email_template_getyayaw_email_template_save,yayaw_email_templates_sync_systemyayaw_org_domains_list,yayaw_org_domain_add,yayaw_org_domain_checkyayaw_org_domain_set_primary,yayaw_org_domain_archive
Opérations site:
yayaw_billing_products_list,yayaw_billing_product_updateyayaw_stripe_discounts_list,yayaw_stripe_discounts_syncyayaw_media_list,yayaw_media_generateyayaw_design_tokens_get,yayaw_design_tokens_saveyayaw_flags_list,yayaw_flags_update
Lors de l'ajout d'un outil, préférez une implémentation service-layer réutilisable par les server actions UI ou les scripts. Les handlers doivent rester fins: valider l'entrée, vérifier les permissions, appeler le service partagé et écrire l'audit.
Ressources
yayaw://statusyayaw://schemasyayaw://pages/{scope}/{slug}yayaw://data/{scope}/{modelSlug}/{entrySlug}yayaw://email-templates/{slug}yayaw://audit/recent
Les workflows facturation, remises, médias, design tokens, feature flags et
domaines d'organisation sont exposés comme outils plutôt que comme ressources
MCP. Les lectures de pages et données scopées organisation doivent utiliser les
outils lorsqu'un orgId explicite est requis.
Règles De Sécurité
Les écritures production exigent tout ce qui suit:
control-plane-mcp-enabledest activé.- Une clé API Better Auth valide ou un access token OAuth est fourni comme
Authorization: Bearer <token>. - La clé ou le token OAuth a la permission de plan de contrôle requise.
- L'acteur passe les checks d'autorisation de ressource Yayaw sous-jacents.
- L'entrée de l'outil inclut
reason.
Les clés détenues par l'organisation sont en plus limitées à leur organisation
pour les opérations contenu/média bornées. Les clés personnelles nécessitent
toujours la permission seedée Yayaw apikey:manage pour être émises depuis le
dashboard.
Les outils de domaines publics d'organisation suivent la même frontière
d'organisation. Les clés d'organisation opèrent uniquement sur leur
organisation; les clés personnelles doivent passer un orgId explicite. Les
mutations de domaines exigent organization:update ou
organization-settings:manage, un reason, et utilisent dryRun pour le
prévol. PUBLIC_DOMAIN_PROVIDER=vercel attache le hostname au projet Vercel
partagé, lit les enregistrements DNS recommandés et vérifie les challenges de
propriété Vercel. PUBLIC_DOMAIN_PROVIDER=manual-dns génère un token TXT de
propriété et vérifie le DNS public pour le TXT attendu plus les indications
CNAME/A configurées.
yayaw_deploy_status renvoie des métadonnées de déploiement neutres vis-à-vis
du fournisseur. Sur Vercel, il expose les champs runtime Vercel; sur les
déploiements auto-hébergés, il expose les valeurs statiques DEPLOYMENT_URL,
DEPLOYMENT_ENV, DEPLOYMENT_GIT_COMMIT_SHA et DEPLOYMENT_GIT_COMMIT_REF
lorsqu'elles sont configurées.
Les écritures de composants sont des imports catalogue ou recompilations en base depuis des snapshots source stockés. Les outils MCP composants ne mutent jamais les fichiers du dépôt en production et n'exécutent jamais de source stockée en base au runtime.
Les outils de sections réutilisables et de design de page CMS créent d'abord des
brouillons. yayaw_cms_page_design peut assembler composants brouillon,
ressources, sections et page depuis un prompt avec dryRun=false, mais ne
publie pas. Utilisez les outils publish de section et page après validation des
diagnostics et demande explicite de publication.
yayaw_kibo_sections_generate crée ou met à jour des recettes CMS natives
kibo-ui-block pour le catalogue Kibo UI suivi. Il ne stocke jamais du TSX tiers
arbitraire comme contenu exécutable au runtime: chaque section générée est une
section recipe Yayaw rendue par des exemples Kibo présents dans le dépôt et
leurs dépendances Kibo/shadcn vendored. Les recettes générées exposent des props
éditables texte, lien, média et listes JSON afin que les pages lient du contenu
Yayaw localisé via PageSection.inputBindings pendant que les défauts Kibo
restent le repli de prévisualisation. Utilisez dryRun=true pour inspecter les
slugs cibles et publish=true seulement lorsque l'appelant veut explicitement
publier les révisions validées.
Les outils de publication/archive de page, publication d'entrée de données et
publication de section exigent expectedRevisionId pour préserver le
verrouillage optimiste. L'archive de section accepte expectedRevisionId lorsque
l'appelant connaît la dernière révision. Les outils d'archive destructeurs, y
compris page, section, composant et domaine public d'organisation, exigent
confirm: true.
Chaque appel d'outil MCP tente d'écrire control_plane_audit_events avec
acteur, clé API, opération, cible, environnement, transport, état dry-run,
raison, statut, résumé d'erreur et métadonnées de résultat. Une insertion
d'audit réussie renvoie auditId dans la réponse de l'outil; si le stockage
d'audit est indisponible, le serveur journalise l'échec et renvoie la réponse
sans auditId.
Contrat Des Futures Fonctionnalités
Les nouvelles fonctionnalités opérationnelles doivent être conçues comme opérables par le plan de contrôle sauf exclusion volontaire UI-only.
Lorsqu'une fonctionnalité nécessite des workflows de contenu, configuration, publication, statut ou audit, implémentez-la avec le pattern partagé du plan de contrôle:
- Placez la logique métier dans un point d'entrée service réutilisable qui accepte un argument acteur/contexte explicite.
- Gardez les lectures de cookie-session dans les adaptateurs UI, pas dans la couche service réutilisable.
- Faites appeler la même logique permissionnée par les server actions UI, outils MCP, scripts CLI et API HTTP optionnelles.
- Enregistrez des outils/ressources MCP typés dans
src/lib/server/services/control-planelorsque les clients MCP doivent opérer ou inspecter la fonctionnalité. - Exigez
reasonpour les écritures,dryRunlorsque c'est pratique,expectedRevisionIdpour les flux publish optimistes etconfirm: truepour les actions destructrices. - Gatez l'accès par clé API avec les permissions Better Auth
control-plane:*et exécutez quand même l'autorisation Yayaw aveccan(...)ou des checks de membership borné. - Tentez l'enregistrement d'événements d'audit pour toutes les opérations et
exposez
auditIdlorsque le stockage réussit. - Mettez à jour cette documentation et
content/llm/llm-source.md, puis régénérez les fichiers assistants avecbun run docs:llm:generate. - Ajoutez des tests ciblés pour schémas, mapping de permissions, gardes dry-run/write, insertion d'audit et couverture smoke discovery MCP ou appel d'outil.
Si une fonctionnalité est volontairement exclue de MCP/CLI, documentez la raison dans les docs de fonctionnalité ou le résumé de PR.
Validation
Checks utiles après des changements du plan de contrôle:
bun test src/lib/server/services/control-plane/control-plane.test.ts
bun test src/lib/server/services/control-plane/oauth-metadata.test.ts
bun run mcp:stdio