diff --git a/pkg/controller/transportadapter/transportadapter_translator.go b/pkg/controller/transportadapter/transportadapter_translator.go index 3ae027c..b0c9932 100644 --- a/pkg/controller/transportadapter/transportadapter_translator.go +++ b/pkg/controller/transportadapter/transportadapter_translator.go @@ -26,11 +26,13 @@ import ( const ( transportAdapterRepository = "ghcr.io/agentgateway/agentgateway" defaultTransportAdapterVersion = "0.9.0" + kgatewayMcpAppProtocol = "kgateway.dev/mcp" ) // 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 { @@ -481,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, @@ -498,6 +505,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterService( TargetPort: intstr.IntOrString{ IntVal: int32(port), }, + AppProtocol: appProtocol, }}, Selector: map[string]string{ "app.kubernetes.io/name": server.Name, @@ -663,3 +671,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..faedf29 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.HaveValue(gomega.Equal("kgateway.dev/mcp"))) }).Should(gomega.Succeed()) ginkgo.By("verifying that environment variables are loaded via envFrom")