This server watches a mounted directory for skill definitions and exposes them through MCP resources and tools. Each skill lives in its own folder with a SKILL.md file containing YAML frontmatter and markdown content. The server hot-reloads when you edit these files, so you can update skills without restarting. You'd use this to maintain a library of reusable prompts, workflows, or domain knowledge that Claude can access on demand. The folder structure is strict: loose files get ignored, everything must be in a dedicated subfolder. Ships as a Docker container or runs via Poetry, configurable through environment variables for reload behavior, debounce timing, and log levels.
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