query_freightower_track.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. '不得根据号码格式猜测,不得跨字段或跨工具试查。'
  21. '禁止使用:系统里已经保存的轨迹用 query_track;'
  22. '本工具不导出文件,不修改干线到达或提柜状态。'
  23. ),
  24. 'input_schema': {
  25. 'type': 'object',
  26. 'properties': {
  27. 'bl_number': dict(number, description=(
  28. '提单号。仅当用户明确说明是提单号时使用,'
  29. '不得放入其他类型号码。'
  30. )),
  31. 'container_code': dict(number, description=(
  32. '柜号。仅当用户明确说明是柜号时使用,'
  33. '不得放入其他类型号码。'
  34. )),
  35. },
  36. 'additionalProperties': False,
  37. },
  38. }
  39. def call(
  40. self,
  41. bl_number='',
  42. container_code='',
  43. request_id='rq_query_freightower_track',
  44. **_ignored,
  45. ):
  46. if self.api_client is None:
  47. raise RuntimeError(
  48. 'api client is required for query_freightower_track'
  49. )
  50. payload = {}
  51. bl_number = self._number(bl_number, 'bl_number')
  52. container_code = self._number(container_code, 'container_code')
  53. if bl_number:
  54. payload['bl_number'] = bl_number
  55. if container_code:
  56. payload['container_code'] = container_code
  57. if not payload:
  58. raise ValueError('bl_number or container_code is required')
  59. return self.api_client.call_tool(
  60. self.name,
  61. self.route_path,
  62. payload,
  63. request_id,
  64. )
  65. @staticmethod
  66. def _number(value, field):
  67. if value in (None, ''):
  68. return ''
  69. if not isinstance(value, str):
  70. raise ValueError(field + ' must be a string')
  71. value = value.strip()
  72. if len(value) > 100:
  73. raise ValueError(field + ' must contain at most 100 characters')
  74. return value