common_server.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from __future__ import annotations
  2. from typing import Any
  3. from .auth import load_projects_config
  4. from .collector_api import (
  5. connect_device as api_connect_device,
  6. disconnect_device as api_disconnect_device,
  7. list_device_points as api_list_device_points,
  8. list_devices as api_list_devices,
  9. )
  10. from .mcp_app import mcp
  11. @mcp.tool(
  12. name="project.list",
  13. title="Project List",
  14. description=(
  15. "List enabled 汇采 projects available to this MCP service, including "
  16. "project_key, project_name, base_url, and data_collector_base_url. "
  17. "Call this first to choose project_key."
  18. ),
  19. tags={"project", "list"},
  20. )
  21. def project_list() -> dict[str, Any]:
  22. projects = load_projects_config()
  23. result = [
  24. {
  25. "project_key": item["project_key"],
  26. "project_name": item["project_name"],
  27. "base_url": item["base_url"],
  28. "data_collector_base_url": item["data_collector_base_url"],
  29. }
  30. for item in projects
  31. if item["enabled"]
  32. ]
  33. result.sort(key=lambda item: item["project_key"])
  34. return {"projects": result, "total": len(result)}
  35. @mcp.tool(
  36. name="collector.device_list",
  37. description=(
  38. "汇采-返回目前所有设备及其详情信息。返回内容中的设备字段包括不限于 name 设备名、"
  39. "type 设备类型、num_points 点位数量、running_status 运行状态:"
  40. "0 已停止,1 正常,2 异常。type 为 devicegroup 时表示设备分组,"
  41. "需要继续检查 groups 下的设备。"
  42. "num_points 默认 false;只有需要统计设备或点位分组下的点位数量时才传 true。"
  43. ),
  44. )
  45. def collector_device_list(project_key: str, num_points: bool = False) -> dict[str, Any]:
  46. return api_list_devices(project_key, num_points=num_points)
  47. @mcp.tool(
  48. name="collector.device_connect",
  49. description=(
  50. "汇采-连接设备。连接成功不代表正在采集,设备采集状态请看响应 data.running_status"
  51. "device_id 是设备列表中的设备 id;device_type 可传modbus、s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  52. "响应data字段下常见状态:"
  53. "data.status 1=未连接、2=已连接、3=连接异常;"
  54. "data.running_status 0=未采集、1=采集中、2=采集异常。"
  55. ),
  56. )
  57. def collector_device_connect(
  58. project_key: str,
  59. device_id: int,
  60. device_type: str,
  61. ) -> dict[str, Any]:
  62. return api_connect_device(project_key, device_id=device_id, device_type=device_type)
  63. @mcp.tool(
  64. name="collector.device_disconnect",
  65. description=(
  66. "汇采-断开设备。用于停止指定设备连接/采集相关状态,使设备回到未连接或空闲状态"
  67. "device_id 是设备列表中的设备 id;device_type 可传modbus、s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  68. "响应data字段下常见状态:"
  69. "data.status 1=未连接、2=已连接、3=连接异常;"
  70. "data.running_status 0=未采集、1=采集中、2=采集异常。"
  71. ),
  72. )
  73. def collector_device_disconnect(
  74. project_key: str,
  75. device_id: int,
  76. device_type: str = "modbus",
  77. ) -> dict[str, Any]:
  78. return api_disconnect_device(project_key, device_id=device_id, device_type=device_type)
  79. @mcp.tool(
  80. name="collector.device_points",
  81. description=(
  82. "汇采-查询设备下的所有点位。device_id 是设备id, device_type 可传modbus、s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  83. "status 0=未采集、1=采集正常、2=采集异常, present_value 是当前值"
  84. ),
  85. )
  86. def collector_device_points(
  87. project_key: str,
  88. device_id: int,
  89. device_type: str,
  90. ) -> dict[str, Any]:
  91. return api_list_device_points(
  92. project_key,
  93. device_id=device_id,
  94. device_type=device_type,
  95. )