For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale

Erreurs de soumission de plugins

Identifiez et corrigez les erreurs de validation des plugins soumis à l’annuaire public

Les plugins soumis à l’annuaire public doivent respecter des exigences plus strictes que les plugins installés dans un espace de travail. Les soumissions à l’annuaire doivent réussir les contrôles communs des packages ainsi que les contrôles supplémentaires portant sur les champs de la fiche, les éléments fournis pour la révision, les outils MCP, les skills, les ressources et les images. Cette référence couvre également les contrôles communs des packages, comme ceux des références aux serveurs MCP, qui peuvent intervenir en dehors du portail de soumission.

Utilisez le code d’erreur renvoyé lors de la soumission pour trouver l’exigence correspondante. Les erreurs bloquent la soumission. Les avertissements ne la bloquent pas, mais vous devez les examiner avant de continuer.

Les valeurs non vides ne peuvent pas contenir uniquement des caractères d’espacement. Le texte pris en charge 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 contenir ni identifiants intégrés ni caractères non pris en charge.

Soumission finale à l’annuaire

Un package peut réussir la validation lors du téléversement et échouer à la soumission finale à l’annuaire. Cette dernière impose des limites plus strictes à la fiche et vérifie la configuration MCP, les analyses des skills, les cas de test et les attestations de conformité aux politiques.

ChampRègle de soumission finale
Nom du packageObligatoire ; 64 caractères maximum. Commencez par une lettre ASCII ou un chiffre et utilisez uniquement des lettres ASCII, des chiffres, _ et -.
VersionObligatoire ; utilisez une version sémantique de 64 caractères maximum.
Nom affichéObligatoire ; une seule ligne ; 30 caractères maximum.
Description courteObligatoire ; une seule ligne ; 30 caractères maximum.
Description longueObligatoire ; 4 000 caractères maximum. Les sauts de ligne sont autorisés.
Nom du développeurObligatoire ; une seule ligne ; 80 caractères maximum.
CatégorieObligatoire ; choisissez une catégorie prise en charge dans la section Erreurs de fiche et d’interface.
Capacités20 maximum. Chaque capacité doit être non vide, tenir sur une seule ligne et comporter au maximum 120 caractères.
Prompts de démarrage3 maximum. Chaque prompt doit être non vide, unique après normalisation Unicode et normalisation des caractères d’espacement, tenir sur une seule ligne, comporter au maximum 128 caractères et ne contenir aucune @mention de serveur MCP.
URLObligatoires pour les soumissions MCP à distance ; facultatives pour les téléversements 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 comporter au maximum 1 024 caractères.
Couleurs de marqueCouleurs hexadécimales à six chiffres, facultatives. La couleur claire doit présenter un rapport de contraste d’au moins 2:1 avec le blanc, et la couleur sombre un rapport de contraste d’au moins 2:1 avec #212121.

Toute soumission de plugin nécessite également :

  • La réussite de toutes les analyses de sécurité pour chaque skill inclus. Ces analyses peuvent prendre jusqu’à 2 heures.
  • Une identité de développeur ou d’entreprise vérifiée et toutes les attestations de conformité aux politiques requises.

Pour un plugin MCP à distance, la soumission finale nécessite également :

  • Des URL du site web, de l’assistance, de la politique de confidentialité et des conditions d’utilisation conformes aux règles ci-dessus.
  • L’URL d’un enregistrement 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 du serveur MCP en production, un défi de vérification du domaine réussi et une analyse des outils réussie et à jour.
  • Des valeurs explicites pour readOnlyHint, openWorldHint et destructiveHint, ainsi qu’une justification de chaque valeur pour chaque outil MCP.
  • Des identifiants de démonstration prêts à l’emploi pour les personnes chargées de la révision lorsque le serveur utilise OAuth.
  • Des captures d’écran uniquement lorsque le serveur MCP fournit une interface personnalisée. Si vous ajoutez des captures d’écran, fournissez une image PNG ou JPEG pour chaque prompt de démarrage. Chaque capture d’écran doit mesurer exactement 706 pixels de large et entre 400 et 860 pixels de haut.

Erreurs de métadonnées à la soumission finale

Dans ces noms d’erreurs, subtitle correspond à la description courte et description à la description longue.

