For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale
Theme
Vue d’ensemble Documentation utilisateur de ChatGPT et Codex Cas d’usage

Importez et soumettez votre plugin

Publiez votre plugin dans le répertoire et tenez-le à jour.

Si vous avez créé un plugin et souhaitez le partager plus largement, le répertoire de plugins permet aux utilisateurs de le découvrir et de l’utiliser dans ChatGPT et Codex. Votre plugin peut inclure des connexions MCP, des skills ou les deux.

Importez le paquet que vous avez créé au format ZIP, corrigez les problèmes détectés par les contrôles automatiques, puis soumettez-le pour examen. Une fois le plugin approuvé, vous choisissez quand le publier.

Après la première publication, les modifications de votre serveur MCP sont détectées automatiquement. Les mises à jour admissibles sont mises en ligne dès qu’elles passent les contrôles automatiques. Vous n’avez donc pas besoin d’importer un nouveau ZIP ni de publier chaque mise à jour. En revanche, toute modification des métadonnées ou des skills du plugin nécessite un nouveau ZIP.

Avant de soumettre votre plugin, suivez le guide de création du paquet et consultez les consignes relatives aux plugins. Pour préparer votre demande, vous pouvez utiliser Plugin Creator, disponible dans le répertoire de plugins.

Tableau de bord des plugins indiquant l’état de l’importation, de la publication, de l’examen et de la configuration MCP.

Vue d’ensemble des plugins. Depuis la page Plugins, créez une demande et suivez la publication, l’avancement de l’examen et la configuration MCP.

Pour soumettre un serveur MCP distant, choisissez Avec MCP et indiquez un point de terminaison HTTPS public et stable. Si votre plugin exécute un serveur MCP local ou doit s’exécuter sur un ordinateur de bureau, consultez la section Soumettez un plugin réservé à l’application de bureau.

1. Importez le ZIP de votre plugin

Vérifiez vos droits d’accès et votre identité de publication

Sélectionnez l’organisation et le projet qui seront propriétaires du plugin. Les propriétaires de l’organisation peuvent soumettre des plugins. Les autres membres doivent disposer de l’autorisation Apps Management Write, qu’un propriétaire peut leur accorder dans les rôles de l’organisation.

Dans les paramètres de l’organisation, faites vérifier votre identité ou celle de votre entreprise pour publier sous votre nom ou celui de l’entreprise.

Créez le brouillon

Si votre plugin utilise un serveur MCP, incluez-le dans le ZIP initial. Il n’est actuellement pas possible d’ajouter un serveur MCP à un plugin existant qui contient uniquement des skills.

  1. Ouvrez la page Plugins et sélectionnez Importer un plugin nouveau ou existant.
  2. Choisissez votre Identité de développeur vérifiée. Le répertoire affiche le nom associé à cette identité.
  3. Sélectionnez Importer le plugin, puis choisissez votre fichier ZIP.
  4. Une fois le paquet validé, la page de détails du plugin s’ouvre et affiche votre nouveau brouillon.

Si la validation échoue, corrigez les erreurs signalées dans le paquet, puis importez-le à nouveau. N’incluez aucun identifiant privé ni secret dans le ZIP.

2. Vérifiez les résultats des contrôles et corrigez les problèmes

Après l’importation du ZIP, la page de détails du plugin affiche l’avancement des contrôles automatiques et leurs résultats. Vous pouvez ainsi corriger les problèmes avant de soumettre le plugin pour examen. La section Métadonnées et skills indique la version du paquet importé. La section Serveurs MCP affiche le serveur connecté et les outils analysés. Ces sections sont distinctes, car toute modification du paquet nécessite un nouveau ZIP, tandis que les modifications des outils hébergés sont vérifiées directement sur votre serveur.

Vérifiez les métadonnées

  1. Ouvrez Métadonnées et skills. La dernière version importée s’affiche automatiquement.
  2. Attendez la fin des contrôles des métadonnées, puis consultez la section Problèmes pour voir si des problèmes ont été détectés.
  3. Sélectionnez Copier les problèmes pour reprendre les résultats dans votre environnement de développement.
  4. Corrigez les champs concernés dans votre paquet, sélectionnez Importer le plugin pour corriger les problèmes, puis importez le ZIP corrigé. Vérifiez les nouveaux résultats.

Conseil : demandez à Codex ou à ChatGPT d’examiner votre paquet et les résultats copiés, d’expliquer les problèmes et de proposer des corrections aux métadonnées ou aux skills.

Métadonnées et skills du plugin, avec les résultats des contrôles automatiques dans le volet Problèmes.

Résultats des contrôles des métadonnées. Consultez les résultats pour la version sélectionnée du paquet et importez un ZIP corrigé.

Les détails du paquet sont en lecture seule sur cette page. Modifiez-les dans votre paquet source en vous aidant de la référence des champs du paquet. Les URL publiques doivent être accessibles et identifier le même éditeur que celui indiqué dans la demande.

Vérifiez les skills

Si votre paquet contient des skills, consultez les problèmes signalés dans Métadonnées et skills. Ouvrez un problème pour voir quelle skill est concernée et ce qui doit changer. Mettez à jour ses instructions ou ses fichiers associés, puis importez un ZIP corrigé. Vérifiez les nouveaux résultats. Les analyses obligatoires des skills doivent se terminer avec succès avant que vous puissiez soumettre le plugin.

Connectez et analysez votre serveur MCP

Votre paquet peut déclarer plusieurs serveurs MCP, mais vous ne pouvez connecter qu’un seul serveur MCP par plugin. Lors de la première connexion de ce serveur, suivez les étapes ci-dessous. Si la connexion présente un problème, utilisez Reconnecter. Si vous avez modifié des outils, suivez les étapes de la section Analysez vos dernières modifications.

  1. Ouvrez Serveurs MCP et sélectionnez le serveur à connecter.
  2. Sélectionnez Connecter pour ouvrir le volet Connecter un serveur MCP.
  3. Vérifiez les champs URL du serveur MCP et Authentification, ainsi que les paramètres applicables.
  4. Effectuez la vérification du domaine demandée dans le portail, puis connectez le serveur et authentifiez-vous si nécessaire.
  5. Attendez la fin de l’analyse automatique des outils, puis examinez les outils détectés. Ouvrez Problèmes pour consulter les éventuels problèmes signalés.
  6. Corrigez les problèmes de connexion ou ceux détectés côté serveur, puis sélectionnez Reconnecter ou Relancer l’analyse, selon le cas. Vérifiez les nouveaux résultats.

