什么是 MCP 模型上下文协议?如何利用 Spring AI 实现 MCP 客户端和服务端?
- 标签:后端、编程导航
🏛 业务架构师
MCP(Model Context Protocol)是 Anthropic 推出的开放协议:用统一的标准接口把"工具/资源"暴露给模型——服务端声明能力(工具列表、参数 schema),客户端(AI 应用)按协议发现与调用。定位是AI 世界的 USB 接口:工具实现一次,所有支持 MCP 的应用都能用。
业务架构价值先讲透:
- 没有 MCP:每接一个外部能力,AI 应用写一套胶水代码;工具换个宿主应用,重写一遍——N 个应用 × M 个工具 = N×M 份集成;
- 有 MCP:工具方实现一次 MCP Server,应用方作为 MCP Client 即插即用——集成成本从 N×M 降到 N+M,这是协议标准化的经典红利(当年 USB 干掉的正是"每个设备一种接口")。
基于 Spring AI 的实现:
- MCP 服务端:Spring AI MCP Server Starter,把业务方法(如图片搜索、内部数据查询)声明为 @Tool,暴露为标准 MCP 服务;
- MCP 客户端:MCP Client Starter 配置服务地址,远端工具自动并入本地的工具清单,模型统一调用——本地工具与 MCP 工具对模型无差别。
我的落地判断:对外输出能力的团队(地图、搜索、内部数据服务)做 MCP Server,能力资产化、一次建设多方复用;AI 应用侧做 Client 丰富自己的工具生态。选型提醒:MCP 生态仍在快速演进,接入时评估传输方式(stdio/SSE/Streamable HTTP)与安全(鉴权、审计),企业场景优先受控的内网部署。
一句话:MCP 把"工具集成"变成了"生态接入"——早一天标准化,少一天胶水代码。
🏗 系统架构师
MCP(Model Context Protocol,Anthropic 提出)是模型与外部工具/数据源之间的开放标准协议——把"AI 应用 ↔ 工具提供方"的 M×N 集成问题变成 M+N:工具方实现一次 MCP Server,所有支持 MCP 的客户端(Claude、IDE、我的智能体)都能复用。
协议核心:
- 角色:MCP Host(AI 应用)内嵌 MCP Client,连接 MCP Server(工具/资源提供方);
- 能力三件套:Tools(模型可调用的函数)、Resources(可读数据,文件/记录)、Prompts(预置提示模板);
- 传输:stdio(本地进程)与 Streamable HTTP(远程服务,含 SSE);
- 通信:JSON-RPC 2.0,initialize 握手 → tools/list 发现 → tools/call 调用——动态发现是关键,客户端无需硬编码工具。
Spring AI 实现:
MCP 客户端(消费工具):
java
// starter 依赖 spring-ai-starter-mcp-client
// application.yml 配置服务端连接
McpSyncClient client = ...; // 自动发现远程工具
List<ToolCallback> tools = SyncMcpToolCallbackProvider.fromClients(client).getToolCallbacks();
chatClient.prompt().tools(tools).user(q).call();MCP 工具自动转为 Spring AI 的 ToolCallback,无缝进 Tool Calling 循环。
MCP 服务端(发布工具):
java
// spring-ai-starter-mcp-server-webmvc
@Tool(description="...") 的 Bean 自动注册暴露为 MCP 服务架构价值:工具生态从"每家 SDK 私有绑定"走向标准化——搜索、地图、DB、文件系统都有现成 MCP Server,我的智能体接地图/图片搜索就是直接消费第三方 MCP,零自研。
💻 全栈开发专家
MCP(Model Context Protocol)= Anthropic 提出的开放协议,统一"AI 应用 ↔ 工具/数据源"的连接标准,被 Spring 官方采纳。类比:Tool Calling 是"模型调用本地方法"的机制,MCP 是把工具做成独立服务、跨进程跨团队复用的协议层(JSON-RPC 2.0,传输支持 stdio / SSE / Streamable HTTP)。
MCP Server(把我方工具暴露成服务):
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>java
@Service
public class ImageSearchService {
@Tool(description = "按关键词搜索高质量图片,返回图片链接列表")
public List<String> searchImages(String keyword) { ... }
}
// application.yml:
// spring.ai.mcp.server.name: image-search-mcp
// 工具自动注册为 MCP 能力对外提供MCP Client(消费别人的 MCP 服务):
yaml
spring:
ai:
mcp:
client:
connections:
amap:
url: https://mcp.amap.com/sse # 高德地图 MCP
image-search:
url: http://localhost:8090 # 我自己的图片 MCPstarter 会自动发现远端 MCP 提供的 tools,合并进本应用的工具列表,模型照常调用——业务代码无感。
工程价值:工具从"应用内方法"升级为"独立部署、多客户端共享的服务"——一次实现,网页助手、IDE 插件、别的 Agent 都能接;版本、权限、审计集中在服务端治理。