作成したプラグインを広く共有したい場合は、プラグインディレクトリで公開すると、ユーザーがプラグインを見つけて ChatGPT や Codex で利用できます。プラグインには MCP 接続、スキル、またはその両方を含められます。
作成済みのパッケージを ZIP としてアップロードし、自動チェックで見つかった問題を修正してから審査に提出します。承認後は、公開のタイミングを自分で決められます。
初回公開後は MCP サーバーの変更が自動的に検出され、対象となる更新は自動チェックに合格すると反映されます。サーバーを更新するたびにプラグインの ZIP をアップロードしたり、公開操作を行ったりする必要はありません。プラグインのメタデータやスキルを変更する場合は、引き続き新しい ZIP が必要です。
提出前に、プラグインパッケージガイドに沿ってパッケージを準備し、プラグインガイドラインを確認してください。提出の準備には、プラグインディレクトリにある Plugin Creator を利用できます。

プラグインの概要。 プラグインページで提出手続きを開始し、公開状況、審査の進捗、MCP の設定状況を確認できます。
リモート MCP サーバーを提出する場合は、MCP ありを選択し、安定してアクセスできる公開 HTTPS エンドポイントを使用してください。プラグインがローカル MCP サーバーを実行する場合や、デスクトップでの実行が必要な場合は、デスクトップ専用プラグインの提出を参照してください。
1. プラグイン ZIP のアップロード
提出権限と公開者情報の確認
プラグインを所有する組織とプロジェクトを選択します。組織のオーナーはプラグインを提出できます。他のメンバーには Apps Management Write 権限が必要です。オーナーは組織のロールからこの権限を付与できます。
個人名または会社名で公開するには、組織設定で本人確認または法人確認を完了してください。
下書きの作成
プラグインで MCP サーバーを使用する場合は、最初の ZIP に含めてください。既存のスキル専用プラグインに MCP サーバーを追加することは、現時点ではできません。
- プラグインを開き、新規または既存のプラグインをアップロードを選択します。
- 確認済みの開発者 ID を選択します。ディレクトリには、この ID に紐づく名前が表示されます。
- プラグインをアップロードを選択し、ZIP ファイルを選びます。
- 検証が完了するとプラグインの詳細ページが開き、新しい下書きが表示されます。
検証に失敗した場合は、報告されたパッケージのエラーを修正し、もう一度アップロードしてください。非公開の認証情報やシークレットは ZIP に含めないでください。
2. チェック結果の確認と問題の修正
ZIP をアップロードすると、プラグインの詳細ページに自動チェックの進捗と指摘事項が表示されます。審査に提出する前に、ここで問題に対処できます。メタデータとスキルにはアップロードしたプラグインパッケージのバージョンが、MCP サーバーには接続したサーバーとスキャンで検出されたツールが表示されます。パッケージの変更には新しい ZIP が必要ですが、ホストしているツールの変更はサーバー上で直接チェックされるため、表示が分かれています。
メタデータの確認
- メタデータとスキルを開きます。最後にアップロードしたバージョンが自動的に表示されます。
- メタデータのチェックが完了したら、問題に指摘事項がないか確認します。
- 問題をコピーを選択して、開発環境で指摘事項を参照できるようにします。
- パッケージ内の該当フィールドを修正し、プラグインをアップロードして問題を修正を選択して修正版の ZIP をアップロードします。新しいチェック結果を確認します。
ヒント: Codex または ChatGPT にパッケージとコピーした指摘事項を渡し、問題の説明と、メタデータやスキルの修正案を依頼できます。

メタデータのチェック結果。 選択したパッケージバージョンの指摘事項を確認し、修正版の ZIP をアップロードします。
この画面のパッケージ情報は読み取り専用です。パッケージフィールドのリファレンスを参照し、元のパッケージで編集してください。公開 URL は外部からアクセスできるものとし、リンク先で提出時と同じ公開者を確認できるようにしてください。
スキルの確認
パッケージにスキルが含まれる場合は、メタデータとスキルで指摘事項を確認します。各指摘事項を開いて、対象のスキルと必要な変更を確認し、スキルの指示や関連ファイルを更新して修正版の ZIP をアップロードします。更新後の結果も確認してください。提出するには、必須のスキルスキャンがすべて正常に完了している必要があります。
MCP サーバーの接続とスキャン
パッケージでは複数の MCP サーバーを宣言できますが、プラグインごとに接続できる MCP サーバーは 1 台だけです。初めてそのサーバーに接続する際は、以下の手順で設定します。接続に問題がある場合は再接続を使用してください。ツールを変更した場合は、最新の変更のスキャンに従ってください。
- MCP サーバーを開き、接続するサーバーを選択します。
- 接続を選択して、MCP サーバーに接続を開きます。
- MCP サーバー URL、認証、その他の該当する設定を確認します。
- ポータルに表示されるドメイン検証チャレンジを完了してからサーバーに接続し、必要に応じて認証を完了します。
- ツールの自動スキャンが完了したら、検出されたツールを確認します。問題を開くと指摘事項を確認できます。
- 接続の問題やサーバー側の指摘事項を修正し、状況に応じて再接続または再スキャンを選択して、新しい結果を確認します。