NomExigence
submission_display_name_requiredLe nom affiché est obligatoire, doit être non vide et tenir sur une seule ligne.
submission_display_name_too_longLe nom affiché doit comporter au maximum 30 caractères.
submission_display_name_character_unsupportedLe nom affiché doit utiliser du texte pris en charge et tenir sur une seule ligne.
submission_subtitle_requiredLa description courte est obligatoire, doit être non vide et tenir sur une seule ligne.
submission_subtitle_too_longLa description courte doit comporter au maximum 30 caractères.
submission_subtitle_character_unsupportedLa description courte doit utiliser du texte pris en charge et tenir sur une seule ligne.
submission_description_requiredLa description longue est obligatoire et doit être non vide. Les sauts de ligne sont autorisés.
submission_description_too_longLa description longue doit comporter au maximum 4 000 caractères.
submission_description_character_unsupportedLa description longue doit utiliser du texte pris en charge. Les sauts de ligne sont autorisés.
submission_developer_name_requiredLe nom du développeur est obligatoire, doit être non vide et tenir sur une seule ligne.
submission_developer_name_too_longLe nom du développeur doit comporter au maximum 80 caractères.
submission_developer_name_character_unsupportedLe nom du développeur doit utiliser du texte pris en charge et tenir sur une seule ligne.
plugin_capability_invalidChaque capacité doit être non vide, utiliser du texte pris en charge, tenir sur une seule ligne et comporter au maximum 120 caractères.
plugin_default_prompt_mentionLes prompts de démarrage ne doivent pas contenir de @mentions de serveur MCP.
plugin_default_prompt_duplicateLes prompts de démarrage doivent être uniques après normalisation Unicode et normalisation des caractères d’espacement.

Erreurs MCP et de révision

Ces erreurs s’appliquent aux soumissions MCP à distance.

NomExigence
annotations_requiredChaque outil MCP doit définir correctement readOnlyHint, openWorldHint et destructiveHint.
justification_requiredChaque annotation d’un outil MCP doit justifier son comportement en lecture seule, en monde ouvert ou destructif.
scan_requiredLes outils MCP doivent disposer d’une analyse réussie et à jour du serveur MCP de production.
domain_verification_requiredLe token de vérification exact doit être hébergé à l’URL /.well-known/openai-apps-challenge générée, sur l’hôte MCP ou un hôte parent autorisé, et la vérification Vérifier le domaine doit réussir.
frame_domain_explanation_requiredPour chaque domaine de cadre externe signalé par l’analyse des outils MCP, une explication doit préciser pourquoi l’interface en a besoin et quel contenu il fournit.
screenshots_not_allowedLes captures d’écran ne sont autorisées que si l’analyse actuelle des outils MCP signale un modèle de sortie d’interface utilisateur.

Erreurs d’archive

Erreurs et avertissements lors de l’importation d’un ZIP

Le parcours Skills uniquement du portail accepte les packages ZIP de skills. Les erreurs bloquent l’importation ; les avertissements nécessitent une confirmation.

NomExigence
plugin_name_mismatchLors d’une mise à jour, le nom du package doit correspondre au nom du plugin existant.
plugin_version_unchangedUne nouvelle version doit utiliser une valeur version différente dans le manifeste ; la réutilisation de la version publiée nécessite une confirmation.
mcp_configuration_excludedLes importations de skills uniquement excluent mcpServers, mcp.json et .mcp.json. Soumettez un serveur MCP distant via Avec MCP.
app_configuration_excludedLes ZIP importés contenant uniquement des skills ne doivent inclure ni apps ni .app.json ; les plugins avec des serveurs MCP doivent utiliser Avec MCP.
screenshot_configuration_excludedLes ZIP importés contenant uniquement des skills ne doivent pas inclure interface.screenshots ; les captures d’écran nécessitent Avec MCP et une interface personnalisée.
claude_format_normalized.claude-plugin/plugin.json est converti en .codex-plugin/plugin.json, et le portail ajoute les valeurs par défaut manquantes de l’interface ainsi que les champs de texte normalisés.
manifest_normalizedLe portail enregistre le manifeste normalisé dans .codex-plugin/plugin.json ; les modifications des champs nécessitent une confirmation.
developer_name_defaultedauthor.name et interface.developerName doivent correspondre ; sinon, l’identité vérifiée sélectionnée est utilisée pour les deux après confirmation.

Erreurs de structure et de limites du ZIP

