couchbase-mcp-server 0.5.1__tar.gz → 0.5.2rc1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- couchbase_mcp_server-0.5.2rc1/.github/workflows/update-mcp-registry.yml +145 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/PKG-INFO +3 -1
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/README.md +2 -0
- couchbase_mcp_server-0.5.2rc1/RELEASE.md +264 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/pyproject.toml +1 -1
- couchbase_mcp_server-0.5.2rc1/scripts/update_version.sh +79 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/server.json +3 -3
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/uv.lock +1 -1
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/alert-on-pr.yml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/docker.yml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/release.yml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/test_release.yml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.gitignore +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.pre-commit-config.yaml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/CONTRIBUTING.md +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/DOCKER.md +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/Dockerfile +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/LICENSE +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/build.sh +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/glama.json +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/scripts/lint.sh +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/scripts/lint_fix.sh +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/smithery.yaml +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/certs/__init__.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/certs/capella_root_ca.pem +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/mcp_server.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/tools/__init__.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/tools/index.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/tools/kv.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/tools/query.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/tools/server.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/__init__.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/config.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/connection.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/constants.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/context.py +0 -0
- {couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/src/utils/index_utils.py +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
name: Update MCP Registry
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["Build and Push Docker Image"]
|
|
6
|
+
types:
|
|
7
|
+
- completed
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
check-and-update-registry:
|
|
13
|
+
# Only run on tag pushes and if the docker workflow succeeded
|
|
14
|
+
if: |
|
|
15
|
+
github.event.workflow_run.conclusion == 'success' &&
|
|
16
|
+
github.event.workflow_run.event == 'push' &&
|
|
17
|
+
startsWith(github.event.workflow_run.head_branch, 'v')
|
|
18
|
+
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
id-token: write # Required for GitHub OIDC authentication with MCP Registry
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- name: Checkout repository
|
|
26
|
+
uses: actions/checkout@v4
|
|
27
|
+
with:
|
|
28
|
+
ref: ${{ github.event.workflow_run.head_branch }}
|
|
29
|
+
|
|
30
|
+
- name: Wait for PyPI release to complete
|
|
31
|
+
uses: fountainhead/action-wait-for-check@v1.2.0
|
|
32
|
+
id: wait-for-pypi
|
|
33
|
+
with:
|
|
34
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
35
|
+
checkName: "Build and publish Python distributions to PyPI"
|
|
36
|
+
ref: ${{ github.event.workflow_run.head_sha }}
|
|
37
|
+
timeoutSeconds: 600
|
|
38
|
+
intervalSeconds: 10
|
|
39
|
+
|
|
40
|
+
- name: Check PyPI release status
|
|
41
|
+
if: steps.wait-for-pypi.outputs.conclusion != 'success'
|
|
42
|
+
run: |
|
|
43
|
+
echo "PyPI release did not succeed. Status: ${{ steps.wait-for-pypi.outputs.conclusion }}"
|
|
44
|
+
exit 1
|
|
45
|
+
|
|
46
|
+
- name: Validate version consistency
|
|
47
|
+
id: version
|
|
48
|
+
run: |
|
|
49
|
+
# Read versions from files
|
|
50
|
+
ROOT_VERSION=$(jq -r '.version' server.json)
|
|
51
|
+
# Only get versions from packages that have a version field (exclude null/empty)
|
|
52
|
+
PACKAGE_VERSIONS=$(jq -r '.packages[] | select(.version != null) | .version' server.json | sort -u)
|
|
53
|
+
PYPROJECT_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
|
|
54
|
+
TAG_VERSION=${GITHUB_REF_NAME#v}
|
|
55
|
+
|
|
56
|
+
echo "Version Check:"
|
|
57
|
+
echo " server.json root: $ROOT_VERSION"
|
|
58
|
+
echo " server.json packages:"
|
|
59
|
+
jq -r '.packages[] |
|
|
60
|
+
if .version != null then
|
|
61
|
+
" - \(.registryType):\(.identifier) = \(.version)"
|
|
62
|
+
else
|
|
63
|
+
" - \(.registryType):\(.identifier) (no version field)"
|
|
64
|
+
end' server.json
|
|
65
|
+
echo " pyproject.toml: $PYPROJECT_VERSION"
|
|
66
|
+
echo " Git tag: $TAG_VERSION"
|
|
67
|
+
echo ""
|
|
68
|
+
|
|
69
|
+
# Check if all package versions match root version (only for packages with version field)
|
|
70
|
+
MISMATCH=false
|
|
71
|
+
if [ -n "$PACKAGE_VERSIONS" ]; then
|
|
72
|
+
while IFS= read -r pkg_ver; do
|
|
73
|
+
if [ "$pkg_ver" != "$ROOT_VERSION" ]; then
|
|
74
|
+
echo "ERROR: Package version ($pkg_ver) doesn't match root version ($ROOT_VERSION)"
|
|
75
|
+
MISMATCH=true
|
|
76
|
+
fi
|
|
77
|
+
done <<< "$PACKAGE_VERSIONS"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
if [ "$MISMATCH" = true ]; then
|
|
81
|
+
echo ""
|
|
82
|
+
echo "Fix: Update server.json so all package versions match the root version"
|
|
83
|
+
exit 1
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Check if root version matches tag
|
|
87
|
+
if [ "$ROOT_VERSION" != "$TAG_VERSION" ]; then
|
|
88
|
+
echo "ERROR: server.json version ($ROOT_VERSION) doesn't match tag ($TAG_VERSION)"
|
|
89
|
+
echo "Fix: Update server.json root version to match the tag"
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Warn if pyproject.toml doesn't match
|
|
94
|
+
if [ "$PYPROJECT_VERSION" != "$TAG_VERSION" ]; then
|
|
95
|
+
echo "WARNING: pyproject.toml version ($PYPROJECT_VERSION) doesn't match tag ($TAG_VERSION)"
|
|
96
|
+
echo "This may cause PyPI issues"
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Check Docker image tags in OCI identifiers
|
|
100
|
+
echo ""
|
|
101
|
+
echo "Checking Docker image tags..."
|
|
102
|
+
OCI_PACKAGES=$(jq -r '.packages[] | select(.registryType == "oci") | .identifier' server.json)
|
|
103
|
+
if [ -n "$OCI_PACKAGES" ]; then
|
|
104
|
+
OCI_TAG_MISMATCH=false
|
|
105
|
+
while IFS= read -r oci_id; do
|
|
106
|
+
# Extract tag from identifier (everything after last :)
|
|
107
|
+
IMAGE_TAG="${oci_id##*:}"
|
|
108
|
+
echo " - Image: $oci_id"
|
|
109
|
+
echo " Tag: $IMAGE_TAG"
|
|
110
|
+
|
|
111
|
+
if [ "$IMAGE_TAG" != "$ROOT_VERSION" ]; then
|
|
112
|
+
echo " ERROR: Docker image tag ($IMAGE_TAG) doesn't match version ($ROOT_VERSION)"
|
|
113
|
+
OCI_TAG_MISMATCH=true
|
|
114
|
+
else
|
|
115
|
+
echo " Tag matches"
|
|
116
|
+
fi
|
|
117
|
+
done <<< "$OCI_PACKAGES"
|
|
118
|
+
|
|
119
|
+
if [ "$OCI_TAG_MISMATCH" = true ]; then
|
|
120
|
+
echo ""
|
|
121
|
+
echo "Fix: Update Docker image tags in server.json to match the version"
|
|
122
|
+
exit 1
|
|
123
|
+
fi
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
echo ""
|
|
127
|
+
echo "All version checks passed!"
|
|
128
|
+
echo "version=$ROOT_VERSION" >> $GITHUB_OUTPUT
|
|
129
|
+
|
|
130
|
+
- name: Install MCP Publisher
|
|
131
|
+
run: |
|
|
132
|
+
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
|
|
133
|
+
|
|
134
|
+
- name: Login to MCP Registry
|
|
135
|
+
run: ./mcp-publisher login github-oidc
|
|
136
|
+
|
|
137
|
+
- name: Publish to MCP Registry
|
|
138
|
+
run: ./mcp-publisher publish
|
|
139
|
+
|
|
140
|
+
- name: Notify completion
|
|
141
|
+
if: success()
|
|
142
|
+
run: |
|
|
143
|
+
echo "MCP Registry updated successfully for version ${{ steps.version.outputs.version }}"
|
|
144
|
+
echo "Docker image: docker.io/couchbaseecosystem/mcp-server-couchbase:${{ steps.version.outputs.version }}"
|
|
145
|
+
echo "PyPI package: couchbase-mcp-server==${{ steps.version.outputs.version }}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: couchbase-mcp-server
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2rc1
|
|
4
4
|
Summary: Couchbase MCP Server - The Developer Data Platform for Critical Applications in Our AI World
|
|
5
5
|
Project-URL: Homepage, https://github.com/Couchbase-Ecosystem/mcp-server-couchbase
|
|
6
6
|
Project-URL: Documentation, https://github.com/Couchbase-Ecosystem/mcp-server-couchbase#readme
|
|
@@ -32,6 +32,8 @@ An [MCP](https://modelcontextprotocol.io/) server implementation of Couchbase th
|
|
|
32
32
|
<img width="380" height="200" src="https://glama.ai/mcp/servers/@Couchbase-Ecosystem/mcp-server-couchbase/badge" alt="Couchbase Server MCP server" />
|
|
33
33
|
</a>
|
|
34
34
|
|
|
35
|
+
<!-- mcp-name: io.github.Couchbase-Ecosystem/mcp-server-couchbase -->
|
|
36
|
+
|
|
35
37
|
## Features
|
|
36
38
|
|
|
37
39
|
- Get a list of all the buckets in the cluster
|
|
@@ -8,6 +8,8 @@ An [MCP](https://modelcontextprotocol.io/) server implementation of Couchbase th
|
|
|
8
8
|
<img width="380" height="200" src="https://glama.ai/mcp/servers/@Couchbase-Ecosystem/mcp-server-couchbase/badge" alt="Couchbase Server MCP server" />
|
|
9
9
|
</a>
|
|
10
10
|
|
|
11
|
+
<!-- mcp-name: io.github.Couchbase-Ecosystem/mcp-server-couchbase -->
|
|
12
|
+
|
|
11
13
|
## Features
|
|
12
14
|
|
|
13
15
|
- Get a list of all the buckets in the cluster
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Release Process
|
|
2
|
+
|
|
3
|
+
This document describes how to create a new release of `mcp-server-couchbase`.
|
|
4
|
+
|
|
5
|
+
## Release Process
|
|
6
|
+
|
|
7
|
+
### Update Version Numbers
|
|
8
|
+
|
|
9
|
+
**Option A: Use the helper script (Recommended):**
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
./scripts/update_version.sh 0.5.2
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This automatically updates:
|
|
16
|
+
|
|
17
|
+
- `pyproject.toml` version
|
|
18
|
+
- `server.json` root version
|
|
19
|
+
- `server.json` all package versions
|
|
20
|
+
- `server.json` Docker image tags (OCI identifiers)
|
|
21
|
+
- `uv.lock`
|
|
22
|
+
|
|
23
|
+
**Option B: Manual update:**
|
|
24
|
+
|
|
25
|
+
Update the version in all locations:
|
|
26
|
+
|
|
27
|
+
1. **`pyproject.toml`:**
|
|
28
|
+
|
|
29
|
+
```toml
|
|
30
|
+
version = "0.5.2"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. **`server.json`** (root version):
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"version": "0.5.2",
|
|
38
|
+
...
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
3. **`server.json`** (each package version):
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"packages": [
|
|
47
|
+
{
|
|
48
|
+
"version": "0.5.2",
|
|
49
|
+
...
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
4. **`server.json`** (Docker image tags in OCI packages):
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"packages": [
|
|
60
|
+
{
|
|
61
|
+
"registryType": "oci",
|
|
62
|
+
"identifier": "docker.io/couchbaseecosystem/mcp-server-couchbase:0.5.2",
|
|
63
|
+
...
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
5. Update lock file:
|
|
70
|
+
```bash
|
|
71
|
+
uv lock
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
> **Important:** All versions and Docker image tags must match the root version. The CI/CD pipeline validates this and will fail if versions are inconsistent.
|
|
75
|
+
|
|
76
|
+
### 2. Validate Versions
|
|
77
|
+
|
|
78
|
+
Before pushing, verify all versions match:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Check versions
|
|
82
|
+
echo "Checking version consistency..."
|
|
83
|
+
echo "pyproject.toml: $(grep '^version = ' pyproject.toml)"
|
|
84
|
+
echo "server.json root: $(jq -r '.version' server.json)"
|
|
85
|
+
echo "server.json packages:"
|
|
86
|
+
jq -r '.packages[] |
|
|
87
|
+
if .registryType == "oci" then
|
|
88
|
+
" - \(.registryType):\(.identifier) (tag: \(.identifier | split(":")[1]))"
|
|
89
|
+
else
|
|
90
|
+
" - \(.registryType):\(.identifier) (version: \(.version))"
|
|
91
|
+
end' server.json
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Expected output:**
|
|
95
|
+
|
|
96
|
+
- All versions should be `0.5.2`
|
|
97
|
+
- Docker image tag should be `:0.5.2`
|
|
98
|
+
|
|
99
|
+
If versions don't match, run `./scripts/update_version.sh 0.5.2` again.
|
|
100
|
+
|
|
101
|
+
### 3. Commit and Tag
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
git add pyproject.toml server.json uv.lock
|
|
105
|
+
git commit -m "Bump version to 0.5.2"
|
|
106
|
+
git tag v0.5.2
|
|
107
|
+
git push origin main
|
|
108
|
+
git push origin v0.5.2
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> **Important:** Once you push the tag, **all workflows start immediately** and PyPI publishes within ~3 minutes. PyPI versions are **immutable** - if anything fails later, you'll need a new version number. There's no going back!
|
|
112
|
+
|
|
113
|
+
### 4. Automated Pipeline
|
|
114
|
+
|
|
115
|
+
Once the tag is pushed, three GitHub Actions workflows run **in parallel/sequence**:
|
|
116
|
+
|
|
117
|
+
1. **PyPI Release**
|
|
118
|
+
|
|
119
|
+
- Builds Python package
|
|
120
|
+
- Publishes to PyPI as `couchbase-mcp-server`
|
|
121
|
+
- Creates GitHub Release with changelog
|
|
122
|
+
|
|
123
|
+
2. **Docker Build**
|
|
124
|
+
|
|
125
|
+
- Builds multi-architecture images (amd64, arm64)
|
|
126
|
+
- Pushes to Docker Hub as `couchbaseecosystem/mcp-server-couchbase`
|
|
127
|
+
- Updates Docker Hub description
|
|
128
|
+
|
|
129
|
+
3. **MCP Registry Update** (runs after Docker completes)
|
|
130
|
+
- Waits for both PyPI and Docker to complete
|
|
131
|
+
- Validates version consistency
|
|
132
|
+
- Publishes to MCP Registry
|
|
133
|
+
|
|
134
|
+
> **Note:** Version validation happens in the MCP Registry workflow, which runs **after** PyPI and Docker have already published. This is why local validation (step 2) is critical!
|
|
135
|
+
|
|
136
|
+
### 5. Verify Release
|
|
137
|
+
|
|
138
|
+
Check that all three workflows succeeded:
|
|
139
|
+
|
|
140
|
+
- https://github.com/Couchbase-Ecosystem/mcp-server-couchbase/actions
|
|
141
|
+
|
|
142
|
+
Verify the release is available:
|
|
143
|
+
|
|
144
|
+
- PyPI: https://pypi.org/project/couchbase-mcp-server/
|
|
145
|
+
- Docker Hub: https://hub.docker.com/r/couchbaseecosystem/mcp-server-couchbase
|
|
146
|
+
- MCP Registry
|
|
147
|
+
|
|
148
|
+
## Release Candidates
|
|
149
|
+
|
|
150
|
+
**Recommended for first-time releases or major changes.**
|
|
151
|
+
|
|
152
|
+
Release candidates let you test the full release pipeline without committing to a final version number. If something fails, you can fix it and release the final version without version conflicts.
|
|
153
|
+
|
|
154
|
+
**Create an RC release:**
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Update version to RC
|
|
158
|
+
./scripts/update_version.sh 0.5.2rc1
|
|
159
|
+
|
|
160
|
+
# Or manually update pyproject.toml and server.json (root + all packages)
|
|
161
|
+
|
|
162
|
+
# Commit and tag
|
|
163
|
+
git add pyproject.toml server.json uv.lock
|
|
164
|
+
git commit -m "Bump version to 0.5.2rc1"
|
|
165
|
+
git tag v0.5.2rc1
|
|
166
|
+
git push origin main
|
|
167
|
+
git push origin v0.5.2rc1
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**What gets published:**
|
|
171
|
+
|
|
172
|
+
- PyPI: `couchbase-mcp-server==0.5.2rc1`
|
|
173
|
+
- Docker Hub: `couchbaseecosystem/mcp-server-couchbase:0.5.2rc1`
|
|
174
|
+
- MCP Registry: version `0.5.2rc1`
|
|
175
|
+
|
|
176
|
+
**If RC succeeds, release the final version:**
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
./scripts/update_version.sh 0.5.2
|
|
180
|
+
git add pyproject.toml server.json uv.lock
|
|
181
|
+
git commit -m "Bump version to 0.5.2"
|
|
182
|
+
git tag v0.5.2
|
|
183
|
+
git push origin main
|
|
184
|
+
git push origin v0.5.2
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**If RC fails:**
|
|
188
|
+
|
|
189
|
+
- Fix the issues
|
|
190
|
+
- Create `0.5.2rc2` and test again
|
|
191
|
+
- No version conflicts since the final `0.5.2` wasn't published yet!
|
|
192
|
+
|
|
193
|
+
## Troubleshooting
|
|
194
|
+
|
|
195
|
+
### Release Failed
|
|
196
|
+
|
|
197
|
+
**IMPORTANT:** Once PyPI publishes a version, it **cannot be reused**. PyPI versions are immutable.
|
|
198
|
+
|
|
199
|
+
If a release fails after PyPI has published (e.g., Docker build fails, MCP Registry update fails):
|
|
200
|
+
|
|
201
|
+
**Skip to next patch version:**
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# If v0.5.2 was published but release incomplete
|
|
205
|
+
./scripts/update_version.sh 0.5.3
|
|
206
|
+
|
|
207
|
+
git add pyproject.toml server.json uv.lock
|
|
208
|
+
git commit -m "Bump version to 0.5.3"
|
|
209
|
+
git tag v0.5.3
|
|
210
|
+
git push origin main
|
|
211
|
+
git push origin v0.5.3
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Why this happens:**
|
|
215
|
+
|
|
216
|
+
- PyPI, Docker, and MCP Registry workflows all start when you push the tag
|
|
217
|
+
- Version validation only happens in the MCP Registry workflow (which runs last)
|
|
218
|
+
- By that time, PyPI and Docker have already published
|
|
219
|
+
- If validation or MCP Registry publish fails, you can't reuse the version number
|
|
220
|
+
|
|
221
|
+
**Prevention:**
|
|
222
|
+
|
|
223
|
+
- **Always test with RC releases first** (e.g., `0.5.2rc1`)
|
|
224
|
+
- **Use the helper script** (`./scripts/update_version.sh`) to ensure all versions match
|
|
225
|
+
- **Review changes carefully** before pushing the tag (`git diff`)
|
|
226
|
+
- Verify all workflows succeeded before announcing release
|
|
227
|
+
|
|
228
|
+
## How Versioning Works
|
|
229
|
+
|
|
230
|
+
### Version Files
|
|
231
|
+
|
|
232
|
+
All version numbers must be **manually synchronized** across:
|
|
233
|
+
|
|
234
|
+
- **`pyproject.toml`**: Python package version
|
|
235
|
+
- **`server.json` root `version`**: MCP Registry metadata version
|
|
236
|
+
- **`server.json` package `version`**: Must match root version
|
|
237
|
+
- **`server.json` OCI identifiers**: Docker image tags must match root version
|
|
238
|
+
- **Git tag**: Must match all versions
|
|
239
|
+
|
|
240
|
+
### Why All Versions Must Match
|
|
241
|
+
|
|
242
|
+
The CI/CD pipeline validates version consistency and will **fail the build** if:
|
|
243
|
+
|
|
244
|
+
- Package versions in `server.json` don't match the root version
|
|
245
|
+
- Docker image tags in OCI identifiers don't match the root version
|
|
246
|
+
- Root version in `server.json` doesn't match the git tag
|
|
247
|
+
- (Warning only) `pyproject.toml` doesn't match the git tag
|
|
248
|
+
|
|
249
|
+
This ensures:
|
|
250
|
+
|
|
251
|
+
- No accidental version mismatches
|
|
252
|
+
- Consistent versioning across PyPI, Docker, and MCP Registry
|
|
253
|
+
- Valid JSON files that can be tested locally
|
|
254
|
+
- Clear version history in git
|
|
255
|
+
|
|
256
|
+
### Helper Script
|
|
257
|
+
|
|
258
|
+
The `scripts/update_version.sh` script keeps all versions synchronized automatically:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
./scripts/update_version.sh 0.5.2
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
This updates all three locations and runs `uv lock` in one command.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# Simple script to update version in all necessary files
|
|
5
|
+
# Usage: ./scripts/update_version.sh 0.5.2
|
|
6
|
+
|
|
7
|
+
if [ -z "$1" ]; then
|
|
8
|
+
echo "Usage: $0 <new_version>"
|
|
9
|
+
echo "Example: $0 0.5.2"
|
|
10
|
+
echo "Example: $0 0.5.2rc1"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
NEW_VERSION="$1"
|
|
15
|
+
|
|
16
|
+
echo "Updating version to $NEW_VERSION"
|
|
17
|
+
echo ""
|
|
18
|
+
|
|
19
|
+
# Update pyproject.toml
|
|
20
|
+
echo "Updating pyproject.toml..."
|
|
21
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
22
|
+
# macOS
|
|
23
|
+
sed -i '' "s/^version = \".*\"/version = \"$NEW_VERSION\"/" pyproject.toml
|
|
24
|
+
else
|
|
25
|
+
# Linux
|
|
26
|
+
sed -i "s/^version = \".*\"/version = \"$NEW_VERSION\"/" pyproject.toml
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Update server.json (root version, package versions, and Docker image tags)
|
|
30
|
+
echo "Updating server.json..."
|
|
31
|
+
if command -v jq &> /dev/null; then
|
|
32
|
+
# Use jq for safer JSON manipulation
|
|
33
|
+
jq --arg ver "$NEW_VERSION" '
|
|
34
|
+
.version = $ver |
|
|
35
|
+
.packages = [
|
|
36
|
+
.packages[] |
|
|
37
|
+
if .registryType == "oci" then
|
|
38
|
+
# Update Docker image tag (everything after last :)
|
|
39
|
+
# OCI packages should NOT have a separate version field
|
|
40
|
+
.identifier = (.identifier | sub(":[^:]*$"; ":" + $ver))
|
|
41
|
+
else
|
|
42
|
+
# Update version field for non-OCI packages (e.g., PyPI)
|
|
43
|
+
.version = $ver
|
|
44
|
+
end
|
|
45
|
+
]
|
|
46
|
+
' server.json > server.json.tmp
|
|
47
|
+
mv server.json.tmp server.json
|
|
48
|
+
else
|
|
49
|
+
echo "Error: jq is required but not installed"
|
|
50
|
+
echo "Install with: brew install jq (macOS) or apt install jq (Linux)"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Update lock file
|
|
55
|
+
echo "Updating uv.lock"
|
|
56
|
+
uv lock
|
|
57
|
+
|
|
58
|
+
echo ""
|
|
59
|
+
echo "Version updated to $NEW_VERSION in:"
|
|
60
|
+
echo " - pyproject.toml"
|
|
61
|
+
echo " - server.json (root, packages, and Docker image tags)"
|
|
62
|
+
echo " - uv.lock"
|
|
63
|
+
echo ""
|
|
64
|
+
echo "Verification:"
|
|
65
|
+
echo " pyproject.toml: $(grep '^version = ' pyproject.toml)"
|
|
66
|
+
echo " server.json root: $(jq -r '.version' server.json)"
|
|
67
|
+
echo " server.json packages:"
|
|
68
|
+
jq -r '.packages[] |
|
|
69
|
+
if .registryType == "oci" then
|
|
70
|
+
" - \(.registryType):\(.identifier) (tag: \(.identifier | split(":")[1]))"
|
|
71
|
+
else
|
|
72
|
+
" - \(.registryType):\(.identifier) (version: \(.version))"
|
|
73
|
+
end' server.json
|
|
74
|
+
echo ""
|
|
75
|
+
echo "Next steps:"
|
|
76
|
+
echo " 1. Review changes: git diff"
|
|
77
|
+
echo " 2. Commit: git add pyproject.toml server.json uv.lock && git commit -m 'Bump version to $NEW_VERSION'"
|
|
78
|
+
echo " 3. Tag: git tag v$NEW_VERSION"
|
|
79
|
+
echo " 4. Push: git push origin main && git push origin v$NEW_VERSION"
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/Couchbase-Ecosystem/mcp-server-couchbase",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.5.
|
|
9
|
+
"version": "0.5.2rc1",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "couchbase-mcp-server",
|
|
14
|
-
"version": "0.5.
|
|
14
|
+
"version": "0.5.2rc1",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
},
|
|
173
173
|
{
|
|
174
174
|
"registryType": "oci",
|
|
175
|
-
"identifier": "docker.io/couchbaseecosystem/mcp-server-couchbase:0.5.
|
|
175
|
+
"identifier": "docker.io/couchbaseecosystem/mcp-server-couchbase:0.5.2rc1",
|
|
176
176
|
"transport": {
|
|
177
177
|
"type": "stdio"
|
|
178
178
|
},
|
{couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/alert-on-pr.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{couchbase_mcp_server-0.5.1 → couchbase_mcp_server-0.5.2rc1}/.github/workflows/test_release.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|