Selaa lähdekoodia

feat: mcp测试版

ageer 1 kuukausi sitten
vanhempi
commit
a4314dbbde

+ 83 - 0
ruoyi-extend/call-mcp-server/pom.xml

@@ -0,0 +1,83 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.ruoyi</groupId>
+        <artifactId>ruoyi-ai</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <artifactId>call-mcp-server</artifactId>
+    <name>Archetype - call-mcp-server</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <java.version>17</java.version>
+    </properties>
+
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.ai</groupId>
+                <artifactId>spring-ai-bom</artifactId>
+                <version>1.0.0-M6</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
+            <version>1.0.0-M6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-mcp</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
ruoyi-extend/call-mcp-server/src/main/java/org/ruoyi/rocket/callmcpserver/CallMcpServerApplication.java

@@ -0,0 +1,13 @@
+package org.ruoyi.rocket.callmcpserver;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CallMcpServerApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CallMcpServerApplication.class, args);
+    }
+
+}

+ 22 - 0
ruoyi-extend/call-mcp-server/src/main/java/org/ruoyi/rocket/callmcpserver/cofing/McpClientCfg.java

@@ -0,0 +1,22 @@
+package org.ruoyi.rocket.callmcpserver.cofing;
+
+import io.modelcontextprotocol.client.McpClient;
+import org.springframework.ai.mcp.customizer.McpSyncClientCustomizer;
+import org.springframework.context.annotation.Configuration;
+
+import java.time.Duration;
+
+
+/**
+ * @author ageer
+ */
+@Configuration
+public class McpClientCfg implements McpSyncClientCustomizer {
+
+
+    @Override
+    public void customize(String name, McpClient.SyncSpec spec) {
+        // do nothing
+        spec.requestTimeout(Duration.ofSeconds(30));
+    }
+}

+ 74 - 0
ruoyi-extend/call-mcp-server/src/main/java/org/ruoyi/rocket/callmcpserver/view/ChatController.java

@@ -0,0 +1,74 @@
+package org.ruoyi.rocket.callmcpserver.view;
+
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
+import org.springframework.ai.chat.memory.ChatMemory;
+import org.springframework.ai.chat.memory.InMemoryChatMemory;
+import org.springframework.ai.chat.model.ChatResponse;
+import org.springframework.ai.openai.OpenAiChatOptions;
+import org.springframework.ai.tool.ToolCallbackProvider;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Flux;
+
+
+/**
+ * @author jianzhang
+ * 2025/03/18/下午8:00
+ */
+@RestController
+@RequestMapping("/dashscope/chat-client")
+public class ChatController {
+
+    private final ChatClient chatClient;
+
+    private final ChatMemory chatMemory = new InMemoryChatMemory();
+
+    public ChatController(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools) {
+        this.chatClient = chatClientBuilder
+                .defaultTools(tools)
+                .defaultOptions(
+                        OpenAiChatOptions.builder().model("gpt-4o-mini").build())
+                .build();
+    }
+
+    @RequestMapping(value = "/generate_stream", method = RequestMethod.GET)
+    public Flux<ChatResponse> generateStream(HttpServletResponse response, @RequestParam("id") String id, @RequestParam("prompt") String prompt) {
+        response.setCharacterEncoding("UTF-8");
+        var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, id, 10);
+
+
+        Flux<ChatResponse> chatResponseFlux = this.chatClient.prompt(prompt)
+                .advisors(messageChatMemoryAdvisor)
+                .stream()
+                .chatResponse();
+
+        Flux<String> content = this.chatClient.prompt(prompt)
+                .advisors(messageChatMemoryAdvisor)
+                .stream()
+                .content();
+
+        content.subscribe(
+                content1 -> System.out.println("chatResponse"+content1)
+        );
+        return chatResponseFlux;
+
+
+    }
+
+
+    @GetMapping("/advisor/chat/{id}/{prompt}")
+    public Flux<String> advisorChat(
+            HttpServletResponse response,
+            @PathVariable String id,
+            @PathVariable String prompt) {
+
+        response.setCharacterEncoding("UTF-8");
+        var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, id, 10);
+        return this.chatClient.prompt(prompt)
+                .advisors(messageChatMemoryAdvisor).stream().content();
+    }
+
+
+
+}

+ 21 - 0
ruoyi-extend/call-mcp-server/src/main/java/org/ruoyi/rocket/callmcpserver/view/IndexController.java

