blob: 4cd1be96175c05dc7d6fee1e35c1591b7196343d [file] [log] [blame]
Akron90f65212025-06-12 14:32:55 +02001package main
2
3import (
4 "fmt"
5 "os"
6
7 "github.com/alecthomas/kong"
8 kongyaml "github.com/alecthomas/kong-yaml"
9
10 "github.com/korap/korap-mcp/config"
11 "github.com/korap/korap-mcp/logger"
12 "github.com/rs/zerolog"
13)
14
15// Constants for server identification
16const (
17 ServerName = "KorAP MCP Server"
18 ServerVersion = "0.1.0"
19)
20
21// CLI represents the command line interface
22type CLI struct {
23 // Configuration file path
24 Config string `short:"c" type:"path" help:"Configuration file path"`
25
26 // OAuth2 authentication configuration
27 OAuth config.OAuthConfig `embed:"" prefix:"oauth-"`
28
29 // KorAP API configuration
30 KorAP config.KorAPConfig `embed:"" prefix:"korap-"`
31
32 // Logging configuration
33 Logging config.LoggingConfig `embed:"" prefix:"log-"`
34
35 // Version flag
36 Version bool `short:"v" help:"Show version information"`
37}
38
39// SetupCLI initializes the CLI parser with configuration
40func SetupCLI() (*CLI, *kong.Kong, error) {
41 // Initialize default configuration
42 cfg := config.DefaultConfig()
43
44 cli := CLI{
45 OAuth: cfg.OAuth,
46 KorAP: cfg.KorAP,
47 Logging: cfg.Logging,
48 }
49
50 // Setup kong with conditional YAML configuration
51 var parser *kong.Kong
52 var err error
53
54 if len(os.Args) > 1 {
55 // Check if config file is specified in arguments
56 for i, arg := range os.Args {
57 if (arg == "--config" || arg == "-c") && i+1 < len(os.Args) {
58 parser, err = kong.New(&cli,
59 kong.Name("korap-mcp"),
60 kong.Description("A Model Context Protocol server for KorAP corpus analysis platform."),
61 kong.Configuration(kongyaml.Loader, os.Args[i+1]),
62 kong.HelpOptions(kong.HelpOptions{Compact: true}),
63 )
64 break
65 }
66 }
67 }
68
69 // Fallback to parser without config file
70 if parser == nil {
71 parser, err = kong.New(&cli,
72 kong.Name("korap-mcp"),
73 kong.Description("A Model Context Protocol server for KorAP corpus analysis platform."),
74 kong.HelpOptions(kong.HelpOptions{Compact: true}),
75 )
76 }
77 if err != nil {
78 return nil, nil, fmt.Errorf("failed to create CLI parser: %w", err)
79 }
80
81 return &cli, parser, nil
82}
83
84// ValidateAndSetupLogging validates the configuration and sets up logging
85func (c *CLI) ValidateAndSetupLogging() (zerolog.Logger, error) {
86 // Create config struct for validation with constants
87 fullConfig := config.Config{
88 Server: config.ServerConfig{
89 Name: ServerName,
90 Version: ServerVersion,
91 ConfigFile: c.Config,
92 },
93 OAuth: c.OAuth,
94 KorAP: c.KorAP,
95 Logging: c.Logging,
96 }
97
98 // Validate configuration
99 if err := fullConfig.Validate(); err != nil {
100 return zerolog.Logger{}, fmt.Errorf("configuration validation failed: %w", err)
101 }
102
103 // Setup zerolog logging
104 logger, err := logger.SetupLogger(&c.Logging)
105 if err != nil {
106 return zerolog.Logger{}, fmt.Errorf("failed to setup logging: %w", err)
107 }
108
109 return logger, nil
110}
111
112// GetConfig returns the full configuration
113func (c *CLI) GetConfig() *config.Config {
114 return &config.Config{
115 Server: config.ServerConfig{
116 Name: ServerName,
117 Version: ServerVersion,
118 ConfigFile: c.Config,
119 },
120 OAuth: c.OAuth,
121 KorAP: c.KorAP,
122 Logging: c.Logging,
123 }
124}
125
126// GetServerName returns the server name constant
127func (c *CLI) GetServerName() string {
128 return ServerName
129}
130
131// GetServerVersion returns the server version constant
132func (c *CLI) GetServerVersion() string {
133 return ServerVersion
134}