不得不承认,AI 进化的太快了。
MCP Server 教程已经烂大街了,看了一圈下来,十篇有八篇在教你写一个"查询当前时间"的 demo——加个 @Tool 注解,配一段 YAML,用 Trae 或者 Cursor 连上去试一把,完事。
但真到了生产环境就会发现,demo 到生产有一堆问题。
工具不是一个两个,可能有几十个,它们分散在不同模块里,怎么统一注册?
同一个应用既要对外暴露工具(当 Server),又要接入外部的 MCP 服务(当 Client),这两个角色怎么共存?
服务重启之后,已经连上的 MCP 客户端会话全部丢失了,怎么恢复?

这篇内容就用求职派的源码做证据,从 Spring AI 的三步实现讲起,一直拆到生产环境要解决的会话恢复问题。
01、MCP 到底在解决什么问题
MCP 的全称是 Model Context Protocol,由 Anthropic 在 2024 年底开源。
一句话说清楚它的定位,给大模型提供一个统一的工具接入标准,不用再为每个外部系统单独写适配代码。
用 USB 来类比最直观。一台裸主机只能开关机,但插上键盘、鼠标、摄像头,就能打字、拍照、视频通话——前提是这些外设都遵守了 USB 协议。

MCP 做的事和 USB 一样,只不过面对的不是外设,而是大模型需要调用的各种工具和数据源。
MCP 遵循客户端-服务端架构,一个主机可以连接多个 MCP Server。

整个协议的工作流程可以拆成 7 步。
- 用户在客户端发起一个问题
- 客户端把问题传给大模型
- 大模型分析问题,决定调用哪个工具
- 通过 MCP 协议,把工具调用指令发到服务端
- 服务端执行工具,把结果返回给大模型
- 大模型基于工具返回的结果生成最终回答
- 回答通过客户端展示给用户

对求职派来说,MCP 解决了这样一个痛点。
岗位数据的能力需要对外开放。求职派自己有岗位推荐、岗位检索、数据采集等工具,如果 Claude Desktop、Cursor、Trae 这些客户端想调用这些能力,按传统做法得一个个写 API 适配。

有了 MCP,只要把这些工具按协议标准暴露出来,任何支持 MCP 的客户端都能直接接入。
02、Spring AI 实现 MCP Server
Spring AI 对 MCP 协议做了完整的封装,实现一个 MCP Server 的步骤非常简单。
第一步,加依赖
在 pom.xml 里引入 spring-ai-starter-mcp-server-webmvc,它会自动配置好 SSE 端点和消息处理通道。
<dependency>
<groupid>org.springframework.ai</groupid>
<artifactid>spring-ai-starter-mcp-server-webmvc</artifactid>
</dependency>
回复