@@ -0,0 +1,21 @@
+package org.ruoyi.rocket.callmcpserver.view;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author jianzhang
+ * 2025/03/18/下午8:00
+ */
+@Controller
+public class IndexController {
+
+    @GetMapping("/")
+    public String chat(Model model) {
+        //model.addAttribute("name", "User");
+        // 返回视图名称,对应 templates/index.html
+        return "index";
+    }
+
+}

+ 16 - 0
ruoyi-extend/call-mcp-server/src/main/resources/application.yaml

@@ -0,0 +1,16 @@
+server:
+  port: 9999
+spring:
+  ai:
+    openai:
+      api-key: sk-xXe1WMPjhlVb1aiI1b4c6c8934D8463f9e4b67Ed8718B772
+      base-url: https://api.pandarobot.chat/
+    mcp:
+      client:
+        enabled: true
+        name: call-mcp-server
+        sse:
+          connections:
+            server1:
+              url: http://127.0.0.1:6040
+

+ 40 - 0
ruoyi-extend/call-mcp-server/src/main/resources/mcp-server-bak.json

@@ -0,0 +1,40 @@
+{
+  "mcpServers": {
+    "fileSystem": {
+      "command": "D:\\software\\nodeJs\\npx.cmd",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-filesystem",
+        "D:\\software\\sqlite"
+      ]
+    },
+    "sqlLite": {
+      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uvx.exe",
+      "args": [
+        "mcp-server-sqlite",
+        "--db-path",
+        "D:\\work-space-study\\spring-ai-mcp-demo\\mcp-client\\src\\main\\resources\\test.db"
+      ]
+    },
+    "fetch": {
+      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uvx.exe",
+      "args": [
+        "mcp-server-fetch"
+      ]
+    },
+    "baidu-map": {
+      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uvx.exe",
+      "args": [
+        "run",
+        "--with",
+        "mcp[cli]",
+        "mcp",
+        "run",
+        "D:\\work-space-python\\python-baidu-map\\baidu_map_mcp_server\\map.py"
+      ],
+      "env": {
+        "BAIDU_MAPS_API_KEY": "{百度地图API-KEY}"
+      }
+    }
+  }
+}

+ 20 - 0
ruoyi-extend/call-mcp-server/src/main/resources/mcp-server.json

@@ -0,0 +1,20 @@
+{
+  "mcpServers": {
+    "fileSystem": {
+      "command": "D:\\software\\nodeJs\\npx.cmd",
+      "args": [
+        "-y",
+        "@modelcontextprotocol/server-filesystem",
+        "D:\\software\\sqlite"
+      ]
+    },
+    "sqlLite": {
+      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uvx.exe",
+      "args": [
+        "mcp-server-sqlite",
+        "--db-path",
+        "D:\\work-space-study\\spring-ai-mcp-demo\\mcp-client\\src\\main\\resources\\test.db"
+      ]
+    }
+  }
+}

+ 148 - 0
ruoyi-extend/call-mcp-server/src/main/resources/templates/index.html

