Convert a Claude Code plugin to Codex and Gemini CLI
Free, runs in your browser. Updated .
A Claude Code plugin can install in Codex and Gemini CLI from the same repository: each runtime only needs its own manifest next to the files you already have. Paste the plugin’s .claude-plugin/plugin.json and, if it has MCP servers, its .mcp.json. The converter writes the Codex plugin manifest, a Codex marketplace entry and a Gemini CLI extension manifest, or says what stops a runtime from loading the plugin. It uses the same rules as the pull requests HOL opens from the plugin hub, and nothing you paste leaves your browser.
Required. The name must be lowercase words joined by hyphens.
Optional. Leave it empty if the plugin has no MCP servers. Both files stay in this browser tab.
What carries over
The converter only writes manifests. Your skills, servers and code stay where they are, and each manifest tells its runtime where to find them.
| Part of the plugin | Codex | Gemini CLI |
|---|---|---|
Skills in skills/<name>/SKILL.md | Yes. The manifest points to ./skills/. | No. |
MCP servers in .mcp.json | Yes. The manifest points to the existing ./.mcp.json. | Yes. Each server is copied into gemini-extension.json, with plugin paths and variables rewritten. |
GEMINI.md context file | Not used. | Yes, as contextFileName. |
| Slash commands, subagents and hooks | No. They keep working in Claude Code. | No. They keep working in Claude Code. |
| Name, version and description | Yes, with homepage, repository, license, author and keywords. Version 0.1.0 when plugin.json has none. | Yes. Version 0.1.0 when plugin.json has none. |
| Marketplace listing | A new .agents/plugins/marketplace.json in the Productivity category, unless the repository has one. | None needed. The gallery reads the repository topic. |
What stops a conversion
The converter writes nothing for a runtime that could not load the result, and says which of these it hit.
- The plugin name is not kebab-case
- Both runtimes need lowercase letters and digits joined by hyphens, such as issue-triage.
- MCP servers are declared inside plugin.json
- Move the mcpServers object to .mcp.json so every runtime reads the same file.
- A server cannot run outside Claude Code
- It sets cwd, reads ${CLAUDE_PLUGIN_DATA}, or puts a literal value in env instead of one ${VAR} reference.
- Nothing the runtime loads
- Codex needs skills or MCP servers. Gemini CLI needs MCP servers or a GEMINI.md.
Example: one MCP server in Gemini CLI
The example plugin starts its server with node ${CLAUDE_PLUGIN_ROOT}/server/index.js and reads ${GITHUB_TOKEN}. In the Gemini CLI manifest the path uses the extension folder and the variable becomes a sensitive setting.
{
"description": "Label, deduplicate and draft replies to GitHub issues.",
"mcpServers": {
"github": {
"args": [
"${extensionPath}/server/index.js"
],
"command": "node",
"env": {
"GITHUB_TOKEN": "$GITHUB_TOKEN"
}
}
},
"name": "issue-triage",
"settings": [
{
"description": "GITHUB_TOKEN for the github MCP server.",
"envVar": "GITHUB_TOKEN",
"name": "GITHUB_TOKEN",
"sensitive": true
}
],
"version": "1.2.0"
}
Questions
- Can one repository be a Claude Code plugin, a Codex plugin and a Gemini CLI extension?
- Yes. Each runtime looks for its own manifest: Claude Code reads .claude-plugin/plugin.json, Codex reads .codex-plugin/plugin.json and Gemini CLI reads gemini-extension.json at the repository root. The skills and .mcp.json stay where they are and each manifest points to them.
- What does not carry over from a Claude Code plugin?
- Slash commands, subagents and hooks. Codex loads a plugin’s skills and MCP servers; Gemini CLI loads MCP servers and a GEMINI.md context file. The converter says so in its notes, and those parts keep working in Claude Code.
- How are ${CLAUDE_PLUGIN_ROOT} and environment variables rewritten for Gemini CLI?
- ${CLAUDE_PLUGIN_ROOT} becomes ${extensionPath}, and a ${VAR} reference becomes $VAR. Each variable a server reads is added to the extension’s settings as a sensitive value, so Gemini CLI prompts for it when the extension is installed and the value never sits in the manifest.
- Why does the converter refuse an MCP server?
- Neither runtime can run it as written. That happens when a server sets a working directory (cwd), reads ${CLAUDE_PLUGIN_DATA}, or puts a literal value in env instead of a single ${VAR} reference. Remove the dependency or keep that server Claude Code only.
- Is this the same output as hol-guard plugin package?
- The manifest content is the same: keys sorted, two-space indent and a trailing newline. hol-guard plugin package writes the files into a package folder and also covers Cursor; this page writes them for the repository root, where the runtimes find them.
- Is my plugin uploaded anywhere?
- No. The conversion runs in this browser tab and nothing is kept after you leave the page.
Related
- Publish one plugin to Claude Code, Codex, Cursor and Gemini CLI: the full guide, including Cursor and the HOL Guard Plugin Kit.
- Plugin pre-flight: check the repository against the Claude, Codex and Cursor directory rules after you push.
- Claude Code plugin.json generator: no Claude Code plugin yet? Start with its manifest and marketplace.json.
- AI plugin runtime compatibility map: which runtimes the catalog's plugins declare, and how many support more than one.
- Runtime reach calculator: which runtime Claude Code plugins most often add next.
- Plugins that work in both Claude Code and Codex: the highest trust-scored plugins that already declare both.