Skills · Plugins · MCP servers · Commands · Hooks · Marketplaces across Claude Code and Codex, in one clean tree — with stale and duplicate items flagged so you can clean house.
You install a skill here, an MCP server there, a plugin you saw on Reddit, three more during a late-night session... and six months later you have no idea what's actually loaded every time Claude Code starts. There's no built-in way to list it, let alone spot what's gone stale.
"There's no easy way to see what your coding agents have actually installed — skills, subagents, commands, plugins, MCP servers, hooks." — r/ClaudeAI (the thread that inspired this tool)
Someone built a macOS-only desktop app to solve this. claude-plugin-inventory does it in one command — on every platform, with zero install and zero dependencies — and it speaks JSON so your scripts and CI can use it too.
The fastest way needs nothing installed — just run it:
npx claude-plugin-inventoryPrefer a permanent short command? Install globally and use the cpi alias:
npm install -g claude-plugin-inventory
cpiWant to hack on it? Clone and run straight from source (no build step):
git clone https://github.com/rikenpatel20/claude-plugin-inventory
cd claude-plugin-inventory
node bin/cli.jsEvery line follows the same simple shape. Here's one decoded:
swift-lsp@claude-plugins-official v1.0.0 · 5mo ago ⚠ stale
└── name ──┘ └── marketplace ────┘ └ ver ┘ └ age ─┘ └ flag ┘
| Part | Means |
|---|---|
| name | The extension's name |
| marketplace | Where it came from (after the @) |
| version | The installed version |
| age | How long since it was last updated |
| ⚠ stale | Older than the threshold (default 90 days) — a cleanup candidate |
| ⧉ dup | Installed more than once (e.g. user and project scope) |
Real things you'd actually use it for.
Show only the stuff gathering dust:
npx claude-plugin-inventory --staleFlag anything untouched for 30 days instead of 90:
npx claude-plugin-inventory --stale --days 30npx claude-plugin-inventory --json \
| jq -r '.roots[].items[] | select(.flags | index("stale")) | .name'swift-lsp@claude-plugins-official
design-cloning
dev-fix
qa
svg-generation
ux-review
Warn when your agent config gets cluttered:
# .github/workflows/agent-hygiene.yml
- run: npx claude-plugin-inventory --json > inventory.json
- run: |
stale=$(jq '.staleCount' inventory.json)
[ "$stale" -lt 5 ] || echo "::warning::$stale stale agent extensions — time to tidy up"npx claude-plugin-inventory --dir /path/to/their/.claudeBy default it reads ~/.claude and ~/.codex:
| Category | Read from |
|---|---|
| 🧩 Plugins | ~/.claude/plugins/installed_plugins.json — version, install date, scope |
| 🛠️ Skills | ~/.claude/skills/*/SKILL.md |
| 🤖 Agents / Commands | ~/.claude/agents, ~/.claude/commands |
| 🪝 Hooks | settings.json → hooks |
| 🔌 MCP servers | settings.json, settings.local.json, Codex config.toml |
| 🏪 Marketplaces | ~/.claude/plugins/marketplaces/* |
🔒 Read-only and offline. It opens those files, counts what's there, and prints. It never edits your config and never sends anything over the network.
| Flag | Description |
|---|---|
--stale |
Show only items older than the threshold |
--days <n> |
Stale threshold in days (default 90) |
--dir <path> |
Scan a custom agent home (repeatable) |
--json |
Machine-readable output for scripts / CI |
--no-color |
Disable colors (also respects the NO_COLOR env var) |
-v, --version |
Print the version |
-h, --help |
Show help |
scan() returns plain data — drop it into your own dashboard or script:
import { scan, ago } from 'claude-plugin-inventory';
const report = scan({ staleDays: 60 });
console.log(report.totals); // { plugins: 11, skills: 5, hooks: 5, ... }
console.log(report.staleCount); // 6
for (const root of report.roots) {
for (const item of root.items) {
if (item.flags.includes('stale')) {
console.log(`${item.name} — last touched ${ago(item.updated)}`);
}
}
}Does it change or delete anything?
No. It is strictly read-only — it opens config files, counts, and prints. Removing extensions is up to you.
What does "stale" actually mean?
Simply: not updated in N days (90 by default, set with
--days). It's a nudge to review, not a verdict — a stale item may still work perfectly.
Does it support Codex too?
Yes. It scans
~/.codex alongside ~/.claude, including MCP servers declared in config.toml.
Why zero dependencies?
Trust and speed. A tool that reads your local config should be small enough to audit in a sitting, and fast enough to run on every shell startup if you want.
PRs and ideas welcome — see CONTRIBUTING.md and the good first issue label. Be kind; we follow a Code of Conduct.