@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>AI 对话助手</title>
+    <script src="https://cdn.tailwindcss.com"></script>
+</head>
+<body class="bg-gray-100 min-h-screen">
+<div class="container mx-auto p-4 max-w-3xl">
+    <!-- 标题 -->
+    <div class="text-center mb-8">
+        <h1 class="text-3xl font-bold text-gray-800">AI 对话助手</h1>
+        <p class="text-gray-600 mt-2">基于 Spring AI 的流式对话系统 By AhuCodingBeast</p>
+    </div>
+
+    <!-- 聊天容器 -->
+    <div id="chat-container" class="bg-white rounded-xl shadow-lg p-4 mb-4 h-[500px] overflow-y-auto space-y-4">
+        <!-- 初始欢迎消息 -->
+        <div class="ai-message flex items-start gap-3">
+            <div class="bg-green-100 p-3 rounded-lg max-w-[85%]">
+                <span class="text-gray-800">您好!我是AI助手,有什么可以帮您?</span>
+            </div>
+        </div>
+    </div>
+
+    <!-- 输入区域 -->
+    <div class="flex gap-2">
+        <input type="text" id="message-input"
+               class="flex-1 border border-gray-300 rounded-xl px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
+               placeholder="输入您的问题...">
+        <button id="send-button"
+                class="bg-blue-500 text-white px-6 py-3 rounded-xl hover:bg-blue-600 transition-colors flex items-center">
+            <span>发送</span>
+            <svg id="loading-spinner" class="hidden w-4 h-4 ml-2 animate-spin" fill="none" viewBox="0 0 24 24">
+                <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
+                <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path>
+            </svg>
+        </button>
+    </div>
+</div>
+
+<script>
+    const chatContainer = document.getElementById('chat-container');
+    const messageInput = document.getElementById('message-input');
+    const sendButton = document.getElementById('send-button');
+    const loadingSpinner = document.getElementById('loading-spinner');
+
+    // 发送消息处理
+    function handleSend() {
+        const message = messageInput.value.trim();
+        if (!message) return;
+
+        // 添加用户消息
+        addMessage(message, 'user');
+        messageInput.value = '';
+
+        // 构建API URL
+        const apiUrl = new URL('http://localhost:9999/dashscope/chat-client/generate_stream');
+        apiUrl.searchParams.append('id', '01');
+        apiUrl.searchParams.append('prompt', message);
+
+        // 显示加载状态
+        sendButton.disabled = true;
+        loadingSpinner.classList.remove('hidden');
+
+        // 创建EventSource连接
+        const eventSource = new EventSource(apiUrl);
+        let aiMessageElement = null;
+
+        eventSource.onmessage = (event) => {
+            try {
+                const data = JSON.parse(event.data);
+                console.log(data);
+                const content = data.result?.output?.text || '';
+                const finishReason = data.result?.metadata?.finishReason;
+
+                // 创建消息容器(如果不存在)
+                if (!aiMessageElement) {
+                    aiMessageElement = addMessage('', 'ai');
+                }
+
+                // 追加内容
+                if (content) {
+                    aiMessageElement.querySelector('.message-content').textContent += content;
+                    autoScroll();
+                }
+
+                // 处理结束
+                if (finishReason === 'STOP') {
+                    eventSource.close();
+                    sendButton.disabled = false;
+                    loadingSpinner.classList.add('hidden');
+                }
+            } catch (error) {
+                console.error('解析错误:', error);
+            }
+        };
+
+        eventSource.onerror = (error) => {
+            console.error('连接错误:', error);
+            eventSource.close();
+            sendButton.disabled = false;
+            loadingSpinner.classList.add('hidden');
+            addMessage('对话连接异常,请重试', 'ai', true);
+        };
+    }
+
+    // 添加消息到容器
+    function addMessage(content, type, isError = false) {
+        const messageDiv = document.createElement('div');
+        messageDiv.className = `${type}-message flex items-start gap-3`;
+
+        const bubble = document.createElement('div');
+        bubble.className = `p-3 rounded-lg max-w-[85%] ${
+            type === 'user'
+                ? 'bg-blue-500 text-white ml-auto'
+                : `bg-green-100 ${isError ? 'text-red-500' : 'text-gray-800'}`
+        }`;
+
+        const contentSpan = document.createElement('span');
+        contentSpan.className = 'message-content';
+        contentSpan.textContent = content;
+
+        bubble.appendChild(contentSpan);
+        messageDiv.appendChild(bubble);
+        chatContainer.appendChild(messageDiv);
+
+        autoScroll();
+        return bubble;
+    }
+
+    // 自动滚动到底部
+    function autoScroll() {
+        chatContainer.scrollTop = chatContainer.scrollHeight;
+    }
+
+    // 事件监听
+    sendButton.addEventListener('click', handleSend);
+    messageInput.addEventListener('keypress', (e) => {
+        if (e.key === 'Enter' && !e.shiftKey) {
+            e.preventDefault();
+            handleSend();
+        }
+    });
+</script>
+</body>
+</html>

+ 10 - 10
ruoyi-extend/ruoyi-mcp-server/pom.xml

@@ -49,16 +49,16 @@
             <artifactId>spring-ai-mcp</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.ruoyi</groupId>
-            <artifactId>ruoyi-system-api</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.ruoyi</groupId>
-                    <artifactId>ruoyi-common-translation</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.ruoyi</groupId>-->
+<!--            <artifactId>ruoyi-system-api</artifactId>-->
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.ruoyi</groupId>-->
+<!--                    <artifactId>ruoyi-common-translation</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
 
     </dependencies>
 </project>

+ 2 - 9
ruoyi-extend/ruoyi-mcp-server/src/main/java/org/ruoyi/mcp/service/McpCustomService.java

@@ -1,8 +1,5 @@
 package org.ruoyi.mcp.service;
 
-import lombok.RequiredArgsConstructor;
-import org.ruoyi.system.domain.vo.SysUserVo;
-import org.ruoyi.system.mapper.SysUserMapper;
 import org.springframework.ai.tool.annotation.Tool;
 import org.springframework.stereotype.Service;
 
