Skip to content

ADR-0020: Multi-Format Packaging StrategyΒΆ

  • Status: Accepted
  • Date: 2025-10-27
  • Deciders: Core Engineering Team

ContextΒΆ

ContextForge supports diverse deployment scenarios with different packaging requirements:

  • Developers need easy installation for local development (pip install)
  • Serverless platforms (Lambda, Cloud Run) need container images or deployment packages
  • Kubernetes/OpenShift operators need Helm charts with configurable values
  • Edge deployments need lightweight static binaries
  • CI/CD pipelines need multi-arch container images
  • Enterprise users need signed releases with SBOM and provenance

Each deployment target has different constraints:

  • PyPI packages work for Python environments
  • Container images work for Kubernetes, serverless containers
  • Helm charts simplify Kubernetes deployments
  • Static binaries work for edge devices without Python runtime
  • Multi-arch support needed for amd64 (x86_64) and arm64 (Apple Silicon, AWS Graviton)

DecisionΒΆ

We will package ContextForge in multiple formats to support all deployment scenarios:

1. PyPI Packages (Python Distribution)ΒΆ

Core packages:

  • mcp-contextforge-gateway - Core gateway application
  • mcp-contextforge-gateway-ui - Admin UI (installs as plugin)
  • mcp-contextforge-translate - Protocol bridge utility
  • mcp-contextforge-wrapper - MCP client wrapper
  • mcp-contextforge-reverse-proxy - NAT traversal proxy

Plugin packages:

  • mcp-contextforge-plugin-framework - Plugin framework
  • Individual plugins: mcp-contextforge-plugin-{name} (40+ packages)
  • Meta package: mcp-contextforge-plugins-all (installs all plugins)

MCP Server packages:

  • Individual servers: mcp-server-{name} (Python servers)
  • Rust plugin wheels with PyO3 (cross-compiled for amd64/arm64)

Installation:

# Core gateway
pip install mcp-contextforge-gateway

# With all plugins
pip install mcp-contextforge-gateway mcp-contextforge-plugins-all

# Standalone utility
pip install mcp-contextforge-translate

2. Container Images (Docker/Podman)ΒΆ

Images hosted on GitHub Container Registry (ghcr.io):

  • ghcr.io/contextforge-org/mcp-gateway:latest - Core gateway
  • ghcr.io/contextforge-org/mcp-gateway-ui:latest - Gateway + UI
  • ghcr.io/contextforge-org/translate:latest - Translate utility
  • ghcr.io/contextforge-org/wrapper:latest - Wrapper utility
  • ghcr.io/contextforge-org/reverse-proxy:latest - Reverse proxy
  • Per-server images: ghcr.io/contextforge-org/mcp-server-{name}:latest

Multi-arch support:

  • linux/amd64 (x86_64) - Standard Intel/AMD servers
  • linux/arm64 (aarch64) - Apple Silicon, AWS Graviton, Raspberry Pi

Image features:

  • Minimal base images (Alpine Linux where possible)
  • Non-root user for security
  • Health check endpoints configured
  • Multi-stage builds for smaller images
  • Signed with cosign (keyless OIDC)
  • SBOM included (Syft, SPDX format)

Usage:

# Run core gateway
docker run -p 4444:4444 ghcr.io/contextforge-org/mcp-gateway:latest

# Run on ARM64 (Apple Silicon)
docker run --platform linux/arm64 ghcr.io/contextforge-org/mcp-gateway:latest

3. Helm Charts (Kubernetes Deployment)ΒΆ

Chart repository:

  • OCI registry: oci://ghcr.io/contextforge-org/helm-charts/mcp-stack
  • Artifact Hub: Public listing for discoverability

Chart features:

  • Configurable resource limits and requests
  • Horizontal Pod Autoscaler (HPA) support
  • PostgreSQL and Redis dependencies (optional)
  • Ingress configuration (nginx, Traefik, Istio)
  • ConfigMap for environment variables
  • Secrets management integration
  • Pod disruption budgets
  • Network policies
  • Service mesh compatibility (Istio, Linkerd)

Installation:

# Add Helm repo
helm repo add contextforge oci://ghcr.io/contextforge-org/helm-charts

# Install with default values
helm install mcp-stack contextforge/mcp-stack

# Install with custom values (production)
helm install mcp-stack contextforge/mcp-stack \
  -f production-values.yaml \
  --set replicaCount=5 \
  --set hpa.enabled=true

