SNCF API MCP Server

by Kryzo
Verified
import requests import logging from typing import Dict, Any, Optional, List, Union from .config import SNCF_BASE_URL # Set up logging logger = logging.getLogger(__name__) class SNCFClient: """ Client for the SNCF API """ def __init__(self, api_key: str): """ Initialize the SNCF API client Args: api_key: Your SNCF API key """ self.api_key = api_key self.auth = (api_key, "") # SNCF API uses Basic Auth with key as username def _make_request(self, endpoint: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """ Make a request to the SNCF API Args: endpoint: API endpoint path params: Query parameters Returns: API response as a dictionary """ url = f"{SNCF_BASE_URL}{endpoint}" # Clean None values from params if params: params = {k: v for k, v in params.items() if v is not None} # Log the request details logger.info(f"Making API request to: {url}") logger.info(f"Request parameters: {params}") try: response = requests.get(url, auth=self.auth, params=params) logger.info(f"Response status code: {response.status_code}") # Log response headers and content for debugging logger.info(f"Response headers: {dict(response.headers)}") if response.status_code != 200: logger.error(f"Error response content: {response.text}") response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: logger.error(f"Request exception: {str(e)}") return {"error": str(e)} def _format_list_param(self, param_name: str, values: List[str]) -> Dict[str, List[str]]: """ Format list parameters for the API Args: param_name: Parameter name values: List of values Returns: Dictionary with formatted parameter """ return {f"{param_name}[]": values}