examples/skills/README.md
This example demonstrates how to expose agent skills (like Claude Code skills) as MCP resources.
skills/
├── README.md # This file
├── server.py # MCP server that exposes skills
├── client.py # Example client that discovers and reads skills
└── sample_skills/ # Example skills directory
├── pdf-processing/
│ ├── SKILL.md # Main skill file
│ └── reference.md # Supporting documentation
└── code-review/
└── SKILL.md # Main skill file
Start the server:
uv run python examples/skills/server.py
In another terminal, run the client:
uv run python examples/skills/client.py
The skills provider system has a two-layer architecture:
SkillProvider - Handles a single skill folder, exposing its files as resourcesSkillsDirectoryProvider - Scans a directory, creates a SkillProvider per folderClaudeSkillsProvider - Convenience subclass for Claude Code skills (~/.claude/skills/)For each skill, the provider exposes:
skill://{name}/SKILL.md)skill://{name}/_manifest)When a client lists resources, they see skill names and descriptions (from frontmatter) without fetching the full content. This keeps the discovery cost low.
By default, supporting files are exposed via ResourceTemplate (hidden from list_resources()). Set supporting_files="resources" to make them visible:
SkillsDirectoryProvider(roots=skills_dir, supporting_files="resources")
The _manifest resource provides a JSON listing of all files in a skill:
{
"skill": "pdf-processing",
"files": [
{"path": "SKILL.md", "size": 1234, "hash": "sha256:abc..."},
{"path": "reference.md", "size": 5678, "hash": "sha256:def..."}
]
}
This enables clients to download entire skills for local use.
from pathlib import Path
from fastmcp import FastMCP
from fastmcp.server.providers.skills import SkillProvider
mcp = FastMCP("My Skill")
mcp.add_provider(SkillProvider(Path.home() / ".claude/skills/pdf-processing"))
mcp.run()
from fastmcp.server.providers.skills import SkillsDirectoryProvider
mcp = FastMCP("Skills")
mcp.add_provider(SkillsDirectoryProvider(roots=Path.home() / ".claude" / "skills"))
mcp.run()
from fastmcp import FastMCP
from fastmcp.server.providers.skills import ClaudeSkillsProvider
mcp = FastMCP("My Skills")
mcp.add_provider(ClaudeSkillsProvider()) # Uses ~/.claude/skills/
mcp.run()