Solon v3.2.0

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

</> markdown

McpClientToolProvider(Mcp 客户端工具提供者),是提供 McpClientTool 的实体。对应的配置属性实体为 McpClientProperties。

1、配置属性 McpClientProperties

属性默认值说明
nameSolon-Ai-Mcp-Client客户端名称
version1.0.0客户端版本号
apiUrl 接口完整地址
apiKey 接口密钥
headers 请求头信息
httpTimeout.connectTimeout10shttp 连接超时
httpTimeout.writeTimeout60shttp 写超时
httpTimeout.readTimeout60shttp 读超时(如果为0,表示不超时)
requestTimeout20s请求超时
initializationTimeout20s初始化超时

2、配置或构建

  • DI 环境构建方式
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 McpClientToolProvider clientWrapper(@Inject("${solon.ai.mcp.client.demo}") McpClientToolProvider client) {
        return client;
    }
    
    @Bean("mcp-gitee")
    public McpClientToolProvider clientWrapper(@Inject("${solon.ai.mcp.client.gitee}") McpClientToolProvider client) {
        return client;
    }
}
  • Java 原生环境构建方式
//使用代码构建
McpClientToolProvider clientToolProvider = McpClientToolProvider.builder()
                .apiUrl("http://localhost:8080/mcp/sse")
                .build();
                
//使用配置构建
McpClientToolProvider clientToolProvider = Utils.loadProps("classpath:mcp/gitee.yml")
                .getProps("solon.ai.mcp.client.demo") //对上配置前缀
                .toBean(McpClientToolProvider.class);

3、客户端使用

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

    String rst = clientToolProvider.callToolAsText("getWeather", Map.of("location", "杭州"));
}
  • 绑定给模型使用(结合配置与注入)
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 McpClientToolProvider mcpClient(@Inject("${solon.ai.mcp.client.demo}") McpClientToolProvider client) {
        return client;
    }

    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.demo}") ChatConfig chatConfig, McpClientToolProvider toolProvider) {
        return ChatModel.of(chatConfig)
                .defaultToolsAdd(toolProvider.getTools()) //添加默认工具
                .build();
    }
    
    @Bean
    public void case2( McpClientToolProvider toolProvider, ChatModel chatModel) {
        ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
                .options(options -> {
                    //转为工具集合用于绑定 //如果有 defaultToolsAdd,这里就不需要了
                    //options.toolsAdd(toolProvider.getTools());
                    
                    //获取特定工具用于绑定
                    //options.toolsAdd(toolProvider.getTool("getWeather"));
                })
                .call();
    }
}