Skip to main content
Glama
Xxx00xxX33

FinanceMCP

by Xxx00xxX33

macro_econ

Access macroeconomic data including interest rates (Shibor, LPR, Libor, Hibor), GDP, CPI, PPI, money supply, PMI, and social financing metrics for financial analysis and research.

Instructions

获取宏观经济数据,包括Shibor利率、LPR利率、GDP、CPI、PPI、货币供应量、PMI、社融数据、Shibor报价、Libor、Hibor等

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
indicatorYes指标类型,可选值:shibor(上海银行间同业拆放利率)、lpr(贷款市场报价利率)、gdp(国内生产总值)、cpi(居民消费价格指数)、ppi(工业生产者出厂价格指数)、cn_m(货币供应量)、cn_pmi(采购经理指数)、cn_sf(社会融资规模)、shibor_quote(Shibor银行报价数据)、libor(伦敦银行间同业拆借利率)、hibor(香港银行间同业拆借利率)
start_dateYes起始日期,格式为YYYYMMDD,如'20230101'
end_dateYes结束日期,格式为YYYYMMDD,如'20230131'

Implementation Reference

  • The core handler function `macroEcon.run` that executes the tool: validates input, calls Tushare API based on indicator (shibor, lpr, gdp, etc.), processes and formats macroeconomic data for display.
        async run(args) {
            try {
                console.log(`使用Tushare API获取${args.indicator}宏观经济数据`);
                // 使用全局配置中的Tushare API设置
                const TUSHARE_API_KEY = TUSHARE_CONFIG.API_TOKEN;
                const TUSHARE_API_URL = TUSHARE_CONFIG.API_URL;
                // 验证指标类型
                const validIndicators = ['shibor', 'lpr', 'gdp', 'cpi', 'ppi', 'cn_m', 'cn_pmi', 'cn_sf', 'shibor_quote', 'libor', 'hibor'];
                if (!validIndicators.includes(args.indicator)) {
                    throw new Error(`不支持的指标类型: ${args.indicator}。支持的类型有: ${validIndicators.join(', ')}`);
                }
                // 根据指标类型设置不同的默认时间范围
                const today = new Date();
                const defaultEndDate = today.toISOString().slice(0, 10).replace(/-/g, '');
                let defaultStartDate = '';
                // 日期格式数据:默认30天
                const dailyIndicators = ['shibor', 'lpr', 'shibor_quote', 'libor', 'hibor'];
                // 月份格式数据:默认12个月
                const monthlyIndicators = ['cpi', 'ppi', 'cn_m', 'cn_pmi', 'cn_sf'];
                // 季度格式数据:默认8个季度
                const quarterlyIndicators = ['gdp'];
                if (dailyIndicators.includes(args.indicator)) {
                    // 30天前
                    const thirtyDaysAgo = new Date();
                    thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
                    defaultStartDate = thirtyDaysAgo.toISOString().slice(0, 10).replace(/-/g, '');
                }
                else if (monthlyIndicators.includes(args.indicator)) {
                    // 12个月前
                    const twelveMonthsAgo = new Date();
                    twelveMonthsAgo.setMonth(twelveMonthsAgo.getMonth() - 12);
                    defaultStartDate = twelveMonthsAgo.toISOString().slice(0, 10).replace(/-/g, '');
                }
                else if (quarterlyIndicators.includes(args.indicator)) {
                    // 8个季度前(约24个月)
                    const eightQuartersAgo = new Date();
                    eightQuartersAgo.setMonth(eightQuartersAgo.getMonth() - 24);
                    defaultStartDate = eightQuartersAgo.toISOString().slice(0, 10).replace(/-/g, '');
                }
                else {
                    // 其他情况默认3个月
                    const threeMonthsAgo = new Date();
                    threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3);
                    defaultStartDate = threeMonthsAgo.toISOString().slice(0, 10).replace(/-/g, '');
                }
                // 构建请求参数
                const params = {
                    token: TUSHARE_API_KEY,
                    params: {}, // 这里留空,后面根据不同的API添加特定参数
                    fields: ""
                };
                // 根据不同指标类型设置不同的API名称、参数和字段
                switch (args.indicator) {
                    case 'shibor':
                        params.api_name = "shibor";
                        params.fields = "date,on,1w,2w,1m,3m,6m,9m,1y";
                        // shibor接口使用date作为日期参数
                        params.params = {
                            start_date: args.start_date || defaultStartDate,
                            end_date: args.end_date || defaultEndDate
                        };
                        break;
                    case 'lpr':
                        params.api_name = "lpr_data";
                        params.fields = "date,1y,5y";
                        // lpr_data接口使用start_date和end_date作为参数
                        params.params = {
                            start_date: args.start_date || defaultStartDate,
                            end_date: args.end_date || defaultEndDate
                        };
                        break;
                    case 'gdp':
                        params.api_name = "cn_gdp";
                        params.fields = "quarter,gdp,gdp_yoy,pi,pi_yoy,si,si_yoy,ti,ti_yoy";
                        // GDP数据使用季度格式,需要转换日期格式为季度格式
                        const startYearQuarter = dateToQuarter(args.start_date || defaultStartDate);
                        const endYearQuarter = dateToQuarter(args.end_date || defaultEndDate);
                        params.params = {
                            start_q: startYearQuarter,
                            end_q: endYearQuarter
                        };
                        break;
                    case 'cpi':
                        params.api_name = "cn_cpi";
                        params.fields = "month,nt_val,nt_yoy,nt_mom,nt_accu,town_val,town_yoy,town_mom,town_accu,cnt_val,cnt_yoy,cnt_mom,cnt_accu";
                        // CPI数据使用月份格式
                        const startMonth = dateToMonth(args.start_date || defaultStartDate);
                        const endMonth = dateToMonth(args.end_date || defaultEndDate);
                        params.params = {
                            start_m: startMonth,
                            end_m: endMonth
                        };
                        break;
                    case 'ppi':
                        params.api_name = "cn_ppi";
                        // 映射Tushare官方文档中的完整30个字段
                        params.fields = "month,ppi_yoy,ppi_mp_yoy,ppi_mp_qm_yoy,ppi_mp_rm_yoy,ppi_mp_p_yoy,ppi_cg_yoy,ppi_cg_f_yoy,ppi_cg_c_yoy,ppi_cg_adu_yoy,ppi_cg_dcg_yoy,ppi_mom,ppi_mp_mom,ppi_mp_qm_mom,ppi_mp_rm_mom,ppi_mp_p_mom,ppi_cg_mom,ppi_cg_f_mom,ppi_cg_c_mom,ppi_cg_adu_mom,ppi_cg_dcg_mom,ppi_accu,ppi_mp_accu,ppi_mp_qm_accu,ppi_mp_rm_accu,ppi_mp_p_accu,ppi_cg_accu,ppi_cg_f_accu,ppi_cg_c_accu,ppi_cg_adu_accu,ppi_cg_dcg_accu";
                        // PPI数据使用月份格式
                        const startMonthPPI = dateToMonth(args.start_date || defaultStartDate);
                        const endMonthPPI = dateToMonth(args.end_date || defaultEndDate);
                        params.params = {
                            start_m: startMonthPPI,
                            end_m: endMonthPPI
                        };
                        break;
                    case 'cn_m':
                        params.api_name = "cn_m";
                        params.fields = "month,m0,m0_yoy,m0_mom,m1,m1_yoy,m1_mom,m2,m2_yoy,m2_mom";
                        // 货币供应量数据使用月份格式
                        const startMonthM = dateToMonth(args.start_date || defaultStartDate);
                        const endMonthM = dateToMonth(args.end_date || defaultEndDate);
                        params.params = {
                            start_m: startMonthM,
                            end_m: endMonthM
                        };
                        break;
                    case 'cn_pmi':
                        params.api_name = "cn_pmi";
                        // 根据Tushare文档使用所有PMI字段
                        params.fields = "month,pmi010000,pmi010100,pmi010200,pmi010300,pmi010400,pmi010500,pmi010600,pmi010700,pmi010800,pmi010900,pmi011000,pmi011100,pmi011200,pmi011300,pmi011400,pmi011500,pmi011600,pmi011700,pmi011800,pmi011900,pmi012000,pmi020100,pmi020101,pmi020102,pmi020200,pmi020201,pmi020202,pmi020300,pmi020301,pmi020302,pmi020400,pmi020401,pmi020402,pmi020500,pmi020501,pmi020502,pmi020600,pmi020601,pmi020602,pmi020700,pmi020800,pmi020900,pmi021000,pmi030000";
                        // PMI数据使用月份格式
                        const startMonthPMI = dateToMonth(args.start_date || defaultStartDate);
                        const endMonthPMI = dateToMonth(args.end_date || defaultEndDate);
                        params.params = {
                            start_m: startMonthPMI,
                            end_m: endMonthPMI
                        };
                        break;
                    case 'cn_sf':
                        params.api_name = "cn_sf"; // 修正API名称
                        params.fields = "month,inc_month,inc_cumval,stk_endval";
                        // 社融增量数据使用月份格式
                        const startMonthSF = dateToMonth(args.start_date || defaultStartDate);
                        const endMonthSF = dateToMonth(args.end_date || defaultEndDate);
                        params.params = {
                            start_m: startMonthSF,
                            end_m: endMonthSF
                        };
                        break;
                    case 'shibor_quote':
                        params.api_name = "shibor_quote";
                        params.fields = "date,bank,on_b,on_a,1w_b,1w_a,2w_b,2w_a,1m_b,1m_a,3m_b,3m_a,6m_b,6m_a,9m_b,9m_a,1y_b,1y_a";
                        // Shibor报价数据使用日期格式
                        params.params = {
                            start_date: args.start_date || defaultStartDate,
                            end_date: args.end_date || defaultEndDate
                        };
                        break;
                    case 'libor':
                        params.api_name = "libor";
                        params.fields = "date,curr,on,1w,1m,2m,3m,6m,12m";
                        // Libor利率数据使用日期格式
                        params.params = {
                            start_date: args.start_date || defaultStartDate,
                            end_date: args.end_date || defaultEndDate,
                            curr: "USD" // 默认美元
                        };
                        break;
                    case 'hibor':
                        params.api_name = "hibor";
                        params.fields = "date,on,1w,2w,1m,2m,3m,4m,5m,6m,9m,1y";
                        // Hibor利率数据使用日期格式
                        params.params = {
                            start_date: args.start_date || defaultStartDate,
                            end_date: args.end_date || defaultEndDate
                        };
                        break;
                }
                // 设置请求超时
                const controller = new AbortController();
                const timeoutId = setTimeout(() => controller.abort(), TUSHARE_CONFIG.TIMEOUT);
                try {
                    console.log(`请求Tushare API: ${params.api_name},参数:`, params.params);
                    // 发送请求
                    const response = await fetch(TUSHARE_API_URL, {
                        method: "POST",
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify(params),
                        signal: controller.signal
                    });
                    if (!response.ok) {
                        throw new Error(`Tushare API请求失败: ${response.status}`);
                    }
                    const data = await response.json();
                    // 处理响应数据
                    if (data.code !== 0) {
                        throw new Error(`Tushare API错误: ${data.msg}`);
                    }
                    // 确保data.data和data.data.items存在
                    if (!data.data || !data.data.items || data.data.items.length === 0) {
                        throw new Error(`未找到${args.indicator}宏观经济数据`);
                    }
                    // 获取字段名
                    const fields = data.data.fields;
                    // 将数据转换为对象数组
                    const econData = data.data.items.map((item) => {
                        const result = {};
                        fields.forEach((field, index) => {
                            result[field] = item[index];
                        });
                        return result;
                    });
                    // 生成指标表头
                    let titleMap = {
                        'shibor': 'Shibor利率数据',
                        'lpr': 'LPR贷款市场报价利率',
                        'gdp': '国内生产总值(GDP)',
                        'cpi': '居民消费价格指数(CPI)',
                        'ppi': '工业生产者出厂价格指数(PPI)',
                        'cn_m': '货币供应量',
                        'cn_pmi': '采购经理指数(PMI)',
                        'cn_sf': '社会融资规模',
                        'shibor_quote': 'Shibor银行报价数据',
                        'libor': 'Libor利率数据',
                        'hibor': 'Hibor利率数据'
                    };
                    // 格式化数据(根据不同指标类型构建不同的格式)
                    let formattedData = '';
                    if (args.indicator === 'shibor' || args.indicator === 'lpr') {
                        // 日期型数据展示
                        formattedData = econData.map((data) => {
                            let row = '';
                            for (const [key, value] of Object.entries(data)) {
                                if (key !== 'date') {
                                    const displayName = getRateDisplayName(key);
                                    row += `${displayName}: ${value}%  `;
                                }
                            }
                            return ` ${formatDate(data.date)}\n${row}\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'shibor_quote') {
                        // Shibor报价数据展示
                        formattedData = econData.map((data) => {
                            return ` ${formatDate(data.date)} - ${data.bank}\n隔夜: 买价${data.on_b}% 卖价${data.on_a}%  1周: 买价${data['1w_b']}% 卖价${data['1w_a']}%\n1月: 买价${data['1m_b']}% 卖价${data['1m_a']}%  3月: 买价${data['3m_b']}% 卖价${data['3m_a']}%\n6月: 买价${data['6m_b']}% 卖价${data['6m_a']}%  1年: 买价${data['1y_b']}% 卖价${data['1y_a']}%\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'libor' || args.indicator === 'hibor') {
                        // 其他利率数据展示
                        formattedData = econData.map((data) => {
                            let row = '';
                            for (const [key, value] of Object.entries(data)) {
                                if (key !== 'date' && key !== 'curr') {
                                    const displayName = getRateDisplayName(key);
                                    row += `${displayName}: ${value}%  `;
                                }
                            }
                            const currencyInfo = data.curr ? ` (${data.curr})` : '';
                            return ` ${formatDate(data.date)}${currencyInfo}\n${row}\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'gdp') {
                        // 季度型数据展示
                        formattedData = econData.map((data) => {
                            return ` ${data.quarter}\nGDP总值: ${data.gdp}亿元  同比增长: ${data.gdp_yoy}%\n第一产业: ${data.pi}亿元  同比: ${data.pi_yoy}%\n第二产业: ${data.si}亿元  同比: ${data.si_yoy}%\n第三产业: ${data.ti}亿元  同比: ${data.ti_yoy}%\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'cpi') {
                        // CPI数据展示
                        formattedData = econData.map((data) => {
                            return ` ${formatMonth(data.month)}\n全国CPI: ${data.nt_val}  同比: ${data.nt_yoy}%  环比: ${data.nt_mom}%  累计: ${data.nt_accu}%\n城市CPI: ${data.town_val}  同比: ${data.town_yoy}%  环比: ${data.town_mom}%  累计: ${data.town_accu}%\n农村CPI: ${data.cnt_val}  同比: ${data.cnt_yoy}%  环比: ${data.cnt_mom}%  累计: ${data.cnt_accu}%\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'ppi') {
                        // PPI数据展示 - 完整30个字段的详细展示
                        formattedData = econData.map((data) => {
                            return ` ${formatMonth(data.month)}
    
     📊 全部工业品PPI
    同比: ${data.ppi_yoy}%  环比: ${data.ppi_mom}%  累计: ${data.ppi_accu}%
    
     🏭 生产资料PPI
    - 总体: 同比: ${data.ppi_mp_yoy}%  环比: ${data.ppi_mp_mom}%  累计: ${data.ppi_mp_accu}%
    - 采掘业: 同比: ${data.ppi_mp_qm_yoy}%  环比: ${data.ppi_mp_qm_mom}%  累计: ${data.ppi_mp_qm_accu}%
    - 原料业: 同比: ${data.ppi_mp_rm_yoy}%  环比: ${data.ppi_mp_rm_mom}%  累计: ${data.ppi_mp_rm_accu}%
    - 加工业: 同比: ${data.ppi_mp_p_yoy}%  环比: ${data.ppi_mp_p_mom}%  累计: ${data.ppi_mp_p_accu}%
    
     🛍️ 生活资料PPI
    - 总体: 同比: ${data.ppi_cg_yoy}%  环比: ${data.ppi_cg_mom}%  累计: ${data.ppi_cg_accu}%
    - 食品类: 同比: ${data.ppi_cg_f_yoy}%  环比: ${data.ppi_cg_f_mom}%  累计: ${data.ppi_cg_f_accu}%
    - 衣着类: 同比: ${data.ppi_cg_c_yoy}%  环比: ${data.ppi_cg_c_mom}%  累计: ${data.ppi_cg_c_accu}%
    - 一般日用品类: 同比: ${data.ppi_cg_adu_yoy}%  环比: ${data.ppi_cg_adu_mom}%  累计: ${data.ppi_cg_adu_accu}%
    - 耐用消费品类: 同比: ${data.ppi_cg_dcg_yoy}%  环比: ${data.ppi_cg_dcg_mom}%  累计: ${data.ppi_cg_dcg_accu}%
    `;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'cn_m') {
                        // 货币供应量数据展示
                        formattedData = econData.map((data) => {
                            return ` ${formatMonth(data.month)}\nM0: ${data.m0}亿元  同比: ${data.m0_yoy}%  环比: ${data.m0_mom}%\nM1: ${data.m1}亿元  同比: ${data.m1_yoy}%  环比: ${data.m1_mom}%\nM2: ${data.m2}亿元  同比: ${data.m2_yoy}%  环比: ${data.m2_mom}%\n`;
                        }).join('\n---\n\n');
                    }
                    else if (args.indicator === 'cn_pmi') {
                        // PMI数据展示 - 横向指标表格格式
                        // PMI指标定义
                        const pmiIndicators = [
                            { name: '制造业PMI', field: 'pmi010000' },
                            { name: '生产指数', field: 'pmi010100' },
                            { name: '新订单指数', field: 'pmi010200' },
                            { name: '新出口订单指数', field: 'pmi010300' },
                            { name: '在手订单指数', field: 'pmi010400' },
                            { name: '产成品库存指数', field: 'pmi010500' },
                            { name: '采购量指数', field: 'pmi010600' },
                            { name: '进口指数', field: 'pmi010700' },
                            { name: '购进价格指数', field: 'pmi010800' },
                            { name: '原材料库存指数', field: 'pmi010900' },
                            { name: '从业人员指数', field: 'pmi011000' },
                            { name: '供应商配送时间指数', field: 'pmi011100' },
                            { name: '生产经营活动预期指数', field: 'pmi011200' },
                            { name: '基础原材料制造业PMI', field: 'pmi011300' },
                            { name: '消费品制造业PMI', field: 'pmi011400' },
                            { name: '装备制造业PMI', field: 'pmi011500' },
                            { name: '高技术制造业PMI', field: 'pmi011600' },
                            { name: '大型企业PMI', field: 'pmi011700' },
                            { name: '中型企业PMI', field: 'pmi011800' },
                            { name: '小型企业PMI', field: 'pmi011900' },
                            { name: '消费品制造业PMI(分类)', field: 'pmi012000' },
                            { name: '非制造业商务活动指数', field: 'pmi020100' },
                            { name: '建筑业商务活动指数', field: 'pmi020101' },
                            { name: '服务业商务活动指数', field: 'pmi020102' },
                            { name: '非制造业新订单指数', field: 'pmi020200' },
                            { name: '建筑业新订单指数', field: 'pmi020201' },
                            { name: '服务业新订单指数', field: 'pmi020202' },
                            { name: '非制造业投入品价格指数', field: 'pmi020300' },
                            { name: '建筑业投入品价格指数', field: 'pmi020301' },
                            { name: '服务业投入品价格指数', field: 'pmi020302' },
                            { name: '非制造业销售价格指数', field: 'pmi020400' },
                            { name: '建筑业销售价格指数', field: 'pmi020401' },
                            { name: '服务业销售价格指数', field: 'pmi020402' },
                            { name: '非制造业从业人员指数', field: 'pmi020500' },
                            { name: '建筑业从业人员指数', field: 'pmi020501' },
                            { name: '服务业从业人员指数', field: 'pmi020502' },
                            { name: '非制造业业务活动预期指数', field: 'pmi020600' },
                            { name: '建筑业业务活动预期指数', field: 'pmi020601' },
                            { name: '服务业业务活动预期指数', field: 'pmi020602' },
                            { name: '非制造业新出口订单指数', field: 'pmi020700' },
                            { name: '非制造业在手订单指数', field: 'pmi020800' },
                            { name: '非制造业存货指数', field: 'pmi020900' },
                            { name: '非制造业供应商配送时间指数', field: 'pmi021000' },
                            { name: '综合PMI产出指数', field: 'pmi030000' }
                        ];
                        // 构建表头:月份 | 指标1 | 指标2 | ...
                        const tableHeader = '| 月份 | ' + pmiIndicators.map(indicator => indicator.name).join(' | ') + ' |';
                        const tableSeparator = '|' + '---|'.repeat(pmiIndicators.length + 1);
                        // 构建数据行:每行一个月份的所有指标数据
                        const tableRows = econData.map((data) => {
                            const rowData = pmiIndicators.map(indicator => data[indicator.field] || '-').join(' | ');
                            return `| ${formatMonth(data.month)} | ${rowData} |`;
                        });
                        formattedData = ` 采购经理指数(PMI)数据
    
    ${tableHeader}
    ${tableSeparator}
    ${tableRows.join('\n')}
    
    数据说明:PMI指数50为荣枯分界线,高于50表示扩张,低于50表示收缩。`;
                    }
                    else if (args.indicator === 'cn_sf') {
                        // 社融增量数据展示
                        formattedData = econData.map((data) => {
                            return ` ${formatMonth(data.month)}\n当月增量: ${data.inc_month}亿元  累计增量: ${data.inc_cumval}亿元\n存量期末值: ${data.stk_endval}万亿元\n`;
                        }).join('\n---\n\n');
                    }
                    return {
                        content: [
                            {
                                type: "text",
                                text: ` ${titleMap[args.indicator]}\n\n查询时间范围: ${args.start_date || defaultStartDate} - ${args.end_date || defaultEndDate}\n数据条数: ${econData.length}条记录\n\n---\n\n${formattedData}`
                            }
                        ]
                    };
                }
                finally {
                    clearTimeout(timeoutId);
                }
            }
            catch (error) {
                console.error("获取宏观经济数据失败:", error);
                return {
                    content: [
                        {
                            type: "text",
                            text: ` 获取${args.indicator}宏观经济数据失败\n\n错误信息: ${error instanceof Error ? error.message : String(error)}\n\n支持的指标类型: \n- shibor: 上海银行间同业拆放利率\n- lpr: 贷款市场报价利率\n- gdp: 国内生产总值\n- cpi: 居民消费价格指数\n- ppi: 工业生产者出厂价格指数\n- cn_m: 货币供应量\n- cn_pmi: 采购经理指数\n- cn_sf: 社会融资规模\n- shibor_quote: Shibor银行报价数据\n- libor: 伦敦银行间同业拆借利率\n- hibor: 香港银行间同业拆借利率`
                        }
                    ]
                };
            }
        }
  • Input schema definition for the macro_econ tool, specifying parameters indicator, start_date, end_date with descriptions and requirements.
    parameters: {
        type: "object",
        properties: {
            indicator: {
                type: "string",
                description: "指标类型,可选值:shibor(上海银行间同业拆放利率)、lpr(贷款市场报价利率)、gdp(国内生产总值)、cpi(居民消费价格指数)、ppi(工业生产者出厂价格指数)、cn_m(货币供应量)、cn_pmi(采购经理指数)、cn_sf(社会融资规模)、shibor_quote(Shibor银行报价数据)、libor(伦敦银行间同业拆借利率)、hibor(香港银行间同业拆借利率)"
            },
            start_date: {
                type: "string",
                description: "起始日期,格式为YYYYMMDD,如'20230101'"
            },
            end_date: {
                type: "string",
                description: "结束日期,格式为YYYYMMDD,如'20230131'"
            }
        },
        required: ["indicator", "start_date", "end_date"]
    },
  • build/index.js:176-178 (registration)
    Tool registration in ListToolsRequestHandler: adds macro_econ to the list of available tools with name, description, and inputSchema.
    name: macroEcon.name,
    description: macroEcon.description,
    inputSchema: macroEcon.parameters
  • build/index.js:276-280 (registration)
    Tool dispatch/registration in CallToolRequestHandler: handles calls to macro_econ by extracting arguments and invoking macroEcon.run.
    case "macro_econ": {
        const indicator = String(request.params.arguments?.indicator);
        const start_date = request.params.arguments?.start_date ? String(request.params.arguments.start_date) : undefined;
        const end_date = request.params.arguments?.end_date ? String(request.params.arguments.end_date) : undefined;
        return normalizeResult(await macroEcon.run({ indicator, start_date, end_date }));
  • Helper utility functions used by the handler for formatting dates, months, quarters, and rate display names.
    function getRateDisplayName(key) {
        const nameMap = {
            'on': '隔夜',
            '1w': '1周',
            '2w': '2周',
            '1m': '1月',
            '2m': '2月',
            '3m': '3月',
            '4m': '4月',
            '5m': '5月',
            '6m': '6月',
            '9m': '9月',
            '1y': '1年',
            '5y': '5年',
            '12m': '12月'
        };
        return nameMap[key] || key;
    }
    /*
     * 格式化日期显示
     */
    function formatDate(dateStr) {
        if (!dateStr || dateStr.length !== 8)
            return dateStr;
        const year = dateStr.substring(0, 4);
        const month = dateStr.substring(4, 6);
        const day = dateStr.substring(6, 8);
        return `${year}年${month}月${day}日`;
    }
    /*
     * 格式化月份显示
     */
    function formatMonth(monthStr) {
        if (!monthStr || monthStr.length !== 6)
            return monthStr;
        const year = monthStr.substring(0, 4);
        const month = monthStr.substring(4, 6);
        return `${year}年${month}月`;
    }
    /*
     * 将日期格式(YYYYMMDD)转换为季度格式(YYYYQN)
     */
    function dateToQuarter(dateStr) {
        if (!dateStr || dateStr.length < 8)
            return "";
        const year = dateStr.substring(0, 4);
        const month = parseInt(dateStr.substring(4, 6));
        // 确定季度
        let quarter;
        if (month >= 1 && month <= 3)
            quarter = 1;
        else if (month >= 4 && month <= 6)
            quarter = 2;
        else if (month >= 7 && month <= 9)
            quarter = 3;
        else
            quarter = 4;
        return `${year}Q${quarter}`;
    }
    /*
     * 将日期格式(YYYYMMDD)转换为月份格式(YYYYMM)
     */
    function dateToMonth(dateStr) {
        if (!dateStr || dateStr.length < 8)
            return "";
        return dateStr.substring(0, 6);
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description only states what data can be retrieved but doesn't disclose important behavioral traits: it doesn't mention whether this is a read-only operation, what format the data returns in, whether there are rate limits, authentication requirements, or any potential side effects. For a data retrieval tool with zero annotation coverage, this represents a significant gap in behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that immediately states the purpose and provides a comprehensive list of available indicators. There's no wasted space or redundant information. While it could potentially benefit from more structural elements (like separating purpose from indicator list), it's appropriately concise for its scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there are no annotations and no output schema, the description is incomplete for a data retrieval tool with 3 required parameters. While the purpose is clear, the description doesn't address critical contextual elements: what format the data returns in, whether there are pagination considerations, error conditions, or any behavioral constraints. For a tool that presumably returns complex economic data, this represents a significant completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with all three parameters (indicator, start_date, end_date) having clear descriptions in the schema. The description text lists indicator examples that align with the schema's enum-like description, but adds no additional semantic context beyond what's already documented in the schema. This meets the baseline expectation when schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '获取宏观经济数据' (get macroeconomic data) and provides a comprehensive list of specific indicators (Shibor利率, LPR利率, GDP, CPI, etc.). It uses a specific verb ('获取' - get/retrieve) and identifies the resource type (macroeconomic data). However, it doesn't explicitly distinguish this tool from potential sibling tools that might also retrieve economic data, though none of the listed siblings appear to overlap directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any prerequisites, limitations, or scenarios where other tools might be more appropriate. While the sibling tools list doesn't show obvious alternatives for macroeconomic data, the description offers no explicit usage context or comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/Xxx00xxX33/FinanceMCP'

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