From 411ff551ae7641dfc5c9331e99bf8b6e5770e2fa Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 30 十二月 2025 18:05:14 +0800
Subject: [PATCH] #mcp

---
 src/main/java/com/zy/ai/mcp/config/McpToolsBootstrap.java |  232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 232 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/ai/mcp/config/McpToolsBootstrap.java b/src/main/java/com/zy/ai/mcp/config/McpToolsBootstrap.java
new file mode 100644
index 0000000..b15119f
--- /dev/null
+++ b/src/main/java/com/zy/ai/mcp/config/McpToolsBootstrap.java
@@ -0,0 +1,232 @@
+package com.zy.ai.mcp.config;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zy.ai.mcp.dto.McpToolHandler;
+import com.zy.ai.mcp.dto.ToolDefinition;
+import com.zy.ai.mcp.dto.ToolRegistry;
+import com.zy.ai.mcp.service.WcsDataFacade;
+
+import java.util.*;
+
+public class McpToolsBootstrap {
+
+    public static void registerAll(ToolRegistry registry, final WcsDataFacade facade) {
+
+        registry.register(tool(
+                "device.get_crn_status",
+                "Query realtime status of a crn device by deviceNo.",
+                schemaObj(
+                        propInt("crnNos", true)
+                ),
+                schemaObj(
+                        propObj("devices", true)
+                ),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getCrnDeviceStatus(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "device.get_station_status",
+                "Query realtime status of a station device",
+                schemaObj(
+
+                ),
+                schemaObj(
+                        propObj("stations", true)
+                ),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getStationDeviceStatus(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "device.get_rgv_status",
+                "Query realtime status of a rgv device by deviceNo.",
+                schemaObj(
+                        propInt("rgvNos", true)
+                ),
+                schemaObj(
+                        propObj("devices", true)
+                ),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getRgvDeviceStatus(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "task.list",
+                "List tasks by filters (status/CrnDevice/RgvDevice//time window).",
+                schemaObj(
+                        propInt("crnNo", false),
+                        propInt("rgvNo", false),
+                        propArr("taskNos", false, "integer"),
+                        propInt("limit", false)
+                ),
+                schemaObj(propArr("tasks", true, "object")),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getTasks(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "log.query",
+                "Query logs by keyword/level/time window/device/task. Return clipped log lines.",
+                schemaObj(
+                        propInt("limit", false)
+                ),
+                schemaObj(propArr("logs", true, "object")),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getLogs(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "config.get_device_config",
+                "Get device config by deviceCode.",
+                schemaObj(
+                        propArr("crnNos", false, "integer"),
+                        propArr("rgvNos", false, "integer"),
+                        propArr("devpNos", false, "integer")
+                ),
+                schemaObj(propObj("deviceConfigs", true)),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getDeviceConfig(args);
+                    }
+                }
+        ));
+
+        registry.register(tool(
+                "config.get_system_config",
+                "Get key system configs for diagnosis.",
+                schemaObj(
+
+                ),
+                schemaObj(
+                        propObj("systemConfigs", true)
+                ),
+                new McpToolHandler() {
+                    public Object handle(JSONObject args) {
+                        return facade.getSystemConfig(args);
+                    }
+                }
+        ));
+
+//        // 鈽� 璇婃柇鑱氬悎蹇収锛氫竴娆℃嬁鍏�
+//        registry.register(tool(
+//                "build_diagnosis_snapshot",
+//                "Aggregate diagnosis snapshot: tasks + device realtime + configs + clipped logs for diagnosis.",
+//                schemaObj(
+//                        propStr("warehouseCode", true),
+//                        propArr("deviceCodes", false, "string"),     // 涓嶄紶鍒欐寜浠诲姟娑夊強璁惧鎺ㄥ
+//                        propStr("taskNo", false),
+//                        propStr("fromTime", true),
+//                        propStr("toTime", true),
+//                        propInt("taskLimit", false),
+//                        propInt("logLimit", false),
+//                        propArr("logKeywords", false, "string"),
+//                        propBool("includeSystemConfig", false),
+//                        propBool("includeDeviceConfig", false)
+//                ),
+//                schemaObj(
+//                        propObj("snapshot", true),
+//                        propArr("hints", false, "string")
+//                ),
+//                new McpToolHandler() {
+//                    public Object handle(JSONObject args) {
+//                        return facade.buildDiagnosisSnapshot(args);
+//                    }
+//                }
+//        ));
+    }
+
+    // ---------- schema helpers ----------
+    private static ToolDefinition tool(String name, String desc,
+                                       Map<String, Object> in, Map<String, Object> out,
+                                       McpToolHandler handler) {
+        ToolDefinition d = new ToolDefinition();
+        d.setName(name);
+        d.setDescription(desc);
+        d.setInputSchema(in);
+        d.setOutputSchema(out);
+        d.setHandler(handler);
+        return d;
+    }
+
+    private static Map<String, Object> schemaObj(Object... props) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("type", "object");
+
+        Map<String, Object> properties = new LinkedHashMap<String, Object>();
+        List<String> required = new ArrayList<String>();
+
+        for (Object p : props) {
+            @SuppressWarnings("unchecked")
+            Map<String, Object> pm = (Map<String, Object>) p;
+            String name = String.valueOf(pm.get("name"));
+            boolean req = Boolean.TRUE.equals(pm.get("required"));
+            pm.remove("name");
+            pm.remove("required");
+            properties.put(name, pm);
+            if (req) required.add(name);
+        }
+
+        m.put("properties", properties);
+        if (!required.isEmpty()) m.put("required", required);
+        return m;
+    }
+
+    private static Map<String, Object> propStr(String name, boolean required) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("name", name);
+        m.put("required", required);
+        m.put("type", "string");
+        return m;
+    }
+
+    private static Map<String, Object> propInt(String name, boolean required) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("name", name);
+        m.put("required", required);
+        m.put("type", "integer");
+        return m;
+    }
+
+    private static Map<String, Object> propBool(String name, boolean required) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("name", name);
+        m.put("required", required);
+        m.put("type", "boolean");
+        return m;
+    }
+
+    private static Map<String, Object> propObj(String name, boolean required) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("name", name);
+        m.put("required", required);
+        m.put("type", "object");
+        return m;
+    }
+
+    private static Map<String, Object> propArr(String name, boolean required, String itemType) {
+        Map<String, Object> m = new LinkedHashMap<String, Object>();
+        m.put("name", name);
+        m.put("required", required);
+        m.put("type", "array");
+        Map<String, Object> items = new LinkedHashMap<String, Object>();
+        items.put("type", itemType);
+        m.put("items", items);
+        return m;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1