プラグインには、スキルと MCP 設定のいずれか一方または両方をまとめられます。プラグインのファイルを自分の環境に読み込むか、ZIP ファイルとして OpenAI がホストする環境にアップロードします。
プラグインのパッケージ化
この例では、ドキュメント検索スキルと、OpenAI ドキュメント用の MCP サーバーを組み合わせます。ネットワークアクセスは必要ですが、認証情報やローカルサーバー用の依存関係は不要です。
docs-helper/
├── .codex-plugin/plugin.json
├── .mcp.json
└── skills/docs-search/SKILL.md
スキルのディレクトリと MCP 設定ファイルを .codex-plugin/plugin.json に指定します。
{
"name": "docs-helper",
"version": "1.0.0",
"description": "Find answers in OpenAI developer documentation.",
"skills": "./skills/",
"mcpServers": "./.mcp.json"
}
パスの基準はプラグインのルートディレクトリです。各パスは ./ で始まり、プラグイン内を指す必要があります。パスの構成要素に .. は使用できません。マニフェストの形式の詳細は「プラグインのパッケージ化」を参照してください。
サーバーを .mcp.json に追加します。このファイルではプラグイン用の形式を使用します。これは agent.tools の形式とは異なります。
{
"mcpServers": {
"openai_docs": {
"type": "http",
"url": "https://developers.openai.com/mcp"
}
}
}
スキルの指示を skills/docs-search/SKILL.md に追加します。
---
name: docs-search
description: Find answers in OpenAI developer documentation.
---
Use the openai_docs MCP server to find relevant documentation.
Answer the question and link to the sources you used.
セルフホスト型サンドボックスへのプラグインの登録
プラグインを /workspace/plugins/docs-helper にコピーし、その絶対パスを environment.capability_directories に追加します。指定するのは、.codex-plugin/plugin.json があるプラグインのルートディレクトリです。
import OpenAI from "openai";
const client = new OpenAI();
const result = await client.beta.agents.sessions.create({
agent: {
model: "gpt-6-astra",
},
environment: {
type: "self_hosted",
workspace_directory: "/workspace",
capability_directories: ["/workspace/plugins/docs-helper"],
},
});
console.log(result.id);エージェントがプラグインを使用する前に、エグゼキューターを接続してください。環境から https://developers.openai.com/mcp にアクセスできるようにします。
複数のプラグインを登録する場合は、それぞれのルートディレクトリを指定します。親ディレクトリを指定すると配下のスキルは検出できますが、各プラグインの MCP 設定までは読み込まれません。
OpenAI がホストするサンドボックスへのプラグインのアップロード
environment.plugins に、プラグインごとに 1 つの ZIP ファイルを指定します。各 ZIP ファイルにはプラグインフォルダーを 1 つだけ含め、その中に .codex-plugin/plugin.json を配置してください。リクエストで指定する名前と説明は、マニフェストの名前と説明に一致する必要があります。
次のヘルパー関数は、フォルダーをパッケージ化してセッションを作成します。API クライアントと docs-helper へのパスを渡してください。OpenAI がプラグインを自動的に展開して登録します。
import base64
import json
import shutil
from pathlib import Path
from tempfile import TemporaryDirectory
def upload_plugin(client, plugin_directory):
plugin_directory = Path(plugin_directory).resolve()
manifest = json.loads((plugin_directory / ".codex-plugin/plugin.json").read_text())
with TemporaryDirectory() as temporary:
archive = shutil.make_archive(
str(Path(temporary) / "plugin"),
"zip",
root_dir=plugin_directory.parent,
base_dir=plugin_directory.name,
)
return client.beta.agents.sessions.create(
agent={"model": "gpt-6-astra"},
environment={
"type": "openai_hosted",
"plugins": [
{
"type": "inline",
"name": manifest["name"],
"description": manifest["description"],
"source": {
"type": "base64",
"media_type": "application/zip",
"data": base64.b64encode(
Path(archive).read_bytes()
).decode(),
},
}
],
},
)ホスト環境でのプラグイン設定の再利用
プラグインのリストを指定して環境テンプレートを作成します。以降のセッションでは、environment.environment_template_id に保存したテンプレートの ID を設定します。
environment.plugins を省略すると、テンプレートのプラグインリストが引き継がれます。リストを指定すると、そのセッションでは指定したリストがテンプレートのリストに代わって使われます。セッションごとに専用の環境が作成され、ルートエージェントとそのサブエージェントがこの環境を共有します。
MCP サーバーの認証
この例では認証は不要です。他のプラグインの MCP サーバーで認証が必要な場合は、接続方式に応じて次のように設定します。
- HTTP:
bearer_token_env_varで指定した環境変数の値が Bearer トークンとして送信されます。その他のhttp_headersの値はリテラルとして扱われます。env_http_headersはサポートされていません。 - 標準入出力:
env_varsに、サーバープロセスに渡す環境変数を列挙します。実行ファイルとその依存関係を環境にインストールしてください。相対パスで指定したcwdは、プラグインのルートディレクトリを基準に解決されます。
プラグインのファイルやアーカイブにはシークレットを含めないでください。プラグインの MCP サーバーへの接続は、セッションの環境から行われます。認証情報にアクセスできる範囲については、「MCP の認証」を参照してください。
ホスト環境で標準入出力を使う MCP サーバーに接続する場合は、ネットワークポリシーを省略するか、enabled に設定します。この接続方式では、disabled と restricted のネットワークポリシーはサポートされていません。
プラグインのテスト
通常のセッションメッセージで、スキルの使用を依頼します。
docs-search を使って、Responses API の出力をストリーミングする方法を説明してください。ドキュメントへのリンクも含めてください。
ターンが完了し、そのターンの保存済みアイテムに openai_docs の呼び出しが成功した記録があることを確認します。回答がスキルの指示に従い、参照したドキュメントを示していることも確認してください。スキルのみのプラグインでは、出力が指示に沿っていることを確認します。MCP の呼び出しは不要です。
プラグインのファイルやテンプレートを変更した後は、新しいセッションを作成してください。既存のセッションではツールが再読み込みされません。接続エラーが発生した場合は、「MCP 接続のトラブルシューティング」を参照してください。テストが終わったら、テスト用セッションを削除し、セルフホスト環境のコンピューティングリソースを停止します。