diff --git a/services/common/src/mcp_common/environment.py b/services/common/src/mcp_common/environment.py index d09d014..2a2dcee 100644 --- a/services/common/src/mcp_common/environment.py +++ b/services/common/src/mcp_common/environment.py @@ -29,13 +29,18 @@ def resolve_environment( env_var: str, flag_key: str, exchange: str, + default_base_url_live: str | None = None, + default_base_url_testnet: str | None = None, ) -> EnvironmentInfo: """Risolvi l'ambiente per un MCP exchange. - creds: dict letto dal secret JSON. Deve contenere base_url_live e base_url_testnet. + creds: dict letto dal secret JSON. Può contenere base_url_live/base_url_testnet + per override; in assenza vengono usati i default kwargs. env_var: nome della env var di override (es. DERIBIT_TESTNET). flag_key: chiave booleana nel secret JSON (es. "testnet" o "paper" per alpaca). exchange: nome exchange per logging/info. + default_base_url_live / default_base_url_testnet: URL canonici dell'exchange, + applicati se non presenti in creds. """ env_value = os.environ.get(env_var) if env_value is not None: @@ -49,6 +54,11 @@ def resolve_environment( environment = "testnet" source = "default" + if default_base_url_live is not None: + creds.setdefault("base_url_live", default_base_url_live) + if default_base_url_testnet is not None: + creds.setdefault("base_url_testnet", default_base_url_testnet) + base_url = creds["base_url_testnet"] if environment == "testnet" else creds["base_url_live"] return EnvironmentInfo( exchange=exchange, diff --git a/services/common/tests/test_environment.py b/services/common/tests/test_environment.py index e7defb0..a142592 100644 --- a/services/common/tests/test_environment.py +++ b/services/common/tests/test_environment.py @@ -74,6 +74,37 @@ def test_env_value_truthy_parsing(monkeypatch, raw, expected): assert info.environment == expected +def test_default_base_urls_applied_when_creds_missing(monkeypatch): + monkeypatch.delenv("X_TESTNET", raising=False) + creds: dict = {} + info = resolve_environment( + creds, + env_var="X_TESTNET", + flag_key="testnet", + exchange="x", + default_base_url_live="https://live.example", + default_base_url_testnet="https://test.example", + ) + assert info.base_url == "https://test.example" + assert creds["base_url_live"] == "https://live.example" + assert creds["base_url_testnet"] == "https://test.example" + + +def test_creds_base_urls_override_defaults(monkeypatch): + monkeypatch.delenv("X_TESTNET", raising=False) + creds = {"base_url_live": "L", "base_url_testnet": "T"} + info = resolve_environment( + creds, + env_var="X_TESTNET", + flag_key="testnet", + exchange="x", + default_base_url_live="https://live.example", + default_base_url_testnet="https://test.example", + ) + assert info.base_url == "T" + assert creds["base_url_live"] == "L" + + def test_alpaca_paper_flag_key(monkeypatch): """Alpaca usa 'paper' invece di 'testnet' nel secret.""" monkeypatch.delenv("ALPACA_PAPER", raising=False) diff --git a/services/mcp-alpaca/src/mcp_alpaca/__main__.py b/services/mcp-alpaca/src/mcp_alpaca/__main__.py index e04eb28..5ad5794 100644 --- a/services/mcp-alpaca/src/mcp_alpaca/__main__.py +++ b/services/mcp-alpaca/src/mcp_alpaca/__main__.py @@ -20,14 +20,13 @@ def main(): with open(creds_file) as f: creds = json.load(f) - creds.setdefault("base_url_live", "https://api.alpaca.markets") - creds.setdefault("base_url_testnet", "https://paper-api.alpaca.markets") - env_info = resolve_environment( creds, env_var="ALPACA_PAPER", flag_key="paper", exchange="alpaca", + default_base_url_live="https://api.alpaca.markets", + default_base_url_testnet="https://paper-api.alpaca.markets", ) client = AlpacaClient( diff --git a/services/mcp-bybit/src/mcp_bybit/__main__.py b/services/mcp-bybit/src/mcp_bybit/__main__.py index b821c4f..e28c8b7 100644 --- a/services/mcp-bybit/src/mcp_bybit/__main__.py +++ b/services/mcp-bybit/src/mcp_bybit/__main__.py @@ -20,14 +20,13 @@ def main(): with open(creds_file) as f: creds = json.load(f) - creds.setdefault("base_url_live", "https://api.bybit.com") - creds.setdefault("base_url_testnet", "https://api-testnet.bybit.com") - env_info = resolve_environment( creds, env_var="BYBIT_TESTNET", flag_key="testnet", exchange="bybit", + default_base_url_live="https://api.bybit.com", + default_base_url_testnet="https://api-testnet.bybit.com", ) client = BybitClient( diff --git a/services/mcp-deribit/src/mcp_deribit/__main__.py b/services/mcp-deribit/src/mcp_deribit/__main__.py index 81b2870..3471c02 100644 --- a/services/mcp-deribit/src/mcp_deribit/__main__.py +++ b/services/mcp-deribit/src/mcp_deribit/__main__.py @@ -27,15 +27,13 @@ def main(): with open(creds_file) as f: creds = json.load(f) - # Default base URLs per backward-compat con secret schema legacy - creds.setdefault("base_url_live", "https://www.deribit.com/api/v2") - creds.setdefault("base_url_testnet", "https://test.deribit.com/api/v2") - env_info = resolve_environment( creds, env_var="DERIBIT_TESTNET", flag_key="testnet", exchange="deribit", + default_base_url_live="https://www.deribit.com/api/v2", + default_base_url_testnet="https://test.deribit.com/api/v2", ) client = DeribitClient( diff --git a/services/mcp-hyperliquid/src/mcp_hyperliquid/__main__.py b/services/mcp-hyperliquid/src/mcp_hyperliquid/__main__.py index 0d623ad..512dc58 100644 --- a/services/mcp-hyperliquid/src/mcp_hyperliquid/__main__.py +++ b/services/mcp-hyperliquid/src/mcp_hyperliquid/__main__.py @@ -19,14 +19,13 @@ def main(): with open(wallet_file) as f: creds = json.load(f) - creds.setdefault("base_url_live", "https://api.hyperliquid.xyz") - creds.setdefault("base_url_testnet", "https://api.hyperliquid-testnet.xyz") - env_info = resolve_environment( creds, env_var="HYPERLIQUID_TESTNET", flag_key="testnet", exchange="hyperliquid", + default_base_url_live="https://api.hyperliquid.xyz", + default_base_url_testnet="https://api.hyperliquid-testnet.xyz", ) client = HyperliquidClient(