Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
5abb98a
Merge pull request #727 from trepel/auth-setup-servers
jasonmadigan Apr 8, 2026
95e4b57
Merge pull request #730 from Kuadrant/update-quick-start-guide
jasonmadigan Apr 8, 2026
edbbbcc
Merge pull request #733 from jasonmadigan/731-fix-register-guide
jasonmadigan Apr 10, 2026
785a0a8
Merge pull request #734 from Kuadrant/authentication-review
Patryk-Stefanski Apr 9, 2026
9cd22cb
Merge pull request #736 from jasonmadigan/735-fix-external-mcp-server…
jasonmadigan Apr 9, 2026
b6c12e5
Merge pull request #738 from jasonmadigan/737-fix-tool-revocation-guide
jasonmadigan Apr 9, 2026
16fd4f0
Merge pull request #744 from Kuadrant/743-fix-isolated-gateway-guide
jasonmadigan Apr 10, 2026
167af15
Merge pull request #747 from Kuadrant/review-authorization-guide-0.6.…
jasonmadigan Apr 9, 2026
e20b0f1
Merge pull request #752 from Kuadrant/review-scaling-guide-0.6.0-rc1
jasonmadigan Apr 10, 2026
c2b28b2
fix: some small tweaks to virtual mcp servers guide after verification
jasonmadigan Apr 9, 2026
9f877c6
Merge pull request #749 from jasonmadigan/748-fix-otel-guide
jasonmadigan Apr 10, 2026
963843e
Merge pull request #751 from jasonmadigan/750-fix-configure-listener-…
jasonmadigan Apr 10, 2026
17d9413
Merge pull request #704 from jasonmadigan/703-intermittent-errors-wit…
jasonmadigan Mar 31, 2026
84771f2
Merge pull request #707 from david-martin/update-release-process
david-martin Apr 1, 2026
924abcb
Merge pull request #723 from trepel/few-small-fixes
jasonmadigan Apr 9, 2026
a89bd15
Merge pull request #724 from trepel/gevals-workflow-fixes
jasonmadigan Apr 9, 2026
2425a90
Merge pull request #729 from trepel/mcp-controller-rename
jasonmadigan Apr 9, 2026
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
55 changes: 55 additions & 0 deletions .github/workflows/ci-docs-skip.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: CI Docs Skip

# Provides pass statuses for required checks when only non-code files change.
# Without this, PRs touching only these paths can never merge because the real
# workflows use paths-ignore and never report a status for the required checks.
# The paths list below is the union of all paths-ignore entries from
# images.yaml, tests.yaml, and code-style.yaml.

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

on:
pull_request:
branches: ['main']
paths:
- '**.md'
- 'docs/**'
- 'examples/**'
- 'LICENSE'
- 'charts/**'
- 'evals/**'
- 'tests/servers/**'
- '.coderabbit.yaml'
- '.gitignore'
merge_group:
types: [checks_requested]

jobs:
build:
name: Build ${{ matrix.image }}
runs-on: ubuntu-latest
strategy:
matrix:
include:
- image: mcp-gateway
- image: mcp-controller
steps:
- run: echo "Docs-only change, skipping build"

unit-tests:
name: Unit Tests
strategy:
matrix:
go-version: [1.22.x]
platform: [ubuntu-latest]
runs-on: ${{ matrix.platform }}
steps:
- run: echo "Docs-only change, skipping tests"

code-style:
name: Code Style Checks
runs-on: ubuntu-latest
steps:
- run: echo "Docs-only change, skipping code style"
46 changes: 28 additions & 18 deletions .github/workflows/gevals.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ jobs:
name: Run MCP Evaluation
runs-on: ubuntu-latest
env:
MODEL_KEY: ${{ secrets.MODEL_KEY }}
MODEL_BASE_URL: ${{ secrets.MODEL_BASE_URL }}
OPENAI_API_KEY: ${{ secrets.MODEL_KEY }}
OPENAI_BASE_URL: ${{ secrets.MODEL_BASE_URL }}

steps:
- name: Checkout
Expand Down Expand Up @@ -77,53 +77,63 @@ jobs:
echo "Gateway is ready!"

