Hooks agents et abilities

Disponible dans :Free

Ces hooks entourent la surface agents IA de HappenBoard : les abilities qui permettent à un agent IA de lire et de modifier vos événements via l’API Abilities de WordPress. Les clients IA les appellent par le serveur MCP intégré à HappenBoard. Servez-vous-en pour ajouter vos propres abilities derrière les mêmes protections, masquer celles fournies, choisir ce que reçoivent les clients MCP, transmettre la piste d’audit ou régler les limites de débit. Le côté propriétaire du site est décrit dans Les agents IA et l’API Abilities. Si les hooks sont nouveaux pour vous, commencez par Étendre HappenBoard avec les hooks.

Quand les abilities existent

Rien n’est déclaré tant que Expose HappenBoard to AI agents est désactivé dans HappenBoard → Settings → AI agents, ce qui est le cas par défaut. La surface reste aussi fermée quand HAPPENBOARD_DISABLE_ABILITIES vaut true dans wp-config.php, et sur les versions de WordPress sans API Abilities (elle est arrivée avec la 6.9). Dans ces cas, les hooks de déclaration ne se déclenchent jamais et le serveur MCP n’existe pas. Seuls tournent encore le filtre de conservation du journal et les deux contrôles OAuth que lit l’écran de réglages AI agents.

Le propriétaire du site dispose volontairement d’un seul interrupteur. Le développeur qui a besoin d’un contrôle plus fin retire des abilities avec happenboard_registered_abilities.

Ce que reçoit chaque ability

Les abilities déclarées via \HappenBoard\Service\Abilities\Registry::ability(), celles de HappenBoard comme celles de Pro, partagent les mêmes protections :

  • Aucun accès anonyme : un appel sans utilisateur connecté est toujours refusé, même en lecture.
  • Un contrôle de permission : l’utilisateur doit avoir la permission de l’ability, ou manage_options.
  • Une limite de débit par utilisateur : 300 lectures par minute, 60 écritures par minute et 600 écritures par heure.
  • Les abilities marquées destructives, comme les suppressions, exigent "confirm": true dans leurs données d’entrée.
  • Chaque écriture est annoncée sur happenboard_ability_executed et enregistrée dans le journal des agents, appels refusés compris.

Une ability déclarée directement avec wp_register_ability() ne reçoit rien de tout cela.

Appeler une ability en REST

Les clients IA comme Claude ou ChatGPT se connectent par le serveur MCP de HappenBoard, décrit dans la section suivante. Votre propre code et vos scripts peuvent appeler les abilities directement : elles s’exécutent via la route WordPress /wp-json/wp-abilities/v1/abilities/{name}/run, avec un utilisateur connecté (par un mot de passe d’application, par exemple). Toute ability HappenBoard qui n’est pas une écriture est marquée en lecture seule.

Appelez les abilities en lecture seule en GET, avec leurs données d’entrée dans l’URL, par exemple ?input[id]=42. Appelez les écritures en POST, avec un corps JSON { "input": { ... } }. La mauvaise méthode reçoit une erreur HTTP 405.

Les abilities des types de rendez-vous lisent aussi les brouillons. happenboard/create-booking-type crée un brouillon, et happenboard/get-booking-type le renvoie avec son status : un agent peut ainsi relire, configurer et publier ce qu’il vient de créer.

Ce que reçoivent les clients MCP

Le serveur MCP de HappenBoard répond sur POST /wp-json/happenboard/mcp/v1, sans autre extension. Chaque ability devient un outil qui porte son nom, avec __ à la place de la barre oblique : happenboard/list-events devient l’outil happenboard__list-events. Un client se connecte par OAuth ou envoie un mot de passe d’application, et chaque appel passe par les protections de l’ability listées plus haut.

Le serveur réduit la liste des outils dans cet ordre, et chaque étape ne peut que retirer :

  • Seules les abilities déclarées via le Registry, et jamais une ability destructive. Passez 'mcp_public' => false pour tenir l’une des vôtres à l’écart du serveur MCP.
  • Seules les abilities que permettent les permissions de l’utilisateur.
  • Une connexion approuvée en Read only sur l’écran de consentement ne reçoit que les outils de lecture, et se voit refuser un outil d’écriture appelé par son nom.

