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