""" app/config.py Runtime configuration loaded from environment variables with sensible defaults. """ from __future__ import annotations import os from dataclasses import dataclass, field @dataclass class Settings: # Server host: str = "0.0.0.0" http_port: int = 8000 # Database db_path: str = "data/local_mcp.sqlite3" # Logging log_level: str = "INFO" # MCP / queue behaviour (runtime-editable values are stored in DB; these are defaults for first run) default_wait_seconds: int = 10 default_empty_response: str = "" agent_stale_after_seconds: int = 30 # MCP server name mcp_server_name: str = "local-mcp" # MCP transport — stateless=True means no session IDs, survives server restarts. # Set MCP_STATELESS=false to use stateful sessions (needed for multi-turn MCP flows). mcp_stateless: bool = True # Authentication — set API_TOKEN env var to enable; empty string disables auth entirely. api_token: str = "" def _parse_bool(value: str, default: bool) -> bool: if value.lower() in ("1", "true", "yes", "on"): return True if value.lower() in ("0", "false", "no", "off"): return False return default def load_settings() -> Settings: """Load settings from environment variables, falling back to defaults.""" return Settings( host=os.getenv("HOST", "0.0.0.0"), http_port=int(os.getenv("HTTP_PORT", "8000")), db_path=os.getenv("DB_PATH", "data/local_mcp.sqlite3"), log_level=os.getenv("LOG_LEVEL", "INFO"), default_wait_seconds=int(os.getenv("DEFAULT_WAIT_SECONDS", "10")), default_empty_response=os.getenv("DEFAULT_EMPTY_RESPONSE", ""), agent_stale_after_seconds=int(os.getenv("AGENT_STALE_AFTER_SECONDS", "30")), mcp_server_name=os.getenv("MCP_SERVER_NAME", "local-mcp"), mcp_stateless=_parse_bool(os.getenv("MCP_STATELESS", "true"), default=True), api_token=os.getenv("API_TOKEN", ""), ) # Singleton – imported and used throughout the app settings: Settings = load_settings()