fetch_bop_data
Retrieve time series data from the IMF's BOP database by specifying frequency, country, indicator, and date range. Outputs queried data in a compact format for analysis.
Instructions
Retrieves compact format time series data from the BOP database based on the input parameters.
Args:
freq (str): Frequency (e.g., "A" for annual, "Q" for quarterly, "M" for monthly).
country (str): Country code, multiple country codes can be connected with "+".
indicator (str): Indicator code.
start (str | int): Start year.
end (str | int): End year.
Returns:
str: Description of the queried data. Do not perform further analysis or retry if the query fails.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes | ||
| end | Yes | ||
| freq | Yes | ||
| indicator | Yes | ||
| start | Yes |
Implementation Reference
- imf_data_mcp/__init__.py:122-146 (handler)The @mcp.tool() decorated function implementing the core logic of the fetch_bop_data tool. It constructs the IMF API URL for BOP dataset, fetches JSON data, and processes it using process_imf_data.@mcp.tool() def fetch_bop_data(freq: str, country: str, indicator: str, start: str | int, end: str | int) -> str: """ Retrieves compact format time series data from the BOP database based on the input parameters. Args: freq (str): Frequency (e.g., "A" for annual, "Q" for quarterly, "M" for monthly). country (str): Country code, multiple country codes can be connected with "+". indicator (str): Indicator code. start (str | int): Start year. end (str | int): End year. Returns: str: Description of the queried data. Do not perform further analysis or retry if the query fails. """ dimensions = f"{freq}.{country}.{indicator}" url = f"http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/BOP/{dimensions}?startPeriod={start}&endPeriod={end}" try: response = requests.get(url) response.raise_for_status() data = response.json() return process_imf_data(data) except Exception as e: return f"Error fetching BOP data: {str(e)}"
- imf_data_mcp/utils.py:1-51 (helper)Supporting utility function called by fetch_bop_data (and other fetch tools) to parse the IMF CompactData JSON response and format it into a human-readable string summary of the time series observations.def process_imf_data(json_data: dict) -> str: """ Process IMF data and return a string with the information. :param: json_data(dict): JSON data from the IMF API :return: (str) A string with the information from the JSON data """ try: json_data = json_data["CompactData"] dataset = json_data["DataSet"] series_list = dataset["Series"] if isinstance(series_list, dict): series_list = [series_list] elif not isinstance(series_list, list): return f"Error: Expected series_list to be a list but got {type(series_list)}" output_texts = [] for series in series_list: if series is None: output_texts.append("Warning: No indicator value.") continue country = series.get("@REF_AREA", None) obs = series.get("Obs", {}) if isinstance(obs, dict): obs = [obs] elif not isinstance(obs, list): return f"Error: Expected obs to be a list but got {type(obs)}" for _obs in obs: if _obs is None: output_texts.append( f"Warning: No indicator value for {country} in that Year, You should not try to access the data of this country." ) continue time_period = _obs.get("@TIME_PERIOD", "that Year") obs_value = _obs.get("@OBS_VALUE") if obs_value is not None: text = f"In {time_period}, {country} had an indicator value of {float(obs_value):.2f}." output_texts.append(text) else: output_texts.append(f"Warning: No indicator value for {country} in {time_period}.") return "\n".join(output_texts) except KeyError as e: return f"Error processing IMF data: Missing key {str(e)}" except Exception as e: return f"Error processing IMF data: {str(e)}"
- imf_data_mcp/__init__.py:122-122 (registration)The @mcp.tool() decorator registers the fetch_bop_data function as an MCP tool.@mcp.tool()