BLOG

How to see which Claude Code skills you actually use

4 min read • September 2026
On this page
  1. Option 1: /skill-doctor, built into Claude Code
  2. Option 2: OpenTelemetry
  3. Option 3: read the transcripts yourself
  4. Option 4: a menu bar app
  5. Which one to use
  6. What to do with the numbers

Skills pile up. A few come from plugins, a few you wrote yourself, a few you installed once and forgot. At some point the question stops being "what can my skills do" and becomes "which of them ever fire".

It matters for two reasons. Claude Code loads the name and description of every installed skill at startup, so an unused skill still costs context in every session. And a skill that never fires usually has a fixable problem, which you can only find if you know it never fires.

There are four practical ways to see usage. Each answers a slightly different question.

Option 1: /skill-doctor, built into Claude Code

Recent versions of Claude Code (v2.1.252 and later) include a /skill-doctor command. According to the Claude Code docs, it reports the context cost of each skill and how often it gets used, flags skills that were never invoked, and lists plugins you have not used recently. In an interactive session the report opens in the Stats tab of the /plugin manager. With -p it prints as text.

Best for: a periodic cleanup pass, when you want to decide what to switch off.

Worth knowing: it is a report you run on demand, and it is aimed at deciding what to disable. It does not change anything about the skills themselves.

Option 2: OpenTelemetry

Claude Code can export telemetry through OpenTelemetry. Every skill invocation emits a claude_code.skill_activated event with the skill name, how it was triggered (a slash command from you, Claude's own decision, or a nested call) and where the skill came from (project, user or plugin). Set OTEL_LOG_TOOL_DETAILS=1, otherwise user-defined skills report a placeholder instead of their real name.

Best for: teams. Point every machine at a central collector and you get an organization-wide view of which skills earn their place.

Worth knowing: you need a collector and a dashboard on the other end. For one person on one Mac that is a lot of setup for a simple question.

Option 3: read the transcripts yourself

Claude Code stores every session as a JSONL file under ~/.claude/projects/<project>/. Each skill invocation is a tool_use block named Skill, with the skill name in input.skill, and every line carries a timestamp. That is enough to count:

#!/usr/bin/env python3
"""Count Claude Code skill invocations per skill over the last N days."""
import json, sys
from collections import Counter
from datetime import datetime, timedelta, timezone
from pathlib import Path

days = int(sys.argv[1]) if len(sys.argv) > 1 else 30
since = datetime.now(timezone.utc) - timedelta(days=days)
counts = Counter()

for path in Path.home().glob(".claude/projects/*/*.jsonl"):
    for line in path.open(errors="ignore"):
        if '"name":"Skill"' not in line:
            continue
        try:
            entry = json.loads(line)
            when = datetime.fromisoformat(entry["timestamp"].replace("Z", "+00:00"))
        except (ValueError, KeyError):
            continue
        if when < since:
            continue
        content = entry.get("message", {}).get("content")
        for block in content if isinstance(content, list) else []:
            if block.get("type") == "tool_use" and block.get("name") == "Skill":
                counts[block["input"].get("skill", "?")] += 1

for skill, n in counts.most_common():
    print(f"{n:5d}  {skill}")

Save it as skill_counts.py and run python3 skill_counts.py 30 for the last 30 days. You get one line per skill, most used first.

Best for: people who want the raw numbers and are happy to script.

Worth knowing: the counts only reach back as far as the transcripts still on disk. And skills that a router skill loads by reading their SKILL.md are not separate Skill calls, so a plain count undercounts nested skills.

Option 4: a menu bar app

SkillKeeper is a Mac menu bar app that reads the same local transcripts and keeps the numbers one click away. Usage is shown for the last 24 hours, week, month and all time, and skills that belong to a router are grouped under it, so nested skills are counted too. A skill with no invocations shows a zero, so dead weight stands out.

It reads only the transcripts under ~/.claude/projects/ and the SKILL.md files under ~/.claude/skills/. Skill contents never leave your Mac. The privacy page lists exactly what it reads and writes.

Best for: an always-visible view, and for fixing what you find without leaving the popup. You can edit a skill's description and trigger phrases in place, or archive a skill. Archiving moves the folder aside instead of deleting it, so it is reversible.

Which one to use

You want Use
A one-off cleanup pass /skill-doctor
Usage across a whole team OpenTelemetry
Raw numbers you can script against The transcript script
A live view, plus fixing skills in place SkillKeeper

They are not exclusive. /skill-doctor for a quarterly review and a menu bar view for daily use is a reasonable pairing.

What to do with the numbers

A skill with zero invocations is not automatically a bad skill. More often its description does not match the way you actually phrase requests, so Claude never picks it. Before you delete anything, read why a Claude Code skill never triggers and try rewriting the description first.

If it still never fires after that, archive it. An unused skill costs description text in every session, and you can always bring it back.

See what your Claude Code skills actually do