plugin-tax
Live context-window token-cost leaderboard for Claude Code plugins. Tokenizes everySKILL.md, slash command, sub-agent andCLAUDE.mdeach plugin ships, in real time, withgpt-tokenizer(o200k_base, GPT-4o family). Public, no auth, no mocks.
- Live: https://holyai.me/plugin-tax/
- Port:
4865· BASE_PATH:/plugin-tax· Auth: none - Stack: Node 20 · Express 4 ·
better-sqlite3(WAL) ·node-cron·helmet·compression·gpt-tokenizer
The pain it solves (fresh — May 2026)
The Claude Code plugin marketplace passed 9,000 plugins in 2026.
The single most frequent dev complaint on HN / Reddit / X dev-twitter is
that installing five plugins silently bloats the system prompt and tanks
output quality. There is no public per-plugin token budget anywhere.
plugin-tax answers the question:
"If I install this plugin, how many tokens does it add to my context window — and how does it stack up against everything else?"
It is the missing piece between sibling Holy AI products:
| Product | Covers | Does not cover |
|---|---|---|
| plugin-deck | Discovery / listing | Token cost |
| mcp-tool-budget | Stand-alone MCP servers | Plugins that bundle them |
| context-tax | Repos / source files | Plugin manifests |
| skill-pulse | Skill discovery | Per-plugin aggregation |
What it shows
- Leaderboard — every plugin, sortable / filterable by grade,
- marketplace, category and
install_tax. - Per-plugin card — full token breakdown by skill / command / agent
- / MCP, file-level table, shareable SVG badge.
- Cohorts — four pre-computed lists: lightest, heaviest, diet
- (≤500 tok), obese (>10k tok).
- Compare — pick up to five plugins, see your combined context tax.
- What's new — feed of plugins added or re-tokenized this week.
- JSON Feed + RSS — at
/feed.json//feed.xml. - SVG badge —
GET /plugin-tax/p/<slug>/card.svg.
Letter grade rubric
| Grade | install_tax (tokens) | Verdict |
|---|---|---|
| A | ≤ 500 | Featherweight — install freely |
| B | 501 – 1 500 | Light — fine in most stacks |
| C | 1 501 – 4 000 | Moderate — budget it |
| D | 4 001 – 10 000 | Heavy — only install if used daily |
| F | > 10 000 | Obese — likely degrades output quality |
Real data sources (no mocks, no seeds)
Everything is fetched at runtime, on a node-cron schedule, from public
URLs. If a source fetch fails the affected plugin keeps the previous
numbers and the dashboard surfaces measure_status = "error: …". The
dashboard never invents plugins, tokens or grades.
Marketplaces (re-pulled every 6h)
| Marketplace | Raw URL | Plugins (May 2026) |
|---|---|---|
| Anthropic Official | https://raw.githubusercontent.com/anthropics/claude-plugins-official/main/.claude-plugin/marketplace.json | ~170 |
| cc-marketplace (Anand D. Tyagi) | https://raw.githubusercontent.com/ananddtyagi/cc-marketplace/main/.claude-plugin/marketplace.json | ~120 |
| claude-code-plugins-plus (Jeremy Longshore) | https://raw.githubusercontent.com/jeremylongshore/claude-code-plugins-plus-skills/main/.claude-plugin/marketplace.json | ~430 |
Additional marketplaces can be added via the EXTRA_MARKETPLACES
env var (comma-separated marketplace.json raw URLs).
Per-plugin content (re-pulled every 12h, oldest first)
| Endpoint | Purpose |
|---|---|
| GET /repos/:o/:r/git/trees/:branch?recursive=1 | List every file in the plugin source |
| GET https://raw.githubusercontent.com/:o/:r/:branch/<path> | Fetch each SKILL/command/agent/CLAUDE/mcp file |
| GET /repos/:o/:r | Stars, last push, default branch |
GITHUB_TOKEN is optional but raises the per-hour cap from 60 → 5 000.
MCP server estimation (best-effort)
If a plugin's manifest references an MCP server by npm package, we read
the latest npm registry entry, count tool names in the README, and add~600 tokens / tool to mcp_tokens_est. The estimated portion is shown
distinctly from the measured portion in the UI.
Endpoints (all under BASE_PATH = /plugin-tax)
GET /plugin-tax/ # SPA
GET /plugin-tax/health # { ok: true } — auth-free
GET /plugin-tax/api/stats # totals + freshness
GET /plugin-tax/api/marketplaces # source list + last fetch status
GET /plugin-tax/api/plugins?q=&category=&grade=&marketplace=&sort=&limit=&offset=
GET /plugin-tax/api/plugins/:slug # detail incl. all files
GET /plugin-tax/api/plugins/:slug/files # file-level breakdown only
GET /plugin-tax/api/leaderboard?cohort=lightest|heaviest|diet|obese
GET /plugin-tax/api/compare?slugs=a,b,c # combined tax for up to 5
GET /plugin-tax/api/whats-new?since=... # recently added or re-measured
GET /plugin-tax/api/timeline?days=30 # daily totals
GET /plugin-tax/api/categories # counts per category
GET /plugin-tax/api/events # raw events
GET /plugin-tax/p/:slug/card.svg # shareable SVG badge
GET /plugin-tax/feed.xml # RSS of latest measurements
GET /plugin-tax/feed.json # JSON Feed of latest measurements
POST /plugin-tax/api/refresh # force a re-pull (1/min/IP)
No auth on any endpoint. No admin password, no Basic Auth, noADMIN_PASS env var.
Cron schedule
| Cron | Job |
|---|---|
| 0 /6 | Re-pull every marketplace.json |
| 30 /12 | Re-tokenize the 50 oldest stale plugins |
| 0 3 | Daily snapshot |
| 45 4 | Daily redundancy snapshot |
A bootstrap fetch runs at startup if the database is empty so the
dashboard is never empty on first launch.
Run locally
cp .env.example .env
# (optional) set GITHUB_TOKEN to raise the rate cap
npm install
node server.js
# open http://localhost:4865/plugin-tax/
Files
plugin-tax/
├── SPEC.md
├── README.md
├── CLAUDE.md
├── package.json
├── .env.example
├── server.js
├── db.js
├── scheduler.js
├── routes/
│ ├── api.js
│ ├── badge.js
│ └── feeds.js
├── fetchers/
│ ├── github.js
│ ├── marketplaces.js
│ ├── tokenize.js
│ └── mcp.js
└── public/
├── index.html
├── app.js
└── style.css
License
MIT.