UNPKG

taobao-mcp-demo

Version:

淘宝MCP演示服务器 - 提供基础工具和资源

136 lines (125 loc) 5.23 kB
import { z } from "zod"; import { config } from "../config.js"; // 淘宝商品搜索工具 export const taobaoSearchTool = { name: "taobao_search", config: { title: "淘宝商品搜索", description: "按关键字搜索淘宝商品,支持价格筛选、分页等功能", inputSchema: { q: z.string().describe("搜索关键字,如:女装、手机等"), page: z.number().optional().describe("页码,默认为1,最大100页"), page_size: z.number().optional().describe("每页商品数量,默认为10"), start_price: z.number().optional().describe("最低价格筛选"), end_price: z.number().optional().describe("最高价格筛选"), cat: z.string().optional().describe("商品类目ID,0表示全部分类"), sort: z.string().optional().describe("排序方式,如:price_asc(价格升序)、price_desc(价格降序)"), discount_only: z.boolean().optional().describe("是否只显示有优惠的商品"), seller_info: z.boolean().optional().describe("是否包含卖家信息"), nick: z.string().optional().describe("卖家昵称筛选"), ppath: z.string().optional().describe("商品属性路径"), imgid: z.string().optional().describe("图片ID"), filter: z.string().optional().describe("其他筛选条件") } }, handler: async (params) => { try { // 构建请求参数 const requestParams = new URLSearchParams({ key: config.key, secret: config.secret, api_name: "item_search", q: params.q, page: params.page || 1, page_size: params.page_size || 10, start_price: params.start_price || 0, end_price: params.end_price || 0, cat: params.cat || 0, discount_only: params.discount_only ? "true" : "false", sort: params.sort || "", seller_info: params.seller_info ? "true" : "false", nick: params.nick || "", ppath: params.ppath || "", imgid: params.imgid || "", filter: params.filter || "", cache: "yes", result_type: "json", lang: "cn" }); const requestUrl = `${config.url}/taobao/item_search?${requestParams.toString()}`; // 发送请求 const response = await fetch(requestUrl); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); // 检查API返回状态 if (data.error_code && data.error_code !== "0000" && data.error_code !== "0") { throw new Error(`API错误: ${data.error_msg || data.error_code}`); } // 格式化返回结果 const result = { search_keyword: params.q, total_results: data.items?.real_total_results || data.real_total_results || 0, current_page: data.items?.page || data.page || 1, page_size: data.items?.page_size || data.page_size || 10, total_pages: data.items?.pagecount || data.pagecount || 0, items: [] }; // 处理商品列表 if (data.items && data.items.item) { const items = Array.isArray(data.items.item) ? data.items.item : [data.items.item]; result.items = items.map(item => ({ title: item.title || '', pic_url: item.pic_url || '', original_price: item.orginal_price || item.price || 0, price: item.price || 0, num_iid: item.num_iid || '', detail_url: item.detail_url || '', shop_name: item.shop_name || '', location: item.area || '', sales: item.sales || 0 })); } else if (data.item && Array.isArray(data.item)) { // 如果数据结构是 data.item result.items = data.item.map(item => ({ title: item.title || '', pic_url: item.pic_url || '', original_price: item.orginal_price || item.price || 0, price: item.price || 0, num_iid: item.num_iid || '', detail_url: item.detail_url || '', shop_name: item.shop_name || '', location: item.area || '', sales: item.sales || 0 })); } return { content: [ { type: "text", text: `搜索"${params.q}"的结果:\n\n` + `共找到 ${result.total_results} 件商品\n` + `当前第 ${result.current_page} 页,共 ${result.total_pages} 页\n\n` + result.items.map((item, index) => `${index + 1}. ${item.title}\n` + ` 价格: ¥${item.price} (原价: ¥${item.original_price})\n` + ` 商品ID: ${item.num_iid}\n` + ` 图片: ${item.pic_url}\n` + ` 详情: ${item.detail_url}\n` ).join('\n') } ] }; } catch (error) { return { content: [ { type: "text", text: `搜索失败: ${error.message}` } ] }; } } };