NomExigence
archive_emptyL’archive ne doit pas être vide.
archive_too_largeLe ZIP compressé ne doit pas dépasser 100 Mo.
archive_format_not_zipL’archive doit être un fichier ZIP valide et non corrompu.
archive_member_path_emptyLe chemin d’une entrée de l’archive ne doit pas être vide.
archive_member_path_has_outer_whitespaceLe chemin d’une entrée de l’archive ne doit ni commencer ni se terminer par un caractère d’espacement.
archive_member_path_has_backslashLe chemin d’une entrée de l’archive doit utiliser /, et non des barres obliques inverses.
archive_member_path_absoluteLe chemin d’une entrée de l’archive doit être relatif à la racine de l’archive.
archive_member_path_has_empty_segmentLe chemin d’une entrée de l’archive ne doit pas contenir de segments vides.
archive_member_path_has_parent_segmentLe chemin d’une entrée de l’archive ne doit pas contenir de segments ...
archive_member_path_too_deepLe chemin d’une entrée de l’archive doit contenir au maximum 20 segments, nom de fichier compris.
archive_member_path_too_longLe chemin d’une entrée de l’archive doit respecter la longueur maximale prise en charge.
archive_member_path_normalization_collisionLes chemins des entrées de l’archive doivent rester uniques après normalisation de la casse et normalisation Unicode.
archive_member_type_unsupportedLes entrées de l’archive doivent être des fichiers ordinaires ou des répertoires.
archive_member_too_largeUne entrée de l’archive ne doit pas dépasser 100 Mio.
archive_member_path_duplicateLe chemin d’une entrée de l’archive doit être unique.
archive_member_path_type_conflictUn chemin de fichier ne peut pas également désigner un répertoire ni contenir une autre entrée de l’archive.
archive_too_many_entriesL’archive ne doit pas contenir plus de 5 000 entrées.
archive_uncompressed_too_largeL’archive extraite ne doit pas dépasser 512 Mio.
archive_member_unreadableChaque entrée de l’archive doit être lisible, ne doit pas être chiffrée et doit utiliser une méthode de compression prise en charge.

Erreurs de racine du plugin

NomExigence
plugin_root_missingLe chemin sélectionné doit exister et désigner un répertoire contenant un plugin.
archive_plugin_files_missingUn ZIP contenant uniquement des skills doit inclure un manifeste de plugin pris en charge et au moins un skill valide.
plugin_root_ambiguousLe ZIP doit contenir exactement une racine de plugin, soit à la racine de l’archive, soit dans un répertoire de premier niveau.
plugin_root_has_siblingsUn ZIP contenant un répertoire de plugin au premier niveau ne doit pas contenir de fichiers au même niveau que ce répertoire.

Erreurs du manifeste de plugin

NomExigence
plugin_manifest_missingLe ZIP doit contenir, à sa racine ou dans son unique répertoire de premier niveau, soit un fichier racine plugin.json utilisant un schéma Agent Plugins pris en charge, soit .codex-plugin/plugin.json, .agent-plugin/plugin.json ou .claude-plugin/plugin.json.
plugin_manifest_not_fileLe manifeste de plugin doit être un fichier JSON ordinaire.
plugin_manifest_unreadableLe manifeste de plugin doit être un texte UTF-8 lisible.
plugin_manifest_json_malformedLe manifeste de plugin doit contenir du JSON valide ; les erreurs de syntaxe sont signalées avec un numéro de ligne.
plugin_manifest_root_not_objectLe manifeste de plugin doit contenir un objet JSON au premier niveau.
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_typeid doit être une chaîne de caractères si ce champ est renseigné.
plugin_id_emptyid ne doit pas être vide si ce champ est renseigné.
plugin_name_missingname est obligatoire.
plugin_name_wrong_typename doit être une chaîne de caractères.
plugin_name_emptyname ne doit pas être vide.
plugin_name_too_longname doit comporter au maximum 64 caractères.
plugin_name_formatname doit commencer par une lettre ou un chiffre ASCII et ne contenir que des lettres et des chiffres ASCII, _ ou -.
plugin_version_missingversion est obligatoire.
plugin_version_wrong_typeversion doit être une chaîne de caractères.
plugin_version_emptyversion doit être une chaîne de caractères non vide représentant une version sémantique, par exemple 1.0.0.
plugin_version_not_semverversion doit respecter le versionnage sémantique, par exemple 1.0.0.
plugin_version_too_longversion doit comporter au maximum 64 caractères.
plugin_description_missingdescription est obligatoire.
plugin_description_wrong_typedescription doit être une chaîne de caractères.
plugin_description_emptydescription ne doit pas être vide.
plugin_description_too_longdescription doit comporter au maximum 1 024 caractères.
plugin_description_character_unsupporteddescription doit contenir du texte pris en charge. Les sauts de ligne sont autorisés.
plugin_developer_missingauthor.name est obligatoire. interface.developerName est également obligatoire et fait l’objet d’un signalement distinct.
plugin_author_wrong_typeauthor doit être un objet.
plugin_author_name_wrong_typeauthor.name doit être une chaîne de caractères.
plugin_author_name_emptyauthor.name ne doit pas être vide.
plugin_author_name_too_longauthor.name doit comporter au maximum 120 caractères.
plugin_author_name_character_unsupportedauthor.name doit contenir du texte pris en charge.
plugin_author_email_wrong_typeLorsqu’il est fourni, author.email doit être une chaîne de caractères.
plugin_author_email_emptyLorsqu’il est fourni, author.email ne doit pas être vide.
plugin_author_email_too_longauthor.email doit comporter au maximum 320 caractères.
plugin_author_email_character_unsupportedauthor.email doit contenir du texte pris en charge.
plugin_author_url_wrong_typeLorsqu’il est fourni, author.url doit être une chaîne de caractères.
plugin_author_url_emptyLorsqu’il est fourni, author.url ne doit pas être vide.
plugin_author_url_not_httpsauthor.url doit être une URL HTTPS.
plugin_author_url_has_credentialsauthor.url ne doit pas contenir d’informations d’authentification.
plugin_author_url_too_longauthor.url doit comporter au maximum 2 048 caractères.
plugin_author_url_character_unsupportedauthor.url doit contenir du texte 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 des champs tels que 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 envois de fichiers ZIP de plugins contenant uniquement des skills. Elles sont obligatoires pour les soumissions MCP distantes. Leur longueur est limitée à 2 048 caractères pour la validation du package et à 1 024 caractères pour la soumission définitive à l’annuaire.

