taobao-mcp-demo
Version:
淘宝MCP演示服务器 - 提供基础工具和资源
136 lines (125 loc) • 5.23 kB
JavaScript
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}`
}
]
};
}
}
};