Skip to main content

dais-skills

A Python package for programmatically discovering, downloading, and parsing Agent Skills.

Currently supports GitHub as a skill source. GitLab, arbitrary Git repositories, and custom sources (e.g. S3) are planned.

This project is in early development. The API may change at any time and backward compatibility is not guaranteed yet.

中文文档

Features

  • Scan a repository: given a GitHub repo URL, list every skill in it along with its path, name, and description
  • Download a skill: given a repo URL and a skill path, package that skill directory as a zip byte stream
  • Parse a skill archive: extract SKILL.md metadata (with frontmatter) and every resource file (auto-classified as text or binary) from a zip

Installation

Requires Python 3.14+.

uv add dais-skills
# or
pip install dais-skills

Quick Start

Scan a repository for skills

import asyncio
from dais_skills import scan_repo

async def main():
    skills = await scan_repo("https://github.com/<owner>/<repo>")
    for s in skills:
        print(s.path, "-", s.name)
        print(" ", s.description)

asyncio.run(main())

scan_repo returns list[ScannedSkill], where each item has:

  • path: the skill directory path inside the repo
  • name: the name field from the SKILL.md frontmatter
  • description: the description field from the SKILL.md frontmatter

The scanner walks the priority directories defined by the Agent Skills specification (such as skills/, .claude/skills/, .github/skills/, and so on) and skips irrelevant directories like node_modules, .git, dist, build, and __pycache__.

Download a single skill as a zip

import asyncio
from dais_skills import download_skill_zip

async def main():
    data: bytes = await download_skill_zip(
        "https://github.com/<owner>/<repo>",
        "skills/my-skill",
    )
    with open("my-skill.zip", "wb") as f:
        f.write(data)

asyncio.run(main())

skill_path may point at either the skill directory or the SKILL.md inside it. Both forms are treated as equivalent.

You can also pass an existing httpx.AsyncClient via the optional keyword-only argument client to reuse connections across calls.

Parse a downloaded skill archive

import zipfile
from dais_skills import Skill

with zipfile.ZipFile("my-skill.zip") as zf:
    skill = Skill.from_zip(zf)

print(skill.name, skill.description)
print("license:", skill.license)
print("compatibility:", skill.compatibility)
print("allowed-tools:", skill.allowed_tools)
print("metadata:", skill.metadata)
print("body:", skill.content[:80])

for res in skill.resources:
    if res.type == "text":
        print("[text]", res.relative, len(res.content))
    else:
        print("[bin] ", res.relative, len(res.content))

Skill.from_zip will:

  1. Locate the skill root inside the zip (the first-level directory containing SKILL.md, or the archive root)
  2. Parse the frontmatter and body of SKILL.md
  3. Collect every remaining file as a SkillResource, splitting them into TextResource and BinaryResource via binaryornot

Public API

Exported from the top-level package:

Name Description
scan_repo(repo_url) -> list[ScannedSkill] Scan a repository and return a summary of every skill found
download_skill_zip(repo_url, skill_path, *, client=None) -> bytes Download the given skill directory and pack it into a zip; optional httpx.AsyncClient reuse
Skill.from_zip(zip_file) -> Skill Parse a full skill object from a zip file
ScannedSkill Scan-result dataclass (path, name, description)
Skill Fully parsed skill dataclass (name, description, content, optional license / compatibility / allowed_tools, metadata, resources)
SkillResource TextResource | BinaryResource
SkillException Base exception for this package
ScannerError Base error for scanning failures
InvalidRepoUrlError Invalid repository URL (scanner)
RepositoryTreeFetchError Failed to fetch repository tree
DownloaderError Base error for download failures
InvalidSkillPathError Invalid skill path
SkillPathNotFoundError Skill path not found in repository
SkillTreeFetchError Failed to fetch repository tree for download
SkillFileDownloadError Failed to download a skill file
ExtractorException Base error for archive extraction failures
InvalidSkillArchiveError Invalid skill archive
SkillRootNotFoundError Skill root not found in archive
SkillMdNotFoundError SKILL.md not found in archive

GitHub client exceptions (GitHubError, InvalidGitHubUrlError, GitHubApiError, GitHubTreeFetchError, GitHubBlobFetchError) are available from dais_skills.public.

Development

uv sync
uv run pytest              # run unit tests
uv run pytest -m smoke     # run end-to-end smoke tests that hit real network services

Roadmap

  • Scan skills in a GitHub repository
  • Download and package a single skill from GitHub
  • Parse a skill archive
  • GitLab repository support
  • Arbitrary remote Git repository support
  • S3 and other custom sources

Metadata

Release files for dais-skills 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dais-skills 0.1.5
File Size Uploaded
dais_skills-0.1.5.tar.gz 8.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dais-skills 0.1.5
File Interpreter ABI Platform
dais_skills-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 21.5 kB

Release files / dais_skills-0.1.5.tar.gz

Download URL dais_skills-0.1.5.tar.gz
Size 8.1 kB
Tags Source
SHA-256 checksum
How to use checksums
2b080507e421ab04732fdec81da67230aaa5e967009a4dfca3816639f1ae8970
BLAKE2b-256 checksum
How to use checksums
86985a2db0b73066f2e2747ed94f5dffa99d51dda9f6e7541a754a541ca1c30b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 12, 2026.

Transparency log

Release files / dais_skills-0.1.5-py3-none-any.whl

Download URL dais_skills-0.1.5-py3-none-any.whl
Size 13.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1de2b0a2341b20111d91e922b4f0d62ecb35006259b6502bc627ef0b4017b8fc
BLAKE2b-256 checksum
How to use checksums
8b54ad87dd4378f20caeed3dab1fd593441b8267934e318536fee2ccae7656f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page