happenboard_mcp_read_only peut passer toutes les connexions en lecture seule, et happenboard_mcp_served_abilities a le dernier mot sur la liste. Un outil qui n’est pas servi ne peut pas être appelé par son nom. Ces filtres ne changent que le serveur MCP, pas la route REST de WordPress ci-dessus.

Ce que garde le journal des agents

Chaque écriture y laisse une ligne : qui a agi, quelle ability, les données d’entrée avec les secrets remplacés par [redacted], le résultat et l’heure. Une écriture refusée ou en échec garde aussi son code d’erreur et le message reçu par l’agent, dans la langue de cette requête, jusqu’à 255 caractères. Le panneau Agent activity de HappenBoard → Settings → AI agents les affiche. Une écriture refusée faute de permission y apparaît comme Not allowed.

happenboard_register_abilities

Action Free src/Service/Abilities/Bootstrap.php

Se déclenche sur wp_abilities_api_init, après la déclaration des abilities de HappenBoard. Déclarez les vôtres ici pour qu’elles suivent le même interrupteur : quand la surface agents est fermée, ce hook ne se déclenche jamais.

Signature

do_action( 'happenboard_register_abilities' )

Exemple

add_action( 'happenboard_register_abilities', function () {
    \HappenBoard\Service\Abilities\Registry::ability(
        'list-sponsors',
        array(
            'namespace'     => 'acme',
            'label'         => 'List sponsors',
            'description'   => 'Returns the sponsor names attached to an event.',
            'category'      => 'happenboard-events',
            'cap'           => 'happenboard_manage_events',
            'input_schema'  => array(
                'type'       => 'object',
                'properties' => array( 'event_id' => array( 'type' => 'integer' ) ),
                'required'   => array( 'event_id' ),
            ),
            'output_schema' => array( 'type' => 'array', 'items' => array( 'type' => 'string' ) ),
            'execute'       => fn ( $input ) => acme_sponsors_for( (int) $input['event_id'] ),
        )
    );
} );

Remarques

  • Aucun argument. wp_register_ability() et le Registry de HappenBoard sont disponibles ici.
  • Registry::ability( $name, $args ) prend label, description, category, cap, execute, input_schema et output_schema, plus les options namespace (par défaut happenboard), write, destructive et mcp_public.
  • Utilisez votre propre espace de noms, comme dans l’exemple, et une des catégories de l’extension gratuite : happenboard-events, happenboard-booking, happenboard-attendees ou happenboard-site. WordPress refuse une ability dont la catégorie n’existe pas.
  • HappenBoard Pro déclare ses abilities sur cette action en priorité 10, puis déclenche happenboard_pro_register_abilities.

happenboard_pro_register_abilities

Action Pro src/Service/Abilities/Bootstrap.php

Se déclenche après la déclaration des abilities de HappenBoard Pro, à l’intérieur du happenboard_register_abilities de l’extension gratuite. Servez-vous-en pour les modules qui s’appuient sur des fonctions Pro, comme les billets.

Signature

do_action( 'happenboard_pro_register_abilities' )

Exemple

add_action( 'happenboard_pro_register_abilities', function () {
    \HappenBoard\Service\Abilities\Registry::ability(
        'flag-sponsor-ticket',
        array(
            'namespace'     => 'acme',
            'label'         => 'Flag a sponsor ticket',
            'description'   => 'Marks one ticket type as a sponsor ticket.',
            'category'      => 'happenboard-commerce',
            'cap'           => 'happenboard_manage_tickets',
            'write'         => true,
            'input_schema'  => array(
                'type'       => 'object',
                'properties' => array( 'ticket_id' => array( 'type' => 'integer' ) ),
                'required'   => array( 'ticket_id' ),
            ),
            'output_schema' => array( 'type' => 'object', 'properties' => array( 'ok' => array( 'type' => 'boolean' ) ) ),
            'execute'       => fn ( $input ) => array( 'ok' => acme_flag_sponsor_ticket( (int) $input['ticket_id'] ) ),
        )
    );
} );

