From 073b1cf309d3d7de6f0e8bcd983217553bfe3a8e Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Tue, 8 Jul 2025 15:52:15 +0800 Subject: [PATCH] =?UTF-8?q?sse=20mcp=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++++- .../modules/springai/ChatController.java | 7 ++--- .../modules/springai/McpHeartbeatService.java | 27 +++++++++++++++++++ src/main/resources/application.yml | 20 ++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/peanut/modules/springai/McpHeartbeatService.java diff --git a/pom.xml b/pom.xml index dde1866c..58678f21 100644 --- a/pom.xml +++ b/pom.xml @@ -62,8 +62,13 @@ - + + + org.springframework.ai + spring-ai-starter-mcp-client + + org.springframework.ai spring-ai-starter-model-openai diff --git a/src/main/java/com/peanut/modules/springai/ChatController.java b/src/main/java/com/peanut/modules/springai/ChatController.java index f86a8347..93d53f4a 100644 --- a/src/main/java/com/peanut/modules/springai/ChatController.java +++ b/src/main/java/com/peanut/modules/springai/ChatController.java @@ -2,6 +2,7 @@ package com.peanut.modules.springai; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,11 +16,11 @@ public class ChatController { private final ChatClient chatClient; - public ChatController(ChatClient.Builder chatClientBuilder) { - this.chatClient = chatClientBuilder.build(); + public ChatController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) { + this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build(); } - @RequestMapping("/chat") + @RequestMapping(value = "/chat") public Flux chat(@RequestBody Map parmas) { return chatClient.prompt() .user(parmas.get("message").toString()) diff --git a/src/main/java/com/peanut/modules/springai/McpHeartbeatService.java b/src/main/java/com/peanut/modules/springai/McpHeartbeatService.java new file mode 100644 index 00000000..7354dcc7 --- /dev/null +++ b/src/main/java/com/peanut/modules/springai/McpHeartbeatService.java @@ -0,0 +1,27 @@ +package com.peanut.modules.springai; + +import io.modelcontextprotocol.client.McpSyncClient; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class McpHeartbeatService { + + private final List mcpClients; + + public McpHeartbeatService(List mcpClients) { + this.mcpClients = mcpClients; + } + + @Scheduled(fixedRate = 120000) // 每2分钟1次发送心跳 + public void sendHeartbeat() { + try { + this.mcpClients.parallelStream().forEach(client -> {client.ping();}); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0a704428..3bc2f526 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,6 +40,26 @@ spring: main: allow-circular-references: true ai: + mcp: + client: + toolcallback: + enabled: true + name: spring-ai-mcp-client + type: async + sse: + connections: + server1: + url: http://localhost:9090 +# stdio: +# connections: +# server2: +# command: java +# args: +# -Dspring.ai.mcp.server.stdio=true +# -Dspring.main.web-application-type=none +# -Dspring.main.banner-mode=off +# -jar +# F:\ideaProject\stdioServer\target\stdioServer-0.0.1-SNAPSHOT.jar openai: api-key: sk-9b9babcc85414e999faac58411eb40d0 # 设置 DeepSeek API 的访问密钥,永远不要将密钥提交到代码仓库,建议通过环境变量注入。-收费 base-url: https://api.deepseek.com # 指定 DeepSeek API 的基础地址,格式与OpenAI相同。