Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .github/workflows/release-v1x.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Publish v1.x releases when a v1.* tag is pushed
# This allows releasing from the v1.x branch without switching GitHub's default branch
#
# Automatic (latest v1.x):
# git checkout v1.x
# npm version patch # bumps version and creates tag
# git push origin v1.x --tags
#
# Manual (for older minor versions like v1.23.x):
# 1. Create a release branch: git checkout -b release/1.23 v1.23.1
# 2. Apply your fixes
# 3. Bump version: npm version patch # creates v1.23.2 tag
# 4. Push: git push origin release/1.23 --tags
# 5. Run this workflow manually from GitHub Actions, specifying the tag
#
# The workflow will automatically build, test, and publish to npm.

name: Publish v1.x

on:
push:
tags:
- 'v1.*'
workflow_dispatch:
inputs:
ref:
description: 'Git ref to release (tag, e.g., v1.23.2)'
required: true
type: string

permissions:
contents: read

concurrency: ${{ github.workflow }}-${{ inputs.ref || github.ref }}

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref }}
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm

- run: npm ci
- run: npm run check
- run: npm run build

test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [18, 24]

steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref }}
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm

- run: npm ci
- run: npm test

publish:
runs-on: ubuntu-latest
needs: [build, test]
environment: release

permissions:
contents: read
id-token: write

steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref }}
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
registry-url: 'https://registry.npmjs.org'

- run: npm ci

- name: Determine npm tag
id: npm-tag
run: |
VERSION=$(node -p "require('./package.json').version")
# Use "release-X.Y" as tag for v1.x releases
# This allows users to install specific minor versions:
# npm install @modelcontextprotocol/[email protected]
MAJOR_MINOR=$(echo "$VERSION" | cut -d. -f1,2)
echo "tag=release-${MAJOR_MINOR}" >> $GITHUB_OUTPUT

- run: npm publish --provenance --access public --tag ${{ steps.npm-tag.outputs.tag }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
42 changes: 42 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,48 @@ pnpm --filter @modelcontextprotocol/examples-server exec tsx src/simpleStreamabl
pnpm --filter @modelcontextprotocol/examples-client exec tsx src/simpleStreamableHttp.ts
```

## Releasing v1.x Patches

The `v1.x` branch contains the stable v1 release. To release a patch:

### Latest v1.x (e.g., v1.25.3)

```bash
git checkout v1.x
git pull origin v1.x
# Apply your fix or cherry-pick commits
npm version patch # Bumps version and creates tag (e.g., v1.25.3)
git push origin v1.x --tags
```

The tag push automatically triggers the release workflow.

### Older minor versions (e.g., v1.23.2)

For patching older minor versions that aren't on the `v1.x` branch:

```bash
# 1. Create a release branch from the last release tag
git checkout -b release/1.23 v1.23.1

# 2. Apply your fixes (cherry-pick or manual)
git cherry-pick <commit-hash>

# 3. Bump version and push
npm version patch # Creates v1.23.2 tag
git push origin release/1.23 --tags
```

Then manually trigger the "Publish v1.x" workflow from [GitHub Actions](https://github.com/modelcontextprotocol/typescript-sdk/actions/workflows/release-v1x.yml), specifying the tag (e.g., `v1.23.2`).

### npm Tags

v1.x releases are published with `release-X.Y` npm tags (e.g., `release-1.25`), not `latest`. To install a specific minor version:

```bash
npm install @modelcontextprotocol/[email protected]
```

## Code of Conduct

This project follows our [Code of Conduct](CODE_OF_CONDUCT.md). Please review it before contributing.
Expand Down
Loading