"""Configuration management for OSINT MCP."""
import os
from dataclasses import dataclass, field
from typing import Optional
from functools import lru_cache
@dataclass
class Settings:
"""OSINT MCP Settings - loaded from environment."""
# Censys Platform API
censys_api_token: Optional[str] = field(default_factory=lambda: os.getenv("CENSYS_API_TOKEN") or os.getenv("CENSYS_API_KEY"))
# Shodan
shodan_api_key: Optional[str] = field(default_factory=lambda: os.getenv("SHODAN_API_KEY"))
# Hunter.io
hunter_api_key: Optional[str] = field(default_factory=lambda: os.getenv("HUNTER_API_KEY"))
# Apollo.io
apollo_api_key: Optional[str] = field(default_factory=lambda: os.getenv("APOLLO_API_KEY"))
# LinkedIn (RapidAPI)
rapidapi_key: Optional[str] = field(default_factory=lambda: os.getenv("RAPIDAPI_KEY"))
# Perplexity AI
perplexity_api_key: Optional[str] = field(default_factory=lambda: os.getenv("PERPLEXITY_API_KEY"))
# Have I Been Pwned
hibp_api_key: Optional[str] = field(default_factory=lambda: os.getenv("HIBP_API_KEY"))
# Twitter (RapidAPI)
twitter_rapidapi_key: Optional[str] = field(default_factory=lambda: os.getenv("TWITTER_RAPIDAPI_KEY"))
# Reddit (optional - public API works without)
reddit_client_id: Optional[str] = field(default_factory=lambda: os.getenv("REDDIT_CLIENT_ID"))
reddit_client_secret: Optional[str] = field(default_factory=lambda: os.getenv("REDDIT_CLIENT_SECRET"))
def get_available_services(self) -> dict[str, bool]:
"""Return dict of service availability."""
return {
"censys": bool(self.censys_api_token),
"shodan": bool(self.shodan_api_key),
"hunter": bool(self.hunter_api_key),
"apollo": bool(self.apollo_api_key),
"linkedin": bool(self.rapidapi_key),
"perplexity": bool(self.perplexity_api_key),
"hibp": bool(self.hibp_api_key),
"twitter": bool(self.twitter_rapidapi_key or self.rapidapi_key),
"reddit": True, # Public API works without auth
"github": True, # Public API works without auth
"sherlock": True, # Local tool
"holehe": True, # Local tool
"sec_edgar": True, # Public API
"whois": True, # Public
"dns": True, # Public
}
@lru_cache()
def get_settings() -> Settings:
"""Get cached settings instance."""
return Settings()