4.2.0
A skill is a SKILL.md of instructions plus whatever files it points to. Most agents load skills from a local folder, which means every laptop has its own copy and none of them agree. Put the skills on an MCP server instead: one copy, and an update ships when you deploy.
skill://release-notes/SKILL.md and template.md as ordinary resources. Clients that speak the Skills extension can also call skills/list and get each skill’s description and a hashed manifest of its files, so a host can offer the skill without an install step. Few hosts do yet, and FastMCP’s support is experimental, but you get both from the same provider. Run fastmcp list server.py --skills to see what you’re serving.
Where skills come from
ASkill is a value: a name, a description, instructions, and any supporting files. Build one in Python as above, or load one from a folder, a package, or a mapping of files:
description is what an agent reads to decide whether to use the skill, so make it say when.
If your skills change while the server runs, override load_skills(). FastMCP calls it once per request, so a database row or a folder you’re still editing shows up on the next request:
SkillsDirectoryProvider and presets like ClaudeSkillsProvider also serve folders straight from disk; pass experimental_skills=True to make them discoverable.
Access control
Discovery never shows a skill the caller can’t read. If any of its files is hidden, denied bycheck_resource_access (what AuthMiddleware uses), or shadowed by another resource, the skill drops out of skills/list.
Mounted servers
Skills come along when you mount a server, at the URIs the parent serves them at:mount(child, namespace="team") turns skill://review/ into skill://team/review/. If you’d rather choose exactly which providers are discoverable, register the extension yourself with mcp.add_extension(SkillsExtension(providers=[...])) from fastmcp.skills.extension.
Read skills from a client
Discover and read skills
Opt the client into the extension, list what the server offers, and read a whole skill withread_skill():
list_skills() returns metadata only. read_skill() reads every file in the skill’s manifest, checks each against its digest, and returns a Skill, so you can inspect it or serve it again with SkillCatalogProvider([skill]). ClientGroup.list_skills() lists skills across several servers.
Install skills into a local agent
Most agents still only read skills from disk.sync_skills() copies a server’s skills into a local folder, and works with any server that serves skills as resources, with or without the extension:
Current limits
- Skills behind a proxy are readable as resources but don’t show up in
skills/list. - A provider added with a namespace or other transforms isn’t discoverable; mount a server instead.
directoryReadisn’t implemented.

