Spring AI MCP
MCP是什么
MCP是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外部数据源和工具。它就像AI应用的通用接口,帮助开发者构建更灵活、更具上下文感知能力的AI应用,而无需为每个AI模型和外部系统组合进行定制集成。MCP被设计为一个通用接口,类似于USB-C端口,允许LLM应用以一致的方式连接到各种数据源和工具,如文件、数据库、API等。
MCP的三个概念
MCP Server
基于各语言的MCP SDK开发的程序或服务。简单来说就是一个后端服务,这个服务提供的方法就是MCP Tool。
MCP Tool
MCP Tool 属于MCP Server,一个MCP Server可以有多个MCP Tool。类似一个类里有多个方法,又或者一个服务里有多个接口。
MCP Client
当一段代码,一个Agent,一个客户端,基于MCP的规范去使用、去调用MCP Server里的MCP Tool时,它就是MCP Client。
MCP的调用流程
调用流程如图所示,其实和function calling是类似的
MCP 案例
MCP 的两种传输协议,以下案例使用 sse (http),另一种是 stdio
MCP Server
基于Spring AI 的 MCP 服务端,提供天气预报的服务
■ 根据地区查询当天天气
■ 根据地区查询近期天气预报
// 定义 Tools
class WeatherServer {private WeatherExec weatherExec ;@Tool(name = "todayWeather", description = "根据地区查询当日天气")public WeatherModel todayWeather(String address) {return weatherExec.todayWeather(address);}@Tool(name = "futureWeather", description = "根据地区查询近期天气预报")public WeatherForecastModel futureWeather(String address) {return weatherExec.futureWeather(address);}}class Config {// 配置 Tools Bean@Beanpublic ToolCallbackProvider toolCallbackProvider(CustomService customService) {return MethodToolCallbackProvider.builder().toolObjects(customService).build();}}
MCP Client
这里仅描述 MCP 客户端和服务端的一些交互,暂不涉及 LLM
建立连接
获取MCP Server 的工具列表
执行一个工具
建立连接
客户端与服务端基于 SSE 建立长连接
curl --location 'http://localhost:8080/sse'
响应 endpoint /mcp/message 即触发事件的接口地址
发送获取 MCP 工具列表事件
触发事件,通过SSE返回结果
curl --location 'http://localhost:8080/mcp/message' \
--header 'Content-Type: application/json' \
--data '{"method": "tools/list","jsonrpc": "2.0","id": "xxx-id-001"
}'
sse 响应 message
{"jsonrpc": "2.0","id": "xxx-id-001","result": {"tools": [{"name": "todayWeather","description": "根据地区查询当日天气","inputSchema": {"type": "object","properties": {"address": {"type": "string"}}}},{...}]}
}
发送执行 MCP 工具事件
触发事件,通过SSE返回结果
curl --location 'http://localhost:8080/mcp/message' \
--header 'Content-Type: application/json' \
--data '{"method": "tools/call","jsonrpc": "2.0","id": "xxx-id-002","params": {"name": "todayWeather","arguments": {"address": "广州"}}
}'
sse 响应 message
{"jsonrpc": "2.0","id": "xxx-id-002","result": {"content": [{"type": "text","type": "text","text": "MCP Server 执行工具返回的数据"}],"isError": false}
}
Agent
MCP + LLM 其实就是个Agent
- 用户向Agent提问
- Agent调用MCP Server的接口,获取可用工具列表
- Agent调用LLM
- 非函数调用,直接回复用户
- 函数调用则继续
- Agent调用MCP Server的接口执行工具函数,获取执行结果
- 再次调用大模型,获取最终答案
- Agent回答用户
参考
Nacos MCP Registry