SpringBoot LangChain4j MCP模型上下文协议(六)
一、MCP 模型上下文协议
MCP 类型
1、Stdio 客户端可以作为本地子进程运行 MCP 服务器,并通过标准输入/输出与其通信。
2、Streamable HTTP 客户端发送 HTTP 请求,服务器可以返回常规响应,或者在需要持续发送多个响应时打开 SSE 流。
3、WebSocket 长连接方式
4、http 传统的HTTP传输方式
5、docker Docker的stdio传输
二、配置 使用数据库表进行配置,忽略CRUD
1、Stdio
public McpTransport getMcpTransport(McpConfig mcpConfig){
String stdioCommand = mcpConfig.getStdioCommand();
List<String> commands = Arrays.asList(stdioCommand.split(" "));
McpTransport transport = StdioMcpTransport.builder()
.command(commands)
// only if you want to see the traffic in the log
.logEvents(mcpConfig.getLogEvents()>0)
.build();
return transport;
}2、Streamable HTTP 多个响应时打开 SSE 流。
public McpTransport getMcpTransport(McpConfig mcpConfig){
String headers = mcpConfig.getHeaders();
Map<String, String> headersMap = headers == null ? new HashMap<>() : JSON.parseObject(headers, Map.class);
McpTransport transport = StreamableHttpMcpTransport.builder()
.url(mcpConfig.getUrl())
.logRequests(mcpConfig.getLogEvents()>0)
.logResponses(mcpConfig.getLogResponses()>0)
.customHeaders(headersMap)
.timeout(Duration.ofSeconds(60))
.build();
return transport;
}3、WebSocket
public McpTransport getMcpTransport(McpConfig mcpConfig){
McpTransport transport = WebSocketMcpTransport.builder()
.url(mcpConfig.getUrl())
.logRequests(mcpConfig.getLogEvents()>0)
.logResponses(mcpConfig.getLogResponses()>0)
.timeout(Duration.ofSeconds(60))
.build();
return transport;
}4、http
public McpTransport getMcpTransport(McpConfig mcpConfig){
McpTransport transport = HttpMcpTransport.builder()
.sseUrl(mcpConfig.getUrl())
//超时时间
.timeout(Duration.ofSeconds(60))
.logRequests(mcpConfig.getLogEvents()>0)
.logResponses(mcpConfig.getLogResponses()>0)
.build();
return transport;
}5、docker
public McpTransport getMcpTransport(McpConfig mcpConfig){
McpTransport transport = DockerMcpTransport.builder()
.image(mcpConfig.getDockerImage())
.dockerHost(mcpConfig.getDockerHost())
// if you want to see the traffic in the log
.logEvents(mcpConfig.getLogEvents()>0)
.build();
return transport;
}使用方式,以工具的形式将MCP 提供给LLM调用
public static List<ToolProvider> getMcpToolProvider(List<McpConfig> mcpConfigs){
List<ToolProvider> toolProviders = new ArrayList<>();
for(McpConfig mcpConfig : mcpConfigs){
McpTransport transport = McpFactoryEnum.getMcpTransportFactoryEnum(mcpConfig);
McpClient mcpClient = new DefaultMcpClient.Builder()
.key(mcpConfig.getClientKey())
.clientName(mcpConfig.getMcpName())
.transport(transport)
.build();
ToolProvider toolProvider = McpToolProvider.builder()
.mcpClients(List.of(mcpClient))
.build();
toolProviders.add(toolProvider);
}
return toolProviders;
}//测试代码
@GetMapping("/mcpTest")
public String mcpTest(){
HttpClientBuilder httpClientBuilder = new SpringRestClientBuilder();
if (assistant == null) {
ChatModel ollamaChatModel = OllamaChatModel.builder()
.baseUrl("http://192.168.2.136:11434")
.modelName("qwen3:8b")
.httpClientBuilder(httpClientBuilder)
.logRequests(true)
.logResponses(true)
.build();
List<McpConfig> mcpConfigs = mcpConfigService.queryList(new McpConfig());
List<ToolProvider> mcpToolProvider = DynamicMcp.getMcpToolProvider(mcpConfigs);
assistant = AiServices.builder(Assistant.class)
.chatModel(ollamaChatModel)
.chatMemoryProvider(getChatMemoryProvider("123451"))
.toolProviders(mcpToolProvider)
.build();
}
String chat = assistant.chat("123451","我要自驾游从贵阳到北京" );
return chat;三、测试
使用魔塔社区提供的MCP工具测试 https://modelscope.cn/mcp

调用日志
返回结果

