query_track.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. class QueryTrackTool:
  2. name = 'query_track'
  3. route_path = '/mcp/tools/queryTrack'
  4. def __init__(self, api_client=None):
  5. self.api_client = api_client
  6. def metadata(self):
  7. return {
  8. 'name': self.name,
  9. 'description': (
  10. 'Query tracking information with the current employee permissions. '
  11. 'Provide order_id, order_number, or tracking_number. '
  12. '参数名仅用于工具调用;向用户回答时只能使用“订单号”、'
  13. '“快递单号”等业务名称,不得展示内部参数名。'
  14. ),
  15. 'input_schema': {
  16. 'type': 'object',
  17. 'properties': {
  18. 'order_id': {'type': 'integer', 'minimum': 1, 'description': 'Order ID to query tracking for'},
  19. 'order_number': {'type': 'string', 'description': 'Order number or track query number'},
  20. 'tracking_number': {'type': 'string', 'description': 'Tracking number to query directly'},
  21. 'page': {'type': 'integer', 'minimum': 1, 'default': 1},
  22. 'limit': {'type': 'integer', 'minimum': 1, 'maximum': 100, 'default': 5},
  23. },
  24. },
  25. }
  26. def call(self, order_id=None, order_number=None, tracking_number=None, page=1, limit=5, request_id='rq_query_track'):
  27. if self.api_client is None:
  28. raise RuntimeError('api client is required for query_track')
  29. if order_id is None and not order_number and not tracking_number:
  30. raise ValueError('order_id, order_number or tracking_number is required')
  31. payload = {
  32. 'page': max(1, int(page)),
  33. 'limit': max(1, min(100, int(limit))),
  34. }
  35. if order_id is not None:
  36. order_id = int(order_id)
  37. if order_id <= 0:
  38. raise ValueError('order_id must be greater than 0')
  39. payload['order_id'] = order_id
  40. if order_number:
  41. payload['order_number'] = str(order_number).strip()
  42. if tracking_number:
  43. payload['tracking_number'] = str(tracking_number).strip()
  44. return self.api_client.call_tool(self.name, self.route_path, payload, request_id)