mcp - 客户端构建和集成使用
McpClientToolProvider(Mcp 客户端工具提供者),是提供 McpClientTool 的实体,支持心跳机制和“断线重连”机制。对应的配置属性实体为 McpClientProperties。
1、配置属性 McpClientProperties
属性 | 默认值 | 说明 |
---|---|---|
name | Solon-Ai-Mcp-Client | 客户端名称 |
version | 1.0.0 | 客户端版本号 |
apiUrl | 接口完整地址 | |
apiKey | 接口密钥 | |
headers | 请求头信息 | |
httpTimeout.connectTimeout | 10s | http 连接超时 |
httpTimeout.writeTimeout | 60s | http 写超时 |
httpTimeout.readTimeout | 60s | http 读超时(如果为0,表示不超时) |
requestTimeout | 20s | 请求超时 |
initializationTimeout | 20s | 初始化超时 |
heartbeatInterval | 15s | 心跳间隔(辅助自动重连) |
支持直接实例化或构造模式
//直接实例化
new McpClientToolProvider(Properties clientProps);
new McpClientToolProvider(String apiUrl);
new McpClientToolProvider(McpClientProperties clientProps);
//构造模式(示例)
McpClientToolProvider.builder()
.apiUrl(...)
.build();
2、断线重连(或自动重连)机制说明
(v3.2.1-M2 后支持)“断线重连”是指:在服务器重启(或关闭一段时间后,再重启。或者别的原因网络中断)后,客户端会自动重新连接。
- 如果本次请求出现网络错误,下次会尝试重连
- 每隔30秒会心跳(通过 mcp ping 检测网络),心跳如果失败,下次会尝试重连
3、配置或构建
- 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);
4、客户端使用
- 直接调用
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) //添加默认工具
.defaultToolsAdd(...) //可以添加多套工具
.build();
}
@Bean
public void case2( McpClientToolProvider toolProvider, ChatModel chatModel) {
ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
.options(options -> {
//转为工具集合用于绑定 //如果有 defaultToolsAdd,这里就不需要了
//options.toolsAdd(toolProvider);
})
.call();
}
}