Volet de connexion au serveur MCP indiquant que le domaine est vérifié et que l’autorisation OAuth est en attente.

Connexion MCP et vérification du domaine. Connectez le serveur et terminez la vérification du domaine avant d’examiner les outils détectés.

Pour un plugin MCP local approuvé, choisissez Skills uniquement et suivez les instructions de soumission pour l’application de bureau.

Le portail enregistre votre demande sous forme de brouillon pendant que vous remplissez le formulaire.

Si la connexion ou l’analyse échoue, vérifiez la disponibilité du point de terminaison et les paramètres d’authentification, puis reconnectez le serveur ou relancez l’analyse. Avant de soumettre votre demande, corrigez les problèmes signalés sous Terminer la configuration MCP ainsi que les échecs de connexion. Consultez les consignes relatives aux plugins pour connaître les exigences concernant l’URL du serveur MCP, l’authentification, les métadonnées des outils et l’interface utilisateur.

Configurez l’authentification avant la soumission

Le portail lit les paramètres d’authentification avancés dans le fichier mcp.json de votre paquet. Configurez la méthode d’authentification, l’enregistrement du client OAuth, les points de terminaison et les portées à l’aide de la référence sur l’authentification MCP. Le volet de connexion affiche ces paramètres, mais ne permet pas de modifier les paramètres OAuth avancés.

Pour modifier la configuration, mettez à jour mcp.json, sélectionnez Importer une nouvelle version, puis vérifiez les paramètres enregistrés dans Serveurs MCP avant de vous connecter. Si un client est déjà enregistré, il se peut que ses identifiants ne puissent plus être modifiés. Vérifiez la connexion enregistrée avant de considérer que l’importation a remplacé le client existant.

Pour OAuth, choisissez une méthode d’enregistrement prise en charge par votre fournisseur.

Méthode d’enregistrement Informations à fournir
Client enregistré (provided) Déclarez l’identifiant du client et la méthode d’authentification du client au point de terminaison de jetons dans mcp.json. Saisissez le secret du client dans le portail si nécessaire.
Enregistrement dynamique du client (dcr) Fournissez un point de terminaison d’enregistrement via la découverte automatique ou en définissant explicitement registrationUrl. N’incluez pas les identifiants du client dans le paquet.
Document de métadonnées de l’identifiant client (cimd) Configurez la préférence CIMD. L’environnement d’exécution peut utiliser DCR comme solution de repli selon sa politique d’enregistrement.

Pour un client enregistré, procédez comme suit.

  1. Enregistrez auprès de votre fournisseur OAuth l’URL de rappel utilisée lors de la connexion.
  2. Ouvrez Serveurs MCP, sélectionnez votre serveur, puis Connecter.
  3. Renseignez le champ Secret du client OAuth si votre client nécessite un secret. Ce champ s’affiche pour un client OAuth préenregistré, sauf si tokenEndpointAuthMethod vaut "none".
  4. Terminez la vérification du domaine si nécessaire, sélectionnez Connecter, puis autorisez le compte utilisé pour se connecter au serveur et l’analyser.
  5. Attendez la fin de l’analyse et corrigez les problèmes de connexion ou d’outils signalés.

N’inscrivez pas le secret du client dans mcp.json. Le manifeste rejette clientSecret. Ce secret sert à authentifier votre application OAuth. Il ne s’agit ni du mot de passe du compte, ni d’un jeton d’accès, ni des identifiants de connexion de l’équipe d’examen.

Si la découverte OAuth ne fournit pas les points de terminaison requis, définissez explicitement authorizationUrl et tokenUrl dans mcp.json. Vérifiez que l’identifiant du client, la méthode d’authentification du client au point de terminaison de jetons, les portées et l’URL de rappel correspondent à la configuration du fournisseur.

Limites de l’authentification

Le formulaire de connexion du portail prend en charge l’accès sans authentification, l’accès via OAuth et l’accès mixte combinant les deux. Le schéma du manifeste accepte l’authentification par clé API, mais le portail ne propose ni procédure de connexion par clé API ni champ de saisie d’un jeton Bearer. Cette limite s’applique également aux clés API déclarées avec l’authentification Basic ou un en-tête personnalisé. L’importation d’une déclaration de clé API ne suffit donc pas à terminer la configuration MCP. Contactez OpenAI si votre demande nécessite cette méthode d’authentification.

N’insérez pas de jeton dans les headers du serveur pour contourner cette limite. La procédure de soumission au répertoire public rejette les en-têtes de serveur non vides. Ne configurez pas un serveur protégé avec type: "none".

Le schéma accepte private_key_jwt pour un client OAuth préenregistré, mais cette valeur ne suffit pas à configurer les clés de signature. Ce guide du portail ne décrit pas la procédure de configuration des clés de signature. Vérifiez la configuration requise auprès d’OpenAI avant d’utiliser cette méthode pour soumettre votre plugin.

Vérification du domaine

Pour vérifier votre domaine, hébergez le jeton de vérification à l’identique, en texte brut, à l’URL indiquée dans le portail.

https://<challenge-base-host>/.well-known/openai-apps-challenge

Renvoyez uniquement le jeton exact, sans l’encapsuler dans du JSON ni dans une liste de jetons. L’origine utilisée pour la vérification doit être une origine HTTPS correspondant au nom d’hôte du serveur MCP ou à un domaine parent admissible. Les chemins sont ignorés. Si un autre plugin utilise la même URL de vérification, conservez son jeton et utilisez une origine parente autorisée ou un nom d’hôte distinct. Si aucune de ces options n’est possible, contactez l’assistance.

