Skip to main content
Glama
cfocoder

Banxico MCP Server

get_date_range_data

Retrieve historical USD/MXN exchange rate data from Banxico for specific date ranges to analyze currency trends and financial performance.

Instructions

Get exchange rate data for a specific date range.

Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format series_id: The series ID (default: SF63528 for USD/MXN)

Returns: Exchange rate data for the specified date range

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
start_dateYes
end_dateYes
series_idNoSF63528

Implementation Reference

  • The handler function for the 'get_date_range_data' tool. Decorated with @mcp.tool() for automatic registration in FastMCP. Fetches Banxico API data for a given date range and series ID, handles token and request errors, and returns formatted data using helper functions.
    @mcp.tool()
    async def get_date_range_data(start_date: str, end_date: str, series_id: str = "SF63528") -> str:
        """
        Get exchange rate data for a specific date range.
        
        Args:
            start_date: Start date in YYYY-MM-DD format
            end_date: End date in YYYY-MM-DD format
            series_id: The series ID (default: SF63528 for USD/MXN)
            
        Returns:
            Exchange rate data for the specified date range
        """
        if not BANXICO_TOKEN:
            return "Error: BANXICO_API_TOKEN environment variable not set. Please configure your API token."
        
        endpoint = f"series/{series_id}/datos/{start_date}/{end_date}"
        data = await make_banxico_request(endpoint, BANXICO_TOKEN)
        
        if not data:
            return f"Failed to retrieve data for {series_id} from {start_date} to {end_date}. Please check your API token and network connection."
        
        return format_exchange_rate_data(data)
  • Helper function used by get_date_range_data to make authenticated HTTP requests to the Banxico SIE API with comprehensive error handling.
    async def make_banxico_request(endpoint: str, token: str) -> dict[str, Any] | None:
        """
        Make a request to the Banxico SIE API with proper error handling.
        
        Args:
            endpoint: The API endpoint to call (without base URL)
            token: The Banxico API token
            
        Returns:
            JSON response data or None if request failed
        """
        url = f"{BANXICO_API_BASE}/{endpoint}"
        headers = {"User-Agent": USER_AGENT}
        params = {"token": token}
        
        try:
            async with httpx.AsyncClient() as client:
                response = await client.get(url, headers=headers, params=params, timeout=30.0)
                response.raise_for_status()
                return response.json()
        except httpx.HTTPError as e:
            logger.error(f"HTTP error occurred: {e}")
            return None
        except Exception as e:
            logger.error(f"An error occurred: {e}")
            return None
  • Helper function used by get_date_range_data to format the raw JSON data from Banxico API into a human-readable string, showing series info and data points.
    def format_exchange_rate_data(data: dict[str, Any]) -> str:
        """
        Format exchange rate data into a readable string.
        
        Args:
            data: Raw JSON response from Banxico API
            
        Returns:
            Formatted string with exchange rate information
        """
        if not data or "bmx" not in data:
            return "No data available"
        
        series_list = data["bmx"].get("series", [])
        if not series_list:
            return "No series data found"
        
        result = []
        for series in series_list:
            series_title = series.get("titulo", "Unknown Series")
            series_id = series.get("idSerie", "Unknown ID")
            result.append(f"Series: {series_title} (ID: {series_id})")
            
            datos = series.get("datos", [])
            if not datos:
                result.append("  No data points available")
            else:
                result.append(f"  Total data points: {len(datos)}")
                # Show first few and last few data points
                if len(datos) <= 10:
                    for dato in datos:
                        fecha = dato.get("fecha", "Unknown date")
                        valor = dato.get("dato", "N/A")
                        result.append(f"  {fecha}: {valor}")
                else:
                    # Show first 5
                    for i, dato in enumerate(datos[:5]):
                        fecha = dato.get("fecha", "Unknown date")
                        valor = dato.get("dato", "N/A")
                        result.append(f"  {fecha}: {valor}")
                    
                    result.append(f"  ... ({len(datos) - 10} more data points) ...")
                    
                    # Show last 5
                    for dato in datos[-5:]:
                        fecha = dato.get("fecha", "Unknown date")
                        valor = dato.get("dato", "N/A")
                        result.append(f"  {fecha}: {valor}")
            
            result.append("")  # Empty line between series
        
        return "\n".join(result)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cfocoder/banxico_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server