From 6a49fd40f8718b981a2fff6f736ce6125a2fb91d Mon Sep 17 00:00:00 2001 From: haohao <1036606149@qq.com> Date: Sat, 28 Feb 2026 16:13:09 +0800 Subject: [PATCH] feat(iot): mcp code review --- .../iocoder/yudao/module/iot/mcp/config/IotMcpProperties.java | 1 + .../module/iot/mcp/security/McpApiKeyAuthenticationFilter.java | 1 + .../yudao/module/iot/mcp/tool/device/IotDeviceMcpTool.java | 3 +++ .../module/iot/mcp/tool/thingmodel/IotThingModelMcpTool.java | 1 + 4 files changed, 6 insertions(+) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/config/IotMcpProperties.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/config/IotMcpProperties.java index d6ea7f3a81..66022fc063 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/config/IotMcpProperties.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/config/IotMcpProperties.java @@ -5,6 +5,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; /** * IoT MCP 模块配置(如控制类工具开关等) + * TODO @AI: 在应用启动时打印控制类工具开关状态(enableControlTools=true 时输出 WARN 提醒) */ @ConfigurationProperties(prefix = "yudao.iot.mcp") @Data diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/security/McpApiKeyAuthenticationFilter.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/security/McpApiKeyAuthenticationFilter.java index d5cca6d35a..3d752af4a1 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/security/McpApiKeyAuthenticationFilter.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/security/McpApiKeyAuthenticationFilter.java @@ -65,6 +65,7 @@ public class McpApiKeyAuthenticationFilter extends OncePerRequestFilter { filterChain.doFilter(wrappedRequest, response); } + // TODO @AI: 增加详细审计日志(IP、User-Agent、认证结果),并评估使用 HashMap 缓存减少遍历时间差异 private McpSecurityProperties.ApiKeyItem findMatchingApiKey(String requestKey) { byte[] requestKeyBytes = requestKey.getBytes(StandardCharsets.UTF_8); for (McpSecurityProperties.ApiKeyItem item : properties.getApiKeys()) { diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/device/IotDeviceMcpTool.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/device/IotDeviceMcpTool.java index b2259c66ac..2522bd6c41 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/device/IotDeviceMcpTool.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/device/IotDeviceMcpTool.java @@ -77,6 +77,7 @@ public class IotDeviceMcpTool { /** * 设备元信息转 Map(不含属性快照、不含 deviceSecret) + * TODO @AI: 评估设备信息返回是否需要脱敏规则(如设备名含手机号/地址时),可配置脱敏策略 */ private Map deviceToMap(IotDeviceDO d, String productName) { Map m = new LinkedHashMap<>(); @@ -110,6 +111,7 @@ public class IotDeviceMcpTool { PageResult page = getDeviceService().getDevicePage(req); Set productIds = page.getList().stream().map(IotDeviceDO::getProductId).filter(java.util.Objects::nonNull).collect(Collectors.toSet()); Map productMap = productIds.isEmpty() ? Map.of() : getProductService().getProductMap(productIds); + // TODO @AI: 当 productMap.get(productId) 为 null 时,记录告警日志(产品已删除但设备仍关联),便于数据一致性检查 List> list = page.getList().stream() .map(d -> deviceToMap(d, productMap.get(d.getProductId()) != null ? productMap.get(d.getProductId()).getName() : null)) .collect(Collectors.toList()); @@ -225,6 +227,7 @@ public class IotDeviceMcpTool { if (device == null) { return JsonUtils.toJsonString(Map.of("error", "device_not_found", "hint", "设备不存在")); } + // TODO @AI: 增强时间解析逻辑,支持完整 ISO8601 格式(含时区),并限制最大查询时间范围(如 31 天) // 1. 解析时间参数,失败时返回统一错误 JSON LocalDateTime start; LocalDateTime end; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/thingmodel/IotThingModelMcpTool.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/thingmodel/IotThingModelMcpTool.java index 8697411c6d..f94dd6d5e1 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/thingmodel/IotThingModelMcpTool.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mcp/tool/thingmodel/IotThingModelMcpTool.java @@ -68,6 +68,7 @@ public class IotThingModelMcpTool { /** * 解析产品:productId → productKey → productName。返回 null product 表示未传任何有效参数;errorJson 非空时表示未找到或多条,调用方直接返回该 JSON。 + * TODO @AI: 若后续新增产品查询类 MCP 工具,可将 resolveProduct 抽到 McpToolUtils 复用 */ private ProductResolveResult resolveProduct(Long productId, String productKey, String productName) { ProductResolveResult out = new ProductResolveResult();