MCP 接続とドメイン検証。 サーバーへの接続とドメイン検証を完了してから、検出されたツールを確認します。
承認済みのローカル MCP プラグインの場合は、スキルのみを選択し、デスクトップ専用プラグインの提出手順に従ってください。
フォームの入力中、ポータルは提出内容を下書きとして保存します。
接続またはスキャンに失敗した場合は、エンドポイントにアクセスできることと認証設定を確認し、再接続または再スキャンしてください。提出前に、MCP の設定を完了に関する指摘事項と接続エラーを解消してください。MCP サーバー URL、認証、ツールのメタデータ、UI の要件については、プラグインガイドラインを参照してください。
提出時の認証設定
ポータルは、パッケージの mcp.json から詳細な認証設定を読み取ります。MCP 認証リファレンスに従って、認証方式、OAuth クライアント登録、エンドポイント、スコープを設定してください。接続パネルには設定内容が表示されますが、OAuth の詳細設定を編集する機能はありません。
設定を変更するには、mcp.json を更新し、新しいバージョンをアップロードを選択します。接続する前に、MCP サーバーで保存された設定を確認してください。既存のクライアント登録によって認証情報の変更が制限される場合があります。アップロードで既存のクライアントが置き換わったと判断せず、保存された接続情報を確認してください。
OAuth では、プロバイダーがサポートする登録方式を選択します。
| 登録方式 | 指定する内容 |
|---|---|
登録済みクライアント(provided) |
クライアント ID とトークンエンドポイントの認証方式を mcp.json で宣言します。必要な場合は、ポータルにクライアントシークレットを入力します。 |
動的クライアント登録(dcr) |
ディスカバリまたは registrationUrl の明示指定で登録エンドポイントを提供します。パッケージにクライアントの認証情報を含めないでください。 |
クライアント識別子メタデータドキュメント(cimd) |
CIMD の優先設定を指定します。ランタイムは登録ポリシーに応じて DCR にフォールバックできます。 |
登録済みクライアントの場合は、次の手順で設定します。
- 接続フローで使用するコールバック URL を OAuth プロバイダーに登録します。
- MCP サーバーを開き、対象のサーバーを選択して接続を選びます。
- クライアントにシークレットが必要な場合は、OAuth クライアントシークレットを入力します。登録済み OAuth クライアントでは、
tokenEndpointAuthMethodが"none"の場合を除き、このフィールドが表示されます。 - 必要に応じてドメイン検証を完了し、接続を選択して、サーバーの接続とスキャンに使用するアカウントでアクセスを許可します。
- スキャンが完了したら、接続やツールに関する指摘事項を修正します。
クライアントシークレットは mcp.json に含めないでください。マニフェストでは clientSecret は受け付けられません。クライアントシークレットは OAuth アプリケーションの認証に使用します。アカウントのパスワード、アクセストークン、審査担当者用のサインイン認証情報とは異なります。
OAuth ディスカバリで必要なエンドポイントが得られない場合は、authorizationUrl と tokenUrl を mcp.json に追加して明示的に指定します。クライアント ID、トークンエンドポイントの認証方式、スコープ、コールバック URL がプロバイダーの設定と一致することを確認してください。
認証に関する制限
ポータルの接続フォームは、認証なし、OAuth、認証なしと OAuth の併用に対応しています。マニフェストのスキーマでは API キー認証を宣言できますが、ポータルには API キーで接続する手順や Bearer トークンの入力欄がありません。この制限は、Basic 認証やカスタムヘッダーを使用する API キーの宣言にも適用されます。API キーの宣言をアップロードするだけでは MCP の設定は完了しません。提出にこの認証方式が必要な場合は、OpenAI にお問い合わせください。
この制限を回避するために、サーバーの headers にトークンを埋め込まないでください。一般公開用の提出では、空でないサーバーヘッダーは拒否されます。保護されたサーバーに type: "none" を設定しないでください。
登録済み OAuth クライアントのスキーマでは private_key_jwt を指定できますが、この値だけでは署名鍵は設定されません。このポータルガイドでは署名鍵の設定手順を扱っていないため、この方式で提出する前に必要な設定を OpenAI に確認してください。
ドメイン検証の詳細
ドメイン検証では、ポータルに表示された URL で、チャレンジトークンをそのままプレーンテキストとして配信します。
https://<challenge-base-host>/.well-known/openai-apps-challenge
トークンは一字も変えずに単独で返してください。JSON やトークンのリストは使用できません。チャレンジのベース URL には、MCP のホスト名または使用可能な親ドメインの HTTPS オリジンを指定します。パスは無視されます。別のプラグインが同じチャレンジ URL を使用している場合は、そのトークンを置き換えずに、許可された親ドメインのオリジンまたは別のホスト名を使用してください。どちらも使用できない場合は、サポートにお問い合わせください。
3. 審査への提出
自動チェックの指摘事項を確認したら、審査チームがプラグインをテストするために必要な情報を入力し、選択した下書きを提出します。必須の設定を完了し、検証エラーを解消してから提出してください。それ以外の自動チェックの指摘事項は、審査チームに送って判断を仰ぐことができます。
審査情報の入力
MCP 接続を使用するプラグインでは、審査チームが連携をテストできるように審査情報が必要です。正常系と異常系のテストケース、操作説明動画の URL、リリースノートを plugin.json に含めると、ZIP と一緒にインポートされます。審査と公開に関するフィールドのリファレンスとメタデータの完全な例を参照してください。プラグインディレクトリの Plugin Creator を使って情報を準備することもできます。審査担当者用の認証情報は審査の詳細で別途入力します。以下を準備してください。
- 審査担当者用の認証情報(サインインが必要な場合) 専用のテストアカウント、ログイン URL、ワークスペースまたはテナントの詳細、サインイン手順を用意します。実際のユーザーアカウントは使用せず、サンプルデータを使用してください。テストアカウントには各テストケースに必要な権限とデータを用意し、MFA の承認、メールや SMS のコード、マジックリンク、プライベートネットワークへのアクセスなしですぐに使えるようにしてください。
- 正常系のテストケース 5 件 シナリオ、ユーザーのプロンプト、呼び出される想定のツール、期待される結果を記載します。提出前にテストアカウントで各ケースを実行してください。
- 異常系のテストケース 3 件 プラグインが処理を実行すべきでないプロンプトまたはシナリオ、そのリクエストを実行すべきでない理由、期待される応答(拒否、確認の質問、安全な代替対応)を記載します。
- 操作説明動画 テストケースとプラグインの機能を実演し、審査担当者が視聴できる録画の URL を用意します。
- リリースノート 提出するパッケージのバージョンと変更内容を簡潔に記載します。
メタデータとスキルで審査情報 → 審査の詳細を開き、インポートした資料を確認して、審査担当者用の認証情報を入力します。編集可能なフィールドに必要な情報を入力し、詳細を保存を選択します。プラグイン ZIP で管理されていると表示されたフィールドは、パッケージ内で情報を追加または変更してから、再度アップロードしてください。提供対象国と翻訳もパッケージのメタデータで指定できます。指定した場合は、インポートされた設定を確認してください。対応フィールドとインポート時の動作については、提出・審査情報の自動入力を参照してください。