- name: Setup Fallback LLM (Ollama)
if: env.MODEL_KEY == ''
if: env.OPENAI_API_KEY == ''
uses: ai-action/setup-ollama@v2

- name: Cache Ollama Models
if: env.MODEL_KEY == ''
if: env.OPENAI_API_KEY == ''
uses: actions/cache@v4
with:
path: ~/.ollama
key: ${{ runner.os }}-ollama-qwen2.5-1.5b

- name: Run Agent (Fallback)
if: env.MODEL_KEY == ''
if: env.OPENAI_API_KEY == ''
run: |
echo "No MODEL_KEY secret found. Starting Ollama..."

# Start Ollama in background
ollama serve &

# Wait for Ollama to be ready
echo "Waiting for Ollama to be ready..."
timeout 60s bash -c 'until curl -s http://localhost:11434 > /dev/null; do sleep 2; done'

MODEL_NAME="qwen2.5:1.5b"

# Pull the model (Ollama will skip if cached/present)
echo "Pulling model $MODEL_NAME..."
ollama pull $MODEL_NAME

# Configure environment for mcpchecker
echo "MODEL_BASE_URL=http://localhost:11434/v1" >> $GITHUB_ENV
echo "MODEL_KEY=ollama" >> $GITHUB_ENV
echo "OPENAI_BASE_URL=http://localhost:11434/v1" >> $GITHUB_ENV
echo "OPENAI_API_KEY=ollama" >> $GITHUB_ENV

# Update agent.yaml to use the fallback model
sed -i "s/model: .*/model: \"$MODEL_NAME\"/" evals/gemini-agent/agent.yaml
sed -i "s/model: .*/model: \"openai:$MODEL_NAME\"/" evals/gemini-agent/agent.yaml

echo "Ollama setup complete using model $MODEL_NAME"

- name: Run mcpchecker (Manual)
- name: Run mcpchecker
run: |
echo "Installing mcpchecker..."
go install github.com/mcpchecker/mcpchecker/cmd/mcpchecker@latest

echo "Running mcpchecker..."
# Ensure GOBIN is in PATH if not already (github actions usually has it)
export PATH=$PATH:$(go env GOPATH)/bin
mcpchecker check --verbose evals/gemini-agent/eval.yaml

- name: Verify Results
if: always()
run: |
export PATH=$PATH:$(go env GOPATH)/bin
RESULTS_FILE=$(ls mcpchecker-*-out.json 2>/dev/null | head -1)
if [ -z "$RESULTS_FILE" ]; then
echo "No results file found — mcpchecker may have crashed"
exit 1
fi
mcpchecker verify --task 1.0 --assertion 1.0 "$RESULTS_FILE"

- name: Upload Evaluation Results
if: always()
uses: actions/upload-artifact@v4
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file provides guidance to AI Agents when working with this repository.
MCP Gateway is an Envoy-based gateway for Model Context Protocol (MCP) servers. Single binary (`mcp-broker-router`) with three components:
- **MCP Router**: Envoy external processor that routes MCP requests (gRPC on :50051)
- **MCP Broker**: HTTP service that aggregates tools from multiple MCP servers (HTTP on :8080/mcp)
- **MCP Controller**: Kubernetes controller that discovers MCP servers via MCPServerRegistration CRDs (optional, `--controller` flag)
- **MCP Gateway Controller**: Kubernetes controller that discovers MCP servers via MCPServerRegistration CRDs (optional, `--controller` flag)

## Architecture

Expand Down Expand Up @@ -255,7 +255,7 @@ This allows AuthPolicy to validate the OAuth token while backends receive their
## Test Servers

