"""Configuration management for Jana MCP Server."""
from functools import lru_cache
from pydantic import Field, SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
from jana_mcp.utils.logging import LogLevel
class Settings(BaseSettings):
"""Application settings loaded from environment variables."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore",
)
# Jana Backend Configuration
jana_backend_url: str = Field(
default="http://web:8000",
description="Jana backend API base URL",
)
jana_username: str | None = Field(
default=None,
description="Jana backend username for authentication",
)
jana_password: SecretStr | None = Field(
default=None,
description="Jana backend password for authentication",
)
jana_token: SecretStr | None = Field(
default=None,
description="Pre-configured authentication token (alternative to username/password)",
)
jana_timeout: int = Field(
default=30,
ge=1,
le=300,
description="Request timeout in seconds",
)
jana_host_header: str | None = Field(
default=None,
description="Override Host header for Docker networking (e.g., 'localhost')",
)
# Server Configuration
mcp_server_host: str = Field(
default="0.0.0.0",
description="Server bind address",
)
mcp_server_port: int = Field(
default=8080,
ge=1,
le=65535,
description="Server port",
)
log_level: LogLevel = Field(
default="INFO",
description="Logging level (DEBUG, INFO, WARNING, ERROR)",
)
@property
def has_credentials(self) -> bool:
"""Check if authentication credentials are configured."""
return bool(self.jana_token) or bool(self.jana_username and self.jana_password)
def get_auth_token(self) -> str | None:
"""Get the authentication token if configured."""
if self.jana_token:
return self.jana_token.get_secret_value()
return None
def get_password(self) -> str | None:
"""Get the password if configured."""
if self.jana_password:
return self.jana_password.get_secret_value()
return None
@lru_cache
def get_settings() -> Settings:
"""Get cached application settings."""
return Settings()