3. Soumettez le plugin pour examen

Après avoir consulté les résultats des contrôles automatiques, fournissez les informations nécessaires pour que l’équipe d’examen puisse tester votre plugin, puis soumettez le brouillon sélectionné. Vous devez d’abord corriger les erreurs liées à la configuration obligatoire et à la validation. Vous pouvez transmettre les autres problèmes détectés automatiquement à l’équipe d’examen pour qu’elle les évalue.

Renseignez les informations nécessaires à l’examen

Pour les plugins dotés de connexions MCP, l’équipe d’examen a besoin d’informations pour tester l’intégration. Vous pouvez inclure les cas de test positifs et négatifs, l’URL de la vidéo de démonstration et les notes de version dans plugin.json pour les importer avec le ZIP. Consultez la référence des champs d’examen et de publication et les exemples complets de métadonnées. Plugin Creator, disponible dans le répertoire de plugins, peut vous aider à préparer ces informations. Saisissez séparément les identifiants destinés à l’équipe d’examen dans Détails de l’examen. Préparez les éléments suivants.

  • Des identifiants pour l’équipe d’examen, si une connexion est nécessaire. Fournissez un compte de test dédié, l’URL de connexion, les informations sur l’espace de travail ou le tenant et les instructions de connexion. Utilisez des données d’exemple. N’utilisez pas le compte d’un utilisateur réel. Le compte doit disposer des autorisations et des données nécessaires à vos cas de test. Il doit être utilisable immédiatement, sans validation par authentification multifacteur (MFA), code reçu par e-mail ou SMS, lien de connexion automatique ni accès à un réseau privé.
  • Cinq cas de test positifs. Indiquez le scénario, le prompt de l’utilisateur, les outils attendus et le résultat prévu. Exécutez chaque test avec le compte dédié avant de soumettre le plugin.
  • Trois cas de test négatifs. Donnez un prompt ou un scénario dans lequel le plugin doit s’abstenir d’agir. Expliquez pourquoi il ne doit pas exécuter la demande et précisez la réponse attendue : refus, demande de clarification ou solution de repli sûre.
  • Une vidéo de démonstration. Montrez les cas de test et le fonctionnement du plugin, puis fournissez une URL accessible pour visionner l’enregistrement.
  • Des notes de version. Présentez brièvement la version du paquet soumise et les modifications apportées.

Dans Métadonnées et skills, ouvrez Informations pour l’examen → Détails de l’examen pour vérifier les éléments importés et saisir les identifiants de l’équipe d’examen. Renseignez les champs modifiables et sélectionnez Enregistrer les détails. Pour les champs indiqués comme gérés par le ZIP du plugin, ajoutez ou modifiez les informations dans le paquet, puis importez-le à nouveau. Vous pouvez aussi préciser les pays de disponibilité et les traductions dans les métadonnées du paquet. Vérifiez ces paramètres après l’importation, le cas échéant. Consultez la section Renseignez automatiquement les informations de soumission et d’examen pour connaître les champs pris en charge et le fonctionnement de l’importation.

Volet des informations pour l’examen, avec les champs réservés aux identifiants de l’équipe d’examen et aux instructions de connexion.

Détails de l’examen. Vérifiez les cas de test et les documents associés importés depuis le ZIP. Saisissez séparément les identifiants privés destinés à l’équipe d’examen.

Les identifiants restent en dehors du paquet public. Maintenez le compte de test et les données d’exemple accessibles pour les examens ultérieurs. Si les identifiants ou les étapes de connexion changent, soumettez un brouillon à jour contenant les nouvelles informations.

Soumettez le brouillon

Sélectionnez le brouillon, choisissez Soumettre pour examen, puis remplissez les attestations de conformité requises. Après la soumission, suivez l’avancement dans État de l’examen sur la page Plugins. L’équipe d’examen vous communiquera ses observations par e-mail.

Boîte de dialogue de soumission pour examen affichant les attestations de conformité requises.

Soumission pour examen. Confirmez les attestations requises et soumettez le brouillon sélectionné pour examen.

Un plugin ne peut faire l’objet que d’un seul examen à la fois. Pour remplacer un paquet en cours d’examen, attendez la décision ou annulez l’examen avant d’importer le nouveau paquet. Si votre paquet a été refusé, tenez compte des observations reçues et soumettez un ZIP corrigé.

Si l’équipe d’examen refuse votre demande, consultez l’e-mail de refus pour en connaître le motif. Pour faire appel, répondez à cet e-mail en expliquant pourquoi la décision devrait être réexaminée.

4. Publiez votre plugin approuvé

Une fois votre plugin approuvé, vous choisissez quand le rendre disponible. Ouvrez la version approuvée du paquet et sélectionnez Publier le plugin. La publication d’une mise à jour remplace la version précédente du paquet.

Mettez à jour votre plugin publié

Pour mettre à jour les métadonnées, les ressources ou les skills incluses, importez un nouveau ZIP dans le plugin existant. Cette opération crée une version du paquet qui fait l’objet de ses propres contrôles et d’une décision d’examen distincte. Les modifications des outils hébergés sont traitées séparément lors des analyses MCP et ne nécessitent donc pas d’importer un paquet.

Si vous avez utilisé l’ancien formulaire de soumission, commencez par télécharger votre plugin existant au format ZIP. Ouvrez le plugin, sélectionnez la version publiée du paquet, puis choisissez Télécharger le ZIP de cette version dans le menu …. Si vous gérez déjà le paquet en local, vous pouvez utiliser votre copie locale.

  1. Mettez à jour le contenu du paquet et son numéro de version, puis créez un ZIP complet contenant tous les composants que vous souhaitez conserver.
  2. Ouvrez le plugin existant et sélectionnez Importer le plugin pour le modifier.
  3. Vérifiez la version du paquet sélectionnée dans Métadonnées et skills. Consultez les nouveaux résultats des contrôles automatiques et corrigez les problèmes dont la résolution est obligatoire.
  4. Suivez les étapes d’examen applicables, puis publiez la version approuvée du paquet.

