Empaqueter le plugin
Sur cette page
Leçon réécrite le 3 novembre 2026 d’après la page Package your plugin de la documentation Plugins d’OpenAI. L’ancienne leçon construisait un « package » pour un « ChatGPT Store » à partir d’un manifeste inexistant ; un plugin s’empaquette avec un manifeste
plugin.jsonau schéma Agent Plugins. Source : Package your plugin.
Pourquoi empaqueter
Une fois les skills écrites et, au besoin, le serveur MCP construit, il reste à les assembler en ce que les gens installeront. L’empaquetage donne au plugin une identité stable et indique à ChatGPT et à Codex quelles skills, quelles connexions à des serveurs MCP et quelles ressources vont ensemble. L’interface et l’authentification, elles, restent dans le serveur MCP : le manifeste ne fait que relier cette intégration au reste du paquet.
La structure d’un paquet portable
Un plugin portable a un manifeste plugin.json à sa racine, qui déclare le schéma Agent Plugins. Le dossier peut aussi contenir un répertoire skills/, un fichier mcp.json pour les serveurs MCP distribués avec le plugin, et des ressources visuelles dans assets/.
mon-plugin/
├── plugin.json
├── mcp.json
├── skills/
│ └── compte-rendu/
│ └── SKILL.md
└── assets/
├── icon.png
└── logo.png
Le manifeste minimal tient en quelques lignes. Le nom, stable et en kebab-case, sert d’identifiant et d’espace de noms aux composants ; les skills sont découvertes dans skills/ sans qu’il faille les déclarer.
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "notes-equipe",
"version": "0.1.0",
"description": "Notes d'équipe et comptes rendus de réunion"
}
Chaque skill vit dans skills/<nom>/SKILL.md, avec un en-tête qui donne son nom et sa description, suivi des instructions :
---
name: compte-rendu
description: Rédige le compte rendu d'une réunion à partir des notes de l'équipe.
---
Récupère les notes de la réunion avec list_notes, regroupe-les par sujet,
puis rédige un compte rendu : décisions, actions avec responsables, points ouverts.
Déclarer le serveur MCP
Les serveurs MCP distribués avec le plugin se déclarent dans mcp.json, à la racine, avec le schéma correspondant et un type de transport pour chaque serveur :
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
"mcpServers": {
"notes": {
"type": "streamable-http",
"url": "https://notes.example.com/mcp"
}
}
}
L’authentification d’un serveur se déclare dans ce même fichier, sous extensions["com.openai"].auth de chaque serveur — elle appartient au serveur, pas au manifeste. Pour une soumission publique, c’est le point d’accès HTTPS distant qui est soumis ; les serveurs locaux relèvent d’un parcours à part, réservé aux plugins de bureau.
Les métadonnées propres à OpenAI
La présentation dans le répertoire, les correspondances avec des serveurs MCP déjà enregistrés et les hooks se déclarent dans l’objet extensions.com.openai du plugin.json racine, tandis que l’identité portable (name, version, description) reste à la racine :
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "notes-equipe",
"version": "0.1.0",
"description": "Notes d'équipe et comptes rendus de réunion",
"extensions": {
"com.openai": {
"interface": {
"displayName": "Notes d'équipe",
"shortDescription": "Notes et comptes rendus de réunion",
"developerName": "Votre équipe",
"category": "Productivity",
"capabilities": ["Read", "Write"],
"websiteURL": "https://example.com",
"privacyPolicyURL": "https://example.com/confidentialite",
"termsOfServiceURL": "https://example.com/conditions",
"defaultPrompt": ["Utilise Notes d'équipe pour rédiger le compte rendu de la réunion de lundi."],
"composerIcon": "./assets/icon.png",
"logo": "./assets/logo.png"
}
}
}
}
Les chemins de cet objet sont relatifs à la racine du plugin et commencent par ./. Les visuels (composerIcon, logo, screenshots) se rangent de préférence dans ./assets/. Le champ apps ne sert qu’à pointer vers un fichier .app.json de correspondances avec des serveurs MCP enregistrés dans ChatGPT.
Une skill d’accueil peut aussi être déclarée par extensions.com.openai.onboardingSkill (par exemple ./skills/setup/SKILL.md) : elle guide l’utilisateur après l’installation, pour choisir un espace de travail ou régler des préférences. Testez-la dans une conversation neuve et lors d’une installation en cours de conversation.
Un ancien format, avec un manifeste dans .codex-plugin/plugin.json, reste accepté pour compatibilité : il ne sert que si l’objet extensions.com.openai est absent, les deux ne se fusionnent pas. Les nouveaux paquets doivent utiliser le plugin.json racine.
La voie rapide : @plugin-creator
ChatGPT et Codex intègrent une skill, @plugin-creator, qui génère la structure à votre place — pour l’instant au format de compatibilité .codex-plugin/. Pour y rattacher un serveur MCP, connectez d’abord ce serveur dans ChatGPT (Add custom MCP server, puis Create as a plugin), relevez l’identifiant technique de la connexion dans l’URL du navigateur — il commence par plugin_asdk_app —, puis donnez-le à @plugin-creator en mode Work (ou à $plugin-creator dans Codex). La skill peut aussi créer une entrée de place de marché personnelle, pour installer et tester le plugin depuis votre source locale du répertoire.
Places de marché locales
Une place de marché est un catalogue JSON de plugins. Elle sert à écrire, tester et distribuer en équipe, à côté du répertoire public : en mode Work ou dans Codex, chaque place de marché apparaît comme une source sélectionnable dans le répertoire des plugins. C’est par elle que vous testerez le plugin complet avant de le soumettre (leçon 9).
Hooks : réservés au bureau
Les hooks de cycle de vie ne sont pris en charge que pour les plugins installés manuellement dans l’application de bureau de Codex, et un plugin qui en contient n’est pas éligible au répertoire public. Si votre plugin vise la publication, laissez-les de côté.
Points clés à retenir
- Un paquet portable :
plugin.json(schéma Agent Plugins),skills/,mcp.json,assets/ - Le serveur MCP se déclare dans
mcp.jsonavec son type de transport ; son authentification aussi - Présentation, correspondances et skill d’accueil vont dans
extensions.com.openai @plugin-creatorgénère la structure ; une place de marché locale sert aux tests- Un plugin avec hooks n’est pas éligible au répertoire public