This document explains how releases work for the MCP REST API project.
We use Release Please by Google to manage releases. This gives us:
- Controlled releases: You decide when to release by merging a PR
- Automatic changelogs: Generated from conventional commit messages
- Semantic versioning: Version bumps based on commit types
- No accidental releases: Commits to main don't automatically publish
┌─────────────────────────────────────────────────────────────────┐
│ Release Flow │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Merge feature/fix PRs to main (normal development) │
│ │ │
│ ▼ │
│ 2. Release Please automatically creates/updates a │
│ "Release PR" with changelog and version bump │
│ │ │
│ ▼ │
│ 3. The Release PR stays open, accumulating changes │
│ (you can merge more features, it updates automatically) │
│ │ │
│ ▼ │
│ 4. When YOU'RE READY: merge the Release PR │
│ │ │
│ ▼ │
│ 5. GitHub Release is created automatically │
│ │ │
│ ▼ │
│ 6. NPM package is published automatically │
│ │
└─────────────────────────────────────────────────────────────────┘
We use Conventional Commits. Your commit messages determine version bumps:
| Commit Type | Version Bump | Example |
|---|---|---|
feat: |
Minor (0.4.0 → 0.5.0) | feat: add file upload support |
fix: |
Patch (0.4.0 → 0.4.1) | fix: handle empty response body |
perf: |
Patch | perf: optimize large response handling |
refactor: |
Patch | refactor: simplify auth logic |
BREAKING CHANGE: |
Major (0.4.0 → 1.0.0) | Footer in commit body |
These commit types are tracked but don't trigger version bumps:
docs:- Documentation changestest:- Adding or updating testsci:- CI/CD configurationbuild:- Build system changeschore:- Maintenance tasksstyle:- Code formatting
# 1. Create a feature branch
git checkout -b feat/new-feature
# 2. Make changes and commit with conventional format
git commit -m "feat: add support for custom timeout"
# 3. Push and create PR
git push -u origin feat/new-feature
gh pr create
# 4. After PR is merged to main, Release Please updates the Release PR
# 5. Maintainer merges Release PR when ready to publish- Check the Release PR: Look for a PR titled "chore(main): release X.Y.Z"
- Review the changelog: Ensure it accurately reflects the changes
- Merge when ready: Merging triggers the release
That's it! The automation handles:
- Creating the GitHub release
- Publishing to NPM
- Updating the changelog
If no Release PR exists, it means there are no releasable changes since the last release. Only feat:, fix:, perf:, and refactor: commits trigger release PRs.
If you need to release manually (not recommended):
# Update version
npm version patch # or minor/major
# Push with tags
git push --follow-tags
# Create GitHub release manually
gh release create v0.4.1 --generate-notes
# NPM publish will trigger automatically on release| File | Purpose |
|---|---|
release-please-config.json |
Release Please settings (includes changelog sections) |
.release-please-manifest.json |
Current version tracker |
.github/workflows/release-please.yml |
Creates/updates Release PR |
.github/workflows/npm-publish.yml |
Publishes to NPM on release |
commitlint.config.js |
Commit message validation |
We follow Semantic Versioning:
MAJOR.MINOR.PATCH
│ │ │
│ │ └── Bug fixes, performance improvements
│ └──────── New features (backwards compatible)
└────────────── Breaking changes
While in 0.x.x (pre-1.0), minor versions may include breaking changes.
Batching changes into deliberate releases:
- Gives users predictable update cycles
- Allows grouping related features
- Provides meaningful changelogs
- Reduces notification fatigue
Yes! Merge the Release PR whenever you want. A new Release PR will be created after the next releasable commit.
- Create a fix PR with
fix:commit - Merge to main
- Release Please updates the Release PR
- Merge the Release PR to publish the fix
Add BREAKING CHANGE: in the commit footer:
feat: change API response format
BREAKING CHANGE: Response structure changed from array to object.
Users must update their code to handle the new format.
This will trigger a major version bump (0.x → 1.0 or 1.x → 2.0).