@@ -92,6 +92,33 @@ flowchart LR
9292 MCPService --> MCPPod
9393```
9494
95+ ### StreamableHTTP transport flow
96+
97+ For MCP servers using StreamableHTTP transport, the proxy creates both
98+ a pod and a headless service. This allows direct HTTP communication between
99+ the proxy and MCP server while maintaining network isolation and service
100+ discovery.
101+
102+ ``` mermaid
103+ flowchart LR
104+ subgraph Proxy["Created by Operator"]
105+ direction TB
106+ ProxyService["SVC: ToolHive-Proxy"]
107+ ProxyPod["POD: ToolHive-Proxy"]
108+ ProxyService --> ProxyPod
109+ end
110+
111+ subgraph MCP["Created by Proxy"]
112+ direction TB
113+ MCPService["SVC: MCP-Headless"]
114+ MCPPod["POD: MCP Server"]
115+ end
116+
117+ Client["Client"] -->|HTTP/StreamableHTTP| Proxy
118+ Proxy -->|HTTP/StreamableHTTP| MCP
119+ MCPService --> MCPPod
120+ ```
121+
95122## Create an MCP server
96123
97124You can create ` MCPServer ` resources in namespaces based on how the operator was
@@ -117,7 +144,7 @@ metadata:
117144 namespace : my-namespace # Update with your namespace
118145spec :
119146 image : ghcr.io/stackloklabs/osv-mcp/server
120- transport : sse
147+ transport : streamable-http
121148 port : 8080
122149 permissionProfile :
123150 type : builtin
@@ -153,7 +180,7 @@ When you apply an `MCPServer` resource, here's what happens:
153180 service to handle client connections
1541814 . The proxy creates the actual ` MCPServer ` pod containing your specified
155182 container image
156- 5 . For STDIO transport, the proxy attaches directly to the pod; for SSE
183+ 5 . For STDIO transport, the proxy attaches directly to the pod; for SSE and StreamableHTTP
157184 transport, a headless service is created for direct pod communication
1581856 . Clients can now connect through the service → proxy → MCP server chain to use
159186 the tools and resources (note: external clients will need an ingress
@@ -217,9 +244,8 @@ metadata:
217244 namespace : development # Can be any namespace
218245spec :
219246 image : ghcr.io/stackloklabs/gofetch/server
220- transport : sse
247+ transport : streamable-http
221248 port : 8080
222- targetPort : 8080
223249 permissionProfile :
224250 type : builtin
225251 name : network
@@ -474,7 +500,7 @@ Common causes include:
474500 selectors
475501- **Port configuration**: Verify the `port` field matches the MCP server's
476502 listening port
477- - **Transport mismatch**: Ensure the `transport` field (stdio/sse) matches the
503+ - **Transport mismatch**: Ensure the `transport` field (stdio/sse/streamable-http ) matches the
478504 MCP server's capabilities
479505- **Network policies**: Check if network policies are blocking communication
480506
0 commit comments