Remarques

  • Aucun argument. Il ne se déclenche jamais quand la surface agents est fermée ou que Pro est inactif.
  • La catégorie happenboard-commerce n’existe que si Pro est actif : les abilities qui l’utilisent se déclarent sur ce hook.
  • Mettez write à true pour tout ce qui modifie des données : l’ability utilise alors la limite d’écriture, est annoncée sur happenboard_ability_executed et s’appelle en POST. Ajoutez destructive pour exiger confirm: true.
  • Les abilities de Pro utilisent l’espace de noms happenboard-pro. Gardez les vôtres dans le vôtre.

happenboard_registered_abilities

Filtre Free src/Service/Abilities/Registry.php

Filtre chaque ability que HappenBoard s’apprête à déclarer. Retirez son nom et elle n’est jamais déclarée : les agents ne la voient pas du tout, au lieu d’être refusés quand ils l’appellent.

Signature

apply_filters( 'happenboard_registered_abilities', array $names )

Paramètres

$names array<int,string>
Un tableau d’un seul élément : le nom complet de l’ability en cours de déclaration, par exemple happenboard/delete-event.

Valeur de retour

array<int,string> Les noms à garder. Renvoyez le tableau sans le nom pour écarter cette ability.

Exemple

add_filter(
    'happenboard_registered_abilities',
    fn ( $names ) => array_diff(
        $names,
        array( 'happenboard/delete-event', 'happenboard/delete-booking-type' )
    )
);

Remarques

  • Il s’exécute une fois par ability, pas une fois pour toute la liste. Comparez avec les noms à retirer au lieu d’attendre une liste complète.
  • Ce n’est pas un contrôle de permission : chaque ability vérifie déjà la permission de l’utilisateur. Servez-vous-en pour réduire la surface.
  • Il voit toutes les abilities déclarées via le Registry de HappenBoard, celles de Pro comprises (noms en happenboard-pro/), mais pas celles déclarées directement avec wp_register_ability().
  • Une ability retirée n’est jamais déclarée : elle disparaît aussi pour les clients MCP.

happenboard_ability_executed

Action Free src/Service/Abilities/Registry.php

Se déclenche après l’appel d’une ability d’écriture, quel qu’en soit le résultat, y compris pour les appels refusés avant de s’exécuter. Le journal des agents l’écoute ; branchez-vous dessus pour transmettre la piste d’audit à vos propres journaux ou alertes.

Signature

do_action( 'happenboard_ability_executed', string $name, array $input, mixed $result, string $status )

Paramètres

$name string
Nom complet de l’ability, par exemple happenboard/create-event.
$input array<string,mixed>
Les données d’entrée, validées par le schéma de l’ability. Elles peuvent contenir des identifiants secrets : masquez-les avant de les stocker, comme le fait le journal des agents.
$result mixed
Ce que l’ability a renvoyé, ou le WP_Error par lequel l’appel a été refusé.
$status string
ok, error (l’ability a dit non, par exemple pour une réservation qui n’est pas en attente), failed (une exception a été interceptée), rate_limited, unconfirmed (un appel destructif sans confirm: true) ou forbidden (l’utilisateur n’a pas la permission).

Exemple

add_action(
    'happenboard_ability_executed',
    function ( $name, $input, $result, $status ) {
        if ( ! in_array( $status, array( 'forbidden', 'rate_limited' ), true ) ) {
            return;
        }
        error_log( sprintf(
            'Agent call %s by user %d: %s (%s)',
            $name,
            get_current_user_id(),
            $status,
            is_wp_error( $result ) ? $result->get_error_message() : ''
        ) );
    },
    10,
    4
);