審査の詳細。 ZIP からインポートされたテストケースと関連資料を確認し、非公開の審査担当者用認証情報を別途入力します。
認証情報は公開パッケージには含まれません。その後の審査でもテストアカウントとサンプルデータを利用できる状態にしておいてください。認証情報やサインイン手順が変わった場合は、新しい情報を記載した下書きを提出してください。
下書きの提出
下書きを選択して審査に提出を選び、ポリシーに関する必須の確認事項に回答します。提出後は、プラグインページの審査状況で進捗を確認できます。審査チームからのフィードバックはメールで届きます。

審査への提出。 必須の確認事項に回答し、選択した下書きを審査に提出します。
プラグインごとに同時に進められる審査は 1 件だけです。審査中のパッケージを差し替える場合は、審査結果を待つか審査をキャンセルしてからアップロードしてください。パッケージが却下された場合は、指摘事項を修正して修正版の ZIP を提出してください。
審査チームが提出内容を却下した場合は、通知メールで理由を確認してください。異議を申し立てるには、そのメールに返信し、再検討を求める理由を説明してください。
4. 承認済みプラグインの公開
プラグインが承認されたら、公開のタイミングを自分で決められます。承認済みのパッケージバージョンを開き、プラグインを公開を選択してください。更新版を公開すると、以前のパッケージバージョンが置き換わります。
公開済みプラグインの更新
メタデータ、アセット、同梱のスキルを更新するには、既存のプラグインに新しい ZIP をアップロードします。新しいパッケージバージョンが作成され、チェックと審査がバージョンごとに行われます。ホストしているツールの変更は MCP スキャンで別途処理されるため、パッケージをアップロードする必要はありません。
以前の提出フォームでプラグインを提出した場合は、まず既存のプラグインを ZIP としてダウンロードします。プラグインを開き、公開済みのパッケージバージョンを選択して、リリース ZIP をダウンロードを … メニューから選びます。すでにパッケージをローカルで管理している場合は、そのソースを使用できます。
- パッケージの内容とバージョン番号を更新し、引き続き使用するすべてのコンポーネントを含む完全な ZIP を作成します。
- 既存のプラグインを開き、プラグインをアップロードして変更を選択します。
- メタデータとスキルで、選択したパッケージバージョンを確認します。新しい自動チェックの指摘事項を確認し、対応が必須の問題を修正します。
- 該当する審査手順を完了し、承認済みのパッケージバージョンを公開します。
スキルの追加や削除は、同じプラグインで行ってください。既存の MCP サーバーの URL を変更する場合は、サポートにお問い合わせください。現在の更新手順では URL を変更できません。
MCP サーバーの更新
初回公開後、OpenAI はホストされている MCP サーバーを毎日スキャンします。対象となる更新は自動チェックに合格すると利用可能になり、新しいパッケージバージョンの作成や個別の公開操作は不要です。サーバーの変更をデプロイした直後にスキャンをリクエストすることもできます。
最新の変更のスキャン
- MCP サーバーに変更をデプロイします。
- 既存のプラグインを開き、MCP サーバーを選択して、接続済みのサーバーを選びます。
- 問題で再スキャンを選択します。
- スキャンが完了したら、結果と各ツールの利用可否を確認します。

