mcp - 客户端构建和集成使用
McpClientProvider(Mcp 客户端提供者),同时也提供 Tool、Prompt、Resource 三种内容。支持心跳机制和“断线重连”机制。对应的配置属性实体为 McpClientProperties。
配置属性 McpClientProperties:
属性 | 默认值 | 说明 |
---|---|---|
name | Solon-Ai-Mcp-Client | 客户端名称 |
version | 1.0.0 | 客户端版本号 |
channel | McpChannel.SSE | 通讯方式(或通道) |
apiUrl | 接口完整地址 | |
apiKey | 接口密钥 | |
headers | 请求头信息 | |
httpTimeout.connectTimeout | 10s | http 连接超时 |
httpTimeout.writeTimeout | 60s | http 写超时 |
httpTimeout.readTimeout | 60s | http 读超时(如果为0,表示不超时) |
requestTimeout | 20s | 请求超时 |
initializationTimeout | 20s | 初始化超时 |
heartbeatInterval | 15s | 心跳间隔(辅助自动重连) |
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();
}
}