Help us improve
Share bugs, ideas, or general feedback.
From skillcheck-free
Validates SKILL.md files against Anthropic guidelines and the agentskills specification with structural, semantic, and security checks.
npx claudepluginhub olgasafonova/skillcheck-freeHow this skill is triggered — by the user, by Claude, or both
Slash command
/skillcheck-free:skill-checkThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Check skills against Anthropic guidelines and the agentskills specification. This file contains Free tier validation rules.
Evaluates SKILL.md design quality against official specs and best practices. Provides multi-dimensional scoring, knowledge categorization, and actionable improvement suggestions.
Audits Claude Code skills for structure compliance, triggering accuracy, instruction quality, and best practices. Scores 0-100 with prioritized improvement recommendations.
Creates, fixes, analyzes, and validates skills for AI agents. Includes scripts for structure checks, quality analysis, and character budget management.
Share bugs, ideas, or general feedback.
Check skills against Anthropic guidelines and the agentskills specification. This file contains Free tier validation rules.
Want deeper analysis? Upgrade to Pro for anti-slop detection, security scanning, token optimization, WCAG compliance, enterprise checks, and Eval Kit (auto-generated test prompts for your skills).
Apply these checks in order. Each subsection defines patterns to match and issues to flag.
Every SKILL.md must start with YAML frontmatter between --- markers.
| Field | Required | Rules |
|---|---|---|
name | Yes | Lowercase, hyphens only, 1-64 chars, no reserved words |
description | Yes | WHAT + WHEN pattern, 1-1024 chars |
Check 1.9-xml-in-frontmatter (Critical): Frontmatter values must not contain XML angle brackets (< or >). Frontmatter appears in Claude's system prompt; angle brackets could enable prompt injection.
Detection: Scan all frontmatter string values (name, description, compatibility, etc.) for < or > characters.
Fix: Remove angle brackets from frontmatter. Use plain text descriptions. Markdown formatting and XML tags are fine in the SKILL.md body.
Fields defined in the agentskills.io specification:
| Field | Purpose |
|---|---|
license | License name or reference to bundled license file |
allowed-tools | Tools the skill can use (space-separated or YAML list) |
compatibility | Platform compatibility info (max 500 chars) |
metadata | Additional key-value pairs |
Recognized by Claude Code but not part of the agentskills.io spec. Other agents may ignore these fields.
| Field | Purpose |
|---|---|
category | Skill domain(s) for discovery and filtering |
model | Override model (full ID like claude-opus-4-6 or alias: opus, sonnet, haiku) |
effort | Reasoning effort level: low, medium, or high |
maxTurns | Maximum agent turns (positive integer; warns above 100) |
disallowedTools | Tools the skill must not use (space-separated or YAML list) |
context | Run context ("fork" for sub-agent) |
agent | Agent type when context: fork |
hooks | Lifecycle hooks (PreToolUse, PostToolUse, Stop) |
user-invocable | Show in slash menu (default: true) |
disable-model-invocation | Manual-only skill |
produces | Artifact types this skill outputs (comma-separated) |
consumes | Artifact types this skill reads from other skills (comma-separated) |
Not part of any spec. Used by community tools and registries.
| Field | Purpose |
|---|---|
type | Skill type indicator |
author | Skill author |
date | Creation/update date |
argument-hint | Hints for skill arguments |
Note:
categoryis a Claude Code extension, not part of the agentskills.io spec. Do not flag a missing category field. Only validate format if present.
Format: String or array of strings, lowercase letters, numbers, and hyphens only.
Pattern: ^[a-z][a-z0-9-]*[a-z0-9]$ (same rules as skill name)
Common categories: development, productivity, data, automation, writing, design, security, devops, api, testing, documentation, legal, financial, marketing, ai-ml
Note:
producesandconsumesare Claude Code extensions for inter-skill artifact passing. Do not flag missing fields. Only validate format if present.
Format: Comma-separated list of artifact type names. Each type must be lowercase with hyphens only.
Known artifact types: content-brief, knowledge-note, reading-log-entry, sift-article
Check 1.10-artifact-types (Warning): If produces or consumes contains a type not in the known list above, flag as a warning (not an error). New types are valid but should be registered in rules/artifact-passing.md.
Check 1.11-consumes-without-tools (Warning): If a skill declares consumes: but its allowed-tools does not include Read or Glob, flag as a warning. Consuming artifacts requires reading files.
Pattern: ^[a-z][a-z0-9-]*[a-z0-9]$
Naming suggestions: Avoid generic terms that don't describe what the skill does: helper, utils, tools, misc, stuff, things, manager, handler. Product-specific terms (claude, anthropic, mcp) are allowed but may limit portability across agents.
Must contain:
Recommended structure: [What it does] + [When to use it] + [Key capabilities]
Action verbs: Create, Generate, Build, Convert, Extract, Analyze, Transform, Process, Validate, Format, Export, Import, Parse, Search, Find
WHEN triggers: "Use when", "Use for", "Use this when", "Invoke when", "Activate when", "Triggers on", "Auto-activates", "Run when", "Applies to", "Helps with"
description: Generate weekly reports from Azure DevOps data. Use when user says "weekly update" or asks for stakeholder summaries. description: Helps with code review workflows for Pull Requests. description: A tool for reports. reason: no WHAT verb, no WHEN triggerBoth space-separated and YAML list formats are valid:
allowed-tools: Read Glob Bash allowed-tools: - Read - Glob - Bash allowed-tools: Read, Glob, Bash reason: comma separation is deprecated; use spaces or YAML listSkills can include optional subdirectories per the agentskills spec:
| Directory | Purpose | Validation |
|---|---|---|
references/ | Additional docs (REFERENCE.md, etc.) | Files should be .md format |
scripts/ | Executable code (Python, Bash, JS) | Should have execute permissions |
assets/ | Static resources (templates, data) | No validation required |
Check 1.10-readme-in-folder (Warning): Skill folder must not contain a README.md file. All documentation goes in SKILL.md or references/. For GitHub distribution, place the README at the repo root, outside the skill folder.
Detection: Use Glob to check if {skill-dir}/README.md exists.
Skill path formats supported:
~/.claude/skills/{skill-name}/SKILL.md~/.claude/skills/{namespace}/{skill-name}/SKILL.mdNamespace support: Namespaces allow organizing skills by source (personal, team, project):
~/.claude/skills/internal/weekly-reports/SKILL.md~/.claude/skills/shared/code-review/SKILL.mdDirectory name must match skill name: The parent directory name must exactly match the name field in frontmatter.
Names should be descriptive compounds, not single words.
name: generator reason: too generic, what does it generate? name: pdf-report-generatorLength Guidelines: Minimum 3 chars, optimal 10-30 chars, maximum 64 chars.
Check 2.8-antipattern-format (Suggestion): When a skill documents anti-patterns (sections with headers matching "anti-pattern", "what not to do", "avoid", "common mistakes", "bad practices", "pitfalls"), the content should use structured formats (tables or bullet lists) rather than wall-of-text prose.
Fires when:
Does NOT fire when:
| col | col |) or bullet lists (- item)| Don't | Do Instead |
|---|---|
| Use globals | Pass parameters |
| Skip tests | Write unit tests |
You should avoid using global variables because they create hidden dependencies and you should never skip error handling because it leads to silent failures in production and makes debugging very difficult.
reason: Wall-of-text prose; restructure as table or bullet list
Validate logical consistency and clarity of skill instructions.
Flag conflicting instructions that simultaneously require and forbid the same action.
Flag vague language that should be more specific. Terms like "multiple items" or "correct settings" lack precision. Use exact counts or specific criteria instead.
Exceptions (not flagged):
Skills that mention output should specify format with concrete examples.
Detection:
## Output sectionReturns JSON:
{
"status": "success",
"items": ["a", "b", "c"]
}
## Output
Returns the processed data.
reason: No concrete format example
Check 4.6-wisdom-platitude (Suggestion): Detects generic advice ("wisdom") that lacks actionable content. Skills should contain concrete instructions, not motivational prose.
Three detection layers:
"Ensure quality", "maintain standards", "strive for best practices"Exceptions (not flagged):
reason: Generic advice; replace with specific, actionable directives
Run golangci-lint before committing. Write at least one test per exported function. Set timeout to 30 seconds for HTTP requests.Check 4.8-description-trigger-style (Suggestion): The description field should read as a trigger condition, not a capability summary. Claude scans descriptions to decide "is there a skill for this request?" A trigger-oriented description activates correctly; a summary-oriented one gets overlooked.
Detection: Description opens with summary patterns instead of trigger patterns:
Does NOT fire when:
Severity: Suggestion
description: Generate weekly reports from Azure DevOps data. Use when user says "weekly update" or asks for stakeholder summaries. description: This skill generates weekly reports from Azure DevOps data and provides stakeholder summaries. reason: Reads as capability summary, not trigger condition. Claude won't route to this reliably.Fix: Rewrite to lead with action verb and include "Use when" clause. The description is a routing instruction, not documentation.
Check 4.9-railroading (Suggestion): Skills should give Claude information and context, not dictate exact sequences. Excessive prescriptive language reduces Claude's ability to adapt to the user's actual situation.
Detection: Count prescriptive phrases outside example blocks, code blocks, and anti-pattern sections:
Fires when: 5+ prescriptive phrases in non-example content.
Does NOT fire when:
Severity: Suggestion
## ConfigurationThe config file lives at ~/.config/myskill/config.json. If missing, Claude asks the user for the required values.
Common options:
output_dir: where reports land (default: current directory)format: json or markdown (default: markdown)
You must always check the config file at ~/.config/myskill/config.json. You must never deviate from this path. Always do exactly as follows: first read the config, then validate every field. You must always use JSON format. Never change the output directory.
reason: 5 prescriptive phrases; give Claude the information and let it adapt
Check 4.4: Body contains trigger conditions that belong in the description field.
Detection: Body contains a heading matching ## When to Use or ## When to Use This Skill, or body text contains routing phrases like "Activate when user", "Trigger this skill when", "Use this skill when".
Problem: The skill body loads only AFTER the Skill tool is invoked. Trigger conditions placed here don't influence routing decisions. Claude reads the description field during routing; that's where "Use when" patterns, trigger keywords, and example phrases belong.
Severity: Warning
Fix: Merge unique trigger content from the body section into the description field, then remove the redundant body section.
Activate when user says "weekly report" or "generate summary".
reason: Trigger phrases are invisible during routing; they only load after invocation
--- description: Generate reports from data. Use when user says "weekly report" or "generate summary". ---Recognize positive patterns in skills. These are reported as "strengths" rather than issues.
Skills with ## Example, ## Usage, or <example> tags demonstrate expected behavior clearly.
Strength: "Skill includes example section"
Skills documenting limitations, error cases, or edge cases set correct expectations.
Patterns detected: ## Error, ## Limitation, does not support, will fail if
Strength: "Skill documents error handling or limitations"
Description includes activation triggers (Use when, Triggers on, Applies to, etc.)
Strength: "Description includes activation triggers"
Skills specifying output format with concrete examples (code blocks, JSON, tables).
Strength: "Skill specifies output format with examples"
Skills using numbered steps or clear workflow sections.
Strength: "Skill uses structured instructions"
Skills documenting setup requirements or dependencies.
Strength: "Skill documents prerequisites"
Description includes scope boundaries that prevent over-triggering.
Patterns detected: "Do NOT use for", "Not for", "Don't use when", "not intended for", "Do not use for"
Strength: "Description includes negative triggers to prevent over-triggering"
Skill documents common failure points, edge cases, or footguns. Per Anthropic's internal skill design guidance, gotchas sections are "the highest-signal content in any skill."
Patterns detected: Section headers matching "Gotchas", "Pitfalls", "Common Mistakes", "Watch Out", "Known Issues", "Caveats", "Footguns", "Common Errors"
Strength: "Skill documents gotchas or common failure points"
When the user provides a .claude-plugin/plugin.json file (Claude Code plugin manifest) instead of a SKILL.md, validate the manifest against Anthropic's reference schema.
When to apply: the input file path ends in .claude-plugin/plugin.json, or the user explicitly asks to "check this plugin" or "validate plugin manifest".
Reference schema (Anthropic): four required top-level fields. Any rule that rejects Anthropic's own reference plugins is mis-calibrated.
{
"name": "product-management",
"version": "1.2.0",
"description": "Write feature specs, plan roadmaps...",
"author": { "name": "Anthropic" }
}
Rule: name is required and must be kebab-case: lowercase letters, digits, and hyphens; must start with a letter; no leading/trailing hyphens; no double hyphens.
Detection regex: ^[a-z][a-z0-9]*(-[a-z0-9]+)*$
Severity: Critical. Fix: rename to lowercase-with-hyphens, e.g. product-management.
Rule: version is required and must be canonical semver (MAJOR.MINOR.PATCH, optional pre-release or build metadata). No v prefix.
Severity: Critical. Fix: use 1.0.0, not v1.0 or 1.0.
Rule: description is required and must be non-empty.
Severity: Critical. Fix: add a one-paragraph summary of what the plugin does.
Rule: author.name is required and must be non-empty.
Severity: Critical. Fix: add "author": { "name": "Your Name" }.
Rule: files in commands/<name>.md must not collide with bundled Claude Code slash commands.
Reserved names: simplify, batch, debug, loop, claude-api, security-review.
Severity: Critical. Fix: rename the colliding command file.
.claude-plugin/ directory layoutRule: .claude-plugin/ must contain only plugin.json. Skills, commands, hooks, and agents live at the plugin root, not nested under .claude-plugin/.
Severity: Warning. Fix: move misplaced subdirectories to the plugin root.
These ship in SkillCheck Pro Cat 24.
When the user provides an MCP server's tools/list response (a JSON file with the standard MCP shape {"tools": [{"name": ..., "description": ...}, ...]}), surface two Cat 23 (Agent Integration Readiness) signals.
When to apply: the input file looks like an MCP tools/list response, OR the user asks to "check this MCP server's tools" or "is this server too big".
Rule: servers exposing more than 20 tools should consider intent grouping or code-orchestration.
Severity: Warning. Fix: group related operations into intent-shaped tools, or expose a search_tools + execute pair (Cloudflare reference: 2 tools total).
Rule: servers exposing more than 40 tools are strong candidates for the search+execute pattern.
Severity: Warning. Fix: replace the tool surface with a 2-tool search+execute architecture.
Rule: when a single noun appears with 3 or more CRUD verb prefixes (list_, get_, create_, update_, delete_, add_, remove_, set_, fetch_, patch_), the tool surface looks like a 1:1 OpenAPI mirror rather than intent-shaped tools.
Detection: for each tool name matching ^[a-z]+_(.+)$ where the prefix is in the API verb list, group by the noun. Flag any noun with 3+ distinct verb prefixes.
Severity: Warning. Fix: rename tools toward intent (e.g. find_user or manage_user_roles) instead of mirroring REST verbs.
These ship in SkillCheck Pro Cat 23 (Agent Integration Readiness, four pillars from Sam Morrow's framework populated with detection heuristics from Anthropic's six MCP production patterns).
Available with SkillCheck Pro:
| Check | What it catches |
|---|---|
| Anti-Slop | Em-dash abuse, hedge stacking, sycophantic openers, filler phrases, cliche intros, essay closers |
| Token Budget | Frontmatter >400 tokens, body >5K optimal / >8K max, total >15K |
| Security | Hardcoded secrets, command injection, PII in examples, unsafe paths |
| Workflow | Missing numbered steps in complex skills (2K+ tokens) |
| Enterprise | Hardcoded user paths, missing env var config, permission gaps |
| WCAG | Color contrast <4.5:1, color-only indicators, AI slop aesthetics |
| Error | Fix |
|---|---|
| "No YAML frontmatter" | Add --- markers at file start |
| "Missing required field: name" | Add name: your-skill-name |
| "Invalid name format" | Use lowercase letters, numbers, hyphens only |
| "Description missing WHEN trigger" | Add "Use when..." clause |
| "Unknown tool in allowed-tools" | Check spelling, use space separation |
If validation stalls on large files (1000+ lines), break the skill into smaller modules or check frontmatter syntax first.
| Level | Meaning | Action |
|---|---|---|
| Critical | Skill may not function | Must fix |
| Warning | Best practice violation | Should fix |
| Suggestion | Could be improved | Nice to have |
| ID | Category | Tier |
|---|---|---|
| 1.0-dir-, 1.1-name-, 1.2-desc-* | Structure | Free |
| 1.3-tools-, 1.4-category- | Structure | Free |
| 1.9-xml-in-frontmatter, 1.10-readme | Structure | Free |
| 2.-body-, 2.8-antipattern-format | Body | Free |
| 3.-name- | Naming | Free |
| 4.-, 4.6-wisdom, 4.8-trigger-style, 4.9-railroading | Semantic | Free |
| 5.-slop-, 5.4-pii-* | Anti-Slop / Security | Pro |
| 6.-wcag- | WCAG | Pro |
| 7.-security- | Security | Pro |
| 9.-token-, 10.-enterprise- | Tokens / Enterprise | Pro |
| 12.-workflow- | Workflow | Pro |
| 13-18.-readiness- | Agent Readiness | Pro |
| 19.1-pattern-detected | Design Pattern Classification | Free |
| 19.2-19.7 pattern-* | Design Pattern Deep Checks | Pro |
| 20.-collision- | Trigger Collision Detection | Pro |
SkillCheck classifies each skill into one of five design patterns from the Google ADK taxonomy:
Check 19.1-pattern-detected (Strength): Pattern identified. Reports primary pattern and any secondary patterns. Most skills are hybrids.
Pro checks 19.2-19.7: Validate pattern-specific requirements. A Reviewer without criteria, a Generator without output format, an Inversion without question framework, a Pipeline without stages, or a Tool Wrapper without API boundaries.
Stop condition: Stop after reporting all issues for the target SKILL.md. Do not iterate or re-check unless the user requests it.
Budget: Maximum attempts: 1. Single SKILL.md validation completes in one pass with maximum retries: 0. No looping.
Idempotency: Safe to re-run. Same input produces the same severity counts and issue list.
Input/Output contract:
Output structure:
# SkillCheck Report: {skill-name}
## Summary (score, issue/strength counts)
## Issues (check_id, severity, line, message, fix per issue)
## Strengths (check_id, detail per strength)
Mode: Runs identically standalone or in composition with other skills. Self-contained, read-only, no side effects.
Confidence level: High confidence on structural and pattern-based checks. Semantic checks (contradiction detection, wisdom/platitude) are heuristic; ~5% false positive rate.
Progress: Step 1 of 4: Parse. Step 2 of 4: Validate. Step 3 of 4: Score. Step 4 of 4: Report.
Phase 1: Parse — Read file, extract frontmatter. Phase 2: Validate — Run all Free tier checks. Phase 3: Score — Calculate overall score. Phase 4: Report — Format and return results.
|) syntax.<example> tags to avoid false positives.Get the complete suite at getskillcheck.com: Go binary for CI/CD, MCP server for IDE integration, all Pro checks, auto-fix, and badge generation.
Skills can also be distributed via the /v1/skills API endpoint. See agentskills.io for the specification.