Packaging & Distribution¶
This page covers how to package, distribute, and install pynchy plugins. Follow these conventions to make your plugin discoverable and installable by other users.
Plugin Package Structure¶
pynchy-plugin-{name}/
├── pyproject.toml
└── src/
└── pynchy_plugin_{name}/
├── __init__.py # Plugin class with @hookimpl methods
├── server.py # MCP server (if applicable)
└── skills/ # Skill directories (if applicable)
└── {skill-name}/
└── SKILL.md
Entry Point Registration¶
Pynchy discovers plugins via Python entry points. In your pyproject.toml:
The group must be "pynchy". The key (left side) provides a human-readable name. The value points to your plugin class.
Naming Conventions¶
| What | Convention | Example |
|---|---|---|
| Package name | pynchy-plugin-{name} | pynchy-plugin-voice |
| Module name | pynchy_plugin_{name} | pynchy_plugin_voice |
| Entry point key | Short descriptive name | voice |
Installation Methods¶
From PyPI¶
From Git¶
For private repositories:
Local Development¶
Editable installs reflect code changes immediately — no reinstall needed.
Verifying Installation¶
# Check the plugin is installed
uv pip list | grep pynchy-plugin
# Start pynchy and check logs for discovery
# Look for: "Discovered third-party plugins count=N"
Uninstalling¶
Restart pynchy — the plugin's hooks are no longer called.
Container Dependencies¶
Plugins that provide container-side code (MCP servers, agent cores) need their dependencies available inside the container.
Packages already in the container image: mcp, croniter, Python standard library, Claude Agent SDK.
If your plugin needs additional packages, document this in your README. Users add them to their container Dockerfile:
Version Management¶
Your lockfile (uv.lock) tracks plugin versions, just like any Python dependency:
# Pin a specific version
uv pip install pynchy-plugin-voice==1.2.3
# Upgrade
uv pip install --upgrade pynchy-plugin-voice
Publishing to PyPI¶
Standard Python packaging workflow:
See PyPI publishing docs for details on API tokens and metadata.