Utilisez le même plugin pour ajouter ou supprimer des skills. Pour modifier l’URL d’un serveur MCP existant, contactez l’assistance. La procédure de mise à jour actuelle ne permet pas de changer cette URL.

Mettez à jour votre serveur MCP

Après la première publication, OpenAI analyse votre serveur MCP hébergé chaque jour. Les mises à jour admissibles deviennent disponibles dès qu’elles passent les contrôles automatiques, sans nouvelle version du paquet ni étape de publication supplémentaire. Vous pouvez aussi demander une analyse dès que vous avez déployé des modifications sur le serveur.

Analysez vos dernières modifications

  1. Déployez les modifications sur votre serveur MCP.
  2. Ouvrez le plugin existant, sélectionnez Serveurs MCP, puis choisissez le serveur connecté.
  3. Dans Problèmes, sélectionnez Relancer l’analyse.
  4. Attendez la fin de l’analyse, puis vérifiez les résultats et la disponibilité des outils.

Liste des outils MCP indiquant leur disponibilité actuelle, les mises à jour en attente et les problèmes détectés lors de l’analyse.

Vue d’ensemble de l’analyse MCP. Relancez l’analyse après avoir modifié le serveur, puis vérifiez les résultats et la disponibilité de chaque outil.

Il peut être impossible de relancer l’analyse si une autre analyse ou un appel est en cours, ou si le plugin ne remplit pas les conditions requises pour être analysé.

Repérez et corrigez les problèmes liés aux outils

  1. Ouvrez Problèmes et sélectionnez un outil concerné.
  2. Consultez Problèmes détectés, puis Mise à jour en attente pour voir les métadonnées évaluées. Définition en ligne affiche les métadonnées actuellement utilisées.
  3. Sélectionnez Copier les problèmes pour reprendre les résultats dans votre environnement de développement.
  4. Corrigez les métadonnées ou l’implémentation de l’outil sur votre serveur, puis déployez les modifications.
  5. Revenez dans Problèmes, sélectionnez Relancer l’analyse, puis vérifiez les nouveaux résultats.

Conseil : demandez à Codex ou à ChatGPT d’examiner votre serveur MCP et le message d’erreur copié. Demandez-lui d’expliquer le problème et de proposer une correction.

Les modifications sont évaluées outil par outil. Un problème signalé sur une modification ne bloque pas nécessairement les mises à jour admissibles des autres outils. Les nouveaux outils restent indisponibles jusqu’à leur approbation. Lorsqu’une mise à jour est mise en attente, les outils existants conservent leurs dernières métadonnées approuvées. Les suppressions prennent effet après une analyse.

Veillez à ce que votre serveur MCP reste compatible avec les schémas d’outils actuellement approuvés jusqu’à la mise en ligne des nouvelles métadonnées.

Contestez le résultat d’un contrôle automatique

Si vous pensez qu’un problème a été signalé à tort sur un outil, sélectionnez Faire appel et expliquez pourquoi l’équipe d’examen devrait réévaluer les résultats. L’équipe examine ensemble les modifications d’outils mises en attente à l’issue de cette analyse. Si le problème est avéré, il est généralement plus rapide de le corriger sur le serveur et de relancer l’analyse.

Boîte de dialogue d’appel précisant que l’examen porte sur les modifications d’outils mises en attente à l’issue de l’analyse.

Appel concernant une analyse MCP. Expliquez pourquoi l’équipe d’examen devrait réévaluer le résultat du contrôle automatique.

Les mises à jour automatiques du serveur MCP sont suspendues pendant un appel. Pour apporter des modifications, sélectionnez Retirer l’appel, mettez à jour le serveur, puis relancez l’analyse. Les appels portent uniquement sur les modifications d’outils mises en attente. Ils ne couvrent ni les modifications du paquet, ni l’authentification, ni les instructions communes du serveur.

En cas de problème, consultez la page Erreurs de soumission. Indiquez l’identifiant de votre plugin lorsque vous contactez l’assistance.

Renseignez automatiquement les informations de soumission et d’examen

Vous pouvez inclure dans le manifeste du plugin les informations de sa fiche, de son examen et de sa publication. Elles seront alors renseignées lors de l’importation du ZIP. La référence ci-dessous décrit les champs pris en charge et la manière dont ils sont appliqués à l’importation. Elle donne également des exemples pour chaque format de paquet.

Il n’est actuellement pas possible de soumettre un paquet ZIP de plugin qui contient des références à des applications (apps / .app.json) ou des hooks de cycle de vie. Déclarez les URL des serveurs MCP dans votre configuration MCP, puis terminez la configuration dans le tableau de bord.

Supprimez les hooks de cycle de vie avant de soumettre le plugin au répertoire public. Si votre plugin en dépend, distribuez-le de manière à permettre aux utilisateurs de l’installer manuellement dans l’application de bureau Codex.

Exemples complets de métadonnées

Ces exemples présentent le même plugin fictif de gestion de notes dans chacun des formats. Copiez le manifeste correspondant à votre format, puis remplacez les informations sur l’éditeur, les URL, les noms d’outils, les cas de test pour l’examen, les traductions et les pays de disponibilité par vos propres valeurs. Les cas de test fournis en exemple n’ont pas été exécutés sur un service réel.

Incluez les fichiers référencés par le manifeste :

  • skills/get-started/SKILL.md, avec des champs de nom et de description valides dans l’en-tête YAML.
  • Les quatre fichiers d’icônes dans assets/.
  • Un seul serveur MCP distant nommé notes, configuré dans mcp.json pour Agent Plugins ou dans .mcp.json pour Codex. Utilisez la configuration correspondante ci-dessous.

Fournissez vos propres URL accessibles pour la démonstration et les pièces jointes destinées à l’examen. Les liens example.com illustrent le format attendu et ne permettent pas d’accéder à des documents utilisables pour une demande. Si votre plugin contient uniquement des skills, omettez review et la configuration MCP. Omettez également mcpServers dans le manifeste Codex.

