query_track.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. '使用场景:用户明确要查看物流轨迹时使用,只返回轨迹节点、地点、时间、'
  11. '内容、跟踪号和Shipment ID。应只选择一种定位方式:用户明确说订单号时'
  12. '使用订单号,明确说快递单号或物流跟踪号时使用快递单号;内部订单ID只可'
  13. '使用可信系统上下文中已有的值,不得向用户索取或自行推断。号码类型不明确'
  14. '时必须先询问用户,确认前不得调用。禁止使用:不得用本工具查询订单资料、'
  15. '排舱列表、排舱详情、报关资料文件或导出结果。不得根据号码格式猜测,'
  16. '不得跨字段或跨工具试查,查询无结果后不得换号码类型重试。'
  17. '参数名仅用于工具调用;向用户回答时只能使用“订单号”、'
  18. '“快递单号”等业务名称,不得展示内部参数名。'
  19. ),
  20. 'input_schema': {
  21. 'type': 'object',
  22. 'properties': {
  23. 'order_id': {
  24. 'type': 'integer', 'minimum': 1,
  25. 'description': '可信系统上下文中已有的内部订单ID;不得向用户索取或猜测。',
  26. },
  27. 'order_number': {
  28. 'type': 'string',
  29. 'description': '订单号;仅当用户明确说明是订单号时使用。',
  30. },
  31. 'tracking_number': {
  32. 'type': 'string',
  33. 'description': '快递单号或物流跟踪号;仅当用户明确说明该类型时使用。',
  34. },
  35. 'page': {'type': 'integer', 'minimum': 1, 'default': 1},
  36. 'limit': {'type': 'integer', 'minimum': 1, 'maximum': 100, 'default': 5},
  37. },
  38. },
  39. }
  40. def call(self, order_id=None, order_number=None, tracking_number=None, page=1, limit=5, request_id='rq_query_track'):
  41. if self.api_client is None:
  42. raise RuntimeError('api client is required for query_track')
  43. if order_id is None and not order_number and not tracking_number:
  44. raise ValueError('order_id, order_number or tracking_number is required')
  45. payload = {
  46. 'page': max(1, int(page)),
  47. 'limit': max(1, min(100, int(limit))),
  48. }
  49. if order_id is not None:
  50. order_id = int(order_id)
  51. if order_id <= 0:
  52. raise ValueError('order_id must be greater than 0')
  53. payload['order_id'] = order_id
  54. if order_number:
  55. payload['order_number'] = str(order_number).strip()
  56. if tracking_number:
  57. payload['tracking_number'] = str(tracking_number).strip()
  58. return self.api_client.call_tool(self.name, self.route_path, payload, request_id)