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/controller/McpController.java |   90 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/ai/mcp/controller/McpController.java b/src/main/java/com/zy/ai/mcp/controller/McpController.java
new file mode 100644
index 0000000..bf53c2e
--- /dev/null
+++ b/src/main/java/com/zy/ai/mcp/controller/McpController.java
@@ -0,0 +1,90 @@
+package com.zy.ai.mcp.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.ai.mcp.config.McpToolsBootstrap;
+import com.zy.ai.mcp.dto.JsonRpcRequest;
+import com.zy.ai.mcp.dto.JsonRpcResponse;
+import com.zy.ai.mcp.dto.ToolDefinition;
+import com.zy.ai.mcp.dto.ToolRegistry;
+import com.zy.ai.mcp.service.WcsDataFacade;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/ai/mcp")
+public class McpController {
+
+    private final ToolRegistry registry = new ToolRegistry();
+
+    @Autowired
+    private WcsDataFacade wcsDataFacade;
+
+    public McpController(WcsDataFacade wcsDataFacade) {
+        this.wcsDataFacade = wcsDataFacade;
+    }
+
+    @PostConstruct
+    public void init() {
+        McpToolsBootstrap.registerAll(registry, wcsDataFacade);
+        log.info("MCP initialized, tools={}", registry.listTools().size());
+    }
+
+    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public Object handle(@RequestBody JsonRpcRequest req,
+                         @RequestHeader(value = "Authorization", required = false) String auth) {
+
+        // 锛堝缓璁級鍋氫竴涓畝鍗曢壌鏉冿細闃叉琚殢渚胯皟鐢ㄧ敓浜х郴缁�
+        // if (!"Bearer your-token".equals(auth)) return JsonRpcResponse.err(null, 401, "Unauthorized", null);
+
+        String id = req.getId();
+        String method = req.getMethod();
+        JSONObject params = JSON.parseObject(JSON.toJSONString(req.getParams()));
+
+        try {
+            if ("initialize".equals(method)) {
+                Map<String, Object> result = new LinkedHashMap<String, Object>();
+                result.put("serverName", "wcs-mcp");
+                result.put("serverVersion", "1.0.0");
+                result.put("capabilities", Arrays.asList("tools"));
+                return JsonRpcResponse.ok(id, result);
+            }
+
+            if ("tools/list".equals(method)) {
+                Map<String, Object> result = new LinkedHashMap<String, Object>();
+                result.put("tools", registry.listTools());
+                // cursor/paging 浣犲悗闈㈤渶瑕佸啀鍔�
+                return JsonRpcResponse.ok(id, result);
+            }
+
+            if ("tools/call".equals(method)) {
+                String toolName = params.getString("name");
+                JSONObject arguments = params.getJSONObject("arguments");
+                if (toolName == null || toolName.trim().isEmpty()) {
+                    return JsonRpcResponse.err(id, -32602, "Invalid params: missing tool name", null);
+                }
+                ToolDefinition def = registry.get(toolName);
+                if (def == null) {
+                    return JsonRpcResponse.err(id, -32601, "Method not found: tool " + toolName, null);
+                }
+                Object output = def.getHandler().handle(arguments == null ? new JSONObject() : arguments);
+
+                Map<String, Object> result = new LinkedHashMap<String, Object>();
+                result.put("content", output); // 浣犱篃鍙互鎸� MCP 甯歌杩斿洖缁撴瀯鍋� text/json 鍒嗘
+                return JsonRpcResponse.ok(id, result);
+            }
+
+            return JsonRpcResponse.err(id, -32601, "Method not found: " + method, null);
+
+        } catch (Exception e) {
+            log.error("MCP handle error, method={}, params={}", method, params, e);
+            return JsonRpcResponse.err(id, -32000, "Server error", e.getMessage());
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1