Solon v3.3.0

mcp - 客户端构建和集成使用

</> markdown

McpClientProvider(Mcp 客户端提供者),同时也提供 Tool、Prompt、Resource 三种内容。支持心跳机制和“断线重连”机制。对应的配置属性实体为 McpClientProperties。

配置属性 McpClientProperties:

属性默认值说明
nameSolon-Ai-Mcp-Client客户端名称
version1.0.0客户端版本号
channelMcpChannel.SSE通讯方式(或通道)
apiUrl 接口完整地址
apiKey 接口密钥
headers 请求头信息
httpTimeout.connectTimeout10shttp 连接超时
httpTimeout.writeTimeout60shttp 写超时
httpTimeout.readTimeout60shttp 读超时(如果为0,表示不超时)
requestTimeout20s请求超时
initializationTimeout20s初始化超时
heartbeatInterval15s心跳间隔(辅助自动重连)
serverParameters 服务端参数(用于连接 stdio 服务)

McpClientProvider 实现的接口有:

接口说明
ToolProvider工具提供者接口(可以获取工具清单)
ResourceProvider资源提供者接口(可以获取资源清单)
PromptProvider提示语提供者接口(可以获取提示语清单)
Closeable关闭接口(关闭后,会释放资源且不再自动重连)

McpClientProvider 主要方法:

方法说明
getClient()获取客户端(基础能力)
close()关闭
reopen()重新打开
callToolAsText(name, args)调用工具并转为文本
callToolAsImage(name, args)调用工具并转为图像
callTool(name, args)调用工具
getTools()ToolProvider 接口的实现
getTools(cursor)根据游标,获取一批工具描述
readResourceAsText(uri)读取资源
readResource(uri)读取资源
getResources()ResourceProvider 接口的实现
getResources(cursor)根据游标,获取一批资源描述
getPromptAsMessages(name, args)获取提示语
getPrompt(name, args)获取提示语
getPrompts()PromptProvider 接口的实现
getPrompts(cursor)根据游标,获取一批资源描述

支持直接实例化或构造模式

//直接实例化
new McpClientProvider(Properties clientProps);
new McpClientProvider(String apiUrl);
new McpClientProvider(McpClientProperties clientProps);

//构造模式(示例)
McpClientProvider.builder()
    .apiUrl(...)
    .build();

1、配置或构建

  • 可注入环境的构建方式
solon.ai:
  mcp:
    client:
       demo:
          apiUrl: "http://localhost:8080/mcp/sse"
       gitee:
          apiUrl: "http://ai.gitee.demo/mcp/sse"
@Configuration
public class McpClientConfig {
    @Bean("mcp-demo")
    public McpClientProvider clientWrapper(@Inject("${solon.ai.mcp.client.demo}") McpClientProvider clientProvider) {
        return clientProvider;
    }
    
    @Bean("mcp-gitee")
    public McpClientProvider clientWrapper(@Inject("${solon.ai.mcp.client.gitee}") McpClientProvider clientProvider) {
        return clientProvider;
    }
}
  • Java 原生环境构建方式
//使用代码构建
McpClientProvider clientProvider = McpClientProvider.builder()
                .apiUrl("http://localhost:8080/mcp/sse")
                .build();
                
//使用配置构建
McpClientProvider clientProvider = Utils.loadProps("classpath:mcp/gitee.yml")
                                        .getProps("solon.ai.mcp.client.demo") //对上配置前缀
                                        .toBean(McpClientProvider.class);

2、客户端使用

  • 直接调用
public void case1() {
    McpClientProvider clientProvider = McpClientProvider.builder()
                .apiUrl("http://localhost:8080/mcp/sse")
                .build();

    String rst = clientProvider.callToolAsText("getWeather", Map.of("location", "杭州"))
                               .getContent();
}
  • 绑定给模型使用(结合配置与注入)
solon.ai:
  chat:
    demo:
      apiUrl: "http://127.0.0.1:11434/api/chat"
      provider: "ollama"
      model: "qwen2.5:1.5b"
  mcp:
    client:
        demo:
          apiUrl: "http://localhost:8080/mcp/sse"
@Configuration
public class McpClientConfig {
    @Bean
    public McpClientProvider mcpClient(@Inject("${solon.ai.mcp.client.demo}") McpClientProvider clientProvider) {
        return clientProvider;
    }

    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.demo}") ChatConfig chatConfig, McpClientProvider clientProvider) {
        return ChatModel.of(chatConfig)
                .defaultToolsAdd(clientProvider) //添加默认工具
                .defaultToolsAdd(...) //可以添加多套工具(只是示意下,可以删掉)
                .build();
    }
    
    @Bean
    public void case2( McpClientProvider clientProvider, ChatModel chatModel) {
        ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
                .options(options -> {
                    //转为工具集合用于绑定 //如果有 defaultToolsAdd,这里就不需要了
                    //options.toolsAdd(clientProvider);
                })
                .call();
    }
}