Remarques

  • Quatre arguments sont passés : enregistrez le hook avec 10, 4.
  • Les lectures ne le déclenchent jamais. Seules les abilities déclarées avec write via le Registry de HappenBoard le font.
  • Un appel forbidden le déclenche depuis le contrôle de permission, avant l’exécution, une fois par ability et par requête, et seulement pour un utilisateur connecté. $result est alors une erreur happenboard_forbidden (HTTP 403).
  • Une exception levée par un écouteur est interceptée : elle ne peut pas transformer une écriture terminée en erreur. Elle arrête quand même les écouteurs suivants, dont le journal des agents en priorité 10.

happenboard_abuse_guard_limits

Filtre Free src/Service/Security/AbuseGuard.php

Filtre les limites de débit appliquées à chaque appel d’ability, par utilisateur. Elles empêchent un agent qui boucle, ou un mot de passe d’application divulgué, d’épuiser le site : augmentez-les avec prudence.

Signature

apply_filters( 'happenboard_abuse_guard_limits', array $limits )

Paramètres

$limits array<string,int>
Clés read_per_minute (300), write_per_minute (60) et write_per_hour (600).

Valeur de retour

array<string,int> Les limites à appliquer. Une clé absente reprend sa valeur par défaut, et chaque valeur vaut au moins 1.

Exemple

add_filter(
    'happenboard_abuse_guard_limits',
    function ( $limits ) {
        // Une synchro de nuit a besoin de plus d'écritures qu'un agent conversationnel.
        $limits['write_per_hour'] = 2000;

        return $limits;
    }
);

Remarques

  • Les limites sont comptées par utilisateur, pas pour tout le site : une intégration très active ne ralentit pas les autres.
  • Au-delà de la limite, l’appel répond HTTP 429 avec happenboard_rate_limit et un retry_after de 60 ou 3600 secondes. Une écriture refusée pour cette raison est enregistrée comme rate_limited.
  • Seules les abilities déclarées via le Registry de HappenBoard sont limitées. Les formulaires publics d’inscription et de réservation ont leurs propres limites et ne sont pas concernés.

happenboard_abuse_guard_denial_threshold

Action Free src/Service/Security/AbuseGuard.php

Se déclenche la première fois qu’un utilisateur atteint dix appels d’abilities refusés en cinq minutes. Un identifiant volé qui sonde la surface produit des refus : c’est le signal sur lequel alerter.

Signature

do_action( 'happenboard_abuse_guard_denial_threshold', int $actor_id, int $count )

Paramètres

$actor_id int
Identifiant de l’utilisateur connecté. Un appel sans utilisateur connecté est refusé avant tout comptage.
$count int
Refus dans la fenêtre en cours : toujours 10, le seuil.

Exemple

add_action(
    'happenboard_abuse_guard_denial_threshold',
    function ( $actor_id, $count ) {
        wp_mail(
            get_option( 'admin_email' ),
            'HappenBoard : refus répétés pour un agent',
            sprintf( 'L\'utilisateur %d a été refusé %d fois en cinq minutes.', $actor_id, $count )
        );
    },
    10,
    2
);

Remarques

  • Deux arguments sont passés : enregistrez le hook avec 10, 2.
  • Seuls les refus de permission comptent, en lecture comme en écriture. Une requête qui liste les abilities, comme le fait un client MCP pour ses outils, compte au plus un refus, quel que soit le nombre d’abilities interdites à l’utilisateur. Les appels limités par le débit ou non confirmés ne comptent pas.
  • Il se déclenche une fois par fenêtre. Chaque refus relance la fenêtre de cinq minutes : un appelant qui insiste ne le redéclenche qu’après cinq minutes de calme puis dix nouveaux refus.

happenboard_agent_log_retention_days

Filtre Free src/Service/Abilities/AuditLog.php

Filtre le nombre de jours pendant lesquels les entrées du journal des agents sont gardées avant que le nettoyage quotidien ne les supprime.

Signature

apply_filters( 'happenboard_agent_log_retention_days', int $days )

Paramètres

$days int
Durée de conservation en jours. Par défaut 90.

Valeur de retour

