Skip to content

Commit b6cc8ea

Browse files
tiwilliaclaude
andcommitted
Add configurable host binding support for SSE transport
- Add host parameter to CLI flags and configuration with default "0.0.0.0" - Update SSE server to bind to specified host address - Add host parameter to OpenShift template for deployment configuration - Add undeploy make target to clean up deployed resources 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent a985b08 commit b6cc8ea

File tree

5 files changed

+137
-3
lines changed

5 files changed

+137
-3
lines changed

Makefile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: build run clean container-build container-run container-clean
1+
.PHONY: build run clean container-build container-run container-clean deploy undeploy
22

33
# Build the rosa-mcp-server binary
44
build:
@@ -24,3 +24,11 @@ container-run: container-build
2424
# Clean container image
2525
container-clean:
2626
podman rmi rosa-mcp-server:latest
27+
28+
# Deploy to OpenShift using template
29+
deploy:
30+
oc process -f openshift/template.yaml | oc apply -f -
31+
32+
# Remove deployed resources from OpenShift
33+
undeploy:
34+
oc process -f openshift/template.yaml | oc delete -f -

cmd/rosa-mcp-server/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var (
1818
transport string
1919
ocmBaseURL string
2020
ocmClientID string
21+
host string
2122
port int
2223
sseBaseURL string
2324
)
@@ -49,6 +50,9 @@ var rootCmd = &cobra.Command{
4950
if cmd.Flags().Changed("ocm-client-id") {
5051
cfg.OCMClientID = ocmClientID
5152
}
53+
if cmd.Flags().Changed("host") {
54+
cfg.Host = host
55+
}
5256
if cmd.Flags().Changed("port") {
5357
cfg.Port = port
5458
}
@@ -77,6 +81,7 @@ func init() {
7781
rootCmd.Flags().StringVar(&transport, "transport", "stdio", "transport mode (stdio/sse)")
7882
rootCmd.Flags().StringVar(&ocmBaseURL, "ocm-base-url", "https://api.openshift.com", "OCM API base URL")
7983
rootCmd.Flags().StringVar(&ocmClientID, "ocm-client-id", "cloud-services", "OCM client ID")
84+
rootCmd.Flags().StringVar(&host, "host", "0.0.0.0", "host for SSE transport")
8085
rootCmd.Flags().IntVar(&port, "port", 8080, "port for SSE transport")
8186
rootCmd.Flags().StringVar(&sseBaseURL, "sse-base-url", "", "SSE base URL for public endpoints")
8287

openshift/template.yaml

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
---
2+
apiVersion: template.openshift.io/v1
3+
kind: Template
4+
metadata:
5+
name: rosa-mcp-server
6+
parameters:
7+
- name: IMAGE
8+
value: quay.io/redhat-ai-tools/rosa-mcp-server
9+
- name: IMAGE_TAG
10+
value: latest
11+
- name: HOST
12+
value: "0.0.0.0"
13+
description: "Host for SSE transport"
14+
- name: PORT
15+
value: "8080"
16+
description: "Port for SSE transport"
17+
- name: OCM_BASE_URL
18+
value: https://api.openshift.com
19+
description: "OCM API base URL"
20+
- name: OCM_CLIENT_ID
21+
value: cloud-services
22+
description: "OCM client ID"
23+
- name: SSE_BASE_URL
24+
value: ""
25+
description: "SSE base URL for public endpoints (optional)"
26+
- name: CERT_MANAGER_ISSUER_NAME
27+
value: letsencrypt-dns
28+
description: "Cert-manager issuer name for TLS certificates"
29+
- name: MCP_HOST
30+
value: rosa-mcp-server.example.com
31+
description: "Hostname for the OpenShift route"
32+
objects:
33+
- apiVersion: apps/v1
34+
kind: Deployment
35+
metadata:
36+
labels:
37+
app: rosa-mcp-server
38+
name: rosa-mcp-server
39+
spec:
40+
progressDeadlineSeconds: 600
41+
replicas: 1
42+
revisionHistoryLimit: 10
43+
selector:
44+
matchLabels:
45+
app: rosa-mcp-server
46+
strategy:
47+
rollingUpdate:
48+
maxSurge: 25%
49+
maxUnavailable: 25%
50+
type: RollingUpdate
51+
template:
52+
metadata:
53+
creationTimestamp: null
54+
labels:
55+
app: rosa-mcp-server
56+
spec:
57+
containers:
58+
- name: rosa-mcp-server
59+
image: ${IMAGE}:${IMAGE_TAG}
60+
imagePullPolicy: Always
61+
args:
62+
- --transport=sse
63+
- --host=${HOST}
64+
- --port=${PORT}
65+
- --ocm-base-url=${OCM_BASE_URL}
66+
- --ocm-client-id=${OCM_CLIENT_ID}
67+
- --sse-base-url=${SSE_BASE_URL}
68+
ports:
69+
- containerPort: 8080
70+
protocol: TCP
71+
resources:
72+
limits:
73+
cpu: 200m
74+
memory: 256Mi
75+
requests:
76+
cpu: 100m
77+
memory: 128Mi
78+
terminationMessagePath: /dev/termination-log
79+
terminationMessagePolicy: File
80+
dnsPolicy: ClusterFirst
81+
restartPolicy: Always
82+
schedulerName: default-scheduler
83+
securityContext: {}
84+
terminationGracePeriodSeconds: 30
85+
- apiVersion: v1
86+
kind: Service
87+
metadata:
88+
name: rosa-mcp-server
89+
labels:
90+
app: rosa-mcp-server
91+
spec:
92+
selector:
93+
app: rosa-mcp-server
94+
ports:
95+
- protocol: TCP
96+
port: 8080
97+
targetPort: 8080
98+
type: ClusterIP
99+
- apiVersion: route.openshift.io/v1
100+
kind: Route
101+
metadata:
102+
annotations:
103+
cert-manager.io/issuer-kind: ClusterIssuer
104+
cert-manager.io/issuer-name: ${CERT_MANAGER_ISSUER_NAME}
105+
name: rosa-mcp-server
106+
labels:
107+
app: rosa-mcp-server
108+
spec:
109+
host: ${MCP_HOST}
110+
to:
111+
kind: Service
112+
name: rosa-mcp-server
113+
port:
114+
targetPort: 8080
115+
tls:
116+
insecureEdgeTerminationPolicy: Redirect
117+
termination: edge

pkg/config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ type Configuration struct {
1515
// Transport mode selection (stdio/SSE)
1616
Transport string `toml:"transport"`
1717

18+
// Optional: Host for SSE/HTTP transport
19+
Host string `toml:"host"`
20+
1821
// Optional: Port for SSE/HTTP transport
1922
Port int `toml:"port"`
2023

@@ -28,6 +31,7 @@ func NewConfiguration() *Configuration {
2831
OCMBaseURL: "https://api.openshift.com",
2932
OCMClientID: "cloud-services",
3033
Transport: "stdio",
34+
Host: "0.0.0.0",
3135
Port: 8080,
3236
}
3337
}

pkg/mcp/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (s *Server) ServeStdio() error {
5858

5959
// ServeSSE serves the MCP server via SSE transport
6060
func (s *Server) ServeSSE() error {
61-
glog.Infof("Starting SSE server on port %d", s.config.Port)
61+
glog.Infof("Starting SSE server on %s:%d", s.config.Host, s.config.Port)
6262

6363
// Create SSE server using mcp-go library
6464
options := []server.SSEOption{}
@@ -70,7 +70,7 @@ func (s *Server) ServeSSE() error {
7070
options = append(options, server.WithSSEContextFunc(s.extractHeadersToContext))
7171

7272
sseServer := server.NewSSEServer(s.mcpServer, options...)
73-
return sseServer.Start(fmt.Sprintf(":%d", s.config.Port))
73+
return sseServer.Start(fmt.Sprintf("%s:%d", s.config.Host, s.config.Port))
7474
}
7575

7676

0 commit comments

Comments
 (0)