← back to gallery

Plugin Tax

Live token-cost leaderboard for every Claude Code plugin in the marketplace.

dev-toolsclaude-codepluginstokenizercontext-windowleaderboardmcp
Open product ↗

plugin-tax

Live context-window token-cost leaderboard for Claude Code plugins. Tokenizes every SKILL.md, slash command, sub-agent and CLAUDE.md each plugin ships, in real time, with gpt-tokenizer (o200k_base, GPT-4o family). Public, no auth, no mocks.

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

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, no
ADMIN_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.