Python SDK for the Musher bundle distribution platform
Project description
Musher Python SDK
Python SDK for the Musher bundle distribution platform. Pull versioned AI agent asset bundles — prompts, tool definitions, agent specs, and skills — into your Python applications.
Installation
Requires Python 3.13+.
pip install musher-sdk
Authentication
Set your API key as an environment variable:
export MUSHER_API_KEY="msk_..."
The SDK resolves credentials automatically in this order:
MUSHER_API_KEYenvironment variable- OS keyring (
musher/{hostname}) - Credential file (
<data_dir>/credentials/<host_id>/api-key, must be0600)
You can also pass a token directly:
musher.configure(token="msk_...")
Quick Start
import musher
bundle = musher.pull("myorg/my-bundle:1.0.0")
for f in bundle.files():
print(f"{f.logical_path}: {len(f.text())} chars")
Async
import musher
async with musher.AsyncClient() as client:
bundle = await client.pull("myorg/my-bundle:1.0.0")
Sync Client
import musher
with musher.Client() as client:
bundle = client.pull("myorg/my-bundle:1.0.0")
result = client.resolve("myorg/my-bundle:1.0.0")
asset = client.fetch_asset(
"prompts/system.md",
namespace="myorg",
slug="my-bundle",
version="1.0.0",
)
Working with Bundles
Bundles provide typed accessors for each resource type:
bundle = musher.pull("myorg/my-bundle:1.0.0")
# Prompts
prompt = bundle.prompt("system")
print(prompt.text())
# Skills
for skill in bundle.skills():
print(skill.name, skill.description)
# Toolsets and agent specs
toolset = bundle.toolset("search-tools")
data = toolset.parse_json()
spec = bundle.agent_spec("reviewer")
config = spec.parse_json()
Filter to a subset of resources with select():
selection = bundle.select(skills=["code-review"], prompts=["system"])
Framework Integrations
The SDK integrates with popular AI agent frameworks:
- Claude — export bundles as Claude plugins or install skills to
.claude/skills/(examples) - OpenAI Agents — export skills as local directories or inline zips for the OpenAI shell tool (examples)
- PydanticAI — use bundle prompts as agent instructions with structured output (examples)
Configuration
Registry URL
export MUSHER_API_URL="https://custom-registry.example.com"
Default: https://api.musher.dev
Programmatic Configuration
from pathlib import Path
import musher
musher.configure(
token="msk_...",
registry_url="https://custom-registry.example.com",
cache_dir=Path("/tmp/musher-cache"),
verify_checksums=True,
timeout=30.0,
max_retries=2,
)
All parameters are optional — omitted values are auto-discovered.
See Configuration for the full reference (directory layout, credential chain, cache structure, TTL defaults).
Cache
The SDK uses a content-addressable disk cache:
- Blobs stored by SHA-256 hash, shared across registries
- Manifests and refs partitioned by registry hostname
- Manifests TTL: 24h; refs TTL: 5min
cache_clean()removes expired entries and garbage-collects unreferenced blobs
Cache management functions are available at the module level and on the Client:
import musher
info = musher.cache_info() # cache statistics
musher.cache_remove("myorg/my-bundle:1.0.0") # remove cached metadata for a bundle version
musher.cache_clean() # reclaim expired entries and unreferenced blobs
musher.cache_clear() # remove all cached data
path = musher.cache_path() # cache directory path
Features
pull()/pull_async()— resolve + fetch all assets + verify checksumsresolve()/resolve_async()— resolve bundle references to manifestsfetch_asset()— fetch individual assets by logical path- Sync (
Client) and async (AsyncClient) clients - Typed handles:
SkillHandle,PromptHandle,ToolsetHandle,AgentSpecHandle bundle.select()— filter resources by type- Content-addressable cache with TTL and garbage collection
- Cache management:
cache_info(),cache_remove(),cache_clear(),cache_clean(),cache_path() export_claude_plugin()/install_claude_skills()— Claude integrationexport_openai_local_skill()/export_openai_inline_skill()— OpenAI Agents integration
Examples
See the examples/ directory for runnable code samples covering basic usage, Claude, OpenAI Agents, and PydanticAI integrations.
License
Apache-2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file musher_sdk-0.3.4.tar.gz.
File metadata
- Download URL: musher_sdk-0.3.4.tar.gz
- Upload date:
- Size: 202.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
063924e0b8483050794e7c9e514b190f2fee529796968b283a50e084546d4609
|
|
| MD5 |
6dc81dd0724698ac59a9598a7801cd35
|
|
| BLAKE2b-256 |
7ae33ee14347e35f04352a8a6975050a95ad0a6f256a84d90df7e9a10c7d9f82
|
Provenance
The following attestation bundles were made for musher_sdk-0.3.4.tar.gz:
Publisher:
release.yml on musher-dev/python-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
musher_sdk-0.3.4.tar.gz -
Subject digest:
063924e0b8483050794e7c9e514b190f2fee529796968b283a50e084546d4609 - Sigstore transparency entry: 1205757337
- Sigstore integration time:
-
Permalink:
musher-dev/python-sdk@cac6e0836a4ae528b3458870aa2a69f8314e5265 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/musher-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cac6e0836a4ae528b3458870aa2a69f8314e5265 -
Trigger Event:
push
-
Statement type:
File details
Details for the file musher_sdk-0.3.4-py3-none-any.whl.
File metadata
- Download URL: musher_sdk-0.3.4-py3-none-any.whl
- Upload date:
- Size: 30.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86a31b83050870bf3011b70c612f76f57c20e1635175804046017fbd6bbfb785
|
|
| MD5 |
94a10de7f6ccfd058fc7080dfd2924e5
|
|
| BLAKE2b-256 |
b9c4f7f03b64e4e26538e540a0505c8f5be97f8035c911b39f716a37759b0a06
|
Provenance
The following attestation bundles were made for musher_sdk-0.3.4-py3-none-any.whl:
Publisher:
release.yml on musher-dev/python-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
musher_sdk-0.3.4-py3-none-any.whl -
Subject digest:
86a31b83050870bf3011b70c612f76f57c20e1635175804046017fbd6bbfb785 - Sigstore transparency entry: 1205757340
- Sigstore integration time:
-
Permalink:
musher-dev/python-sdk@cac6e0836a4ae528b3458870aa2a69f8314e5265 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/musher-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cac6e0836a4ae528b3458870aa2a69f8314e5265 -
Trigger Event:
push
-
Statement type: