A hot-reloading skill manager that watches a mounted directory for SKILL.md files and exposes them through MCP resources and tools. Each skill lives in its own folder with frontmatter metadata (name, description, version, dependencies, examples) and Markdown content. The server enforces folder structure validation, skips hidden or system directories, and reloads automatically when files change with configurable debounce. Ships as a Docker image or runs via Poetry, connects to Claude Desktop through stdio transport, and surfaces skills as MCP resources you can query and load dynamically. Reach for this when you want to organize reusable prompts or techniques as a file system collection that Claude can browse and apply without restarting.
A production-ready Model Context Protocol (MCP) server that dynamically loads and exposes skills from a mounted volume with hot-reloading support.
📦 Available on MCP Registry - Install with one command!
CRITICAL REQUIREMENT: Each skill MUST be in its own dedicated folder within the skills directory. The server will ONLY recognize skills that follow this structure.
your-skills-directory/
├── skill-one/
│ └── SKILL.md ← Required
├── skill-two/
│ ├── SKILL.md ← Required
│ └── examples/ ← Optional
│ └── example.py
└── skill-three/
├── SKILL.md
├── examples/
│ └── demo.py
└── templates/
└── template.txt
your-skills-directory/
├── SKILL.md ❌ Not in a folder - WILL BE SKIPPED
├── random-file.txt ❌ Not a skill folder
├── .hidden-folder/ ❌ Hidden folder - WILL BE SKIPPED
│ └── SKILL.md
└── __pycache__/ ❌ System folder - WILL BE SKIPPED
└── SKILL.md
Valid folder names:
my-skill-nameexcel_advancedskill-name-v2Invalid (will be skipped):
.___pycache__, node_modules, .git, etc.mkdir -p ~/claude-skills/my-first-skill
cat > ~/claude-skills/my-first-skill/SKILL.md << 'EOF'
---
name: "my-first-skill"
description: "My first Claude skill"
---
# My First Skill
This is my first skill for Claude!
## Usage
Simply describe what your skill does here.
EOF
docker run -i --rm \
-v ~/claude-skills:/skills:ro \
mcp-skill-hub
git clone https://github.com/srprasanna/mcp-skill-hub.git
cd mcp-skill-hub
poetry install
mkdir -p ~/claude-skills/my-first-skill
# Create SKILL.md as shown above
export MCP_SKILLS_DIR=~/claude-skills
poetry run mcp-skills
# Clone the repository
git clone https://github.com/srprasanna/mcp-skill-hub.git
cd mcp-skill-hub
# Install dependencies
poetry install
# Verify installation
poetry run mcp-skills --help
# Build the image
docker build -t mcp-skill-hub .
# Or use docker-compose
docker-compose build
# Set the skills directory
export MCP_SKILLS_DIR=/path/to/your/skills
# Run the server
poetry run mcp-skills
docker run -i --rm \
-v /path/to/your/skills:/skills:ro \
-e MCP_SKILLS_LOG_LEVEL=INFO \
mcp-skill-hub
# Edit docker-compose.yml to set your skills directory path
docker-compose up mcp-skills
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"skills": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"${HOME}/claude-skills:/skills:ro",
"mcp-skill-hub"
]
}
}
}
Or using Poetry:
{
"mcpServers": {
"skills": {
"command": "poetry",
"args": ["run", "mcp-skills"],
"cwd": "/path/to/mcp-skill-hub",
"env": {
"MCP_SKILLS_DIR": "/path/to/your/skills"
}
}
}
}
Important: Make sure your ${HOME}/claude-skills directory contains skill folders, not loose SKILL.md files!
Configuration is done via environment variables with the prefix MCP_SKILLS_:
| Variable | Default | Description |
|---|---|---|
MCP_SKILLS_DIR | /skills | Root directory containing skill folders |
MCP_SKILLS_HOT_RELOAD | true | Enable automatic reloading |
MCP_SKILLS_DEBOUNCE_DELAY | 0.5 | Delay (seconds) before reload |
MCP_SKILLS_LOG_LEVEL | INFO | Log level (DEBUG, INFO, WARNING, ERROR) |
MCP_SKILLS_SCAN_DEPTH | 1 | Scan depth (always 1) |
MCP_SKILLS_DIR=/path/to/skills
MCP_SKILLS_HOT_RELOAD=true
MCP_SKILLS_DEBOUNCE_DELAY=0.5
MCP_SKILLS_LOG_LEVEL=INFO
Skills are defined in SKILL.md files with YAML frontmatter:
---
name: "my-skill"
description: "Brief description"
---
# My Skill
Your skill content here in Markdown.
---
# Required fields
name: "excel-advanced"
description: "Advanced Excel automation techniques"
# Version and authorship
version: "1.2.0"
author: "Your Name"
created: "2025-01-15"
updated: "2025-10-23"
# Dependencies
dependencies:
python: ["openpyxl>=3.0.0", "pandas>=2.0.0"]
system: ["libreoffice"]
# Categorization
category: "office-automation"
tags: ["excel", "spreadsheet", "automation"]
complexity: "intermediate" # beginner|intermediate|advanced
# Usage guidance
when_to_use:
- "Automating Excel report generation"
- "Processing multiple Excel files"
- "Creating complex formulas programmatically"
# Relationships
related_skills: ["csv-processing", "data-analysis"]
# Examples
has_examples: true
example_files: ["examples/report_generator.py", "templates/report_template.xlsx"]
---
# Excel Advanced Automation
This skill covers advanced Excel automation techniques...
## Features
- Automated report generation
- Formula creation
- Bulk processing
## Examples
See `examples/report_generator.py` for a working example.
Required:
name: Unique identifier (kebab-case recommended)description: Brief descriptionOptional:
version: Semantic versionauthor: Creator namecreated, updated: ISO dates (YYYY-MM-DD)dependencies: Python packages or system toolscategory: Main category for groupingtags: Array of tags for searchcomplexity: beginner, intermediate, or advancedwhen_to_use: Array of usage scenariosrelated_skills: Names of related skillshas_examples: Boolean flagexample_files: Paths to example files (relative to skill folder)The server exposes these MCP resources:
skill://catalog - JSON catalog of all skills with metadataskill://{name} - Individual skill markdown contentFour tools are available for interacting with skills:
search_skillsSearch for skills by query, category, tag, or complexity.
{
"query": "excel",
"category": "office-automation",
"tag": "automation",
"complexity": "intermediate"
}
reload_skillsManually trigger a reload of all skills from the directory.
{}
get_skill_infoGet metadata for a specific skill without loading full content.
{
"name": "excel-advanced"
}
list_skill_foldersList all valid skill folders found in the skills directory.
{}
# Clone repository
git clone https://github.com/srprasanna/mcp-skill-hub.git
cd mcp-skill-hub
# Install dependencies (including dev dependencies)
poetry install
# Activate virtual environment
poetry shell
# Run all tests
poetry run pytest
# Run with coverage
poetry run pytest --cov=mcp_skills --cov-report=html
# Run specific test file
poetry run pytest tests/test_scanner.py
# Run with verbose output
poetry run pytest -v
# Format code
poetry run black .
# Lint code
poetry run ruff check .
# Type checking
poetry run mypy src
# Run all quality checks
poetry run black . && poetry run ruff check . && poetry run mypy src
Create a branch:
git checkout -b feature/my-feature
Make changes and test:
poetry run pytest
poetry run mypy src
Format and lint:
poetry run black .
poetry run ruff check .
Commit and push:
git commit -m "Add feature: description"
git push origin feature/my-feature
mcp-skill-hub/
├── src/mcp_skills/ # Source code
│ ├── models/ # Data models
│ ├── parsers/ # Skill parsers
│ ├── storage/ # Repository pattern
│ ├── scanner.py # Directory scanning
│ ├── watcher.py # Hot-reload watcher
│ ├── server.py # MCP server
│ ├── config.py # Configuration
│ └── __main__.py # CLI entry point
├── tests/ # Test suite
├── examples/ # Example skills
├── docs/ # Documentation
└── pyproject.toml # Poetry configuration
Problem: No skills are loaded when the server starts.
Solution:
/skills/my-skill/SKILL.md ✓
/skills/SKILL.md ✗
. or _Problem: Changes to SKILL.md files aren't detected.
Solution:
MCP_SKILLS_HOT_RELOAD=trueSKILL.mdProblem: SKILL.md files fail to parse.
Solution:
--- delimitersname, description) are presentCheck your skills directory structure:
poetry run mcp-skills --validate
Expected output:
✓ /skills/excel-advanced: Valid skill
✓ /skills/python-automation: Valid skill
✗ /skills/SKILL.md: Error - Skills must be in folders
✗ /skills/.hidden: Skipped - Hidden folder
⚠ /skills/empty-folder: Warning - No SKILL.md found
Summary: 2 valid, 1 error, 1 warning, 1 skipped
Enable debug logging for detailed information:
export MCP_SKILLS_LOG_LEVEL=DEBUG
poetry run mcp-skills
Logs include:
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project uses automated releases via GitHub Actions.
patch - Bug fixes (0.1.0 → 0.1.1)minor - New features (0.1.0 → 0.2.0)major - Breaking changes (0.1.0 → 1.0.0)1.2.3)docker.io or ghcr.io)The workflow will:
pyproject.tomlDocker Images:
{username}/mcp-skill-hub:{version}ghcr.io/{owner}/mcp-skill-hub:{version}See RELEASING.md for detailed release documentation.
This project is licensed under the MIT License - see the LICENSE file for details.
Note: This server makes it impossible to misunderstand the folder structure requirement through:
Each skill MUST be in its own folder. This design decision ensures clean organization, easy management, and unambiguous structure. 🎯
MCP_SKILLS_DIRdefault: /skillsRoot directory containing skill folders
MCP_SKILLS_HOT_RELOADdefault: trueEnable automatic reloading when SKILL.md files change
MCP_SKILLS_LOG_LEVELdefault: INFOLogging verbosity: DEBUG, INFO, WARNING, ERROR, CRITICAL