Skip to content

Commit 53085b7

Browse files
authored
0.3.0 version bump (#326)
* 0.3.0 version bump Signed-off-by: Mihai Criveti <[email protected]> * Added 0.3.0 CHANGELOG Signed-off-by: Mihai Criveti <[email protected]> * Added 0.3.0 README updates Signed-off-by: Mihai Criveti <[email protected]> * Updated roadmap Signed-off-by: Mihai Criveti <[email protected]> --------- Signed-off-by: Mihai Criveti <[email protected]>
1 parent 6f36706 commit 53085b7

26 files changed

+314
-162
lines changed

.bumpversion.cfg

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
[bumpversion]
2-
current_version = 0.2.0
2+
current_version = 0.3.0
33
commit = False
44
tag = False
55
sign-tags = True
66
tag_name = v{new_version} # tag format (only used if you flip tag=True later)
77
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
8-
serialize =
9-
{major}.{minor}.{patch}
8+
serialize =
9+
{major}.{minor}.{patch}
1010

1111
[bumpversion:file:mcpgateway/__init__.py]
1212
search = __version__ = "{current_version}"

.github/tools/cleanup-ghcr-versions.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fi
9292
##############################################################################
9393
ORG="ibm"
9494
PKG="mcp-context-forge"
95-
KEEP_TAGS=( "0.1.0" "v0.1.0" "0.1.1" "v0.1.1" "0.2.0" "v0.2.0" "latest" )
95+
KEEP_TAGS=( "0.1.0" "v0.1.0" "0.1.1" "v0.1.1" "0.2.0" "v0.2.0" "0.3.0" "v0.3.0" "latest" )
9696
PER_PAGE=100
9797

9898
DRY_RUN=${DRY_RUN:-true} # default safe

.github/tools/generate-changelog-info.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#
1616
set -euo pipefail
1717

18-
TAG=${1:-v0.1.1}
18+
TAG=${1:-v0.2.0}
1919
OUT=${2:-changelog_info.txt}
2020

2121
###############################################################################

.github/workflows/docker-release.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
#
55
# This workflow re-tags a Docker image (built by a previous workflow)
66
# when a GitHub Release is published, giving it a semantic version tag
7-
# like `v0.2.0`. It assumes the CI build has already pushed an image
7+
# like `v0.3.0`. It assumes the CI build has already pushed an image
88
# tagged with the commit SHA, and that all checks on that commit passed.
99
#
1010
# ➤ Trigger: Release published (e.g. from GitHub UI or `gh release` CLI)
1111
# ➤ Assumes: Existing image tagged with the commit SHA is available
12-
# ➤ Result: Image re-tagged as `ghcr.io/OWNER/REPO:v0.2.0`
12+
# ➤ Result: Image re-tagged as `ghcr.io/OWNER/REPO:v0.3.0`
1313
#
1414
# ======================================================================
1515

@@ -25,7 +25,7 @@ on:
2525
workflow_dispatch:
2626
inputs:
2727
tag:
28-
description: 'Release tag (e.g., v0.2.0)'
28+
description: 'Release tag (e.g., v0.3.0)'
2929
required: true
3030
type: string
3131

.github/workflows/release-chart.yml.inactive

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name: Release Helm Chart
33
on:
44
release:
5-
types: [published] # tag repo, ex: v0.2.0 to trigger
5+
types: [published] # tag repo, ex: v0.3.0 to trigger
66
permissions:
77
contents: read
88
packages: write

CHANGELOG.md

Lines changed: 130 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,140 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
66

77
---
88

9-
## [0.3.0] - 2025-07-08 (pending)
9+
## [0.3.0] - 2025-07-08
1010

11+
### Added
12+
13+
* **Transport-Translation Bridge (`mcpgateway.translate`)** - bridges local JSON-RPC/stdio servers to HTTP/SSE and vice versa:
14+
* Expose local stdio MCP servers over SSE endpoints with session management
15+
* Bridge remote SSE endpoints to local stdio for seamless integration
16+
* Built-in keepalive mechanisms and unique session identifiers
17+
* Full CLI support: `python -m mcpgateway.translate --stdio "uvx mcp-server-git" --port 9000`
18+
19+
* **Tool Annotations & Metadata** - comprehensive tool annotation system:
20+
* New `annotations` JSON column in tools table for storing rich metadata
21+
* UI support for viewing and managing tool annotations
22+
* Alembic migration scripts for smooth database upgrades (`e4fc04d1a442`)
23+
24+
* **Multi-server Tool Federations** - resolved tool name conflicts across gateways (#116):
25+
* **Composite Key & UUIDs for Tool Identity** - tools now uniquely identified by `(gateway_id, name)` instead of global name uniqueness
26+
* Generated `qualified_name` field (`gateway.tool`) for human-readable tool references
27+
* UUID primary keys for Gateways, Tools, and Servers for future-proof references
28+
* Enables adding multiple gateways with same-named tools (e.g., multiple `google` tools)
29+
30+
* **Auto-healing & Visibility** - enhanced gateway and tool status management (#159):
31+
* **Separated `is_active` into `enabled` and `reachable` fields** for better status granularity (#303)
32+
* Auto-activation of MCP servers when they come back online after being marked unreachable
33+
* Improved status visibility in Admin UI with proper enabled/reachable indicators
34+
35+
* **Export Connection Strings** - one-click client integration (#154):
36+
* Generate ready-made configs for LangChain, Claude Desktop, and other MCP clients
37+
* `/servers/{id}/connect` API endpoint for programmatic access
38+
* Download connection strings directly from Admin UI
39+
40+
* **Configurable Connection Retries** - resilient startup behavior (#179):
41+
* `DB_MAX_RETRIES` and `DB_RETRY_INTERVAL_MS` for database connections
42+
* `REDIS_MAX_RETRIES` and `REDIS_RETRY_INTERVAL_MS` for Redis connections
43+
* Prevents gateway crashes during slow service startup in containerized environments
44+
* Sensible defaults (3 retries × 2000ms) with full configurability
45+
46+
* **Dynamic UI Picker** - enhanced tool/resource/prompt association (#135):
47+
* Searchable multi-select dropdowns replace raw CSV input fields
48+
* Preview tool metadata (description, request type, integration type) in picker
49+
* Maintains API compatibility with CSV backend format
50+
51+
* **Developer Experience Improvements**:
52+
* **Developer Workstation Setup Guide** for Mac (Intel/ARM), Linux, and Windows (#18)
53+
* Comprehensive environment setup instructions including Docker/Podman, WSL2, and common gotchas
54+
* Signing commits guide with proper gitconfig examples
55+
56+
* **Infrastructure & DevOps**:
57+
* **Enhanced Helm charts** with health probes, HPA support, and migration jobs
58+
* **Fast Go MCP server example** (`mcp-fast-time-server`) for high-performance demos (#265)
59+
* Database migration management with proper Alembic integration
60+
* Init containers for database readiness checks
61+
62+
### Changed
63+
64+
* **Database Schema Evolution**:
65+
* `tools.name` no longer globally unique - now uses composite key `(gateway_id, name)`
66+
* Migration from single `is_active` field to separate `enabled` and `reachable` boolean fields
67+
* Added UUID primary keys for better federation support and URL-safe references
68+
* Moved Alembic configuration inside `mcpgateway` package for proper wheel packaging
69+
70+
* **Enhanced Federation Manager**:
71+
* Updated to use new `enabled` and `reachable` fields instead of deprecated `is_active`
72+
* Improved gateway synchronization and health check logic
73+
* Better error handling for offline tools and gateways
74+
75+
* **Improved Code Quality**:
76+
* **Fixed Pydantic v2 compatibility** - replaced deprecated patterns:
77+
* `Field(..., env=...)``model_config` with BaseSettings
78+
* `class Config``model_config = ConfigDict(...)`
79+
* `@validator``@field_validator`
80+
* `.dict()``.model_dump()`, `.parse_obj()``.model_validate()`
81+
* **Replaced deprecated stdlib functions** - `datetime.utcnow()``datetime.now(timezone.utc)`
82+
* **Pylint improvements** across codebase with better configuration and reduced warnings
83+
84+
* **File System & Deployment**:
85+
* **Fixed file lock path** - now correctly uses `/tmp/gateway_service_leader.lock` instead of current directory (#316)
86+
* Improved Docker and Helm deployment with proper health checks and resource limits
87+
* Better CI/CD integration with updated linting and testing workflows
88+
89+
### Fixed
90+
91+
* **UI/UX Fixes**:
92+
* **Close button for parameter input** in Global Tools tab now works correctly (#189)
93+
* **Gateway modal status display** - fixed `isActive``enabled && reachable` logic (#303)
94+
* Dark mode improvements and consistent theme application (#26)
95+
96+
* **API & Backend Fixes**:
97+
* **Gateway reactivation warnings** - fixed 'dict' object Pydantic model errors (#28)
98+
* **GitHub Remote Server addition** - resolved server registration flow issues (#152)
99+
* **REST path parameter substitution** - improved payload handling for REST APIs (#100)
100+
* **Missing await on coroutine** - fixed async response handling in tool service
101+
102+
* **Build & Packaging**:
103+
* **Alembic configuration packaging** - migration scripts now properly included in pip wheels (#302)
104+
* **SBOM generation failure** - fixed documentation build issues (#132)
105+
* **Makefile image target** - resolved Docker build and documentation generation (#131)
106+
107+
* **Testing & Quality**:
108+
* **Improved test coverage** - especially in `test_tool_service.py` reaching 90%+ coverage
109+
* **Redis connection handling** - better error handling and lazy imports
110+
* **Fixed flaky tests** and improved stability across test suite
111+
* **Pydantic v2 compatibility warnings** - resolved deprecated patterns and stdlib functions (#197)
112+
113+
### Security
114+
115+
* **Enhanced connection validation** with configurable retry mechanisms
116+
* **Improved credential handling** in Basic Auth and JWT implementations
117+
* **Better error handling** to prevent information leakage in federation scenarios
118+
119+
---
120+
121+
### 🙌 New contributors in 0.3.0
122+
123+
Thanks to the **first-time contributors** who delivered features in 0.3.0:
11124

12-
## [0.2.1] - 2025-07-01 (pending)
125+
| Contributor | Contributions |
126+
| ------------------------ | --------------------------------------------------------------------------- |
127+
| **Irusha Basukala** | Comprehensive Developer Workstation Setup Guide for Mac, Linux, and Windows |
128+
| **Michael Moyles** | Fixed close button functionality for parameter input scheme in UI |
129+
| **Reeve Barreto** | Configurable connection retries for DB and Redis with extensive testing |
130+
| **Chris PC-39** | Major pylint improvements and code quality enhancements |
131+
| **Ruslan Magana** | Watsonx.ai Agent documentation and integration guides |
132+
| **Shaikh Quader** | macOS-specific setup documentation |
133+
| **Mohan Lakshmaiah** | Test case updates and coverage improvements |
13134

14-
* Allow tool federation across gateways by **allowing tools of same names** from different MCP servers to be added.
15-
* **Fix tool list refresh** from Deactivate/Activate cycles and Edit Gateway screen.
16-
* **Improve tool selection experience for servers** by allowing selection based on name from a dropdown.
135+
### 🙏 Returning contributors who delivered in 0.3.0
17136

137+
| Contributor | Key contributions |
138+
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
139+
| **Mihai Criveti** | **Release coordination**, code reviews, mcpgateway.translate stdio ↔ SSE, overall architecture, Issue Creation, Helm chart enhancements, HPA support, pylint configuration, documentation updates, isort cleanup, and infrastructure improvements |
140+
| **Manav Gupta** | **Transport-Translation Bridge** mcpgateway.translate Reverse SSE ↔ stdio bridging, |
141+
| **Madhav Kandukuri** | **Composite Key & UUIDs migration**, Alembic integration, extensive test coverage improvements, database schema evolution, and tool service enhancements |
142+
| **Keval Mahajan** | **Auto-healing capabilities**, enabled/reachable status migration, federation UI improvements, file lock path fixes, and wrapper functionality |
18143

19144
## [0.2.0] - 2025-06-24
20145

Containerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM registry.access.redhat.com/ubi9-minimal:9.6-1750782676
22
LABEL maintainer="Mihai Criveti" \
33
name="mcp/mcpgateway" \
4-
version="0.2.0" \
4+
version="0.3.0" \
55
description="MCP Gateway: An enterprise-ready Model Context Protocol Gateway"
66

77
ARG PYTHON_VERSION=3.11

Containerfile.lite

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ LABEL maintainer="Mihai Criveti" \
106106
org.opencontainers.image.title="mcp/mcpgateway" \
107107
org.opencontainers.image.description="MCP Gateway: An enterprise-ready Model Context Protocol Gateway" \
108108
org.opencontainers.image.licenses="Apache-2.0" \
109-
org.opencontainers.image.version="0.2.0"
109+
org.opencontainers.image.version="0.3.0"
110110

111111
# ----------------------------------------------------------------------------
112112
# Copy the entire prepared root filesystem from the builder stage

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1420,7 +1420,7 @@ MINIKUBE_ADDONS ?= ingress ingress-dns metrics-server dashboard registry regist
14201420
# OCI image tag to preload into the cluster.
14211421
# - By default we point to the *local* image built via `make docker-prod`, e.g.
14221422
# mcpgateway/mcpgateway:latest. Override with IMAGE=<repo:tag> to use a
1423-
# remote registry (e.g. ghcr.io/ibm/mcp-context-forge:v0.2.0).
1423+
# remote registry (e.g. ghcr.io/ibm/mcp-context-forge:v0.3.0).
14241424
TAG ?= latest # override with TAG=<ver>
14251425
IMAGE ?= $(IMG):$(TAG) # or IMAGE=ghcr.io/ibm/mcp-context-forge:$(TAG)
14261426

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -336,13 +336,13 @@ docker run -d --name mcpgateway \
336336
-e BASIC_AUTH_PASSWORD=changeme \
337337
-e AUTH_REQUIRED=true \
338338
-e DATABASE_URL=sqlite:///./mcp.db \
339-
ghcr.io/ibm/mcp-context-forge:0.2.0
339+
ghcr.io/ibm/mcp-context-forge:0.3.0
340340

341341
# Tail logs (Ctrl+C to quit)
342342
docker logs -f mcpgateway
343343

344344
# Generating an API key
345-
docker run --rm -it ghcr.io/ibm/mcp-context-forge:0.2.0 \
345+
docker run --rm -it ghcr.io/ibm/mcp-context-forge:0.3.0 \
346346
python -m mcpgateway.utils.create_jwt_token --username admin --exp 0 --secret my-test-key
347347
```
348348

@@ -362,7 +362,7 @@ docker run -d --name mcpgateway \
362362
-e JWT_SECRET_KEY=my-test-key \
363363
-e BASIC_AUTH_USER=admin \
364364
-e BASIC_AUTH_PASSWORD=changeme \
365-
ghcr.io/ibm/mcp-context-forge:0.2.0
365+
ghcr.io/ibm/mcp-context-forge:0.3.0
366366
```
367367

368368
SQLite now lives on the host at `./data/mcp.db`.
@@ -376,7 +376,7 @@ docker run -d --name mcpgateway \
376376
-e PORT=4444 \
377377
-e DATABASE_URL=sqlite:////data/mcp.db \
378378
-v $(pwd)/data:/data \
379-
ghcr.io/ibm/mcp-context-forge:0.2.0
379+
ghcr.io/ibm/mcp-context-forge:0.3.0
380380
```
381381

382382
Using `--network=host` allows Docker to access the local network, allowing you to add MCP servers running on your host. See [Docker Host network driver documentation](https://docs.docker.com/engine/network/drivers/host/) for more details.
@@ -392,7 +392,7 @@ podman run -d --name mcpgateway \
392392
-p 4444:4444 \
393393
-e HOST=0.0.0.0 \
394394
-e DATABASE_URL=sqlite:///./mcp.db \
395-
ghcr.io/ibm/mcp-context-forge:0.2.0
395+
ghcr.io/ibm/mcp-context-forge:0.3.0
396396
```
397397

398398
#### 2 - Persist SQLite
@@ -405,7 +405,7 @@ podman run -d --name mcpgateway \
405405
-p 4444:4444 \
406406
-v $(pwd)/data:/data \
407407
-e DATABASE_URL=sqlite:////data/mcp.db \
408-
ghcr.io/ibm/mcp-context-forge:0.2.0
408+
ghcr.io/ibm/mcp-context-forge:0.3.0
409409
```
410410

411411
#### 3 - Host networking (rootless)
@@ -415,7 +415,7 @@ podman run -d --name mcpgateway \
415415
--network=host \
416416
-v $(pwd)/data:/data \
417417
-e DATABASE_URL=sqlite:////data/mcp.db \
418-
ghcr.io/ibm/mcp-context-forge:0.2.0
418+
ghcr.io/ibm/mcp-context-forge:0.3.0
419419
```
420420

421421
---
@@ -424,7 +424,7 @@ podman run -d --name mcpgateway \
424424
<summary><strong>✏️ Docker/Podman tips</strong></summary>
425425

426426
* **.env files** - Put all the `-e FOO=` lines into a file and replace them with `--env-file .env`. See the provided [.env.example](.env.example) for reference.
427-
* **Pinned tags** - Use an explicit version (e.g. `v0.2.0`) instead of `latest` for reproducible builds.
427+
* **Pinned tags** - Use an explicit version (e.g. `v0.3.0`) instead of `latest` for reproducible builds.
428428
* **JWT tokens** - Generate one in the running container:
429429

430430
```bash
@@ -470,7 +470,7 @@ docker run --rm -i \
470470
-e MCP_SERVER_CATALOG_URLS=http://host.docker.internal:4444/servers/UUID_OF_SERVER_1 \
471471
-e MCP_TOOL_CALL_TIMEOUT=120 \
472472
-e MCP_WRAPPER_LOG_LEVEL=DEBUG \
473-
ghcr.io/ibm/mcp-context-forge:0.2.0 \
473+
ghcr.io/ibm/mcp-context-forge:0.3.0 \
474474
python3 -m mcpgateway.wrapper
475475
```
476476

@@ -518,7 +518,7 @@ python3 -m mcpgateway.wrapper
518518
<summary><strong>Expected responses from mcpgateway.wrapper</strong></summary>
519519

520520
```json
521-
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-03-26","capabilities":{"experimental":{},"prompts":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false},"tools":{"listChanged":false}},"serverInfo":{"name":"mcpgateway-wrapper","version":"0.2.0"}}}
521+
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-03-26","capabilities":{"experimental":{},"prompts":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false},"tools":{"listChanged":false}},"serverInfo":{"name":"mcpgateway-wrapper","version":"0.3.0"}}}
522522

523523
# When there's no tools
524524
{"jsonrpc":"2.0","id":2,"result":{"tools":[]}}
@@ -550,7 +550,7 @@ docker run -i --rm \
550550
-e MCP_SERVER_CATALOG_URLS=http://localhost:4444/servers/UUID_OF_SERVER_1 \
551551
-e MCP_AUTH_TOKEN=${MCPGATEWAY_BEARER_TOKEN} \
552552
-e MCP_TOOL_CALL_TIMEOUT=120 \
553-
ghcr.io/ibm/mcp-context-forge:0.2.0 \
553+
ghcr.io/ibm/mcp-context-forge:0.3.0 \
554554
python3 -m mcpgateway.wrapper
555555
```
556556

0 commit comments

Comments
 (0)