# 獲取蔬果列表的資源 @mcp.resource("fruits://list") deflist_fruits() -> str: """獲取所有可查詢的蔬果列表""" result = "可查詢的蔬果:\n" result += "+----------+--------------+--------------+\n" result += "| 蔬果名稱 | 英文名稱 | 目前價格 |\n" result += "+----------+--------------+--------------+\n" for key, fruit in FRUITS.items(): result += f"| {fruit['zh_name']:8} | {key:12} | {fruit['current_price']:10.1f} 元/{fruit['unit']} |\n" result += "+----------+--------------+--------------+\n" result += "\n您可以通過以下方式查詢詳細資訊:\n" result += "1. 讀取資源: fruits://蘋果 或 fruits://apple\n" result += "2. 使用工具: get_price_chart、compare_prices 或 analyze_price_trend\n" return result
# 獲取特定蔬果資訊的資源 @mcp.resource("fruits://{fruit_name}") defget_fruit_info(fruit_name: str) -> str: """獲取特定蔬果的基本資訊 Args: fruit_name: 蔬果名稱(中文或英文,如 apple、蘋果、banana、香蕉) Returns: 蔬果資訊 """ fruit_key = get_fruit_key(fruit_name) ifnot fruit_key: returnf"找不到 {fruit_name} 的資訊,支援的蔬果有:" + "、".join([f"{f['zh_name']}({k})"for k, f in FRUITS.items()]) fruit = FRUITS[fruit_key] prices_data = [item["price"] for item in fruit["prices"]] dates = [item["date"] for item in fruit["prices"]] result = f"【{fruit['zh_name']}】基本資訊\n\n" result += f"目前價格: {fruit['current_price']} 元/{fruit['unit']}\n" result += f"30天最高價: {max(prices_data)} 元/{fruit['unit']}\n" result += f"30天最低價: {min(prices_data)} 元/{fruit['unit']}\n" result += f"30天平均價: {sum(prices_data)/len(prices_data):.1f} 元/{fruit['unit']}\n" result += f"近期走勢: {_price_trend_description(fruit['prices'])}\n\n" # 添加標準表格 result += create_table(dates, prices_data, f"{fruit['zh_name']}過去30天價格表") return result
# 獲取特定蔬果價格走勢圖的工具 @mcp.tool() defget_price_chart(fruit_name: str, days: int = 30) -> str: """獲取特定蔬果的價格走勢圖 Args: fruit_name: 蔬果名稱(中文或英文,如 apple、蘋果、banana、香蕉) days: 要顯示的天數,最多30天 Returns: 價格走勢圖(表格版) """ fruit_key = get_fruit_key(fruit_name) ifnot fruit_key: returnf"找不到 {fruit_name} 的資訊,支援的蔬果有:" + "、".join([f"{f['zh_name']}({k})"for k, f in FRUITS.items()]) fruit = FRUITS[fruit_key] zh_name = fruit['zh_name'] # 限制天數最多 30 天 days = min(days, 30) # 獲取價格數據 price_data = fruit["prices"][-days:] dates = [item["date"] for item in price_data] prices = [item["price"] for item in price_data] # 計算重要統計數據 current_price = prices[-1] avg_price = sum(prices) / len(prices) max_price = max(prices) min_price = min(prices) max_change = max([abs(prices[i] - prices[i-1]) for i inrange(1, len(prices))]) # 生成詳細報告 result = f"【{zh_name}過去{days}天價格分析】\n\n" # 統計摘要 result += "價格統計摘要:\n" result += "+----------------+----------------+\n" result += "| 指標 | 數值 |\n" result += "+----------------+----------------+\n" result += f"| 當前價格 | {current_price:14.1f} |\n" result += f"| 平均價格 | {avg_price:14.1f} |\n" result += f"| 最高價格 | {max_price:14.1f} |\n" result += f"| 最低價格 | {min_price:14.1f} |\n" result += f"| 最大單日波動 | {max_change:14.1f} |\n" result += "+----------------+----------------+\n\n" # 添加詳細價格表 result += "詳細價格數據(採樣顯示):\n" result += create_table(dates, prices, f"{zh_name}價格表", sample_size=10) # 添加價格變化描述 change_from_start = prices[-1] - prices[0] percent_change = (change_from_start / prices[0]) * 100 result += f"\n價格走勢描述:\n" result += f"- 從 {dates[0]} 到 {dates[-1]} 期間,{zh_name}價格" if change_from_start > 0: result += f"上漲了 {change_from_start:.1f} 元 (+{percent_change:.1f}%)" elif change_from_start < 0: result += f"下跌了 {-change_from_start:.1f} 元 ({percent_change:.1f}%)" else: result += "保持不變" result += "。\n" # 添加波動分析 above_avg = sum(1for p in prices if p > avg_price) below_avg = sum(1for p in prices if p < avg_price) result += f"- 在這 {days} 天中,價格有 {above_avg} 天高於平均價,{below_avg} 天低於平均價。\n" # 週期性變化分析 if days >= 14: week1_avg = sum(prices[:7]) / 7 week2_avg = sum(prices[7:14]) / 7 week_change = ((week2_avg / week1_avg) - 1) * 100 result += f"- 第二週較第一週平均價格變化:{week_change:+.1f}%\n" if days >= 21: week3_avg = sum(prices[14:21]) / 7 result += f"- 第三週較第二週平均價格變化:{((week3_avg / week2_avg) - 1) * 100:+.1f}%\n" # 預測趨勢 if percent_change > 5: result += "- 預測:若當前趨勢持續,短期內價格可能繼續上漲。\n" elif percent_change < -5: result += "- 預測:若當前趨勢持續,短期內價格可能繼續下跌。\n" else: result += "- 預測:價格可能在當前水平附近波動。\n" return result
# 比較兩種蔬果價格的工具 @mcp.tool() defcompare_prices(fruit1: str, fruit2: str, days: int = 30) -> str: """比較兩種蔬果的價格走勢 Args: fruit1: 第一種蔬果名稱(中文或英文,如 apple、蘋果) fruit2: 第二種蔬果名稱(中文或英文,如 banana、香蕉) days: 要比較的天數,最多30天 Returns: 比較結果(表格版) """ fruit_key1 = get_fruit_key(fruit1) fruit_key2 = get_fruit_key(fruit2) ifnot fruit_key1 ornot fruit_key2: error_msg = [] ifnot fruit_key1: error_msg.append(f"找不到 {fruit1} 的資訊") ifnot fruit_key2: error_msg.append(f"找不到 {fruit2} 的資訊") error_msg.append("支援的蔬果有:" + "、".join([f"{f['zh_name']}({k})"for k, f in FRUITS.items()])) return"\n".join(error_msg) # 限制天數最多 30 天 days = min(days, 30) # 獲取價格數據 price_data1 = FRUITS[fruit_key1]["prices"][-days:] price_data2 = FRUITS[fruit_key2]["prices"][-days:] dates = [item["date"] for item in price_data1] prices1 = [item["price"] for item in price_data1] prices2 = [item["price"] for item in price_data2] fruit1_name = FRUITS[fruit_key1]["zh_name"] fruit2_name = FRUITS[fruit_key2]["zh_name"] # 計算價格差異 current_diff = prices1[-1] - prices2[-1] avg_diff = sum(p1 - p2 for p1, p2 inzip(prices1, prices2)) / len(prices1) # 生成比較報告 result = f"【{fruit1_name} vs {fruit2_name} 價格比較分析】\n\n" # 總結數據 result += "價格比較摘要:\n" result += "+----------------+----------------+----------------+----------------+\n" result += f"| 指標 | {fruit1_name:14} | {fruit2_name:14} | 差異 |\n" result += "+----------------+----------------+----------------+----------------+\n" result += f"| 當前價格 | {prices1[-1]:14.1f} | {prices2[-1]:14.1f} | {current_diff:+14.1f} |\n" result += f"| 平均價格 | {sum(prices1)/len(prices1):14.1f} | {sum(prices2)/len(prices2):14.1f} | {avg_diff:+14.1f} |\n" result += f"| 最高價格 | {max(prices1):14.1f} | {max(prices2):14.1f} | {max(prices1)-max(prices2):+14.1f} |\n" result += f"| 最低價格 | {min(prices1):14.1f} | {min(prices2):14.1f} | {min(prices1)-min(prices2):+14.1f} |\n" result += "+----------------+----------------+----------------+----------------+\n\n" # 添加價格比較表格 result += "價格對比詳細數據:\n" result += create_comparison_table(dates, prices1, prices2, fruit1_name, fruit2_name) # 添加比較分析 result += f"\n價格比較分析:\n" # 價格差異分析 if current_diff > 0: result += f"- 目前 {fruit1_name} 比 {fruit2_name} 貴 {current_diff:.1f} 元 ({(current_diff/prices2[-1])*100:.1f}%)。\n" else: result += f"- 目前 {fruit1_name} 比 {fruit2_name} 便宜 {-current_diff:.1f} 元 ({(current_diff/prices2[-1])*100:.1f}%)。\n" # 價格趨勢比較 f1_change = ((prices1[-1] / prices1[0]) - 1) * 100 f2_change = ((prices2[-1] / prices2[0]) - 1) * 100 result += f"- {fruit1_name}過去{days}天價格變化:{f1_change:+.1f}%\n" result += f"- {fruit2_name}過去{days}天價格變化:{f2_change:+.1f}%\n" # 相關性分析 if (f1_change > 0and f2_change > 0) or (f1_change < 0and f2_change < 0): result += f"- 兩種蔬果價格走勢方向一致,但 {fruit1_name ifabs(f1_change) > abs(f2_change) else fruit2_name} 變化幅度更大。\n" else: result += f"- 兩種蔬果價格走勢方向相反,{fruit1_name}{('上漲'if f1_change > 0else'下跌')}而 {fruit2_name}{('下跌'if f2_change > 0else'上漲')}。\n" # 購買建議 result += "\n購買建議:\n" if current_diff < 0: result += f"- 如果口味偏好相近,目前 {fruit1_name} 性價比更高。\n" else: result += f"- 如果口味偏好相近,目前 {fruit2_name} 性價比更高。\n" if f1_change < 0and f1_change < f2_change: result += f"- {fruit1_name}價格正在下跌,可能是較好的購買時機。\n" elif f2_change < 0and f2_change < f1_change: result += f"- {fruit2_name}價格正在下跌,可能是較好的購買時機。\n" return result