Pour l’exemple Agent Plugins, utilisez le fichier mcp.json suivant en complément du manifeste :

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
  "mcpServers": {
    "notes": {
      "type": "streamable-http",
      "url": "https://example.com/mcp"
    }
  }
}

Pour l’exemple Codex, enregistrez la configuration suivante dans .mcp.json à la racine du plugin. Ce format omet le schéma Agent Plugins.

{
  "mcpServers": {
    "notes": {
      "url": "https://example.com/mcp"
    }
  }
}

Format Agent Plugins

Enregistrez ce manifeste complet dans plugin.json à la racine du plugin.

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "acme-notes",
  "version": "1.0.0",
  "description": "Search and summarize notes from your Acme workspace.",
  "author": {
    "name": "Acme",
    "email": "support@example.com",
    "url": "https://example.com"
  },
  "homepage": "https://example.com/notes",
  "repository": "https://github.com/example/acme-notes",
  "license": "MIT",
  "keywords": ["notes", "search", "productivity"],
  "extensions": {
    "com.openai": {
      "interface": {
        "displayName": "Acme Notes",
        "shortDescription": "Find and summarize your notes",
        "longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
        "developerName": "Acme",
        "category": "Productivity",
        "capabilities": ["Search notes", "Read notes"],
        "websiteURL": "https://example.com/notes",
        "supportURL": "https://example.com/support",
        "privacyPolicyURL": "https://example.com/privacy",
        "termsOfServiceURL": "https://example.com/terms",
        "defaultPrompt": [
          "Find my notes about the launch.",
          "Summarize the decisions in my launch notes.",
          "Open the project kickoff notes."
        ],
        "brandColor": "#2357C6",
        "brandColorDark": "#8CB4FF",
        "composerIcon": "./assets/icon.png",
        "composerIconDark": "./assets/icon-dark.png",
        "logo": "./assets/logo.png",
        "logoDark": "./assets/logo-dark.png"
      },
      "onboardingSkill": "./skills/get-started/SKILL.md",
      "review": {
        "test_cases": {
          "positive": [
            {
              "description": "Find notes by topic",
              "prompt": "Find my notes about the launch.",
              "tools_triggered": "search_notes",
              "expected_behavior": "Return accessible notes about the launch with source links.",
              "file_attachment_urls": [
                "https://example.com/review/launch-brief.pdf"
              ],
              "expected_output_url": "https://example.com/review/launch-results"
            },
            {
              "description": "Open a matching note",
              "prompt": "Open the project kickoff notes.",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "Find the kickoff note and return its content with a source link."
            },
            {
              "description": "Summarize decisions",
              "prompt": "Summarize decisions in my launch notes.",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "Summarize decisions from accessible notes and cite the sources."
            },
            {
              "description": "Find action items",
              "prompt": "What action items are in my kickoff notes?",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
            },
            {
              "description": "Handle no matches",
              "prompt": "Find my notes about Project Northstar.",
              "tools_triggered": "search_notes",
              "expected_behavior": "Report that no matching notes were found in the test workspace."
            }
          ],
          "negative": [
            {
              "description": "Unsupported payment",
              "prompt": "Transfer $100 to another account."
            },
            {
              "description": "Unsupported deletion",
              "prompt": "Delete all my notes."
            },
            {
              "description": "Access outside the connected account",
              "prompt": "Show notes from a workspace I cannot access."
            }
          ]
        },
        "demo_recording_url": "https://example.com/review/acme-notes-demo",
        "commerce": false,
        "commerce_description": "This plugin does not sell products or process payments."
      },
      "publication": {
        "countries": ["US", "GB"],
        "release_notes": "Initial release with note search, reading, and summaries.",
        "translations": {
          "fr-FR": {
            "subtitle": "Retrouvez et résumez vos notes",
            "description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
          },
          "ja-JP": {
            "subtitle": "ノートを検索して要約",
            "description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
          }
        }
      }
    }
  }
}

Format Codex

Enregistrez ce manifeste complet dans .codex-plugin/plugin.json. Les champs de présentation se trouvent dans l’objet interface à la racine. Les paramètres de prise en main, d’examen et de publication restent sous extensions.com.openai.

{
  "name": "acme-notes",
  "version": "1.0.0",
  "description": "Search and summarize notes from your Acme workspace.",
  "author": {
    "name": "Acme",
    "email": "support@example.com",
    "url": "https://example.com"
  },
  "homepage": "https://example.com/notes",
  "repository": "https://github.com/example/acme-notes",
  "license": "MIT",
  "keywords": ["notes", "search", "productivity"],
  "skills": "./skills/",
  "mcpServers": "./.mcp.json",
  "interface": {
    "displayName": "Acme Notes",
    "shortDescription": "Find and summarize your notes",
    "longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
    "developerName": "Acme",
    "category": "Productivity",
    "capabilities": ["Search notes", "Read notes"],
    "websiteURL": "https://example.com/notes",
    "supportURL": "https://example.com/support",
    "privacyPolicyURL": "https://example.com/privacy",
    "termsOfServiceURL": "https://example.com/terms",
    "defaultPrompt": [
      "Find my notes about the launch.",
      "Summarize the decisions in my launch notes.",
      "Open the project kickoff notes."
    ],
    "brandColor": "#2357C6",
    "brandColorDark": "#8CB4FF",
    "composerIcon": "./assets/icon.png",
    "composerIconDark": "./assets/icon-dark.png",
    "logo": "./assets/logo.png",
    "logoDark": "./assets/logo-dark.png"
  },
  "extensions": {
    "com.openai": {
      "onboardingSkill": "./skills/get-started/SKILL.md",
      "review": {
        "test_cases": {
          "positive": [
            {
              "description": "Find notes by topic",
              "prompt": "Find my notes about the launch.",
              "tools_triggered": "search_notes",
              "expected_behavior": "Return accessible notes about the launch with source links.",
              "file_attachment_urls": [
                "https://example.com/review/launch-brief.pdf"
              ],
              "expected_output_url": "https://example.com/review/launch-results"
            },
            {
              "description": "Open a matching note",
              "prompt": "Open the project kickoff notes.",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "Find the kickoff note and return its content with a source link."
            },
            {
              "description": "Summarize decisions",
              "prompt": "Summarize decisions in my launch notes.",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "Summarize decisions from accessible notes and cite the sources."
            },
            {
              "description": "Find action items",
              "prompt": "What action items are in my kickoff notes?",
              "tools_triggered": "search_notes, read_note",
              "expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
            },
            {
              "description": "Handle no matches",
              "prompt": "Find my notes about Project Northstar.",
              "tools_triggered": "search_notes",
              "expected_behavior": "Report that no matching notes were found in the test workspace."
            }
          ],
          "negative": [
            {
              "description": "Unsupported payment",
              "prompt": "Transfer $100 to another account."
            },
            {
              "description": "Unsupported deletion",
              "prompt": "Delete all my notes."
            },
            {
              "description": "Access outside the connected account",
              "prompt": "Show notes from a workspace I cannot access."
            }
          ]
        },
        "demo_recording_url": "https://example.com/review/acme-notes-demo",
        "commerce": false,
        "commerce_description": "This plugin does not sell products or process payments."
      },
      "publication": {
        "countries": ["US", "GB"],
        "release_notes": "Initial release with note search, reading, and summaries.",
        "translations": {
          "fr-FR": {
            "subtitle": "Retrouvez et résumez vos notes",
            "description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
          },
          "ja-JP": {
            "subtitle": "ノートを検索して要約",
            "description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
          }
        }
      }
    }
  }
}

