Skip to content

Commit 48135dc

Browse files
authored
add streamable (#9)
1 parent f36ac3d commit 48135dc

File tree

3 files changed

+29
-15
lines changed

3 files changed

+29
-15
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ WORKDIR /app
2222
# Copy the binary from the builder stage
2323
COPY --from=builder /app/loki-mcp-server .
2424

25-
# Expose the default port for SSE server
25+
# Expose port for unified MCP server (both SSE and Streamable HTTP)
2626
EXPOSE 8080
2727

2828
# Set the entry point

cmd/server/main.go

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,44 @@ func main() {
3030
lokiQueryTool := handlers.NewLokiQueryTool()
3131
s.AddTool(lokiQueryTool, handlers.HandleLokiQuery)
3232

33-
// Get SSE port from environment variable or use default
34-
ssePort := os.Getenv("SSE_PORT")
35-
if ssePort == "" {
36-
ssePort = "8080"
33+
// Get port from environment variable or use default
34+
port := os.Getenv("PORT")
35+
if port == "" {
36+
port = "8080"
3737
}
3838

39-
// Create SSE server for HTTP/SSE connections
39+
// Create SSE server for legacy SSE connections
4040
sseServer := server.NewSSEServer(s,
4141
server.WithSSEEndpoint("/sse"),
4242
server.WithMessageEndpoint("/mcp"),
4343
)
4444

45+
// Create Streamable HTTP server
46+
streamableServer := server.NewStreamableHTTPServer(s)
47+
48+
// Create a multiplexer to handle both protocols on the same port
49+
mux := http.NewServeMux()
50+
51+
// Register SSE endpoints (legacy support)
52+
mux.Handle("/sse", sseServer) // SSE event stream
53+
mux.Handle("/mcp", sseServer) // SSE message endpoint
54+
55+
// Register Streamable HTTP endpoint
56+
mux.Handle("/stream", streamableServer) // Streamable HTTP endpoint
57+
4558
// Create a channel to handle shutdown signals
4659
stop := make(chan os.Signal, 1)
4760
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
4861

49-
// Start HTTP server in a goroutine
62+
// Start unified HTTP server
5063
go func() {
51-
addr := fmt.Sprintf(":%s", ssePort)
52-
log.Printf("Starting SSE server on http://localhost%s", addr)
53-
log.Printf("SSE Endpoint: http://localhost%s/sse", addr)
54-
log.Printf("MCP Endpoint: http://localhost%s/mcp", addr)
64+
addr := fmt.Sprintf(":%s", port)
65+
log.Printf("Starting unified MCP server on http://localhost%s", addr)
66+
log.Printf("SSE Endpoint (legacy): http://localhost%s/sse", addr)
67+
log.Printf("SSE Message Endpoint: http://localhost%s/mcp", addr)
68+
log.Printf("Streamable HTTP Endpoint: http://localhost%s/stream", addr)
5569

56-
if err := http.ListenAndServe(addr, sseServer); err != nil && err != http.ErrServerClosed {
70+
if err := http.ListenAndServe(addr, mux); err != nil && err != http.ErrServerClosed {
5771
log.Fatalf("HTTP server error: %v", err)
5872
}
5973
}()

docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ services:
55
dockerfile: Dockerfile
66
image: loki-mcp-server:latest
77
container_name: loki-mcp-server
8-
# Expose SSE port
8+
# Expose unified MCP server port
99
ports:
10-
- "8081:8080"
10+
- "8080:8080"
1111
# If you need to pass environment variables
1212
environment:
1313
- LOKI_URL=http://loki:3100
14-
- SSE_PORT=8080
14+
- PORT=8080
1515
depends_on:
1616
loki:
1717
condition: service_healthy

0 commit comments

Comments
 (0)