@@ -10,18 +7,14 @@ import org.springframework.stereotype.Service;
  * @author ageer
  */
 @Service
-@RequiredArgsConstructor
 public class McpCustomService {
 
-	private final SysUserMapper userMapper;
-
-	public record User(String userName, Double userBalance) {
+	public record User(String userName, String userBalance) {
 	}
 
 	@Tool(description = "根据用户名称查询用户信息")
 	public User getUserBalance(String username) {
-		SysUserVo sysUserVo = userMapper.selectUserByUserName(username);
-		return new User(sysUserVo.getUserName(),sysUserVo.getUserBalance());
+		return new User("admin","99.99");
 	}
 
 }

+ 0 - 97
ruoyi-extend/ruoyi-mcp-server/src/main/resources/application-dev.yml

@@ -1,97 +0,0 @@
---- # 监控中心配置
-spring.boot.admin.client:
-  # 增加客户端开关
-  enabled: false
-  url: http://localhost:9090/admin
-  instance:
-    service-host-type: IP
-  username: ruoyi
-  password: 123456
-
---- # 数据源配置
-spring:
-  datasource:
-    type: com.zaxxer.hikari.HikariDataSource
-    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
-    dynamic:
-      # 性能分析插件(有性能损耗 不建议生产环境使用)
-      p6spy: true
-      # 设置默认的数据源或者数据源组,默认值即为 master
-      primary: master
-      # 严格模式 匹配不到数据源则报错
-      strict: true
-      datasource:
-        # 主库数据源
-        master:
-          type: ${spring.datasource.type}
-          driverClassName: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://43.139.70.230:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-          username: ry-vue
-          password: xx
-
-      hikari:
-        # 最大连接池数量
-        maxPoolSize: 20
-        # 最小空闲线程数量
-        minIdle: 10
-        # 配置获取连接等待超时的时间
-        connectionTimeout: 30000
-        # 校验超时时间
-        validationTimeout: 5000
-        # 空闲连接存活最大时间,默认10分钟
-        idleTimeout: 600000
-        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
-        maxLifetime: 1800000
-        # 连接测试query(配置检测连接是否有效)
-        connectionTestQuery: SELECT 1
-        # 多久检查一次连接的活性
-        keepaliveTime: 30000
-
---- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
-spring.data:
-  redis:
-    # 地址
-    host: 127.0.0.1
-    # 端口,默认为6379
-    port: 6379
-    # 数据库索引
-    database: 0
-    # 密码(如没有密码请注释掉)
-    # password: 123456
-    # 连接超时时间
-    timeout: 10S
-
-redisson:
-  # redis key前缀
-  keyPrefix:
-  # 线程池数量
-  threads: 4
-  # Netty线程池数量
-  nettyThreads: 8
-  # 单节点配置
-  singleServerConfig:
-    # 客户端名称
-    clientName: ${ruoyi.name}
-    # 最小空闲连接数
-    connectionMinimumIdleSize: 8
-    # 连接池大小
-    connectionPoolSize: 32
-    # 连接空闲超时,单位:毫秒
-    idleConnectionTimeout: 10000
-    # 命令等待超时,单位:毫秒
-    timeout: 3000
-    # 发布和订阅连接池大小
-    subscriptionConnectionPoolSize: 50
-
---- # sms 短信
-sms:
-  enabled: false
-  # 阿里云 dysmsapi.aliyuncs.com
-  # 腾讯云 sms.tencentcloudapi.com
-  endpoint: "dysmsapi.aliyuncs.com"
-  accessKeyId: xxxxxxx
-  accessKeySecret: xxxxxx
-  signName: 测试
-  # 腾讯专用
-  sdkAppId:
-

+ 0 - 10
ruoyi-extend/ruoyi-mcp-server/src/main/resources/application-mcp.yml

@@ -1,10 +0,0 @@
-spring:
-  application:
-    name: mcp-server
-  ai:
-    mcp:
-      server:
-        name: webmvc-mcp-server
-        version: 1.0.0
-        type: SYNC
-        sse-message-endpoint: /mcp/messages

+ 6 - 326
ruoyi-extend/ruoyi-mcp-server/src/main/resources/application.yml

@@ -1,332 +1,12 @@
-
-# 项目相关配置
-ruoyi:
-  # 名称
-  name: "ruoyi"
-  # 版本
-  version: ${revision}
-  # 版权年份
-  copyrightYear: 2025
-  # 实例演示开关
-  demoEnabled: true
-  # 获取ip地址开关
-  addressEnabled: false
-
-captcha:
-  enable: false
-  # 页面 <参数设置> 可开启关闭 验证码校验
-  # 验证码类型 math 数组计算 char 字符验证
-  type: MATH
-  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
-  category: CIRCLE
-  # 数字验证码位数
-  numberLength: 1
-  # 字符验证码长度
-  charLength: 4
-
-# 开发环境配置
 server:
-  # 服务器的HTTP端口,默认为8080
   port: 6040
-  servlet:
-    # 应用的访问路径
-    context-path: /
-  # undertow 配置
-  undertow:
-    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
-    max-http-post-size: -1
-    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
-    # 每块buffer的空间大小,越小的空间被利用越充分
-    buffer-size: 512
-    # 是否分配的直接内存
-    direct-buffers: true
-    threads:
-      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
-      io: 8
-      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
-      worker: 256
-# 用户配置
-user:
-  password:
-    # 密码最大错误次数
-    maxRetryCount: 5
-    # 密码锁定时间(默认10分钟)
-    lockTime: 10
-
-# Spring配置
 spring:
   application:
-    name: ${ruoyi.name}
-  # 资源信息
-  messages:
-    # 国际化资源文件路径
-    basename: i18n/messages
-  profiles:
-    active: @profiles.active@
-  # 文件上传
-  servlet:
-    multipart:
-      # 单个文件大小
-      max-file-size: 50MB
-      # 设置总上传的文件大小
-      max-request-size: 200MB
-  mvc:
-    format:
-      date-time: yyyy-MM-dd HH:mm:ss
-  jackson:
-    # 日期格式化
-    date-format: yyyy-MM-dd HH:mm:ss
-    serialization:
-      # 格式化输出
-      indent_output: false
-      # 忽略无法转换的对象
-      fail_on_empty_beans: false
-    deserialization:
-      # 允许对象忽略json中不存在的属性
-      fail_on_unknown_properties: false
-
-# Sa-Token配置
-sa-token:
-  # token名称 (同时也是cookie名称)
-  token-name: Authorization
-  # token有效期 设为7天 (必定过期) 单位: 秒
-  timeout: 604800
-  # token临时有效期 (指定时间无操作就过期) 单位: 秒
-  activity-timeout: 604800
-  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
-  is-concurrent: true
-  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
-  is-share: false
-  # 是否尝试从header里读取token
-  is-read-header: true
-  # 是否尝试从cookie里读取token
-  is-read-cookie: false
-  # token前缀
-  token-prefix: "Bearer"
-  # jwt秘钥
-  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
-
-# security配置
-security:
-  # 排除路径
-  excludes:
-    # 支付回调
-    - /pay/returnUrl
-    - /pay/notifyUrl
-    # 上传文件
-    - /resource/oss/upload
-    # 重置密码
-    - /auth/reset/password
-    # 聊天接口
-    - /chat
-    # 静态资源
-    - /*.html
-    - /**/*.html
-    - /**/*.css
-    - /**/*.js
-    # 公共路径
-    - /favicon.ico
-    - /error
-    # swagger 文档配置
-    - /*/api-docs
-    - /*/api-docs/**
-    # actuator 监控配置
-    - /actuator
-    - /actuator/**
-# 多租户配置
-tenant:
-  # 是否开启
-  enable: false
-  # 排除表
-  excludes:
-    - sys_menu
-    - sys_tenant
-    - sys_tenant_package
-    - sys_role_dept
-    - sys_role_menu
-    - sys_user_post
-    - sys_user_role
-
-# MyBatisPlus配置
-# https://baomidou.com/config/
-mybatis-plus:
-  # 不支持多包, 如有需要可在注解配置 或 提升扫包等级
-  # 例如 com.**.**.mapper
-  mapperPackage: org.ruoyi.**.mapper
-  # 对应的 XML 文件位置
-  mapperLocations: classpath*:mapper/**/*Mapper.xml
-  # 实体扫描,多个package用逗号或者分号分隔
-  typeAliasesPackage: org.ruoyi.**.domain
-  # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
-  checkConfigLocation: false
-  configuration:
-    # 自动驼峰命名规则(camel case)映射
-    mapUnderscoreToCamelCase: true
-    # MyBatis 自动映射策略
-    # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
-    autoMappingBehavior: FULL
-    # MyBatis 自动映射时未知列或未知属性处理策
-    # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
-    autoMappingUnknownColumnBehavior: NONE
-    # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
-    # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
-    # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
-    logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
-  global-config:
-    # 是否打印 Logo banner
-    banner: true
-    dbConfig:
-      # 主键类型
-      # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
-      idType: ASSIGN_ID
-      # 逻辑已删除值
-      logicDeleteValue: 2
-      # 逻辑未删除值
-      logicNotDeleteValue: 0
-      # 字段验证策略之 insert,在 insert 的时候的字段验证策略
-      # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL
-      insertStrategy: NOT_NULL
-      # 字段验证策略之 update,在 update 的时候的字段验证策略
-      updateStrategy: NOT_NULL
-      # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
-      where-strategy: NOT_NULL
-
-# 数据加密
-mybatis-encryptor:
-  # 是否开启加密
-  enable: false
-  # 默认加密算法
-  algorithm: BASE64
-  # 编码方式 BASE64/HEX。默认BASE64
-  encode: BASE64
-  # 安全秘钥 对称算法的秘钥 如:AES,SM4
-  password:
-  # 公私钥 非对称算法的公私钥 如:SM2,RSA
-  publicKey:
-  privateKey:
-
-# Swagger配置
-swagger:
-  info:
-    # 标题
-    title: '标题:${ruoyi.name}多租户管理系统_接口文档'
-    # 描述
-    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
-    # 版本
-    version: '版本号: ${ruoyi.version}'
-    # 作者信息
-    contact:
-      name: ageerle
-      email: ageerle@163.com
-      url: https://gitee.com/ageerle/ruoyi-ai
-  components:
-    # 鉴权方式配置
-    security-schemes:
-      apiKey:
-        type: APIKEY
-        in: HEADER
-        name: ${sa-token.token-name}
-
-springdoc:
-  api-docs:
-    # 是否开启接口文档
-    enabled: true
-  swagger-ui:
-    # 持久化认证数据
-    persistAuthorization: true
-  #这里定义了两个分组,可定义多个,也可以不定义
-  group-configs:
-    - group: 1.演示模块
-      packages-to-scan: org.ruoyi.demo
-    - group: 2.通用模块
-      packages-to-scan: org.ruoyi.web
-    - group: 3.系统模块
-      packages-to-scan: org.ruoyi.system
-    - group: 4.代码生成模块
-      packages-to-scan: org.ruoyi.generator
-
-# 防止XSS攻击
-xss:
-  # 过滤开关
-  enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
-  # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
-
-# 全局线程池相关配置
-thread-pool:
-  # 是否开启线程池
-  enabled: false
-  # 队列最大长度
-  queueCapacity: 128
-  # 线程池维护线程所允许的空闲时间
-  keepAliveSeconds: 300
-
---- # 分布式锁 lock4j 全局配置
-lock4j:
-  # 获取分布式锁超时时间,默认为 3000 毫秒
-  acquire-timeout: 3000
-  # 分布式锁的超时时间,默认为 30 秒
-  expire: 30000
-
---- # Actuator 监控端点的配置项
-management:
-  endpoints:
-    web:
-      exposure:
-        include: '*'
-  endpoint:
-    health:
-      show-details: ALWAYS
-    logfile:
-      external-file: ./logs/sys-console.log
-
-# websocket
-websocket:
-  enabled: true
-  # 路径
-  path: '/resource/websocket'
-  # 设置访问源地址
-  allowedOrigins: '*'
-
-# 微信小程序配置信息
-wx:
-  miniapp:
-    configs:
-      - appid: # 你的appid
-        secret: # 你的secret
-        token: #微信小程序消息服务器配置的token
-        aesKey: #微信小程序消息服务器配置的EncodingAESKey
-        msgDataFormat: JSON
-
-  #  企业微信应用
-wechat:
-  cp:
-    corpId:
-    appConfigs:
-      - agentId:
-        secret: ''
-        token:   ''
-        aesKey: ''
-
-spring:
+    name: mcp-server
   ai:
-    openai:
-      api-key: sk-xX
-      base-url: https://api.pandarobot.chat
-    ollama:
-      base-url: http://localhost:11434
-      init:
-        pull-model-strategy: always
-        timeout: 60s
-        max-retries: 1
     mcp:
-      client:
-        enabled: true
-        name: call-mcp-server
-        sse:
-          connections:
-            server1:
-              url: http://127.0.0.1:8080
-
+      server:
+        name: webmvc-mcp-server
+        version: 1.0.0
+        type: SYNC
+        sse-message-endpoint: /mcp/messages