基于Spring AI服务,开发MCP服务
大家好,好久没有写博客了,最近突然想写一些新的东西,如何开发mcp服务,本地如何调试。
一、项目概述
Spring AI MCP Demo 是一个基于 Spring 生态的多模块应用工程,主要围绕 AI 功能集成与服务通信展开,采用分层架构设计,包含客户端与服务端组件,支持标准 I/O 交互与服务器推送等多种通信模式。项目根目录位于 spring-ai-mcp-demo-master ,整体遵循 Maven 项目规范,通过模块化设计实现功能解耦。
二、模块结构与职责
1. 核心模块划分
项目包含三个子模块,各自承担不同角色:
- spring-ai-mcp-client :客户端模块,负责与服务端通信,集成 AI 功能调用能力,包含请求封装与响应处理逻辑。
- spring-ai-mcp-sse-server :SSE (Server-Sent Events) 服务端模块,通过 HTTP 长连接实现服务器向客户端的单向实时数据推送,适用于实时通知、数据流传输场景 spring-ai-mcp-sse-server 。
- spring-ai-mcp-stdio-server :标准 I/O 服务端模块,处理命令行输入输出交互,支持通过控制台与外部系统进行数据交换 spring-ai-mcp-stdio-server 。
2. 模块间关系
客户端模块(client)可分别与 SSE 服务端、STDIO 服务端通信,服务端模块间通过 MCP(Module Communication Protocol)协议实现内部交互,形成"多客户端-多服务端"的分布式通信架构。
三、技术栈详解
1. 核心框架与语言
- Java :主要开发语言,版本兼容 JDK 11/17(历史编译错误显示曾尝试使用 JDK 21 导致不兼容,需根据本地环境调整)。
- Spring Boot :基础框架,提供自动配置、依赖注入、嵌入式服务器等核心能力,简化应用开发与部署。
- Spring AI :AI 功能集成框架,项目命名中包含"spring-ai",推测用于对接 AI 模型 API(如 OpenAI、本地大模型等),实现自然语言处理、数据分析等 AI 能力。
- SSE (Server-Sent Events) :由 sse-server 模块实现,基于 HTTP 协议的服务器推送技术,支持文本数据的单向流式传输,适用于实时天气更新、通知推送等场景。
- MCP 协议 :项目特有的模块通信协议,用于规范客户端与服务端、服务端之间的消息格式与交互流程,确保跨模块通信的一致性。
- 响应式编程 :集成 Reactor Core 库,通过 Mono/Flux 实现异步非阻塞数据流处理,提升高并发场景下的系统响应性能(历史超时异常涉及 reactor-core 的 Mono 操作)。
- Maven :项目构建与依赖管理工具,通过各模块下的 pom.xml 文件声明依赖关系,支持打包为可执行 JAR(如 stdio-server 模块生成的 spring-ai-mcp-stdio-server.jar)。
- Windows 环境 :开发与运行环境为 Windows 系统,需注意文件路径格式(如使用反斜杠"")与环境变量配置(如 JAVA_HOME)。
2. 通信与架构
3. 构建与部署
四、JDK 版本配置
1. 版本兼容问题
项目曾出现"无效的目标发行版: 21"的 Maven 编译错误,原因是 stdio-server 模块的 pom.xml 中指定的 Java 版本与本地环境不匹配。解决方案为:
- 修改 pom.xml 中的 Java 版本属性,适配本地已安装的 JDK(推荐 JDK 17 或 21):
<properties>
<maven.compiler.source>17</maven.
compiler.source>
<maven.compiler.target>17</maven.
compiler.target>
</properties>
2. 环境验证步骤
- 检查本地 JDK 版本:在命令行执行 java -version ,确认输出版本与 pom.xml 配置一致。
- 验证 JAVA_HOME 环境变量:确保指向正确的 JDK 安装路径(如 D:\Program Files\Java\jdk-17.0.1 )。
- 清理 Maven 缓存:执行 mvn clean install 重新构建,避免旧编译产物干扰。
五、调试与问题排查
1. 本地调试
1. 启动本地的工程:spring-ai-mcp-sse-server, spring-ai-mcp-stdio-server
2. 在trae或cline的MCP服务添加本地配置文件到mcp.json
{
"mcpServers": {
"addOrMinus-service": {
"disabled": false,
"timeout": 30,
"type": "stdio",
"command": "java",
"args": [
"-jar",
"D:/mcp/spring-ai-mcp-demo-master/spring-ai-mcp-stdio-server/target/spring-ai-mcp-stdio-server.jar"
],
"cwd": "D:/mcp/spring-ai-mcp-demo-master/spring-ai-mcp-stdio-server/target",
"env": {
"TIMEZONE": "Asia/Shanghai",
"spring.ai.mcp.server.stdio":"true",
"spring.main.web-application-type":"none",
"spring.main.banner-mode":"off"
}
},
"querweather-sse-mcp": {
"url": "http://localhost:9090/sse",
"transportType": "sse",
"autoApproval": false,
"requireManualConfirmation": true
}
}
}