int Jours à garder. Renvoyez 0 ou moins pour couper le nettoyage et tout garder.

Exemple

// Garder une année complète pour une exigence de conformité.
add_filter( 'happenboard_agent_log_retention_days', fn () => 365 );

Remarques

  • Le panneau Agent activity lit la même valeur pour indiquer combien de temps les entrées sont gardées : l’écran correspond au nettoyage réel.
  • Le nettoyage est un événement WP-Cron quotidien, happenboard_prune_agent_log, planifié que la surface agents soit ouverte ou non. Ce filtre s’exécute donc même surface fermée.
  • Une demande d’effacement des données personnelles de WordPress retire l’e-mail et les informations de la personne des données d’entrée journalisées qui la mentionnent, quelle que soit la durée de conservation. Dans le message d’erreur journalisé, son e-mail devient [erased]. Les entrées elles-mêmes restent.

happenboard_mcp_read_only

Filtre Free src/Service/Abilities/Mcp/Exposure.php

Filtre si la connexion MCP en cours peut seulement lire. Renvoyez true et le client ne reçoit que les outils de lecture, quel que soit le choix fait sur l’écran de consentement.

Signature

apply_filters( 'happenboard_mcp_read_only', bool $read_only )

Paramètres

$read_only bool
True quand le jeton OAuth de la connexion a été approuvé pour la lecture seule. False pour un jeton complet et pour un mot de passe d’application.

Valeur de retour

bool True pour limiter la connexion aux outils de lecture. Renvoyer false n’élargit jamais un jeton approuvé pour la lecture seule.

Exemple

add_filter(
    'happenboard_mcp_read_only',
    function ( $read_only ) {
        // Seuls les administrateurs peuvent laisser un client IA modifier des données.
        return $read_only || ! current_user_can( 'manage_options' );
    }
);

Remarques

  • Il s’exécute après la connexion : l’utilisateur courant est le compte au nom duquel le client agit. Il couvre aussi les clients connectés par mot de passe d’application, qui n’ont pas de portée propre.
  • Tant qu’il renvoie true pour un utilisateur, son écran de consentement ne propose que le choix Read only, puisque aucun outil d’écriture ne serait servi.
  • Il ne restreint que le serveur MCP. Le même compte peut toujours lancer une ability d’écriture via la route WordPress /wp-abilities/v1. Pour retirer une écriture partout, utilisez happenboard_registered_abilities ou les permissions de l’utilisateur.

happenboard_mcp_served_abilities

Filtre Free src/Service/Abilities/Mcp/Exposure.php

Filtre les abilities que le serveur MCP remet à la connexion en cours, après les contrôles du Registry, des permissions et de la portée. Un outil retiré ici n’est pas listé, et un client qui l’appelle par son nom reçoit une erreur d’outil inconnu.

Signature

apply_filters( 'happenboard_mcp_served_abilities', array $served )

Paramètres

$served array<string,WP_Ability>
Abilities sur le point d’être servies, indexées par nom complet, par exemple happenboard/list-attendees.

Valeur de retour

array<string,WP_Ability> Les abilities à servir. Autre chose qu’un tableau ne sert rien. Sur une connexion en lecture seule, une ability d’écriture que vous ajoutez est retirée à nouveau.

Exemple

add_filter(
    'happenboard_mcp_served_abilities',
    function ( $served ) {
        // Tenir les données des participants à l’écart des clients IA.
        foreach ( array_keys( $served ) as $name ) {
            if ( str_contains( $name, 'attendee' ) ) {
                unset( $served[ $name ] );
            }
        }

        return $served;
    }
);

Remarques

  • L’ability reste déclarée, contrairement à happenboard_registered_abilities : la route WordPress /wp-abilities/v1 et votre propre code peuvent toujours l’exécuter.
  • Vous pouvez ajouter l’ability d’une autre extension, un WP_Ability obtenu avec wp_get_ability(). Elle s’exécute alors avec son seul contrôle de permission, sans les limites de débit ni le journal des agents de HappenBoard.
  • Il s’exécute plusieurs fois dans une même requête (la liste des outils, chaque appel, l’écran de consentement) : gardez-le léger.
  • L’écran de consentement compte les outils à partir de cette liste : la personne qui approuve voit ce que le client recevra. La liste des outils de l’écran de réglages AI agents ne passe pas par ce filtre.