NomExigence
plugin_interface_wrong_typeLe champ interface du manifeste du plugin doit être un objet JSON.
plugin_display_name_wrong_typeinterface.displayName doit être une chaîne de caractères.
plugin_display_name_emptyinterface.displayName est obligatoire et ne doit pas être vide.
plugin_display_name_too_longinterface.displayName doit comporter au maximum 80 caractères pour la validation du package et 30 caractères pour la soumission définitive à l’annuaire.
plugin_display_name_character_unsupportedinterface.displayName doit contenir du texte pris en charge.
plugin_short_description_missinginterface.shortDescription est obligatoire, doit tenir sur une seule ligne et doit comporter au maximum 240 caractères pour la validation du package et 30 caractères pour la soumission définitive à l’annuaire.
plugin_short_description_wrong_typeinterface.shortDescription doit être une chaîne de caractères.
plugin_short_description_emptyinterface.shortDescription ne doit pas être vide.
plugin_short_description_too_longinterface.shortDescription doit comporter au maximum 240 caractères pour la validation du package et 30 caractères pour la soumission définitive à l’annuaire.
plugin_short_description_character_unsupportedinterface.shortDescription doit contenir du texte pris en charge.
plugin_long_description_wrong_typeinterface.longDescription doit être une chaîne de caractères.
plugin_long_description_emptyinterface.longDescription est obligatoire et ne doit pas être vide.
plugin_long_description_too_longinterface.longDescription doit comporter au maximum 4 000 caractères.
plugin_long_description_character_unsupportedinterface.longDescription doit contenir du texte pris en charge. Les sauts de ligne sont autorisés.
plugin_developer_name_wrong_typeinterface.developerName doit être une chaîne de caractères.
plugin_developer_name_emptyinterface.developerName est obligatoire et ne doit pas être vide.
plugin_developer_name_too_longinterface.developerName doit comporter au maximum 120 caractères pour la validation du package et 80 caractères pour la soumission définitive à l’annuaire.
plugin_developer_name_character_unsupportedinterface.developerName doit contenir du texte pris en charge.
plugin_category_wrong_typeinterface.category doit être une chaîne de caractères.
plugin_category_emptyLorsqu’il est fourni, interface.category ne doit pas être vide ; omettez ce champ pour utiliser Other.
plugin_category_unknowninterface.category doit avoir pour valeur Productivity, Creativity, Developer Tools, Business & Operations, Data & Analytics, Communication, Education & Research, Security, Finance, Healthcare, Travel, Entertainment ou Other.
plugin_category_character_unsupportedinterface.category doit contenir du texte pris en charge.
plugin_capabilities_wrong_typeinterface.capabilities doit être une liste de chaînes de caractères.
plugin_capabilities_too_manyinterface.capabilities doit contenir au maximum 20 entrées.
plugin_capability_wrong_typeChaque entrée de interface.capabilities doit être une chaîne de caractères.
plugin_capability_emptyChaque entrée de interface.capabilities doit être non vide lorsqu’elle est fournie.
plugin_capability_too_longChaque entrée de interface.capabilities doit comporter au maximum 120 caractères.
plugin_capability_character_unsupportedChaque entrée de interface.capabilities doit contenir du texte pris en charge.
plugin_website_url_wrong_typeLorsqu’il est fourni, interface.websiteURL doit être une chaîne de caractères.
plugin_website_url_emptyLorsqu’il est fourni, interface.websiteURL ne doit pas être vide.
plugin_website_url_formatinterface.websiteURL doit être une URL HTTPS.
plugin_website_url_too_longinterface.websiteURL doit respecter les limites de longueur des URL de la fiche.
plugin_privacy_policy_url_wrong_typeinterface.privacyPolicyURL doit être une chaîne de caractères lorsqu’il est fourni.
plugin_privacy_policy_url_emptyinterface.privacyPolicyURL ne doit pas être vide lorsqu’il est fourni.
plugin_privacy_policy_url_formatinterface.privacyPolicyURL doit être une URL HTTPS.
plugin_privacy_policy_url_too_longinterface.privacyPolicyURL doit respecter les limites de longueur des URL de la fiche.
plugin_terms_of_service_url_wrong_typeinterface.termsOfServiceURL doit être une chaîne de caractères lorsqu’il est fourni.
plugin_terms_of_service_url_emptyinterface.termsOfServiceURL ne doit pas être vide lorsqu’il est fourni.
plugin_terms_of_service_url_formatinterface.termsOfServiceURL doit être une URL HTTPS.
plugin_terms_of_service_url_too_longinterface.termsOfServiceURL doit respecter les limites de longueur des URL de la fiche.
plugin_support_url_wrong_typeinterface.supportURL doit être une chaîne de caractères lorsqu’il est fourni.
plugin_support_url_emptyinterface.supportURL ne doit pas être vide lorsqu’il est fourni.
plugin_support_url_formatinterface.supportURL doit être une URL HTTPS.
plugin_support_url_too_longinterface.supportURL doit respecter les limites de longueur des URL de la fiche.
plugin_homepage_wrong_typehomepage doit être une chaîne de caractères lorsqu’il est fourni.
plugin_homepage_emptyhomepage ne doit pas être vide lorsqu’il est fourni.
plugin_homepage_formathomepage doit être une URL HTTPS.
plugin_homepage_too_longhomepage ne doit pas dépasser 2 048 caractères.
plugin_brand_color_wrong_typeinterface.brandColor doit être une chaîne de caractères lorsqu’il est fourni.
plugin_brand_color_emptyinterface.brandColor ne doit pas être vide lorsqu’il est fourni.
plugin_brand_color_formatinterface.brandColor doit être une couleur au format hexadécimal à six chiffres, par exemple #1ABCFE.
plugin_brand_color_dark_wrong_typeinterface.brandColorDark doit être une chaîne de caractères lorsqu’il est fourni.
plugin_brand_color_dark_emptyinterface.brandColorDark ne doit pas être vide lorsqu’il est fourni.
plugin_brand_color_dark_formatinterface.brandColorDark doit être une couleur au format hexadécimal à six chiffres, par exemple #1ABCFE.
plugin_brand_color_contrastinterface.brandColor doit présenter un rapport de contraste d’au moins 2:1 avec le blanc.
plugin_brand_color_dark_contrastinterface.brandColorDark doit présenter un rapport de contraste d’au moins 2:1 avec #212121.
plugin_default_prompt_wrong_typeinterface.defaultPrompt doit être une chaîne de caractères ou une liste de chaînes de caractères.
plugin_default_prompt_too_manyinterface.defaultPrompt doit contenir au maximum trois prompts.
plugin_default_prompt_entry_wrong_typeChaque entrée de interface.defaultPrompt doit être une chaîne de caractères.
plugin_default_prompt_emptyChaque entrée de interface.defaultPrompt doit être non vide lorsqu’elle est fournie.
plugin_default_prompt_too_longChaque entrée de interface.defaultPrompt ne doit pas dépasser 512 caractères pour la validation du package et 128 caractères pour la soumission finale à l’annuaire.
plugin_default_prompt_character_unsupportedChaque entrée de interface.defaultPrompt doit utiliser du texte pris en charge et tenir sur une seule ligne.

