claude-desktop-plugins
Skill5 starsChanged yesterdayMITView on GitHub
Create, validate, and publish Claude plugins for Claude Desktop (Chat, Cowork, Code tab) and Claude Code: .claude-plugin/plugin.json, skills, commands, agents, hooks, MCP and LSP servers, userConfig, marketplaces and the Anthropic directory. Use when the user asks how to build a Claude Desktop plugin, what its requirements are, why a plugin will not install, or how to share it. Not for mods (JS modules) or .mcpb extensions.
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 80
Never commit tokens or keys.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Claude Desktop plugins
A plugin is a folder of components (skills, commands, agents, hooks, MCP/LSP servers...) with an optional manifest. One plugin works across surfaces, but each surface loads only the components it supports. Pick components with the support matrix in references/platform-support.md first, or the plugin installs and does nothing.
Sources: https://code.claude.com/docs/en/plugins-reference, https://claude.com/docs/plugins/platform-support, https://code.claude.com/docs/en/plugins/publish. They change; fetch when unsure (https://code.claude.com/docs/llms.txt).
Requirements (the short list)
- A folder with either
.claude-plugin/plugin.jsonor the standard layout (auto-discovered). The manifest is optional; if present,nameis the only required key. name: kebab-case, permanent (a rename is a different plugin). It must not start withclaude-,anthropic-,anthropics-orcc-plugin-, must not be exactlyclaude,anthropic,anthropics,claude-code, orclaude-mods, and must not combineofficialwithclaude/anthropic. UsedisplayNamefor the label users see.- Only
plugin.jsongoes inside.claude-plugin/. Everything else sits at the plugin root. - Component paths in the manifest start with
./, resolve inside the plugin root, and exist...is an error. Inside hooks and MCP configs use${CLAUDE_PLUGIN_ROOT}/.... - Passes
claude plugin validate ./plugin --strict. - To list in a directory:
description,author,homepage(a parseable URL),repository, a README, and a privacy policy if it connects to external services. - Limits for the directory/Upload path: 5,000 files and 200 MB per plugin (200 MB also caps the largest file for Upload plugin).
Layout
my-plugin/
.claude-plugin/plugin.json # only this file lives here
skills/<name>/SKILL.md # directories
commands/*.md # slash commands (load as skills in Chat)
agents/*.md
hooks/hooks.json # {"hooks": {...}} (and "modules" for mods)
.mcp.json # MCP servers
.lsp.json # language servers (Claude Code only)
output-styles/ themes/ monitors/monitors.json workflows/
bin/ # executables added to PATH (Claude Code only)
settings.jsonManifest keys that replace the default folder: commands, agents, outputStyles, workflows, experimental.themes, experimental.monitors (validate warns "Default folder is ignored"). skills adds to skills/. hooks, mcpServers, lspServers merge. Full field table, naming rules, userConfig, lspServers, monitors: references/manifest.md.
Workflow
- Decide the surfaces (Chat, Cowork, Claude Code) and choose only components that load there. Say so to the user in one table.
- Scaffold (
claude plugin initif available; else hand-create). Pick the permanent name carefully. - Write components. Skills:
SKILL.mdwithname+description(what + when). Commands: short.md. Hooks: wrap in a top-level"hooks"key. UseuserConfigfor settings and keys (sensitive: true); never hardcode secrets. - Validate:
claude plugin validate --strict ./my-plugin. It exits 1 on warnings (drop--strictif you intentionally omitversion). MCP checks need Claude Code >= 2.1.281. - Try it:
claude --plugin-dir ./my-plugin; after edits,/reload-plugins. For Desktop: Add -> Upload plugin (a zip), or load the folder in the Code tab. - Test a real install through a local marketplace:
claude plugin marketplace add ./path,claude plugin install my-plugin@my-marketplace, new session. - Publish via the route that fits (references/publishing.md): share the folder/zip, your own marketplace (
.claude-plugin/marketplace.json), or the Anthropic directory. - Version deliberately: bump
versionevery release, or omit it in a git-hosted marketplace so the commit SHA is the version. Ifversionis set and unchanged,claude plugin updatesays "already at the latest version".
Safety
- Hooks,
bin/executables, and local MCP/LSP servers run code with the user's permissions. Ship only what the plugin needs and say what each one does in the README. - Never commit tokens or keys; collect them with
userConfig+sensitive: true. - A plugin that sends user data to an external service needs a privacy policy URL (
privacyPolicyUrl). - Tell users to
claude plugin validateand read a third-party plugin before installing it.
Verification checklist
nameis kebab-case, permanent, and not a reserved/prefixed nameclaude plugin validate --strict ./pluginpasses (no warnings)- Every manifest path starts with
./, exists, and stays inside the plugin - Hooks/MCP use
${CLAUDE_PLUGIN_ROOT}; no absolute or machine-specific paths - No secrets in files; sensitive
userConfigusessensitive: true - Components match the target surface (matrix checked); no
bin/if Chat or Cowork must install it - Loads with
claude --plugin-dirand from a local marketplace install - Metadata + README +
homepageURL parse (if going to a directory) - Under 5,000 files / 200 MB; no
node_modules,.git, or build junk shipped by accident
Anti-patterns
- Putting
skills/,hooks/etc. inside.claude-plugin/. - Naming the plugin
claude-something, or renaming after release. - Using
${user_config.*}where it is not supported (shell-form hooks, monitors,headersHelper); use exec-form hook args or theCLAUDE_PLUGIN_OPTION_<KEY>env var. - Shipping
bin/and expecting Chat/Cowork to install it: those surfaces refuse the whole plugin. - Relying on hooks, agents or local MCP in Chat. They are ignored there.
- Setting
versionand forgetting to bump it, then wondering why users get no update. - Assuming marketplace auto-update: it is off by default for third-party marketplaces.
- Guessing field names. Unknown top-level keys are stripped with a warning; unknown keys in
userConfig,channels,lspServers,monitorsentries are errors.
Pointers
| Need | Read |
| What works where | references/platform-support.md |
| plugin.json fields, naming, userConfig, LSP, monitors | references/manifest.md |
| Routes, marketplace.json, directory submission, update flow | references/publishing.md |
| JS modules inside Claude Code | claude-desktop-mods |
Local MCP server packaged as .mcpb | claude-desktop-extensions |
In this repository30 other files it gives its agents.
- docs/agents.mdAGENTS.md
- website/AGENTS.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- .cursor/rules/claude-desktop-skills.mdcCursor rule
- .cursor/rules/claude-mod.mdcCursor rule
- .cursor/rules/codex-desktop-skills.mdcCursor rule
- .cursor/rules/desktop-and-publishing-skills.mdcCursor rule
- .cursor/rules/release.mdcCursor rule
- claude-code-mods-guideSkill
- claude-desktop-extensionsSkill
- claude-desktop-modsSkill
- codex-desktop-extensionsSkill
- codex-desktop-pluginsSkill
- codex-desktop-skillsSkill
- copilot-desktop-extensionsSkill
- cursor-extensions-and-pluginsSkill
- opencode-pluginsSkill
- publishing-mental-to-storesSkill
- claude-code-mods-guideSkill
- claude-desktop-extensionsSkill
- claude-desktop-modsSkill
- claude-desktop-pluginsSkill
- codex-desktop-extensionsSkill
- codex-desktop-pluginsSkill
- codex-desktop-skillsSkill
- copilot-desktop-extensionsSkill
- cursor-extensions-and-pluginsSkill
- opencode-pluginsSkill
- publishing-mental-to-storesSkill
- mental-setupSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

