v0.5.0 · Apache-2.0 · Free & open source
One GitHub repo.
Every AI agent.
Stop copy-pasting SKILL.md files into ~/.claude, ~/.cursor, ~/.codex. Skills live in one repo you own. Agents fetch them on demand over MCP — no startup-token tax, no drift.
AI tool dot-folders auto-detected at bootstrap
MCP tools exposed — list_skills, get_skill, publish_skill
SSH keys, git configs, or shell PATHs required
Command to install & wire up every agent
The problem
Every AI tool wants its own skills folder. Edit once, sync N times.
Today every AI coding tool keeps a local skills folder. Same skill, copy-pasted into N dot-folders. Worse — every skill in every folder gets auto-loaded into the agent's startup context, whether the current task needs it or not. You pay tokens for skills you'll never use this conversation.
Duplication, drift, token bloat
- ~/.claude/skills/code-review/SKILL.md
- ~/.cursor/skills/code-review/SKILL.md
- ~/.codex/skills/code-review/SKILL.md
- ~/.factory/skills/code-review/SKILL.md
- …and 46 other agents you forgot about
- All loaded on every startup. Every conversation.
One repo. Fetched on demand.
- anand-92/my-skills/code-review/SKILL.md
- Every agent points to the same repo
- Edit once · branch · PR · fork · restore
- Pointer file in each agent's dot-folder (~200 bytes)
- Real skill fetched only when needed
- Cache invalidated on tree SHA change
How it works
Single source of truth. Six deliberate constraints.
Every design decision falls out of one observation: desktop MCP clients spawn the server with a stripped environment — no shell PATH, no SSH agent, no git config user.email. So we don't depend on any of them.
Fetched on demand
Tiny pointer file in each agent's dot-folder. The actual skill is downloaded the moment get_skill(slug) is called — and not before.
50+ tools recognized
Claude Code, Claude Desktop, Cursor, Codex, Windsurf, Goose, Factory, VS Code/Copilot — all detected at bootstrap, universal ones pre-selected.
gh-only GitHub I/O
No git shell-out. No SSH. No embedded HTTP. Every call routes through the user's authenticated GitHub CLI via the Git Data API.
Tree-SHA cache
Skills cached in ~/.cache/skills-mcp/skills/. Cache key is GitHub's tree SHA — force-pushes and subtree changes invalidate correctly.
Path-traversal hardened
publish_skill rejects .. segments and backslash traversals. Per-file size cap (2 MiB). Identical validation in Python & Go.
Git, but for skills
The registry is a real GitHub repo. Branch it, PR it, fork a teammate's, restore old versions. Apache-2.0 — yours forever.
Comparison
Why not just keep using local folders or a dotfiles repo?
| Capability | Local dot-folders | Dotfiles repo | skills-registry |
|---|---|---|---|
| One home for every agent | duplicated | yes | yes |
| Fetched on demand (no startup tokens) | no | no | yes |
| Versioned + branchable | no | yes | yes |
| Works in every MCP client | partial | no | yes |
| Share / fork between users | no | clunky | clone the repo |
| No shell or SSH config needed | yes | no | yes |
Architecture
Three deliverables. One source repo.
Python bootstrap + Python MCP server + Go TUI manager. The Python wheel ships both Python entry points; the Go binary is downloaded from GitHub Releases on first run.
Thin bootstrap. Verifies gh, downloads the Go CLI, execs it. One command: skills-registry init.
PyPI wheel · entry point
FastMCP server exposing list_skills, get_skill, publish_skill over MCP stdio. Same wheel, second entry point.
PyPI wheel · MCP stdio · FastMCP 3.x
Charmbracelet TUI manager. Commands: bootstrap, list, get, sync, add, publish.
GitHub Releases · darwin/linux/windows × amd64/arm64
MCP surface
Three tools. Any MCP-aware agent can call them.
Enumerates every skill in the registry. Returns a markdown table with slug, name, description, and the URI to fetch.
readDownloads one skill into the local cache. Returns the absolute path. Cache invalidated on tree-SHA change.
readPublishes a skill via the GitHub Git Data API. Accepts files mapping or local_folder. Returns commit SHA. 3 retries on conflict.
write// Claude Code / Claude Desktop / Cursor / VS Code — mcp.json { "mcpServers": { "skill-registry": { "command": "skill-registry-mcp" } } }
# ~/.codex/config.toml [mcp_servers.skill-registry] command = "skill-registry-mcp"
# What the agent ends up doing under the hood user: "use my code-review skill on this PR" agent: get_skill("code-review") → /Users/you/.cache/skills-mcp/skills/code-review/ → reads SKILL.md → follows the skill's instructions
Install
One command. Five things happen.
-
Verify
ghis authedExits with code 3 if missing, code 4 if not logged in. Run gh auth login first.
-
Download the Go CLI
Pulls the matching tarball from GitHub Releases into ~/.local/bin (or $SKILLS_BIN_DIR).
-
Hand off →
skill-registry bootstrapScans ~/.* for known dot-folders. Pre-selects universal ones (factory, codex). You confirm the multi-select.
-
Create the registry repo
Calls gh repo create. Pushes every found skill via the Git Data API. Writes SKILL.md pointer files into each agent.
-
Print the MCP snippet
Platform-correct JSON / TOML you paste into your MCP client. Restart the client. Done. Re-running init is safe — idempotent.
# No system Python needed — uvx handles it $ uvx skills-registry init # Then in your MCP client: $ cat ~/.config/claude/mcp.json
# Install persistently — MCP clients won't depend on uvx cache $ uv tool install skills-registry # Installs both entry points: # skills-registry (bootstrap CLI) # skill-registry-mcp (MCP stdio server) $ skills-registry init
# Classic pip — needs Python 3.10+ already on PATH $ pip install skills-registry $ skills-registry init # Prerequisites checked at runtime: # - gh (https://cli.github.com/) # - gh auth login already run
CLI reference
The skill-registry binary
Charmbracelet TUI for day-to-day management. Same Git-Data-API publish flow as the MCP server, mirrored in Go.
| Command | What it does |
|---|---|
| skill-registry bootstrap | First-run setup. Idempotent — safe to re-run. |
| skill-registry list | Fuzzy-filterable TUI of every skill in your registry. Press / to search, Enter to preview. |
| skill-registry get <slug> | Download one skill into ./skill-registry/<slug>/. |
| skill-registry sync | Push local skills sitting in .claude/skills, .cursor/skills, etc. that aren't yet in the registry. |
| skill-registry add <owner/repo> | Clone a teammate's registry. Multi-select which of their skills to pull into your own. |
| skill-registry publish <path> | Publish a single local skill folder. Path-traversal validated. 2 MiB per-file cap. |
| skill-registry --version | Print version. Current: 0.5.0. |
Free, open, and pre-1.0. Try it today.
Apache-2.0. No accounts. No telemetry. No paid tier — ever. Built by anand-92 as an open-source dev tool. Star the repo or file an issue if it breaks.