config.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from pathlib import Path
  4. import os
  5. def _load_dotenv(path: Path) -> None:
  6. if not path.exists():
  7. return
  8. for raw_line in path.read_text(encoding="utf-8").splitlines():
  9. line = raw_line.strip()
  10. if not line or line.startswith("#"):
  11. continue
  12. if line.startswith("export "):
  13. line = line[len("export ") :].strip()
  14. if "=" not in line:
  15. continue
  16. key, value = line.split("=", 1)
  17. key = key.strip()
  18. value = value.strip()
  19. if not key or key in os.environ:
  20. continue
  21. if len(value) >= 2 and value[0] == value[-1] and value[0] in {'"', "'"}:
  22. value = value[1:-1]
  23. os.environ[key] = value
  24. def _env(name: str, default: str = "") -> str:
  25. return os.getenv(name, default).strip()
  26. def _int_env(name: str, default: int) -> int:
  27. value = _env(name)
  28. if not value:
  29. return default
  30. try:
  31. return int(value)
  32. except ValueError:
  33. return default
  34. def _split_csv(value: str, default: tuple[str, ...]) -> tuple[str, ...]:
  35. if not value:
  36. return default
  37. items = tuple(part.strip() for part in value.split(",") if part.strip())
  38. return items or default
  39. @dataclass(frozen=True, slots=True)
  40. class ArgusConfig:
  41. app_name: str = "argus-mcp"
  42. sqlite_path: Path = Path("data/argus_mcp.sqlite3")
  43. finnhub_token: str = ""
  44. twelve_data_key: str = ""
  45. symbols: tuple[str, ...] = ("QQQ", "SPY", "DXY", "HYG", "BTCUSD", "ETHUSD", "VXX")
  46. interval: str = "1d"
  47. finnhub_ttl_seconds: int = 60
  48. twelve_data_ttl_seconds: int = 900
  49. snapshot_ttl_seconds: int = 60
  50. def load_config() -> ArgusConfig:
  51. _load_dotenv(Path.cwd() / ".env")
  52. return ArgusConfig(
  53. sqlite_path=Path(_env("ARGUS_SQLITE_PATH", "data/argus_mcp.sqlite3")),
  54. finnhub_token=_env("FINNHUB_TOKEN"),
  55. twelve_data_key=_env("TWELVE_DATA_KEY"),
  56. symbols=_split_csv(
  57. _env("ARGUS_SYMBOLS"),
  58. ("QQQ", "SPY", "DXY", "HYG", "BTCUSD", "ETHUSD", "VXX"),
  59. ),
  60. interval=_env("ARGUS_INTERVAL", "1d"),
  61. finnhub_ttl_seconds=_int_env("ARGUS_FINNHUB_TTL_SECONDS", 60),
  62. twelve_data_ttl_seconds=_int_env("ARGUS_TWELVE_DATA_TTL_SECONDS", 900),
  63. snapshot_ttl_seconds=_int_env("ARGUS_SNAPSHOT_TTL_SECONDS", 60),
  64. )