openmarketplace
v0.0.3
Published
An interoperable marketplace for agent plugins
Readme
openmarketplace
A TypeScript library and CLI for converting AI coding agent plugins between formats. Parse a plugin from any supported agent, convert it to any other, and browse/install plugins from marketplace catalogs.
Why
Every AI coding agent has its own plugin format: Claude Code uses JSON manifests + SKILL.md, Codex uses TOML, Gemini CLI uses extension manifests, Cursor/Windsurf/Cline use their own MCP JSON layouts. A plugin written for one agent doesn't work in another.
openmarketplace solves this with an Intermediate Representation (IR). Each agent gets one adapter that can parse and emit. N adapters give N x N conversions without writing N x N individual converters.
Source Adapter (parse) --> Plugin IR --> Target Adapter (emit)When a target agent doesn't support something (e.g., Cursor can't represent hooks), the converter drops it gracefully and returns a structured diagnostic explaining what was lost.
Supported agents
| Agent | MCP | Skills | Agents | Hooks | Context | Commands | LSP | |-------|:---:|:------:|:------:|:-----:|:-------:|:--------:|:---:| | Claude Code | stdio, http, sse | yes | yes | yes | yes | yes | yes | | Codex | stdio, http | yes | yes | - | yes | - | - | | Gemini CLI | stdio, http, sse | yes | yes | yes | yes | yes | - | | Cursor | stdio, http | - | - | - | - | - | - | | Windsurf | stdio, http, sse | - | - | - | - | - | - | | Cline | stdio, sse | - | - | - | - | - | - | | Continue | stdio, http, sse | - | - | - | - | - | - | | Amazon Q | stdio, http | - | - | - | - | - | - | | VS Code | stdio, http | - | - | - | - | - | - |
Install
npm install openmarketplaceLibrary usage
import { convert, parsePlugin, emitPlugin } from "openmarketplace";
// Convert a Claude Code plugin to Cursor format
const result = await convert({
from: "claude-code",
to: "cursor",
files: {
".mcp.json": '{"mcpServers":{"fs":{"command":"npx","args":["-y","@anthropic/mcp-fs"]}}}',
"skills/deploy/SKILL.md": "---\nname: deploy\ndescription: Deploy to prod\n---\nRun the deploy script.",
},
});
console.log(result.files);
// { ".cursor/mcp.json": '{"mcpServers":{"fs":{"command":"npx","args":["-y","@anthropic/mcp-fs"]}}}' }
console.log(result.diagnostics);
// [{ level: "warning", message: "Target agent 'Cursor' does not support skills. 1 item(s) dropped.", field: "skills" }]Two-step conversion
Parse once, emit to multiple targets:
const { plugin } = await parsePlugin("claude-code", { files });
const cursor = await emitPlugin("cursor", plugin);
const codex = await emitPlugin("codex", plugin);
const gemini = await emitPlugin("gemini-cli", plugin);Adapter discovery
import { listAdapters, getAdapter } from "openmarketplace";
listAdapters().forEach(a => {
console.log(a.agent, a.displayName, a.capabilities());
});
const adapter = getAdapter("claude-code");
const { plugin } = await adapter.parse({ files });Marketplace browsing
import { detectProvider } from "openmarketplace";
const provider = detectProvider("anthropics/plugins");
const listing = await provider.fetchListing("anthropics/plugins", { search: "mcp" });
console.log(listing.plugins.map(p => p.name));CLI usage
# Convert a plugin directory
openmarketplace convert ./my-plugin --from claude-code --to gemini-cli --out ./output
# Dry run (show what files would be written)
openmarketplace convert ./my-plugin --from claude-code --to cursor --dry-run
# Browse a marketplace
openmarketplace browse anthropics/plugins
openmarketplace browse anthropics/plugins --search "deploy"
# Install a plugin for specific agents
openmarketplace install my-plugin@owner/repo --agents claude-code,cursor
openmarketplace install my-plugin@owner/repo --agents codex --scope global
# List installed plugins
openmarketplace list
openmarketplace list --agent cursor --format jsonInstall behavior
Plugins are installed directly into each target agent's native config location:
- Project scope (default): files are written/merged into the project directory
- Global scope (
--scope global): files go to~/.<agent>/(e.g.,~/.cursor/,~/.claude/)
When merging into an existing project:
- MCP JSON configs are deep-merged (existing servers are preserved)
- Context files (CLAUDE.md, AGENTS.md, GEMINI.md) are appended with a
---separator - Everything else is written directly
Installation state is tracked at ~/.openmarketplace/installed.json.
Marketplace sources
The CLI accepts various source formats:
| Format | Example | Behavior |
|--------|---------|----------|
| GitHub shorthand | owner/repo | Clones https://github.com/owner/repo |
| Git URL | https://github.com/org/repo.git | Clones directly |
| HTTP URL | https://example.com/manifest.json | Fetches as JSON |
| Local directory | ./path/to/plugin | Reads from disk |
Three marketplace formats are supported:
- Claude: repos containing
marketplace.json - OpenAI: repos with SKILL.md files in
skills/,.system/,.curated/directories - Gemini: repos containing
gemini-extension.json
The correct provider is auto-detected based on source string scoring.
The IR
The Plugin IR is the superset of all agent capabilities:
interface Plugin {
name: string;
version?: string;
description?: string;
author?: { name: string; email?: string; url?: string };
license?: string;
homepage?: string;
repository?: string;
keywords?: string[];
mcpServers?: McpServer[]; // MCP server configs (stdio/http/sse)
skills?: Skill[]; // SKILL.md instruction sets
agents?: Agent[]; // Subagent definitions
hooks?: Hook[]; // Lifecycle hooks (13 event types)
contextFiles?: ContextFile[]; // CLAUDE.md / AGENTS.md / GEMINI.md
commands?: Command[]; // Custom slash commands
lspServers?: LspServer[]; // Language server configs
extensions?: Record<string, unknown>;
}Each field is optional. When converting to a target that doesn't support a field, it's dropped with a warning diagnostic.
Development
git clone https://github.com/alexngai/openmarketplace.git
cd openmarketplace
npm install
npm run build
npm test| Script | Description |
|--------|-------------|
| npm run build | Compile TypeScript |
| npm run typecheck | Type check without emitting |
| npm test | Run 220 tests |
| npm run test:watch | Watch mode |
| npm run test:coverage | Coverage report |
License
MIT