Erreurs de contenu du plugin

NomExigence
plugin_skills_path_wrong_typeskills doit être une chaîne de caractères indiquant le chemin du répertoire skills/ situé à la racine.
plugin_skills_path_emptyLorsqu’il est fourni, skills doit être un chemin non vide vers le répertoire skills/ situé à la racine.
plugin_skills_path_unsupportedskills doit pointer vers le répertoire skills/ situé à la racine.
plugin_skills_directory_missingLe répertoire skills/ situé à la racine doit exister s’il est déclaré.
plugin_skills_path_not_directoryLorsqu’il est déclaré, skills/ à la racine doit être un répertoire.
plugin_apps_path_wrong_typeapps doit être une chaîne de caractères indiquant le chemin du fichier .app.json situé à la racine.
plugin_apps_path_emptyLorsqu’il est fourni, apps doit être un chemin non vide vers le fichier .app.json situé à la racine.
plugin_apps_path_unsupportedapps doit pointer vers le fichier .app.json situé à la racine.
plugin_apps_file_missingLe fichier .app.json situé à la racine doit exister s’il est déclaré.
plugin_apps_path_not_fileLorsqu’il est déclaré, .app.json à la racine doit être un fichier ordinaire.
plugin_mcp_path_wrong_typemcpServers doit être une chaîne de caractères indiquant le chemin du fichier .mcp.json situé à la racine.
plugin_mcp_path_emptymcpServers doit être un chemin non vide. Définissez sa valeur sur ./.mcp.json ou supprimez le champ.
plugin_mcp_path_unsupportedmcpServers doit pointer vers le fichier .mcp.json situé à la racine.
plugin_mcp_file_missingmcpServers déclare le fichier .mcp.json à la racine, mais ce fichier n’existe pas.
plugin_mcp_path_not_file.mcp.json à la racine doit être un fichier ordinaire.
plugin_runtime_surface_missingUn ZIP contenant uniquement des skills doit inclure au moins un skill valide. Les packages locaux et ceux des espaces de travail peuvent également référencer un serveur MCP admissible.