happenboard_mcp_allowed_origins

Filtre Free src/Service/Abilities/Mcp/Server.php

Filtre les origines autorisées à appeler le point d’accès MCP depuis une page web. Une requête dont l’en-tête Origin n’est pas dans la liste est refusée (HTTP 403, happenboard_mcp_invalid_origin). Un autre site ne peut ainsi pas piloter le point d’accès via un navigateur connecté.

Signature

apply_filters( 'happenboard_mcp_allowed_origins', array $allowed )

Paramètres

$allowed array<int,string>
URL absolues. Par défaut home_url() et site_url().

Valeur de retour

array<int,string> Les URL à accepter. Seuls le schéma, l’hôte et le port sont comparés, et un port par défaut est ignoré.

Exemple

add_filter(
    'happenboard_mcp_allowed_origins',
    function ( $origins ) {
        // Un tableau de bord web sur un autre sous-domaine parle au serveur MCP.
        $origins[] = 'https://app.example.com';

        return $origins;
    }
);

Remarques

  • Une requête sans en-tête Origin n’est pas contrôlée. Les navigateurs en envoient un, les connecteurs côté serveur et les clients de bureau en général non : la plupart des clients n’atteignent jamais ce filtre.
  • Le contrôle a lieu avant la connexion, à chaque requête vers le point d’accès : gardez-le léger.

happenboard_mcp_oauth_enabled

Filtre Free src/Service/Abilities/Mcp/OAuth.php

Filtre si le serveur MCP propose la connexion OAuth. Renvoyez false et les clients ne peuvent se connecter qu’avec un mot de passe d’application.

Signature

apply_filters( 'happenboard_mcp_oauth_enabled', bool $enabled )

Paramètres

$enabled bool
True quand WordPress dispose de wp_fast_hash() (6.8 et suivantes), que HappenBoard utilise pour hacher les jetons.

Valeur de retour

bool Si les points d’accès de découverte, d’enregistrement, de jeton, de révocation et de consentement répondent.

Exemple

// Sur ce site, les connexions passent uniquement par mot de passe d’application.
add_filter( 'happenboard_mcp_oauth_enabled', '__return_false' );

Remarques

  • Désactivé, les jetons déjà émis cessent de fonctionner : chaque appel fait avec l’un d’eux reçoit une erreur HTTP 401 avec happenboard_mcp_oauth_disabled.
  • La carte Connect an AI client lit la même valeur. Désactivé, elle indique que la connexion OAuth est coupée et affiche les étapes par mot de passe d’application pour chaque client.
  • Il s’exécute aussi au chargement de l’écran de réglages AI agents, même surface agents fermée.

happenboard_mcp_oauth_transport_is_secure

Filtre Free src/Service/Abilities/Mcp/OAuth.php

Filtre si le site est considéré comme assez sécurisé pour la connexion OAuth. Par défaut, HTTPS passe, tout comme un hôte local (localhost, 127.0.0.1, ::1, tout *.localhost) et un type d’environnement local.

Signature

apply_filters( 'happenboard_mcp_oauth_transport_is_secure', bool $secure, string $url )

Paramètres

$secure bool
Résultat du contrôle intégré sur l’URL du point d’accès MCP.
$url string
L’URL du point d’accès MCP, par exemple https://example.com/wp-json/happenboard/mcp/v1.

Valeur de retour

bool False refuse OAuth sur ce site. True ne fait pas fonctionner le HTTP simple : voir les notes.

Exemple

add_filter(
    'happenboard_mcp_oauth_transport_is_secure',
    function ( $secure, $url ) {
        // Exiger HTTPS pour OAuth, même sur un site local.
        return $secure && str_starts_with( $url, 'https://' );
    },
    10,
    2
);

