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是类似的
Spring AI & MCP_第1张图片

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
    @Bean
    public 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
Spring AI & MCP_第2张图片

  1. 用户向Agent提问
  2. Agent调用MCP Server的接口,获取可用工具列表
  3. Agent调用LLM
    • 非函数调用,直接回复用户
    • 函数调用则继续
  4. Agent调用MCP Server的接口执行工具函数,获取执行结果
  5. 再次调用大模型,获取最终答案
  6. Agent回答用户

参考
Nacos MCP Registry

你可能感兴趣的:(spring,人工智能,java)