This document describes the release process for the UniFi MCP Server project.
The project uses automated releases via GitHub Actions with some manual steps for package registries.
Create and push a version tag:
git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0Tag Format:
- Use semantic versioning:
vMAJOR.MINOR.PATCH - Example:
v0.2.0,v1.0.0,v1.2.3 - Always prefix with
v
Once you push the tag, GitHub Actions automatically:
- Runs full test suite - Ensures all 990 tests pass
- Performs security scans - CodeQL, Trivy, Bandit, Safety, OSV Scanner
- Builds multi-arch Docker images:
linux/amd64linux/arm64linux/arm/v7(32-bit ARM)linux/arm64/v8
- Pushes images to GitHub Container Registry:
ghcr.io/enuno/unifi-mcp-server:latestghcr.io/enuno/unifi-mcp-server:0.2.0ghcr.io/enuno/unifi-mcp-server:0.2
- Creates GitHub release:
- Generates release notes from commits
- Attaches build artifacts
- Tags the release
- Generates changelog - Automatic changelog from conventional commits
GitHub Actions Workflows:
.github/workflows/ci.yml- Test suite and quality checks.github/workflows/security.yml- Security scanning.github/workflows/release.yml- Release automation (triggered on tag push).github/workflows/docker-build.yml- Multi-arch Docker builds
After the automated workflow completes, perform these manual steps:
Prerequisites:
- PyPI account with API token
- Project registered on PyPI
- Trusted publisher configured (optional)
Steps:
# Build Python package
python -m build
# Check the distribution
twine check dist/*
# Upload to PyPI (requires PyPI token)
twine upload dist/*
# Or upload to Test PyPI first
twine upload --repository testpypi dist/*Automated Publishing (Optional):
- Configure PyPI trusted publisher in GitHub repository settings
- Add workflow to publish automatically on tag push
The npm package is a metadata wrapper pointing to the Python package.
Prerequisites:
- npm account
- Logged in via
npm login
Steps:
# Ensure package.json version matches release
cat package.json | grep version
# Publish to npm
npm publish --access public
# Verify publication
npm view unifi-mcp-serverPackage Contents:
package.json- Metadata and versionREADME.md- DocumentationLICENSE- Apache 2.0 licenseserver.json- MCP registry manifest
Register the server with the Model Context Protocol registry.
Prerequisites:
mcp-publisherCLI tool installed- GitHub authentication (for
io.github.enunonamespace) - npm package published (required first)
Installation:
# macOS/Linux
brew install mcp-publisher
# Or download binary
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
sudo mv mcp-publisher /usr/local/bin/Steps:
# Authenticate with GitHub (required for io.github.enuno namespace)
mcp-publisher login github
# Publish to MCP registry
# Note: Requires npm package published first
mcp-publisher publish
# Verify registration
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.enuno/unifi-mcp-server"Registry Entry:
- Namespace:
io.github.enuno - Package:
unifi-mcp-server - Source: npm package
- Manifest:
server.jsonin npm package root
Before creating a release tag, ensure:
- All tests passing locally (
pytest tests/unit/) - Coverage meets target (≥78%)
- No linting errors (
ruff check src/ tests/) - Code formatted (
black src/ tests/) - Type checking clean (
mypy src/) - Pre-commit hooks passing (
pre-commit run --all-files)
- No security vulnerabilities (
bandit -r src/) - Dependency scan clean (
safety check) - Secrets detection clean (
detect-secrets scan) - Docker image scan clean (Trivy)
-
README.mdupdated with new features -
CHANGELOG.mdupdated with release notes -
API.mdupdated with new tools/resources - Version numbers updated:
pyproject.tomlpackage.jsonsrc/__init__.py(if versioned)docs/conf.py(if applicable)
- Integration tests passing (if applicable)
- Docker build successful locally
- MCP Inspector working with new features
- Manual testing on real UniFi hardware
-
VERIFICATION_REPORT.mdupdated (for major releases) -
RELEASE_COMPLETION_GUIDE.mdreviewed - Example prompts updated in
docs/examples/
After publishing, verify the release:
# Pull latest image
docker pull ghcr.io/enuno/unifi-mcp-server:latest
# Verify version
docker run --rm ghcr.io/enuno/unifi-mcp-server:latest python -c "import src; print(src.__version__)"
# Test basic functionality
docker run -i --rm \
-e UNIFI_API_KEY=test-key \
-e UNIFI_API_TYPE=cloud \
ghcr.io/enuno/unifi-mcp-server:latest# Install from PyPI
pip install unifi-mcp-server==0.2.0
# Verify installation
python -c "import unifi_mcp_server; print(unifi_mcp_server.__version__)"# Check npm package
npm view unifi-mcp-server
# Verify version
npm view unifi-mcp-server version# Search registry
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=unifi-mcp-server"
# Get server details
curl "https://registry.modelcontextprotocol.io/v0.1/servers/io.github.enuno/unifi-mcp-server"- Release notes accurate
- Changelog generated correctly
- Docker images tagged properly
- Release artifacts attached
If issues are discovered after release:
# Delete local tag
git tag -d v0.2.0
# Delete remote tag (if not published)
git push --delete origin v0.2.0# Yank bad release (keeps it installed but hides from pip)
pip install twine
twine yank unifi-mcp-server -v 0.2.0 -r pypi# Unpublish version (within 72 hours)
npm unpublish unifi-mcp-server@0.2.0
# Or deprecate (after 72 hours)
npm deprecate unifi-mcp-server@0.2.0 "This version has been deprecated"# Delete from GitHub Container Registry
# (requires GitHub CLI and appropriate permissions)
gh api -X DELETE /user/packages/container/unifi-mcp-server/versions/VERSION_ID- Fix the issue on
mainbranch - Create new patch version tag (e.g.,
v0.2.1) - Follow normal release process
- Update release notes to mention hotfix
- Major Releases (x.0.0): Breaking changes, major new features (e.g., v1.0.0 multi-application platform)
- Minor Releases (0.x.0): New features, backward-compatible (e.g., v0.2.0 ZBF + Traffic Flows)
- Patch Releases (0.0.x): Bug fixes, security patches (e.g., v0.2.1 bug fixes)
- v0.2.0 (Q1 2025): Modern firewall & monitoring
- v0.3.0 (Q2 2025): Policy automation & SD-WAN
- v1.0.0 (H2 2025): Multi-application platform
- Major/Minor: Quarterly (when features complete)
- Patch: As needed for critical bugs
- Security: Immediate for CVEs
- Check workflow logs in GitHub Actions tab
- Verify test suite passes locally
- Ensure all secrets configured (PyPI token, etc.)
- Check Docker build locally
- Verify PyPI token is valid
- Check package version not already published
- Ensure
twine check dist/*passes - Verify project name not taken
- Check you're logged in (
npm whoami) - Verify package.json version incremented
- Ensure package name available
- Check npm access permissions
- Verify npm package published first
- Check GitHub authentication (
mcp-publisher login github) - Ensure
server.jsonvalid - Verify namespace ownership
- GitHub Releases: https://github.com/enuno/unifi-mcp-server/releases
- Docker Registry: https://ghcr.io/enuno/unifi-mcp-server
- PyPI Package: https://pypi.org/project/unifi-mcp-server/
- npm Package: https://www.npmjs.com/package/unifi-mcp-server
- MCP Registry: Search for
io.github.enuno/unifi-mcp-server
- RELEASE_COMPLETION_GUIDE.md - Detailed release checklist
- VERIFICATION_REPORT.md - Quality verification for major releases
- CONTRIBUTING.md - Contribution guidelines
- CHANGELOG.md - Version history
Last Updated: 2026-01-25 Maintained By: Development Team