Observed since 20 Oct, 23:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Filesystem-based skill provider for the Agent Skills format (https://agentskills.io)
Local filesystem skill provider for the Agent Skills SDK.
Serves Agent Skills from a local directory tree. Each subdirectory containing a SKILL.md file is a skill.
pip install agentskills-fs
Requires Python 3.12 or newer. Installs agentskills-core and pyyaml as dependencies.
skills/
├── incident-response/
│ ├── SKILL.md # YAML frontmatter + markdown body
│ ├── references/ # supplementary docs (optional)
│ ├── scripts/ # executable scripts (optional)
│ └── assets/ # diagrams, data files (optional)
└── another-skill/
└── SKILL.md
from pathlib import Path
from agentskills_core import SkillRegistry
from agentskills_fs import LocalFileSystemSkillProvider
provider = LocalFileSystemSkillProvider(Path("./skills"))
registry = SkillRegistry()
await registry.register_all(provider) # every subdirectory holding a SKILL.md
skill = registry.get_skill("incident-response")
meta = await skill.get_metadata()
body = await skill.get_body()
script = await skill.get_script("page-oncall.sh")
Use registry.register("incident-response", provider) instead to take one named skill and ignore
the rest of the folder.
Blocking file I/O runs in a worker thread, so a slow or networked filesystem does not stall other coroutines.
SKILL.md content is cached per provider instance after the first read — a single skill is otherwise re-read up to five times in one agent session. Call invalidate() when skills change on disk.
provider.invalidate("incident-response") # forget one skill
provider.invalidate() # forget everything
The file-access capability preserves original bytes and lists the complete skill tree, including hidden files and arbitrary nested directories:
paths = await provider.list_files("incident-response")
original = await provider.read_file("incident-response", "SKILL.md")
data = await provider.read_file("incident-response", "data/nested.bin")
Listing does not read file contents. Reads bypass the parsed SKILL.md cache and
enforce max_file_bytes. Negative limits are rejected. Zero permits empty files only.
Links, junctions, special files, absolute paths, and traversal are rejected instead
of silently producing an incomplete listing.
Publish only directories intended for sharing. Hidden files are not automatically excluded, so remove credentials and private files before exposing a skill. The provider does not freeze the tree or prevent concurrent filesystem changes. Use a trusted, immutable publication directory when constructing verified manifests.
../../etc/passwd) raise SkillNotFoundError or ResourceNotFoundError.max_file_bytes parameter.skill_id rather than full filesystem paths, preventing internal path leakage.For the full security policy, see SECURITY.md.
LocalFileSystemSkillProvider(root, *, max_file_bytes=10_485_760)| Parameter | Type | Default | Description |
|---|---|---|---|
root | Path | - | Path to the directory containing skill subdirectories |
max_file_bytes | int | 10_485_760 (10 MB) | Maximum allowed file size in bytes |
| Method | Returns | Description |
|---|---|---|
get_metadata(skill_id) | dict[str, Any] | Parsed YAML frontmatter from SKILL.md |
get_body(skill_id) | str | Markdown body after the frontmatter |
get_script(skill_id, name) | bytes | Raw content of a script file |
get_asset(skill_id, name) | bytes | Raw content of an asset file |
get_reference(skill_id, name) | bytes | Raw content of a reference file |
list_resources(skill_id) | dict[str, list[str]] | Resource filenames grouped by kind |
list_files(skill_id) | list[str] | Complete sorted tree, including SKILL.md and nested files |
read_file(skill_id, path) | bytes | Original bytes from a skill-relative path |
invalidate(skill_id=None) | None | Drop cached SKILL.md content for one skill, or all skills |
This provider sets supports_resource_listing = True and can enumerate a skill's bundled files:
listing = await provider.list_resources("incident-response")
# {"references": ["severity-levels.md"], "scripts": ["page-oncall.sh"], "assets": []}
All three keys are always present; unused categories are empty lists. Only regular files directly inside references/, scripts/ and assets/ are reported. Dotfiles, subdirectories, and symlinks resolving outside the skill root are skipped rather than raising, so one stray entry cannot make a whole skill unlistable — and listing can never offer a name that a subsequent read would reject.
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.7.0 | 9 Oct 2026 | 2 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 23:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:5ae6b0f95d4e55679e9e038389c6436a75145a7cfc9d618f2a2fa2aeb12f2832