3. 然后就可以在trae的对话框问问题了,比如,北京的天气如何

六、总结
Spring AI MCP Demo 工程通过 Spring Boot + Spring AI 构建了一套灵活的 AI 服务通信框架,结合 SSE 实时推送与标准 I/O 交互,满足多样化的业务场景需求。开发过程中需重点关注 JDK 版本兼容性、服务通信超时、端口冲突等常见问题,通过日志分析与配置调优保障系统稳定运行。后续可扩展更多 AI 功能模块,或集成服务发现、配置中心等中间件,进一步提升系统的可扩展性与可维护性。
基于Spring AI服务,开发MCP服务的更多相关文章
- Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具:Spr ...
- Spring Boot简化了基于Spring的应用开发
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的.产品级别的Spring应用. Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可 ...
- SpringBootService,一个基于spring boot搭建的SOA服务框架
SpringBootService,这是一个spring boot微服务的框架,包括redis,mq,restful,定时器,mybatis.易扩容.易维护的架构. 项目说明 该项目使用maven进行 ...
- 基于 Spring Cloud 完整的微服务架构实战
本项目是一个基于 Spring Boot.Spring Cloud.Spring Oauth2 和 Spring Cloud Netflix 等框架构建的微服务项目. @作者:Sheldon地址:ht ...
- SpringBoot搭建基于Spring+SpringMvc+Mybatis的REST服务
Maven Plugin管理 通常,让你的Maven POM文件继承 spring-boot-starter-parent,并声明一个或多个 Starter POMs依赖即可. spring-boot ...
- 基于spring cloud OAuth2的微服务授权验证服务搭建的一些坑, 包括401,client_secret,invalid_scope等问题
一 先贴成功图,用的是springcloud Finchley.SR1版本,springboot版本2.0.6 问题一: 返回401, Unauthorized 出现这个问题原因很多:首先确保方法开启 ...
- 基于Spring Boot框架开发的一个Mock
背景:在项目后端接口开发还未完成,我们无法进行自动化接口用例的调试,希望与开发同步完成接口自动化用例的编写及调试,待项目转测后,可以直接跑自动化用例,提高测试效率. 选用的maven + Spring ...
- RESTLET开发实例(三)基于spring的REST服务
http://www.lifeba.org/arch/restlet_spring_3.html 前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将 ...
- [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务
前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将介绍restlet如何整合spring框架进行开发.Spring 是一个开源框架,是为了解决企业应 ...
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
随机推荐
- HTTP压缩的过程
1. 浏览器发送Http request 给Web服务器, request 中有Accept-Encoding: gzip, deflate.(告诉服务器浏览器支持gzip压缩) 2. Web服 ...
- CentOS7 安装 Redis 7.0.2
安装 Redis # 首先安装依赖gcc, 后面需要使用make编译redis yum install gcc -y # 进入 /usr/local/src 目录, 把源码下载到这里 cd /usr/ ...
- Obsidian 笔记一键转换发布为 Jekyll 博客
Obsidian 是一款功能强大且灵活的知识管理和笔记软件,与 Jekyll 这一轻量级静态博客框架的结合,既能保留 Obsidian 的网状知识关联优势,又能借助 Jekyll 的高效编译能力快速生 ...
- MySQL-全句锁、表锁和元数据锁
全局锁 全局锁是锁住整个数据库实例,只能读,任何关于更新操作的语句都会阻塞. 全局锁的适用场景 针对数据库做全库的逻辑备份操作时,需要使用全局锁. 全局锁的影响: 如果在主库上做全局锁操作,业务基本停 ...
- 阿里云ECS安装 CoreOS
没事重装了下阿里云的ECS,无意发现竟然有了 CoreOS 的选项,有点小激动,于是乎,果断选择安装尝试了下. 阿里云ECS安装 CoreOS 其他阿里云注册啥的就不多说了,来个主要的图说明下: 题外 ...
- C# 计算代码的运行时间
用法 主要通过Stopwatch类来实现... 在开发.调试.测试.分析中非常实用. Stopwatch sw = new Stopwatch(); sw.Start(); // 某些耗时的计算或任务 ...
- BotSharp 5.0 MCP:迈向更开放的AI Agent框架
一.引言 在人工智能快速发展的时代,AI Agent(人工智能代理)作为一种能够自主感知环境.决策并执行动作的实体,在众多领域展现出了巨大的潜力.BotSharp 是一个功能强大的开源项目,由 Sci ...
- 如何使用Nacos作为配置中心统一管理配置
如何使用Nacos作为配置中心统一管理配置 1).引入依赖, <dependency> <groupId>com.alibaba.cloud</groupId> & ...
- Linux Nginx tomcat集群--打程序补丁步骤
Linux Nginx Tomcat集群--打程序补丁步骤 一.若不知道服务器中nginx所在目录(知道目录位置,从第3条开始看) 1.查找nginx进程(默认80端口) netstat -lntup ...
- 什么是 Java 的 AOT(Ahead-Of-Time)?
Java 的 AOT(Ahead-Of-Time) 1. 定义 AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式. 在 AOT 模式下,Java 字节 ...