Six test servers in `config/test-servers/`:
- **Server1**: Go SDK (tools: hi, time, slow, headers)
- **Server1**: Go SDK (tools: greet, time, slow, headers)
- **Server2**: Go SDK (tools: hello_world, time, headers, auth1234, slow)
- **Server3**: Python FastMCP (tools: time, add, dozen, pi, get_weather, slow)
- **API Key Server**: Validates Bearer token authentication (tool: hello_world)
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file provides guidance to Claude Code when working with this repository.
MCP Gateway is an Envoy-based gateway for Model Context Protocol (MCP) servers. Single binary (`mcp-broker-router`) with three components:
- **MCP Router**: Envoy external processor that routes MCP requests (gRPC on :50051)
- **MCP Broker**: HTTP service that aggregates tools from multiple MCP servers (HTTP on :8080/mcp)
- **MCP Controller**: Kubernetes controller that discovers MCP servers via MCPServerRegistration CRDs (optional, `--controller` flag)
- **MCP Gateway Controller**: Kubernetes controller that discovers MCP servers via MCPServerRegistration CRDs (optional, `--controller` flag)

# Exploration

Expand Down Expand Up @@ -273,7 +273,7 @@ This allows AuthPolicy to validate the OAuth token while backends receive their
## Test Servers

Test servers in `config/test-servers/`:
- **Server1**: Go SDK (tools: hi, time, slow, headers)
- **Server1**: Go SDK (tools: greet, time, slow, headers)
- **Server2**: Go SDK (tools: hello_world, time, headers, auth1234, slow)
- **Server3**: Python FastMCP (tools: time, add, dozen, pi, get_weather, slow)
- **API Key Server**: Validates Bearer token authentication (tool: hello_world)
Expand Down
22 changes: 11 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -233,13 +233,13 @@ deploy-redis: ## deploy redis to mcp-system namespace

.PHONY: configure-redis
configure-redis: deploy-redis ## deploy redis and patch deployment with redis connection
kubectl patch deployment $(BROKER_ROUTER_NAME) -n mcp-system --patch-file config/mcp-gateway/overlays/mcp-system/deployment-controller-redis-patch.yaml
kubectl patch deployment $(BROKER_ROUTER_NAME) -n $(MCP_GATEWAY_NAMESPACE) --patch-file config/mcp-gateway/overlays/mcp-system/deployment-controller-redis-patch.yaml

# Deploy only the controller
deploy-controller: install-crd ## Deploy only the controller
kubectl apply -k config/mcp-gateway/overlays/mcp-system/
@echo "Waiting for controller to be ready..."
@kubectl wait --for=condition=Available deployment/mcp-controller -n mcp-system --timeout=$(WAIT_TIME)
@kubectl wait --for=condition=Available deployment/mcp-gateway-controller -n mcp-system --timeout=$(WAIT_TIME)
@echo "Waiting for MCPGatewayExtension to be ready..."
@kubectl wait --for=condition=Ready mcpgatewayextension/mcp-gateway-extension -n mcp-system --timeout=$(WAIT_TIME)
@echo "Controller and broker-router are ready"
Expand All @@ -256,8 +256,8 @@ endef

.PHONY: restart-all
restart-all:
kubectl rollout restart deployment/$(BROKER_ROUTER_NAME) -n mcp-system 2>/dev/null || true
kubectl rollout restart deployment/mcp-controller -n mcp-system 2>/dev/null || true
kubectl rollout restart deployment/$(BROKER_ROUTER_NAME) -n $(MCP_GATEWAY_NAMESPACE) 2>/dev/null || true
kubectl rollout restart deployment/mcp-gateway-controller -n $(MCP_GATEWAY_NAMESPACE) 2>/dev/null || true

.PHONY: build-and-load-image
build-and-load-image: kind build-image load-image restart-all ## Build & load router/broker/controller image into the Kind cluster and restart
Expand Down Expand Up @@ -287,7 +287,7 @@ deploy-example: install-crd ## Deploy example MCPServerRegistration resource
kubectl apply -f config/samples/mcpserverregistration-test-servers-base.yaml
kubectl apply -f config/samples/mcpserverregistration-test-servers-extended.yaml
@echo "Waiting for broker-router to be ready..."
@kubectl wait --for=condition=Available deployment/$(BROKER_ROUTER_NAME) -n mcp-system --timeout=$(WAIT_TIME)
@kubectl wait --for=condition=Available deployment/$(BROKER_ROUTER_NAME) -n $(MCP_GATEWAY_NAMESPACE) --timeout=$(WAIT_TIME)

