Skip to main content
Glama
xinkuang

China Stock MCP

by xinkuang

get_macro_data

Retrieve macroeconomic indicator data for China including GDP, CPI, PMI, money supply, and stock market summaries in multiple output formats.

Instructions

获取宏观经济指标数据,支持多个指标

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
indicatorNo要获取的宏观经济指标,可以是逗号分隔的字符串(例如: 'gdp,cpi')或字符串列表(例如: ['gdp', 'cpi'])。支持的指标包括: money_supply, gdp, cpi, pmi, stock_summary。默认: 'gdp'gdp
output_formatNo输出数据格式: json, csv, xml, excel, markdown, html。默认: markdownmarkdown

Implementation Reference

  • Tool registration decorator defining the name and description for get_macro_data.
    @mcp.tool(name="get_macro_data", description="获取宏观经济指标数据,支持多个指标")
  • Main handler function for get_macro_data tool. Parses indicators, fetches data using akshare functions via cached fetcher, cleans data, concatenates results, and formats output.
    def get_macro_data(    
        indicator: Annotated[
            str | list[
                Literal["money_supply", "gdp", "cpi", "pmi", "stock_summary"]
            ] | None,
            Field(
                description="要获取的宏观经济指标,可以是逗号分隔的字符串(例如: 'gdp,cpi')或字符串列表(例如: ['gdp', 'cpi'])。支持的指标包括: money_supply, gdp, cpi, pmi, stock_summary。默认: 'gdp'"
            ),
        ] = "gdp",
        output_format: Annotated[
            Literal["json", "csv", "xml", "excel", "markdown", "html"],
            Field(description="输出数据格式: json, csv, xml, excel, markdown, html。默认: markdown"),
        ] = "markdown"
        ) -> str:
            """获取宏观经济数据"""
    
            def _clean_macro_data(df: pd.DataFrame) -> pd.DataFrame:
                """
                通用数据清洗函数,删除全 null 列和全 null 行。
                """
                if df.empty:
                    return df
                # 删除所有列值都为 null 的列
                df = df.dropna(axis=1, how='all')
                # 删除所有行值都为 null 的行
                df = df.dropna(axis=0, how='all')
                return df
            
            macro_indicator_map = {
                "money_supply": ak.macro_china_money_supply,
                "gdp": ak.macro_china_gdp_yearly,
                "cpi": ak.macro_china_cpi_yearly,
                "pmi": ak.macro_china_pmi_yearly,
                "stock_summary": ak.macro_china_stock_market_cap,
            }
    
            @cached_data_fetch()
            def get_macro_data_fetcher(
                indicator_name: str, **kwargs: Any
            ) -> pd.DataFrame:
                fetch_func = macro_indicator_map.get(indicator_name)
                if fetch_func:
                    return fetch_func(**kwargs)
                else:
                    raise ValueError(f"不支持的宏观经济指标: {indicator_name}")
            
            if indicator is None:
                indicator_list = ["gdp"] # 默认指标
            elif isinstance(indicator, str):
                indicator_list = [
                    ind.strip()
                    for ind in indicator.split(",")
                    if ind.strip()
                ]
            else: # 假设是 list[Literal[...]]
                indicator_list = indicator
            
            # 过滤掉无效的指标
            valid_indicators = []
            for ind in indicator_list:
                if ind in macro_indicator_map:
                    valid_indicators.append(ind)
                else:
                    print(f"警告: 宏观经济指标 '{ind}' 不存在,将被忽略。")
            
            if not valid_indicators:
                print("警告: 未找到有效的宏观经济指标,将返回空数据。")
                return _format_dataframe_output(pd.DataFrame(), output_format)
    
            df_list = []
            for ind in valid_indicators:
                try:
                    temp_df = get_macro_data_fetcher(ind)
                    if temp_df is not None and not temp_df.empty:
                        temp_df = _clean_macro_data(temp_df)
                        temp_df['indicator'] = ind # 添加指标名称列
                        df_list.append(temp_df)
                except Exception as e:
                    print(f"获取宏观经济指标 '{ind}' 失败: {e}")
            
            if df_list:
                df = pd.concat(df_list, ignore_index=True)
            else:
                df = pd.DataFrame() # 如果没有获取到任何数据,返回空的DataFrame
                
            return _format_dataframe_output(df, output_format)
  • Input schema definitions using Pydantic Annotated and Field for indicator parameter (supports multiple macro types) and output_format.
    indicator: Annotated[
        str | list[
            Literal["money_supply", "gdp", "cpi", "pmi", "stock_summary"]
        ] | None,
        Field(
            description="要获取的宏观经济指标,可以是逗号分隔的字符串(例如: 'gdp,cpi')或字符串列表(例如: ['gdp', 'cpi'])。支持的指标包括: money_supply, gdp, cpi, pmi, stock_summary。默认: 'gdp'"
        ),
    ] = "gdp",
    output_format: Annotated[
        Literal["json", "csv", "xml", "excel", "markdown", "html"],
        Field(description="输出数据格式: json, csv, xml, excel, markdown, html。默认: markdown"),
    ] = "markdown"
    ) -> str:
  • Cached helper function to fetch data for a specific macro indicator using the mapped akshare functions.
    def get_macro_data_fetcher(
        indicator_name: str, **kwargs: Any
    ) -> pd.DataFrame:
        fetch_func = macro_indicator_map.get(indicator_name)
        if fetch_func:
            return fetch_func(**kwargs)
        else:
            raise ValueError(f"不支持的宏观经济指标: {indicator_name}")
  • Helper function to clean macro data by dropping all-null rows and columns.
    def _clean_macro_data(df: pd.DataFrame) -> pd.DataFrame:
        """
        通用数据清洗函数,删除全 null 列和全 null 行。
        """
        if df.empty:
            return df
        # 删除所有列值都为 null 的列
        df = df.dropna(axis=1, how='all')
        # 删除所有行值都为 null 的行
        df = df.dropna(axis=0, how='all')
        return df

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/xinkuang/china-stock-mcp'

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