From 788b372e3273f4804e83d50608dc001c7fcf9b58 Mon Sep 17 00:00:00 2001
From: ageerle <ageerle@163.com>
Date: 星期四, 17 四月 2025 16:23:32 +0800
Subject: [PATCH] feat: mcp支持远程调用

---
 ruoyi-admin/src/main/resources/mcp-server.json                                                 |   12 ++++++
 ruoyi-modules-api/ruoyi-chat-api/pom.xml                                                       |   29 ++++++++++++--
 ruoyi-admin/src/main/resources/application.yml                                                 |   12 +++++
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java |   32 ++++++++++++++-
 4 files changed, 76 insertions(+), 9 deletions(-)

diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index bc65411..29c367f 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -319,5 +319,15 @@
         secret: ''
         token:   ''
         aesKey: ''
-
+spring:
+  ai:
+    openai:
+      api-key: sk-xXe1WMPjhlVb1aiI1b4c6c8934D8463f9e4b67Ed8718B772
+      base-url: https://api.pandarobot.chat/
+    mcp:
+      client:
+        enabled: true
+        name: call-mcp-server
+        stdio:
+          servers-configuration: classpath:mcp-server.json
 
diff --git a/ruoyi-admin/src/main/resources/mcp-server.json b/ruoyi-admin/src/main/resources/mcp-server.json
new file mode 100644
index 0000000..869ca5d
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/mcp-server.json
@@ -0,0 +1,12 @@
+{
+  "mcpServers": {
+    "fileSystem": {
+      "command": "C:\\Program Files\\nodejs\\npx.cmd",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-filesystem",
+        "D:\\software"
+      ]
+    }
+  }
+}
diff --git a/ruoyi-modules-api/ruoyi-chat-api/pom.xml b/ruoyi-modules-api/ruoyi-chat-api/pom.xml
index 62578a0..6fbae9e 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/pom.xml
+++ b/ruoyi-modules-api/ruoyi-chat-api/pom.xml
@@ -32,6 +32,14 @@
 
     <!-- 瀵硅瘽鍩虹妯″潡 -->
     <dependencies>
+
+        <dependency>
+            <groupId>io.modelcontextprotocol.sdk</groupId>
+            <artifactId>mcp-spring-webflux</artifactId>
+            <version>0.8.0</version>
+        </dependency>
+
+
         <dependency>
             <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-chat</artifactId>
@@ -55,16 +63,27 @@
 
         <dependency>
             <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId>
+            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>io.modelcontextprotocol.sdk</groupId>
-            <artifactId>mcp-spring-webflux</artifactId>
-            <version>0.8.0</version>
-            <scope>compile</scope>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-mcp</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId>
+        </dependency>
+
+
+
 
     </dependencies>
 
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
index 1f2f47e..2c9fd28 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.json.JSONUtil;
 import io.modelcontextprotocol.client.McpClient;
+import io.modelcontextprotocol.client.McpSyncClient;
 import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
 import io.modelcontextprotocol.spec.McpSchema;
 import lombok.RequiredArgsConstructor;
@@ -15,6 +16,12 @@
 import org.ruoyi.common.chat.openai.OpenAiStreamClient;
 import org.ruoyi.common.chat.request.ChatRequest;
 import org.ruoyi.common.core.exception.ServiceException;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.memory.ChatMemory;
+import org.springframework.ai.chat.memory.InMemoryChatMemory;
+import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
+import org.springframework.ai.tool.ToolCallbackProvider;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.reactive.function.client.WebClient;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@@ -27,14 +34,33 @@
 
 @Service
 @Slf4j
-@RequiredArgsConstructor
 public class OpenAIServiceImpl implements IChatService {
 
-    private final OpenAiStreamClient openAiStreamClient;
+    @Autowired
+    private OpenAiStreamClient openAiStreamClient;
+
+    private final ChatClient chatClient;
+
+    private final ChatMemory chatMemory = new InMemoryChatMemory();
+
+
+
+    public OpenAIServiceImpl(ChatClient.Builder chatClientBuilder, List<McpSyncClient> mcpSyncClients, ToolCallbackProvider tools) {
+        this.chatClient = chatClientBuilder
+                .defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients))
+                .build();
+    }
+
+
+    public String webMcpChat(String prompt){
+        return this.chatClient.prompt(prompt).call().content();
+
+    }
+
 
     @Override
     public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) {
-        String toolString = mcpChat(chatRequest);
+        String toolString = webMcpChat(chatRequest.getPrompt());
 
         Message userMessage = Message.builder().content("宸ュ叿杩斿洖淇℃伅锛�"+toolString).role(Message.Role.ASSISTANT).build();
         List<Message> messages = chatRequest.getMessages();

--
Gitblit v1.9.3