# Deploy example MCPServerRegistration for everything server only
deploy-example-minimal: install-crd ## Deploy MCPServerRegistration for everything server
Expand Down Expand Up @@ -410,8 +410,8 @@ endef
reload-controller: build kind ## Build, load to Kind, and restart controller
$(CONTAINER_ENGINE) build $(CONTAINER_ENGINE_EXTRA_FLAGS) --file Dockerfile.controller -t $(IMAGE_TAG_BASE):$(IMAGE_TAG) .
$(call load-image,$(IMAGE_TAG_BASE):$(IMAGE_TAG))
@kubectl rollout restart -n mcp-system deployment/mcp-controller
@kubectl rollout status -n mcp-system deployment/mcp-controller --timeout=60s
@kubectl rollout restart -n $(MCP_GATEWAY_NAMESPACE) deployment/mcp-gateway-controller
@kubectl rollout status -n $(MCP_GATEWAY_NAMESPACE) deployment/mcp-gateway-controller --timeout=60s

.PHONY: reload-broker
reload-broker: build docker-build kind ## Build, load to Kind, and restart broker
Expand All @@ -422,8 +422,8 @@ reload-broker: build docker-build kind ## Build, load to Kind, and restart broke
.PHONY: reload
reload: build docker-build kind ## Build, load to Kind, and restart both controller and broker
$(call reload-image)
@kubectl rollout restart -n $(MCP_GATEWAY_NAMESPACE) deployment/mcp-controller deployment/$(BROKER_ROUTER_NAME)
@kubectl rollout status -n $(MCP_GATEWAY_NAMESPACE)deployment/mcp-controller --timeout=60s
@kubectl rollout restart -n $(MCP_GATEWAY_NAMESPACE) deployment/mcp-gateway-controller deployment/$(BROKER_ROUTER_NAME)
@kubectl rollout status -n $(MCP_GATEWAY_NAMESPACE) deployment/mcp-gateway-controller --timeout=60s
@kubectl rollout status -n $(MCP_GATEWAY_NAMESPACE) deployment/$(BROKER_ROUTER_NAME) --timeout=60s

##@ E2E Testing
Expand Down Expand Up @@ -726,9 +726,9 @@ ifeq ($(ISTIO_TRACING),1)
-p='{"spec":{"values":{"meshConfig":{"enableTracing":true,"defaultConfig":{"tracing":{}},"extensionProviders":[{"name":"tempo-otlp","opentelemetry":{"port":4317,"service":"$(OTEL_COLLECTOR_HOST)"}}]}}}}'
@sleep 5
endif
kubectl set env deployment/mcp-gateway -n mcp-system \
kubectl set env deployment/mcp-gateway -n $(MCP_GATEWAY_NAMESPACE) \
OTEL_EXPORTER_OTLP_ENDPOINT="$(OTEL_COLLECTOR_HTTP)" OTEL_EXPORTER_OTLP_INSECURE="true"
@kubectl rollout status deployment/mcp-gateway -n mcp-system --timeout=120s
@kubectl rollout status deployment/mcp-gateway -n $(MCP_GATEWAY_NAMESPACE) --timeout=120s
ifeq ($(AUTH_TRACING),1)
@if ! kubectl get authorino -n kuadrant-system 2>/dev/null | grep -q authorino; then \
$(MAKE) auth-example-setup; \
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ This will:
- Configure the mcp-broker with OAuth environment variables
- Apply AuthPolicy for token validation/exchange on the /mcp endpoint, including tool authorization via keycloak group mappings (both via Keycloak)
- Apply additional OAuth configurations
- Deploy several test MCP servers including OIDC-enabled MCP server

The mcp-broker now serves OAuth discovery information at `/.well-known/oauth-protected-resource`.

