UNPKG

ts-guoguo-mcp-server

Version:

裹裹寄件服务MCP Server - TypeScript版本,基于Model Context Protocol的寄件服务集成工具

254 lines 10.5 kB
#!/usr/bin/env node /** * 裹裹寄件服务MCP Server - TypeScript版本 * 提供寄件订单管理、地址簿查询等功能,通过HTTP API对接远程服务 */ import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; import { AddressBookService } from "./services/address-book.js"; import { OrderService } from "./services/order.js"; import { ShippingService } from "./services/shipping.js"; import { logger } from "./utils/logger.js"; import { parseArgs } from "./utils/args-parser.js"; // 解析命令行参数 const config = parseArgs(); // 创建服务实例 const addressBookService = new AddressBookService(config); const orderService = new OrderService(config); const shippingService = new ShippingService(addressBookService, orderService); // 创建MCP服务器 const server = new Server({ name: "裹裹寄件服务MCP Server", version: "1.0.0", }, { capabilities: { tools: {}, }, }); // 工具参数验证Schema const queryAddressBookSchema = z.object({ search_key: z.string().optional().describe("搜索关键词(可选),可以搜索姓名、电话或地址"), }); const createShippingOrderSchema = z.object({ sender_name: z.string().describe("寄件人姓名"), sender_phone: z.string().describe("寄件人电话"), sender_address: z.string().describe("寄件人地址"), receiver_name: z.string().describe("收件人姓名"), receiver_phone: z.string().describe("收件人电话"), receiver_address: z.string().describe("收件人地址"), package_type: z.string().describe("物品类型"), package_weight: z.number().describe("重量(kg)"), package_size: z.string().describe("尺寸(长x宽x高,cm)"), service_type: z.enum(["标准", "快速", "经济"]).default("标准").describe("服务类型"), }); const listShippingOrdersSchema = z.object({ page_size: z.number().default(10).describe("每页数量"), page_number: z.number().default(1).describe("页码(从1开始)"), start_date: z.string().optional().describe("开始日期(YYYY-MM-DD格式)"), end_date: z.string().optional().describe("结束日期(YYYY-MM-DD格式)"), status: z.string().optional().describe("订单状态过滤"), }); const getOrderDetailSchema = z.object({ order_id: z.string().describe("订单号"), detail_level: z.enum(["basic", "full"]).default("basic").describe("详情级别"), }); // 注册工具列表 server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "query_address_book", description: "查询用户的地址簿信息", inputSchema: { type: "object", properties: { search_key: { type: "string", description: "搜索关键词(可选),可以搜索姓名、电话或地址", }, }, required: [], }, }, { name: "create_shipping_order", description: "创建新的寄件订单", inputSchema: { type: "object", properties: { sender_name: { type: "string", description: "寄件人姓名" }, sender_phone: { type: "string", description: "寄件人电话" }, sender_address: { type: "string", description: "寄件人地址" }, receiver_name: { type: "string", description: "收件人姓名" }, receiver_phone: { type: "string", description: "收件人电话" }, receiver_address: { type: "string", description: "收件人地址" }, package_type: { type: "string", description: "物品类型" }, package_weight: { type: "number", description: "重量(kg)" }, package_size: { type: "string", description: "尺寸(长x宽x高,cm)" }, service_type: { type: "string", enum: ["标准", "快速", "经济"], description: "服务类型", default: "标准", }, }, required: [ "sender_name", "sender_phone", "sender_address", "receiver_name", "receiver_phone", "receiver_address", "package_type", "package_weight", "package_size", ], }, }, { name: "list_shipping_orders", description: "分页查询寄件订单列表", inputSchema: { type: "object", properties: { page_size: { type: "number", description: "每页数量", default: 10 }, page_number: { type: "number", description: "页码(从1开始)", default: 1 }, start_date: { type: "string", description: "开始日期(YYYY-MM-DD格式)" }, end_date: { type: "string", description: "结束日期(YYYY-MM-DD格式)" }, status: { type: "string", description: "订单状态过滤" }, }, required: [], }, }, { name: "get_order_detail", description: "获取订单详细信息", inputSchema: { type: "object", properties: { order_id: { type: "string", description: "订单号" }, detail_level: { type: "string", enum: ["basic", "full"], description: "详情级别", default: "basic", }, }, required: ["order_id"], }, }, ], }; }); // 处理工具调用 server.setRequestHandler(CallToolRequestSchema, async (request) => { try { switch (request.params.name) { case "query_address_book": { const args = queryAddressBookSchema.parse(request.params.arguments); const result = await shippingService.queryAddressBook(args.search_key); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } case "create_shipping_order": { const args = createShippingOrderSchema.parse(request.params.arguments); const result = await shippingService.createShippingOrder(args); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } case "list_shipping_orders": { const args = listShippingOrdersSchema.parse(request.params.arguments); const result = await shippingService.listShippingOrders(args); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } case "get_order_detail": { const args = getOrderDetailSchema.parse(request.params.arguments); const result = await shippingService.getOrderDetail(args.order_id, args.detail_level); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } default: return { isError: true, content: [ { type: "text", text: `未知工具: ${request.params.name}`, }, ], }; } } catch (error) { logger.error(`工具调用失败: ${error}`); return { isError: true, content: [ { type: "text", text: `工具调用失败: ${error instanceof Error ? error.message : String(error)}`, }, ], }; } }); // 启动服务器 async function main() { try { logger.info("启动裹裹寄件服务MCP Server (TypeScript版本)..."); // 打印配置信息 logger.info("当前配置信息:"); logger.info(` - API基础URL: ${config.baseUrl}`); logger.info(` - API Token: ${config.token.substring(0, 4)}***${config.token.substring(config.token.length - 4)}`); logger.info(` - 请求超时时间: ${config.timeout}秒`); logger.info(` - 使用Mock数据: ${config.useMock}`); const transport = new StdioServerTransport(); await server.connect(transport); logger.info("服务器已启动并在stdio上监听"); } catch (error) { logger.error(`启动服务器失败: ${error}`); process.exit(1); } } // 优雅关闭 process.on("SIGINT", () => { logger.info("收到SIGINT信号,正在关闭服务器..."); process.exit(0); }); process.on("SIGTERM", () => { logger.info("收到SIGTERM信号,正在关闭服务器..."); process.exit(0); }); main().catch((error) => { logger.error(`未知错误: ${error}`); process.exit(1); }); //# sourceMappingURL=index.js.map