A curated catalog of high quality primitives for Cline: plugins, skills, and MCP servers. Each entry carries the metadata needed to display it, plus the exact one liner that installs it with the Cline CLI. This repo is the source of truth for entries and the pipeline that publishes them as a single JSON file that any client can fetch.
- Open PR to add a primitive. Each entry is one folder under
registry/<type>/<slug>/entry.json, where<type>isplugins,skills, ormcps. The folder name is the entryid. Co-located assets (likeicon.svg) live next toentry.json. This keeps every entry independently reviewable and avoids merge conflicts when many are added at once. - GitHub Action runs to generate JSON.
scripts/generate.mjsvalidates every entry, renders eachinstall.command, copies icons, rewrites icon URLs to absolute, and writesdist/catalog.json. - Merging PR to main publishes
dist/(the catalog plus icons) to GitHub Pages, generating updated assets athttps://cline.github.io/marketplace/*for various clients displaying our marketplace to use. - The published catalog is one JSON file that can be fetched for the latest live marketplace data:
https://cline.github.io/marketplace/catalog.json
{
"version": 1,
"generatedAt": "2026-06-16T00:00:00.000Z",
"baseUrl": "https://cline.github.io/marketplace",
"counts": { "total": 5, "plugins": 2, "skills": 2, "mcps": 1 },
"tags": [
{ "id": "software", "label": "Software Development", "count": 4 },
{ "id": "research", "label": "Research & Docs", "count": 3 }
],
"entries": [
{
"id": "context7",
"type": "mcp",
"name": "Context7",
"tagline": "Up-to-date code docs for any library, fetched on demand",
"description": "A remote MCP server that pulls version-accurate docs into context.",
"author": { "name": "Upstash", "url": "https://upstash.com" },
"homepage": "https://context7.com",
"repo": "https://github.com/upstash/context7",
"icon": "https://cline.github.io/marketplace/icons/mcp/context7.svg",
"tags": ["software", "research"],
"license": "MIT",
"verified": false,
"featured": true,
"install": {
"args": ["context7", "--transport", "http", "https://mcp.context7.com/mcp"],
"command": "cline mcp install context7 --transport http https://mcp.context7.com/mcp",
"env": [
{ "name": "CONTEXT7_API_KEY", "required": false, "description": "Higher rate limits", "url": "https://context7.com/dashboard" }
]
}
}
]
}Every entry stores the argv that comes after cline <type> install. The verb is derived from type, and the generator renders the full install.command for any client to display.
| Type | Verb | install.args example |
Rendered command |
|---|---|---|---|
plugin |
cline plugin install |
["goal"] |
cline plugin install goal |
skill |
cline skill install |
["cline/sdk-skill"] |
cline skill install cline/sdk-skill |
mcp |
cline mcp install |
["context7", "--transport", "http", "https://mcp.context7.com/mcp"] |
cline mcp install context7 --transport http https://mcp.context7.com/mcp |
Skills resolve sources the same way npx skills add does (cline skill install aliases it): pass owner/repo to install a whole repo, or add --skill <name> to pick one skill from a multi-skill repo.
Secrets and environment variables that are not part of the command (for example EXA_API_KEY) go in install.env so a client can prompt for them.
Icons are published per entry. Every entry's icon field in catalog.json is already the absolute URL, so a client renders entry.icon directly and never has to build a URL. The underlying pattern is:
https://cline.github.io/marketplace/icons/<type>/<slug>.<ext>
<type> is singular (plugin, skill, mcp), <slug> is the entry id, <ext> is whatever the source icon used (usually svg). Some examples:
| Entry | Type | Icon URL |
|---|---|---|
goal |
plugin | https://cline.github.io/marketplace/icons/plugin/goal.svg |
cline-sdk |
skill | https://cline.github.io/marketplace/icons/skill/cline-sdk.svg |
context7 |
mcp | https://cline.github.io/marketplace/icons/mcp/context7.svg |
The baseUrl field at the top of catalog.json always tells a client which host the icons resolve against, so the host is never hardcoded on the consuming side.
A single canonical tag vocabulary lives in tags.json. Every entry's tags array must use only the ids from that file (lowercase), and each entry needs at least one tag. The build fails on an unknown tag, so the vocabulary stays the single source of truth.
{ "id": "data", "label": "Data & Analytics" }The generator publishes the full vocabulary into catalog.json as a top-level tags array, each with a count of how many entries use it, in tags.json order. A filter UI can render this list directly (and grey out or hide count: 0 tags). To add a category, add it to tags.json; order there is the display order.
npm run validate # validate every entry (used in CI on PRs)
npm run generate # also write dist/catalog.json + dist/icons to inspect outputSee CONTRIBUTING.md to add an entry.