做AI开发的朋友应该都有同感:现在的大模型,聊日常、写文案确实强,但一落地到真实业务,短板特别明显。
尤其是需要生成图表、查询专业外部数据、执行固定业务逻辑的时候,大模型很容易“凭空发挥”,要么答非所问,要么直接幻觉乱编,根本没法上线使用。

最近我基于 Spring AI 实战开发了两个落地可用的 MCP 工具服务,上传魔塔社区后,短短3天使用量直接突破 5000+。
今天把完整的落地思路、开发流程、踩坑经验一次性分享出来,新手也能看懂,直接上手复刻。(全文干货无废话,建议收藏)
一、为什么现在做AI项目,一定要用 MCP?
很多人对 MCP(模型上下文协议)还比较陌生,我用大白话讲清楚:
MCP 本质就是大模型的标准化插件能力。
大模型本身只有“语言生成能力”,它不会查数据、不会画图、不会执行业务逻辑、不会对接外部系统。
而 MCP 就是用来补齐这些短板的:
让大模型可以精准调用后端工具
不再瞎编、不再幻觉、回答更精准
协议标准化,一次开发,全平台通用
基于 Spring Boot 开发,后端开发者上手零压力
简单说:想要 AI 项目真正落地,不靠 Prompt 硬撑,就必须靠 MCP 工具化。
二、我上线的两个爆款 MCP 服务(实用性拉满)
这次我没有做花里胡哨的功能,只做了两个真正高频刚需的服务,也是使用量暴涨的核心原因。
1、数据可视化 MCP 服务
绝大多数AI问答、智能报表、BI项目都会卡在这里:大模型只会说数据,不会出图。
我开发的这个服务,纯后端渲染、不依赖前端 ECharts。
大模型接收用户数据后,直接调用后端工具生成图表,开箱即用。
适用场景:数据分析、自动报表、智能BI、办公AI助手等。
2、古诗词 MCP 服务
很多文案AI、教学AI、文化问答模型,自带诗词知识库非常有限,很容易答错题、编诗句。
这个服务可以让大模型精准检索唐诗、宋词,支持随机获取、分类查询、内容解读,彻底避免诗词问答幻觉。
适用场景:文案创作、语文教学、文化问答、AI陪读等。
三、Spring AI 开发 MCP 完整实战流程
下面给大家梳理一套可直接复刻的标准开发流程。
1. 项目依赖引入
基于 Spring Boot,只需要引入 MCP 服务核心依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webflux</artifactId> <version>${spring-ai.version}</version></dependency>
2. 核心工具开发(@Tool 注解)
所有要给大模型调用的能力,都通过 @Tool 注解暴露,模型会自动识别参数、描述、功能用途。
以诗词查询工具为例:
@Tool(description = "获取随机一首诗词。参数type可选,值为'唐诗'或'宋词',不传则从所有诗词中获取")public String getRandomPoem( @ToolParam(description = "诗词类型,可选值:唐诗 或 宋词,不传则从所有诗词中获取") String type) { log.info("获取随机诗词,类型: {}", type); List<Poem> poems; if (Objects.isNull(type) || type.isBlank()) { poems = poemDataService.getAllPoems(); } else if (TYPE_TANGSHI.equals(type)) { poems = poemDataService.getPoemsByType(TYPE_TANGSHI); } else if (TYPE_SONGCI.equals(type)) { poems = poemDataService.getPoemsByType(TYPE_SONGCI); } else { log.warn("无效的诗词类型: {}", type); return buildErrorResponse("无效的诗词类型,请传入'唐诗'或'宋词'"); } if (poems.isEmpty()) { log.warn("未找到符合条件的诗词,类型: {}", type); return buildErrorResponse("未找到符合条件的诗词"); } Poem randomPoem = poems.get(random.nextInt(poems.size())); log.info("随机获取到诗词: {} - {}", randomPoem.getAuthor(), randomPoem.getTitle()); return toJsonString(randomPoem);}
这种写法的好处:语义清晰、模型自动理解、无需复杂Prompt约束。
3. MCP 服务配置与端点暴露
yml 核心配置,开启流式HTTP协议,支持双向通信,适配主流MCP客户端:
spring: application: name: mcp-server-tang-song ai: mcp: server: enabled: true name: mcp-server-tang-song version: 1.0.0 type: SYNC protocol: stateless streamable-http: mcp-endpoint: /mcp/state
4. 注册工具到 MCP 容器
将自定义的所有工具类注册进上下文,让大模型可发现、可调用:
@Configurationpublic class McpServerConfig { private static final Logger log = LoggerFactory.getLogger(McpServerConfig.class); private final PoemTools poemTools; public McpServerConfig(PoemTools poemTools) { this.poemTools = poemTools; } @Bean public ToolCallbackProvider poemToolCallbackProvider() { log.info("注册诗词查询工具到MCP服务"); MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder() .toolObjects(poemTools) .build(); log.info("诗词查询工具注册完成"); return provider; }}
5. 本地测试 & 上线发布
本地启动项目后,通过 MCP 客户端连接服务端点,测试工具调用是否正常。 功能稳定后,即可打包发布到魔塔社区,供所有开发者直接接入使用。
四、客户端接入教程(超简单)
不管是自己开发的AI应用,还是支持MCP的客户端,接入逻辑都一样:
进入客户端「MCP 服务管理」
新增外部服务地址
填入你的公开 MCP 服务地址
启用对应工具(图表生成/诗词查询)
直接对话调用即可
接入完成后,模型会自动判断场景、自动调用工具、自动返回结果。

示例提问:
帮我生成一份数据柱状图
来一首描写秋天的宋词并解读
五、实战踩坑总结(新手必看)
我在开发、上线、适配过程中踩了不少坑,这里一次性总结出来,帮大家避坑:
1、不要过度依赖 Prompt 约束模型
单纯靠提示词限制幻觉,效果极不稳定。真正落地必须靠 MCP工具兜底 + 标准化输出。
2、协议一定要开启 streamable-http
很多新手服务对接失败,就是因为用了旧协议,不支持流式双向调用,导致工具无响应。
3、工具描述必须清晰规范
@Tool、@ToolParam 的描述越精准,模型调用成功率越高。描述模糊会出现“能识别工具,但不会正确传参”的问题。
4、知识库/业务数据一定要本地兜底
不要让模型自由发挥,所有专业数据、诗词数据、图表逻辑,全部后端固化,模型只负责整理和输出。
六、最后聊聊我的感悟
这次两个小服务能够短时间破5000使用量,其实不是技术多复杂,而是真正踩中了AI落地的核心:
大模型只能做“表层生成”,真正的业务能力,必须靠后端工具化实现。
Spring AI + MCP 就是目前最适合 Java 开发者的 AI 落地方案。
不需要高深算法、不需要微调模型,只要你会写接口、会封装工具,就能做出可上线、可复用的AI能力。
互动交流💬
你在做 Spring AI 开发时,还遇到了哪些落地难题?你最想开发什么场景的 MCP 工具? 欢迎评论区一起交流探讨!
觉得文章对你有帮助,点赞、在看、转发一波,持续更新更多AI落地实战干货!
夜雨聆风