Choisissez la structure correspondant à votre paquet.

Métadonnées Agent Plugins : plugin.json à la racine Codex : .codex-plugin/plugin.json
Identité du paquet et éditeur Champs à la racine Champs à la racine
Texte de la fiche, liens, prompts et images extensions.com.openai.interface interface
Skill de prise en main extensions.com.openai.onboardingSkill extensions.com.openai.onboardingSkill
Informations d’examen et de publication extensions.com.openai.review et extensions.com.openai.publication extensions.com.openai.review et extensions.com.openai.publication

Pour les paquets Agent Plugins, placez les paramètres propres à OpenAI dans plugin.json, sous extensions.com.openai. Si cet objet existe, OpenAI ignore les paramètres de .codex-plugin/plugin.json. Les deux fichiers ne sont pas fusionnés. Si l’objet est absent, OpenAI lit ces paramètres dans .codex-plugin/plugin.json. L’identité du paquet provient toujours du fichier plugin.json à la racine, les skills du répertoire skills/ et les serveurs MCP du fichier mcp.json.

Utilisez les exemples complets de métadonnées comme point de départ. Si le tableau de bord développeur signale qu’il manque l’URL de la politique de confidentialité, l’URL de l’assistance ou l’icône de l’application, consultez la référence des champs pour trouver le champ correspondant dans le manifeste.

Champs du manifeste

La colonne des exigences distingue les champs requis par le format du paquet de ceux requis pour la soumission. Les informations d’examen sont facultatives dans le ZIP, mais vous devez fournir tous les éléments requis avant de soumettre votre demande.

Identité et composants du paquet

Ces champs décrivent le paquet lui-même. Placez-les à la racine du manifeste, quel que soit son format, sauf lorsque le tableau indique un champ d’extension OpenAI.

Champ Exigence Valeur et utilisation
$schema Obligatoire pour Agent Plugins, à omettre pour Codex Le format portable exige la valeur https://agent-plugins.org/schemas/1.0.0/plugin.schema.json. Omettez ce champ dans un manifeste de compatibilité Codex autonome.
name Obligatoire Identifiant stable obligatoire, limité à 64 caractères. Pour les paquets que vous comptez soumettre, utilisez des lettres minuscules, des chiffres et des traits d’union simples. Distinguez cet identifiant du nom d’affichage.
version Obligatoire pour Codex, facultatif dans le schéma portable Numéro de version, par exemple 1.0.0. Le champ est facultatif dans le schéma portable, mais utilisez un numéro de version sémantique explicite pour la soumission et les mises à jour. Il est obligatoire au format Codex.
description Obligatoire pour Codex, facultatif pour Agent Plugins Résumé du paquet, limité à 4 000 caractères. Ce champ est facultatif dans le schéma portable et obligatoire au format Codex.
author Obligatoire pour Codex, facultatif pour Agent Plugins Objet décrivant l’éditeur, avec son nom et, à titre facultatif, son adresse e-mail et une url HTTPS. Cet objet peut être omis dans le schéma portable. Le format Codex exige author.name. Limitez le nom à 120 caractères, l’adresse e-mail à 320 et l’URL à 2 048.
homepage Facultatif URL HTTPS facultative de la page d’accueil du projet, limitée à 2 048 caractères. Renseignez séparément le champ interface.websiteURL de la fiche.
repository Facultatif URL facultative du dépôt de code source.
license Facultatif Identifiant facultatif de la licence, par exemple MIT.
keywords Facultatif Tableau facultatif de mots-clés facilitant la découverte du plugin.
extensions Facultatif Paramètres regroupés par espace de noms. Placez les paramètres propres à OpenAI sous com.openai.
skills Pour les paquets Codex contenant des skills Pour Codex uniquement, chemin relatif d’un répertoire de skills ou tableau de chemins, par exemple "./skills/". Les paquets portables détectent automatiquement skills/.
mcpServers Pour les paquets Codex contenant des serveurs MCP Pour Codex uniquement, utilisez "./.mcp.json" pour la configuration des serveurs MCP incluse dans le paquet. Les paquets portables détectent automatiquement le fichier mcp.json à la racine.

Placez les paramètres supplémentaires suivants dans extensions.com.openai pour un paquet portable ou à la racine d’un manifeste de compatibilité Codex.

