Python SDK for the Musher bundle distribution platform. Pull versioned AI agent asset bundles (prompts, configs, tool definitions) into your Python applications.
pip install musher-sdkimport musher
# Explicit token
musher.configure(api_key="your-token")
bundle = musher.pull("myorg/my-bundle:1.0.0")
for asset in bundle.files():
print(f"{asset.logical_path}: {len(asset.text())} chars")async with musher.AsyncClient() as client:
bundle = await client.pull("myorg/my-bundle:1.0.0")with musher.Client() as client:
result = client.resolve("myorg/my-bundle:1.0.0")
asset = client.fetch_asset("asset-id", version="1.0.0")The SDK resolves credentials automatically in this order:
- Environment variables —
MUSHER_API_KEY - OS keyring — host-scoped service
musher/{hostname} - File fallback —
<data_dir>/credentials/<host_id>/api-key(must be0600permissions)
The registry URL is resolved from environment variables:
MUSHER_API_URL- Default:
https://api.musher.dev
import musher
# All parameters are optional — omitted values auto-discover
musher.configure(
api_key="your-token", # or token="your-token"
api_url="https://custom.dev", # or registry_url="https://custom.dev"
cache_dir=Path("/tmp/cache"),
)The SDK uses a content-addressable disk cache:
- Blobs are stored by SHA-256 hash (shared across registries)
- Manifests and refs are partitioned by registry hostname
- Manifests have a configurable TTL (default 24h); refs default to 5min
clean()removes expired entries and garbage-collects unreferenced blobs
resolve()— resolve bundle references to manifestsfetch_asset()— fetch individual assets by IDpull()— resolve + fetch all assets + verify checksums- Sync (
Client) and async (AsyncClient) clients - Content-addressable cache with TTL and garbage collection
- Typed handles: skills, prompts, toolsets, agent specs
export_claude_plugin(),install_vscode_skills(),install_claude_skills()write_lockfile(),verify()- OCI direct pull (
OCIClient)
Apache-2.0