From 82624affb0251b75b62b35567d3eb260c06efe78 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期一, 23 三月 2026 12:48:07 +0800
Subject: [PATCH] #ai 代码优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java |   94 +---------------------------------------------
 1 files changed, 3 insertions(+), 91 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
index befeb3f..cd8285a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
@@ -1,20 +1,13 @@
 package com.vincent.rsf.server.ai.service.impl;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.ai.config.AiDefaults;
 import com.vincent.rsf.server.ai.entity.AiMcpMount;
 import com.vincent.rsf.server.ai.service.BuiltinMcpToolRegistry;
 import com.vincent.rsf.server.ai.service.MountedToolCallback;
 import com.vincent.rsf.server.ai.service.McpMountRuntimeFactory;
-import io.modelcontextprotocol.client.McpClient;
 import io.modelcontextprotocol.client.McpSyncClient;
-import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport;
-import io.modelcontextprotocol.client.transport.ServerParameters;
-import io.modelcontextprotocol.client.transport.StdioClientTransport;
-import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
-import io.modelcontextprotocol.spec.McpSchema;
+import com.vincent.rsf.server.ai.service.impl.mcp.McpClientFactory;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
@@ -22,22 +15,19 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 @Slf4j
 @Service
 @RequiredArgsConstructor
 public class McpMountRuntimeFactoryImpl implements McpMountRuntimeFactory {
 
-    private final ObjectMapper objectMapper;
     private final BuiltinMcpToolRegistry builtinMcpToolRegistry;
+    private final McpClientFactory mcpClientFactory;
 
     /**
      * 鎶婁竴缁� MCP 鎸傝浇璁板綍瑙f瀽鎴愪竴娆″璇濆彲鐩存帴浣跨敤鐨勮繍琛屾椂瀵硅薄銆�
@@ -60,7 +50,7 @@
                     mountedNames.add(mount.getName());
                     continue;
                 }
-                McpSyncClient client = createClient(mount);
+                McpSyncClient client = mcpClientFactory.createClient(mount);
                 client.initialize();
                 client.listTools();
                 clients.add(client);
@@ -109,84 +99,6 @@
         }
         if (!duplicateNames.isEmpty()) {
             throw new CoolException("MCP 宸ュ叿鍚嶇О閲嶅锛岃璋冩暣鎸傝浇閰嶇疆: " + String.join(", ", duplicateNames));
-        }
-    }
-
-    private McpSyncClient createClient(AiMcpMount mount) {
-        /**
-         * 鎸夋寕杞介厤缃姩鎬佸垱寤� MCP Client銆�
-         * 璇ユ柟娉曞彧璐熻矗 transport 灞傚垵濮嬪寲锛屼笉璐熻矗宸ュ叿鍘婚噸鍜岄敊璇仛鍚堛��
-         */
-        Duration timeout = Duration.ofMillis(mount.getRequestTimeoutMs() == null
-                ? AiDefaults.DEFAULT_TIMEOUT_MS
-                : mount.getRequestTimeoutMs());
-        JacksonMcpJsonMapper jsonMapper = new JacksonMcpJsonMapper(objectMapper);
-        if (AiDefaults.MCP_TRANSPORT_STDIO.equals(mount.getTransportType())) {
-            ServerParameters.Builder parametersBuilder = ServerParameters.builder(mount.getCommand());
-            List<String> args = readStringList(mount.getArgsJson());
-            if (!args.isEmpty()) {
-                parametersBuilder.args(args);
-            }
-            Map<String, String> env = readStringMap(mount.getEnvJson());
-            if (!env.isEmpty()) {
-                parametersBuilder.env(env);
-            }
-            StdioClientTransport transport = new StdioClientTransport(parametersBuilder.build(), jsonMapper);
-            transport.setStdErrorHandler(message -> log.warn("MCP STDIO stderr [{}]: {}", mount.getName(), message));
-            return McpClient.sync(transport)
-                    .requestTimeout(timeout)
-                    .initializationTimeout(timeout)
-                    .clientInfo(new McpSchema.Implementation("rsf-ai-client", "RSF AI Client", "1.0.0"))
-                    .build();
-        }
-        if (!AiDefaults.MCP_TRANSPORT_SSE_HTTP.equals(mount.getTransportType())) {
-            throw new CoolException("涓嶆敮鎸佺殑 MCP 浼犺緭绫诲瀷: " + mount.getTransportType());
-        }
-
-        if (!StringUtils.hasText(mount.getServerUrl())) {
-            throw new CoolException("MCP 鏈嶅姟鍦板潃涓嶈兘涓虹┖");
-        }
-        HttpClientSseClientTransport.Builder transportBuilder = HttpClientSseClientTransport.builder(mount.getServerUrl())
-                .jsonMapper(jsonMapper)
-                .connectTimeout(timeout);
-        if (StringUtils.hasText(mount.getEndpoint())) {
-            transportBuilder.sseEndpoint(mount.getEndpoint());
-        }
-        Map<String, String> headers = readStringMap(mount.getHeadersJson());
-        if (!headers.isEmpty()) {
-            transportBuilder.customizeRequest(builder -> headers.forEach(builder::header));
-        }
-        return McpClient.sync(transportBuilder.build())
-                .requestTimeout(timeout)
-                .initializationTimeout(timeout)
-                .clientInfo(new McpSchema.Implementation("rsf-ai-client", "RSF AI Client", "1.0.0"))
-                .build();
-    }
-
-    private List<String> readStringList(String json) {
-        /** 瑙f瀽鎸傝浇琛ㄩ噷鐨� JSON 鏁扮粍閰嶇疆锛屼緥濡� STDIO args銆� */
-        if (!StringUtils.hasText(json)) {
-            return Collections.emptyList();
-        }
-        try {
-            return objectMapper.readValue(json, new TypeReference<List<String>>() {
-            });
-        } catch (Exception e) {
-            throw new CoolException("瑙f瀽 MCP 鍒楄〃閰嶇疆澶辫触: " + e.getMessage());
-        }
-    }
-
-    private Map<String, String> readStringMap(String json) {
-        /** 瑙f瀽鎸傝浇琛ㄩ噷鐨� JSON Map 閰嶇疆锛屼緥濡� headers 鎴栫幆澧冨彉閲忋�� */
-        if (!StringUtils.hasText(json)) {
-            return Collections.emptyMap();
-        }
-        try {
-            Map<String, String> result = objectMapper.readValue(json, new TypeReference<LinkedHashMap<String, String>>() {
-            });
-            return result == null ? Collections.emptyMap() : result;
-        } catch (Exception e) {
-            throw new CoolException("瑙f瀽 MCP Map 閰嶇疆澶辫触: " + e.getMessage());
         }
     }
 

--
Gitblit v1.9.1