MCP スキャンの概要。 サーバーを変更したら再スキャンし、結果と各ツールの利用可否を確認します。
別のスキャンが進行中の場合、異議申し立ての審査中の場合、またはプラグインがスキャンの対象外の場合は、再スキャンできないことがあります。
ツールの問題の特定と修正
- 問題を開き、該当するツールを選択します。
- 検出された問題を読み、保留中の更新で評価対象のメタデータを確認します。現在の定義には、現在使用されているメタデータが表示されます。
- 問題をコピーを選択して、開発環境で指摘事項を参照できるようにします。
- サーバー上でツールのメタデータまたは実装を修正し、変更をデプロイします。
- 問題に戻り、再スキャンを選択して、更新後の結果を確認します。
ヒント: Codex または ChatGPT に MCP サーバーとコピーしたエラーを調べてもらい、問題の説明と修正案を依頼できます。
変更はツールごとに評価されます。あるツールの変更が指摘を受けても、他のツールの更新まで保留されるとは限りません。新しいツールは承認されるまで利用できません。既存のツールでは、更新が保留されている間、以前に承認されたメタデータが引き続き使用されます。ツールの削除はスキャン後に反映されます。
更新したメタデータが公開されるまでは、MCP サーバーと現在承認されているツールスキーマとの互換性を維持してください。
自動チェックの指摘に対する異議申し立て
ツールに関する指摘が誤っていると思われる場合は、異議を申し立てるを選択し、審査チームに再検討を求める理由を説明してください。審査チームは、そのスキャンで保留になったツールの変更をまとめて審査します。指摘が正しい場合は、通常、サーバー側で修正して再スキャンする方が早く反映されます。