4. Static Binaries (Go/Rust Servers)ΒΆ

Binary targets:

  • Go servers: Cross-compiled Go executables (5-15 MB)
  • Rust servers: Static Rust binaries (3-10 MB)
  • Platforms: linux-amd64, linux-arm64, darwin-amd64, darwin-arm64, windows-amd64

Distribution:

  • GitHub Releases with checksums
  • Signed with GPG and cosign
  • SLSA Build Level 3 provenance

Usage:

# Download and run Go server
curl -LO https://github.com/contextforge-org/mcp-servers-go/releases/download/v1.0.0/mcp-server-time-linux-amd64
chmod +x mcp-server-time-linux-amd64
./mcp-server-time-linux-amd64 --port 9000

ConsequencesΒΆ

PositiveΒΆ

  • 🎯 Right tool for the job - Each deployment gets optimal packaging format
  • 🐍 Easy development - pip install for local development
  • 🐳 Cloud-native - Container images for Kubernetes, serverless
  • ☸️ Simplified K8s - Helm charts with best practices and HPA
  • πŸš€ Edge deployments - Static binaries for minimal environments
  • 🌍 Multi-arch support - Works on x86_64 and ARM64 (Apple Silicon, Graviton)
  • πŸ”’ Supply chain security - Signed releases, SBOM, provenance

NegativeΒΆ

  • πŸ”§ Maintenance overhead - Multiple build pipelines and release processes
  • πŸ“¦ Storage costs - Container images and binaries consume registry space
  • πŸ”„ Version synchronization - Must keep package versions aligned
  • πŸ“š Documentation - Need installation guides for each format

NeutralΒΆ

  • πŸ—οΈ CI/CD complexity - GitHub Actions workflows per format
  • πŸ“Š Metrics - Track downloads per format to understand usage

Package MatrixΒΆ

Format Core Gateway Utilities Plugins MCP Servers Helm Use Case
PyPI βœ… Yes βœ… Yes βœ… Yes βœ… Python only ❌ No Local dev, pip install
Containers βœ… Yes βœ… Yes βœ… Bundled βœ… All languages ❌ No K8s, serverless, Docker
Helm βœ… Yes βœ… Optional βœ… Optional βœ… Optional βœ… Yes Kubernetes production
Binaries ❌ No ⚠️ Future ❌ No βœ… Go/Rust only ❌ No Edge, embedded systems

Multi-Arch Build StrategyΒΆ

Container images:

# Build multi-arch image with BuildKit
docker buildx build --platform linux/amd64,linux/arm64 \
  -t ghcr.io/contextforge-org/mcp-gateway:latest \
  --push .

Python wheels (Rust plugins):

# Cross-compile Rust plugin for multiple architectures
cargo build --release --target x86_64-unknown-linux-gnu
cargo build --release --target aarch64-unknown-linux-gnu
maturin build --release --target x86_64-unknown-linux-gnu
maturin build --release --target aarch64-unknown-linux-gnu

Go binaries:

# Cross-compile Go server
GOOS=linux GOARCH=amd64 go build -o mcp-server-time-linux-amd64
GOOS=linux GOARCH=arm64 go build -o mcp-server-time-linux-arm64
GOOS=darwin GOARCH=arm64 go build -o mcp-server-time-darwin-arm64

Supply Chain SecurityΒΆ

All releases include:

  1. Digital signatures - GPG signed tags and releases
  2. Container signing - cosign with keyless OIDC (Sigstore)
  3. SBOM - Software Bill of Materials (Syft, SPDX format)
  4. Provenance - SLSA Build Level 3 attestation
  5. Vulnerability scanning - Trivy and Grype in CI/CD
  6. Checksums - SHA256 for all binary artifacts

Verification:

# Verify container signature
cosign verify ghcr.io/contextforge-org/mcp-gateway:latest

# Verify binary checksum
sha256sum -c checksums.txt

Alternatives ConsideredΒΆ

Option Why Not
PyPI only Doesn't work for Go/Rust servers, inconvenient for Kubernetes
Containers only Poor developer experience, overkill for pip install
Single monolithic package Too large, includes unnecessary dependencies
OS-specific packages (deb, rpm) Narrow distribution, doesn't work for all platforms
Snap/Flatpak Limited adoption, primarily for desktop apps

StatusΒΆ

This decision is implemented. All formats are available through respective registries.

ReferencesΒΆ