From 980ae7e74f01021e917c0960c83160ff4cf4237a Mon Sep 17 00:00:00 2001 From: JM Huibonhoa Date: Tue, 27 Jan 2026 13:19:22 -0500 Subject: [PATCH 1/3] feat: add kgateway mcp app protocol to service port Signed-off-by: JM Huibonhoa --- .../transportadapter/transportadapter_translator.go | 6 ++++++ test/e2e/e2e_test.go | 1 + 2 files changed, 7 insertions(+) diff --git a/pkg/controller/transportadapter/transportadapter_translator.go b/pkg/controller/transportadapter/transportadapter_translator.go index 3ae027c..0a52106 100644 --- a/pkg/controller/transportadapter/transportadapter_translator.go +++ b/pkg/controller/transportadapter/transportadapter_translator.go @@ -26,6 +26,7 @@ import ( const ( transportAdapterRepository = "ghcr.io/agentgateway/agentgateway" defaultTransportAdapterVersion = "0.9.0" + kgatewayMcpAppProtocol = "kgateway.dev/mcp" ) // versionRegex validates that version strings contain only allowed characters @@ -498,6 +499,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterService( TargetPort: intstr.IntOrString{ IntVal: int32(port), }, + AppProtocol: makePtr(kgatewayMcpAppProtocol), }}, Selector: map[string]string{ "app.kubernetes.io/name": server.Name, @@ -663,3 +665,7 @@ func getTransportAdapterImage() string { return fmt.Sprintf("%s:%s-musl", transportAdapterRepository, transportAdapterVersion) } + +func makePtr[T any](v T) *T { + return &v +} diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 9bcd8e4..b1fd8e8 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -268,6 +268,7 @@ var _ = ginkgo.Describe("Manager", ginkgo.Ordered, func() { g.Expect(service).NotTo(gomega.BeNil()) g.Expect(service.Spec.Ports).To(gomega.HaveLen(1)) g.Expect(service.Spec.Ports[0].Port).To(gomega.Equal(int32(3000))) + g.Expect(service.Spec.Ports[0].AppProtocol).To(gomega.Equal("kgateway.dev/mcp")) }).Should(gomega.Succeed()) ginkgo.By("verifying that environment variables are loaded via envFrom") From 41d571efb53ad558f3da8238a0749dea1bd17e47 Mon Sep 17 00:00:00 2001 From: JM Huibonhoa Date: Tue, 27 Jan 2026 13:24:24 -0500 Subject: [PATCH 2/3] fix: lint issue Signed-off-by: JM Huibonhoa --- test/e2e/e2e_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index b1fd8e8..faedf29 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -268,7 +268,7 @@ var _ = ginkgo.Describe("Manager", ginkgo.Ordered, func() { g.Expect(service).NotTo(gomega.BeNil()) g.Expect(service.Spec.Ports).To(gomega.HaveLen(1)) g.Expect(service.Spec.Ports[0].Port).To(gomega.Equal(int32(3000))) - g.Expect(service.Spec.Ports[0].AppProtocol).To(gomega.Equal("kgateway.dev/mcp")) + g.Expect(service.Spec.Ports[0].AppProtocol).To(gomega.HaveValue(gomega.Equal("kgateway.dev/mcp"))) }).Should(gomega.Succeed()) ginkgo.By("verifying that environment variables are loaded via envFrom") From b71c24942a24108543dafdf50dd8d278943ffa4d Mon Sep 17 00:00:00 2001 From: JM Huibonhoa Date: Tue, 27 Jan 2026 14:17:42 -0500 Subject: [PATCH 3/3] feat: allow mcp app protocol to be disabled via an controller deployment env var Signed-off-by: JM Huibonhoa --- .../transportadapter/transportadapter_translator.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/controller/transportadapter/transportadapter_translator.go b/pkg/controller/transportadapter/transportadapter_translator.go index 0a52106..b0c9932 100644 --- a/pkg/controller/transportadapter/transportadapter_translator.go +++ b/pkg/controller/transportadapter/transportadapter_translator.go @@ -32,6 +32,7 @@ const ( // versionRegex validates that version strings contain only allowed characters // (alphanumeric, dots, hyphens) to prevent potential image injection attacks var versionRegex = regexp.MustCompile(`^[a-zA-Z0-9.\-]+$`) +var disableKgatewayMcpAppProtocol = os.Getenv("DISABLE_KGATEWAY_MCP_APP_PROTOCOL") // Translator is the interface for translating MCPServer objects to TransportAdapter objects. type Translator interface { @@ -482,6 +483,11 @@ func (t *transportAdapterTranslator) translateTransportAdapterService( if port == 0 { return nil, fmt.Errorf("deployment port must be specified for MCPServer %s", server.Name) } + + appProtocol := makePtr(kgatewayMcpAppProtocol) + if disableKgatewayMcpAppProtocol == "true" { + appProtocol = nil + } service := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: server.Name, @@ -499,7 +505,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterService( TargetPort: intstr.IntOrString{ IntVal: int32(port), }, - AppProtocol: makePtr(kgatewayMcpAppProtocol), + AppProtocol: appProtocol, }}, Selector: map[string]string{ "app.kubernetes.io/name": server.Name,