|
9 | 9 | "log" |
10 | 10 | "log/slog" |
11 | 11 | "os" |
| 12 | + "os/signal" |
| 13 | + "syscall" |
12 | 14 |
|
13 | 15 | "github.com/mark3labs/mcp-go/mcp" |
14 | 16 | "github.com/mark3labs/mcp-go/server" |
@@ -700,15 +702,38 @@ func main() { |
700 | 702 |
|
701 | 703 | registerAllTools(s, appInstance, debugLogger) |
702 | 704 |
|
703 | | - // Cleanup on exit |
704 | | - defer func() { |
| 705 | + // Cleanup function |
| 706 | + cleanup := func() { |
| 707 | + debugLogger.Info("Starting cleanup...") |
705 | 708 | if err := appInstance.Disconnect(); err != nil { |
706 | 709 | debugLogger.Error("Failed to disconnect from database", "error", err) |
| 710 | + } else { |
| 711 | + debugLogger.Info("Database connection closed successfully") |
707 | 712 | } |
| 713 | + debugLogger.Info("Server shutdown complete") |
| 714 | + } |
| 715 | + defer cleanup() |
| 716 | + |
| 717 | + // Set up signal handling for graceful shutdown |
| 718 | + ctx, cancel := context.WithCancel(context.Background()) |
| 719 | + defer cancel() |
| 720 | + |
| 721 | + sigChan := make(chan os.Signal, 1) |
| 722 | + signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) |
| 723 | + |
| 724 | + go func() { |
| 725 | + sig := <-sigChan |
| 726 | + debugLogger.Info("Received shutdown signal", "signal", sig.String()) |
| 727 | + cancel() |
708 | 728 | }() |
709 | 729 |
|
710 | 730 | // Start the stdio server |
711 | | - if err := server.ServeStdio(s); err != nil { |
| 731 | + debugLogger.Info("Starting PostgreSQL MCP Server", "version", version) |
| 732 | + |
| 733 | + // Create a custom StdioServer with context support |
| 734 | + stdioServer := server.NewStdioServer(s) |
| 735 | + if err := stdioServer.Listen(ctx, os.Stdin, os.Stdout); err != nil && err != context.Canceled { |
| 736 | + debugLogger.Error("Server error", "error", err) |
712 | 737 | fmt.Fprintf(os.Stderr, "Server error: %v\n", err) |
713 | 738 | return |
714 | 739 | } |
|
0 commit comments