Expand Down
5 changes: 3 additions & 2 deletions api/v1alpha1/mcpgatewayextension_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,9 @@ type MCPGatewayExtensionTargetReference struct {

// sectionName is the name of a listener on the target Gateway. The controller will
// read the listener's port and hostname to configure the MCP Gateway instance.
// This allows multiple MCPGatewayExtensions to target different listeners on the
// same Gateway, each with their own MCP Gateway instance.
// Only one MCPGatewayExtension is allowed per namespace. MCPGatewayExtensions in
// different namespaces may target different listeners on the same Gateway, provided
// those listeners use different ports.
// +required
// +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:MaxLength=253
Expand Down
15 changes: 10 additions & 5 deletions build/auth.mk
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ auth-example-setup: cert-manager-install kuadrant-install keycloak-install ## Se
@echo ""
@echo "Prerequisites: make local-env-setup should be completed"
@echo ""
@echo "Step 1/5: Configuring OAuth environment variables..."
@echo "Step 1/6: Configuring OAuth environment variables..."
@kubectl set env deployment/mcp-gateway \
OAUTH_RESOURCE_NAME="MCP Server" \
OAUTH_RESOURCE="http://mcp.127-0-0-1.sslip.io:8001/mcp" \
Expand All @@ -24,24 +24,29 @@ auth-example-setup: cert-manager-install kuadrant-install keycloak-install ## Se
-n mcp-system
@echo "✅ OAuth environment variables configured"
@echo ""
@echo "Step 2/5: Installing Vault..."
@echo "Step 2/6: Installing Vault..."
@bin/kustomize build config/vault | bin/yq 'select(.kind == "Deployment").spec.template.spec.containers[0].args += ["-dev-root-token-id=root"] | .' | kubectl apply -f -
@echo "✅ Vault installed"
@echo ""
@echo "Step 3/5: Applying AuthPolicy configurations..."
@echo "Step 3/6: Applying AuthPolicy configurations..."
@kubectl apply -k ./config/samples/oauth-token-exchange/
@kubectl patch mcpgatewayextension mcp-gateway-extension -n mcp-system --type='merge' \
-p='{"spec":{"trustedHeadersKey":{"secretName":"trusted-headers-public-key"}}}'
@echo "✅ AuthPolicy configurations applied"
@echo ""
@echo "Step 4/5: Configuring CORS rules for the OpenID Connect Client Registration endpoint..."
@echo "Step 4/6: Configuring CORS rules for the OpenID Connect Client Registration endpoint..."
@kubectl apply -f ./config/keycloak/preflight_envoyfilter.yaml
@echo "✅ CORS configured"
@echo ""
@echo "Step 5/5: Patch Authorino deployment to be able to connect to Keycloak..."
@echo "Step 5/6: Patch Authorino deployment to be able to connect to Keycloak..."
@./utils/patch-authorino-to-keycloak.sh
@echo "✅ Authorino deployment patched"
@echo ""
@echo "Step 6/6: Deploying test MCP servers..."
@"$(MAKE)" deploy-test-servers
@"$(MAKE)" deploy-example
@echo "✅ Test MCP servers deployed and configured"
@echo ""
@echo "🎉 OAuth example setup complete!"
@echo ""
@echo "The mcp-broker now serves OAuth discovery information at:"
Expand Down
2 changes: 1 addition & 1 deletion build/ci.mk
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ ci-auth-setup: cert-manager-install kuadrant-install ## Setup auth infrastructur
.PHONY: ci-debug-logs
ci-debug-logs: ## Collect logs for debugging CI failures
@echo "=== Controller logs ==="
-$(KUBECTL) logs -n mcp-system deployment/mcp-controller --tail=100
-$(KUBECTL) logs -n mcp-system deployment/mcp-gateway-controller --tail=100
@echo "=== MCPGatewayExtensions ==="
-$(KUBECTL) get mcpgatewayextensions -A
@echo "=== MCPServerRegistrations ==="
Expand Down
8 changes: 4 additions & 4 deletions build/e2e.mk
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ test-e2e: ci-setup test-e2e-run ## Run full e2e test suite (setup + run)
.PHONY: test-e2e-happy
test-e2e-happy: test-e2e-deps ## Quick e2e test run for local development (no setup)
@echo "Running e2e tests (local mode)..."
$(GINKGO) -v --tags=e2e --timeout=$(E2E_TIMEOUT) --focus="[Happy]" ./tests/e2e
$(GINKGO) -v --tags=e2e --timeout=$(E2E_TIMEOUT) --focus="\[Happy\]" ./tests/e2e

.PHONY: test-e2e-cleanup
test-e2e-cleanup: ## Clean up e2e test resources
Expand All @@ -48,8 +48,8 @@ test-e2e-auth-ci: test-e2e-deps enable-debug-logging ## Run auth e2e tests only

.PHONY: enable-debug-logging
enable-debug-logging: ## Enable debug logging on controller and wait for restart
@echo "Enabling debug logging on mcp-controller..."
kubectl patch deployment mcp-controller -n mcp-system --type='json' \
@echo "Enabling debug logging on mcp-gateway-controller..."
kubectl patch deployment mcp-gateway-controller -n mcp-system --type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/command", "value": ["./mcp_controller", "--log-level=-4"]}]'
@echo "Waiting for controller rollout..."
kubectl rollout status deployment/mcp-controller -n mcp-system --timeout=120s
kubectl rollout status deployment/mcp-gateway-controller -n mcp-system --timeout=120s
2 changes: 1 addition & 1 deletion build/setup.mk
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ setup-cluster-base: tools kind-create-cluster build-and-load-image gateway-api-i
deploy-controller-only: ## Deploy only the controller (tests create their own MCPGatewayExtensions)
$(KUBECTL) apply -k config/mcp-gateway/overlays/ci/
@echo "Waiting for controller to be ready..."
@$(KUBECTL) wait --for=condition=available --timeout=180s deployment/mcp-controller -n mcp-system
@$(KUBECTL) wait --for=condition=available --timeout=180s deployment/mcp-gateway-controller -n mcp-system

# Wait for test server deployments
.PHONY: wait-test-servers
Expand Down
2 changes: 1 addition & 1 deletion bundle/manifests/mcp-gateway.clusterserviceversion.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ spec:
- label:
app: mcp-controller
component: controller
name: mcp-controller
name: mcp-gateway-controller
spec:
replicas: 1
selector:
Expand Down
5 changes: 3 additions & 2 deletions bundle/manifests/mcp.kuadrant.io_mcpgatewayextensions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,9 @@ spec:
description: |-
sectionName is the name of a listener on the target Gateway. The controller will
read the listener's port and hostname to configure the MCP Gateway instance.
This allows multiple MCPGatewayExtensions to target different listeners on the
same Gateway, each with their own MCP Gateway instance.
Only one MCPGatewayExtension is allowed per namespace. MCPGatewayExtensions in
different namespaces may target different listeners on the same Gateway, provided
those listeners use different ports.
maxLength: 253
minLength: 1
type: string
Expand Down
2 changes: 1 addition & 1 deletion charts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This directory contains the Helm chart for deploying MCP Gateway to Kubernetes.
## Overview

The MCP Gateway Helm chart deploys:
- **MCP Controller**: Manages MCPGatewayExtension, MCPServerRegistration, and MCPVirtualServer custom resources
- **MCP Gateway Controller**: Manages MCPGatewayExtension, MCPServerRegistration, and MCPVirtualServer custom resources
- **MCPGatewayExtension**: Custom resource that triggers the controller to deploy the broker-router
- **Custom Resource Definitions (CRDs)**: MCPGatewayExtension, MCPServerRegistration, and MCPVirtualServer
- **RBAC**: Service accounts, roles, and bindings for secure operation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,9 @@ spec:
description: |-
sectionName is the name of a listener on the target Gateway. The controller will
read the listener's port and hostname to configure the MCP Gateway instance.
This allows multiple MCPGatewayExtensions to target different listeners on the
same Gateway, each with their own MCP Gateway instance.
Only one MCPGatewayExtension is allowed per namespace. MCPGatewayExtensions in
different namespaces may target different listeners on the same Gateway, provided
those listeners use different ports.
maxLength: 253
minLength: 1
type: string
Expand Down
Loading
Loading