Erreurs du manifeste MCP

Ces erreurs concernent le fichier de compatibilité .mcp.json. Pour les packages portables, l’ingestion génère ce fichier ainsi que .codex-plugin/plugin.json à partir des fichiers plugin.json et mcp.json situés à la racine. Les erreurs de chemin de composant ci-dessus peuvent également concerner ces fichiers générés. Corrigez la configuration portable source ; ne renommez pas mcp.json en .mcp.json simplement parce qu’un diagnostic de compatibilité mentionne ce nom.

NomExigence
mcp_manifest_unreadable.mcp.json doit être un fichier texte UTF-8 lisible.
mcp_manifest_json_malformed.mcp.json doit contenir du JSON valide ; les erreurs de syntaxe sont signalées avec un numéro de ligne.
mcp_manifest_wrong_type.mcp.json doit contenir un objet JSON au premier niveau.
mcp_servers_missing.mcp.json doit contenir le champ mcpServers au premier niveau.
mcp_servers_wrong_typemcpServers doit être un objet.
mcp_server_name_emptyChaque nom de serveur MCP doit contenir au moins un caractère autre qu’un caractère d’espacement.
mcp_server_wrong_typeChaque valeur de mcpServers.<server-name> doit être un objet contenant la déclaration du serveur correspondant.

Erreurs des skills

NomExigence
skill_manifest_missingLa skill doit contenir un fichier SKILL.md.
skill_bundle_too_largeChaque archive compressée de skill doit respecter la limite en Mio indiquée dans l’erreur.
skill_directory_hiddenLes noms des répertoires de skills ne doivent pas commencer par ..
skill_manifest_nestedChaque répertoire de skill doit être un sous-répertoire direct de skills/.
skill_manifest_not_regular_fileSKILL.md doit être un fichier ordinaire.
skill_manifest_unreadableSKILL.md doit être accessible en lecture.
skill_manifest_invalid_utf8SKILL.md doit contenir du texte UTF-8 valide.
skill_frontmatter_missingSKILL.md doit commencer par un en-tête de métadonnées YAML délimité par des lignes ---.
skill_frontmatter_unclosedL’en-tête de métadonnées YAML de SKILL.md doit se terminer par ---.
skill_frontmatter_yaml_malformedL’en-tête de métadonnées de SKILL.md doit contenir du YAML valide.
skill_frontmatter_wrong_typeL’en-tête de métadonnées de SKILL.md doit contenir un mapping YAML.
skill_name_missingname est obligatoire et ne doit pas être vide.
skill_name_wrong_typename doit être une chaîne de caractères.
skill_name_emptyname ne doit pas être vide.
skill_name_character_unsupportedLe champ name de l’en-tête de métadonnées de la skill doit utiliser du texte pris en charge.
skill_description_missingdescription est obligatoire et ne doit pas être vide.
skill_description_wrong_typedescription doit être une chaîne de caractères.
skill_description_emptydescription ne doit pas être vide.
skill_description_too_longdescription ne doit pas dépasser 1 024 caractères.
skill_description_character_unsupportedLe champ description de l’en-tête de métadonnées de la skill doit utiliser du texte pris en charge.
skill_body_emptyLes instructions de la skill ne doivent pas être vides.
skill_identity_too_longLe nom combiné du plugin et de la skill (plugin-name:skill-name) ne doit pas dépasser 64 caractères.
skill_identity_duplicateLa valeur name de chaque skill doit être unique au sein du plugin.

Erreurs de métadonnées d’agent des skills

Une skill incluse dans le package peut définir sa propre interface dans skills/<skill>/agents/openai.yaml. Cette configuration détermine la présentation de la skill aux utilisateurs et reste distincte de l’interface du manifeste du plugin. Les champs de l’interface de la skill utilisent la notation snake_case :

interface:
  display_name: "Summarize documents"
  short_description: "Summarize a document"
  icon_small: "./assets/icon.png"
  default_prompt: "Summarize the selected document."
