Skip to content
Open
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
4 changes: 2 additions & 2 deletions cmd/thv-operator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ kubectl describe mcpserver <name>
|---------------------|--------------------------------------------------|----------|---------|
| `image` | Container image for the MCP server | Yes | - |
| `transport` | Transport method (stdio, streamable-http or sse) | No | stdio |
| `port` | Port to expose the MCP server on | No | 8080 |
| `targetPort` | Port that MCP server listens to | No | - |
| `proxyPort` | Port to expose the MCP server on | No | 8080 |
| `mcpPort` | Port that MCP server listens to | No | - |
| `args` | Additional arguments to pass to the MCP server | No | - |
| `env` | Environment variables to set in the container | No | - |
| `volumes` | Volumes to mount in the container | No | - |
Expand Down
8 changes: 4 additions & 4 deletions cmd/thv-operator/api/v1alpha1/mcpserver_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,17 @@ type MCPServerSpec struct {
// +optional
ProxyMode string `json:"proxyMode,omitempty"`

// Port is the port to expose the MCP server on
// ProxyPort is the port to expose the proxy runner on
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=65535
// +kubebuilder:default=8080
Port int32 `json:"port,omitempty"`
ProxyPort int32 `json:"proxyPort,omitempty"`

// TargetPort is the port that MCP server listens to
// McpPort is the port that MCP server listens to
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=65535
// +optional
TargetPort int32 `json:"targetPort,omitempty"`
McpPort int32 `json:"mcpPort,omitempty"`

// Args are additional arguments to pass to the MCP server
// +optional
Expand Down
30 changes: 15 additions & 15 deletions cmd/thv-operator/controllers/mcpserver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (

// Update the MCPServer status with the service URL
if mcpServer.Status.URL == "" {
mcpServer.Status.URL = createServiceURL(mcpServer.Name, mcpServer.Namespace, mcpServer.Spec.Port)
mcpServer.Status.URL = createServiceURL(mcpServer.Name, mcpServer.Namespace, mcpServer.Spec.ProxyPort)
err = r.Status().Update(ctx, mcpServer)
if err != nil {
ctxLogger.Error(err, "Failed to update MCPServer status")
Expand Down Expand Up @@ -715,12 +715,12 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
}
} else {
// Use individual configuration flags (existing behavior)
args = append(args, fmt.Sprintf("--proxy-port=%d", m.Spec.Port))
args = append(args, fmt.Sprintf("--proxy-port=%d", m.Spec.ProxyPort))
args = append(args, fmt.Sprintf("--name=%s", m.Name))
args = append(args, fmt.Sprintf("--transport=%s", m.Spec.Transport))
args = append(args, fmt.Sprintf("--host=%s", getProxyHost()))
if m.Spec.TargetPort != 0 {
args = append(args, fmt.Sprintf("--target-port=%d", m.Spec.TargetPort))
if m.Spec.McpPort != 0 {
args = append(args, fmt.Sprintf("--target-port=%d", m.Spec.McpPort))
}
// Add proxy mode for stdio transport
if m.Spec.ProxyMode != "" {
Expand Down Expand Up @@ -776,7 +776,7 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
// Add OAuth discovery resource URL for RFC 9728 compliance
resourceURL := m.Spec.OIDCConfig.ResourceURL
if resourceURL == "" {
resourceURL = createServiceURL(m.Name, m.Namespace, m.Spec.Port)
resourceURL = createServiceURL(m.Name, m.Namespace, m.Spec.ProxyPort)
}
args = append(args, fmt.Sprintf("--resource-url=%s", resourceURL))
}
Expand Down Expand Up @@ -995,7 +995,7 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
VolumeMounts: volumeMounts,
Resources: resources,
Ports: []corev1.ContainerPort{{
ContainerPort: m.Spec.Port,
ContainerPort: m.Spec.ProxyPort,
Name: "http",
Protocol: corev1.ProtocolTCP,
}},
Expand Down Expand Up @@ -1134,8 +1134,8 @@ func (r *MCPServerReconciler) serviceForMCPServer(m *mcpv1alpha1.MCPServer) *cor
Spec: corev1.ServiceSpec{
Selector: ls, // Keep original labels for selector
Ports: []corev1.ServicePort{{
Port: m.Spec.Port,
TargetPort: intstr.FromInt(int(m.Spec.Port)),
Port: m.Spec.ProxyPort,
TargetPort: intstr.FromInt(int(m.Spec.ProxyPort)),
Protocol: corev1.ProtocolTCP,
Name: "http",
}},
Expand Down Expand Up @@ -1280,7 +1280,7 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
}

// Check if the port has changed
portArg := fmt.Sprintf("--proxy-port=%d", mcpServer.Spec.Port)
portArg := fmt.Sprintf("--proxy-port=%d", mcpServer.Spec.ProxyPort)
found = false
for _, arg := range container.Args {
if arg == portArg {
Expand Down Expand Up @@ -1333,7 +1333,7 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
}

// Check if the container port has changed
if len(container.Ports) > 0 && container.Ports[0].ContainerPort != mcpServer.Spec.Port {
if len(container.Ports) > 0 && container.Ports[0].ContainerPort != mcpServer.Spec.ProxyPort {
return true
}

Expand Down Expand Up @@ -1419,12 +1419,12 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
return true
}

// Check if the targetPort has changed
if mcpServer.Spec.TargetPort != 0 {
targetPortArg := fmt.Sprintf("--target-port=%d", mcpServer.Spec.TargetPort)
// Check if the mcpPort has changed
if mcpServer.Spec.McpPort != 0 {
mcpPortArg := fmt.Sprintf("--target-port=%d", mcpServer.Spec.McpPort)
found := false
for _, arg := range container.Args {
if arg == targetPortArg {
if arg == mcpPortArg {
found = true
break
}
Expand Down Expand Up @@ -1486,7 +1486,7 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
// serviceNeedsUpdate checks if the service needs to be updated
func serviceNeedsUpdate(service *corev1.Service, mcpServer *mcpv1alpha1.MCPServer) bool {
// Check if the service port has changed
if len(service.Spec.Ports) > 0 && service.Spec.Ports[0].Port != mcpServer.Spec.Port {
if len(service.Spec.Ports) > 0 && service.Spec.Ports[0].Port != mcpServer.Spec.ProxyPort {
return true
}

Expand Down
6 changes: 3 additions & 3 deletions cmd/thv-operator/controllers/mcpserver_platform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func TestMCPServerReconciler_DeploymentForMCPServer_Kubernetes(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down Expand Up @@ -180,7 +180,7 @@ func TestMCPServerReconciler_DeploymentForMCPServer_OpenShift(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down Expand Up @@ -261,7 +261,7 @@ func TestMCPServerReconciler_DeploymentForMCPServer_PlatformDetectionError(t *te
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down
14 changes: 7 additions & 7 deletions cmd/thv-operator/controllers/mcpserver_pod_template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestDeploymentForMCPServerWithPodTemplateSpec(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
PodTemplateSpec: &corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Tolerations: []corev1.Toleration{
Expand Down Expand Up @@ -162,7 +162,7 @@ func TestDeploymentForMCPServerSecretsProviderEnv(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down Expand Up @@ -194,7 +194,7 @@ func TestDeploymentForMCPServerWithSecrets(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
Secrets: []mcpv1alpha1.SecretRef{
{
Name: "github-token",
Expand Down Expand Up @@ -300,7 +300,7 @@ func TestDeploymentForMCPServerWithEnvVars(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
Env: []mcpv1alpha1.EnvVar{
{
Name: "API_KEY",
Expand Down Expand Up @@ -366,7 +366,7 @@ func TestDeploymentForMCPServerWithProxyMode(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
ProxyMode: "streamable-http",
},
}
Expand Down Expand Up @@ -406,7 +406,7 @@ func TestProxyRunnerSecurityContext(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down Expand Up @@ -455,7 +455,7 @@ func TestProxyRunnerStructuredLogsEnvVar(t *testing.T) {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/thv-operator/controllers/mcpserver_rbac_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ func createTestMCPServer(name, namespace string) *mcpv1alpha1.MCPServer {
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image:latest",
Transport: "stdio",
Port: 8080,
ProxyPort: 8080,
},
}
}
Expand Down
50 changes: 25 additions & 25 deletions cmd/thv-operator/controllers/mcpserver_resource_overrides_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ func TestResourceOverrides(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
},
},
expectedDeploymentLabels: map[string]string{
Expand Down Expand Up @@ -79,8 +79,8 @@ func TestResourceOverrides(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
ResourceMetadataOverrides: mcpv1alpha1.ResourceMetadataOverrides{
Expand Down Expand Up @@ -144,8 +144,8 @@ func TestResourceOverrides(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
ResourceMetadataOverrides: mcpv1alpha1.ResourceMetadataOverrides{
Expand Down Expand Up @@ -197,8 +197,8 @@ func TestResourceOverrides(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
ResourceMetadataOverrides: mcpv1alpha1.ResourceMetadataOverrides{
Expand Down Expand Up @@ -262,8 +262,8 @@ func TestResourceOverrides(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
PodTemplateMetadataOverrides: &mcpv1alpha1.ResourceMetadataOverrides{
Expand Down Expand Up @@ -446,8 +446,8 @@ func TestDeploymentNeedsUpdateServiceAccount(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
},
}

Expand Down Expand Up @@ -489,8 +489,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
Env: []mcpv1alpha1.EnvVar{
Expand All @@ -515,8 +515,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
Env: []mcpv1alpha1.EnvVar{
Expand All @@ -541,8 +541,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
Env: []mcpv1alpha1.EnvVar{
Expand All @@ -568,8 +568,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
ResourceOverrides: &mcpv1alpha1.ResourceOverrides{
ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{
Env: []mcpv1alpha1.EnvVar{
Expand All @@ -593,8 +593,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
},
},
existingEnvVars: []corev1.EnvVar{},
Expand All @@ -608,8 +608,8 @@ func TestDeploymentNeedsUpdateProxyEnv(t *testing.T) {
Namespace: "default",
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
Image: "test-image",
ProxyPort: 8080,
},
},
existingEnvVars: []corev1.EnvVar{
Expand Down Expand Up @@ -707,7 +707,7 @@ func TestDeploymentNeedsUpdateToolsFilter(t *testing.T) {
},
Spec: mcpv1alpha1.MCPServerSpec{
Image: "test-image",
Port: 8080,
ProxyPort: 8080,
ToolsFilter: tt.initialToolsFilter,
},
}
Expand Down
6 changes: 3 additions & 3 deletions cmd/thv-operator/controllers/mcpserver_runconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,8 @@ func (r *MCPServerReconciler) createRunConfigFromMCPServer(m *mcpv1alpha1.MCPSer
}

port := 8080
if m.Spec.Port != 0 {
port = int(m.Spec.Port)
if m.Spec.ProxyPort != 0 {
port = int(m.Spec.ProxyPort)
}

// Helper functions to convert MCPServer spec to builder format
Expand Down Expand Up @@ -261,7 +261,7 @@ func (r *MCPServerReconciler) createRunConfigFromMCPServer(m *mcpv1alpha1.MCPSer
runner.WithName(m.Name),
runner.WithImage(m.Spec.Image),
runner.WithCmdArgs(m.Spec.Args),
runner.WithTransportAndPorts(m.Spec.Transport, port, int(m.Spec.TargetPort)),
runner.WithTransportAndPorts(m.Spec.Transport, port, int(m.Spec.McpPort)),
runner.WithProxyMode(transporttypes.ProxyMode(proxyMode)),
runner.WithHost(proxyHost),
runner.WithToolsFilter(toolsFilter),
Expand Down
Loading
Loading