Remarques

  • Deux arguments sont passés : déclarez-le avec 10, 2.
  • Servez-vous-en pour retirer OAuth. Chaque requête OAuth exige aussi is_ssl(), un hôte local ou un environnement local : renvoyer true sur un site en HTTP simple change la carte de configuration, mais chaque connexion reste refusée.
  • Derrière un proxy qui termine le HTTPS, rendez is_ssl() vrai dans wp-config.php (à partir de X-Forwarded-Proto, par exemple) plutôt que d’utiliser ce filtre.

happenboard_mcp_protected_resource_metadata

Filtre Free src/Service/Abilities/Mcp/OAuth.php

Filtre les métadonnées de ressource protégée RFC 9728, le document qui indique à un client où se connecter. Il est servi à /.well-known/oauth-protected-resource/wp-json/happenboard/mcp/v1 et à l’alias REST /wp-json/happenboard/mcp/v1/oauth-protected-resource.

Signature

apply_filters( 'happenboard_mcp_protected_resource_metadata', array $document )

Paramètres

$document array<string,mixed>
Clés resource (l’URL du point d’accès MCP), authorization_servers, scopes_supported (mcp et mcp.read), bearer_methods_supported et resource_name (« HappenBoard on » suivi du nom du site).

Valeur de retour

array<string,mixed> Le document, envoyé en JSON.

Exemple

add_filter(
    'happenboard_mcp_protected_resource_metadata',
    function ( $document ) {
        // Un nom plus clair, et une page sur vos règles d’accès pour l’IA.
        $document['resource_name']          = 'Acme Theatre events';
        $document['resource_documentation'] = 'https://example.com/ai-access/';

        return $document;
    }
);

Remarques

  • N’ajoutez ou ne reformulez que des champs informatifs. Les jetons restent émis pour l’URL réelle du point d’accès, et contrôlés par rapport à elle : modifier resource ou authorization_servers casse la connexion.
  • Le document est public, et l’URL well-known l’envoie avec Access-Control-Allow-Origin: *. N’y mettez rien de privé.
  • Il ne s’exécute jamais quand OAuth est désactivé : l’alias REST répond alors 404, et l’URL well-known est laissée à WordPress.

happenboard_mcp_authorization_server_metadata

Filtre Free src/Service/Abilities/Mcp/OAuth.php

Filtre les métadonnées de serveur d’autorisation RFC 8414 : les points d’accès de connexion, de jeton, d’enregistrement et de révocation que découvre un client. Il est servi à /.well-known/oauth-authorization-server/wp-json/happenboard/mcp et à /wp-json/happenboard/mcp/v1/oauth-authorization-server.

Signature

apply_filters( 'happenboard_mcp_authorization_server_metadata', array $document )

Paramètres

$document array<string,mixed>
Clés issuer, les quatre points d’accès, et ce qui est pris en charge : les portées mcp et mcp.read, les autorisations authorization_code et refresh_token, PKCE avec S256 et les méthodes d’authentification des clients.

Valeur de retour

array<string,mixed> Le document, envoyé en JSON.

Exemple

add_filter(
    'happenboard_mcp_authorization_server_metadata',
    function ( $document ) {
        // Indiquer aux clients votre documentation et votre politique d’accès pour l’IA.
        $document['service_documentation'] = 'https://example.com/ai-access/';
        $document['op_policy_uri']         = 'https://example.com/ai-access-policy/';

        return $document;
    }
);

Remarques

  • N’ajoutez que des champs informatifs. Les clients vérifient que issuer correspond à l’URL d’où ils ont lu le document, et HappenBoard ne suit pas des points d’accès modifiés : changer l’un ou l’autre casse la connexion.
  • L’émetteur a son propre chemin, /wp-json/happenboard/mcp, plutôt que la racine du site. Le serveur OAuth d’une autre extension sur le même site, comme celui de SEOPress, garde ainsi son propre document.
  • Comme le document de ressource protégée, il est public et ne s’exécute jamais quand OAuth est désactivé.

Pour aller plus loin