package server import ( "context" "fmt" "log/slog" "net/http" "github.com/modelcontextprotocol/go-sdk/mcp" "aio-mcp/internal/config" ) // Serve 按传输方式启动服务器,阻塞直到 stdin 关闭、监听失败或出错。 func Serve(s *mcp.Server, cfg *config.Config) error { switch cfg.Transport { case config.TransportStdio: slog.Info("aio-mcp starting", "transport", "stdio") // server.Run 会阻塞,直到 stdin 关闭或出错。 return s.Run(context.Background(), &mcp.StdioTransport{}) case config.TransportHTTP: handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server { return s }, nil) slog.Info("aio-mcp starting", "transport", "http", "addr", cfg.Addr) return http.ListenAndServe(cfg.Addr, handler) default: // config.Parse 已校验过,这里仅为防御性兜底。 return fmt.Errorf("未知 transport: %q(支持: %s, %s)", cfg.Transport, config.TransportStdio, config.TransportHTTP) } }