NomExigence
skill_agent_not_regular_fileagents/openai.yaml doit être un fichier ordinaire.
skill_agent_unreadableagents/openai.yaml doit être accessible en lecture.
skill_agent_invalid_utf8agents/openai.yaml doit contenir du texte UTF-8 valide.
skill_agent_yaml_malformedagents/openai.yaml doit contenir du YAML valide.
skill_agent_top_level_wrong_typeagents/openai.yaml doit contenir un mapping YAML au premier niveau.
skill_agent_interface_missinginterface est obligatoire dans agents/openai.yaml lorsque ce fichier est inclus.
skill_agent_interface_wrong_typeinterface dans agents/openai.yaml doit être un mapping YAML.
skill_agent_display_name_missinginterface.display_name est obligatoire et ne doit pas être vide.
skill_agent_display_name_wrong_typeinterface.display_name doit être une chaîne de caractères.
skill_agent_display_name_emptyinterface.display_name ne doit pas être vide.
skill_agent_short_description_missinginterface.short_description est obligatoire et ne doit pas être vide.
skill_agent_short_description_wrong_typeinterface.short_description doit être une chaîne de caractères.
skill_agent_short_description_emptyinterface.short_description ne doit pas être vide.
skill_agent_icon_small_wrong_typeLorsqu’il est fourni, interface.icon_small doit être un chemin de fichier relatif non vide.
skill_agent_icon_small_emptyLorsqu’il est fourni, interface.icon_small doit être un chemin de fichier relatif non vide, par exemple assets/icon.png.
skill_agent_icon_large_wrong_typeLorsqu’il est fourni, interface.icon_large doit être un chemin de fichier relatif non vide.
skill_agent_icon_large_emptyLorsqu’il est fourni, interface.icon_large doit être un chemin de fichier relatif non vide, par exemple assets/icon.png.
skill_agent_brand_color_wrong_typeinterface.brand_color doit être une chaîne de caractères lorsqu’il est fourni.
skill_agent_brand_color_emptyLorsqu’il est fourni, interface.brand_color doit être une valeur non vide représentant une couleur hexadécimale à six chiffres, par exemple #1ABCFE.
skill_agent_brand_color_formatinterface.brand_color doit être une couleur hexadécimale à six chiffres, par exemple #1ABCFE.
skill_agent_default_prompt_wrong_typeinterface.default_prompt doit être une chaîne de caractères lorsqu’il est fourni.
skill_agent_default_prompt_emptyinterface.default_prompt ne doit pas être vide lorsqu’il est fourni.
skill_agent_policy_wrong_typepolicy doit être un mapping YAML lorsqu’il est fourni.
skill_agent_allow_implicit_invocation_wrong_typepolicy 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_typedependencies doit être un mapping YAML ; seul tools est pris en charge.
skill_agent_dependency_unsupportedSeul dependencies.tools est pris en charge dans agents/openai.yaml.

Erreurs de chemin des ressources

NomExigence
declared_asset_path_wrong_typeLe champ de ressource indiqué doit être une chaîne de caractères représentant un chemin de fichier.
declared_asset_path_emptyLe champ de ressource indiqué ne doit pas être vide.
declared_asset_path_has_outer_whitespaceLe champ de ressource indiqué ne doit ni commencer ni se terminer par des caractères d’espacement.
declared_asset_path_has_control_characterLe champ de ressource indiqué ne doit contenir aucun caractère de la plage U+0000–U+001F ni le caractère U+007F.
branding_asset_path_missing_root_prefixLe champ de ressource indiqué doit commencer par ./.
declared_asset_path_unsafeLe champ de ressource indiqué doit être un chemin relatif à l’intérieur du plugin et ne doit contenir ni chemin absolu, ni préfixe de lecteur, ni segment .. de remontée dans les répertoires.
declared_asset_path_outside_packageLe champ de ressource indiqué doit faire référence à un fichier à l’intérieur du plugin.
declared_asset_file_missingLe champ de ressource indiqué fait référence à un fichier qui n’existe pas.
declared_asset_not_regular_fileLe champ de ressource indiqué doit référencer un fichier, et non un répertoire ou un fichier spécial.

Erreurs d’image

Les images de marque destinées à l’annuaire doivent utiliser un type de fichier 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 package ; les captures d’écran des prompts de démarrage sont soumises aux limites distinctes du portail indiquées plus haut.

