|
5 | 5 | "net/http" |
6 | 6 | "os" |
7 | 7 | "path/filepath" |
| 8 | + "fmt" |
8 | 9 | "strings" |
9 | 10 |
|
10 | 11 | "github.com/pocketbase/pocketbase" |
@@ -620,59 +621,100 @@ func (s *TinyBrainPocketBaseServer) handleQueryOWASP(req MCPRequest) (MCPRespons |
620 | 621 | }, nil |
621 | 622 | } |
622 | 623 |
|
| 624 | +func printUsage() { |
| 625 | + fmt.Println() |
| 626 | + fmt.Println("🧠 TinyBrain MCP Server") |
| 627 | + fmt.Println("Security-focused LLM memory storage with intelligence gathering") |
| 628 | + fmt.Println() |
| 629 | + |
| 630 | + fmt.Println("USAGE:") |
| 631 | + fmt.Println(" server [command] [flags]") |
| 632 | + fmt.Println() |
| 633 | + |
| 634 | + fmt.Println("COMMANDS:") |
| 635 | + fmt.Println(" serve Start the TinyBrain server (default)") |
| 636 | + fmt.Println(" --help Show this help message") |
| 637 | + fmt.Println() |
| 638 | + |
| 639 | + fmt.Println("FLAGS:") |
| 640 | + fmt.Println(" --http=<address> HTTP bind address (default: 127.0.0.1:8090)") |
| 641 | + fmt.Println(" --dir=<path> Data directory (default: ~/.tinybrain)") |
| 642 | + fmt.Println() |
| 643 | + |
| 644 | + fmt.Println("EXAMPLES:") |
| 645 | + fmt.Println(" server # Start with defaults") |
| 646 | + fmt.Println(" server --http=127.0.0.1:9000 # Custom port") |
| 647 | + fmt.Println(" server serve --http=0.0.0.0:8090 # Bind to all interfaces") |
| 648 | + fmt.Println(" TINYBRAIN_HTTP=:9000 server # Port via environment") |
| 649 | + fmt.Println() |
| 650 | + |
| 651 | + fmt.Println("ENVIRONMENT:") |
| 652 | + fmt.Println(" TINYBRAIN_HTTP HTTP bind address") |
| 653 | + fmt.Println(" TINYBRAIN_DATA_DIR Data directory") |
| 654 | + fmt.Println() |
| 655 | + |
| 656 | + fmt.Println("For more info: https://github.com/rainmana/tinybrain") |
| 657 | +} |
| 658 | + |
| 659 | + |
623 | 660 | func main() { |
| 661 | + // Handle --help or -h |
| 662 | + if len(os.Args) > 1 && (os.Args[1] == "--help" || os.Args[1] == "-h" || os.Args[1] == "help") { |
| 663 | + printUsage() |
| 664 | + return |
| 665 | + } |
| 666 | + |
| 667 | + // If no args provided, default to "serve" |
| 668 | + if len(os.Args) == 1 { |
| 669 | + os.Args = append(os.Args, "serve") |
| 670 | + } |
| 671 | + |
| 672 | + // If first arg isn't "serve", assume they want to serve with those flags |
| 673 | + if os.Args[1] != "serve" { |
| 674 | + os.Args = append([]string{os.Args[0], "serve"}, os.Args[1:]...) |
| 675 | + } |
| 676 | + |
624 | 677 | // Create the combined TinyBrain + PocketBase server |
625 | 678 | app := pocketbase.New() |
626 | | - |
627 | | - // Set up logging |
628 | 679 | logger := log.New(os.Stderr, "TinyBrain ", log.LstdFlags) |
629 | 680 |
|
630 | 681 | server := &TinyBrainPocketBaseServer{ |
631 | 682 | app: app, |
632 | 683 | logger: logger, |
633 | 684 | } |
634 | 685 |
|
635 | | - // Set up PocketBase hooks and custom routes |
| 686 | + // Setup before serving |
636 | 687 | server.setupPocketBaseHooks() |
637 | 688 | server.setupCustomRoutes() |
638 | 689 | server.setupCollections() |
639 | 690 |
|
640 | | - // Get HTTP address from environment variable if set |
641 | | - // This can be overridden by command-line --http flag |
| 691 | + // Handle TINYBRAIN_HTTP environment variable |
642 | 692 | httpAddr := os.Getenv("TINYBRAIN_HTTP") |
643 | 693 | if httpAddr != "" { |
644 | | - logger.Printf("Using HTTP address from TINYBRAIN_HTTP: %s", httpAddr) |
645 | | - // Inject the --http flag if not already present |
646 | 694 | hasHTTPFlag := false |
647 | 695 | for _, arg := range os.Args { |
648 | | - if strings.HasPrefix(arg, "--http") || strings.HasPrefix(arg, "-http") { |
| 696 | + if strings.HasPrefix(arg, "--http") { |
649 | 697 | hasHTTPFlag = true |
650 | 698 | break |
651 | 699 | } |
652 | 700 | } |
653 | 701 | if !hasHTTPFlag { |
654 | 702 | os.Args = append(os.Args, "--http="+httpAddr) |
| 703 | + logger.Printf("Using HTTP address from TINYBRAIN_HTTP: %s", httpAddr) |
655 | 704 | } |
656 | 705 | } |
657 | 706 |
|
658 | | - // Set up data directory (PocketBase will use ./pb_data by default within this directory) |
| 707 | + // Setup data directory |
659 | 708 | dataDir := filepath.Join(os.Getenv("HOME"), ".tinybrain") |
660 | 709 | if err := os.MkdirAll(dataDir, 0755); err != nil { |
661 | 710 | logger.Fatalf("Failed to create data directory: %v", err) |
662 | 711 | } |
663 | 712 |
|
664 | 713 | logger.Printf("TinyBrain data directory: %s", dataDir) |
665 | | - logger.Println("Starting TinyBrain with PocketBase backend") |
666 | | - logger.Println("Use --http=127.0.0.1:PORT to customize port (default: 127.0.0.1:8090)") |
667 | | - logger.Println("Use TINYBRAIN_HTTP=127.0.0.1:PORT environment variable to set default port") |
| 714 | + logger.Println("Starting TinyBrain MCP Server") |
| 715 | + logger.Println("Run 'server --help' for usage information") |
668 | 716 |
|
669 | | - // Execute PocketBase with command-line arguments |
670 | | - // This processes the built-in 'serve' command with --http, --dir, etc. |
671 | | - // Usage examples: |
672 | | - // server serve |
673 | | - // server serve --http=127.0.0.1:9000 |
674 | | - // server serve --dir=~/.tinybrain --http=0.0.0.0:8090 |
675 | | - // TINYBRAIN_HTTP=127.0.0.1:9090 server serve |
| 717 | + // Execute PocketBase |
676 | 718 | if err := app.Execute(); err != nil { |
677 | 719 | log.Fatal(err) |
678 | 720 | } |
|
0 commit comments