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
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.7.0
current_version = 0.8.0
commit = False
tag = False
sign-tags = True
Expand Down
6 changes: 2 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ APP_ROOT_PATH=
DOCS_ALLOW_BASIC_AUTH=false

# Database Configuration
# Optimized for v0.7.0 multitenancy with enhanced connection pooling and timeouts

# SQLite (default) - good for development and small deployments
# macOS note: If you see "sqlite3.OperationalError: disk I/O error" on macOS when running
# `make serve`, move the DB to a safe APFS path (avoid iCloud/Dropbox/OneDrive/Google Drive,
Expand All @@ -51,7 +49,7 @@ DATABASE_URL=sqlite:///./mcp.db
# For localhost: mysql+pymysql://mysql:changeme@localhost:3306/mcp
# DATABASE_URL=mysql+pymysql://mysql:changeme@localhost:3306/mcp

# Database Connection Pool Configuration (optimized for v0.7.0 multitenancy)
# Database Connection Pool Configuration
# Maximum number of persistent connections (default: 200, optimized for SQLite)
DB_POOL_SIZE=200
# Additional connections beyond pool_size (default: 10, reduced for SQLite)
Expand Down Expand Up @@ -375,7 +373,7 @@ MCPGATEWAY_A2A_METRICS_ENABLED=true
# MCP Server Catalog Configuration
#####################################

# Enable MCP server catalog feature (NEW in v0.7.0)
# Enable MCP server catalog feature
# Allows defining a catalog of pre-configured MCP servers in a YAML file
# for easy discovery and management via the Admin UI
# Options: true (default), false
Expand Down
2 changes: 1 addition & 1 deletion .github/tools/cleanup-ghcr-versions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fi
##############################################################################
ORG="ibm"
PKG="mcp-context-forge"
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" "0.4.0" "v0.4.0" "0.5.0" "v0.5.0" "0.6.0" "v0.6.0" "0.7.0" "v0.7.0" "latest" )
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" "0.4.0" "v0.4.0" "0.5.0" "v0.5.0" "0.6.0" "v0.6.0" "0.7.0" "v0.7.0" "0.8.0" "v0.8.0" "latest" )
PER_PAGE=100

DRY_RUN=${DRY_RUN:-true} # default safe
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/docker-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
#
# This workflow re-tags a Docker image (built by a previous workflow)
# when a GitHub Release is published, giving it a semantic version tag
# like `v0.7.0`. It assumes the CI build has already pushed an image
# like `v0.8.0`. It assumes the CI build has already pushed an image
# tagged with the commit SHA, and that all checks on that commit passed.
#
# ➤ Trigger: Release published (e.g. from GitHub UI or `gh release` CLI)
# ➤ Assumes: Existing image tagged with the commit SHA is available
# ➤ Result: Image re-tagged as `ghcr.io/OWNER/REPO:v0.7.0`
# ➤ Result: Image re-tagged as `ghcr.io/OWNER/REPO:v0.8.0`
#
# ======================================================================

Expand All @@ -25,7 +25,7 @@ on:
workflow_dispatch:
inputs:
tag:
description: 'Release tag (e.g., v0.7.0)'
description: 'Release tag (e.g., v0.8.0)'
required: true
type: string

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-chart.yml.inactive
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name: Release Helm Chart
on:
release:
types: [published] # tag repo, ex: v0.7.0 to trigger
types: [published] # tag repo, ex: v0.8.0 to trigger
permissions:
contents: read
packages: write
Expand Down
2 changes: 1 addition & 1 deletion Containerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM registry.access.redhat.com/ubi10-minimal:10.0-1755721767
LABEL maintainer="Mihai Criveti" \
name="mcp/mcpgateway" \
version="0.7.0" \
version="0.8.0" \
description="MCP Gateway: An enterprise-ready Model Context Protocol Gateway"

ARG PYTHON_VERSION=3.12
Expand Down
2 changes: 1 addition & 1 deletion Containerfile.lite
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ LABEL maintainer="Mihai Criveti" \
org.opencontainers.image.title="mcp/mcpgateway" \
org.opencontainers.image.description="MCP Gateway: An enterprise-ready Model Context Protocol Gateway" \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.version="0.7.0"
org.opencontainers.image.version="0.8.0"

