npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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 openmarketplace

Library 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 json

Install 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