diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c0ab5c2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,55 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories
+vendor/
+
+# Go workspace file
+go.work
+
+# IDE files
+.vscode/
+.idea/
+*.swp
+*.swo
+
+# OS generated files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Configuration files (exclude real configs, keep examples)
+config.json
+*.env
+
+# Build artifacts
+/bin/
+/dist/
+/build/
+
+# Logs
+*.log
+logs/
+
+# Coverage reports
+coverage.html
+coverage.out 
+
+progress.txt
+README.md
+/korap-mcp
+sandbox
\ No newline at end of file
diff --git a/auth/oauth.go b/auth/oauth.go
new file mode 100644
index 0000000..acbc978
--- /dev/null
+++ b/auth/oauth.go
@@ -0,0 +1,152 @@
+package auth
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"golang.org/x/oauth2"
+	"golang.org/x/oauth2/clientcredentials"
+
+	"github.com/korap/korap-mcp/config"
+)
+
+// OAuthClient handles OAuth2 authentication for KorAP API
+type OAuthClient struct {
+	config       *config.OAuthConfig
+	oauth2Config *oauth2.Config
+	token        *oauth2.Token
+	httpClient   *http.Client
+}
+
+// NewOAuthClient creates a new OAuth2 client
+func NewOAuthClient(cfg *config.OAuthConfig) (*OAuthClient, error) {
+	if cfg == nil {
+		return nil, fmt.Errorf("oauth config cannot be nil")
+	}
+
+	if err := cfg.Validate(); err != nil {
+		return nil, fmt.Errorf("invalid oauth config: %w", err)
+	}
+
+	client := &OAuthClient{
+		config:       cfg,
+		oauth2Config: cfg.ToOAuth2Config(),
+	}
+
+	return client, nil
+}
+
+// GetAuthURL returns the authorization URL for the OAuth2 flow
+func (c *OAuthClient) GetAuthURL(state string) string {
+	if c.oauth2Config == nil {
+		return ""
+	}
+	return c.oauth2Config.AuthCodeURL(state, oauth2.AccessTypeOnline)
+}
+
+// ExchangeCode exchanges an authorization code for an access token
+func (c *OAuthClient) ExchangeCode(ctx context.Context, code string) error {
+	if c.oauth2Config == nil {
+		return fmt.Errorf("oauth2 not configured")
+	}
+
+	token, err := c.oauth2Config.Exchange(ctx, code)
+	if err != nil {
+		return fmt.Errorf("failed to exchange code for token: %w", err)
+	}
+
+	c.token = token
+	c.httpClient = c.oauth2Config.Client(ctx, token)
+	return nil
+}
+
+// SetToken sets the OAuth2 token directly
+func (c *OAuthClient) SetToken(token *oauth2.Token) {
+	c.token = token
+	if c.oauth2Config != nil {
+		c.httpClient = c.oauth2Config.Client(context.Background(), token)
+	}
+}
+
+// GetToken returns the current OAuth2 token
+func (c *OAuthClient) GetToken() *oauth2.Token {
+	return c.token
+}
+
+// GetHTTPClient returns an HTTP client with OAuth2 authentication
+func (c *OAuthClient) GetHTTPClient() *http.Client {
+	if c.httpClient != nil {
+		return c.httpClient
+	}
+
+	// Return default client if not authenticated
+	return &http.Client{
+		Timeout: time.Second * 30,
+	}
+}
+
+// IsAuthenticated checks if the client has a valid token
+func (c *OAuthClient) IsAuthenticated() bool {
+	if c.token == nil {
+		return false
+	}
+
+	// Check if token is expired (with 5 minute buffer)
+	return c.token.Valid() && c.token.Expiry.After(time.Now().Add(5*time.Minute))
+}
+
+// ClientCredentialsFlow performs client credentials OAuth2 flow
+func (c *OAuthClient) ClientCredentialsFlow(ctx context.Context) error {
+	if c.config == nil || !c.config.Enabled {
+		return fmt.Errorf("oauth2 not configured")
+	}
+
+	ccConfig := &clientcredentials.Config{
+		ClientID:     c.config.ClientID,
+		ClientSecret: c.config.ClientSecret,
+		TokenURL:     c.config.TokenURL,
+		Scopes:       c.config.Scopes,
+	}
+
+	token, err := ccConfig.Token(ctx)
+	if err != nil {
+		return fmt.Errorf("failed to get client credentials token: %w", err)
+	}
+
+	c.token = token
+	c.httpClient = ccConfig.Client(ctx)
+	return nil
+}
+
+// RefreshToken refreshes the OAuth2 token if possible
+func (c *OAuthClient) RefreshToken(ctx context.Context) error {
+	if c.oauth2Config == nil {
+		return fmt.Errorf("oauth2 not configured")
+	}
+
+	if c.token == nil {
+		return fmt.Errorf("no token to refresh")
+	}
+
+	tokenSource := c.oauth2Config.TokenSource(ctx, c.token)
+	newToken, err := tokenSource.Token()
+	if err != nil {
+		return fmt.Errorf("failed to refresh token: %w", err)
+	}
+
+	c.token = newToken
+	c.httpClient = c.oauth2Config.Client(ctx, newToken)
+	return nil
+}
+
+// AddAuthHeader adds authentication header to an HTTP request
+func (c *OAuthClient) AddAuthHeader(req *http.Request) error {
+	if c.token == nil {
+		return fmt.Errorf("no authentication token available")
+	}
+
+	c.token.SetAuthHeader(req)
+	return nil
+}
diff --git a/auth/oauth_test.go b/auth/oauth_test.go
new file mode 100644
index 0000000..9c6b0cc
--- /dev/null
+++ b/auth/oauth_test.go
@@ -0,0 +1,403 @@
+package auth
+
+import (
+	"context"
+	"encoding/json"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+	"time"
+
+	"github.com/korap/korap-mcp/config"
+	"github.com/stretchr/testify/assert"
+	"golang.org/x/oauth2"
+)
+
+func TestNewOAuthClient(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+	assert.NotNil(t, client)
+	assert.Equal(t, cfg, client.config)
+}
+
+func TestNewOAuthClient_InvalidConfig(t *testing.T) {
+	tests := []struct {
+		name   string
+		config *config.OAuthConfig
+	}{
+		{
+			name:   "nil config",
+			config: nil,
+		},
+		{
+			name: "empty client ID",
+			config: &config.OAuthConfig{
+				ClientSecret: "test-secret",
+				AuthURL:      "https://example.com/auth",
+				TokenURL:     "https://example.com/token",
+				Enabled:      true,
+			},
+		},
+		{
+			name: "empty client secret",
+			config: &config.OAuthConfig{
+				ClientID: "test-client",
+				AuthURL:  "https://example.com/auth",
+				TokenURL: "https://example.com/token",
+				Enabled:  true,
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			client, err := NewOAuthClient(tt.config)
+			assert.Error(t, err)
+			assert.Nil(t, client)
+		})
+	}
+}
+
+func TestOAuthClient_GetAuthURL(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		RedirectURL:  "https://example.com/callback",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	authURL := client.GetAuthURL("test-state")
+	assert.NotEmpty(t, authURL)
+
+	// Check if the URL contains expected parameters
+	assert.Contains(t, authURL, "client_id=test-client")
+	assert.Contains(t, authURL, "state=test-state")
+}
+
+func TestOAuthClient_IsAuthenticated(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Should not be authenticated initially
+	assert.False(t, client.IsAuthenticated(), "client should not be authenticated initially")
+
+	// Set a valid token
+	validToken := &oauth2.Token{
+		AccessToken: "test-token",
+		Expiry:      time.Now().Add(time.Hour),
+	}
+	client.SetToken(validToken)
+
+	assert.True(t, client.IsAuthenticated(), "client should be authenticated with valid token")
+
+	// Set an expired token
+	expiredToken := &oauth2.Token{
+		AccessToken: "test-token",
+		Expiry:      time.Now().Add(-time.Hour),
+	}
+	client.SetToken(expiredToken)
+
+	assert.False(t, client.IsAuthenticated(), "client should not be authenticated with expired token")
+}
+
+func TestOAuthClient_ExchangeCode(t *testing.T) {
+	// Create mock OAuth2 server
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if r.URL.Path == "/token" {
+			w.Header().Set("Content-Type", "application/json")
+			response := map[string]interface{}{
+				"access_token": "test-access-token",
+				"token_type":   "Bearer",
+				"expires_in":   3600,
+			}
+			json.NewEncoder(w).Encode(response)
+			return
+		}
+		http.NotFound(w, r)
+	}))
+	defer server.Close()
+
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      server.URL + "/auth",
+		TokenURL:     server.URL + "/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	err = client.ExchangeCode(context.Background(), "test-code")
+	assert.NoError(t, err)
+
+	token := client.GetToken()
+	assert.NotNil(t, token)
+	assert.Equal(t, "test-access-token", token.AccessToken)
+}
+
+func TestOAuthClient_ClientCredentialsFlow(t *testing.T) {
+	// Create mock OAuth2 server
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if r.URL.Path == "/token" {
+			w.Header().Set("Content-Type", "application/json")
+			response := map[string]interface{}{
+				"access_token": "client-credentials-token",
+				"token_type":   "Bearer",
+				"expires_in":   3600,
+			}
+			json.NewEncoder(w).Encode(response)
+			return
+		}
+		http.NotFound(w, r)
+	}))
+	defer server.Close()
+
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		TokenURL:     server.URL + "/token",
+		Scopes:       []string{"read"},
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	err = client.ClientCredentialsFlow(context.Background())
+	assert.NoError(t, err)
+
+	token := client.GetToken()
+	assert.NotNil(t, token)
+	assert.Equal(t, "client-credentials-token", token.AccessToken)
+}
+
+func TestOAuthClient_GetHTTPClient(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	httpClient := client.GetHTTPClient()
+	assert.NotNil(t, httpClient)
+
+	// Should return default client when not authenticated
+	assert.Equal(t, 30*time.Second, httpClient.Timeout)
+}
+
+func TestOAuthClient_AddAuthHeader(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	req, _ := http.NewRequest("GET", "https://example.com/api", nil)
+
+	// Should fail when no token is set
+	err = client.AddAuthHeader(req)
+	assert.Error(t, err, "expected error when no token is available")
+
+	// Set a token and try again
+	token := &oauth2.Token{
+		AccessToken: "test-token",
+		TokenType:   "Bearer",
+	}
+	client.SetToken(token)
+
+	err = client.AddAuthHeader(req)
+	assert.NoError(t, err)
+
+	authHeader := req.Header.Get("Authorization")
+	assert.Equal(t, "Bearer test-token", authHeader)
+}
+
+func TestOAuthClient_RefreshToken(t *testing.T) {
+	// Create mock OAuth2 server
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if r.URL.Path == "/token" {
+			w.Header().Set("Content-Type", "application/json")
+			response := map[string]interface{}{
+				"access_token":  "refreshed-access-token",
+				"refresh_token": "new-refresh-token",
+				"token_type":    "Bearer",
+				"expires_in":    3600,
+			}
+			json.NewEncoder(w).Encode(response)
+			return
+		}
+		http.NotFound(w, r)
+	}))
+	defer server.Close()
+
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      server.URL + "/auth",
+		TokenURL:     server.URL + "/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Set an initial token with refresh token
+	initialToken := &oauth2.Token{
+		AccessToken:  "initial-token",
+		RefreshToken: "refresh-token",
+		Expiry:       time.Now().Add(-time.Hour), // Expired
+	}
+	client.SetToken(initialToken)
+
+	err = client.RefreshToken(context.Background())
+	assert.NoError(t, err)
+
+	token := client.GetToken()
+	assert.NotNil(t, token)
+	assert.Equal(t, "refreshed-access-token", token.AccessToken)
+}
+
+func TestOAuthClient_RefreshToken_Errors(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Test refresh without token
+	err = client.RefreshToken(context.Background())
+	assert.Error(t, err, "expected error when refreshing without token")
+
+	// Test refresh with unconfigured OAuth2
+	client.oauth2Config = nil
+	client.SetToken(&oauth2.Token{AccessToken: "test"})
+	err = client.RefreshToken(context.Background())
+	assert.Error(t, err, "expected error when OAuth2 not configured")
+}
+
+func TestOAuthClient_TokenExpiration(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Test with token expiring soon (within 5 minute buffer)
+	soonExpiredToken := &oauth2.Token{
+		AccessToken: "test-token",
+		Expiry:      time.Now().Add(2 * time.Minute), // Expires in 2 minutes
+	}
+	client.SetToken(soonExpiredToken)
+
+	assert.False(t, client.IsAuthenticated(), "client should not be authenticated with soon-to-expire token")
+
+	// Test with token expiring later (outside 5 minute buffer)
+	validToken := &oauth2.Token{
+		AccessToken: "test-token",
+		Expiry:      time.Now().Add(10 * time.Minute), // Expires in 10 minutes
+	}
+	client.SetToken(validToken)
+
+	assert.True(t, client.IsAuthenticated(), "client should be authenticated with valid token")
+}
+
+func TestOAuthClient_ErrorHandling(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://invalid-server.example.com/auth",
+		TokenURL:     "https://invalid-server.example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Test client credentials flow with invalid server
+	err = client.ClientCredentialsFlow(context.Background())
+	assert.Error(t, err, "expected error when connecting to invalid server")
+
+	// Test code exchange with invalid server
+	err = client.ExchangeCode(context.Background(), "test-code")
+	assert.Error(t, err, "expected error when connecting to invalid server")
+}
+
+func TestOAuthClient_DisabledOAuth(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		Enabled:      false,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	httpClient := client.GetHTTPClient()
+	assert.NotNil(t, httpClient, "HTTP client should not be nil even when OAuth is disabled")
+
+	authURL := client.GetAuthURL("test-state")
+	assert.Empty(t, authURL, "auth URL should be empty when OAuth is disabled")
+
+	err = client.ClientCredentialsFlow(context.Background())
+	assert.Error(t, err, "expected error when trying client credentials flow with disabled OAuth")
+}
+
+func TestOAuthClient_ContextCancellation(t *testing.T) {
+	cfg := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	client, err := NewOAuthClient(cfg)
+	assert.NoError(t, err)
+
+	// Create a cancelled context
+	ctx, cancel := context.WithCancel(context.Background())
+	cancel()
+
+	err = client.ClientCredentialsFlow(ctx)
+	assert.Error(t, err, "expected error with cancelled context")
+}
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
+}
diff --git a/cmd/korap-mcp/main.go b/cmd/korap-mcp/main.go
new file mode 100644
index 0000000..0cf7fb3
--- /dev/null
+++ b/cmd/korap-mcp/main.go
@@ -0,0 +1,91 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"os"
+
+	"github.com/korap/korap-mcp/mcp"
+	mcplib "github.com/mark3labs/mcp-go/mcp"
+)
+
+// Run is the default command that starts the MCP server
+func (c *CLI) Run() error {
+	// Handle version flag
+	if c.Version {
+		fmt.Printf("%s version %s\n", c.GetServerName(), c.GetServerVersion())
+		os.Exit(0)
+	}
+
+	// Validate configuration and setup logging
+	logger, err := c.ValidateAndSetupLogging()
+	if err != nil {
+		return err
+	}
+
+	logger.Info().
+		Str("version", c.GetServerVersion()).
+		Str("korap_url", c.KorAP.BaseURL).
+		Bool("oauth_enabled", c.OAuth.Enabled).
+		Msg("KorAP MCP Server starting...")
+
+	// Create MCP server
+	server := mcp.NewServer(c.GetServerName(), c.GetServerVersion())
+
+	// Add a simple ping tool for testing
+	err = server.AddTool(
+		"ping",
+		"Simple ping tool to test server connectivity",
+		map[string]interface{}{
+			"type": "object",
+			"properties": map[string]interface{}{
+				"message": map[string]interface{}{
+					"type":        "string",
+					"description": "Message to echo back",
+				},
+			},
+		},
+		func(ctx context.Context, request mcplib.CallToolRequest) (*mcplib.CallToolResult, error) {
+			message, err := request.RequireString("message")
+			if err != nil {
+				message = "pong"
+			}
+			logger.Debug().
+				Str("message", message).
+				Msg("Ping tool called")
+			return mcplib.NewToolResultText(fmt.Sprintf("KorAP Server response: %s", message)), nil
+		},
+	)
+
+	if err != nil {
+		return fmt.Errorf("failed to add ping tool: %w", err)
+	}
+
+	logger.Info().Msg("Server ready - serving MCP via stdio")
+
+	// Start the MCP server
+	if err := server.Serve(); err != nil {
+		return fmt.Errorf("server error: %w", err)
+	}
+
+	return nil
+}
+
+func main() {
+	// Setup CLI and parser
+	cli, parser, err := SetupCLI()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Failed to setup CLI: %v\n", err)
+		os.Exit(1)
+	}
+
+	// Parse command line arguments and run
+	ctx, err := parser.Parse(os.Args[1:])
+	if err != nil {
+		parser.FatalIfErrorf(err)
+	}
+
+	// Run the appropriate command (default or subcommand)
+	err = ctx.Run(cli)
+	ctx.FatalIfErrorf(err)
+}
diff --git a/cmd/korap-mcp/main_test.go b/cmd/korap-mcp/main_test.go
new file mode 100644
index 0000000..b447a5b
--- /dev/null
+++ b/cmd/korap-mcp/main_test.go
@@ -0,0 +1,344 @@
+package main
+
+import (
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/korap/korap-mcp/config"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestCLI_ShowVersion(t *testing.T) {
+	cli := &CLI{
+		Version: true,
+	}
+
+	// Test that Run() handles the ShowVersion flag
+	// Since it calls os.Exit(0), we can't test the actual execution
+	// but we can test that the flag is set correctly
+	assert.True(t, cli.Version, "ShowVersion flag should be settable")
+	assert.Equal(t, ServerVersion, cli.GetServerVersion(), "Version should be accessible via getter")
+}
+
+func TestCLI_DefaultConfiguration(t *testing.T) {
+	cfg := config.DefaultConfig()
+
+	cli := CLI{
+		OAuth:   cfg.OAuth,
+		KorAP:   cfg.KorAP,
+		Logging: cfg.Logging,
+	}
+
+	// Test server constants
+	assert.Equal(t, ServerName, cli.GetServerName())
+	assert.Equal(t, ServerVersion, cli.GetServerVersion())
+
+	// Test KorAP defaults
+	assert.Equal(t, "https://korap.ids-mannheim.de", cli.KorAP.BaseURL)
+
+	// Test OAuth defaults
+	assert.False(t, cli.OAuth.Enabled, "Expected OAuth to be disabled by default")
+
+	// Test logging defaults
+	assert.Equal(t, "info", cli.Logging.Level)
+}
+
+func TestSetupLogging(t *testing.T) {
+	tests := []struct {
+		name   string
+		config config.LoggingConfig
+		setup  func(*config.LoggingConfig)
+	}{
+		{
+			name: "text format",
+			config: config.LoggingConfig{
+				Level:  "info",
+				Format: "text",
+			},
+		},
+		{
+			name: "json format",
+			config: config.LoggingConfig{
+				Level:  "debug",
+				Format: "json",
+			},
+		},
+		{
+			name: "with file",
+			config: config.LoggingConfig{
+				Level:  "warn",
+				Format: "text",
+			},
+			setup: func(cfg *config.LoggingConfig) {
+				tempDir, err := os.MkdirTemp("", "korap-mcp-test")
+				assert.NoError(t, err)
+				defer os.RemoveAll(tempDir)
+
+				cfg.File = filepath.Join(tempDir, "test.log")
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			cfg := tt.config
+			if tt.setup != nil {
+				tt.setup(&cfg)
+			}
+
+			// Create a complete CLI with defaults for validation
+			defaultConfig := config.DefaultConfig()
+			cli := &CLI{
+				OAuth:   defaultConfig.OAuth,
+				KorAP:   defaultConfig.KorAP,
+				Logging: cfg, // Use our test config for logging
+			}
+
+			// Test that logger setup doesn't fail
+			_, err := cli.ValidateAndSetupLogging()
+			if cfg.File != "" && tt.name == "with file" {
+				// For file tests, we might get errors due to temp directory cleanup
+				// This is acceptable
+			} else {
+				assert.NoError(t, err)
+			}
+		})
+	}
+}
+
+func TestSetupLogging_InvalidFile(t *testing.T) {
+	defaultConfig := config.DefaultConfig()
+	cli := &CLI{
+		OAuth: defaultConfig.OAuth,
+		KorAP: defaultConfig.KorAP,
+		Logging: config.LoggingConfig{
+			Level:  "info",
+			Format: "text",
+			File:   "/invalid/directory/test.log",
+		},
+	}
+
+	// Should handle invalid file gracefully
+	_, err := cli.ValidateAndSetupLogging()
+	assert.Error(t, err) // Should return an error for invalid file
+}
+
+func TestCLI_ConfigurationValidation(t *testing.T) {
+	tests := []struct {
+		name      string
+		setupCLI  func() *CLI
+		expectErr bool
+	}{
+		{
+			name: "valid configuration",
+			setupCLI: func() *CLI {
+				cfg := config.DefaultConfig()
+				return &CLI{
+					OAuth:   cfg.OAuth,
+					KorAP:   cfg.KorAP,
+					Logging: cfg.Logging,
+				}
+			},
+			expectErr: false,
+		},
+		{
+			name: "invalid KorAP config",
+			setupCLI: func() *CLI {
+				cfg := config.DefaultConfig()
+				cfg.KorAP.BaseURL = "" // Invalid empty URL
+				return &CLI{
+					OAuth:   cfg.OAuth,
+					KorAP:   cfg.KorAP,
+					Logging: cfg.Logging,
+				}
+			},
+			expectErr: true,
+		},
+		{
+			name: "invalid OAuth config",
+			setupCLI: func() *CLI {
+				cfg := config.DefaultConfig()
+				cfg.OAuth.Enabled = true
+				cfg.OAuth.ClientID = "" // Invalid empty client ID
+				return &CLI{
+					OAuth:   cfg.OAuth,
+					KorAP:   cfg.KorAP,
+					Logging: cfg.Logging,
+				}
+			},
+			expectErr: true,
+		},
+		{
+			name: "invalid logging config",
+			setupCLI: func() *CLI {
+				cfg := config.DefaultConfig()
+				cfg.Logging.Level = "invalid" // Invalid log level
+				return &CLI{
+					OAuth:   cfg.OAuth,
+					KorAP:   cfg.KorAP,
+					Logging: cfg.Logging,
+				}
+			},
+			expectErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			cli := tt.setupCLI()
+
+			_, err := cli.ValidateAndSetupLogging()
+			if tt.expectErr {
+				assert.Error(t, err, "Expected validation error but got none")
+			} else {
+				assert.NoError(t, err, "Unexpected validation error")
+			}
+		})
+	}
+}
+
+func TestCLI_ConfigToStruct(t *testing.T) {
+	cli := &CLI{
+		OAuth: config.OAuthConfig{
+			Enabled:  true,
+			ClientID: "test-client",
+		},
+		KorAP: config.KorAPConfig{
+			BaseURL:    "https://test.korap.com",
+			APIVersion: "v2.0",
+			Timeout:    60,
+			MaxRetries: 5,
+		},
+		Logging: config.LoggingConfig{
+			Level:  "debug",
+			Format: "json",
+		},
+	}
+
+	// Convert CLI to Config struct
+	fullConfig := cli.GetConfig()
+
+	// Verify values are correctly transferred (name and version are constants)
+	assert.Equal(t, ServerName, fullConfig.Server.Name)
+	assert.Equal(t, ServerVersion, fullConfig.Server.Version)
+	assert.Equal(t, cli.OAuth.Enabled, fullConfig.OAuth.Enabled)
+	assert.Equal(t, cli.KorAP.BaseURL, fullConfig.KorAP.BaseURL)
+	assert.Equal(t, cli.Logging.Level, fullConfig.Logging.Level)
+}
+
+func TestCLI_FieldsEmbedding(t *testing.T) {
+	// Test that embedded fields are accessible
+	cli := &CLI{}
+
+	// Test ConfigFile field
+	cli.Config = "test-config.yaml"
+	assert.Equal(t, "test-config.yaml", cli.Config, "ConfigFile should be settable")
+
+	// Test OAuth fields
+	cli.OAuth.ClientID = "test-client"
+	assert.Equal(t, "test-client", cli.OAuth.ClientID, "OAuth.ClientID should be settable")
+
+	// Test KorAP fields
+	cli.KorAP.Timeout = 120
+	assert.Equal(t, 120, cli.KorAP.Timeout, "KorAP.Timeout should be settable")
+
+	// Test Logging fields
+	cli.Logging.Format = "json"
+	assert.Equal(t, "json", cli.Logging.Format, "Logging.Format should be settable")
+
+	// Test that constants are accessible
+	assert.Equal(t, ServerName, cli.GetServerName(), "Server name should be accessible via getter")
+	assert.Equal(t, ServerVersion, cli.GetServerVersion(), "Server version should be accessible via getter")
+}
+
+func TestServerConfigurationValues(t *testing.T) {
+	cfg := config.DefaultConfig()
+
+	tests := []struct {
+		name     string
+		field    string
+		expected interface{}
+		actual   interface{}
+	}{
+		{
+			name:     "korap base URL",
+			field:    "KorAP.BaseURL",
+			expected: "https://korap.ids-mannheim.de",
+			actual:   cfg.KorAP.BaseURL,
+		},
+		{
+			name:     "korap API version",
+			field:    "KorAP.APIVersion",
+			expected: "v1.0",
+			actual:   cfg.KorAP.APIVersion,
+		},
+		{
+			name:     "korap timeout",
+			field:    "KorAP.Timeout",
+			expected: 30,
+			actual:   cfg.KorAP.Timeout,
+		},
+		{
+			name:     "korap max retries",
+			field:    "KorAP.MaxRetries",
+			expected: 3,
+			actual:   cfg.KorAP.MaxRetries,
+		},
+		{
+			name:     "oauth enabled",
+			field:    "OAuth.Enabled",
+			expected: false,
+			actual:   cfg.OAuth.Enabled,
+		},
+		{
+			name:     "logging level",
+			field:    "Logging.Level",
+			expected: "info",
+			actual:   cfg.Logging.Level,
+		},
+		{
+			name:     "logging format",
+			field:    "Logging.Format",
+			expected: "text",
+			actual:   cfg.Logging.Format,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			assert.Equal(t, tt.expected, tt.actual, "Expected %s '%v', got '%v'", tt.field, tt.expected, tt.actual)
+		})
+	}
+
+	// Test server constants separately
+	assert.Equal(t, ServerName, "KorAP MCP Server", "Server name constant should match expected value")
+	assert.Equal(t, ServerVersion, "0.1.0", "Server version constant should match expected value")
+}
+
+func TestCLI_EmptyConfiguration(t *testing.T) {
+	cli := &CLI{}
+
+	// Empty configuration should fail validation
+	_, err := cli.ValidateAndSetupLogging()
+	assert.Error(t, err, "Expected validation error for empty configuration")
+}
+
+func TestCLI_StructureForKong(t *testing.T) {
+	// This test ensures the CLI structure is compatible with Kong
+	cli := &CLI{}
+
+	// Should be able to set basic fields
+	cli.Config = "test-config.yaml"
+	cli.KorAP.BaseURL = "https://example.com"
+	cli.Logging.Level = "debug"
+
+	// Verify fields are set
+	assert.Equal(t, "test-config.yaml", cli.Config)
+	assert.Equal(t, "https://example.com", cli.KorAP.BaseURL)
+	assert.Equal(t, "debug", cli.Logging.Level)
+
+	// Verify constants are accessible
+	assert.Equal(t, ServerName, cli.GetServerName())
+	assert.Equal(t, ServerVersion, cli.GetServerVersion())
+}
diff --git a/config/config.go b/config/config.go
new file mode 100644
index 0000000..361ae2b
--- /dev/null
+++ b/config/config.go
@@ -0,0 +1,158 @@
+package config
+
+import (
+	"fmt"
+	"os"
+)
+
+// Config represents the complete configuration for KorAP MCP server
+type Config struct {
+	// Server configuration
+	Server ServerConfig `yaml:"server" embed:""`
+
+	// OAuth2 authentication configuration
+	OAuth OAuthConfig `yaml:"oauth"`
+
+	// KorAP API configuration
+	KorAP KorAPConfig `yaml:"korap"`
+
+	// Logging configuration
+	Logging LoggingConfig `yaml:"logging"`
+}
+
+// ServerConfig represents server-specific configuration
+type ServerConfig struct {
+	// Name is the server name (constant, not configurable)
+	Name string `yaml:"-"`
+
+	// Version is the server version (constant, not configurable)
+	Version string `yaml:"-"`
+
+	// ConfigFile is the path to the configuration file (handled by CLI layer)
+	ConfigFile string `yaml:"-"`
+}
+
+// KorAPConfig represents KorAP API configuration
+type KorAPConfig struct {
+	// BaseURL is the KorAP server base URL
+	BaseURL string `yaml:"base_url" default:"https://korap.ids-mannheim.de" help:"KorAP server base URL"`
+
+	// APIVersion is the API version to use
+	APIVersion string `yaml:"api_version" default:"v1.0" help:"KorAP API version"`
+
+	// Timeout is the HTTP request timeout in seconds
+	Timeout int `yaml:"timeout" default:"30" help:"HTTP request timeout in seconds"`
+
+	// MaxRetries is the maximum number of retry attempts
+	MaxRetries int `yaml:"max_retries" default:"3" help:"Maximum number of retry attempts"`
+}
+
+// LoggingConfig represents logging configuration
+type LoggingConfig struct {
+	// Level is the logging level (trace, debug, info, warn, error)
+	Level string `yaml:"level" default:"info" enum:"trace,debug,info,warn,error" help:"Logging level"`
+
+	// Format is the log format (json, text)
+	Format string `yaml:"format" default:"text" enum:"json,text" help:"Log output format"`
+
+	// File is the log file path (empty for stdout)
+	File string `yaml:"file" help:"Log file path (empty for stdout)"`
+}
+
+// DefaultConfig returns a default configuration
+func DefaultConfig() *Config {
+	return &Config{
+		Server: ServerConfig{
+			// Name and Version are set by the CLI layer as constants
+		},
+		OAuth: *DefaultOAuthConfig(),
+		KorAP: KorAPConfig{
+			BaseURL:    "https://korap.ids-mannheim.de",
+			APIVersion: "v1.0",
+			Timeout:    30,
+			MaxRetries: 3,
+		},
+		Logging: LoggingConfig{
+			Level:  "info",
+			Format: "text",
+		},
+	}
+}
+
+// Validate validates the complete configuration
+func (c *Config) Validate() error {
+	if err := c.OAuth.Validate(); err != nil {
+		return fmt.Errorf("oauth config validation failed: %w", err)
+	}
+
+	if err := c.KorAP.Validate(); err != nil {
+		return fmt.Errorf("korap config validation failed: %w", err)
+	}
+
+	if err := c.Logging.Validate(); err != nil {
+		return fmt.Errorf("logging config validation failed: %w", err)
+	}
+
+	return nil
+}
+
+// Validate validates KorAP configuration
+func (k *KorAPConfig) Validate() error {
+	if k.BaseURL == "" {
+		return fmt.Errorf("base_url cannot be empty")
+	}
+
+	if k.APIVersion == "" {
+		return fmt.Errorf("api_version cannot be empty")
+	}
+
+	if k.Timeout <= 0 {
+		return fmt.Errorf("timeout must be positive")
+	}
+
+	if k.MaxRetries < 0 {
+		return fmt.Errorf("max_retries cannot be negative")
+	}
+
+	return nil
+}
+
+// Validate validates logging configuration
+func (l *LoggingConfig) Validate() error {
+	validLevels := map[string]bool{
+		"trace": true,
+		"debug": true,
+		"info":  true,
+		"warn":  true,
+		"error": true,
+	}
+
+	if !validLevels[l.Level] {
+		return fmt.Errorf("invalid log level: %s", l.Level)
+	}
+
+	validFormats := map[string]bool{
+		"json": true,
+		"text": true,
+	}
+
+	if !validFormats[l.Format] {
+		return fmt.Errorf("invalid log format: %s", l.Format)
+	}
+
+	// Check if log file is writable if specified
+	if l.File != "" {
+		file, err := os.OpenFile(l.File, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
+		if err != nil {
+			return fmt.Errorf("cannot write to log file %s: %w", l.File, err)
+		}
+		file.Close()
+	}
+
+	return nil
+}
+
+// GetKorAPEndpoint returns the full KorAP API endpoint URL
+func (k *KorAPConfig) GetKorAPEndpoint() string {
+	return fmt.Sprintf("%s/api/%s", k.BaseURL, k.APIVersion)
+}
diff --git a/config/config_test.go b/config/config_test.go
new file mode 100644
index 0000000..5482d0c
--- /dev/null
+++ b/config/config_test.go
@@ -0,0 +1,273 @@
+package config
+
+import (
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestDefaultConfig(t *testing.T) {
+	cfg := DefaultConfig()
+
+	assert.NotNil(t, cfg)
+
+	// Note: Server name and version are now set by the CLI layer as constants
+	// so they will be empty in the default config
+
+	// Test KorAP defaults
+	assert.Equal(t, "https://korap.ids-mannheim.de", cfg.KorAP.BaseURL)
+	assert.Equal(t, "v1.0", cfg.KorAP.APIVersion)
+	assert.Equal(t, 30, cfg.KorAP.Timeout)
+	assert.Equal(t, 3, cfg.KorAP.MaxRetries)
+
+	// Test OAuth defaults
+	assert.False(t, cfg.OAuth.Enabled, "Expected OAuth to be disabled by default")
+
+	// Test logging defaults
+	assert.Equal(t, "info", cfg.Logging.Level)
+	assert.Equal(t, "text", cfg.Logging.Format)
+}
+
+func TestConfigValidate(t *testing.T) {
+	// Test valid configuration
+	cfg := DefaultConfig()
+	err := cfg.Validate()
+	assert.NoError(t, err)
+
+	// Test invalid OAuth configuration
+	cfg.OAuth.Enabled = true
+	cfg.OAuth.ClientID = ""
+	err = cfg.Validate()
+	assert.Error(t, err, "Expected validation error for empty OAuth client ID")
+
+	// Test invalid KorAP configuration
+	cfg = DefaultConfig()
+	cfg.KorAP.BaseURL = ""
+	err = cfg.Validate()
+	assert.Error(t, err, "Expected validation error for empty KorAP base URL")
+
+	// Test invalid logging configuration
+	cfg = DefaultConfig()
+	cfg.Logging.Level = "invalid"
+	err = cfg.Validate()
+	assert.Error(t, err, "Expected validation error for invalid log level")
+}
+
+func TestKorAPConfigValidate(t *testing.T) {
+	tests := []struct {
+		name      string
+		config    KorAPConfig
+		expectErr bool
+	}{
+		{
+			name: "valid config",
+			config: KorAPConfig{
+				BaseURL:    "https://korap.ids-mannheim.de",
+				APIVersion: "v1.0",
+				Timeout:    30,
+				MaxRetries: 3,
+			},
+			expectErr: false,
+		},
+		{
+			name: "empty base URL",
+			config: KorAPConfig{
+				BaseURL:    "",
+				APIVersion: "v1.0",
+				Timeout:    30,
+				MaxRetries: 3,
+			},
+			expectErr: true,
+		},
+		{
+			name: "empty API version",
+			config: KorAPConfig{
+				BaseURL:    "https://korap.ids-mannheim.de",
+				APIVersion: "",
+				Timeout:    30,
+				MaxRetries: 3,
+			},
+			expectErr: true,
+		},
+		{
+			name: "zero timeout",
+			config: KorAPConfig{
+				BaseURL:    "https://korap.ids-mannheim.de",
+				APIVersion: "v1.0",
+				Timeout:    0,
+				MaxRetries: 3,
+			},
+			expectErr: true,
+		},
+		{
+			name: "negative timeout",
+			config: KorAPConfig{
+				BaseURL:    "https://korap.ids-mannheim.de",
+				APIVersion: "v1.0",
+				Timeout:    -1,
+				MaxRetries: 3,
+			},
+			expectErr: true,
+		},
+		{
+			name: "negative max retries",
+			config: KorAPConfig{
+				BaseURL:    "https://korap.ids-mannheim.de",
+				APIVersion: "v1.0",
+				Timeout:    30,
+				MaxRetries: -1,
+			},
+			expectErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.config.Validate()
+			if tt.expectErr {
+				assert.Error(t, err, "Expected validation error but got none")
+			} else {
+				assert.NoError(t, err, "Unexpected validation error")
+			}
+		})
+	}
+}
+
+func TestKorAPConfigGetEndpoint(t *testing.T) {
+	config := KorAPConfig{
+		BaseURL:    "https://korap.ids-mannheim.de",
+		APIVersion: "v1.0",
+	}
+
+	expected := "https://korap.ids-mannheim.de/api/v1.0"
+	actual := config.GetKorAPEndpoint()
+
+	assert.Equal(t, expected, actual)
+}
+
+func TestLoggingConfigValidate(t *testing.T) {
+	tests := []struct {
+		name      string
+		config    LoggingConfig
+		expectErr bool
+	}{
+		{
+			name: "valid text format",
+			config: LoggingConfig{
+				Level:  "info",
+				Format: "text",
+			},
+			expectErr: false,
+		},
+		{
+			name: "valid json format",
+			config: LoggingConfig{
+				Level:  "debug",
+				Format: "json",
+			},
+			expectErr: false,
+		},
+		{
+			name: "invalid level",
+			config: LoggingConfig{
+				Level:  "invalid",
+				Format: "text",
+			},
+			expectErr: true,
+		},
+		{
+			name: "invalid format",
+			config: LoggingConfig{
+				Level:  "info",
+				Format: "invalid",
+			},
+			expectErr: true,
+		},
+		{
+			name: "all log levels",
+			config: LoggingConfig{
+				Level:  "trace",
+				Format: "json",
+			},
+			expectErr: false,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.config.Validate()
+			if tt.expectErr {
+				assert.Error(t, err, "Expected validation error but got none")
+			} else {
+				assert.NoError(t, err, "Unexpected validation error")
+			}
+		})
+	}
+}
+
+func TestLoggingConfigValidateWithFile(t *testing.T) {
+	// Create a temporary directory for testing
+	tempDir, err := os.MkdirTemp("", "korap-mcp-test")
+	assert.NoError(t, err, "Failed to create temp dir")
+	defer os.RemoveAll(tempDir)
+
+	// Create a writable log file
+	logFile := filepath.Join(tempDir, "test.log")
+	file, err := os.Create(logFile)
+	assert.NoError(t, err)
+	file.Close()
+
+	config := LoggingConfig{
+		Level:  "info",
+		Format: "json",
+		File:   logFile,
+	}
+
+	err = config.Validate()
+	assert.NoError(t, err, "Validation failed for writable log file")
+
+	// Test with invalid log file path
+	config.File = "/root/invalid.log"
+	err = config.Validate()
+	assert.Error(t, err, "Expected validation error for invalid log file path")
+}
+
+func TestServerConfigDefaults(t *testing.T) {
+	cfg := DefaultConfig()
+
+	assert.Empty(t, cfg.Server.ConfigFile, "Expected empty config file by default")
+
+	// Name and version are now constants set by CLI layer, so they will be empty here
+	assert.Empty(t, cfg.Server.Name, "Server name should be empty in default config (set by CLI constants)")
+	assert.Empty(t, cfg.Server.Version, "Server version should be empty in default config (set by CLI constants)")
+}
+
+// Benchmark tests
+func BenchmarkDefaultConfig(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_ = DefaultConfig()
+	}
+}
+
+func BenchmarkConfigValidate(b *testing.B) {
+	cfg := DefaultConfig()
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		_ = cfg.Validate()
+	}
+}
+
+func BenchmarkKorAPGetEndpoint(b *testing.B) {
+	config := KorAPConfig{
+		BaseURL:    "https://korap.ids-mannheim.de",
+		APIVersion: "v1.0",
+	}
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		_ = config.GetKorAPEndpoint()
+	}
+}
diff --git a/config/oauth.go b/config/oauth.go
new file mode 100644
index 0000000..b015f16
--- /dev/null
+++ b/config/oauth.go
@@ -0,0 +1,83 @@
+package config
+
+import (
+	"fmt"
+
+	"golang.org/x/oauth2"
+)
+
+// OAuthConfig represents OAuth2 configuration for KorAP authentication
+type OAuthConfig struct {
+	// ClientID is the OAuth2 client identifier
+	ClientID string `yaml:"client_id"`
+
+	// ClientSecret is the OAuth2 client secret
+	ClientSecret string `yaml:"client_secret"`
+
+	// AuthURL is the authorization endpoint URL
+	AuthURL string `yaml:"auth_url"`
+
+	// TokenURL is the token endpoint URL
+	TokenURL string `yaml:"token_url"`
+
+	// RedirectURL is the callback URL for authorization code flow
+	RedirectURL string `yaml:"redirect_url"`
+
+	// Scopes are the requested OAuth2 scopes
+	Scopes []string `yaml:"scopes"`
+
+	// Enabled indicates whether OAuth2 authentication is enabled
+	Enabled bool `yaml:"enabled"`
+}
+
+// DefaultOAuthConfig returns a default OAuth2 configuration
+func DefaultOAuthConfig() *OAuthConfig {
+	return &OAuthConfig{
+		AuthURL:     "https://korap.ids-mannheim.de/api/v1.0/oauth2/authorize",
+		TokenURL:    "https://korap.ids-mannheim.de/api/v1.0/oauth2/token",
+		RedirectURL: "urn:ietf:wg:oauth:2.0:oob",
+		Scopes:      []string{"read"},
+		Enabled:     false,
+	}
+}
+
+// ToOAuth2Config converts the config to golang.org/x/oauth2.Config
+func (c *OAuthConfig) ToOAuth2Config() *oauth2.Config {
+	if !c.Enabled {
+		return nil
+	}
+
+	return &oauth2.Config{
+		ClientID:     c.ClientID,
+		ClientSecret: c.ClientSecret,
+		Endpoint: oauth2.Endpoint{
+			AuthURL:  c.AuthURL,
+			TokenURL: c.TokenURL,
+		},
+		RedirectURL: c.RedirectURL,
+		Scopes:      c.Scopes,
+	}
+}
+
+// Validate checks if the OAuth2 configuration is valid
+func (c *OAuthConfig) Validate() error {
+	if !c.Enabled {
+		return nil
+	}
+
+	if c.ClientID == "" {
+		return fmt.Errorf("oauth2 client_id is required when authentication is enabled")
+	}
+
+	if c.ClientSecret == "" {
+		return fmt.Errorf("oauth2 client_secret is required when authentication is enabled")
+	}
+
+	if c.TokenURL == "" {
+		return fmt.Errorf("oauth2 token_url is required when authentication is enabled")
+	}
+
+	// AuthURL is only required for authorization code flow, not client credentials
+
+	return nil
+}
diff --git a/config/oauth_test.go b/config/oauth_test.go
new file mode 100644
index 0000000..e658910
--- /dev/null
+++ b/config/oauth_test.go
@@ -0,0 +1,259 @@
+package config
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestDefaultOAuthConfig(t *testing.T) {
+	config := DefaultOAuthConfig()
+
+	assert.NotNil(t, config)
+
+	// Test default values
+	assert.Equal(t, "https://korap.ids-mannheim.de/api/v1.0/oauth2/authorize", config.AuthURL)
+	assert.Equal(t, "https://korap.ids-mannheim.de/api/v1.0/oauth2/token", config.TokenURL)
+	assert.Equal(t, "urn:ietf:wg:oauth:2.0:oob", config.RedirectURL)
+	assert.Equal(t, []string{"read"}, config.Scopes)
+	assert.False(t, config.Enabled)
+
+	// Test that required fields are empty by default
+	assert.Empty(t, config.ClientID)
+	assert.Empty(t, config.ClientSecret)
+
+	// Test ToOAuth2Config with disabled config
+	oauth2Config := config.ToOAuth2Config()
+	assert.Nil(t, oauth2Config, "ToOAuth2Config should return nil when disabled")
+
+	// Test validation of default (disabled) config
+	err := config.Validate()
+	assert.NoError(t, err, "Default config should be valid (disabled)")
+}
+
+func TestOAuthConfigValidate(t *testing.T) {
+	tests := []struct {
+		name      string
+		config    *OAuthConfig
+		wantError bool
+		errorMsg  string
+	}{
+		{
+			name: "valid enabled config",
+			config: &OAuthConfig{
+				ClientID:     "test-client",
+				ClientSecret: "test-secret",
+				AuthURL:      "https://example.com/auth",
+				TokenURL:     "https://example.com/token",
+				RedirectURL:  "https://example.com/callback",
+				Scopes:       []string{"read"},
+				Enabled:      true,
+			},
+			wantError: false,
+		},
+		{
+			name: "valid disabled config",
+			config: &OAuthConfig{
+				Enabled: false,
+			},
+			wantError: false,
+		},
+		{
+			name: "missing client ID",
+			config: &OAuthConfig{
+				ClientSecret: "test-secret",
+				AuthURL:      "https://example.com/auth",
+				TokenURL:     "https://example.com/token",
+				Enabled:      true,
+			},
+			wantError: true,
+			errorMsg:  "client_id is required",
+		},
+		{
+			name: "missing client secret",
+			config: &OAuthConfig{
+				ClientID: "test-client",
+				AuthURL:  "https://example.com/auth",
+				TokenURL: "https://example.com/token",
+				Enabled:  true,
+			},
+			wantError: true,
+			errorMsg:  "client_secret is required",
+		},
+		{
+			name: "missing token URL",
+			config: &OAuthConfig{
+				ClientID:     "test-client",
+				ClientSecret: "test-secret",
+				AuthURL:      "https://example.com/auth",
+				Enabled:      true,
+			},
+			wantError: true,
+			errorMsg:  "token_url is required",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.config.Validate()
+
+			if tt.wantError {
+				assert.Error(t, err)
+				assert.Contains(t, err.Error(), tt.errorMsg)
+			} else {
+				assert.NoError(t, err)
+			}
+		})
+	}
+}
+
+func TestOAuthConfigToOAuth2Config(t *testing.T) {
+	tests := []struct {
+		name     string
+		config   *OAuthConfig
+		wantNil  bool
+		testFunc func(*testing.T, *OAuthConfig)
+	}{
+		{
+			name: "disabled config returns nil",
+			config: &OAuthConfig{
+				ClientID:     "test-client",
+				ClientSecret: "test-secret",
+				Enabled:      false,
+			},
+			wantNil: true,
+		},
+		{
+			name: "enabled config returns valid oauth2.Config",
+			config: &OAuthConfig{
+				ClientID:     "test-client",
+				ClientSecret: "test-secret",
+				AuthURL:      "https://example.com/auth",
+				TokenURL:     "https://example.com/token",
+				RedirectURL:  "https://example.com/callback",
+				Scopes:       []string{"read", "write"},
+				Enabled:      true,
+			},
+			wantNil: false,
+			testFunc: func(t *testing.T, config *OAuthConfig) {
+				oauth2Config := config.ToOAuth2Config()
+				assert.NotNil(t, oauth2Config)
+				assert.Equal(t, config.ClientID, oauth2Config.ClientID)
+				assert.Equal(t, config.ClientSecret, oauth2Config.ClientSecret)
+				assert.Equal(t, config.AuthURL, oauth2Config.Endpoint.AuthURL)
+				assert.Equal(t, config.TokenURL, oauth2Config.Endpoint.TokenURL)
+				assert.Equal(t, config.RedirectURL, oauth2Config.RedirectURL)
+				assert.Equal(t, config.Scopes, oauth2Config.Scopes)
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oauth2Config := tt.config.ToOAuth2Config()
+
+			if tt.wantNil {
+				assert.Nil(t, oauth2Config)
+			} else {
+				assert.NotNil(t, oauth2Config)
+				if tt.testFunc != nil {
+					tt.testFunc(t, tt.config)
+				}
+			}
+		})
+	}
+}
+
+func TestOAuthConfigEdgeCases(t *testing.T) {
+	t.Run("empty scopes", func(t *testing.T) {
+		config := &OAuthConfig{
+			ClientID:     "test-client",
+			ClientSecret: "test-secret",
+			AuthURL:      "https://example.com/auth",
+			TokenURL:     "https://example.com/token",
+			Scopes:       []string{},
+			Enabled:      true,
+		}
+
+		err := config.Validate()
+		assert.NoError(t, err, "Empty scopes should be valid")
+
+		oauth2Config := config.ToOAuth2Config()
+		assert.NotNil(t, oauth2Config)
+		assert.Empty(t, oauth2Config.Scopes)
+	})
+
+	t.Run("nil scopes", func(t *testing.T) {
+		config := &OAuthConfig{
+			ClientID:     "test-client",
+			ClientSecret: "test-secret",
+			AuthURL:      "https://example.com/auth",
+			TokenURL:     "https://example.com/token",
+			Scopes:       nil,
+			Enabled:      true,
+		}
+
+		err := config.Validate()
+		assert.NoError(t, err, "Nil scopes should be valid")
+
+		oauth2Config := config.ToOAuth2Config()
+		assert.NotNil(t, oauth2Config)
+		assert.Nil(t, oauth2Config.Scopes)
+	})
+}
+
+func TestOAuthConfigScopesHandling(t *testing.T) {
+	config := &OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		RedirectURL:  "https://example.com/callback",
+		Scopes:       []string{"read", "write", "admin"},
+		Enabled:      true,
+	}
+
+	oauth2Config := config.ToOAuth2Config()
+	assert.NotNil(t, oauth2Config)
+	assert.Len(t, oauth2Config.Scopes, 3)
+	assert.Contains(t, oauth2Config.Scopes, "read")
+	assert.Contains(t, oauth2Config.Scopes, "write")
+	assert.Contains(t, oauth2Config.Scopes, "admin")
+}
+
+// Benchmark tests
+func BenchmarkDefaultOAuthConfig(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_ = DefaultOAuthConfig()
+	}
+}
+
+func BenchmarkOAuthConfigValidate(b *testing.B) {
+	cfg := DefaultOAuthConfig()
+	cfg.Enabled = true
+	cfg.ClientID = "test-client"
+	cfg.ClientSecret = "test-secret"
+	cfg.TokenURL = "https://example.com/token"
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		_ = cfg.Validate()
+	}
+}
+
+func BenchmarkOAuthConfigToOAuth2Config(b *testing.B) {
+	cfg := &OAuthConfig{
+		Enabled:      true,
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		AuthURL:      "https://example.com/auth",
+		TokenURL:     "https://example.com/token",
+		RedirectURL:  "https://example.com/callback",
+		Scopes:       []string{"read", "write"},
+	}
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		_ = cfg.ToOAuth2Config()
+	}
+}
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..55f4190
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,26 @@
+module github.com/korap/korap-mcp
+
+go 1.23.0
+
+toolchain go1.23.10
+
+require (
+	github.com/alecthomas/kong v1.11.0
+	github.com/alecthomas/kong-yaml v0.2.0
+	github.com/mark3labs/mcp-go v0.32.0
+	golang.org/x/oauth2 v0.30.0
+)
+
+require (
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/rs/zerolog v1.34.0 // indirect
+	github.com/spf13/cast v1.7.1 // indirect
+	github.com/stretchr/testify v1.10.0 // indirect
+	github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
+	golang.org/x/sys v0.12.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..e900dd3
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,58 @@
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/kong v1.11.0 h1:y++1gI7jf8O7G7l4LZo5ASFhrhJvzc+WgF/arranEmM=
+github.com/alecthomas/kong v1.11.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
+github.com/alecthomas/kong-yaml v0.2.0 h1:iiVVqVttmOsHKawlaW/TljPsjaEv1O4ODx6dloSA58Y=
+github.com/alecthomas/kong-yaml v0.2.0/go.mod h1:vMvOIy+wpB49MCZ0TA3KMts38Mu9YfRP03Q1StN69/g=
+github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
+github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
+github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8=
+github.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
+github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
+github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
+github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
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
+}
diff --git a/mcp/server.go b/mcp/server.go
new file mode 100644
index 0000000..b6d7b10
--- /dev/null
+++ b/mcp/server.go
@@ -0,0 +1,64 @@
+package mcp
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/mark3labs/mcp-go/mcp"
+	"github.com/mark3labs/mcp-go/server"
+)
+
+// Server wraps the mcp-go server with KorAP-specific functionality
+type Server struct {
+	mcpServer *server.MCPServer
+	name      string
+	version   string
+}
+
+// NewServer creates a new KorAP MCP server
+func NewServer(name, version string) *Server {
+	mcpServer := server.NewMCPServer(
+		name,
+		version,
+		server.WithToolCapabilities(true),
+	)
+
+	return &Server{
+		mcpServer: mcpServer,
+		name:      name,
+		version:   version,
+	}
+}
+
+// AddTool registers a new tool with the server
+func (s *Server) AddTool(name, description string, inputSchema map[string]interface{}, handler func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error)) error {
+	if name == "" {
+		return fmt.Errorf("tool name cannot be empty")
+	}
+	if description == "" {
+		return fmt.Errorf("tool description cannot be empty")
+	}
+
+	// Create tool using mcp-go's NewTool function
+	tool := mcp.NewTool(name, mcp.WithDescription(description))
+
+	// Add the tool and handler to the MCP server
+	s.mcpServer.AddTool(tool, handler)
+
+	return nil
+}
+
+// Serve starts the MCP server using stdio transport
+func (s *Server) Serve() error {
+	return server.ServeStdio(s.mcpServer)
+}
+
+// GetMCPServer returns the underlying mcp-go server for advanced usage
+func (s *Server) GetMCPServer() *server.MCPServer {
+	return s.mcpServer
+}
+
+// GetServerInfo returns server information
+func (s *Server) GetServerInfo() (string, string) {
+	return s.name, s.version
+}
diff --git a/mcp/server_test.go b/mcp/server_test.go
new file mode 100644
index 0000000..a0073c3
--- /dev/null
+++ b/mcp/server_test.go
@@ -0,0 +1,52 @@
+package mcp
+
+import (
+	"context"
+	"testing"
+
+	"github.com/mark3labs/mcp-go/mcp"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestNewServer(t *testing.T) {
+	server := NewServer("test-server", "1.0.0")
+	assert.NotNil(t, server)
+
+	name, version := server.GetServerInfo()
+	assert.Equal(t, "test-server", name)
+	assert.Equal(t, "1.0.0", version)
+}
+
+func TestAddTool(t *testing.T) {
+	server := NewServer("test-server", "1.0.0")
+
+	// Test adding a valid tool
+	err := server.AddTool("test-tool", "A test tool", map[string]interface{}{
+		"type": "object",
+		"properties": map[string]interface{}{
+			"input": map[string]interface{}{
+				"type": "string",
+			},
+		},
+	}, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
+		return mcp.NewToolResultText("test result"), nil
+	})
+
+	assert.NoError(t, err)
+
+	// Test adding tool with empty name
+	err = server.AddTool("", "description", map[string]interface{}{}, nil)
+	assert.Error(t, err)
+	assert.Contains(t, err.Error(), "tool name cannot be empty")
+
+	// Test adding tool with empty description
+	err = server.AddTool("name", "", map[string]interface{}{}, nil)
+	assert.Error(t, err)
+	assert.Contains(t, err.Error(), "tool description cannot be empty")
+}
+
+func TestGetMCPServer(t *testing.T) {
+	server := NewServer("test-server", "1.0.0")
+	mcpServer := server.GetMCPServer()
+	assert.NotNil(t, mcpServer)
+}
diff --git a/service/client.go b/service/client.go
new file mode 100644
index 0000000..bdc9d8b
--- /dev/null
+++ b/service/client.go
@@ -0,0 +1,238 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strings"
+	"time"
+
+	"github.com/korap/korap-mcp/auth"
+	"github.com/korap/korap-mcp/config"
+)
+
+// Client represents a KorAP API client
+type Client struct {
+	baseURL     string
+	httpClient  *http.Client
+	oauthClient *auth.OAuthClient
+}
+
+// ClientOptions configures the KorAP client
+type ClientOptions struct {
+	BaseURL     string
+	Timeout     time.Duration
+	OAuthConfig *config.OAuthConfig
+}
+
+// NewClient creates a new KorAP API client
+func NewClient(opts ClientOptions) (*Client, error) {
+	if opts.BaseURL == "" {
+		return nil, fmt.Errorf("base URL is required")
+	}
+
+	// Ensure base URL ends with /
+	baseURL := strings.TrimSuffix(opts.BaseURL, "/") + "/"
+
+	// Set default timeout if not specified
+	timeout := opts.Timeout
+	if timeout == 0 {
+		timeout = 30 * time.Second
+	}
+
+	client := &Client{
+		baseURL: baseURL,
+		httpClient: &http.Client{
+			Timeout: timeout,
+		},
+	}
+
+	// Initialize OAuth client if configuration is provided
+	if opts.OAuthConfig != nil && opts.OAuthConfig.Enabled {
+		oauthClient, err := auth.NewOAuthClient(opts.OAuthConfig)
+		if err != nil {
+			return nil, fmt.Errorf("failed to create OAuth client: %w", err)
+		}
+		client.oauthClient = oauthClient
+	}
+
+	return client, nil
+}
+
+// SetOAuthClient sets the OAuth client for authentication
+func (c *Client) SetOAuthClient(oauthClient *auth.OAuthClient) {
+	c.oauthClient = oauthClient
+}
+
+// IsAuthenticated returns true if the client has valid authentication
+func (c *Client) IsAuthenticated() bool {
+	return c.oauthClient != nil && c.oauthClient.IsAuthenticated()
+}
+
+// AuthenticateWithClientCredentials performs client credentials OAuth flow
+func (c *Client) AuthenticateWithClientCredentials(ctx context.Context) error {
+	if c.oauthClient == nil {
+		return fmt.Errorf("OAuth client not configured")
+	}
+
+	return c.oauthClient.ClientCredentialsFlow(ctx)
+}
+
+// buildURL constructs a full URL from the base URL and endpoint
+func (c *Client) buildURL(endpoint string) (string, error) {
+	endpoint = strings.TrimPrefix(endpoint, "/")
+	if endpoint == "" {
+		return c.baseURL, nil
+	}
+	fullURL, err := url.JoinPath(c.baseURL, endpoint)
+	if err != nil {
+		return "", fmt.Errorf("failed to build URL: %w", err)
+	}
+	return fullURL, nil
+}
+
+// doRequest performs an HTTP request with optional authentication
+func (c *Client) doRequest(ctx context.Context, method, endpoint string, body io.Reader) (*http.Response, error) {
+	fullURL, err := c.buildURL(endpoint)
+	if err != nil {
+		return nil, err
+	}
+
+	req, err := http.NewRequestWithContext(ctx, method, fullURL, body)
+	if err != nil {
+		return nil, fmt.Errorf("failed to create request: %w", err)
+	}
+
+	// Set common headers
+	req.Header.Set("Accept", "application/json")
+	if body != nil {
+		req.Header.Set("Content-Type", "application/json")
+	}
+
+	// Add authentication if available
+	if c.oauthClient != nil && c.oauthClient.IsAuthenticated() {
+		if err := c.oauthClient.AddAuthHeader(req); err != nil {
+			return nil, fmt.Errorf("failed to add auth header: %w", err)
+		}
+	}
+
+	// Use OAuth HTTP client if available, otherwise use default client
+	httpClient := c.httpClient
+	if c.oauthClient != nil {
+		httpClient = c.oauthClient.GetHTTPClient()
+	}
+
+	resp, err := httpClient.Do(req)
+	if err != nil {
+		return nil, fmt.Errorf("request failed: %w", err)
+	}
+
+	return resp, nil
+}
+
+// Get performs a GET request to the specified endpoint
+func (c *Client) Get(ctx context.Context, endpoint string) (*http.Response, error) {
+	return c.doRequest(ctx, http.MethodGet, endpoint, nil)
+}
+
+// Post performs a POST request to the specified endpoint with JSON body
+func (c *Client) Post(ctx context.Context, endpoint string, body interface{}) (*http.Response, error) {
+	var bodyReader io.Reader
+	if body != nil {
+		jsonBody, err := json.Marshal(body)
+		if err != nil {
+			return nil, fmt.Errorf("failed to marshal request body: %w", err)
+		}
+		bodyReader = strings.NewReader(string(jsonBody))
+	}
+
+	return c.doRequest(ctx, http.MethodPost, endpoint, bodyReader)
+}
+
+// GetJSON performs a GET request and unmarshals the JSON response
+func (c *Client) GetJSON(ctx context.Context, endpoint string, target interface{}) error {
+	resp, err := c.Get(ctx, endpoint)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
+		return c.handleErrorResponse(resp)
+	}
+
+	if err := json.NewDecoder(resp.Body).Decode(target); err != nil {
+		return fmt.Errorf("failed to decode JSON response: %w", err)
+	}
+
+	return nil
+}
+
+// PostJSON performs a POST request and unmarshals the JSON response
+func (c *Client) PostJSON(ctx context.Context, endpoint string, body interface{}, target interface{}) error {
+	resp, err := c.Post(ctx, endpoint, body)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
+		return c.handleErrorResponse(resp)
+	}
+
+	if target != nil {
+		if err := json.NewDecoder(resp.Body).Decode(target); err != nil {
+			return fmt.Errorf("failed to decode JSON response: %w", err)
+		}
+	}
+
+	return nil
+}
+
+// handleErrorResponse processes error responses from the KorAP API
+func (c *Client) handleErrorResponse(resp *http.Response) error {
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return fmt.Errorf("HTTP %d: failed to read error response", resp.StatusCode)
+	}
+
+	// Try to parse as KorAP error response
+	var errorResp ErrorResponse
+	if json.Unmarshal(body, &errorResp) == nil && errorResp.Error != "" {
+		return &APIError{
+			StatusCode: resp.StatusCode,
+			Message:    errorResp.Error,
+			Details:    errorResp.ErrorDescription,
+		}
+	}
+
+	// Fallback to generic error
+	return &APIError{
+		StatusCode: resp.StatusCode,
+		Message:    fmt.Sprintf("HTTP %d", resp.StatusCode),
+		Details:    string(body),
+	}
+}
+
+// GetBaseURL returns the base URL of the KorAP instance
+func (c *Client) GetBaseURL() string {
+	return c.baseURL
+}
+
+// Ping checks if the KorAP server is reachable
+func (c *Client) Ping(ctx context.Context) error {
+	resp, err := c.Get(ctx, "")
+	if err != nil {
+		return fmt.Errorf("failed to ping KorAP server: %w", err)
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode >= 500 {
+		return fmt.Errorf("KorAP server error: HTTP %d", resp.StatusCode)
+	}
+
+	return nil
+}
diff --git a/service/client_test.go b/service/client_test.go
new file mode 100644
index 0000000..3827b09
--- /dev/null
+++ b/service/client_test.go
@@ -0,0 +1,320 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/http/httptest"
+	"strings"
+	"testing"
+	"time"
+
+	"github.com/korap/korap-mcp/auth"
+	"github.com/korap/korap-mcp/config"
+	"github.com/stretchr/testify/assert"
+	"golang.org/x/oauth2"
+)
+
+// TestNewClient tests client creation
+func TestNewClient(t *testing.T) {
+	tests := []struct {
+		name    string
+		opts    ClientOptions
+		wantErr bool
+		errMsg  string
+	}{
+		{
+			name: "valid client without oauth",
+			opts: ClientOptions{
+				BaseURL: "https://example.com",
+				Timeout: 10 * time.Second,
+			},
+			wantErr: false,
+		},
+		{
+			name: "valid client with oauth",
+			opts: ClientOptions{
+				BaseURL: "https://example.com",
+				OAuthConfig: &config.OAuthConfig{
+					ClientID:     "test-client",
+					ClientSecret: "test-secret",
+					AuthURL:      "https://example.com/auth",
+					TokenURL:     "https://example.com/token",
+					Enabled:      true,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "invalid client - no base URL",
+			opts: ClientOptions{
+				Timeout: 10 * time.Second,
+			},
+			wantErr: true,
+			errMsg:  "base URL is required",
+		},
+		{
+			name: "invalid oauth config",
+			opts: ClientOptions{
+				BaseURL: "https://example.com",
+				OAuthConfig: &config.OAuthConfig{
+					Enabled: true, // Missing required fields
+				},
+			},
+			wantErr: true,
+			errMsg:  "failed to create OAuth client",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			client, err := NewClient(tt.opts)
+
+			if tt.wantErr {
+				assert.Error(t, err)
+				assert.Contains(t, err.Error(), tt.errMsg)
+				return
+			}
+
+			assert.NoError(t, err)
+			assert.NotNil(t, client)
+
+			// Check base URL normalization
+			assert.True(t, strings.HasSuffix(client.baseURL, "/"), "Base URL should end with /")
+
+			// Check default timeout
+			if tt.opts.Timeout == 0 {
+				assert.Equal(t, 30*time.Second, client.httpClient.Timeout, "Default timeout should be 30 seconds")
+			}
+		})
+	}
+}
+
+// TestClientMethods tests basic client HTTP methods
+func TestClientMethods(t *testing.T) {
+	// Create a mock server
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		switch r.URL.Path {
+		case "/test":
+			if r.Method == http.MethodGet {
+				w.Header().Set("Content-Type", "application/json")
+				json.NewEncoder(w).Encode(map[string]string{"message": "success"})
+			} else if r.Method == http.MethodPost {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusCreated)
+				json.NewEncoder(w).Encode(map[string]string{"created": "true"})
+			}
+		case "/error":
+			w.WriteHeader(http.StatusBadRequest)
+			json.NewEncoder(w).Encode(ErrorResponse{
+				Error:            "bad_request",
+				ErrorDescription: "Invalid request parameter",
+			})
+		case "/":
+			// Root endpoint for ping test
+			w.WriteHeader(http.StatusOK)
+			w.Write([]byte("OK"))
+		default:
+			w.WriteHeader(http.StatusNotFound)
+		}
+	}))
+	defer server.Close()
+
+	client, err := NewClient(ClientOptions{
+		BaseURL: server.URL,
+		Timeout: 5 * time.Second,
+	})
+	assert.NoError(t, err)
+
+	ctx := context.Background()
+
+	t.Run("GET request", func(t *testing.T) {
+		resp, err := client.Get(ctx, "/test")
+		assert.NoError(t, err)
+		defer resp.Body.Close()
+
+		assert.Equal(t, http.StatusOK, resp.StatusCode)
+	})
+
+	t.Run("POST request", func(t *testing.T) {
+		body := map[string]string{"key": "value"}
+		resp, err := client.Post(ctx, "/test", body)
+		assert.NoError(t, err)
+		defer resp.Body.Close()
+
+		assert.Equal(t, http.StatusCreated, resp.StatusCode)
+	})
+
+	t.Run("GetJSON", func(t *testing.T) {
+		var result map[string]string
+		err := client.GetJSON(ctx, "/test", &result)
+		assert.NoError(t, err)
+
+		assert.Equal(t, "success", result["message"])
+	})
+
+	t.Run("PostJSON", func(t *testing.T) {
+		body := map[string]string{"key": "value"}
+		var result map[string]string
+		err := client.PostJSON(ctx, "/test", body, &result)
+		assert.NoError(t, err)
+
+		assert.Equal(t, "true", result["created"])
+	})
+
+	t.Run("Error handling", func(t *testing.T) {
+		var result map[string]interface{}
+		err := client.GetJSON(ctx, "/error", &result)
+
+		assert.Error(t, err)
+
+		apiErr, ok := err.(*APIError)
+		assert.True(t, ok, "Expected APIError")
+
+		assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode)
+		assert.Equal(t, "bad_request", apiErr.Message)
+	})
+
+	t.Run("Ping", func(t *testing.T) {
+		err := client.Ping(ctx)
+		assert.NoError(t, err)
+	})
+}
+
+// TestClientAuthentication tests OAuth2 integration
+func TestClientAuthentication(t *testing.T) {
+	// Create a mock OAuth2 server
+	authServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		if r.URL.Path == "/token" {
+			// Mock token endpoint
+			w.Header().Set("Content-Type", "application/json")
+			json.NewEncoder(w).Encode(map[string]interface{}{
+				"access_token": "test-access-token",
+				"token_type":   "Bearer",
+				"expires_in":   3600,
+			})
+		}
+	}))
+	defer authServer.Close()
+
+	// Create a mock API server that checks authentication
+	apiServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		auth := r.Header.Get("Authorization")
+		if auth != "Bearer test-access-token" {
+			w.WriteHeader(http.StatusUnauthorized)
+			json.NewEncoder(w).Encode(ErrorResponse{
+				Error:            "unauthorized",
+				ErrorDescription: "Invalid or missing access token",
+			})
+			return
+		}
+
+		w.Header().Set("Content-Type", "application/json")
+		json.NewEncoder(w).Encode(map[string]string{"authenticated": "true"})
+	}))
+	defer apiServer.Close()
+
+	// Create client with OAuth2 configuration
+	oauthConfig := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		TokenURL:     authServer.URL + "/token",
+		Enabled:      true,
+	}
+
+	client, err := NewClient(ClientOptions{
+		BaseURL:     apiServer.URL,
+		OAuthConfig: oauthConfig,
+	})
+	assert.NoError(t, err)
+
+	ctx := context.Background()
+
+	t.Run("Unauthenticated request", func(t *testing.T) {
+		var result map[string]interface{}
+		err := client.GetJSON(ctx, "/", &result)
+
+		assert.Error(t, err)
+
+		apiErr, ok := err.(*APIError)
+		assert.True(t, ok, "Expected APIError")
+
+		assert.Equal(t, http.StatusUnauthorized, apiErr.StatusCode)
+	})
+
+	t.Run("Client credentials authentication", func(t *testing.T) {
+		err := client.AuthenticateWithClientCredentials(ctx)
+		assert.NoError(t, err)
+
+		assert.True(t, client.IsAuthenticated(), "Client should be authenticated")
+	})
+
+	t.Run("Authenticated request", func(t *testing.T) {
+		var result map[string]interface{}
+		err := client.GetJSON(ctx, "/", &result)
+		assert.NoError(t, err)
+
+		assert.Equal(t, "true", result["authenticated"])
+	})
+}
+
+// TestURLBuilding tests URL construction logic
+func TestURLBuilding(t *testing.T) {
+	client, err := NewClient(ClientOptions{
+		BaseURL: "https://example.com/api/v1",
+	})
+	assert.NoError(t, err)
+
+	tests := []struct {
+		endpoint string
+		expected string
+	}{
+		{"/search", "https://example.com/api/v1/search"},
+		{"search", "https://example.com/api/v1/search"},
+		{"/corpus/info", "https://example.com/api/v1/corpus/info"},
+		{"", "https://example.com/api/v1/"},
+	}
+
+	for _, tt := range tests {
+		t.Run(fmt.Sprintf("endpoint_%s", tt.endpoint), func(t *testing.T) {
+			url, err := client.buildURL(tt.endpoint)
+			assert.NoError(t, err)
+
+			assert.Equal(t, tt.expected, url)
+		})
+	}
+}
+
+// TestOAuthClientOperations tests OAuth client operations
+func TestOAuthClientOperations(t *testing.T) {
+	client, err := NewClient(ClientOptions{
+		BaseURL: "https://example.com",
+	})
+	assert.NoError(t, err)
+
+	// Test setting OAuth client
+	oauthConfig := &config.OAuthConfig{
+		ClientID:     "test-client",
+		ClientSecret: "test-secret",
+		TokenURL:     "https://example.com/token",
+		Enabled:      true,
+	}
+
+	oauthClient, err := auth.NewOAuthClient(oauthConfig)
+	assert.NoError(t, err)
+
+	// Set a mock token
+	token := &oauth2.Token{
+		AccessToken: "test-token",
+		TokenType:   "Bearer",
+		Expiry:      time.Now().Add(time.Hour),
+	}
+	oauthClient.SetToken(token)
+
+	client.SetOAuthClient(oauthClient)
+
+	assert.True(t, client.IsAuthenticated(), "Client should be authenticated after setting valid token")
+
+	assert.Equal(t, "https://example.com/", client.GetBaseURL())
+}
diff --git a/service/types.go b/service/types.go
new file mode 100644
index 0000000..d5d4036
--- /dev/null
+++ b/service/types.go
@@ -0,0 +1,123 @@
+package service
+
+import "fmt"
+
+// ErrorResponse represents a KorAP API error response
+type ErrorResponse struct {
+	Error            string `json:"error"`
+	ErrorDescription string `json:"error_description,omitempty"`
+}
+
+// APIError represents an error from the KorAP API
+type APIError struct {
+	StatusCode int
+	Message    string
+	Details    string
+}
+
+// Error implements the error interface
+func (e *APIError) Error() string {
+	if e.Details != "" {
+		return fmt.Sprintf("KorAP API error (HTTP %d): %s - %s", e.StatusCode, e.Message, e.Details)
+	}
+	return fmt.Sprintf("KorAP API error (HTTP %d): %s", e.StatusCode, e.Message)
+}
+
+// SearchRequest represents a KorAP search request
+type SearchRequest struct {
+	Query      string `json:"q"`
+	QueryLang  string `json:"ql,omitempty"`         // Query language (e.g., "poliqarp", "cosmas2", "annis")
+	Collection string `json:"collection,omitempty"` // Collection filter
+	Count      int    `json:"count,omitempty"`      // Number of results to return
+	Offset     int    `json:"offset,omitempty"`     // Offset for pagination
+	Context    string `json:"context,omitempty"`    // Context specification
+}
+
+// SearchResponse represents a KorAP search response
+type SearchResponse struct {
+	Meta    SearchMeta    `json:"meta"`
+	Query   SearchQuery   `json:"query"`
+	Matches []SearchMatch `json:"matches"`
+}
+
+// SearchMeta contains metadata about the search results
+type SearchMeta struct {
+	Count            int                    `json:"count"`
+	StartIndex       int                    `json:"startIndex"`
+	ItemsPerPage     int                    `json:"itemsPerPage"`
+	TotalResults     int                    `json:"totalResults"`
+	SearchTime       float64                `json:"searchTime,omitempty"`
+	Benchmark        string                 `json:"benchmark,omitempty"`
+	Context          string                 `json:"context,omitempty"`
+	CorpusStatistics map[string]interface{} `json:"corpusStatistics,omitempty"`
+}
+
+// SearchQuery contains information about the executed query
+type SearchQuery struct {
+	Query        string `json:"q"`
+	QueryLang    string `json:"ql,omitempty"`
+	Collection   string `json:"collection,omitempty"`
+	CutOff       bool   `json:"cutOff,omitempty"`
+	TimeExceeded bool   `json:"timeExceeded,omitempty"`
+}
+
+// SearchMatch represents a single search result match
+type SearchMatch struct {
+	Field        string                 `json:"field"`
+	PubPlace     string                 `json:"pubPlace,omitempty"`
+	TextSigle    string                 `json:"textSigle"`
+	UID          int                    `json:"UID"`
+	MatchID      string                 `json:"matchID"`
+	Snippet      string                 `json:"snippet"`
+	LeftContext  []ContextToken         `json:"leftContext,omitempty"`
+	RightContext []ContextToken         `json:"rightContext,omitempty"`
+	Position     int                    `json:"position"`
+	StartMore    bool                   `json:"startMore,omitempty"`
+	EndMore      bool                   `json:"endMore,omitempty"`
+	Match        []MatchToken           `json:"match,omitempty"`
+	Fields       map[string]interface{} `json:"fields,omitempty"`
+}
+
+// ContextToken represents a token in the context
+type ContextToken struct {
+	Type  string `json:"@type,omitempty"`
+	Text  string `json:"text"`
+	Layer string `json:"layer,omitempty"`
+	Key   string `json:"key,omitempty"`
+	Value string `json:"value,omitempty"`
+}
+
+// MatchToken represents a token in the match
+type MatchToken struct {
+	Type  string `json:"@type,omitempty"`
+	Text  string `json:"text"`
+	Layer string `json:"layer,omitempty"`
+	Key   string `json:"key,omitempty"`
+	Value string `json:"value,omitempty"`
+}
+
+// CorpusInfo represents information about a corpus
+type CorpusInfo struct {
+	ID          string                 `json:"id"`
+	Name        string                 `json:"name"`
+	Description string                 `json:"description,omitempty"`
+	Documents   int                    `json:"documents,omitempty"`
+	Tokens      int                    `json:"tokens,omitempty"`
+	Sentences   int                    `json:"sentences,omitempty"`
+	Paragraphs  int                    `json:"paragraphs,omitempty"`
+	Fields      map[string]interface{} `json:"fields,omitempty"`
+}
+
+// CorpusListResponse represents the response for corpus listing
+type CorpusListResponse struct {
+	Corpora []CorpusInfo `json:"corpora"`
+}
+
+// StatisticsResponse represents corpus statistics
+type StatisticsResponse struct {
+	Documents  int                    `json:"documents"`
+	Tokens     int                    `json:"tokens"`
+	Sentences  int                    `json:"sentences,omitempty"`
+	Paragraphs int                    `json:"paragraphs,omitempty"`
+	Fields     map[string]interface{} `json:"fields,omitempty"`
+}
