基于现有配置接口,使用 FastMCP 构建一个面向大模型的查询型 MCP 服务。
第一版目标:
project_key 选择项目环境page_size=100id 作为正式查询参数,避免名称重名带来的歧义第一版不做的事情:
id 的自动猜测正式搜索工具统一使用 id 参数,而不是名称参数。
所有业务工具还必须显式传入 project_key,用于定位项目配置和认证信息。
原因:
id 为主因此第一版采用两层结构:
idid 发起正式查询第一版不单独提供 find_locations、find_systems 这类解析工具。
原因:
所有分页接口都保留后端原有分页行为:
page_size=100page_num这样可以避免一次调用返回过大数据,也更符合后端原始接口行为。
当某一页没有找到目标结果时,MCP 应明确提示:
page_num第一版不对树结构或接口返回结果做额外整理:
MCP 以“尽量接近后端返回”的方式对外暴露结果,只补充必要的工具层说明。
项目配置来自 sys_config 中的 mcp_project_data_projects。
单个项目配置至少包含:
project_keyproject_namebase_urlusernamepasswordenabled业务请求流程:
project_key 找到项目配置base_url、username、password登录接口:
POST {base_url}/api/ai/auth/password_login登录成功条件:
errcode 为 0 或 0.0token业务请求认证方式:
AuthorizationBearer 前缀token 缓存策略:
project_key 单独缓存sys_configexpire_at 仍未过期时直接复用接口:POST /api/configapi/location/list
用途:
keyword 为空时可全量拉取输入特点:
输出特点:
childrenid、code、full_code、name、parent_id、levelMCP 处理建议:
page_size=100id 作为后续设备/仪表查询参数接口:POST /api/configapi/meter/list
用途:
keyword 为空时可全量拉取主要过滤字段:
location_idshow_belowkeywordmeter_type_idmeasurement_location_idsmeasurement_system_idsmeasurement_device_type_idsstatus字段语义:
location_id:仪表安装位置measurement_location_ids:仪表关联的测量位置measurement_system_ids:仪表关联的测量系统measurement_device_type_ids:仪表关联的测量设备类型注意:
parent_id、parent_namekeyword 更适合定义为“模糊匹配名称、编号等文本字段”关于 measurement_flag 的当前工作假设:
0:无1:设备2:其他非设备对象该语义来自现有页面文案和样例数据,但后续若后端给出正式定义,应以正式定义为准。
接口:POST /api/configapi/system/tree
用途:
结构特点:
type=1:系统类型type=2:系统MCP 处理建议:
接口:POST /api/configapi/system/list
用途:
主要过滤字段:
system_type_idshow_belowMCP 处理建议:
page_size=100id接口:POST /api/configapi/devicetype/list
用途:
特点:
page_size=-1 全量返回接口:POST /api/configapi/device/list
用途:
keyword 为空时可全量拉取主要过滤字段:
location_idshow_belowkeywordsystem_idsdevice_type_idsMCP 处理建议:
page_size=100id 过滤接口:POST /api/configapi/metertype/list
用途:
特点:
page_size=-1 全量返回接口:
POST /api/configapi/topo/getPOST /api/configapi/topo/get_data用途:
topo/get:读取单张拓扑结构、data_options、dimension_configtopo/get_data:读取单张拓扑在某个展示维度和单个时间点下的节点数据关键约束:
topo/get_data 一次只支持一个拓扑、一个 display、一个时间点display=instant 不带时间参数display=accu 需要显式传 accu_step 和 ts当前 MCP 处理:
topology.get_node 查询时实时调用 1 次 instantnode_id 直接匹配来源字段:
topo/get 返回中的 dimension_config适用范围:
topology_type=2 的拓扑图结构特点:
dimension_config.dimensions 表示分组配置dimension_config.filter 表示筛选配置filter.conditions[].fields 存储业务对象 ID 列表,需要额外解析名称枚举语义:
order: 1=顺序,2=逆序filter_type: 1=所有,2=任一match_type: 1=等于,2=不等于,3=包含,4=不包含对象类型语义:
11=位置12=系统类型13=系统14=设备类型15=设备16=仪表类型17=仪表型号18=仪表19=拓扑图分组20=拓扑图名称解析来源:
11 -> list_locations12 -> list_system_tree13 -> list_systems14 -> list_device_types15 -> search_devices16 -> list_meter_types18 -> search_meters19 -> 本地拓扑分组缓存20 -> 本地拓扑注册缓存当前限制:
17(仪表型号)暂未实现名称解析,需要后续补接口或规则第一版只保留必要工具,不做额外封装工具。
list_locations用途:
location_id建议入参:
project_key: strkeyword: str | None = None内部调用:
/api/configapi/location/list返回字段:
idnamecodefull_codeparent_idlevel备注:
keyword 为空时全量拉取list_system_tree用途:
建议入参:
project_key: str内部调用:
/api/configapi/system/tree返回字段:
list_systems用途:
system_id建议入参:
project_key: strpage_size: int = 100page_num: int = 1system_type_id: int = 0show_below: bool = True内部调用:
/api/configapi/system/list返回字段:
idnamecodesystem_type_idsystem_type_namelist_device_types用途:
建议入参:
project_key: str内部调用:
/api/configapi/devicetype/list返回字段:
idnamecodelist_meter_types用途:
建议入参:
project_key: str内部调用:
/api/configapi/metertype/list返回字段:
idnamecodesearch_devices用途:
建议入参:
project_key: strpage_size: int = 100page_num: int = 1keyword: str | None = Nonelocation_id: int = 0show_below: bool = Truesystem_ids: list[int] | None = Nonedevice_type_ids: list[int] | None = None内部调用:
/api/configapi/device/list返回字段:
idnamecodedevice_type_iddevice_type_namelocation_idlocation_namesystem_idsystem_nameparent_idis_grouplocation_full_code备注:
keyword 为空时表示不按关键字过滤page_numsearch_meters用途:
建议入参:
project_key: strpage_size: int = 100page_num: int = 1keyword: str | None = Nonelocation_id: int = 0show_below: bool = Truemeter_type_id: int = 0measurement_location_ids: list[int] | None = Nonemeasurement_system_ids: list[int] | None = Nonemeasurement_device_type_ids: list[int] | None = Nonestatus: int | None = None内部调用:
/api/configapi/meter/list返回字段:
idnamecodemeter_type_idmeter_type_namelocation_idlocation_nameparent_idparent_namemeasurement_flagmeasurement_device_idmeasurement_device_namemeasurement_location_idmeasurement_location_namemeasurement_system_idmeasurement_system_namemeasurement_device_type_idmeasurement_device_type_namestatusmeter_model_idmeter_model_namemeter_model_brandcode_prefix备注:
keyword 为空时表示不按关键字过滤page_nummeasurement_flag 做强校验,只透传查询条件topology.group_list用途:
建议入参:
project_key: strtopology.list用途:
建议入参:
project_key: strgroup_id: int | None = Noneobject_type_code: int | None = Nonetopology.get_node用途:
建议入参:
project_key: strtopology_id: intnode_id: str = 'root'include_siblings: bool = Trueinclude_children: bool = True返回结构:
data_windowtopologynodeparentschildrensiblings说明:
topology 中包含 data_options、metric_definitions、dimension_confignode.data.instant 为实时值node.data.accu.hourly 为最近 12 个整点小时累计值node.data.accu.daily 为最近 7 个日零点累计值topology.get_group_config用途:
建议入参:
project_key: strtopology_id: int返回结构:
supportedraw_dimension_configgroupingsfilter说明:
groupings 由 dimension_config.dimensions 派生filter 由 dimension_config.filter 派生filter.conditions[].field_items 为解析后的 id + nametopology.find_context用途:
建议入参:
project_key: strentity_type: strentity_id: inttopology_id: int | None = Noneinclude_siblings: bool = Trueancestor_depth: int = 5descendant_depth: int = 2步骤:
list_locations(keyword=...)
需要传入 project_keylocation_idsearch_meters(project_key=..., location_id=..., show_below=...)步骤:
list_systems(project_key=..., ...) 或 list_system_tree(project_key=...)system_idsearch_devices(project_key=..., system_ids=[...])步骤:
list_device_types(project_key=...) 获取 device_type_idlist_systems(project_key=..., ...) 获取 system_idsearch_meters(project_key=..., measurement_device_type_ids=[...], measurement_system_ids=[...])第一版不做自动翻页。
约定:
page_size=100page_num适用接口:
location/listsystem/listdevice/listmeter/list不涉及分页控制的接口:
system/treedevicetype/listmetertype/list第一版建议尽量保持后端接口的返回结构:
statestate_infodataitems 结构这样可以降低实现复杂度,也便于和后端接口文档直接对照。
第一版建议采用简单直接的错误策略。
state != 0 时视为业务失败state 和 state_info建议采用三层结构。
职责:
operatorproject_key 定位项目配置建议模块:
client.py职责:
建议模块:
services/location.pyservices/system.pyservices/device.pyservices/meter.py职责:
FastMCP 工具建议模块:
server.py以下能力可在后续版本再补:
id实现顺序建议如下:
FastMCP 基础服务list_locations、list_systems、list_device_types、list_meter_typessearch_devices 和 search_meters