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