query_freightower_track.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. class QueryFreightowerTrackTool:
  2. name = 'query_freightower_track'
  3. route_path = '/mcp/tools/queryFreightowerTrack'
  4. def __init__(self, api_client=None):
  5. self.api_client = api_client
  6. def metadata(self):
  7. number = {
  8. 'type': 'string',
  9. 'minLength': 1,
  10. 'maxLength': 100,
  11. }
  12. return {
  13. 'name': self.name,
  14. 'description': (
  15. '使用场景:用户明确要查看飞驼现场船期和集装箱节点时使用,'
  16. '返回船名、航次、预计离港、预计到达、中转港/目的港/交货地,'
  17. '以及已经发生的轨迹节点。提单号、柜号至少提供一个;'
  18. '号码类型不明确时必须先询问用户是提单号还是柜号,确认前不得调用。'
  19. '不得根据号码格式猜测,不得跨字段或跨工具试查。'
  20. '禁止使用:系统里已经保存的轨迹用 query_track;'
  21. '本工具不导出文件,不修改干线到达或提柜状态。'
  22. ),
  23. 'input_schema': {
  24. 'type': 'object',
  25. 'properties': {
  26. 'bl_number': dict(number, description=(
  27. '提单号。仅当用户明确说明是提单号时使用,'
  28. '不得放入其他类型号码。'
  29. )),
  30. 'container_code': dict(number, description=(
  31. '柜号。仅当用户明确说明是柜号时使用,'
  32. '不得放入其他类型号码。'
  33. )),
  34. },
  35. 'additionalProperties': False,
  36. },
  37. }
  38. def call(
  39. self,
  40. bl_number='',
  41. container_code='',
  42. request_id='rq_query_freightower_track',
  43. **_ignored,
  44. ):
  45. if self.api_client is None:
  46. raise RuntimeError(
  47. 'api client is required for query_freightower_track'
  48. )
  49. payload = {}
  50. bl_number = self._number(bl_number, 'bl_number')
  51. container_code = self._number(container_code, 'container_code')
  52. if bl_number:
  53. payload['bl_number'] = bl_number
  54. if container_code:
  55. payload['container_code'] = container_code
  56. if not payload:
  57. raise ValueError('bl_number or container_code is required')
  58. return self.api_client.call_tool(
  59. self.name,
  60. self.route_path,
  61. payload,
  62. request_id,
  63. )
  64. @staticmethod
  65. def _number(value, field):
  66. if value in (None, ''):
  67. return ''
  68. if not isinstance(value, str):
  69. raise ValueError(field + ' must be a string')
  70. value = value.strip()
  71. if len(value) > 100:
  72. raise ValueError(field + ' must contain at most 100 characters')
  73. return value