# ----------------------------------------------------------------------------
# Copy the entire prepared root filesystem from the builder stage
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2748,7 +2748,7 @@ MINIKUBE_ADDONS ?= ingress ingress-dns metrics-server dashboard registry regist
# OCI image tag to preload into the cluster.
# - By default we point to the *local* image built via `make docker-prod`, e.g.
# mcpgateway/mcpgateway:latest. Override with IMAGE=<repo:tag> to use a
# remote registry (e.g. ghcr.io/ibm/mcp-context-forge:v0.7.0).
# remote registry (e.g. ghcr.io/ibm/mcp-context-forge:v0.8.0).
TAG ?= latest # override with TAG=<ver>
IMAGE ?= $(IMG):$(TAG) # or IMAGE=ghcr.io/ibm/mcp-context-forge:$(TAG)

Expand Down Expand Up @@ -3383,7 +3383,7 @@ devpi-unconfigure-pip:

# ─────────────────────────────────────────────────────────────────────────────
# 📦 Version helper (defaults to the version in pyproject.toml)
# override on the CLI: make VER=0.7.0 devpi-delete
# override on the CLI: make VER=0.8.0 devpi-delete
# ─────────────────────────────────────────────────────────────────────────────
VER ?= $(shell python3 -c "import tomllib, pathlib; \
print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])" \
Expand Down Expand Up @@ -4577,7 +4577,7 @@ MIGRATION_TEST_DIR := tests/migration
MIGRATION_REPORTS_DIR := $(MIGRATION_TEST_DIR)/reports

# Get supported versions from version config (n-2 policy)
MIGRATION_VERSIONS := $(shell cd $(MIGRATION_TEST_DIR) && python3 -c "from version_config import get_supported_versions; print(' '.join(get_supported_versions()))" 2>/dev/null || echo "0.5.0 0.7.0 latest")
MIGRATION_VERSIONS := $(shell cd $(MIGRATION_TEST_DIR) && python3 -c "from version_config import get_supported_versions; print(' '.join(get_supported_versions()))" 2>/dev/null || echo "0.5.0 0.8.0 latest")

.PHONY: migration-test-all migration-test-sqlite migration-test-postgres migration-test-performance \
migration-setup migration-cleanup migration-debug migration-status
Expand Down
32 changes: 15 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,7 @@ ContextForge MCP Gateway is a feature-rich gateway, proxy and MCP Registry that

## 🚀 Overview & Goals

**ContextForge** is a gateway, registry, and proxy that sits in front of any [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server or REST API-exposing a unified endpoint for all your AI clients.

**⚠️ Caution**: The current release (0.7.0) is considered alpha / early beta. It is not production-ready and should only be used for local development, testing, or experimentation. Features, APIs, and behaviors are subject to change without notice. **Do not** deploy in production environments without thorough security review, validation and additional security mechanisms. Many of the features required for secure, large-scale, or multi-tenant production deployments are still on the [project roadmap](https://ibm.github.io/mcp-context-forge/architecture/roadmap/) - which is itself evolving.
**ContextForge** is a gateway, registry, and proxy that sits in front of any [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server, A2A server or REST API-exposing a unified endpoint for all your AI clients. See the [project roadmap](https://ibm.github.io/mcp-context-forge/architecture/roadmap/) for more details.

It currently supports:

Expand All @@ -142,9 +140,9 @@ It currently supports:

For a list of upcoming features, check out the [ContextForge Roadmap](https://ibm.github.io/mcp-context-forge/architecture/roadmap/)

> Note on Multi‑Tenancy (v0.7.0): A comprehensive multi‑tenant architecture with email authentication, teams, RBAC, and resource visibility is landing in v0.7.0. See the [Migration Guide](https://github.com/IBM/mcp-context-forge/blob/main/MIGRATION-0.7.0.md) and [Changelog](https://github.com/IBM/mcp-context-forge/blob/main/CHANGELOG.md) for details.
> Note on Multi‑Tenancy (v0.7.0): A comprehensive multi‑tenant architecture with email authentication, teams, RBAC, and resource visibility is available since v0.7.0. If upgrading from an older version, see the [Migration Guide](https://github.com/IBM/mcp-context-forge/blob/main/MIGRATION-0.7.0.md) and [Changelog](https://github.com/IBM/mcp-context-forge/blob/main/CHANGELOG.md) for details.

**⚠️ Important**: MCP Gateway is not a standalone product - it is an open source component with **NO OFFICIAL SUPPORT** from IBM or its affiliates that can be integrated into your own solution architecture. If you choose to use it, you are responsible for evaluating its fit, securing the deployment, and managing its lifecycle. See [SECURITY.md](./SECURITY.md) for more details.
**⚠️ Important**: See [SECURITY.md](./SECURITY.md) for more details.

---

Expand Down Expand Up @@ -484,13 +482,13 @@ docker run -d --name mcpgateway \
-e PLATFORM_ADMIN_PASSWORD=changeme \
-e PLATFORM_ADMIN_FULL_NAME="Platform Administrator" \
-e DATABASE_URL=sqlite:///./mcp.db \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0

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

# Generating an API key
docker run --rm -it ghcr.io/ibm/mcp-context-forge:0.7.0 \
docker run --rm -it ghcr.io/ibm/mcp-context-forge:0.8.0 \
python3 -m mcpgateway.utils.create_jwt_token --username [email protected] --exp 0 --secret my-test-key
```

Expand Down Expand Up @@ -521,7 +519,7 @@ docker run -d --name mcpgateway \
-e [email protected] \
-e PLATFORM_ADMIN_PASSWORD=changeme \
-e PLATFORM_ADMIN_FULL_NAME="Platform Administrator" \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0
```

SQLite now lives on the host at `./data/mcp.db`.
Expand All @@ -548,7 +546,7 @@ docker run -d --name mcpgateway \
-e PLATFORM_ADMIN_PASSWORD=changeme \
-e PLATFORM_ADMIN_FULL_NAME="Platform Administrator" \
-v $(pwd)/data:/data \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0
```

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.
Expand All @@ -564,7 +562,7 @@ podman run -d --name mcpgateway \
-p 4444:4444 \
-e HOST=0.0.0.0 \
-e DATABASE_URL=sqlite:///./mcp.db \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0
```

#### 2 - Persist SQLite
Expand All @@ -583,7 +581,7 @@ podman run -d --name mcpgateway \
-p 4444:4444 \
-v $(pwd)/data:/data \
-e DATABASE_URL=sqlite:////data/mcp.db \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0
```

#### 3 - Host networking (rootless)
Expand All @@ -601,7 +599,7 @@ podman run -d --name mcpgateway \
--network=host \
-v $(pwd)/data:/data \
-e DATABASE_URL=sqlite:////data/mcp.db \
ghcr.io/ibm/mcp-context-forge:0.7.0
ghcr.io/ibm/mcp-context-forge:0.8.0
```

---
Expand All @@ -610,7 +608,7 @@ podman run -d --name mcpgateway \
<summary><strong>✏️ Docker/Podman tips</strong></summary>

* **.env files** - Put all the `-e FOO=` lines into a file and replace them with `--env-file .env`. See the provided [.env.example](https://github.com/IBM/mcp-context-forge/blob/main/.env.example) for reference.
* **Pinned tags** - Use an explicit version (e.g. `v0.7.0`) instead of `latest` for reproducible builds.
* **Pinned tags** - Use an explicit version (e.g. `v0.8.0`) instead of `latest` for reproducible builds.
* **JWT tokens** - Generate one in the running container:

```bash
Expand Down Expand Up @@ -656,7 +654,7 @@ docker run --rm -i \
-e MCP_SERVER_URL=http://host.docker.internal:4444/servers/UUID_OF_SERVER_1/mcp \
-e MCP_TOOL_CALL_TIMEOUT=120 \
-e MCP_WRAPPER_LOG_LEVEL=DEBUG \
ghcr.io/ibm/mcp-context-forge:0.7.0 \
ghcr.io/ibm/mcp-context-forge:0.8.0 \
python3 -m mcpgateway.wrapper
```

Expand Down Expand Up @@ -704,7 +702,7 @@ python3 -m mcpgateway.wrapper
<summary><strong>Expected responses from mcpgateway.wrapper</strong></summary>

```json
{"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.7.0"}}}
{"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.8.0"}}}

# When there's no tools
{"jsonrpc":"2.0","id":2,"result":{"tools":[]}}
Expand Down Expand Up @@ -738,7 +736,7 @@ docker run -i --rm \
-e MCP_SERVER_URL=http://localhost:4444/servers/UUID_OF_SERVER_1/mcp \
-e MCP_AUTH=${MCP_AUTH} \
-e MCP_TOOL_CALL_TIMEOUT=120 \
ghcr.io/ibm/mcp-context-forge:0.7.0 \
ghcr.io/ibm/mcp-context-forge:0.8.0 \
python3 -m mcpgateway.wrapper
```

Expand Down Expand Up @@ -1422,7 +1420,7 @@ MCP Gateway includes **vendor-agnostic OpenTelemetry support** for distributed t
| ------------------------------- | ---------------------------------------------- | --------------------- | ------------------------------------------ |
| `OTEL_ENABLE_OBSERVABILITY` | Master switch for observability | `true` | `true`, `false` |
| `OTEL_SERVICE_NAME` | Service identifier in traces | `mcp-gateway` | string |
| `OTEL_SERVICE_VERSION` | Service version in traces | `0.7.0` | string |
| `OTEL_SERVICE_VERSION` | Service version in traces | `0.8.0` | string |
| `OTEL_DEPLOYMENT_ENVIRONMENT` | Environment tag (dev/staging/prod) | `development` | string |
| `OTEL_TRACES_EXPORTER` | Trace exporter backend | `otlp` | `otlp`, `jaeger`, `zipkin`, `console`, `none` |
| `OTEL_RESOURCE_ATTRIBUTES` | Custom resource attributes | (empty) | `key=value,key2=value2` |
Expand Down
20 changes: 4 additions & 16 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
# 🔐 Security Policy

**⚠️ Important**: MCP Gateway is an **OPEN SOURCE PROJECT** provided "as-is" with **NO OFFICIAL SUPPORT** from IBM or its affiliates. Community contributions and best-effort maintenance are provided by project maintainers and contributors.
## ⚠️ Beta Software Notice

**⚠️ Important**: MCP Gateway is not a standalone product - it is an open source component that can be integrated into your own solution architecture. If you choose to use it, you are responsible for evaluating its fit, securing the deployment, and managing its lifecycle.
**Current Version: 0.8.0 (Beta)**

## ⚠️ Early Beta Software Notice

**Current Version: 0.7.0 (Beta)**

MCP Gateway is currently in early beta and should be treated as such until the 1.0 release. While we implement comprehensive security measures and follow best practices, important limitations exist:
MCP Gateway is currently in beta and should be treated as such until the 1.0 release. While we implement comprehensive security measures and follow best practices, important limitations exist:

### Admin UI is Development-Only

Expand Down Expand Up @@ -59,16 +55,8 @@ For production deployments:

### Multi-Tenancy Considerations

**MCP Gateway is not yet multi-tenant ready**. If you're building a platform that serves multiple users or teams, you must implement the following in your own application layer:

- **User isolation and data segregation** - ensure users cannot access each other's configurations
- **Role-Based Access Control (RBAC)** - manage permissions per user/team/organization
- **Resource cleanup and lifecycle management** - handle orphaned resources and quota enforcement
- **Additional input validation** - enforce tenant-specific business rules and limits
- **Audit logging** - track actions per user for compliance and security
- **Team and organization management** - handle user groups and hierarchies
Please review https://ibm.github.io/mcp-context-forge/architecture/multitenancy/

MCP Gateway should be deployed as a **single-tenant component** within your larger multi-tenant architecture. Many enterprise features including native RBAC, team management, and tenant isolation are planned - see our [Roadmap](https://ibm.github.io/mcp-context-forge/architecture/roadmap/) for upcoming releases.

### General Beta Limitations

Expand Down
4 changes: 2 additions & 2 deletions charts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ Below is a minimal example. Copy the default file and adjust for your environmen
mcpContextForge:
image:
repository: ghcr.io/ibm/mcp-context-forge
tag: 0.7.0
tag: 0.8.0
ingress:
enabled: true
host: gateway.local # replace with real DNS
Expand Down Expand Up @@ -434,7 +434,7 @@ For every setting see the [full annotated `values.yaml`](https://github.com/IBM/
* 💾 Stateful storage - PV + PVC for Postgres (`/var/lib/postgresql/data`), storage class selectable.
* 🌐 Networking & access - ClusterIP services, optional NGINX Ingress, and `NOTES.txt` with port-forward plus safe secret-fetch commands (password, bearer token, `JWT_SECRET_KEY`).
* 📈 Replicas & availability - Gateway (3) and Fast-Time-Server (2) provide basic HA; stateful components run single-instance.
* 📦 Helm best-practice layout - Clear separation of Deployments, Services, ConfigMaps, Secrets, PVC/PV and Ingress; chart version 0.7.0.
* 📦 Helm best-practice layout - Clear separation of Deployments, Services, ConfigMaps, Secrets, PVC/PV and Ingress; chart version 0.8.0.
* ⚙️ Horizontal Pod Autoscaler (HPA) support for mcpgateway

---
Expand Down
4 changes: 2 additions & 2 deletions charts/mcp-stack/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,8 @@ When making changes:
Update both `version` and `appVersion` in `Chart.yaml`:

```yaml
version: 0.7.0 # Chart version
appVersion: "0.7.0" # Application version
version: 0.8.0 # Chart version
appVersion: "0.8.0" # Application version
```

### Release Checklist
Expand Down
4 changes: 2 additions & 2 deletions charts/mcp-stack/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ type: application
# * appVersion - upstream application version; shown in UIs but not
# used for upgrade logic.
# --------------------------------------------------------------------
version: 0.7.0
appVersion: "0.7.0"
version: 0.8.0
appVersion: "0.8.0"

# Icon shown by registries / dashboards (must be an http(s) URL).
icon: https://raw.githubusercontent.com/IBM/mcp-context-forge/main/docs/theme/logo.png
Expand Down
4 changes: 2 additions & 2 deletions charts/mcp-stack/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# mcp-stack

![Version: 0.7.0](https://img.shields.io/badge/Version-0.7.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.7.0](https://img.shields.io/badge/AppVersion-0.7.0-informational?style=flat-square)
![Version: 0.8.0](https://img.shields.io/badge/Version-0.8.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.8.0](https://img.shields.io/badge/AppVersion-0.8.0-informational?style=flat-square)

A full-stack Helm chart for IBM's **Model Context Protocol (MCP) Gateway
& Registry - Context-Forge**. It bundles:
Expand Down Expand Up @@ -290,7 +290,7 @@ Kubernetes: `>=1.21.0`
| mcpFastTimeServer.enabled | bool | `true` | |
| mcpFastTimeServer.replicaCount | int | `2` | |
| mcpFastTimeServer.image.repository | string | `"ghcr.io/ibm/fast-time-server"` | |
| mcpFastTimeServer.image.tag | string | `"0.7.0"` | |
| mcpFastTimeServer.image.tag | string | `"0.8.0"` | |
| mcpFastTimeServer.image.pullPolicy | string | `"IfNotPresent"` | |
| mcpFastTimeServer.port | int | `8080` | |
| mcpFastTimeServer.ingress.enabled | bool | `true` | |
Expand Down
2 changes: 1 addition & 1 deletion charts/mcp-stack/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -1208,7 +1208,7 @@
"tag": {
"type": "string",
"description": "Image tag",
"default": "0.7.0"
"default": "0.8.0"
},
"pullPolicy": {
"type": "string",
Expand Down
2 changes: 1 addition & 1 deletion charts/mcp-stack/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@ mcpFastTimeServer:
replicaCount: 2
image:
repository: ghcr.io/ibm/fast-time-server
tag: "0.7.0"
tag: "0.8.0"
pullPolicy: IfNotPresent
port: 8080

Expand Down
Loading
Loading