A mod is a plugin, so it's distributed and installed the same way as any plugin. To distribute, put .claude-plugin/marketplace.json in the repo and push. To install, add the marketplace with /plugin marketplace add owner/repo, then install with /plugin install name@marketplace-name. In the desktop app you can also install from + next to the prompt → Plugins → Add plugin (official install page).
Terms
| Term | Meaning |
|---|---|
| Plugin | A single folder holding mods, skills, commands, MCP servers and so on. A mod is one kind |
| Marketplace | A JSON file (marketplace.json) listing plugins and where to fetch each one. Usually kept in a GitHub repo |
| Plugin id |
name@marketplace-name. Used to install, remove and configure |
Distributing: add marketplace.json
The simplest setup is to make the mod's own repo the marketplace. Put marketplace.json next to plugin.json.
hello-band/
├── .claude-plugin/
│ ├── plugin.json
│ └── marketplace.json
└── hooks/
├── hooks.json
└── register.tsx
{
"name": "hello-tools",
"owner": { "name": "Your Name" },
"description": "A mod that shows one line above the prompt",
"plugins": [
{ "name": "hello-band", "source": "./" }
]
}
-
name,ownerandpluginsare required.ownerrequiresname - Each entry in
pluginsrequiresnameandsource -
source: "./"points to the repo root (one level above.claude-plugin/) - Match the entry's
nameto thenameinplugin.json(the official docs say to) - The marketplace name uses letters, digits,
.,_and-, and starts with a letter or digit. Official names likeclaude-plugins-official, names that look official, and names containing non-ASCII letters are rejected
Validate before pushing.
claude plugin validate .
It's public the moment the files are pushed. There's no application process. If the repo is private, it becomes a private marketplace that only people who can clone it can install from.
Listing several mods in one repo
As your mods grow, you can create one repo for the marketplace and line them up under plugins/.
{
"name": "hello-tools",
"owner": { "name": "Your Name" },
"plugins": [
{ "name": "hello-band", "source": "./plugins/hello-band" },
{ "name": "hello-pane", "source": "./plugins/hello-pane" }
]
}
To list a mod that lives in another repo, make source an object.
{
"name": "hello-band",
"source": {
"source": "github",
"repo": "your-name/hello-band",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}
Pinning a version
A github source can have ref (a branch or tag) and sha (a 40-character lowercase commit). With sha, only that commit's contents are distributed. Even if the author changes things later, users won't get them until the marketplace's sha is updated.
When you list someone else's mod in your marketplace, pinning to the sha of the commit you read is the safe choice (part 10).
Bumping the version
If you put a version in plugin.json, bump it every time you change something. If you push without bumping, users' claude plugin update says "already up to date" and they keep the old copy. For git marketplaces you can also omit version, in which case the commit SHA becomes the version.
Installing: with commands
Type these inside a Claude Code session.
/plugin marketplace add your-name/hello-band
/plugin install hello-band@hello-tools
your-name/hello-band on the first line is the GitHub owner/repo. What follows @ on the second line is the name in marketplace.json, not the repo name. Mixing these up and getting "not found" is very common.
- Add
#likeowner/repo#v1.2.0to pin to a branch or tag - For non-GitHub hosts use an
https://...gitURL; for a local folder use a path starting with./ - Both in one step:
/plugin install hello-band --marketplace your-name/hello-band(Claude Code 2.1.275 and later)
/plugin install inside a session doesn't install immediately; it opens a details screen. There you review the contents (commands, hooks, MCP servers and so on) and pick a scope.
| Scope | Applies to | Settings file written |
|---|---|---|
| User | All your projects | ~/.claude/settings.json |
| Project | Everyone working in this repo |
.claude/settings.json (committed) |
| Local | Only you, only this repo | .claude/settings.local.json |
You can do the same from a shell.
claude plugin marketplace add your-name/hello-band
claude plugin install hello-band@hello-tools
When installed from a shell, type /reload-plugins in an open session to load it.
Installing: from the desktop app UI
The official install page describes these steps for the desktop app's Code tab (local or SSH sessions):
- Press + next to the prompt and choose Plugins → Add plugin
- A list of marketplace plugins opens; pick the one to install
- Choose the scope (user, project or local)
To disable or remove later, use + → Plugins → Manage plugins. This screen isn't available in cloud sessions.
However, the steps to add a marketplace itself from the desktop app UI aren't on the official page, so that is not verified. The list above shows only plugins from marketplaces you've already added. The terminal, local desktop sessions and VS Code read the same settings files, so if you run claude plugin marketplace add in a shell, it should show up in the desktop list as well. Whether typing /plugin marketplace add in the Code tab prompt works the same way on desktop is also not verified.
After installing, open a new session in the desktop app and check whether the band or pane appears.
Updating
- By the user:
claude plugin update hello-band@hello-tools, or Update now in the Installed tab of/plugin - Auto-update: off by default for marketplaces you added yourself. You can turn it on per marketplace in the Marketplaces tab of
/plugin
With auto-update on, whatever the author pushes keeps coming in. Mods are code that runs without a sandbox, so for marketplaces from unfamiliar authors it's safer to leave it off and read before updating (part 10).
Don't rename
Don't change the name of a published mod. Users' installs are recorded as name@marketplace-name, so renaming makes the mod disappear for people who installed it. If you really must rename, map the old name to the new one with renames in marketplace.json. If you only want to change the display name, use displayName.
Distributing to Windows users
A source that uses command (a folder produced by a local command) with mode: "link" can't be installed on Windows (official marketplace reference). If you have Windows users, use copy. With ordinary github or ./ sources you don't need to worry about this.
Finding mods you can install
Among public mods on GitHub, fewer than you'd expect are listed in their repo's own marketplace.json and installable with the steps in this article. In the modscode review, 269 of 1,383 didn't meet this condition (as of 2026-10-06).
All 49 mods in the modscode reviewed gallery can be installed from their repo's marketplace.json, and each page shows the install commands. If you want to search reviewed mods inside a conversation with Claude, or have Claude read a mod's UI structure and review results, you can also connect the modscode MCP connector to Claude (read-only, no login).
This article was written with AI assistance (Claude) and checked against the official Claude Code docs; anything marked "not verified" could not be confirmed there.
Top comments (0)