If you already publish a Claude Code plugin or connector, choose the OpenAI submission path that matches what you ship.
| What you have | OpenAI submission path |
|---|---|
| A skills-only Claude Code plugin | Follow Submit a skills-only plugin. |
| A remote MCP connector | Follow Submit a plugin with an MCP server. Skills are optional. |
| A Claude Code plugin with skills and a remote MCP server | Follow Submit a plugin with an MCP server and include the skills in the same submission. |
A plugin with only local stdio MCP servers | We recommend exposing your MCP server as a public HTTP endpoint. If that isn’t possible, wait until OpenAI supports local MCP servers. |
A Claude Desktop extension (.mcpb) | The portal doesn’t accept .mcpb files. Expose its MCP server as a public HTTP endpoint, or wait until OpenAI supports local MCP servers. |
Claude uses separate submission processes for Claude Code plugins and MCP connectors. OpenAI uses one plugin submission with either skills alone or skills and an optional remote MCP server. Claude marketplace listings and approvals don’t transfer.
Submit a skills-only plugin
Choose this path when the plugin doesn’t need an MCP server.
Review what OpenAI supports
| What your Claude plugin has | What to do |
|---|---|
skills | Keep each skill with its SKILL.md, scripts, references, and assets. A direct Claude archive upload must include at least one skill at skills/<skill-name>/SKILL.md. |
| Manifest-declared custom skill directories | Keep the directories and their manifest declarations in the archive. |
| Skills that explicitly refer to Claude | Replace Claude-specific references in the skill instructions with provider-neutral language, such as “the model.” Keep a product name only when the instruction genuinely applies to that product. |
commands, commands/, agents, or agents/ | Convert reusable behavior to skills. Turn each Markdown command into a skill, move reusable agent procedures into skills, and merge useful persona instructions into the relevant skill. |
hooks or hooks/hooks.json | Adapt supported command hooks for Codex and test them against the Codex hook runtime. Don’t require hooks for the core ChatGPT workflow. ChatGPT doesn’t run plugin hooks yet, and Codex doesn’t run prompt or agent hook handlers. |
userConfig or ${user_config.*} | OpenAI doesn’t run Claude installation prompts or expand user_config variables. Follow Replace Claude userConfig. If the plugin needs credentials or persistent user settings, use the With MCP path. |
| Skills that create or update Claude live artifacts | OpenAI doesn’t currently support Claude live artifacts. Remove instructions that require creating, reopening, refreshing, or updating an artifact. Return the underlying content as regular conversation output instead; for example, render artifact tables as standard tables. Artifact-specific HTML, persistence, refresh behavior, and interactions aren’t preserved. |
bin/, settings, settings.json, CLAUDE.md, or .claude/settings*.json | Keep required helpers and instructions in the plugin. Call bundled executables with package-relative paths, and remove Claude-only settings. |
outputStyles, lspServers, experimental.themes, experimental.monitors, channels, or dependencies | Move essential behavior into skills, then remove the Claude declaration. Contact your OpenAI partner if the core workflow requires inbound channel messages. |
.claude-plugin/plugin.json | Keep the manifest for a direct Claude archive upload. The portal converts it to .codex-plugin/plugin.json. |
.claude-plugin/marketplace.json, .mcp.json, mcpServers, .app.json, or apps | Don’t rely on these files or declarations. A skills-only upload excludes MCP and app configuration, and you can’t submit an existing app integration by reference. |
Prepare and upload the archive
- Confirm that the archive root, or its single top-level directory, includes
.claude-plugin/plugin.jsonwith a nonemptydescriptionand at least one valid skill atskills/<skill-name>/SKILL.md. - Open the plugin submission portal, select Create plugin, choose Skills only, and upload the archive.
- Review the generated
.codex-plugin/plugin.json. The portal adds missing interface defaults and normalizes text fields during conversion. - Test the imported skills in a clean environment. Confirm that each skill can find its referenced files and executables and doesn’t depend on undeclared local packages, files, or credentials.
- Complete the listing and review fields, fix every scan result, and submit the draft.
If the archive doesn’t qualify for direct upload, use Package your plugin to create the OpenAI manifest and package layout. See Build skills for skill requirements.
Submit a plugin with an MCP server
Choose this path for a plugin that needs both skills and an MCP server.
Review what OpenAI supports
| What your Claude integration has | What to do |
|---|---|
| A remote MCP server | Reuse the server implementation. Submit a stable, public HTTPS endpoint that uses streamable HTTP. |
A local stdio server, .mcpb, .mcp.json, or claude_desktop_config.json | We recommend exposing your MCP server as a public HTTP endpoint. If that isn’t possible, wait until OpenAI supports local MCP servers. The portal doesn’t accept .mcpb files. |
| Skills or manifest-declared custom skill directories | Include the skills in the same With MCP submission. Keep each SKILL.md with its scripts, references, and assets. |
| Skills that explicitly refer to Claude | Replace Claude-specific references in the skill instructions with provider-neutral language, such as “the model.” Keep a product name only when the instruction genuinely applies to that product. |
commands, commands/, agents, or agents/ | Convert reusable behavior to skills. Turn each Markdown command into a skill, move reusable agent procedures into skills, and merge useful persona instructions into the relevant skill. |
hooks or hooks/hooks.json | Adapt supported command hooks for Codex and test them against the Codex hook runtime. Don’t require hooks for the core ChatGPT workflow. ChatGPT doesn’t run plugin hooks yet, and Codex doesn’t run prompt or agent hook handlers. |
userConfig or ${user_config.*} | OpenAI doesn’t run Claude installation prompts or expand user_config variables. Follow Replace Claude userConfig to move each value to an explicit input, OAuth, hosted storage, or Codex-local configuration. |
| Skills that create or update Claude live artifacts | OpenAI doesn’t currently support Claude live artifacts. Remove instructions that require creating, reopening, refreshing, or updating an artifact. Return the underlying content as regular conversation output instead; for example, render artifact tables as standard tables. Artifact-specific HTML, persistence, refresh behavior, and interactions aren’t preserved. |
.app.json, apps, or an existing app integration | Submit the MCP server endpoint directly. You can’t submit an existing app integration by reference. |
outputStyles, lspServers, experimental.themes, experimental.monitors, channels, or dependencies | Move essential behavior into skills or MCP tools, then remove the Claude declaration. Contact your OpenAI partner if the core workflow requires inbound channel messages. |
Prepare and submit the MCP server
- Deploy the MCP server at its production HTTPS endpoint. Use OAuth 2.1 when the server accesses private user data or takes actions for a user.
- Add accurate tool schemas and safety annotations. Test that every tool connects, authenticates, returns the expected result shape, and requires the intended confirmation for write or destructive actions.
- Convert any commands or agents to skills and make sure the skills don’t depend on undeclared local packages, files, or credentials.
- Open the plugin submission portal, select Create plugin, choose With MCP, and submit the production endpoint. Add the converted skills to the same draft when applicable.
- Verify the server domain, configure authentication when the server requires sign-in, complete the listing and review fields, fix every scan result, and submit the draft.
Review the MCP server review requirements before submitting.
Replace Claude userConfig
OpenAI plugins don’t run Claude userConfig installation prompts or expand
${user_config.*} references. Remove those references and replace each value
based on how the plugin uses it.
| What the value controls | OpenAI replacement |
|---|---|
| A choice that can change for each task | Add an explicit skill or MCP tool input. Ask for the value only when the workflow needs it. |
| A credential for a remote service | Use OAuth 2.1 through the remote MCP server. Don’t put secrets in the skill archive, manifest, instructions, or default values. |
| A preference that should persist | Store it in the hosted service and associate it with the authenticated user. Let the user update it through an explicit workflow or tool input. |
| A setting for a Codex-local script or hook | Use a documented environment variable or config file. Check it before use and return an actionable error when missing. Don’t make this local setting necessary for the core ChatGPT workflow. |
| A fixed value that is the same for all users | Put a non-secret default in the skill instructions or hosted service configuration. |
If a skills-only plugin needs a credential or a setting that must persist between conversations, add a remote MCP server and submit it through With MCP. If the value only affects the current task, keep the plugin skills-only and collect it as an explicit skill input.
Complete the submission requirements
Before submitting either plugin, get Apps Management write access in the OpenAI organization that will own it. You must also complete individual or business identity verification. Every plugin must complete OpenAI review.
Contact your OpenAI partner before submitting if the plugin’s core value requires local execution, arbitrary access to files on the user’s computer, hardware or application access, offline operation, or inbound channel messages. These cases may need a different design or product-specific review.
For the complete portal workflow, see Submit plugins. If the portal reports a package validation code, use the submission error reference.