Newer
Older
tgclient-mcp / backend / app / config.py
from functools import lru_cache
from pathlib import Path

from pydantic import AliasChoices, Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    """Настройки tgclient-mcp, всё через env с префиксом TGCLIENT_ (см. .env.example)."""

    model_config = SettingsConfigDict(env_prefix="TGCLIENT_", env_file=".env", extra="ignore")

    # алиасы: краткий TGCLIENT_DB_PATH / TGCLIENT_SESSION_TTL (как в .env.example);
    # pydantic-settings не применяет env_prefix к AliasChoices — имена полные
    database_path: Path = Field(
        default=Path("/data/tgclient.db"),
        validation_alias=AliasChoices(
            "TGCLIENT_DB_PATH", "TGCLIENT_DATABASE_PATH",
            "tgclient_db_path", "tgclient_database_path",
        ),
    )
    # пусто = MCP доступен только персональным ключам / cookie-сессиям;
    # задан — супер-токен для скриптов, MCP, curl (handbook mcp.md: бэкдор)
    admin_token: str = ""
    # Креды приложения Telegram: один набор на деплой (api_id — приложение);
    # пусто — добавление аккаунтов недоступно, тулы отвечают 503-подобной ошибкой.
    api_id: int = 0
    api_hash: str = ""

    # Лимиты
    max_active_accounts: int = 30            # аккаунтов на пользователя
    # Пуш-события сообщений в Synapse (tg_message_*): по умолчанию выключены —
    # payload несёт личные данные; включается осознанно (TGCLIENT_NOTIFY_MESSAGES=1)
    notify_messages: bool = False
    media_max_bytes: int = 20 * 1024 * 1024  # cap download/upload через MCP
    # Каталог на диске сервера для отправки файлов через MCP-тулы
    # (upload_*.file_path — только имя файла внутри каталога, путей нет):
    # пусто — отправка с диска отключена, тула принимают только base64.
    upload_dir: str = ""
    write_limit_n: int = 20                  # мутаций на аккаунт за окно
    write_limit_window: float = 60.0

    # gnexus-auth (SSO): задан client_id — браузерная авторизация через SSO
    auth_base_url: str = ""
    auth_client_id: str = ""
    auth_client_secret: str = ""
    auth_redirect_uri: str = ""
    auth_webhook_secret: str = ""
    auth_allowlist: str = ""                 # пусто = любой залогиненный
    session_ttl_seconds: int = Field(
        default=7 * 24 * 3600,
        validation_alias=AliasChoices(
            "TGCLIENT_SESSION_TTL", "TGCLIENT_SESSION_TTL_SECONDS",
            "tgclient_session_ttl", "tgclient_session_ttl_seconds",
        ),
    )

    # Gnexus Synapse: пустой api_key = интеграция выключена
    synapse_url: str = ""
    synapse_api_key: str = ""
    synapse_default_source: str = "tgclient-mcp"
    synapse_timeout: float = 10.0


@lru_cache
def get_settings() -> Settings:
    return Settings()