Les plugins soumis à l’annuaire public doivent respecter des exigences plus strictes que ceux installés dans un espace de travail. Pour figurer dans l’annuaire, un plugin doit réussir les contrôles communs à tous les paquets ainsi que les contrôles supplémentaires portant sur les champs de la fiche, les éléments fournis pour l’examen du plugin, les outils MCP, les skills, les ressources et les images. Cette référence couvre également les contrôles communs, notamment ceux des références aux serveurs MCP, dont les erreurs peuvent apparaître en dehors du portail de soumission.
Utilisez le code d’erreur renvoyé lors de la soumission pour retrouver l’exigence correspondante. Les erreurs bloquent la soumission. Les avertissements ne la bloquent pas, mais examinez-les avant de poursuivre.
Lorsqu’une valeur doit être non vide, elle doit contenir au moins un caractère autre qu’un caractère d’espacement. Le texte accepté exclut les caractères de contrôle, les séparateurs de ligne ou de paragraphe Unicode et les caractères de mise en forme invisibles non pris en charge. Les URL HTTPS doivent inclure un hôte et ne doivent contenir ni identifiants de connexion intégrés ni caractères non pris en charge.
Soumission finale à l’annuaire
Un paquet peut réussir la validation lors de l’importation, puis échouer lors de la soumission finale à l’annuaire. À cette étape, le portail applique des limites plus strictes aux champs de la fiche et vérifie la configuration MCP, les analyses des skills, les cas de test et les attestations de conformité aux politiques applicables.
| Champ | Règle de soumission finale |
|---|---|
| Nom du paquet | Obligatoire. 64 caractères maximum. Commencez par une lettre ou un chiffre ASCII et utilisez uniquement des lettres et des chiffres ASCII, _ et -. |
| Version | Obligatoire. Utilisez un numéro de version sémantique de 64 caractères maximum. |
| Nom affiché | Obligatoire. Une seule ligne de 30 caractères maximum. |
| Description courte | Obligatoire. Une seule ligne de 30 caractères maximum. |
| Description longue | Obligatoire. 4 000 caractères maximum. Les sauts de ligne sont autorisés. |
| Nom du développeur | Obligatoire. Une seule ligne de 80 caractères maximum. |
| Catégorie | Obligatoire. Choisissez une catégorie prise en charge dans la section Erreurs de fiche et d’interface. |
| Fonctionnalités | 20 maximum. Chaque fonctionnalité doit être décrite sur une seule ligne non vide de 120 caractères maximum. |
| Prompts de démarrage | 3 maximum. Chaque prompt doit être non vide, rester unique après normalisation Unicode et normalisation des espaces, tenir sur une seule ligne de 128 caractères maximum et ne contenir aucune @mention de serveur MCP. |
| URL | Obligatoires pour les soumissions de serveurs MCP distants, facultatives pour les imports ZIP de plugins contenant uniquement des skills. Les URL du site web, de l’assistance, de la politique de confidentialité et des conditions d’utilisation doivent utiliser HTTPS et compter au maximum 1 024 caractères chacune. |
| Couleurs de marque | Facultatives. Utilisez des couleurs hexadécimales à six chiffres. La couleur claire doit présenter un rapport de contraste d’au moins 2:1 avec le blanc, et la couleur sombre un rapport d’au moins 2:1 avec #212121. |
Pour toute soumission de plugin, les exigences suivantes s’appliquent également :
- Chaque skill inclus dans le paquet doit réussir les contrôles de sûreté et de sécurité. Les analyses peuvent prendre jusqu’à 2 heures.
- L’identité du développeur ou de l’entreprise doit être vérifiée et toutes les attestations de conformité requises doivent être fournies.
Pour la soumission finale d’un plugin MCP distant, fournissez également les éléments suivants :
- Des URL conformes aux règles ci-dessus pour le site web, l’assistance, la politique de confidentialité et les conditions d’utilisation.
- Un lien vers une vidéo de démonstration présentant les principaux cas d’utilisation et outils sur les plateformes prises en charge.
- Exactement cinq cas de test positifs, trois cas de test négatifs et des notes de version.
- Une URL HTTPS pour le serveur MCP de production, une vérification de domaine réussie et une analyse des outils à jour et réussie.
- Des valeurs explicites pour
readOnlyHint,openWorldHintetdestructiveHintsur chaque outil MCP, avec une justification pour chaque valeur. - Si le serveur utilise OAuth, des identifiants de démonstration utilisables par les personnes chargées de l’examen.
Erreurs de métadonnées lors de la soumission finale
Dans ces noms d’erreur, subtitle correspond à la description courte et description à la description longue.
| Nom | Exigence |
|---|---|
submission_display_name_required |
Le nom affiché est obligatoire et doit tenir sur une seule ligne non vide. |
submission_display_name_too_long |
Le nom affiché ne doit pas dépasser 30 caractères. |
submission_display_name_character_unsupported |
Le nom affiché doit contenir uniquement des caractères pris en charge et tenir sur une seule ligne. |
submission_subtitle_required |
La description courte est obligatoire et doit tenir sur une seule ligne non vide. |
submission_subtitle_too_long |
La description courte ne doit pas dépasser 30 caractères. |
submission_subtitle_character_unsupported |
La description courte doit contenir uniquement des caractères pris en charge et tenir sur une seule ligne. |
submission_description_required |
La description longue est obligatoire et ne doit pas être vide. Les sauts de ligne sont autorisés. |
submission_description_too_long |
La description longue ne doit pas dépasser 4 000 caractères. |
submission_description_character_unsupported |
La description longue doit contenir uniquement des caractères pris en charge. Les sauts de ligne sont autorisés. |
submission_developer_name_required |
Le nom du développeur est obligatoire et doit tenir sur une seule ligne non vide. |
submission_developer_name_too_long |
Le nom du développeur ne doit pas dépasser 80 caractères. |
submission_developer_name_character_unsupported |
Le nom du développeur doit contenir uniquement des caractères pris en charge et tenir sur une seule ligne. |
plugin_capability_invalid |
La description de chaque fonctionnalité doit être non vide, contenir uniquement des caractères pris en charge et tenir sur une seule ligne de 120 caractères maximum. |
plugin_default_prompt_mention |
Les prompts de démarrage ne doivent contenir aucune mention de serveur MCP sous la forme @mentions. |
plugin_default_prompt_duplicate |
Les prompts de démarrage doivent rester distincts après normalisation Unicode et normalisation des espaces. |
Erreurs liées à MCP et à l’examen du plugin
Ces erreurs concernent les soumissions de serveurs MCP distants.
| Nom | Exigence |
|---|---|
annotations_required |
Chaque outil MCP doit définir readOnlyHint, openWorldHint et destructiveHint de manière à refléter fidèlement son comportement. |
justification_required |
Pour chaque annotation de chaque outil MCP, justifiez la valeur choisie en précisant si l’outil fonctionne en lecture seule, interagit avec le monde extérieur ou effectue des opérations destructrices, selon l’annotation concernée. |
scan_required |
Les outils MCP doivent avoir fait l’objet d’une analyse réussie et à jour sur le serveur MCP de production. |
domain_verification_required |
Hébergez le jeton de vérification à l’identique à l’URL générée /.well-known/openai-apps-challenge, sur l’hôte MCP ou sur un hôte parent autorisé. La vérification lancée avec Vérifier le domaine doit réussir. |
frame_domain_explanation_required |
Pour chaque domaine externe utilisé dans un cadre et signalé par l’analyse des outils MCP, expliquez pourquoi l’interface en a besoin et quel contenu il fournit. |
Erreurs d’archive
Erreurs et avertissements lors de l’importation d’un ZIP
L’option Skills uniquement du portail accepte les paquets ZIP de skills et les plugins MCP locaux approuvés. Ces derniers peuvent être dépourvus de skills. Les erreurs bloquent l’importation. En cas d’avertissement, vous devez confirmer l’importation.
| Nom | Exigence |
|---|---|
plugin_name_mismatch |
Lors d’une mise à jour, le nom du paquet doit correspondre au nom du plugin existant. |
plugin_version_unchanged |
Pour une nouvelle version, modifiez la valeur du champ version du manifeste. Si vous réutilisez la version publiée, une confirmation est nécessaire. |
mcp_configuration_excluded |
La configuration MCP est exclue, sauf si votre organisation est autorisée à soumettre des plugins MCP locaux. Pour un plugin MCP local, demandez à votre interlocuteur chez OpenAI de confirmer que l’organisation qui soumet le plugin figure sur la liste des organisations autorisées. Pour soumettre des serveurs MCP distants, utilisez Avec MCP. |
app_configuration_excluded |
Les archives ZIP importées ne doivent inclure ni apps ni .app.json. Pour soumettre des serveurs MCP distants, utilisez Avec MCP. Pour les serveurs MCP locaux, suivez les instructions de soumission des plugins réservés à l’application de bureau. |
claude_format_normalized |
Le portail convertit .claude-plugin/plugin.json en .codex-plugin/plugin.json, complète les valeurs d’interface manquantes avec les valeurs par défaut et ajoute les champs de texte normalisés. |
manifest_normalized |
Le portail enregistre le manifeste normalisé dans .codex-plugin/plugin.json. Vous devez confirmer les modifications apportées aux champs. |
developer_name_defaulted |
Le portail renseigne automatiquement le nom du développeur sur la fiche à partir de l’identité vérifiée que vous avez sélectionnée, quel que soit le nom indiqué dans le ZIP. |
Erreurs liées à la structure et aux limites du ZIP
| Nom | Exigence |
|---|---|
archive_empty |
L’archive ne doit pas être vide. |
archive_too_large |
La taille du ZIP compressé ne doit pas dépasser 100 Mo. |
archive_format_not_zip |
L’archive doit être un fichier ZIP valide et intact. |
archive_member_path_empty |
Le chemin d’une entrée de l’archive ne doit pas être vide. |
archive_member_path_has_outer_whitespace |
Le chemin d’une entrée ne doit ni commencer ni se terminer par un caractère d’espacement. |
archive_member_path_has_backslash |
Dans les chemins des entrées, utilisez / comme séparateur. Les barres obliques inverses sont interdites. |
archive_member_path_absolute |
Le chemin d’une entrée doit être relatif à la racine de l’archive. |
archive_member_path_has_empty_segment |
Le chemin d’une entrée ne doit contenir aucun segment vide. |
archive_member_path_has_parent_segment |
Le chemin d’une entrée ne doit contenir aucun segment ... |
archive_member_path_too_deep |
Le chemin d’une entrée ne doit pas dépasser 20 segments, nom de fichier compris. |
archive_member_path_too_long |
Le chemin d’une entrée doit respecter la longueur maximale prise en charge. |
archive_member_path_normalization_collision |
Les chemins des entrées doivent rester distincts après normalisation de la casse et normalisation Unicode. |
archive_member_type_unsupported |
Les entrées de l’archive doivent être des fichiers ordinaires ou des répertoires. |
archive_member_too_large |
Une entrée de l’archive ne doit pas dépasser 100 Mio. |
archive_member_path_duplicate |
Chaque entrée de l’archive doit avoir un chemin unique. |
archive_member_path_type_conflict |
Un chemin de fichier ne peut pas également servir de chemin de répertoire ni contenir une autre entrée de l’archive. |
archive_too_many_entries |
L’archive ne doit pas contenir plus de 5 000 entrées. |
archive_uncompressed_too_large |
La taille de l’archive décompressée ne doit pas dépasser 512 Mio. |
archive_member_unreadable |
Chaque entrée de l’archive doit être lisible, ne pas être chiffrée et utiliser une méthode de compression prise en charge. |
Erreurs liées à la racine du plugin
| Nom | Exigence |
|---|---|
plugin_root_missing |
Le chemin sélectionné doit exister et correspondre à un répertoire contenant un plugin. |
archive_plugin_files_missing |
Le ZIP doit contenir un manifeste de plugin pris en charge et au moins un skill valide (ou un serveur MCP local approuvé). |
plugin_root_ambiguous |
Le ZIP doit contenir exactement une racine de plugin, soit à la racine de l’archive, soit dans un unique répertoire de premier niveau. |
plugin_root_has_siblings |
Si le plugin se trouve dans un répertoire de premier niveau, le ZIP ne doit contenir aucun fichier au même niveau que ce répertoire. |
Erreurs du manifeste du plugin
| Nom | Exigence |
|---|---|
plugin_manifest_missing |
À sa racine ou dans son unique répertoire de premier niveau, le ZIP doit contenir l’un des manifestes suivants : un fichier plugin.json à la racine du plugin conforme à un schéma Agent Plugins pris en charge, .codex-plugin/plugin.json, .agent-plugin/plugin.json ou .claude-plugin/plugin.json. |
plugin_manifest_not_file |
Le manifeste du plugin doit être un fichier JSON ordinaire. |
plugin_manifest_unreadable |
Le manifeste du plugin doit être un fichier texte lisible encodé en UTF-8. |
plugin_manifest_json_malformed |
Le manifeste du plugin doit contenir du JSON valide. En cas d’erreur de syntaxe, le diagnostic indique le numéro de ligne. |
plugin_manifest_root_not_object |
La racine du manifeste du plugin doit être un objet JSON. |
codex_manifest_parent_not_directory |
.codex-plugin doit être un répertoire. |
codex_manifest_path_not_file |
.codex-plugin/plugin.json doit être un fichier JSON ordinaire. |
plugin_id_wrong_type |
Si vous renseignez id, sa valeur doit être une chaîne de caractères. |
plugin_id_empty |
Si vous renseignez id, sa valeur ne doit pas être vide. |
plugin_name_missing |
Le champ name est obligatoire. |
plugin_name_wrong_type |
name doit être une chaîne de caractères. |
plugin_name_empty |
name ne doit pas être vide. |
plugin_name_too_long |
name ne doit pas dépasser 64 caractères. |
plugin_name_format |
name doit commencer par une lettre ou un chiffre ASCII et ne peut contenir que des lettres et des chiffres ASCII, _ ou -. |
plugin_version_missing |
Le champ version est obligatoire. |
plugin_version_wrong_type |
version doit être une chaîne de caractères. |
plugin_version_empty |
version doit être une chaîne non vide contenant un numéro de version sémantique, par exemple 1.0.0. |
plugin_version_not_semver |
version doit respecter le format de version sémantique, par exemple 1.0.0. |
plugin_version_too_long |
version ne doit pas dépasser 64 caractères. |
plugin_description_missing |
Le champ description est obligatoire. |
plugin_description_wrong_type |
description doit être une chaîne de caractères. |
plugin_description_empty |
description ne doit pas être vide. |
plugin_description_too_long |
description ne doit pas dépasser 1 024 caractères. |
plugin_description_character_unsupported |
description doit contenir uniquement des caractères pris en charge. Les sauts de ligne sont autorisés. |
plugin_developer_missing |
Le champ author.name est obligatoire. Le champ interface.developerName est également obligatoire et fait l’objet d’un diagnostic distinct. |
plugin_author_wrong_type |
author doit être un objet. |
plugin_author_name_wrong_type |
author.name doit être une chaîne de caractères. |
plugin_author_name_empty |
author.name ne doit pas être vide. |
plugin_author_name_too_long |
author.name ne doit pas dépasser 120 caractères. |
plugin_author_name_character_unsupported |
author.name doit contenir uniquement des caractères pris en charge. |
plugin_author_email_wrong_type |
Si vous renseignez author.email, sa valeur doit être une chaîne de caractères. |
plugin_author_email_empty |
Si vous renseignez author.email, sa valeur ne doit pas être vide. |
plugin_author_email_too_long |
author.email ne doit pas dépasser 320 caractères. |
plugin_author_email_character_unsupported |
author.email doit contenir uniquement des caractères pris en charge. |
plugin_author_url_wrong_type |
Si vous renseignez author.url, sa valeur doit être une chaîne de caractères. |
plugin_author_url_empty |
Si vous renseignez author.url, sa valeur ne doit pas être vide. |
plugin_author_url_not_https |
author.url doit être une URL HTTPS. |
plugin_author_url_has_credentials |
author.url ne doit contenir aucun identifiant de connexion. |
plugin_author_url_too_long |
author.url ne doit pas dépasser 2 048 caractères. |
plugin_author_url_character_unsupported |
author.url doit contenir uniquement des caractères pris en charge. |
Erreurs de fiche et d’interface
L’objet interface du manifeste du plugin définit la fiche publique présentée aux utilisateurs. Il se trouve dans .codex-plugin/plugin.json et utilise notamment les champs displayName et shortDescription :
{
"interface": {
"displayName": "Example Plugin",
"shortDescription": "Summarize documents",
"longDescription": "Summarize and organize documents.",
"developerName": "Example",
"category": "Productivity",
"capabilities": ["Summarize documents"]
}
}
Les quatre URL de la fiche (site web, politique de confidentialité, conditions d’utilisation et assistance) sont facultatives pour les imports ZIP de plugins contenant uniquement des skills. Elles sont obligatoires pour les soumissions de serveurs MCP distants. Chaque URL est limitée à 2 048 caractères lors de la validation du paquet et à 1 024 caractères lors de la soumission finale à l’annuaire.
| Nom | Exigence |
|---|---|
plugin_interface_wrong_type |
Le champ interface du manifeste du plugin doit être un objet JSON. |
plugin_display_name_wrong_type |
interface.displayName doit être une chaîne de caractères. |
plugin_display_name_empty |
interface.displayName est obligatoire et ne doit pas être vide. |
plugin_display_name_too_long |
interface.displayName ne doit pas dépasser 80 caractères pour la validation du paquet et 30 pour la soumission finale à l’annuaire. |
plugin_display_name_character_unsupported |
interface.displayName doit contenir uniquement des caractères pris en charge. |
plugin_short_description_missing |
interface.shortDescription est obligatoire et doit tenir sur une seule ligne, avec un maximum de 240 caractères pour la validation du paquet et de 30 pour la soumission finale à l’annuaire. |
plugin_short_description_wrong_type |
interface.shortDescription doit être une chaîne de caractères. |
plugin_short_description_empty |
interface.shortDescription ne doit pas être vide. |
plugin_short_description_too_long |
interface.shortDescription ne doit pas dépasser 240 caractères pour la validation du paquet et 30 pour la soumission finale à l’annuaire. |
plugin_short_description_character_unsupported |
interface.shortDescription doit contenir uniquement des caractères pris en charge. |
plugin_long_description_wrong_type |
interface.longDescription doit être une chaîne de caractères. |
plugin_long_description_empty |
interface.longDescription est obligatoire et ne doit pas être vide. |
plugin_long_description_too_long |
interface.longDescription ne doit pas dépasser 4 000 caractères. |
plugin_long_description_character_unsupported |
interface.longDescription doit contenir uniquement des caractères pris en charge. Les sauts de ligne sont autorisés. |
plugin_developer_name_wrong_type |
interface.developerName doit être une chaîne de caractères. |
plugin_developer_name_empty |
interface.developerName est obligatoire et ne doit pas être vide. |
plugin_developer_name_too_long |
interface.developerName ne doit pas dépasser 120 caractères pour la validation du paquet et 80 pour la soumission finale à l’annuaire. |
plugin_developer_name_character_unsupported |
interface.developerName doit contenir uniquement des caractères pris en charge. |
plugin_category_wrong_type |
interface.category doit être une chaîne de caractères. |
plugin_category_empty |
Si vous renseignez interface.category, sa valeur ne doit pas être vide. Omettez ce champ pour utiliser Other. |
plugin_category_unknown |
interface.category doit prendre l’une des valeurs suivantes : Productivity, Creativity, Developer Tools, Business & Operations, Data & Analytics, Communication, Education & Research, Security, Finance, Healthcare, Travel, Entertainment ou Other. |
plugin_category_character_unsupported |
interface.category doit contenir uniquement des caractères pris en charge. |
plugin_capabilities_wrong_type |
interface.capabilities doit être une liste de chaînes de caractères. |
plugin_capabilities_too_many |
interface.capabilities ne doit pas contenir plus de 20 entrées. |
plugin_capability_wrong_type |
Chaque entrée de interface.capabilities doit être une chaîne de caractères. |
plugin_capability_empty |
Aucune entrée fournie dans interface.capabilities ne doit être vide. |
plugin_capability_too_long |
Chaque entrée de interface.capabilities est limitée à 120 caractères. |
plugin_capability_character_unsupported |
Chaque entrée de interface.capabilities doit contenir uniquement des caractères pris en charge. |
plugin_website_url_wrong_type |
Si vous renseignez interface.websiteURL, sa valeur doit être une chaîne de caractères. |
plugin_website_url_empty |
Si vous renseignez interface.websiteURL, sa valeur ne doit pas être vide. |
plugin_website_url_format |
interface.websiteURL doit être une URL HTTPS. |
plugin_website_url_too_long |
interface.websiteURL doit respecter les limites de longueur des URL de la fiche. |
plugin_privacy_policy_url_wrong_type |
Si vous renseignez interface.privacyPolicyURL, sa valeur doit être une chaîne de caractères. |
plugin_privacy_policy_url_empty |
Si vous renseignez interface.privacyPolicyURL, sa valeur ne doit pas être vide. |
plugin_privacy_policy_url_format |
interface.privacyPolicyURL doit être une URL HTTPS. |
plugin_privacy_policy_url_too_long |
interface.privacyPolicyURL doit respecter les limites de longueur des URL de la fiche. |
plugin_terms_of_service_url_wrong_type |
Si vous renseignez interface.termsOfServiceURL, sa valeur doit être une chaîne de caractères. |
plugin_terms_of_service_url_empty |
Si vous renseignez interface.termsOfServiceURL, sa valeur ne doit pas être vide. |
plugin_terms_of_service_url_format |
interface.termsOfServiceURL doit être une URL HTTPS. |
plugin_terms_of_service_url_too_long |
interface.termsOfServiceURL doit respecter les limites de longueur des URL de la fiche. |
plugin_support_url_wrong_type |
Si vous renseignez interface.supportURL, sa valeur doit être une chaîne de caractères. |
plugin_support_url_empty |
Si vous renseignez interface.supportURL, sa valeur ne doit pas être vide. |
plugin_support_url_format |
interface.supportURL doit être une URL HTTPS. |
plugin_support_url_too_long |
interface.supportURL doit respecter les limites de longueur des URL de la fiche. |
plugin_homepage_wrong_type |
Si vous renseignez homepage, sa valeur doit être une chaîne de caractères. |
plugin_homepage_empty |
Si vous renseignez homepage, sa valeur ne doit pas être vide. |
plugin_homepage_format |
homepage doit être une URL HTTPS. |
plugin_homepage_too_long |
homepage ne doit pas dépasser 2 048 caractères. |
plugin_brand_color_wrong_type |
Si vous renseignez interface.brandColor, sa valeur doit être une chaîne de caractères. |
plugin_brand_color_empty |
Si vous renseignez interface.brandColor, sa valeur ne doit pas être vide. |
plugin_brand_color_format |
interface.brandColor doit être une couleur hexadécimale à six chiffres, par exemple #1ABCFE. |
plugin_brand_color_dark_wrong_type |
Si vous renseignez interface.brandColorDark, sa valeur doit être une chaîne de caractères. |
plugin_brand_color_dark_empty |
Si vous renseignez interface.brandColorDark, sa valeur ne doit pas être vide. |
plugin_brand_color_dark_format |
interface.brandColorDark doit être une couleur hexadécimale à six chiffres, par exemple #1ABCFE. |
plugin_brand_color_contrast |
interface.brandColor doit présenter un rapport de contraste d’au moins 2:1 avec le blanc. |
plugin_brand_color_dark_contrast |
interface.brandColorDark doit présenter un rapport de contraste d’au moins 2:1 avec #212121. |
plugin_default_prompt_wrong_type |
interface.defaultPrompt doit être une chaîne de caractères ou une liste de chaînes de caractères. |
plugin_default_prompt_too_many |
interface.defaultPrompt ne doit pas contenir plus de trois prompts. |
plugin_default_prompt_entry_wrong_type |
Chaque entrée de interface.defaultPrompt doit être une chaîne de caractères. |
plugin_default_prompt_empty |
Aucune entrée fournie dans interface.defaultPrompt ne doit être vide. |
plugin_default_prompt_too_long |
Chaque entrée de interface.defaultPrompt est limitée à 512 caractères pour la validation du paquet et à 128 pour la soumission finale à l’annuaire. |
plugin_default_prompt_character_unsupported |
Chaque entrée de interface.defaultPrompt doit contenir uniquement des caractères pris en charge et tenir sur une seule ligne. |
Erreurs liées au contenu du plugin
| Nom | Exigence |
|---|---|
plugin_skills_path_wrong_type |
skills doit être une chaîne de caractères indiquant le chemin du répertoire skills/ situé à la racine. |
plugin_skills_path_empty |
Si vous renseignez skills, sa valeur doit être un chemin non vide vers le répertoire skills/ situé à la racine. |
plugin_skills_path_unsupported |
skills doit pointer vers le répertoire skills/ situé à la racine. |
plugin_skills_directory_missing |
Si vous déclarez le répertoire skills/ à la racine, il doit exister. |
plugin_skills_path_not_directory |
Si vous déclarez skills/ à la racine, ce chemin doit correspondre à un répertoire. |
plugin_apps_path_wrong_type |
apps doit être une chaîne de caractères indiquant le chemin du fichier .app.json situé à la racine. |
plugin_apps_path_empty |
Si vous renseignez apps, sa valeur doit être un chemin non vide vers le fichier .app.json situé à la racine. |
plugin_apps_path_unsupported |
apps doit pointer vers le fichier .app.json situé à la racine. |
plugin_apps_file_missing |
Si vous déclarez le fichier .app.json à la racine, il doit exister. |
plugin_apps_path_not_file |
Si vous déclarez .app.json à la racine, il doit s’agir d’un fichier ordinaire. |
plugin_mcp_path_wrong_type |
mcpServers doit être une chaîne de caractères indiquant le chemin du fichier .mcp.json situé à la racine. |
plugin_mcp_path_empty |
mcpServers doit être un chemin non vide. Donnez-lui la valeur ./.mcp.json ou supprimez le champ. |
plugin_mcp_path_unsupported |
mcpServers doit pointer vers le fichier .mcp.json situé à la racine. |
plugin_mcp_file_missing |
mcpServers déclare le fichier .mcp.json à la racine, mais ce fichier n’existe pas. |
plugin_mcp_path_not_file |
À la racine, .mcp.json doit être un fichier ordinaire. |
plugin_runtime_surface_missing |
Un ZIP soumis à l’annuaire public doit contenir au moins un skill valide (ou un serveur MCP local approuvé). Les paquets locaux ou destinés à un espace de travail peuvent également référencer un serveur MCP éligible. |
Erreurs du manifeste MCP
Ces erreurs concernent le fichier de compatibilité .mcp.json. Lors de l’importation d’un paquet portable, le système génère ce fichier et .codex-plugin/plugin.json à partir des fichiers plugin.json et mcp.json situés à la racine. Les erreurs de chemin des composants décrites ci-dessus peuvent également concerner ces fichiers générés. Corrigez la configuration source du paquet portable. Ne renommez pas mcp.json en .mcp.json simplement parce qu’un diagnostic de compatibilité mentionne ce dernier nom.
| Nom | Exigence |
|---|---|
mcp_manifest_unreadable |
.mcp.json doit être un fichier texte lisible encodé en UTF-8. |
mcp_manifest_json_malformed |
.mcp.json doit contenir du JSON valide. En cas d’erreur de syntaxe, le diagnostic indique le numéro de ligne. |
mcp_manifest_wrong_type |
La racine de .mcp.json doit être un objet JSON. |
mcp_servers_missing |
.mcp.json doit contenir le champ mcpServers à la racine. |
mcp_servers_wrong_type |
mcpServers doit être un objet. |
mcp_server_name_empty |
Le nom de chaque serveur MCP doit contenir au moins un caractère autre qu’un caractère d’espacement. |
mcp_server_wrong_type |
Chaque valeur mcpServers.<server-name> doit être un objet contenant la déclaration du serveur correspondant. |
Erreurs liées aux skills
| Nom | Exigence |
|---|---|
skill_manifest_missing |
Le skill doit contenir un fichier SKILL.md. |
skill_bundle_too_large |
La taille de chaque paquet de skill compressé doit respecter la limite indiquée en Mio dans le message d’erreur. |
skill_directory_hidden |
Le nom d’un répertoire de skill ne doit pas commencer par .. |
skill_manifest_nested |
Chaque répertoire de skill doit se trouver directement sous skills/. |
skill_manifest_not_regular_file |
SKILL.md doit être un fichier ordinaire. |
skill_manifest_unreadable |
SKILL.md doit être lisible. |
skill_manifest_invalid_utf8 |
SKILL.md doit contenir du texte UTF-8 valide. |
skill_frontmatter_missing |
SKILL.md doit commencer par un en-tête YAML délimité par deux lignes ---. |
skill_frontmatter_unclosed |
L’en-tête YAML de SKILL.md doit se terminer par ---. |
skill_frontmatter_yaml_malformed |
L’en-tête de SKILL.md doit contenir du YAML valide. |
skill_frontmatter_wrong_type |
L’en-tête de SKILL.md doit contenir une table de correspondance YAML. |
skill_name_missing |
Le champ name est obligatoire et ne doit pas être vide. |
skill_name_wrong_type |
name doit être une chaîne de caractères. |
skill_name_empty |
name ne doit pas être vide. |
skill_name_character_unsupported |
Dans l’en-tête du skill, name doit contenir uniquement des caractères pris en charge. |
skill_description_missing |
Le champ description est obligatoire et ne doit pas être vide. |
skill_description_wrong_type |
description doit être une chaîne de caractères. |
skill_description_empty |
description ne doit pas être vide. |
skill_description_too_long |
description ne doit pas dépasser 1 024 caractères. |
skill_description_character_unsupported |
Dans l’en-tête du skill, description doit contenir uniquement des caractères pris en charge. |
skill_body_empty |
Les instructions du skill ne doivent pas être vides. |
skill_identity_too_long |
Le nom formé en combinant ceux du plugin et du skill (plugin-name:skill-name) ne doit pas dépasser 64 caractères. |
skill_identity_duplicate |
La valeur de name doit être unique pour chaque skill du plugin. |
Erreurs liées aux métadonnées d’agent d’un skill
Un skill inclus dans le paquet peut définir sa propre interface dans skills/<skill>/agents/openai.yaml. Cette configuration détermine la présentation du skill aux utilisateurs et est distincte de l’objet interface du manifeste du plugin. Les noms des champs d’interface du skill suivent la convention snake_case :
interface:
display_name: "Summarize documents"
short_description: "Summarize a document"
icon_small: "./assets/icon.png"
default_prompt: "Summarize the selected document."
| Nom | Exigence |
|---|---|
skill_agent_not_regular_file |
agents/openai.yaml doit être un fichier ordinaire. |
skill_agent_unreadable |
agents/openai.yaml doit être lisible. |
skill_agent_invalid_utf8 |
agents/openai.yaml doit contenir du texte UTF-8 valide. |
skill_agent_yaml_malformed |
agents/openai.yaml doit contenir du YAML valide. |
skill_agent_top_level_wrong_type |
La racine de agents/openai.yaml doit être une table de correspondance YAML. |
skill_agent_interface_missing |
Le champ interface est obligatoire dans agents/openai.yaml si le paquet inclut ce fichier. |
skill_agent_interface_wrong_type |
Le champ interface de agents/openai.yaml doit être une table de correspondance YAML. |
skill_agent_display_name_missing |
Le champ interface.display_name est obligatoire et ne doit pas être vide. |
skill_agent_display_name_wrong_type |
interface.display_name doit être une chaîne de caractères. |
skill_agent_display_name_empty |
interface.display_name ne doit pas être vide. |
skill_agent_short_description_missing |
Le champ interface.short_description est obligatoire et ne doit pas être vide. |
skill_agent_short_description_wrong_type |
interface.short_description doit être une chaîne de caractères. |
skill_agent_short_description_empty |
interface.short_description ne doit pas être vide. |
skill_agent_icon_small_wrong_type |
Si vous renseignez interface.icon_small, sa valeur doit être un chemin de fichier relatif non vide. |
skill_agent_icon_small_empty |
Si vous renseignez interface.icon_small, sa valeur doit être un chemin de fichier relatif non vide, par exemple assets/icon.png. |
skill_agent_icon_large_wrong_type |
Si vous renseignez interface.icon_large, sa valeur doit être un chemin de fichier relatif non vide. |
skill_agent_icon_large_empty |
Si vous renseignez interface.icon_large, sa valeur doit être un chemin de fichier relatif non vide, par exemple assets/icon.png. |
skill_agent_brand_color_wrong_type |
Si vous renseignez interface.brand_color, sa valeur doit être une chaîne de caractères. |
skill_agent_brand_color_empty |
Si vous renseignez interface.brand_color, sa valeur doit être non vide et représenter une couleur hexadécimale à six chiffres, par exemple #1ABCFE. |
skill_agent_brand_color_format |
interface.brand_color doit être une couleur hexadécimale à six chiffres, par exemple #1ABCFE. |
skill_agent_default_prompt_wrong_type |
Si vous renseignez interface.default_prompt, sa valeur doit être une chaîne de caractères. |
skill_agent_default_prompt_empty |
Si vous renseignez interface.default_prompt, sa valeur ne doit pas être vide. |
skill_agent_policy_wrong_type |
Si vous renseignez policy, sa valeur doit être une table de correspondance YAML. |
skill_agent_allow_implicit_invocation_wrong_type |
policy ne peut contenir que products et allow_implicit_invocation. products doit contenir CHAT, CODEX ou les deux, et allow_implicit_invocation doit valoir true ou false. |
skill_agent_dependencies_wrong_type |
dependencies doit être une table de correspondance YAML. Seule la clé tools est prise en charge. |
skill_agent_dependency_unsupported |
Seul dependencies.tools est pris en charge dans agents/openai.yaml. |
Erreurs liées aux chemins des ressources
| Nom | Exigence |
|---|---|
declared_asset_path_wrong_type |
Le champ de ressource indiqué doit contenir une chaîne de caractères représentant un chemin de fichier. |
declared_asset_path_empty |
Le champ de ressource indiqué ne doit pas être vide. |
declared_asset_path_has_outer_whitespace |
La valeur du champ de ressource indiqué ne doit ni commencer ni se terminer par un caractère d’espacement. |
declared_asset_path_has_control_character |
Le champ de ressource indiqué ne doit contenir aucun caractère compris entre U+0000 et U+001F, ni le caractère U+007F. |
branding_asset_path_missing_root_prefix |
La valeur du champ de ressource indiqué doit commencer par ./. |
declared_asset_path_unsafe |
Le champ de ressource indiqué doit contenir un chemin relatif interne au plugin, sans chemin absolu, préfixe de lecteur ni segment .. permettant de remonter d’un répertoire. |
declared_asset_path_outside_package |
Le champ de ressource indiqué doit référencer un fichier situé dans le plugin. |
declared_asset_file_missing |
Le champ de ressource indiqué référence un fichier qui n’existe pas. |
declared_asset_not_regular_file |
Le champ de ressource indiqué doit référencer un fichier ordinaire. Les répertoires et les fichiers spéciaux ne sont pas acceptés. |
Erreurs liées aux images
Les images de marque utilisées dans l’annuaire doivent être dans un format pris en charge et respecter les limites de taille et de dimensions ci-dessous. Ces règles s’appliquent aux ressources de marque incluses dans le paquet.
| Nom | Exigence |
|---|---|
plugin_logo_path_missing |
Le champ interface.logo est obligatoire et doit référencer une image carrée. |
plugin_composer_icon_path_missing |
Le champ interface.composerIcon est obligatoire et doit référencer une image carrée. |
image_file_unreadable |
Le fichier image doit être lisible. |
image_file_too_large |
La taille de l’image ne doit pas dépasser 5 Mio. |
image_file_format_unsupported |
Le nom du fichier image doit se terminer par .png, .jpg, .jpeg, .webp ou .svg. |
raster_image_decode_failed |
L’image matricielle doit être un fichier PNG, JPEG ou WebP pouvant être décodé en toute sécurité. |
raster_image_extension_content_mismatch |
L’extension du fichier image doit correspondre au format d’image détecté. |
raster_image_not_square |
L’image doit être carrée. |
raster_image_dimensions_too_small |
L’image doit mesurer au moins 48 × 48 pixels. |
raster_image_dimensions_too_large |
Les dimensions de l’image ne doivent pas dépasser 4 096 × 4 096 pixels. |
svg_xml_malformed |
Le fichier SVG doit contenir du XML valide encodé en UTF-8. |
svg_root_element_invalid |
L’élément racine du fichier SVG doit être <svg>. |
svg_dimensions_missing |
Le fichier SVG doit définir un attribut viewBox avec des valeurs numériques, ou des attributs width et height numériques. |
svg_dimensions_not_numeric |
Les dimensions du SVG doivent être numériques et exprimées sans unité ni pourcentage. |
svg_dimensions_not_positive |
La largeur et la hauteur du SVG doivent être des nombres finis strictement positifs. |
svg_dimensions_not_square |
La largeur et la hauteur du SVG doivent être égales. |
svg_dimensions_too_small |
Le SVG doit mesurer au moins 48 × 48 pixels. |
Erreurs de référence aux serveurs MCP
Les contrôles communs aux paquets valident .app.json lorsqu’un plugin référence des serveurs MCP enregistrés. Le portail de soumission ne publie pas les références à des intégrations existantes. Un import via Skills uniquement supprime .app.json. Utilisez Avec MCP pour soumettre directement le serveur MCP.
Dans les paquets locaux ou destinés à un espace de travail, l’objet apps situé à la racine associe chaque alias de serveur MCP à l’entrée d’un serveur enregistré. Ces noms de configuration et ces codes d’erreur conservent la graphie app.
| Nom | Exigence |
|---|---|
app_manifest_unreadable |
.app.json doit être un fichier texte lisible encodé en UTF-8. |
app_manifest_json_malformed |
.app.json contient une erreur de syntaxe JSON à proximité de la ligne indiquée. |
app_manifest_wrong_type |
La racine de .app.json doit être un objet JSON. |
app_entries_missing |
Le champ apps est obligatoire. |
app_entries_wrong_type |
apps doit être un objet. |
app_entry_wrong_type |
Chaque entrée de serveur doit être un objet. |
app_id_missing |
Chaque entrée de serveur doit contenir un champ id. |
app_id_wrong_type |
Dans chaque entrée de serveur, id doit être une chaîne de caractères. |
app_id_format |
Dans chaque entrée de serveur, id doit commencer par asdk_app_, connector_ ou templated_apps_. Le préfixe doit être suivi d’une lettre ou d’un chiffre. Les caractères suivants ne peuvent être que des lettres, des chiffres, _ ou -. |
app_entry_optional_wrong_type |
Dans chaque entrée de serveur, si vous renseignez optional, sa valeur doit être true ou false. |
app_entry_required_wrong_type |
Dans chaque entrée de serveur, si vous renseignez required, sa valeur doit être true ou false. |
app_not_eligible |
Un paquet local ou destiné à un espace de travail doit référencer un serveur MCP éligible et disponible. Pour une soumission à l’annuaire, utilisez Avec MCP et soumettez directement le serveur MCP. |
Avertissements liés au paquet
Ces avertissements signalent les éléments du paquet que le processus de validation ignore ou normalise. Ils ne bloquent pas la soumission. Examinez-les pour vérifier que le plugin soumis contient les fichiers et les paramètres attendus.
| Nom | Exigence |
|---|---|
duplicate_app_reference |
Chaque identifiant de serveur doit apparaître une seule fois dans .app.json. Les références en double sont traitées comme un seul serveur. |
undeclared_app_manifest_ignored |
Le fichier .app.json situé à la racine est importé uniquement si le champ apps du manifeste du plugin a pour valeur ./.app.json. |
undeclared_mcp_manifest_ignored |
Le fichier .mcp.json situé à la racine est importé uniquement si le champ mcpServers du manifeste du plugin a pour valeur ./.mcp.json. |
skill_file_ignored |
Les fichiers placés directement sous skills/ ne sont pas importés en tant que skills. Chaque skill doit se trouver dans un répertoire contenant SKILL.md. |
skill_symlink_ignored |
Les liens symboliques placés directement sous skills/ ne sont pas importés en tant que skills. Chaque skill doit se trouver dans un répertoire réel contenant SKILL.md. |
skill_frontmatter_adjusted |
Lors de l’importation, les champs name et description du skill sont normalisés : les caractères d’espacement en début et en fin de valeur sont supprimés et les suites de caractères d’espacement à l’intérieur sont ramenées à un seul espace. |
skill_metadata_ignored |
Configurez l’interface du skill dans la table de correspondance interface de agents/openai.yaml. Le champ metadata de SKILL.md ne configure pas l’interface. |
Étapes suivantes
Après avoir corrigé toutes les erreurs de validation, revenez à la page Soumettre des plugins pour terminer la soumission.