Initial minimal mcp server for KorAP
diff --git a/cmd/korap-mcp/config.go b/cmd/korap-mcp/config.go
new file mode 100644
index 0000000..4cd1be9
--- /dev/null
+++ b/cmd/korap-mcp/config.go
@@ -0,0 +1,134 @@
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/alecthomas/kong"
+ kongyaml "github.com/alecthomas/kong-yaml"
+
+ "github.com/korap/korap-mcp/config"
+ "github.com/korap/korap-mcp/logger"
+ "github.com/rs/zerolog"
+)
+
+// Constants for server identification
+const (
+ ServerName = "KorAP MCP Server"
+ ServerVersion = "0.1.0"
+)
+
+// CLI represents the command line interface
+type CLI struct {
+ // Configuration file path
+ Config string `short:"c" type:"path" help:"Configuration file path"`
+
+ // OAuth2 authentication configuration
+ OAuth config.OAuthConfig `embed:"" prefix:"oauth-"`
+
+ // KorAP API configuration
+ KorAP config.KorAPConfig `embed:"" prefix:"korap-"`
+
+ // Logging configuration
+ Logging config.LoggingConfig `embed:"" prefix:"log-"`
+
+ // Version flag
+ Version bool `short:"v" help:"Show version information"`
+}
+
+// SetupCLI initializes the CLI parser with configuration
+func SetupCLI() (*CLI, *kong.Kong, error) {
+ // Initialize default configuration
+ cfg := config.DefaultConfig()
+
+ cli := CLI{
+ OAuth: cfg.OAuth,
+ KorAP: cfg.KorAP,
+ Logging: cfg.Logging,
+ }
+
+ // Setup kong with conditional YAML configuration
+ var parser *kong.Kong
+ var err error
+
+ if len(os.Args) > 1 {
+ // Check if config file is specified in arguments
+ for i, arg := range os.Args {
+ if (arg == "--config" || arg == "-c") && i+1 < len(os.Args) {
+ parser, err = kong.New(&cli,
+ kong.Name("korap-mcp"),
+ kong.Description("A Model Context Protocol server for KorAP corpus analysis platform."),
+ kong.Configuration(kongyaml.Loader, os.Args[i+1]),
+ kong.HelpOptions(kong.HelpOptions{Compact: true}),
+ )
+ break
+ }
+ }
+ }
+
+ // Fallback to parser without config file
+ if parser == nil {
+ parser, err = kong.New(&cli,
+ kong.Name("korap-mcp"),
+ kong.Description("A Model Context Protocol server for KorAP corpus analysis platform."),
+ kong.HelpOptions(kong.HelpOptions{Compact: true}),
+ )
+ }
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to create CLI parser: %w", err)
+ }
+
+ return &cli, parser, nil
+}
+
+// ValidateAndSetupLogging validates the configuration and sets up logging
+func (c *CLI) ValidateAndSetupLogging() (zerolog.Logger, error) {
+ // Create config struct for validation with constants
+ fullConfig := config.Config{
+ Server: config.ServerConfig{
+ Name: ServerName,
+ Version: ServerVersion,
+ ConfigFile: c.Config,
+ },
+ OAuth: c.OAuth,
+ KorAP: c.KorAP,
+ Logging: c.Logging,
+ }
+
+ // Validate configuration
+ if err := fullConfig.Validate(); err != nil {
+ return zerolog.Logger{}, fmt.Errorf("configuration validation failed: %w", err)
+ }
+
+ // Setup zerolog logging
+ logger, err := logger.SetupLogger(&c.Logging)
+ if err != nil {
+ return zerolog.Logger{}, fmt.Errorf("failed to setup logging: %w", err)
+ }
+
+ return logger, nil
+}
+
+// GetConfig returns the full configuration
+func (c *CLI) GetConfig() *config.Config {
+ return &config.Config{
+ Server: config.ServerConfig{
+ Name: ServerName,
+ Version: ServerVersion,
+ ConfigFile: c.Config,
+ },
+ OAuth: c.OAuth,
+ KorAP: c.KorAP,
+ Logging: c.Logging,
+ }
+}
+
+// GetServerName returns the server name constant
+func (c *CLI) GetServerName() string {
+ return ServerName
+}
+
+// GetServerVersion returns the server version constant
+func (c *CLI) GetServerVersion() string {
+ return ServerVersion
+}