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.
| Champ | Règle de soumission finale |
|---|---|
| Nom du package | Obligatoire ; 64 caractères maximum. Commencez par une lettre ASCII ou un chiffre et utilisez uniquement des lettres ASCII, des chiffres, _ et -. |
| Version | Obligatoire ; utilisez une version sémantique de 64 caractères maximum. |
| Nom affiché | Obligatoire ; une seule ligne ; 30 caractères maximum. |
| Description courte | Obligatoire ; une seule ligne ; 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 ; 80 caractères maximum. |
| Catégorie | Obligatoire ; choisissez une catégorie prise en charge dans la section Erreurs de fiche et d’interface. |
| Capacités | 20 maximum. Chaque capacité doit être non vide, tenir sur une seule ligne et comporter au maximum 120 caractères. |
| Prompts de démarrage | 3 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. |
| URL | Obligatoires 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 marque | Couleurs 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,openWorldHintetdestructiveHint, 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.
| Nom | Exigence |
|---|---|
submission_display_name_required | Le nom affiché est obligatoire, doit être non vide et tenir sur une seule ligne. |
submission_display_name_too_long | Le nom affiché doit comporter au maximum 30 caractères. |
submission_display_name_character_unsupported | Le nom affiché doit utiliser du texte pris en charge et tenir sur une seule ligne. |
submission_subtitle_required | La description courte est obligatoire, doit être non vide et tenir sur une seule ligne. |
submission_subtitle_too_long | La description courte doit comporter au maximum 30 caractères. |
submission_subtitle_character_unsupported | La description courte doit utiliser du texte pris en charge et tenir sur une seule ligne. |
submission_description_required | La description longue est obligatoire et doit être non vide. Les sauts de ligne sont autorisés. |
submission_description_too_long | La description longue doit comporter au maximum 4 000 caractères. |
submission_description_character_unsupported | La description longue doit utiliser du texte pris en charge. Les sauts de ligne sont autorisés. |
submission_developer_name_required | Le nom du développeur est obligatoire, doit être non vide et tenir sur une seule ligne. |
submission_developer_name_too_long | Le nom du développeur doit comporter au maximum 80 caractères. |
submission_developer_name_character_unsupported | Le nom du développeur doit utiliser du texte pris en charge et tenir sur une seule ligne. |
plugin_capability_invalid | Chaque 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_mention | Les prompts de démarrage ne doivent pas contenir de @mentions de serveur MCP. |
plugin_default_prompt_duplicate | Les 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.
| Nom | Exigence |
|---|---|
annotations_required | Chaque outil MCP doit définir correctement readOnlyHint, openWorldHint et destructiveHint. |
justification_required | Chaque annotation d’un outil MCP doit justifier son comportement en lecture seule, en monde ouvert ou destructif. |
scan_required | Les outils MCP doivent disposer d’une analyse réussie et à jour du serveur MCP de production. |
domain_verification_required | Le 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_required | Pour 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_allowed | Les 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.
| Nom | Exigence |
|---|---|
plugin_name_mismatch | Lors d’une mise à jour, le nom du package doit correspondre au nom du plugin existant. |
plugin_version_unchanged | Une 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_excluded | Les importations de skills uniquement excluent mcpServers, mcp.json et .mcp.json. Soumettez un serveur MCP distant via Avec MCP. |
app_configuration_excluded | Les 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_excluded | Les 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_normalized | Le portail enregistre le manifeste normalisé dans .codex-plugin/plugin.json ; les modifications des champs nécessitent une confirmation. |
developer_name_defaulted | author.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
| Nom | Exigence |
|---|---|
archive_empty | L’archive ne doit pas être vide. |
archive_too_large | Le ZIP compressé ne doit pas dépasser 100 Mo. |
archive_format_not_zip | L’archive doit être un fichier ZIP valide et non corrompu. |
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 de l’archive ne doit ni commencer ni se terminer par un caractère d’espacement. |
archive_member_path_has_backslash | Le chemin d’une entrée de l’archive doit utiliser /, et non des barres obliques inverses. |
archive_member_path_absolute | Le chemin d’une entrée de l’archive doit être relatif à la racine de l’archive. |
archive_member_path_has_empty_segment | Le chemin d’une entrée de l’archive ne doit pas contenir de segments vides. |
archive_member_path_has_parent_segment | Le chemin d’une entrée de l’archive ne doit pas contenir de segments ... |
archive_member_path_too_deep | Le chemin d’une entrée de l’archive doit contenir au maximum 20 segments, nom de fichier compris. |
archive_member_path_too_long | Le chemin d’une entrée de l’archive doit respecter la longueur maximale prise en charge. |
archive_member_path_normalization_collision | Les chemins des entrées de l’archive doivent rester uniques 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 | Le chemin d’une entrée de l’archive doit être unique. |
archive_member_path_type_conflict | Un chemin de fichier ne peut pas également désigner un 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 | L’archive extraite ne doit pas dépasser 512 Mio. |
archive_member_unreadable | Chaque 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
| Nom | Exigence |
|---|---|
plugin_root_missing | Le chemin sélectionné doit exister et désigner un répertoire contenant un plugin. |
archive_plugin_files_missing | Un ZIP contenant uniquement des skills doit inclure un manifeste de plugin pris en charge et au moins un skill valide. |
plugin_root_ambiguous | Le 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_siblings | Un 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
| Nom | Exigence |
|---|---|
plugin_manifest_missing | Le 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_file | Le manifeste de plugin doit être un fichier JSON ordinaire. |
plugin_manifest_unreadable | Le manifeste de plugin doit être un texte UTF-8 lisible. |
plugin_manifest_json_malformed | Le 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_object | Le 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_type | id doit être une chaîne de caractères si ce champ est renseigné. |
plugin_id_empty | id ne doit pas être vide si ce champ est renseigné. |
plugin_name_missing | 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 doit comporter au maximum 64 caractères. |
plugin_name_format | name doit commencer par une lettre ou un chiffre ASCII et ne contenir que des lettres et des chiffres ASCII, _ ou -. |
plugin_version_missing | 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 de caractères non vide représentant une version sémantique, par exemple 1.0.0. |
plugin_version_not_semver | version doit respecter le versionnage sémantique, par exemple 1.0.0. |
plugin_version_too_long | version doit comporter au maximum 64 caractères. |
plugin_description_missing | 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 doit comporter au maximum 1 024 caractères. |
plugin_description_character_unsupported | description doit contenir du texte pris en charge. Les sauts de ligne sont autorisés. |
plugin_developer_missing | author.name est obligatoire. interface.developerName est également obligatoire et fait l’objet d’un signalement 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 doit comporter au maximum 120 caractères. |
plugin_author_name_character_unsupported | author.name doit contenir du texte pris en charge. |
plugin_author_email_wrong_type | Lorsqu’il est fourni, author.email doit être une chaîne de caractères. |
plugin_author_email_empty | Lorsqu’il est fourni, author.email ne doit pas être vide. |
plugin_author_email_too_long | author.email doit comporter au maximum 320 caractères. |
plugin_author_email_character_unsupported | author.email doit contenir du texte pris en charge. |
plugin_author_url_wrong_type | Lorsqu’il est fourni, author.url doit être une chaîne de caractères. |
plugin_author_url_empty | Lorsqu’il est fourni, author.url 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 pas contenir d’informations d’authentification. |
plugin_author_url_too_long | author.url doit comporter au maximum 2 048 caractères. |
plugin_author_url_character_unsupported | author.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.
| 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 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_unsupported | interface.displayName doit contenir du texte pris en charge. |
plugin_short_description_missing | interface.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_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 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_unsupported | interface.shortDescription doit contenir du texte 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 doit comporter au maximum 4 000 caractères. |
plugin_long_description_character_unsupported | interface.longDescription doit contenir du texte 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 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_unsupported | interface.developerName doit contenir du texte pris en charge. |
plugin_category_wrong_type | interface.category doit être une chaîne de caractères. |
plugin_category_empty | Lorsqu’il est fourni, interface.category ne doit pas être vide ; omettez ce champ pour utiliser Other. |
plugin_category_unknown | interface.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_unsupported | interface.category doit contenir du texte 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 doit contenir au maximum 20 entrées. |
plugin_capability_wrong_type | Chaque entrée de interface.capabilities doit être une chaîne de caractères. |
plugin_capability_empty | Chaque entrée de interface.capabilities doit être non vide lorsqu’elle est fournie. |
plugin_capability_too_long | Chaque entrée de interface.capabilities doit comporter au maximum 120 caractères. |
plugin_capability_character_unsupported | Chaque entrée de interface.capabilities doit contenir du texte pris en charge. |
plugin_website_url_wrong_type | Lorsqu’il est fourni, interface.websiteURL doit être une chaîne de caractères. |
plugin_website_url_empty | Lorsqu’il est fourni, interface.websiteURL 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 | interface.privacyPolicyURL doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_privacy_policy_url_empty | interface.privacyPolicyURL ne doit pas être vide lorsqu’il est fourni. |
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 | interface.termsOfServiceURL doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_terms_of_service_url_empty | interface.termsOfServiceURL ne doit pas être vide lorsqu’il est fourni. |
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 | interface.supportURL doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_support_url_empty | interface.supportURL ne doit pas être vide lorsqu’il est fourni. |
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 | homepage doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_homepage_empty | homepage ne doit pas être vide lorsqu’il est fourni. |
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 | interface.brandColor doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_brand_color_empty | interface.brandColor ne doit pas être vide lorsqu’il est fourni. |
plugin_brand_color_format | interface.brandColor doit être une couleur au format hexadécimal à six chiffres, par exemple #1ABCFE. |
plugin_brand_color_dark_wrong_type | interface.brandColorDark doit être une chaîne de caractères lorsqu’il est fourni. |
plugin_brand_color_dark_empty | interface.brandColorDark ne doit pas être vide lorsqu’il est fourni. |
plugin_brand_color_dark_format | interface.brandColorDark doit être une couleur au format hexadécimal à 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 doit contenir au maximum 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 | Chaque entrée de interface.defaultPrompt doit être non vide lorsqu’elle est fournie. |
plugin_default_prompt_too_long | Chaque 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_unsupported | Chaque entrée de interface.defaultPrompt doit utiliser du texte pris en charge et tenir sur une seule ligne. |
Erreurs de 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 | Lorsqu’il est fourni, skills 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 | Le répertoire skills/ situé à la racine doit exister s’il est déclaré. |
plugin_skills_path_not_directory | Lorsqu’il est déclaré, skills/ à la racine doit être 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 | Lorsqu’il est fourni, apps 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 | Le fichier .app.json situé à la racine doit exister s’il est déclaré. |
plugin_apps_path_not_file | Lorsqu’il est déclaré, .app.json à la racine doit être 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. Définissez sa valeur sur ./.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 | .mcp.json à la racine doit être un fichier ordinaire. |
plugin_runtime_surface_missing | Un 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.
| Nom | Exigence |
|---|---|
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_type | mcpServers doit être un objet. |
mcp_server_name_empty | Chaque nom de serveur MCP doit contenir au moins un caractère autre qu’un caractère d’espacement. |
mcp_server_wrong_type | Chaque valeur de mcpServers.<server-name> doit être un objet contenant la déclaration du serveur correspondant. |
Erreurs des skills
| Nom | Exigence |
|---|---|
skill_manifest_missing | La skill doit contenir un fichier SKILL.md. |
skill_bundle_too_large | Chaque archive compressée de skill doit respecter la limite en Mio indiquée dans l’erreur. |
skill_directory_hidden | Les noms des répertoires de skills ne doivent pas commencer par .. |
skill_manifest_nested | Chaque répertoire de skill doit être un sous-répertoire direct de skills/. |
skill_manifest_not_regular_file | SKILL.md doit être un fichier ordinaire. |
skill_manifest_unreadable | SKILL.md doit être accessible en lecture. |
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 de métadonnées YAML délimité par des lignes ---. |
skill_frontmatter_unclosed | L’en-tête de métadonnées YAML de SKILL.md doit se terminer par ---. |
skill_frontmatter_yaml_malformed | L’en-tête de métadonnées de SKILL.md doit contenir du YAML valide. |
skill_frontmatter_wrong_type | L’en-tête de métadonnées de SKILL.md doit contenir un mapping YAML. |
skill_name_missing | 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 | Le champ name de l’en-tête de métadonnées de la skill doit utiliser du texte pris en charge. |
skill_description_missing | 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 | Le champ description de l’en-tête de métadonnées de la skill doit utiliser du texte pris en charge. |
skill_body_empty | Les instructions de la skill ne doivent pas être vides. |
skill_identity_too_long | Le nom combiné du plugin et de la skill (plugin-name:skill-name) ne doit pas dépasser 64 caractères. |
skill_identity_duplicate | La 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."
| Nom | Exigence |
|---|---|
skill_agent_not_regular_file | agents/openai.yaml doit être un fichier ordinaire. |
skill_agent_unreadable | agents/openai.yaml doit être accessible en lecture. |
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 | agents/openai.yaml doit contenir un mapping YAML au premier niveau. |
skill_agent_interface_missing | interface est obligatoire dans agents/openai.yaml lorsque ce fichier est inclus. |
skill_agent_interface_wrong_type | interface dans agents/openai.yaml doit être un mapping YAML. |
skill_agent_display_name_missing | 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 | 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 | Lorsqu’il est fourni, interface.icon_small doit être un chemin de fichier relatif non vide. |
skill_agent_icon_small_empty | Lorsqu’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_type | Lorsqu’il est fourni, interface.icon_large doit être un chemin de fichier relatif non vide. |
skill_agent_icon_large_empty | Lorsqu’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_type | interface.brand_color doit être une chaîne de caractères lorsqu’il est fourni. |
skill_agent_brand_color_empty | Lorsqu’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_format | interface.brand_color doit être une couleur hexadécimale à six chiffres, par exemple #1ABCFE. |
skill_agent_default_prompt_wrong_type | interface.default_prompt doit être une chaîne de caractères lorsqu’il est fourni. |
skill_agent_default_prompt_empty | interface.default_prompt ne doit pas être vide lorsqu’il est fourni. |
skill_agent_policy_wrong_type | policy doit être un mapping YAML lorsqu’il est fourni. |
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 un mapping YAML ; seul tools est pris en charge. |
skill_agent_dependency_unsupported | Seul dependencies.tools est pris en charge dans agents/openai.yaml. |
Erreurs de chemin des ressources
| Nom | Exigence |
|---|---|
declared_asset_path_wrong_type | Le champ de ressource indiqué doit être 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 | Le champ de ressource indiqué ne doit ni commencer ni se terminer par des caractères d’espacement. |
declared_asset_path_has_control_character | Le 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_prefix | Le champ de ressource indiqué doit commencer par ./. |
declared_asset_path_unsafe | Le 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_package | Le champ de ressource indiqué doit faire référence à un fichier à l’intérieur du plugin. |
declared_asset_file_missing | Le champ de ressource indiqué fait 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, 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.
| Nom | Exigence |
|---|---|
plugin_logo_path_missing | interface.logo est obligatoire et doit référencer une image carrée. |
plugin_composer_icon_path_missing | 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 | L’image ne doit pas dépasser 5 MiB. |
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 | Les dimensions de l’image doivent être d’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 SVG doit être <svg>. |
svg_dimensions_missing | Le SVG doit définir un attribut viewBox numérique ou des attributs width et height numériques. |
svg_dimensions_not_numeric | Les dimensions du SVG doivent être numériques, sans unités ni pourcentages. |
svg_dimensions_not_positive | La largeur et la hauteur du SVG doivent être des nombres finis strictement positifs. |
svg_dimensions_not_square | Les dimensions du SVG doivent former un carré. |
svg_dimensions_too_small | Les 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.
| Nom | Exigence |
|---|---|
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_missing | 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 | Le champ id est obligatoire dans chaque entrée de serveur. |
app_id_wrong_type | Le champ id de chaque entrée de serveur doit être une chaîne de caractères. |
app_id_format | Le 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_type | La valeur optional de chaque entrée de serveur doit être true ou false lorsqu’elle est fournie. |
app_entry_required_wrong_type | La valeur required de chaque entrée de serveur doit être true ou false lorsqu’elle est fournie. |
app_not_eligible | Un 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.
| Nom | Exigence |
|---|---|
duplicate_app_reference | Chaque 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_ignored | Un 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_ignored | Un 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_ignored | Les 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_ignored | Les 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_adjusted | Les 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_ignored | Les 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.