ts-guoguo-mcp-server
Version:
裹裹寄件服务MCP Server - TypeScript版本,基于Model Context Protocol的寄件服务集成工具
254 lines • 10.5 kB
JavaScript
#!/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