MCP 客户端是 MCP 架构中的关键组件,主要负责和 MCP 服务器建立连接并进行通信。它能自动匹配服务器的协议版本,确认可用功能,并负责数据传输和 JSON-RPC 交互。此外,它还能发现和使用各种工具、管理资源,并与提示系统进行交互。
除了这些核心功能,MCP 客户端还支持一些额外特性,比如根管理、采样控制,以及同步或异步操作。为了适应不同场景,它提供了多种数据传输方式,包括标准输入/输出、基于 Java HttpClient 和 WebFlux 的 SSE 传输。
MCP 服务端
MCP 服务器是整个 MCP 架构的核心部分,主要用来为客户端提供各种工具、资源和功能支持。它负责处理客户端的请求,包括解析协议、提供工具、管理资源以及处理各种交互信息。同时,它还能记录日志、发送通知,并且支持多个客户端同时连接,保证高效的通信和协作。它可以通过多种方式进行数据传输,比如标准输入/输出、Servlet、WebFlux 和 WebMVC,满足不同应用场景的需求。
Spring AI 集成 MCP
可以通过引入一些依赖,直接让 Spring AI 和 MCP 进行集成,在 Spring Boot 项目中轻松使用。
比如客户端启动器:
- spring-ai-starter-mcp-client:核心启动器,提供 STDIO 和基于 HTTP 的 SSE 支持
- spring-ai-starter-mcp-client-webflux:基于 WebFlux 的 SSE 流式传输实现
服务器启动器:
- spring-ai-starter-mcp-server:核心服务器,具有 STDIO 传输支持
- spring-ai-starter-mcp-server-webmvc:基于 Spring MVC 的 SSE 流式传输实现
- spring-ai-starter-mcp-server-webflux:基于 WebFlux 的 SSE 流式传输实现
MCP开发实践
- 新增mcpserver工程
- 添加maven配置
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server</artifactId> </dependency>
添加yml配置文件配置
spring ai mcp server namesuper-sql-mcp-server version1.0.0 typeSYNC
注意点需要关闭springboot的banner输出
##服务端口 server port8088 spring application ###应用名 namesuper-sql-mcp-server main banner-modeoff web-application-typenone
开始实现mcp的接口
public interface ISQLEngineService { String genSQL(String question); List<Map<String,Object>> getNl2SQLData(String question); }
实现接口代码
实现 MCP 工具
@Tool 是 Spring AI MCP 框架中用于快速暴露业务能力为 AI 工具的核心注解,该注解实现 Java 方法与 MCP 协议工具的自动映射,并且可以通过注解的属性 description,帮助人工智能模型根据用户输入的信息决定是否调用这些工具,并返回相应的结果。
- 注册MCP工具
到这里为止MCP的服务端就开发完成了,接下来我们要实现的是mcp的client端
- 引入mcp client的pom
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-client</artifactId> </dependency>
- 配置文件配置
- 配置mcp-sercers.json
{ "mcpServers": { "super-sql-mcp-server": { "command": "java", "args": [ "-jar", "-Dspring.ai.mcp.server.stdio=true", "-Dspring.main.web-application-type=none", "-Dlogging.pattern.console=", "-Dspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver", "-Dspring.datasource.url=jdbc:mysql://localhost:3306/supersql?characterEncoding=utf8&useSSL=false", "-Dspring.datasource.username=root", "-Dspring.datasource.password=123456", "-Dspring.ai.azure.openai.api-key=your_openai_api_key", "-Dspring.ai.azure.openai.chat.options.deployment-name=your_chat_model_deployment_name", "-Dspring.ai.azure.openai.endpoint=your_openai_endpoint", "-Dspring.ai.azure.openai.embedding.options.deployment-name=your_embedding_model_deployment_name", "-Dspring.ai.vectorstore.chroma.client.host=http://127.0.0.1", "-Dspring.ai.vectorstore.chroma.client.port=8000", "-Dspring.ai.vectorstore.chroma.collection-name=super-sql", "-Dspring.ai.vectorstore.chroma.initialize-schema=true", "D:\\your_jar_file_path\\super-sql-mcp-stdio-1.0.0-M1.jar" ], "env": {} } } }
开发对应的接口
最后测试一下
结果显示已经调用了MCP工具,并且数据来源于数据库中
基于SSE的服务端
除了基于 stdio 的实现外,Spring AI 还提供了基于 Server-Sent Events (SSE) 的 MCP 客户端方案。相较于 stdio 方式,SSE 更适用于远程部署的 MCP 服务器,客户端可以通过标准 HTTP 协议与服务器建立连接,实现单向的实时数据推送。基于 SSE 的 MCP 服务器支持被多个客户端远程调用。
由于sse与stdio除了maven依赖和配置不同,其他不需要修改,所以这里不过赘述
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId> </dependency>
配置文件配置
spring: ai: mcp: server: name: webmvc-super-sql-mcp-server version: 1.0.0 stdio: false type: ASYNC sse-message-endpoint: /mcp/messages sse-endpoint: /sse capabilities: tool: true resource: true prompt: true completion: true
开发完成的mcp你可以上传到modelscope的MCP广场,让更多的人关注到你的mcp或者higress的MCP广场