Initial minimal mcp server for KorAP
diff --git a/logger/logger.go b/logger/logger.go
new file mode 100644
index 0000000..2d58030
--- /dev/null
+++ b/logger/logger.go
@@ -0,0 +1,57 @@
+package logger
+
+import (
+	"io"
+	"os"
+	"time"
+
+	"github.com/korap/korap-mcp/config"
+	"github.com/rs/zerolog"
+)
+
+// SetupLogger configures zerolog based on the provided configuration
+func SetupLogger(cfg *config.LoggingConfig) (zerolog.Logger, error) {
+	// Set global log level
+	level, err := zerolog.ParseLevel(cfg.Level)
+	if err != nil {
+		return zerolog.Logger{}, err
+	}
+	zerolog.SetGlobalLevel(level)
+
+	// Determine output destination
+	var output io.Writer
+	if cfg.File != "" {
+		file, err := os.OpenFile(cfg.File, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
+		if err != nil {
+			return zerolog.Logger{}, err
+		}
+		output = file
+	} else {
+		output = os.Stdout
+	}
+
+	// Configure output format
+	var logger zerolog.Logger
+	if cfg.Format == "json" {
+		logger = zerolog.New(output).With().Timestamp().Logger()
+	} else {
+		// Text format with console writer for better readability
+		consoleWriter := zerolog.ConsoleWriter{
+			Out:        output,
+			TimeFormat: time.RFC3339,
+		}
+		logger = zerolog.New(consoleWriter).With().Timestamp().Logger()
+	}
+
+	return logger, nil
+}
+
+// GetLogger returns a configured logger instance
+func GetLogger(cfg *config.LoggingConfig) zerolog.Logger {
+	logger, err := SetupLogger(cfg)
+	if err != nil {
+		// Fallback to default logger if setup fails
+		return zerolog.New(os.Stderr).With().Timestamp().Logger()
+	}
+	return logger
+}