Champ Exigence Valeur et utilisation
interface Obligatoire pour Codex, facultatif pour Agent Plugins Objet de présentation décrit dans la section Métadonnées de la fiche. Le format Codex exige cet objet. Les paquets portables peuvent produire le texte de base à partir des métadonnées à la racine.
id Facultatif Identifiant facultatif utilisé par les catalogues de plugins gérés. Conservez la valeur attribuée, le cas échéant. Lors de l’importation d’un ZIP, l’identité du plugin provient du tableau de bord.

Les paquets portables détectent toujours les skills dans skills/ et les serveurs MCP dans mcp.json. Une déclaration skills ou mcpServers dans l’extension intégrée au manifeste ou dans la couche de compatibilité ne peut ni remplacer ces composants, ni les désactiver, ni en ajouter. Ces déclarations s’appliquent uniquement aux paquets sans manifeste portable reconnu à la racine.

Métadonnées de la fiche

Placez les champs suivants dans extensions.com.openai.interface pour Agent Plugins ou dans interface pour le format Codex. Les limites indiquées s’appliquent à la soumission au répertoire public. Lors de l’importation, le texte du brouillon peut être plus long. Une importation réussie ne garantit donc pas que la fiche est prête à être soumise.

Champ Exigence Type Valeur et limite de soumission
displayName Obligatoire Chaîne Nom affiché aux utilisateurs, obligatoire et limité à 30 caractères.
shortDescription Obligatoire Chaîne Sous-titre affiché avec le nom, obligatoire et limité à 30 caractères.
longDescription Obligatoire Chaîne Description des tâches, du public visé et des limites du plugin, obligatoire et limitée à 4 000 caractères.
developerName Obligatoire Chaîne Nom de l’éditeur, obligatoire et limité à 80 caractères. Le nom affiché dans le répertoire est défini automatiquement à partir de l’identité de développeur vérifiée que vous avez sélectionnée.
category Obligatoire Chaîne Intitulé obligatoire d’une catégorie du tableau de bord, par exemple Productivity ou Developer Tools.
capabilities Obligatoire pour Codex, facultatif pour Agent Plugins Tableau de chaînes Jusqu’à 20 libellés décrivant les fonctionnalités, limités à 120 caractères chacun. Ce champ est obligatoire au format Codex. Utilisez [] en l’absence de libellés.
websiteURL Obligatoire pour l’examen MCP Chaîne URL HTTPS du site web du produit, limitée à 1 024 caractères.
supportURL Obligatoire pour l’examen MCP Chaîne URL HTTPS de la page d’assistance, limitée à 1 024 caractères.
privacyPolicyURL Obligatoire pour l’examen MCP Chaîne URL HTTPS de la politique de confidentialité, limitée à 1 024 caractères.
termsOfServiceURL Obligatoire pour l’examen MCP Chaîne URL HTTPS des conditions d’utilisation, limitée à 1 024 caractères.
defaultPrompt Facultatif Chaîne ou tableau de chaînes Jusqu’à trois prompts de démarrage, limités à 128 caractères chacun. Utilisez des prompts distincts, sans @mention d’application. Pour plusieurs prompts, utilisez un tableau.
brandColor Facultatif Chaîne Couleur du thème clair au format #RRGGBB, avec un rapport de contraste d’au moins 2:1 sur fond blanc.
brandColorDark Facultatif Chaîne Couleur du thème sombre au format #RRGGBB, avec un rapport de contraste d’au moins 2:1 sur fond #212121. Si vous fournissez uniquement brandColor, la couleur du thème sombre est calculée automatiquement.
composerIcon Obligatoire pour Codex Chaîne Chemin relatif de l’icône utilisée dans la zone de saisie.
composerIconDark Facultatif Chaîne Chemin relatif facultatif de sa variante pour le thème sombre.
logo Obligatoire pour Codex, icône principale requise pour la soumission Chaîne Chemin relatif de l’icône principale de la fiche.
logoDark Facultatif Chaîne Chemin relatif facultatif de sa variante pour le thème sombre.

Si une application MCP associée doit être examinée en vue d’une publication, les quatre URL de la fiche sont obligatoires : websiteURL, supportURL, privacyPolicyURL et termsOfServiceURL. Utilisez des URL HTTPS sans identifiants intégrés. Pour un plugin contenant uniquement des skills, la validation des métadonnées n’exige pas les quatre URL. Les champs homepage et author.url du paquet ne renseignent pas automatiquement ces champs de la fiche.

Icônes

Incluez logo et composerIcon dans les paquets que vous préparez pour la distribution. Les deux champs sont obligatoires pour valider un paquet Codex. Vous pouvez importer un paquet portable sans ces champs, mais le tableau de bord exige une icône principale avant la soumission. Les variantes pour le thème sombre sont facultatives. Pour corriger l’avertissement « Icône de l’application requise », ajoutez logo et le fichier image correspondant ou fournissez l’icône dans le tableau de bord.

Utilisez des chemins commençant par ./ et relatifs à la racine du plugin. Incluez tous les fichiers référencés. Les formats pris en charge sont PNG, JPEG, WebP et SVG, avec une limite de 5 Mio par fichier. Les icônes et les logos doivent être carrés et mesurer au moins 48 × 48 pixels. Les images matricielles ne doivent pas dépasser 4 096 pixels en largeur ou en hauteur. Pour les icônes SVG, indiquez une largeur et une hauteur numériques égales ou un viewBox carré d’au moins 48 × 48.

Configurez la prise en main, l’examen et la publication

Dans les deux formats, placez ces objets directement sous extensions.com.openai, au même niveau que l’objet interface du format portable. Ne les imbriquez pas dans interface.

Le champ facultatif onboardingSkill propose aux utilisateurs une procédure de configuration à exécuter après l’installation. Consultez la section Ajoutez une skill de prise en main pour voir un exemple de manifeste, connaître les règles relatives aux chemins et savoir comment la configuration utilise une conversation nouvelle ou existante.

