diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d33e5d1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +# syntax=docker/dockerfile:1 + +FROM golang:1.25.4-alpine3.22 AS builder +WORKDIR /workdir +COPY . . +RUN --mount=type=cache,target=/go/pkg/mod \ + go build -v -o mcp-language-server . + +FROM transformia/upx:5.0.2 AS compressor +COPY --from=builder /workdir/mcp-language-server /mcp-language-server +RUN upx -9 -o /mcp-language-server.compressed /mcp-language-server + +FROM alpine:3.22.2 +COPY --from=compressor /mcp-language-server.compressed /usr/local/bin/mcp-language-server +ENTRYPOINT ["/usr/local/bin/mcp-language-server"] diff --git a/main.go b/main.go index b51429c..c82c177 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,8 @@ type config struct { lspCommand string openGlobs StringArrayFlag lspArgs []string + httpMode bool + httpPort string } type mcpServer struct { @@ -57,6 +59,8 @@ func parseConfig() (*config, error) { flag.StringVar(&cfg.workspaceDir, "workspace", "", "Path to workspace directory") flag.StringVar(&cfg.lspCommand, "lsp", "", "LSP command to run (args should be passed after --)") flag.Var(&cfg.openGlobs, "open", "Glob of files to open by default (can specify more than once)") + flag.BoolVar(&cfg.httpMode, "http", false, "Enable HTTP server mode instead of stdio") + flag.StringVar(&cfg.httpPort, "port", "80", "HTTP port to listen on (only used with -http)") flag.Parse() // Get remaining args after -- as LSP arguments @@ -172,6 +176,12 @@ func (s *mcpServer) start() error { return fmt.Errorf("tool registration failed: %v", err) } + if s.config.httpMode { + coreLogger.Info("Starting HTTP server on port %s", s.config.httpPort) + httpServer := server.NewStreamableHTTPServer(s.mcpServer) + return httpServer.Start(":" + s.config.httpPort) + } + return server.ServeStdio(s.mcpServer) }