The package manager for agent skills. Search, install, lint SKILL.md files. Zero-config CLI.
Project description
skillctl
The package manager for agent skills.
Search, install, and manage SKILL.md files.
Stateless, zero-config, and token-efficient.
- Zero tokens when idle — stateless CLI, no server process, no protocol overhead
- One command to install —
git clone→ symlink → registered, done in seconds - Agent-native — every command supports
--jsonwithnext_actionsguidance - Works today — Claude Code, Codex, and any agent that reads markdown
Quickstart (2 min)
1. Install
pip install skillctl
2. Find a skill
$ skillctl search "pdf"
● pdf registry Create, edit, and extract content from PDFs ★ 0
○ pdf-to-markdown github Convert PDF files to clean markdown ★ 89
○ pdf-ocr github OCR extraction from scanned PDFs ★ 67
3. Install it
$ skillctl install anthropics/skills --path skills/pdf
✓ Cloned anthropics/skills → ~/.skillctl/repos/anthropics__skills
✓ Linked → ~/.claude/skills/pdf
✓ Registered in manifest
Your agent picks it up immediately — no restart, no config change.
The problem
Every AI agent runtime uses skills — markdown files that define what an agent can do. But skills live scattered across GitHub repos, local folders, and team drives. Developers copy-paste skill files manually and hope they work.
There's no npm install for skills.
The solution
skillctl is a package manager purpose-built for agent skills.
skillctl search "excel" → finds xlsx skill (via LLM-enriched keywords)
skillctl install ... → git clone → symlink → registered
~/.claude/skills/xlsx/ → agent picks it up automatically
Using with coding agents
skillctl installs skills as symlinks into directories your agent already reads. No plugin, no integration, no restart.
Claude Code
skillctl config set skills_dir ~/.claude/skills # default — already set
skillctl install anthropics/skills --path skills/pdf
# Claude Code picks it up on the next message — the /pdf skill appears automatically
OpenAI Codex
skillctl config set skills_dir ~/.codex/skills
skillctl install anthropics/skills --path skills/pdf
# Codex reads the skills directory on session start
Any agent with bash access can use skillctl directly — the CLI follows the same search → install → use pattern agents know from pip, npm, and gh:
# An agent can do this autonomously:
skillctl search "data analysis" --json --fields=slug,installed
skillctl install anthropics/skills --path skills/xlsx -y --json
cat ~/.claude/skills/xlsx/SKILL.md # agent reads and follows the instructions
[!NOTE] skillctl is designed agent-first. Every command supports
--jsonwith guidednext_actions,--quietfor piping,--yesto skip prompts, andskillctl schemafor runtime self-discovery. Agents don't need documentation — they can introspect the CLI.
Why CLI, not MCP
Most agent tooling burns tokens while idle. skillctl costs zero.
| CLI (skillctl) | MCP Server | |
|---|---|---|
| Tokens when idle | 0 | Constant |
| Setup | pip install |
Config, auth, daemon |
| Agent compatibility | Every LLM knows CLI | Protocol-specific |
| Statefulness | Stateless | Stateful process |
Commands
Find & install
skillctl search "pdf" # Search registries + local
skillctl search "pdf" --source=github # Broad GitHub search
skillctl install user/repo # Full repo as a skill
skillctl install user/repo --path skills/pdf # Subdirectory from monorepo
skillctl install user/repo --dry-run # Preview without executing
Manage
skillctl list # Show installed skills
skillctl list --quiet # Bare names (for piping)
skillctl info my-skill # Detailed skill card
skillctl update my-skill # Pull latest from git
skillctl update --all # Update everything
skillctl remove my-skill # Uninstall (ref-counted clones)
Create & validate
skillctl create my-skill --name "My Skill" --desc "Does X"
skillctl lint my-skill # Score 0-100 with fix suggestions
my-skill Score: 65/100
█████████████████████░░░░░░░░░ 65%
✓ Has name, description, and tags in frontmatter
✓ Has 'When to Use' trigger section
✗ Missing anti-patterns section +15 pts
✗ No code examples +20 pts
Learn
skillctl learn # Topic index
skillctl learn anatomy # The 5 layers of a great skill
skillctl learn write # Writing for AI comprehension
skillctl learn organize # Directory structure & naming
skillctl learn examples # Browse well-written reference skills
Registries
skillctl registry # List configured registries
skillctl registry add org/repo # Add (validates skills exist)
skillctl registry remove org/repo
skillctl registry reset # Reset to defaults
Default registries: anthropics/skills, vercel-labs/agent-skills
Configuration
skillctl config # Show current config
skillctl config set skills_dir ~/skills # Change skills directory
skillctl config set registries "org/repo1,org/repo2"
Agent mode
Every command supports --json. Responses include next_actions so agents can chain commands without hallucinating:
$ skillctl search "pdf" --json --fields=slug,installed
{
"results": [
{"slug": "pdf", "installed": false},
{"slug": "pdf-to-markdown", "installed": false}
],
"next_actions": [
"skillctl install anthropics/skills --path skills/pdf -y --json",
"skillctl info pdf --json"
]
}
$ skillctl schema # Full CLI introspection — agents discover commands at runtime
How install works
skillctl install anthropics/skills --path skills/pdf
│
├─ git clone → ~/.skillctl/repos/anthropics__skills/
├─ symlink → ~/.claude/skills/pdf → (clone)/skills/pdf
└─ register → ~/.skillctl/manifest.json
- Shared clones — installing two skills from the same repo uses one clone
- Ref-counted removal — shared clones are kept until the last skill is removed
- Atomic updates —
git pullon the clone updates all skills from that repo
Search
Search uses a three-layer system:
- Synonym expansion — "excel" finds
xlsx, "figma" findsfrontend-design - Scored ranking — slug > keywords > name > tags > description
- LLM enrichment — generates search keywords at index time (optional, cached with SHA invalidation)
[!NOTE] Set
ANTHROPIC_API_KEYorOPENAI_API_KEYto enable LLM enrichment. Runs once per skill, costs ~$0.0005 each, cached with content-addressed SHA invalidation.
SKILL.md format
Skills are markdown files with YAML frontmatter. Run skillctl learn anatomy for the full breakdown.
---
name: sql-standards
description: SQL coding standards for our team
tags: [sql, standards]
---
## When to Use This Skill
Use when the user asks to write or review SQL.
## Core Principles
- Always use UPPERCASE for SQL keywords
- Never use SELECT *
## Common Mistakes to Avoid
- ✗ SELECT * FROM users → ✓ SELECT id, name FROM users
## Examples
Command reference
| Command | Description |
|---|---|
search |
Find skills across registries, GitHub, and local directories |
install |
Clone from GitHub + symlink into skills dir |
list |
Show installed skills with source and timestamps |
create |
Scaffold a new skill with SKILL.md template |
update |
Pull latest for git-installed skills |
remove |
Uninstall with reference-counted clones |
info |
Skill details — author, tags, source, path |
lint |
Score skill quality 0-100 with fix suggestions |
learn |
Interactive guide to writing great skills |
config |
View/set configuration |
registry |
Manage trusted skill registries |
schema |
Full CLI schema for agent self-discovery |
Contributing
The easiest way to contribute is to pick an issue with the good first issue tag.
git clone https://github.com/dvlshah/skillctl.git
cd skillctl
pip install -e ".[dev]"
pytest
Bug report? Open an issue. Feature request? Open an issue.
[!TIP] If skillctl saves you time, star the repo — it helps other developers find it.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skillctl-0.1.0.tar.gz.
File metadata
- Download URL: skillctl-0.1.0.tar.gz
- Upload date:
- Size: 58.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9755c698c24ee2f3a5ce597c186295e48303f40461d16e3800ec7ae3d179b63c
|
|
| MD5 |
f43cc562e20c7a9ddeba968d4240f46f
|
|
| BLAKE2b-256 |
4860a5f992ce9e5d58a55b2bec5fa3a6dbd269be20936df279feab5f8651d821
|
Provenance
The following attestation bundles were made for skillctl-0.1.0.tar.gz:
Publisher:
publish.yml on dvlshah/skillctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillctl-0.1.0.tar.gz -
Subject digest:
9755c698c24ee2f3a5ce597c186295e48303f40461d16e3800ec7ae3d179b63c - Sigstore transparency entry: 1109247398
- Sigstore integration time:
-
Permalink:
dvlshah/skillctl@0ea552bad879c8a8727103886ecb3dda9446eef6 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dvlshah
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0ea552bad879c8a8727103886ecb3dda9446eef6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file skillctl-0.1.0-py3-none-any.whl.
File metadata
- Download URL: skillctl-0.1.0-py3-none-any.whl
- Upload date:
- Size: 62.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4818c18df3d89bee7b054a22ec0b34be055275394d3d1ad686e9c1adcd8c2be4
|
|
| MD5 |
9ec85db5a89a2247fe607383ec2dfa98
|
|
| BLAKE2b-256 |
4ecb01ff7039997dad650b80ff793244f2bebdf6b91f761febd4b972bb7e65f1
|
Provenance
The following attestation bundles were made for skillctl-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on dvlshah/skillctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillctl-0.1.0-py3-none-any.whl -
Subject digest:
4818c18df3d89bee7b054a22ec0b34be055275394d3d1ad686e9c1adcd8c2be4 - Sigstore transparency entry: 1109247400
- Sigstore integration time:
-
Permalink:
dvlshah/skillctl@0ea552bad879c8a8727103886ecb3dda9446eef6 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dvlshah
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0ea552bad879c8a8727103886ecb3dda9446eef6 -
Trigger Event:
release
-
Statement type: