query_customer_list.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. class QueryCustomerListTool:
  2. name = 'query_customer_list'
  3. route_path = '/mcp/tools/queryCustomerList'
  4. def __init__(self, api_client=None):
  5. self.api_client = api_client
  6. def metadata(self):
  7. positive_id = {'type': 'integer', 'minimum': 1}
  8. return {
  9. 'name': self.name,
  10. 'description': (
  11. '查询当前员工有权查看的启用主客户列表。可按客户名称、事业部、商务经理或'
  12. '客户经理筛选;筛选值必须先调用list_customer_filter_options取得,禁止猜测'
  13. '内部ID。未指定筛选时查询全部授权客户。公司、员工和权限范围由当前设备会话'
  14. '确定,调用方不得覆盖。结算模式按业务类型返回结构化列表,展示时必须完整保留'
  15. '每个业务类型和对应结算模式,不得合并或缩写。最终回复必须完整逐条展示17个字段,'
  16. '包括空字段,不得摘要、隐藏、重命名或省略任何字段。'
  17. ),
  18. 'input_schema': {
  19. 'type': 'object',
  20. 'properties': {
  21. 'customer_id': dict(positive_id),
  22. 'department_id': dict(positive_id),
  23. 'sales_id': dict(positive_id),
  24. 'merchandiser_id': dict(positive_id),
  25. 'page': {
  26. 'type': 'integer', 'minimum': 1, 'maximum': 100,
  27. 'default': 1,
  28. },
  29. 'limit': {
  30. 'type': 'integer', 'minimum': 1, 'maximum': 100,
  31. 'default': 20,
  32. },
  33. },
  34. 'required': [],
  35. 'additionalProperties': False,
  36. },
  37. }
  38. def call(
  39. self, customer_id=None, department_id=None, sales_id=None,
  40. merchandiser_id=None, page=1, limit=20,
  41. request_id='rq_query_customer_list',
  42. ):
  43. if self.api_client is None:
  44. raise RuntimeError('api client is required for query_customer_list')
  45. payload = {
  46. 'page': self._bounded_integer(page, 'page'),
  47. 'limit': self._bounded_integer(limit, 'limit'),
  48. }
  49. for field, value in (
  50. ('customer_id', customer_id),
  51. ('department_id', department_id),
  52. ('sales_id', sales_id),
  53. ('merchandiser_id', merchandiser_id),
  54. ):
  55. if value is not None:
  56. payload[field] = self._positive_integer(value, field)
  57. return self.api_client.call_tool(
  58. self.name, self.route_path, payload, request_id
  59. )
  60. @staticmethod
  61. def _positive_integer(value, field):
  62. if isinstance(value, bool) or not isinstance(value, int) or value < 1:
  63. raise ValueError('{0} is invalid'.format(field))
  64. return value
  65. @classmethod
  66. def _bounded_integer(cls, value, field):
  67. value = cls._positive_integer(value, field)
  68. if value > 100:
  69. raise ValueError('{0} is invalid'.format(field))
  70. return value