• 已删除用户
陈永强
陈永强
发布于 2026-06-10 / 3 阅读
0

SpringBoot LangChain4j MCP模型上下文协议(六)

SpringBoot LangChain4j MCP模型上下文协议(六)

一、MCP 模型上下文协议

MCP 类型

1、Stdio 客户端可以作为本地子进程运行 MCP 服务器,并通过标准输入/输出与其通信。

2、Streamable HTTP 客户端发送 HTTP 请求,服务器可以返回常规响应,或者在需要持续发送多个响应时打开 SSE 流。

3、WebSocket 长连接方式

4、http 传统的HTTP传输方式

5、docker Docker的stdio传输

二、配置 使用数据库表进行配置,忽略CRUD

mcp_config.sql

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

调用日志

返回结果