mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-09 15:19:10 +02:00
104 lines
2.9 KiB
Markdown
104 lines
2.9 KiB
Markdown
# Skills Provider Example
|
|
|
|
This example demonstrates how to expose agent skills (like Claude Code skills) as MCP resources.
|
|
|
|
## Structure
|
|
|
|
```
|
|
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
|
|
```
|
|
|
|
## Running the Example
|
|
|
|
1. Start the server:
|
|
```bash
|
|
uv run python examples/skills/server.py
|
|
```
|
|
|
|
2. In another terminal, run the client:
|
|
```bash
|
|
uv run python examples/skills/client.py
|
|
```
|
|
|
|
## How It Works
|
|
|
|
The skills provider system has a two-layer architecture:
|
|
|
|
- **`SkillProvider`** - Handles a single skill folder, exposing its files as resources
|
|
- **`SkillsDirectoryProvider`** - Scans a directory, creates a `SkillProvider` per folder
|
|
- **`ClaudeSkillsProvider`** - Convenience subclass for Claude Code skills (~/.claude/skills/)
|
|
|
|
For each skill, the provider exposes:
|
|
- A **Resource** for the main file (`skill://{name}/SKILL.md`)
|
|
- A **Resource** for a synthetic manifest (`skill://{name}/_manifest`)
|
|
- Supporting files via **ResourceTemplate** or **Resources** (configurable)
|
|
|
|
### Progressive Disclosure
|
|
|
|
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:
|
|
|
|
```python
|
|
SkillsDirectoryProvider(roots=skills_dir, supporting_files="resources")
|
|
```
|
|
|
|
### The Manifest
|
|
|
|
The `_manifest` resource provides a JSON listing of all files in a skill:
|
|
|
|
```json
|
|
{
|
|
"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.
|
|
|
|
## Usage Examples
|
|
|
|
### Single Skill
|
|
|
|
```python
|
|
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()
|
|
```
|
|
|
|
### All Skills in a Directory
|
|
|
|
```python
|
|
from fastmcp.server.providers.skills import SkillsDirectoryProvider
|
|
|
|
mcp = FastMCP("Skills")
|
|
mcp.add_provider(SkillsDirectoryProvider(roots=Path.home() / ".claude" / "skills"))
|
|
mcp.run()
|
|
```
|
|
|
|
### Claude Code Skills (default location)
|
|
|
|
```python
|
|
from fastmcp import FastMCP
|
|
from fastmcp.server.providers.skills import ClaudeSkillsProvider
|
|
|
|
mcp = FastMCP("My Skills")
|
|
mcp.add_provider(ClaudeSkillsProvider()) # Uses ~/.claude/skills/
|
|
mcp.run()
|
|
```
|