Champ Exigence Type Valeur et utilisation
onboardingSkill Facultatif Chaîne Chemin relatif du fichier SKILL.md d’une skill incluse dans le paquet, par exemple ./skills/get-started/SKILL.md. Il doit désigner une skill effectivement incluse.
review.test_cases.positive Facultatif dans le ZIP, cinq cas obligatoires pour le premier examen MCP Tableau d’objets Cas de test positifs pour l’examen d’un plugin doté d’un seul serveur MCP. Utilisez les champs de cas de test décrits ci-dessous.
review.test_cases.negative Facultatif dans le ZIP, trois cas obligatoires pour le premier examen MCP Tableau d’objets Cas de test négatifs pour l’examen de ce serveur.
review.demo_recording_url Facultatif dans le ZIP, obligatoire pour l’examen MCP Chaîne URL d’une vidéo de démonstration accessible à l’équipe d’examen.
review.commerce Facultatif Booléen Indique si l’application prend en charge des opérations commerciales. Cette déclaration ne vaut pas acceptation de conditions juridiques.
review.commerce_description Facultatif Chaîne Description du fonctionnement des opérations commerciales dans l’application.
publication.countries Facultatif Tableau de chaînes Liste des pays où le plugin sera disponible, sous forme de codes pays reconnus en majuscules, comme US et GB. Omettez ce champ pour conserver le ciblage existant. La valeur [] supprime les restrictions géographiques. Ce paramètre s’applique à la publication du plugin, y compris s’il contient uniquement des skills.
publication.release_notes Facultatif Chaîne Notes décrivant les modifications de cette version.
publication.translations Facultatif Objet ou null Table de correspondance facultative associant chaque code de langue et de région au texte traduit de la fiche. Consultez la section Traduisez le texte de la fiche.
publication.translations.<locale>.subtitle Facultatif Chaîne ou null Sous-titre traduit facultatif, limité à 30 caractères.
publication.translations.<locale>.description Facultatif Chaîne ou null Description traduite facultative, limitée à 4 000 caractères.

Chaque objet de review.test_cases.positive ou de review.test_cases.negative décrit un cas de test.

Champ Exigence Type Valeur et utilisation
description Obligatoire Chaîne Description obligatoire du comportement à vérifier. Limitez la description des cas positifs à 4 000 caractères.
prompt Obligatoire Chaîne Prompt utilisateur obligatoire que l’équipe d’examen peut essayer.
tools_triggered Obligatoire pour les cas positifs Chaîne Noms des outils dont l’appel est attendu, obligatoires pour les cas positifs lors de la soumission.
expected_behavior Obligatoire pour les cas positifs Chaîne Résultat observable attendu, obligatoire pour les cas positifs lors de la soumission.
file_attachment_urls Facultatif Tableau de chaînes Liens facultatifs vers les fichiers utilisés pour ce cas de test.
expected_output_url Facultatif Chaîne Lien facultatif vers un exemple du résultat attendu, tel qu’un document de référence que l’équipe d’examen peut comparer au résultat obtenu.

Le premier examen d’une application MCP exige exactement cinq cas positifs et trois cas négatifs. L’importation accepte des listes incomplètes. Complétez-les avant la soumission. Si vous utilisez plusieurs serveurs MCP, déclarez les cas séparément pour chaque serveur dans la configuration MCP. Le champ review.test_cases au niveau du plugin exige qu’un seul serveur soit déclaré et ne peut pas être combiné avec des cas déclarés par serveur. Les plugins contenant uniquement des skills n’ont besoin ni de cas de test pour l’examen d’une application MCP ni d’un enregistrement de démonstration.

Les cas de test importés sont en lecture seule dans le tableau de bord. Pour les modifier, mettez à jour le paquet et importez-le à nouveau. Si vous omettez test_cases ou lui attribuez la valeur null, les cas existants sont conservés. La déclaration test_cases: {} efface les deux listes. Omettre les cas lors d’une importation ultérieure ne les rend pas de nouveau modifiables dans le tableau de bord.

Pour les champs scalaires de l’examen et pour release_notes, l’omission du champ ou la valeur null conserve la valeur enregistrée. Une chaîne vide efface le texte. Les valeurs explicitement définies dans le paquet sont réappliquées lors de la soumission. Pour utiliser une valeur modifiée dans le tableau de bord, supprimez la déclaration du champ scalaire dans le paquet. Les champs d’examen partagés s’appliquent aux brouillons d’applications MCP propres au plugin. Pour un plugin contenant uniquement des skills, les notes de version restent dans le paquet et ne déclenchent pas d’examen d’application.

Placez commerce et commerce_description dans review, en dehors de publication. N’incluez pas d’identifiants ni d’instructions pour l’équipe d’examen dans le paquet. Les métadonnées du ZIP n’acceptent pas test_credentials ni reviewer_instructions. Renseignez les modalités d’accès de l’équipe d’examen dans le formulaire sécurisé du tableau de bord.

Traduisez le texte de la fiche

Dans les deux formats, ajoutez un objet translations sous extensions.com.openai.publication pour fournir des sous-titres et des descriptions traduits. Utilisez des clés de langue et de région non vides, par exemple fr-FR ou ja-JP. Pour chaque clé, l’objet peut contenir subtitle, description ou les deux. Vous pouvez omettre l’un ou l’autre champ ou lui attribuer la valeur null. Vous pouvez aussi omettre translations ou lui attribuer la valeur null.

Conservez le texte anglais dans les champs de base de la fiche. Aucune traduction en-US n’est requise et l’outil d’importation n’en génère pas.

Les sous-titres traduits doivent tenir sur une seule ligne de 30 caractères maximum. Les descriptions traduites peuvent contenir des sauts de ligne \n et compter jusqu’à 4 000 caractères. Le texte fourni doit contenir au moins un caractère autre qu’un espace blanc et utiliser uniquement des caractères pris en charge. Les tabulations et les autres caractères de contrôle non pris en charge sont rejetés. Les limites s’appliquent au texte exact, espaces de début et de fin compris.

Les traductions sont validées lors de l’importation et conservées dans le paquet importé, y compris après modification des métadonnées. Leur importation ne modifie pas encore le texte affiché dans le répertoire de plugins ni celui renvoyé par l’API dans les réponses relatives aux fiches.