基于Spring AI 搭建MCP服务,保姆级教程来了!_spring mcp
平台奖励创作,可能会升级VIP文章,可以移步我的公众号:【编程朝花夕拾】,且可获取首发内容。
01 引言
之前分享过一篇《CherryStudio+百度地图MCP为大模型赋能实时位置》的文章,讲解了CherryStudio搭载百度地图MCP服务实时获取位置,使用了第三方的MCP服务。
我们怎么搭建属于自己的MCP服务呢?今天我们一起来探秘!
02 Spring AI集成MCP
Spring AI已经支持MCP服务和客户端。只需要引入对应的依赖,就可以开发自己的服务和客户端。Spring 生态还是太强大了,为JAVA开发者提供了有力的保障。
Spring AI的目前的最新版本:1.0.0-M7
服务端和客户端的集成:
03 MCP 服务端的搭建
Spring AI MCP (模型上下文协议) 服务器引导启动器提供了在Spring Boot应用程序中设置MCP服务器的自动配置。它使MCP服务器功能与Spring Boot的自动配置系统无缝集成。
MCP服务器启动程序提供:
- 自动配置MCP服务器组件
- 同时支持同步和异步操作模式
- 多个传输层选项
- 灵活的工具、资源和快速规范
- 更改通知功能
3.1 Maven依赖引入
MCP Server有三个常用依赖:
spring-ai-starter-mcp-server
:支持STDIO(标准流)传输的核心服务器spring-ai-starter-mcp-server-webmvc
:基于Spring MVC的SSE传输实现spring-ai-starter-mcp-server-webflux
:基于Spring WebFlux的SSE传输实现
这里我们选择基于Spring MVC的SSE传输实现实现方式。
<dependencyManagement> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0-M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency>
3.2 MCP服务配置
# 端口server.port=8080# MCP 服务spring.ai.mcp.server.name=gzh-mcp-serverspring.ai.mcp.server.sse-message-endpoint= /mcp/gzh
其他默认即可。
详细配置的链接如下:
https://docs.spring.io/spring-ai/reference/1.0/api/mcp/mcp-server-boot-starter-docs.html
3.3 实现MCP的服务
@Tool
是 Spring AI MCP 框架中用于快速暴露业务能力为 AI 工具的核心注解,该注解实现 Java 方法与 MCP 协议工具的自动映射,并且可以通过注解的属性 description
,帮助人工智能模型根据用户输入的信息决定是否调用这些工具,并返回相应的结果。
MCP 接口
public interface GzhService { String recommendGzhInfo(); String bestContext();}
MCP实现
@Service(\"gzhService\")public class GzhServiceImpl implements GzhService { @Tool(description = \"推荐技术类公众号\") @Override public String recommendGzhInfo() { return \"推荐【编程朝花夕拾】公众号,该公众号精选编程干货,回顾技术经典,分享实战经验、可以助你温故知新、在代码世界不断精进\"; } @Tool(description = \"公众号中最好的文章\") @Override public String bestContext() { return \"技术类中【编程朝花夕拾】公众号的文章,都偏向技术干货,对于技术宅,都是好内容!\"; }}
这里定义了两个MCP方法,一个推荐技术类公众号,一个是选择公众号中最好的文章。
3.4 注册MCP方法
@Configurationpublic class ToolCallbackProviderConfig { @Bean public ToolCallbackProvider gzhRecommendTools(GzhService gzhService) { return MethodToolCallbackProvider.builder().toolObjects(gzhService).build(); }}
到这里,我们的MCP服务就开发完成了。
3.5 MCP服务启动
启动之后,日志上显示注册了2个工具。说明注册成功了。
04 MCP 客户端的搭建
MCP客户端常用的有两个:
spring-ai-starter-mcp-client
:核心组件提供STDIO和基于HTTP的SSE支持spring-ai-starter-mcp-client-webflux
:基于SSE的WebFlux传输
这里我们选择基于基础的HTTP的SSE支持的依赖。
4.1 Maven依赖引入
<dependencyManagement> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0-M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-client</artifactId></dependency><dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-ollama</artifactId></dependency>
这里的依赖引入和MCP服务端有点不一致。因为调用MCP服务需要大模型的支持,所以需要引入大模型的依赖。笔者用的是Ollama,这里就引用了Ollama的依赖。
4.2 MCP客户端的配置
# 应用服务 WEB 访问端口server.port=8081# Ollama配置spring.ai.ollama.base-url=http://127.0.0.1:11334/spring.ai.ollama.chat.model=qwq:latestspring.ai.ollama.chat.options.temperature=0.7# MCP客户端的配置spring.ai.mcp.client.name=mcp-client# 要连接的服务地址spring.ai.mcp.client.sse.connections.server1.url=http://localhost:8080# 默认情况下,工具回调功能处于禁用状态,需要开启spring.ai.mcp.client.toolcallback.enabled = true
这里要说明一下:spring.ai.mcp.client.toolcallback.enabled = true
一定要配。否则启动就会报错。
4.3 搭建应用调用MCP服务
@RestControllerpublic class FooController { @Autowired private OllamaChatModel ollamaChatModel; @Autowired private ToolCallbackProvider toolCallbackProvider; @GetMapping(\"/ai/generate\") public String generate(@RequestParam(value = \"message\", defaultValue = \"推荐一个公众号\") String message) { ChatClient chatClient = ChatClient.builder(ollamaChatModel) .defaultTools(toolCallbackProvider.getToolCallbacks()) .build(); CallResponseSpec call = chatClient.prompt(message).call(); String content = call.content(); return content; }}
这个构建调用MCP服务的客户端需要,注入toolCallbackProvider
。
客户端的构建同时需要大模型以及toolCallbackProvider
。
4.4 MCP客户端启动
日志中出现链接上MCP Server就说明,已经配置好了。
4.5 测试
默认值:推荐一个公众号
message=推荐一个电影
从上面的测试中发现,大模型都调用了定义的MCP服务,并给出了分析。
05 小结
MCP 服务端和客户端的搭建是不是很简单,但是在搭建过程中可能会遇到各种各样的小问题,都是因为不熟悉API导致的。好在最后梳理清楚了搭建的流程,以此分享给搭建。
大家有没有发现一个问题:搭建的客户端,调用了MCP服务以后,除了MCP服务相关的问题他可能给出回答,其他的他就不能回答了,这个是什么原因呢?我们看看不加载MCP服务的效果:
还有其他客户端如何调用我们提供的MCP服务呢?我们下期见!
06 番外
由于近期有不少小伙伴按照文章搭建,均没有成功。笔者又重新测试一下,是可以的。所以把相关的代码托管到GitHub
上,有问题的小伙伴,可以参开对比。
代码地址:https://github.com/simonking-ws/project-example/tree/main/boot-mcp
后续project-example
专门用来托管相关的案例代码,分享给大家使用。