NomExigence
plugin_logo_path_missinginterface.logo est obligatoire et doit référencer une image carrée.
plugin_composer_icon_path_missinginterface.composerIcon est obligatoire et doit référencer une image carrée.
image_file_unreadableLe fichier image doit être lisible.
image_file_too_largeL’image ne doit pas dépasser 5 MiB.
image_file_format_unsupportedLe nom du fichier image doit se terminer par .png, .jpg, .jpeg, .webp ou .svg.
raster_image_decode_failedL’image matricielle doit être un fichier PNG, JPEG ou WebP pouvant être décodé en toute sécurité.
raster_image_extension_content_mismatchL’extension du fichier image doit correspondre au format d’image détecté.
raster_image_not_squareL’image doit être carrée.
raster_image_dimensions_too_smallLes dimensions de l’image doivent être d’au moins 48×48 pixels.
raster_image_dimensions_too_largeLes dimensions de l’image ne doivent pas dépasser 4 096×4 096 pixels.
svg_xml_malformedLe fichier SVG doit contenir du XML valide encodé en UTF-8.
svg_root_element_invalidL’élément racine du SVG doit être <svg>.
svg_dimensions_missingLe SVG doit définir un attribut viewBox numérique ou des attributs width et height numériques.
svg_dimensions_not_numericLes dimensions du SVG doivent être numériques, sans unités ni pourcentages.
svg_dimensions_not_positiveLa largeur et la hauteur du SVG doivent être des nombres finis strictement positifs.
svg_dimensions_not_squareLes dimensions du SVG doivent former un carré.
svg_dimensions_too_smallLes dimensions du SVG doivent être d’au moins 48×48 pixels.

Erreurs de référence aux serveurs MCP

Les vérifications communes des packages valident .app.json lorsqu’un plugin référence des serveurs MCP enregistrés. Le portail de soumission ne publie pas de références à des intégrations existantes. Un envoi via Skills uniquement supprime .app.json. Utilisez Avec MCP pour soumettre directement le serveur MCP.

Pour les packages locaux ou d’espace de travail, l’objet apps de premier niveau associe chaque alias de serveur MCP à une entrée de serveur enregistré. Ces noms de configuration et codes d’erreur conservent la graphie littérale app.

NomExigence
app_manifest_unreadable.app.json doit être un fichier texte UTF-8 lisible.
app_manifest_json_malformed.app.json contient du JSON mal formé près de la ligne indiquée.
app_manifest_wrong_type.app.json doit contenir un objet JSON au premier niveau.
app_entries_missingapps est obligatoire.
app_entries_wrong_typeapps doit être un objet.
app_entry_wrong_typeChaque entrée de serveur doit être un objet.
app_id_missingLe champ id est obligatoire dans chaque entrée de serveur.
app_id_wrong_typeLe champ id de chaque entrée de serveur doit être une chaîne de caractères.
app_id_formatLe champ id de chaque entrée de serveur doit commencer par asdk_app_, connector_ ou templated_apps_, suivi d’une lettre ou d’un chiffre, puis uniquement de lettres, de chiffres, de _ ou de -.
app_entry_optional_wrong_typeLa valeur optional de chaque entrée de serveur doit être true ou false lorsqu’elle est fournie.
app_entry_required_wrong_typeLa valeur required de chaque entrée de serveur doit être true ou false lorsqu’elle est fournie.
app_not_eligibleUn package local ou d’espace de travail doit référencer un serveur MCP admissible et disponible. Pour une soumission à l’annuaire, utilisez Avec MCP et soumettez directement le serveur MCP.

Avertissements relatifs au package

Ces avertissements signalent le contenu du package que la 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.

NomExigence
duplicate_app_referenceChaque identifiant de serveur dans .app.json doit être référencé une seule fois ; les références en double sont traitées comme un seul serveur.
undeclared_app_manifest_ignoredUn fichier .app.json à la racine n’est importé que si le champ apps du manifeste du plugin est défini sur ./.app.json.
undeclared_mcp_manifest_ignoredUn fichier .mcp.json à la racine n’est importé que si le champ mcpServers du manifeste du plugin est défini sur ./.mcp.json.
skill_file_ignoredLes fichiers placés directement dans skills/ ne sont pas importés en tant que skills ; chaque skill doit se trouver dans un répertoire contenant SKILL.md.
skill_symlink_ignoredLes liens symboliques placés directement dans skills/ ne sont pas importés en tant que skills ; chaque skill doit être un répertoire réel contenant SKILL.md.
skill_frontmatter_adjustedLes champs name et description de la skill sont normalisés à l’importation : les espaces en début et en fin sont supprimés et les suites d’espaces internes sont réduites à un seul espace.
skill_metadata_ignoredLes paramètres d’interface de la skill doivent utiliser la structure de correspondance interface dans agents/openai.yaml ; le champ metadata dans SKILL.md ne configure pas l’interface.

Étapes suivantes

Après avoir corrigé toutes les erreurs de validation, revenez à Soumettre des plugins pour finaliser la soumission.