MCP是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外部数据源和工具。它就像AI应用的通用接口,帮助开发者构建更灵活、更具上下文感知能力的AI应用,而无需为每个AI模型和外部系统组合进行定制集成。MCP被设计为一个通用接口,类似于USB-C端口,允许LLM应用以一致的方式连接到各种数据源和工具,如文件、数据库、API等。
基于各语言的MCP SDK开发的程序或服务。简单来说就是一个后端服务,这个服务提供的方法就是MCP Tool。
MCP Tool 属于MCP Server,一个MCP Server可以有多个MCP Tool。类似一个类里有多个方法,又或者一个服务里有多个接口。
当一段代码,一个Agent,一个客户端,基于MCP的规范去使用、去调用MCP Server里的MCP Tool时,它就是MCP Client。
调用流程如图所示,其实和function calling是类似的
MCP 的两种传输协议,以下案例使用 sse (http),另一种是 stdio
基于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
@Bean
public ToolCallbackProvider toolCallbackProvider(CustomService customService) {
return MethodToolCallbackProvider
.builder()
.toolObjects(customService)
.build();
}
}
这里仅描述 MCP 客户端和服务端的一些交互,暂不涉及 LLM
建立连接
获取MCP Server 的工具列表
执行一个工具
客户端与服务端基于 SSE 建立长连接
curl --location 'http://localhost:8080/sse'
响应 endpoint /mcp/message 即触发事件的接口地址
触发事件,通过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"
}
}
}
},
{
...
}
]
}
}
触发事件,通过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
}
}
参考
Nacos MCP Registry