From deea428bfa2bc00be672337b0f939f34b0c54493 Mon Sep 17 00:00:00 2001
From: OpenX123 <2113239898goole@gmail.com>
Date: Fri, 12 Dec 2025 13:09:34 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=8A=A0=E8=BD=BD=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E6=93=8D=E4=BD=9C=E3=80=81=E5=9B=BE=E7=89=87=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2=E3=80=81PlantUML=E7=94=9F=E6=88=90=E3=80=81=E7=BD=91?=
=?UTF-8?q?=E9=A1=B5=E6=90=9C=E7=B4=A2=E3=80=81=E7=BB=88=E7=AB=AF=E5=91=BD?=
=?UTF-8?q?=E4=BB=A4=E3=80=81=E6=96=87=E6=A1=A3=E8=A7=A3=E6=9E=90=E7=AD=89?=
=?UTF-8?q?=E5=AE=9E=E7=94=A8MCP=E5=B7=A5=E5=85=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-extend/ruoyi-mcp-server/pom.xml | 33 +++++
.../mcpserve/RuoyiMcpServeApplication.java | 12 +-
.../config/DynamicToolCallbackProvider.java | 104 ++++++++++++++
.../ruoyi/mcpserve/config/McpToolsConfig.java | 75 ++++++++++
.../mcpserve/config/ToolsProperties.java | 65 +++++++++
.../mcpserve/controller/ToolsController.java | 128 ++++++++++++++++++
.../BasicTools.java} | 23 ++--
.../ruoyi/mcpserve/tools/DocumentTools.java | 41 ++++++
.../org/ruoyi/mcpserve/tools/FileTools.java | 55 ++++++++
.../mcpserve/tools/ImageSearchTools.java | 70 ++++++++++
.../org/ruoyi/mcpserve/tools/McpTool.java | 17 +++
.../ruoyi/mcpserve/tools/PlantUmlTools.java | 87 ++++++++++++
.../ruoyi/mcpserve/tools/TerminalTools.java | 75 ++++++++++
.../ruoyi/mcpserve/tools/WebPageTools.java | 67 +++++++++
.../ruoyi/mcpserve/tools/WebSearchTools.java | 88 ++++++++++++
.../src/main/resources/application.yml | 34 +++++
16 files changed, 956 insertions(+), 18 deletions(-)
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/DynamicToolCallbackProvider.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/McpToolsConfig.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/ToolsProperties.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/controller/ToolsController.java
rename ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/{service/ToolService.java => tools/BasicTools.java} (71%)
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/DocumentTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/FileTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/ImageSearchTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/McpTool.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/PlantUmlTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/TerminalTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/WebPageTools.java
create mode 100644 ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/tools/WebSearchTools.java
diff --git a/ruoyi-extend/ruoyi-mcp-server/pom.xml b/ruoyi-extend/ruoyi-mcp-server/pom.xml
index a35f0140..6dfb5d17 100644
--- a/ruoyi-extend/ruoyi-mcp-server/pom.xml
+++ b/ruoyi-extend/ruoyi-mcp-server/pom.xml
@@ -47,6 +47,39 @@
test
+
+
+ cn.hutool
+ hutool-all
+ 5.8.25
+
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.12.0
+
+
+
+
+ net.sourceforge.plantuml
+ plantuml
+ 1.2024.3
+
+
+
+
+ org.springframework.ai
+ spring-ai-tika-document-reader
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
diff --git a/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/RuoyiMcpServeApplication.java b/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/RuoyiMcpServeApplication.java
index 54a01deb..9abee854 100644
--- a/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/RuoyiMcpServeApplication.java
+++ b/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/RuoyiMcpServeApplication.java
@@ -1,13 +1,12 @@
package org.ruoyi.mcpserve;
-import org.ruoyi.mcpserve.service.ToolService;
-import org.springframework.ai.tool.ToolCallbackProvider;
-import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
/**
+ * MCP Server 应用启动类
+ * 工具通过 DynamicToolCallbackProvider 动态加载
+ *
* @author ageer
*/
@SpringBootApplication
@@ -17,9 +16,4 @@ public class RuoyiMcpServeApplication {
SpringApplication.run(RuoyiMcpServeApplication.class, args);
}
- @Bean
- public ToolCallbackProvider systemTools(ToolService toolService) {
- return MethodToolCallbackProvider.builder().toolObjects(toolService).build();
- }
-
}
diff --git a/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/DynamicToolCallbackProvider.java b/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/DynamicToolCallbackProvider.java
new file mode 100644
index 00000000..e4c0f6f3
--- /dev/null
+++ b/ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcpserve/config/DynamicToolCallbackProvider.java
@@ -0,0 +1,104 @@
+package org.ruoyi.mcpserve.config;
+
+import org.ruoyi.mcpserve.tools.McpTool;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ai.tool.ToolCallback;
+import org.springframework.ai.tool.ToolCallbackProvider;
+import org.springframework.ai.tool.method.MethodToolCallbackProvider;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 动态工具回调提供者
+ * 根据配置动态加载启用的MCP工具
+ *
+ * @author OpenX
+ */
+@Component
+public class DynamicToolCallbackProvider implements ToolCallbackProvider {
+
+ private static final Logger log = LoggerFactory.getLogger(DynamicToolCallbackProvider.class);
+
+ private final McpToolsConfig mcpToolsConfig;
+ private final List allTools;
+ private volatile ToolCallback[] cachedCallbacks;
+
+ public DynamicToolCallbackProvider(McpToolsConfig mcpToolsConfig, List allTools) {
+ this.mcpToolsConfig = mcpToolsConfig;
+ this.allTools = allTools;
+ log.info("发现 {} 个MCP工具", allTools.size());
+ }
+
+ @Override
+ public ToolCallback[] getToolCallbacks() {
+ if (cachedCallbacks == null) {
+ synchronized (this) {
+ if (cachedCallbacks == null) {
+ cachedCallbacks = buildToolCallbacks();
+ }
+ }
+ }
+ return cachedCallbacks;
+ }
+
+ /**
+ * 构建工具回调数组
+ */
+ private ToolCallback[] buildToolCallbacks() {
+ List