#最近项目中用到了MCP server和dify相关的内容
#今天查一下数据库,做一个简单的示例
#简单易懂,干货满满
概述
本调研文档实现一个基于Spring Boot的获取数据库资源的 MCP Server,该服务能够从MySQL数据库中动态读取表数据并提供给AI系统(如Dify)使用。通过MCP(Model Context Protocol)协议,AI系统可以查询项目信息、表单数据和文档信息等资源。
什么是资源?
资源是服务器提供给客户端的数据实体,可以是文件、数据库记录、内存中的对象等。
资源型的 MCP Server 主要提供可被客户端读取的数据。
这些数据可以是 API 的响应、文件的内容,甚至是数据库中的记录。
资源型服务器的核心功能是将这些数据以一种标准化的方式开放出来,供客户端访问和使用。
它们主要用于提供信息,而不涉及复杂的计算操作。
应用场景:
API 数据访问:例如,一个天气数据 API 的 MCP Server 可以提供实时的天气信息,供客户端随时读取。
文件内容共享:一个文档管理系统的 MCP Server 可以开放文件的内容,使得客户端能够访问和下载所需的文件。
数据库查询:一个数据库 MCP Server 可以提供查询接口,允许客户端获取特定的数据记录。
技术架构分析
2.1 核心技术栈
基于现有项目分析,技术架构包括:
Spring Boot 3.5.5: 应用框架
Spring AI 1.0.2: MCP协议支持
MyBatis: 数据库访问框架
MySQL: 数据存储
MCP协议: 与AI系统通信的标准协议
2.2 项目结构分析和所需依赖
mcp-dify-demo/
├── src/main/java/org/example/mcpdifydemo/
│ ├── Mapper/ # MyBatis数据访问接口
│ ├── entity/ # 数据实体类
│ ├── service/ # 业务逻辑层,包含MCP工具定义
│ ├── config/ # 配置类
│ └── McpDifyDemoApplication.java # 应用入口
└── src/main/resources/
└── application.yml # 配置文件
<!-- spring server mcp依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
<version>1.0.2</version>
</dependency>
对于 Mcp Client,Spring AI 提供了如下两个 Starter 集成 MCP Client;
spring-ai-mcp-client-spring-boot-starter: 实现基于 STDIO 和 HTTP 的 SSE 传输协议的 Mcp Client
spring-ai-mcp-client-webflux-spring-boot-starter: 实现基于 WebFlux 的 SSE 传输协议的 Mcp Client
对于 Mcp Server, Spring AI 提供了如下三个 Starter 集成 Mcp Server;
spring-ai-mcp-server-spring-boot-starter: 实现支持 STDIO 传输协议的 Mcp Server
spring-ai-mcp-server-webmvc-spring-boot-starter: 实现基于 webmvc 的 SSE 传输协议的 Mcp Server
spring-ai-mcp-server-webflux-spring-boot-starter: 实现基于 webflux 的 SSE 传输协议的 Mcp Server
功能需求实现方案
3.1 动态数据查询支持
项目基本信息查询
通过 ProjectService 提供项目信息查询功能:
@Service
@Slf4j
public class ProjectService {
@Autowired
private ProjectMapper projectMapper;
@Tool(name = "getProjectList", description = "根据项目Id查询项目基本信息")
public Project getProjectList(Integer projectId) {
// 实现逻辑
}
@Tool(name = "getAllProjectList", description = "查询所有项目信息")
public List<Project> getAllProjectList() {
// 实现逻辑
}
}
MCP server 工具是如何决策使用哪个工具的?
服务器会根据客户端的请求内容和可用工具的定义来决定使用哪个工具
工具选择的详细机制:
工具注册过程:
MCP Server 会注册所有可用的工具
每个工具都有唯一的标识符和功能描述
工具通过 tools 端点向客户端暴露其能力
客户端请求处理流程:
工具发现: 客户端通过 tools/list 请求获取可用工具列表
工具选择: 根据请求内容和工具描述匹配最适合的工具
工具调用: 通过 tools/call 端点调用具体工具
决策依据:
工具名称匹配: 客户端请求中指定的工具名称
参数兼容性: 工具所需参数与客户端提供的参数匹配度
功能描述匹配: 基于工具的功能描述和客户端请求意图的匹配
3.2 动态更新支持
为确保数据的实时性,每次查询都直接从数据库获取最新数据,不使用缓存。
MyBatis默认每次查询都会访问数据库,满足动态更新需求。
测试如下:
第一次调用:

修改数据库内容:

第二次调用:

与Dify平台的交互流程
4.1 MCP协议交互流程
连接建立: Dify通过HTTP连接到MCP Server
工具获取: 获取到MCP server的工具列表
工具调用: Dify调用注册的工具(如查询项目信息)
数据返回: MCP Server执行查询并返回结果
动态更新: 每次查询都直接访问数据库获取最新数据
4.2 MCP server在dify上的配置
4.2.1. 在dify平台选择添加MCP服务