MCP に関する異議申し立て。 自動チェックの指摘について、審査チームに再検討を求める理由を説明します。
異議申し立ての審査中は MCP の自動更新が一時停止します。変更するには、異議申し立てを取り下げるを選択し、サーバーを更新して再スキャンしてください。異議申し立ての対象は保留中のツールの変更です。パッケージの変更、認証、サーバー共通の指示は対象外です。
トラブルシューティングについては、提出時のエラーを参照してください。サポートへのお問い合わせには、プラグイン ID を記載してください。
提出・審査情報の自動入力
プラグインのマニフェストにディレクトリへの掲載情報、審査情報、公開情報を含めると、ZIP のアップロード時に自動入力されます。以下では、対応フィールド、アップロード時の反映方法、パッケージ形式ごとの例を示します。
アプリ参照(apps / .app.json)またはライフサイクルフックを含むプラグイン ZIP は、現時点では提出できません。MCP サーバーの URL は MCP 設定で宣言し、ダッシュボードで設定を完了してください。
公開ディレクトリへの提出前に、ライフサイクルフックを削除してください。プラグインがライフサイクルフックに依存する場合は、ユーザーがデスクトップ版 Codex に手動でインストールできる形で配布してください。
メタデータの完全な例
以下は、同じノート用プラグインを各形式で記述した例です。使用する形式のマニフェストをコピーし、公開者情報、URL、ツール名、審査用テストケース、翻訳、提供対象国を実際の値に置き換えてください。例のテストケースは実際のサービスでは実行していません。
マニフェストが参照する以下のファイルをパッケージに含めてください。
skills/get-started/SKILL.md(YAML ヘッダーに有効な name と description を記載)assets/内の 4 つのアイコンファイル- notes という名前のリモート MCP サーバー 1 台分の設定。Agent Plugins では
mcp.json、Codex では.mcp.jsonに、以下に示す対応する設定を記載します。
デモと審査用の添付資料には、実際にアクセスできる URL を用意してください。example.com のリンクは書式を示す例であり、提出資料としては使用できません。スキルのみを含むプラグインの場合は、review と MCP 設定を省略し、Codex のマニフェストから mcpServers も省略してください。
Agent Plugins の例では、次の mcp.json を併用します。
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
"mcpServers": {
"notes": {
"type": "streamable-http",
"url": "https://example.com/mcp"
}
}
}
Codex の例では、次の内容をプラグインのルートに .mcp.json として保存します。この形式では Agent Plugins のスキーマを省略します。
{
"mcpServers": {
"notes": {
"url": "https://example.com/mcp"
}
}
}
Agent Plugins 形式
次のマニフェスト全体を、プラグインのルートに plugin.json として保存します。
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "acme-notes",
"version": "1.0.0",
"description": "Search and summarize notes from your Acme workspace.",
"author": {
"name": "Acme",
"email": "support@example.com",
"url": "https://example.com"
},
"homepage": "https://example.com/notes",
"repository": "https://github.com/example/acme-notes",
"license": "MIT",
"keywords": ["notes", "search", "productivity"],
"extensions": {
"com.openai": {
"interface": {
"displayName": "Acme Notes",
"shortDescription": "Find and summarize your notes",
"longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
"developerName": "Acme",
"category": "Productivity",
"capabilities": ["Search notes", "Read notes"],
"websiteURL": "https://example.com/notes",
"supportURL": "https://example.com/support",
"privacyPolicyURL": "https://example.com/privacy",
"termsOfServiceURL": "https://example.com/terms",
"defaultPrompt": [
"Find my notes about the launch.",
"Summarize the decisions in my launch notes.",
"Open the project kickoff notes."
],
"brandColor": "#2357C6",
"brandColorDark": "#8CB4FF",
"composerIcon": "./assets/icon.png",
"composerIconDark": "./assets/icon-dark.png",
"logo": "./assets/logo.png",
"logoDark": "./assets/logo-dark.png"
},
"onboardingSkill": "./skills/get-started/SKILL.md",
"review": {
"test_cases": {
"positive": [
{
"description": "Find notes by topic",
"prompt": "Find my notes about the launch.",
"tools_triggered": "search_notes",
"expected_behavior": "Return accessible notes about the launch with source links.",
"file_attachment_urls": [
"https://example.com/review/launch-brief.pdf"
],
"expected_output_url": "https://example.com/review/launch-results"
},
{
"description": "Open a matching note",
"prompt": "Open the project kickoff notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Find the kickoff note and return its content with a source link."
},
{
"description": "Summarize decisions",
"prompt": "Summarize decisions in my launch notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Summarize decisions from accessible notes and cite the sources."
},
{
"description": "Find action items",
"prompt": "What action items are in my kickoff notes?",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
},
{
"description": "Handle no matches",
"prompt": "Find my notes about Project Northstar.",
"tools_triggered": "search_notes",
"expected_behavior": "Report that no matching notes were found in the test workspace."
}
],
"negative": [
{
"description": "Unsupported payment",
"prompt": "Transfer $100 to another account."
},
{
"description": "Unsupported deletion",
"prompt": "Delete all my notes."
},
{
"description": "Access outside the connected account",
"prompt": "Show notes from a workspace I cannot access."
}
]
},
"demo_recording_url": "https://example.com/review/acme-notes-demo",
"commerce": false,
"commerce_description": "This plugin does not sell products or process payments."
},
"publication": {
"countries": ["US", "GB"],
"release_notes": "Initial release with note search, reading, and summaries.",
"translations": {
"fr-FR": {
"subtitle": "Retrouvez et résumez vos notes",
"description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
},
"ja-JP": {
"subtitle": "ノートを検索して要約",
"description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
}
}
}
}
}
}
Codex 形式
次のマニフェスト全体を .codex-plugin/plugin.json として保存します。表示に関するフィールドはルートの interface に配置し、オンボーディング、審査、公開に関する設定は extensions.com.openai の下に置きます。
{
"name": "acme-notes",
"version": "1.0.0",
"description": "Search and summarize notes from your Acme workspace.",
"author": {
"name": "Acme",
"email": "support@example.com",
"url": "https://example.com"
},
"homepage": "https://example.com/notes",
"repository": "https://github.com/example/acme-notes",
"license": "MIT",
"keywords": ["notes", "search", "productivity"],
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "Acme Notes",
"shortDescription": "Find and summarize your notes",
"longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
"developerName": "Acme",
"category": "Productivity",
"capabilities": ["Search notes", "Read notes"],
"websiteURL": "https://example.com/notes",
"supportURL": "https://example.com/support",
"privacyPolicyURL": "https://example.com/privacy",
"termsOfServiceURL": "https://example.com/terms",
"defaultPrompt": [
"Find my notes about the launch.",
"Summarize the decisions in my launch notes.",
"Open the project kickoff notes."
],
"brandColor": "#2357C6",
"brandColorDark": "#8CB4FF",
"composerIcon": "./assets/icon.png",
"composerIconDark": "./assets/icon-dark.png",
"logo": "./assets/logo.png",
"logoDark": "./assets/logo-dark.png"
},
"extensions": {
"com.openai": {
"onboardingSkill": "./skills/get-started/SKILL.md",
"review": {
"test_cases": {
"positive": [
{
"description": "Find notes by topic",
"prompt": "Find my notes about the launch.",
"tools_triggered": "search_notes",
"expected_behavior": "Return accessible notes about the launch with source links.",
"file_attachment_urls": [
"https://example.com/review/launch-brief.pdf"
],
"expected_output_url": "https://example.com/review/launch-results"
},
{
"description": "Open a matching note",
"prompt": "Open the project kickoff notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Find the kickoff note and return its content with a source link."
},
{
"description": "Summarize decisions",
"prompt": "Summarize decisions in my launch notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Summarize decisions from accessible notes and cite the sources."
},
{
"description": "Find action items",
"prompt": "What action items are in my kickoff notes?",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
},
{
"description": "Handle no matches",
"prompt": "Find my notes about Project Northstar.",
"tools_triggered": "search_notes",
"expected_behavior": "Report that no matching notes were found in the test workspace."
}
],
"negative": [
{
"description": "Unsupported payment",
"prompt": "Transfer $100 to another account."
},
{
"description": "Unsupported deletion",
"prompt": "Delete all my notes."
},
{
"description": "Access outside the connected account",
"prompt": "Show notes from a workspace I cannot access."
}
]
},
"demo_recording_url": "https://example.com/review/acme-notes-demo",
"commerce": false,
"commerce_description": "This plugin does not sell products or process payments."
},
"publication": {
"countries": ["US", "GB"],
"release_notes": "Initial release with note search, reading, and summaries.",
"translations": {
"fr-FR": {
"subtitle": "Retrouvez et résumez vos notes",
"description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
},
"ja-JP": {
"subtitle": "ノートを検索して要約",
"description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
}
}
}
}
}
}
パッケージ形式に応じて、各項目を以下の場所に記載します。
| メタデータ | Agent Plugins:ルートの plugin.json | Codex:.codex-plugin/plugin.json |
|---|---|---|
| パッケージの識別情報と公開者 | ルートのフィールド | ルートのフィールド |
| 掲載用テキスト、リンク、プロンプト、画像 | extensions.com.openai.interface |
interface |
| 初期設定用スキル | extensions.com.openai.onboardingSkill | extensions.com.openai.onboardingSkill |
| 審査と公開の詳細 | extensions.com.openai.review と extensions.com.openai.publication | extensions.com.openai.review と extensions.com.openai.publication |
Agent Plugins パッケージでは、OpenAI 固有の設定を plugin.json の extensions.com.openai に記載します。このオブジェクトがある場合、OpenAI は .codex-plugin/plugin.json の設定を無視します。2 つのファイルの設定が統合されることはありません。オブジェクトがない場合は、.codex-plugin/plugin.json から該当する設定を読み取ります。どちらの場合も、パッケージの識別情報はルートの plugin.json、スキルは skills/、MCP サーバーは mcp.json から読み取られます。
まずはメタデータの完全な例を参考にしてください。開発者ダッシュボードでプライバシーポリシー URL、サポート URL、アプリアイコンの不足が報告された場合は、フィールドのリファレンスで対応するマニフェストフィールドを確認してください。
マニフェストのフィールド
「要件」列には、パッケージ形式の要件と提出時の要件を区別して記載しています。ZIP への審査情報の記載は任意ですが、提出前に必須の資料をすべて用意してください。
パッケージの識別情報とコンポーネント
以下のフィールドはパッケージ自体を記述します。表で OpenAI 拡張フィールドと指定されているものを除き、どちらの形式でもマニフェストのルートに配置します。
| フィールド | 要件 | 値と用途 |
|---|---|---|
$schema |
Agent Plugins では必須、Codex では省略 | ポータブル形式では https://agent-plugins.org/schemas/1.0.0/plugin.schema.json を指定する必要があります。単独の Codex 互換マニフェストでは省略します。 |
name |
必須 | 変更せずに使用する識別子で、最大 64 文字です。提出予定のパッケージでは、小文字の英字、数字、連続しないハイフンを使用してください。表示名とは別に管理します。 |
version |
Codex では必須、ポータブル形式のスキーマでは任意 | 1.0.0 などのリリースバージョンです。ポータブル形式のスキーマでは任意ですが、提出時と更新時にはセマンティックバージョンを明示してください。Codex 形式では必須です。 |
description |
Codex では必須、Agent Plugins では任意 | パッケージの概要で、最大 4000 文字です。ポータブル形式のスキーマでは任意、Codex 形式では必須です。 |
author |
Codex では必須、Agent Plugins では任意 | 名前と、任意のメールアドレスおよび HTTPS の url を含む公開者オブジェクトです。ポータブル形式のスキーマではオブジェクト自体を省略できますが、Codex 形式では author.name が必須です。名前は最大 120 文字、メールアドレスは最大 320 文字、URL は最大 2048 文字です。 |
homepage |
任意 | プロジェクトのホームページを指す HTTPS URL で、最大 2048 文字です。ディレクトリ掲載用の interface.websiteURL は別途設定します。 |
repository |
任意 | ソースリポジトリの URL です。 |
license |
任意 | MIT などのライセンス識別子です。 |
keywords |
任意 | プラグインを見つけるためのキーワードの配列です。 |
extensions |
任意 | 名前空間ごとにまとめた設定です。OpenAI 固有の設定は com.openai の下に配置します。 |
skills |
スキルを含む Codex パッケージ用 | Codex 専用です。"./skills/" のように、スキルを含むディレクトリの相対パスまたはパスの配列を指定します。ポータブルパッケージでは skills/ が自動的に検出されます。 |
mcpServers |
MCP サーバーを含む Codex パッケージ用 | Codex 専用です。同梱する MCP サーバー設定のパスとして "./.mcp.json" を指定します。ポータブルパッケージではルートの mcp.json が自動的に検出されます。 |
以下の追加設定は、ポータブルパッケージでは extensions.com.openai の中に、Codex 互換マニフェストではルートに配置します。
| フィールド | 要件 | 値と用途 |
|---|---|---|
interface |
Codex では必須、Agent Plugins では任意 | 掲載用メタデータで説明する表示設定のオブジェクトです。Codex 形式では必須です。ポータブルパッケージでは、基本的な表示テキストをルートのメタデータから取得できます。 |
id |
任意 | 管理対象のプラグインカタログで使用する識別子です。値が割り当てられている場合は保持してください。ZIP のアップロードではダッシュボード上のプラグインの識別情報が使用されます。 |
ポータブルパッケージでは、常に skills/ からスキルを、mcp.json から MCP サーバーを検出します。インライン拡張設定または互換用の追加設定で skills や mcpServers を宣言しても、これらのコンポーネントを置き換えたり、無効化したり、追加したりすることはできません。このような宣言は、認識可能なポータブル形式のルートマニフェストがないパッケージにのみ適用されます。
掲載用メタデータ
以下のフィールドは、Agent Plugins では extensions.com.openai.interface に、Codex 形式では interface に配置します。ここに示す上限は一般公開のための提出に適用されます。パッケージのアップロード時には、上限を超える下書きテキストも受け付けられることがあります。アップロードに成功しても、掲載情報が提出要件を満たしているとは限りません。
| フィールド | 要件 | 型 | 値と提出時の制限 |
|---|---|---|---|
displayName |
必須 | 文字列 | ユーザーに表示する名前です。必須で、最大 30 文字です。 |
shortDescription |
必須 | 文字列 | 名前と一緒に表示するサブタイトルです。必須で、最大 30 文字です。 |
longDescription |
必須 | 文字列 | 実行できるタスク、想定ユーザー、制限事項の説明です。必須で、最大 4000 文字です。 |
developerName |
必須 | 文字列 | 公開者名です。必須で、最大 80 文字です。ディレクトリに表示される公開者名は、選択した確認済みの開発者 ID から自動設定されます。 |
category |
必須 | 文字列 | Productivity や Developer Tools など、ダッシュボードにあるカテゴリ名を指定します。 |
capabilities |
Codex では必須、Agent Plugins では任意 | 文字列の配列 | 機能を示すラベルを最大 20 件、各 120 文字以内で指定します。Codex 形式では必須です。ラベルがない場合は [] を使用します。 |
websiteURL |
MCP の審査で必須 | 文字列 | 製品サイトの HTTPS URL で、最大 1024 文字です。 |
supportURL |
MCP の審査で必須 | 文字列 | カスタマーサポートページの HTTPS URL で、最大 1024 文字です。 |
privacyPolicyURL |
MCP の審査で必須 | 文字列 | プライバシーポリシーの HTTPS URL で、最大 1024 文字です。 |
termsOfServiceURL |
MCP の審査で必須 | 文字列 | 利用規約の HTTPS URL で、最大 1024 文字です。 |
defaultPrompt |
任意 | 文字列または文字列の配列 | 利用開始時に提示するプロンプトを最大 3 件、各 128 文字以内で指定します。内容は重複させず、アプリへの @メンションは含めないでください。複数のプロンプトは配列で指定します。 |
brandColor |
任意 | 文字列 | ライトテーマの色を #RRGGBB 形式で指定します。白とのコントラスト比は 2:1 以上とします。 |
brandColorDark |
任意 | 文字列 | ダークテーマの色を #RRGGBB 形式で指定します。#212121 とのコントラスト比は 2:1 以上とします。brandColor のみを指定した場合は、ダークテーマの色が自動的に算出されます。 |
composerIcon |
Codex では必須 | 文字列 | コンポーザーで使用するアイコンの相対パスです。 |
composerIconDark |
任意 | 文字列 | コンポーザーアイコンのダークテーマ版の相対パスです。 |
logo |
Codex では必須。提出にはメインアイコンが必須 | 文字列 | ディレクトリに掲載するメインアイコンの相対パスです。 |
logoDark |
任意 | 文字列 | メインアイコンのダークテーマ版の相対パスです。 |
プラグインに紐づく MCP アプリで一般公開のための審査が必要な場合は、掲載用 URL として websiteURL、supportURL、privacyPolicyURL、termsOfServiceURL の 4 つすべてが必須です。認証情報を含まない HTTPS URL を使用してください。スキル専用プラグインのメタデータ検証では、この 4 つすべてが必須というわけではありません。パッケージの homepage と author.url からこれらの掲載用フィールドが自動入力されることはありません。
アイコン
配布用のパッケージには logo と composerIcon を含めてください。Codex パッケージの検証では両方が必須です。ポータブルパッケージはどちらも含めずにアップロードできますが、提出前にダッシュボードでメインのアプリアイコンが必要になります。ダークテーマ版は任意です。「アプリアイコンが必要です」という警告が表示された場合は、logo と対応する画像ファイルをパッケージに追加するか、ダッシュボードでアイコンを指定してください。
プラグインのルートからの相対パスを ./ で始め、参照するファイルをすべてパッケージに含めます。対応する画像形式は PNG、JPEG、WebP、SVG で、各ファイルのサイズは最大 5 MiB です。アイコンとロゴは正方形で、48 × 48 ピクセル以上である必要があります。ラスター画像の幅と高さは、それぞれ最大 4096 ピクセルです。SVG アイコンでは、正方形になるように幅と高さを数値で指定するか、48 × 48 以上の正方形の viewBox を指定してください。
オンボーディング、審査、公開の設定
どちらの形式でも、以下のオブジェクトは extensions.com.openai の直下に配置します。ポータブル形式では interface と同じ階層です。interface の中には配置しないでください。
任意の onboardingSkill を指定すると、ユーザーはインストール後に初期設定用のワークフローを実行できます。マニフェストの例、パスの指定規則、初期設定で新規または既存の会話を利用する仕組みについては、オンボーディングスキルの追加を参照してください。
| フィールド | 要件 | 型 | 値と用途 |
|---|---|---|---|
onboardingSkill |
任意 | 文字列 | ./skills/get-started/SKILL.md など、同梱したスキルの SKILL.md への相対パスです。パッケージに含まれるスキルを参照する必要があります。 |
review.test_cases.positive |
ZIP では任意。MCP の初回審査には 5 件が必須 | オブジェクトの配列 | MCP サーバーがちょうど 1 台のプラグインに対する正常系の審査用テストケースです。後述のテストケース用フィールドを使用します。 |
review.test_cases.negative |
ZIP では任意。MCP の初回審査には 3 件が必須 | オブジェクトの配列 | 同じサーバーに対する異常系の審査用テストケースです。 |
review.demo_recording_url |
ZIP では任意。MCP の審査では必須 | 文字列 | 審査担当者が視聴できる操作説明動画の URL です。 |
review.commerce |
任意 | ブール値 | アプリが商取引に対応するかを指定します。この宣言は法的条項への同意にはなりません。 |
review.commerce_description |
任意 | 文字列 | アプリが商取引をどのように扱うかを説明します。 |
publication.countries |
任意 | 文字列の配列 | US や GB など、有効な大文字の国コードで提供対象国を指定する許可リストです。省略すると既存の対象国設定が保持され、[] を指定すると国による制限が解除されます。スキル専用プラグインを含め、プラグインの公開時に適用されます。 |
publication.release_notes |
任意 | 文字列 | このバージョンの変更内容を記載します。 |
publication.translations |
任意 | オブジェクトまたは null | ロケールキーと翻訳済みの掲載用テキストの対応を指定します。掲載用テキストの翻訳を参照してください。 |
publication.translations.<locale>.subtitle |
任意 | 文字列または null | 翻訳済みのサブタイトルで、最大 30 文字です。 |
publication.translations.<locale>.description |
任意 | 文字列または null | 翻訳済みの説明で、最大 4000 文字です。 |
review.test_cases.positive または review.test_cases.negative の各オブジェクトには、テストケースを 1 件ずつ記述します。
| フィールド | 要件 | 型 | 値と用途 |
|---|---|---|---|
description |
必須 | 文字列 | 確認する動作を記述します。正常系の説明は 4000 文字以内にしてください。 |
prompt |
必須 | 文字列 | 審査担当者が試せるユーザープロンプトを記載します。 |
tools_triggered |
正常系では必須 | 文字列 | 呼び出される想定のツール名です。正常系のテストケースでは提出時に必須です。 |
expected_behavior |
正常系では必須 | 文字列 | 実行時に確認できる期待結果です。正常系のテストケースでは提出時に必須です。 |
file_attachment_urls |
任意 | 文字列の配列 | テストケースで使用するファイルへのリンクです。 |
expected_output_url |
任意 | 文字列 | 期待結果の例へのリンクです。たとえば、審査担当者が実際の出力と比較できる参照用ドキュメントを指定します。 |
MCP アプリの初回審査には、正常系のテストケースがちょうど 5 件、異常系がちょうど 3 件必要です。アップロード時は一部のケースだけでも受け付けられますが、提出前にすべて揃えてください。MCP サーバーが複数ある場合は、MCP 設定内でサーバーごとにテストケースを宣言します。プラグインレベルの review.test_cases はサーバーがちょうど 1 台の場合にのみ使用でき、サーバーごとのテストケース宣言とは併用できません。スキル専用プラグインでは、MCP アプリの審査用テストケースやデモ動画は不要です。
インポートしたテストケースは、ダッシュボードでは読み取り専用です。変更するには、パッケージを編集して再度アップロードしてください。test_cases を省略するか null に設定すると、既存のテストケースが保持されます。test_cases: {} を指定すると、両方のリストが消去されます。その後のアップロードでテストケースを省略しても、ダッシュボードで編集できるようにはなりません。
審査情報のスカラーフィールドと release_notes は、省略するか null に設定すると保存済みの値が保持され、空文字列を指定するとテキストが消去されます。パッケージで明示した値は提出時に再適用されます。ダッシュボードで編集した値を使用する場合は、該当するスカラーフィールドの宣言をパッケージから削除してください。共通の審査フィールドは、そのプラグインに紐づく MCP アプリの下書きに適用されます。スキル専用プラグインのリリースノートはパッケージ内に保持され、アプリの審査は作成されません。
commerce と commerce_description は publication ではなく review に配置します。認証情報や審査担当者向けの手順はパッケージに含めないでください。ZIP のメタデータでは test_credentials と reviewer_instructions は拒否されます。審査担当者のアクセスに必要な情報は、ダッシュボードの安全なフォームに入力してください。
掲載用テキストの翻訳
どちらの形式でも、extensions.com.openai.publication の下に translations オブジェクトを追加すると、翻訳済みのサブタイトルと説明を指定できます。ロケールキーには fr-FR や ja-JP などの空でない値を使用してください。ロケールごとのオブジェクトには subtitle、description、またはその両方を指定できます。どちらのフィールドも省略するか null に設定できます。translations 自体も省略するか null に設定できます。
基本の掲載用フィールドには英語のテキストを記載してください。en-US の翻訳は不要で、インポート時にも生成されません。
翻訳済みのサブタイトルは 1 行で、最大 30 文字です。翻訳済みの説明には \n による改行を含めることができ、最大 4000 文字です。テキストには空白以外の文字が必要です。使用できる文字のみを指定してください。タブなどのサポートされていない制御文字は拒否されます。文字数の上限は、先頭と末尾のスペースを含む入力テキスト全体に適用されます。
翻訳はインポート時に検証され、アップロードしたパッケージに保持されます。メタデータを編集した後も保持されます。現時点では、翻訳をインポートしてもプラグインディレクトリの表示テキストや掲載情報 API のレスポンスには反映されません。