4.2.2.本地项目对应的地址和名称,标识符填写

4.2.3.添加成功后如下所示:

4.2.4.点击进入,可以看到该MCP server对应的工具

4.2.5.在下面的页面中新建空白应用,创建后得到邮册应用

4.2.6.在应用中配置对应的MCP server和模型


4.2.7.填写对应的指令

4.2.8.点击预览就可以问ai关于工具的问题

4.2.9.结果和数据库中对比
4.3 数据流图

开发与配置流程
5.1 核心开发内容
5.1.1 MCP工具定义
使用Spring AI的@Tool注解将服务方法暴露为MCP工具:
@Tool(name = "getProjectList", description = "根据项目Id查询项目基本信息")
public Project getProjectList(Integer projectId) {
// 方法实现
}
5.1.2 工具注册配置
在McpConfig中注册工具:
@Configuration
public class McpConfig {
@Bean
public List<ToolCallback> projectTools(ProjectService projectService) {
return List.of(ToolCallbacks.from(projectService));
}
@Bean
public ToolCallbackProvider docTools(DocListService docListService) {
return MethodToolCallbackProvider.builder()
.toolObjects(docListService)
.build();
}
}
一次性注入多个service:

ToolCallback和ToolCallbackProvider的区别:
ToolCallback
一个service中的单个工具,List<ToolCallback>是这个service中的所有工具的集合。
定义: ToolCallback 是一个接口,用于定义单个工具回调的执行逻辑
作用: 直接处理工具调用的具体实现,包含实际的业务逻辑
使用场景: 通常用于单一工具方法的回调处理
特点:
代表一个具体的工具执行实例
可以通过 ToolCallbacks.from() 方法从 service 对象转换而来
ToolCallbackProvider
定义: ToolCallbackProvider 是一个提供者接口,用于提供一组 ToolCallback 实例
作用: 作为工具回调的工厂或容器,负责管理和提供多个工具回调
使用场景: 用于批量管理和提供多个相关的工具回调
特点:
可以包含多个 ToolCallback 实例
使用 MethodToolCallbackProvider.builder().toolObjects() 可以一次性注册多个 service 对象
提供更高级别的抽象来管理工具集合
总结
数量管理: ToolCallback 处理单个工具,ToolCallbackProvider 管理多个工具
抽象层次: ToolCallback 是具体实现,ToolCallbackProvider 是提供者模式
灵活性: ToolCallbackProvider 提供更灵活的工具组合和管理方式
5.1.3 数据库访问层
使用MyBatis注解方式定义查询:
@Mapper
public interface ProjectMapper {
@Select("SELECT * FROM sys_project WHERE id = #{projectId}")
Project getProjectList(Integer projectId);
@Select("SELECT * FROM sys_project")
List<Project> getAllProjectList();
}
5.2 关键配置项
5.2.1 数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: root123
mybatis:
configuration:
map-underscore-to-camel-case: true
5.2.2 MCP Server配置
spring:
ai:
mcp:
server:
name: mcp-dify-demo
sse-message-endpoint: /mcp/message
type: SYNC
instructions: "资源型MCP server" #"介绍这个server的作用
sse-endpoint: /sse #sse端点
capabilities:
tool: true #/支持工具调用
resource: true #资源管理
prompt: true #提示词
completion: true #完成功能
version: 1.0.0 #服务的版本
部署相关
6.1 应用打包
可使用Maven打包应用
6.2 运行应用
java -jar target/database-mcp-server.jar
验收测试方案
7.1 动态更新测试
启动MCP Server应用
在Dify中配置并连接MCP Server
通过Dify查询某条数据(如项目ID为1的项目信息)
使用Navicat等工具手动修改数据库中对应记录
再次通过Dify查询同一条数据
验证返回的数据是否为修改后的最新数据
截图见3.2中
7.2 功能测试
测试项目信息查询功能
测试错误处理机制(如查询不存在的记录,可自己代码中加异常处理相关的机制)
总结
通过Spring AI的MCP支持实现了一个能够与Dify集成的Database MCP Server。
该方案具有以下特点:
实时数据访问: 每次查询都直接访问数据库,确保数据的实时性
标准协议支持: 使用MCP协议与Dify等AI系统无缝集成
模块化设计: 各功能模块解耦,便于维护和扩展
安全配置: 支持查询限制,防止数据泄露
通过以上设计和实现,可以满足从MySQL数据库动态读取数据并提供给AI系统使用的需求,并确保数据的实时性和一致性。


767

被折叠的 条评论
为什么被折叠?



